Page 1 sur 1

Operations sur les tres grands nombres

Publié : mer. 12/juil./2006 8:21
par andrebernard
Bonjour

Je cherche a faire une operation sur les tres grands nombres.
C'est à dire une centaine de chiffres.

En visual basic j'ai trouvé un code qui permet de le faire en utilisant des strings, et apparement c'est sans limite et ça marche nickel.

Malheureusement je ne suis pas assez calé pour le convertir en purebasic.

Si quelqu'un se sent le courage cela me dépannerais beaucoup, et apparement je ne devrait pas etre le seul car en cherchant sur le net et sur ce site je n'ai rien trouvé de pareil.

Hors mis la librairie F64, mais malheureusement elle ne marche pas non plus a partir d'un certain nombre de chiffres, elle donne des resultats faux.
Peut etre l'ai-je mal utilisée ????

Voici le code VB:



' MULTIPLICATION
' **************

Public Function BigMultiplication(Term1 As String, Term2 As String)

Total2 = "0"
Dim Nbd, Nbt, Nbu As Integer

For i = 0 To Len(Term2) - 1

Nbd = 0
Total = ""
Nbr2 = Mid(Term2, Len(Term2) - i, 1)

For a = 0 To Len(Term1) - 1

Nb1 = Mid(Term1, Len(Term1) - a, 1)
Nbt = Nb1 * Nbr2 + Nbd
Nbd = Nbt \ 10: Nbu = Nbt Mod 10
Total = Nbu & Total

Next a

Total2 = BigAddition(Nbd & Total & String(i, "0"), Mid$(Total2, 1))

Next i

BigMultiplication = Zero(Mid$(Total2, 1))

End Function

' ADDITION
' ********

Public Function BigAddition(Term1 As String, Term2 As String)

Dim Nbd, Nbt, Nbu As Integer
St1 = Len(Term1): St2 = Len(Term2)

If St1 < St2 Then Term1 = String(St2 - St1, "0") & Term1
If St1 > St2 Then Term2 = String(St1 - St2, "0") & Term2

For i = 0 To Len(Term1) - 1

Nb1 = Mid$(Term1, Len(Term1) - i, 1)
Nb2 = Mid$(Term2, Len(Term2) - i, 1)
Nbt = Val(Nb1) + Val(Nb2) + Nbd
Nbd = Nbt \ 10
Nbu = Nbt Mod 10
Total = Nbu & Total

Next i

BigAddition = Zero(Mid$(Nbd & Total, 1))

End Function

' DIVISION
' ********

Public Function BigDivision(Term1 As String, Term2 As String, Rest As Boolean)

Total = "0"

Do While Len(Term1) > Len(Term2)

Nbz = Len(Term1) - Len(Term2) - 1
Nbr1 = Term2 & String(Nbz, "0")
Term1 = BigSoustraction(Term1, Mid$(Nbr1, 1))
Total = BigAddition(Mid$(Total, 1), "1" & String(Nbz, "0"))

Loop

For i = 1 To 20

If Term1 = Term2 Then

Total = BigAddition(Mid$(Total, 1), "1")
Reste = "0"
Exit For

ElseIf Pgdd(Term1, Term2) = 2 Then

Reste = Term1
Exit For

ElseIf Pgdd(Term1, Term2) = 1 Then

Term1 = BigSoustraction(Term1, Term2)
Total = BigAddition(Mid$(Total, 1), "1")

End If

Next i

If Rest = True Then Total = Total & "r" & Reste

BigDivision = Zero(Mid$(Total, 1))

End Function

' SOUSTRACTION
' ************

Public Function BigSoustraction(Term1 As String, Term2 As String)

Dim Nbd, Nbt, Nbu As Integer

If Pgdd(Term1, Term2) = 0 Then
BigSoustraction = "0"
Exit Function
End If

If Pgdd(Term1, Term2) = 2 Then
BigSoustraction = "-" & BigSoustraction(Term2, Term1)
Exit Function
End If

St1 = Len(Term1): St2 = Len(Term2)

If St1 < St2 Then Term1 = String(St2 - St1, "0") & Term1
If St1 > St2 Then Term2 = String(St1 - St2, "0") & Term2

For i = 0 To Len(Term1) - 1

Nb1 = Mid$(Term1, Len(Term1) - i, 1)
Nb2 = Mid$(Term2, Len(Term2) - i, 1)

If Val(Nb1) - Val(Nb2) - Nbd2 < 0 Then

Nbd = Abs(Nb1 - Nb2) \ 10 + 1
Nb1 = Val(Nb1) + Nbd * 10

End If

Nbu = Nb1 - Nb2 - Nbd2
Nbd2 = Nbd: Nbd = 0
Total = Nbu & Total

Next i

BigSoustraction = Zero(Mid$(Total, 1))

End Function

' CONVERSION BINAIRE
' ******************

Private Function DecToBin(Nombre As String)

Do While Nombre <> "0"
Bini = Val(Right(Nombre, 1)) Mod 2
Biny = Bini & Biny
Nombre = BigDivision(Nombre, "2", False)
Loop

DecToBin = Biny

End Function

' PLUS GRAND DENOMINATEUR COMMUN
' ******************************

Private Function Pgdd(Term1 As String, Term2 As String)

St1 = Len(Term1): St2 = Len(Term2)

If St1 > St2 Then Pgdd = 1: Exit Function
If St1 < St2 Then Pgdd = 2: Exit Function

For i = 1 To Len(Term1)

If Mid(Term1, i, 1) > Mid(Term2, i, 1) Then
Pgdd = 1
Exit Function
End If

If Mid(Term1, i, 1) < Mid(Term2, i, 1) Then
Pgdd = 2
Exit Function
End If

Next i

Pgdd = 0

End Function

' SUPPRESSION DU ZERO
' *******************

Private Function Zero(Term1 As String)

For i = 1 To Len(Term1) - 1
If Mid$(Term1, 1, 1) = "0" Then Term1 = Mid$(Term1, 2) Else Exit For
Next i

Zero = Term1

End Function



Je vous remercie beaucoup de votre aide

Bonne journée

Publié : mer. 12/juil./2006 9:51
par djes

Publié : mer. 12/juil./2006 10:06
par SPH
Ca existe en PB. La lib s'appelle PBOSL.

Publié : mer. 12/juil./2006 12:19
par andrebernard
Bonjour

Je vous remercie de ces conseils, je vais essayer de me debrouiller comme un grand tout seul.

Encore merci