Affichage de très grands nombres entiers - Factorielles - Exponentielles

job75

XLDnaute Barbatruc
Bonjour à tous,

L'idée de ce fil m'est venue à la suite de celui-ci :

https://www.excel-downloads.com/threads/suite-de-fibonacci.208917/

On sait qu'il n'est pas possible sur Excel de traiter des nombres supérieurs à 1,79769313486231E308.

Ce qui correspond à des nombres entiers de 309 chiffres.

Voyez dans le fichier joint les fonctions VBA ASOMME APRODUIT FACTORIELLE.

Elles permettent d'afficher les résultats de sommes, produits et factorielles avec 10000 chiffres au maximum.

Noter en C5 l'affichage de la factorielle 1000! dotée de 2568 chiffres...

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle(1).xls
    45 KB · Affichages: 237
Dernière édition:

job75

XLDnaute Barbatruc
Affichage des très grands nombres entiers - Factorielles - Exponentielles

Bonjour le fil, le forum,

Pour faire bon poids j'ai ajouté la fonction EXPONENTIELLE :

Code:
Function EXPONENTIELLE(x As String, n As Long) As String
'x peut être un grand nombre entier sous forme de texte
EXPONENTIELLE = 1
For n = 1 To n
  EXPONENTIELLE = APRODUIT(EXPONENTIELLE, x)
Next
End Function
Fichier joint.

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(1).xls
    37.5 KB · Affichages: 84
Dernière édition:

job75

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re,

Sur le fil cité au post #1, Roger2327 traite les nombres par tranches de 9 chiffres.

Cela accélère beaucoup la macro de base ASOMME :

Code:
Function ASOMME(x As String, y As String) As String
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v&, ret%
L = Application.Max(Len(x), Len(y))
If L > 10000 Then ASOMME = -"" 'sécurité
x = String(9 + L - Len(x), "0") & x
y = String(9 + L - Len(y), "0") & y
For n = Len(x) To 10 Step -9
  v = Val(Mid(x, n - 8, 9)) + Val(Mid(y, n - 8, 9)) + ret
  ASOMME = Format(v Mod 1000000000, String(9, "0")) & ASOMME
  ret = -(v > 999999999)
Next
For n = 1 To Len(ASOMME)
  If Val(Mid(ASOMME, n, 1)) Then ASOMME = Mid(ASOMME, n): Exit Function
Next
End Function
Noter que je n'utilise plus de tableaux VBA.

FACTORIELLE(5000) renvoie #VALEUR! en 2 mn au lieu de 8 mn précédemment.

Fichier (2).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(2).xls
    45.5 KB · Affichages: 75

ROGER2327

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re...


Un petit truc à modifier : il peut y avoir une retenue à la fin de la dernière boucle​
Code:
For N = Len(x) To 10 Step -9
  V = Val(Mid(x, N - 8, 9)) + Val(Mid(y, N - 8, 9)) + ret
  ASOMME = Format(V Mod 1000000000, String(9, "0")) & ASOMME
  ret = -(V > 999999999)
Next
Je pense qu'il faut écrire :​
Code:
x = String(18 + l - Len(x), "0") & x
y = String(18 + l - Len(y), "0") & y
(18 au lieu de 9)​


Bonne soirée.


ROGER2327
#6711


Mardi 17 Tatane 140 (Sainte Flamberge, voyante - fête Suprême Quarte)
12 Thermidor An CCXXI, 8,0006h - salicot
2013-W31-2T19:12:05Z
 

job75

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re,

Vous avez parfaitement raison Roger, j'avais mal testé, =ASOMME(999999999;1) renvoie 000000000.

Il faut descendre la boucle jusqu'à 9 (et pas 10) :

Code:
Function ASOMME(x As String, y As String) As String
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v&, ret%
L = Application.Max(Len(x), Len(y))
If L > 10000 Then End 'sécurité
x = String(9 + L - Len(x), "0") & x
y = String(9 + L - Len(y), "0") & y
For n = Len(x) To 9 Step -9
  v = Val(Mid(x, n - 8, 9)) + Val(Mid(y, n - 8, 9)) + ret
  ASOMME = Format(v Mod 1000000000, String(9, "0")) & ASOMME
  ret = -(v > 999999999)
Next
For n = 1 To Len(ASOMME)
  If Val(Mid(ASOMME, n, 1)) Then ASOMME = Mid(ASOMME, n): Exit Function
Next
End Function
Fichier (3).

Edit : pour le test de sécurité, If L > 10000 Then End c'est mieux.

Bonne nuit à tous.
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(3).xls
    45 KB · Affichages: 79
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re...


(...)

Il faut descendre la boucle jusqu'à 9 (et pas 10) :

(...)
Effectivement, ça fonctionne mieux.

On peut accélérer la chose :​
VB:
Function ASOMME$(x, y)
Dim i&, a$, b$, d&, r&, s$, tmp$
  If Len(CStr(y)) > Len(CStr(x)) Then a = CStr(y): b = CStr(x) Else a = CStr(x): b = CStr(y)
  d = 9 - (Len(a) Mod 9)
  a = String(d, "0") & a
  b = String(Len(a) - Len(b), "0") & b
  For i = Len(a) To 9 Step -9
    tmp = CStr(CLng(Mid$(a, i - 8, 9)) + CLng(Mid$(b, i - 8, 9)) + r)
    Select Case Len(tmp)
    Case 9: s = tmp & s: r = 0
    Case Is > 9: s = Right$(tmp, 9) & s: r = 1
    Case Else: s = Right$("00000000" & tmp, 9) & s: r& = 0
    End Select
  Next
  ASOMME = Right$(s, Len(a) - d - (Mid$(s, Len(s) - Len(a) + d, 1) = "1"))
End Function
Ça doit être environ deux fois plus rapide...​


Bonne nuit !


ROGER2327
#6712


Mercredi 18 Tatane 140 (Saint Trou, chauffeur - fête Suprême Quarte)
13 Thermidor An CCXXI, 0,0187h - abricot
2013-W31-3T00:02:41Z
 

job75

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Bonjour Roger, le forum,

Oui c'est 2 fois plus rapide, FACTORIELLE(2000) s'exécute en 18 s au lieu de 42 s.

Merci. et bonne journée.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re,

L'ennui de votre solution Roger c'est qu'elle n'enlève pas les zéros non significatifs des arguments.

Testez par exemple =ASOMME("0000011111111111111111111";"22222222222222222222")

Voici une solution qui tient compte de vos conseils mais avec mon "style" :

Code:
Function ASOMME$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v$, ret&
If Len(x) > Len(y) Then L = Len(x) Else L = Len(y)
If L > 10000 Then End 'sécurité
x = String(9 + L - Len(x), "0") & x
y = String(9 + L - Len(y), "0") & y
For n = L + 1 To 1 Step -9
  v = CStr(CLng(Mid(x, n, 9)) + CLng(Mid(y, n, 9)) + ret)
  ASOMME = Right$("00000000" & v, 9) & ASOMME
  ret = -(Len(v) > 9)
Next
For n = 1 To Len(ASOMME)
  If CByte(Mid(ASOMME, n, 1)) Then ASOMME = Mid(ASOMME, n): Exit Function
Next
ASOMME = 0 'les 2 arguments sont nuls
End Function
Edit 1 : j'ai ajouté ASOMME = 0 à la fin.

Edit 2 : j'ai aussi simplifié la fonction APRODUIT :

Code:
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim n%, t$, i As Byte
For n = Len(y) To 1 Step -1
  t = ""
  For i = 1 To CByte(Mid(y, n, 1))
    t = ASOMME(x, t)
  Next
  APRODUIT = ASOMME(APRODUIT, t)
  x = x & "0"
Next
End Function
FACTORIELLE(2000) s'exécute maintenant en 23 secondes.

Fichier (4).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(4).xls
    37.5 KB · Affichages: 78
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re...


(...)

L'ennui de votre solution Roger c'est qu'elle n'enlève pas les zéros non significatifs des arguments.

(...)
Exact ! J'ai écrit la fonction pour des arguments propres (2 + 1, pas 000000000002+000000000000000000001). Il faut donc faire une correction telle que celle que vous proposez. Personnellement, je nettoierais les arguments au début de la fonction pour ne pas trimballer des 0 inutiles tout le long des calculs. Mais je n'ai pas essayé : peut-être ne gagnerait-on pas de vitesse en suivant cette idée.
En tout cas, les résultats déjà obtenus ne sont pas vilains !​


Bonne soirée.


ROGER2327
#6713


Mercredi 18 Tatane 140 (Saint Trou, chauffeur - fête Suprême Quarte)
13 Thermidor An CCXXI, 6,0817h - abricot
2013-W31-3T14:35:46Z
 

job75

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re,

Personnellement, je nettoierais les arguments au début de la fonction pour ne pas trimballer des 0 inutiles tout le long des calculs.

Le nettoyage à la fin suffit car cela ne concerne que la 1ère exécution de ASOMME.

Pour les exécutions suivantes ils sont forcément propres.

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Afichage des sommes et produits de très grands nombres entiers - Factorielles

Re...


Re,



Le nettoyage à la fin suffit car cela ne concerne que la 1ère exécution de ASOMME.

Pour les exécutions suivantes ils sont forcément propres.

A+

Dont acte ! (Quand on n'a pas essayé, on raconte des conneries...)


ROGER2327
#6714


Mercredi 18 Tatane 140 (Saint Trou, chauffeur - fête Suprême Quarte)
13 Thermidor An CCXXI, 6,3689h - abricot
2013-W31-3T15:17:07Z
 

job75

XLDnaute Barbatruc
Re : Affichage de très grands nombres entiers - Factorielles - Exponentielles

Bonjour le fil, le forum,

J'ai amélioré la fonction APRODUIT en utilisant un tableau pour mémoriser :

Code:
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim n%, t$(9), z$
For n = 1 To 9
  t(n) = ASOMME(t(n - 1), x)
Next
For n = Len(y) To 1 Step -1
  APRODUIT = ASOMME(APRODUIT, t(CByte(Mid(y, n, 1))) & z)
  z = z & "0"
Next
End Function
FACTORIELLE(2000) s'exécute maintenant en 16 secondes.

Fichier (5).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(5).xls
    45 KB · Affichages: 87

Statistiques des forums

Discussions
312 962
Messages
2 093 996
Membres
105 906
dernier inscrit
Evolugame