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: 236
Dernière édition:

job75

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

Bonjour le forum,

Cette macro est plus sûre et plus rapide :

Code:
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim a$, b$, n%, t$(9), z$
If Len(x) > Len(y) Then a = x: b = y Else a = y: b = x
For n = 9 To 1 Step -1 'pour obtenir le chiffre maximum
  If InStr(b, n) Then Exit For
Next
For n = 1 To n
  t(n) = ASOMME(t(n - 1), a)
Next
For n = Len(b) To 1 Step -1
  APRODUIT = ASOMME(APRODUIT, t(CByte(Mid(b, n, 1))) & z)
  z = z & "0"
Next
End Function
FACTORIELLE(2000) s'exécute en 14 secondes.

Fichier (6).

A+
 

Pièces jointes

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

ROGER2327

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

Bonjour à tous.


2000 ! en trois secondes.​


ROGER2327
#6718


Samedi 21 Tatane 140 (Saints Catoblepas, lord et Anoblepas, amirals - fête Suprême Quarte)
16 Thermidor An CCXXI, 1,1842h - guimauve
2013-W31-6T02:50:32Z
 

Pièces jointes

  • Factorielle (2).xlsm
    20.4 KB · Affichages: 85
  • Factorielle (2).xls
    44.5 KB · Affichages: 83

job75

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

Bonjour Roger, le forum,

Votre solution est excellente, elle utilise une logique différente pour les produits.

Pour revenir à mon fichier, la fonction ASOMME est plus rapide en découpant en tranches de 14 chiffres :

Code:
Function ASOMME$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim L%, n%, v$, ret As Byte
If Len(x) > Len(y) Then L = Len(x) Else L = Len(y)
If L > 10000 Then End 'sécurité
x = String(14 + L - Len(x), "0") & x
y = String(14 + L - Len(y), "0") & y
For n = L + 1 To 1 Step -14
  v = CCur(Mid(x, n, 14)) + CCur(Mid(y, n, 14)) + ret
  ASOMME = Right$("0000000000000" & v, 14) & ASOMME
  ret = -(Len(v) = 15)
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
FACTORIELLE(2000) s'exécute en 11 secondes.

Fichier (7).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(7).xls
    40 KB · Affichages: 64

ROGER2327

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

Bonjour à tous.


Une version légèrement accélérée de la proposition à l'arrache de cette nuit :
2000 ! en moins de deux secondes et six dixièmes.​


ROGER2327
#6719


Samedi 21 Tatane 140 (Saints Catoblepas, lord et Anoblepas, amirals - fête Suprême Quarte)
16 Thermidor An CCXXI, 5,0480h - guimauve
2013-W31-6T12:06:54Z
 

Pièces jointes

  • Factorielle (2bis).xlsm
    14.6 KB · Affichages: 72
  • Factorielle (2bis).xls
    31.5 KB · Affichages: 81

job75

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

Re,

C'est la compétition Roger n'est-ce pas ;)

Cette macro APRODUIT reste sur la même logique que la fonction ASOMME.

Seulement elle découpe par tranches de 7 chiffres :

Code:
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim a$, b$, L%, m%, P$, n%, v$, ret As Currency, z$
If Len(x) > Len(y) Then a = x: b = y Else a = y: b = x
L = Len(a)
a = "00000000000000" & a
b = "0000000" & b
For m = Len(b) - 6 To 1 Step -7
  P = ""
  For n = L + 8 To 1 Step -7
    v = CCur(Mid(a, n, 7)) * CCur(Mid(b, m, 7)) + ret
    P = Right$("000000" & v, 7) & P
    If Len(v) > 7 Then ret = CCur(Left(v, Len(v) - 7)) Else ret = 0
  Next
  APRODUIT = ASOMME(APRODUIT, P & z)
  z = z & "0000000"
Next
End Function
FACTORIELLE(2000) s'exécute maintenant aussi en 3 secondes :cool:

Fichier (8).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(8).xls
    47.5 KB · Affichages: 63
Dernière édition:

job75

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

Bonjour le forum,

Il est mieux de placer le test limitant le nombre de caractères après la suppression des zéros non significatifs.

Voir la fonction ASOMME du fichier (9).

A+
 

Pièces jointes

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

job75

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

Re,

Sur ce fichier (10) FACTORIELLE(2000) s'exécute en 2,03 secondes chez moi.

Voir la fonction Epure utilisée dans ASOMME et APRODUIT.

Il me semble qu'on arrive au bout du problème :cool:

Edit 1 : j'avais voulu modifier la fonction EXPONENTIELLE (comme FACTORIELLE), mais il ne faut pas.

Edit 2 : j'ai ôté le contrôle du nombre de chiffres (10000) dans le fichier (10).

Je l'ai remis dans le fichier (10 bis).


A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(10).xls
    52.5 KB · Affichages: 52
  • Somme et produit de grands nombres - Factorielle - Exponentielle(10 bis).xls
    52.5 KB · Affichages: 46
Dernière édition:

job75

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

Re,

Non ce n'était pas fini, avec un pas variable pour les tranches ceci est plus rapide :

Code:
Function APRODUIT$(x$, y$)
'x et y sont de grands nombres entiers sous forme de textes
Dim a$, b$, pas%, L%, n1%, m As Currency, P$, n2%, v$, ret As Currency, z$
If Len(x) > Len(y) Then a = x: b = y Else a = y: b = x
pas = IIf(Len(b) > 7, 7, 14 - Len(b))
a = "00000000000000" & a
b = "0000000" & b
L = Len(a) - pas + 1
For n1 = Len(b) - 6 To 1 Step -7
  m = CCur(Mid(b, n1, 7))
  P = ""
  For n2 = L To 1 Step -pas
    v = m * CCur(Mid(a, n2, pas)) + ret
    P = Right$("0000000000000" & v, pas) & P
    If Len(v) > pas Then ret = CCur(Left(v, Len(v) - pas)) Else ret = 0
  Next
  If APRODUIT = "" Then APRODUIT = Epure(P) Else APRODUIT = ASOMME(APRODUIT, P & z)
  z = z & "0000000"
Next
End Function
FACTORIELLE(2000) s'exécute en 1,21 seconde.

Intéressant pour les grandes exponentielles : EXPONENTIELLE(2;30000) s'exécute en 23 secondes.

Fichier (11).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(11).xls
    53 KB · Affichages: 73

ROGER2327

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

Bonsoir à tous.


On progresse...

2[SUP]30 000[/SUP] en moins d'une seconde. (~ 0,6 s chez moi...)


ROGER2327
#6720


Dimanche 22 Tatane 140 (Ubu ès Liens - fête Suprême Seconde)
17 Thermidor An CCXXI, 9,3305h - lin
2013-W31-7T22:23:35Z
 

Pièces jointes

  • LONGUEPUISSANCE.xlsm
    21.3 KB · Affichages: 45
  • LONGUEPUISSANCE.xls
    40 KB · Affichages: 46

job75

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

Bonjour Roger, bonjour à tous,

Bravo pour cette fonction puissance !

Utilisée avec ma fonction APRODUIT, EXPONENTIELLE(2;30000) s'exécute en 2,3 secondes.

Je suis nettement battu, votre fonction est 3 fois plus rapide que la mienne :D

Edit : mais curieusement avec FACTORIELLE(2000) je suis 2 à 3 fois plus rapide que vous :confused:

Fichier (12).

A+
 

Pièces jointes

  • Somme et produit de grands nombres - Factorielle - Exponentielle(12).xls
    56 KB · Affichages: 94
Dernière édition:

ROGER2327

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

Re...


(...)

Utilisée avec ma fonction APRODUIT, EXPONENTIELLE(2;30000) s'exécute en 2,3 secondes.

Je suis nettement battu, votre fonction est 3 fois plus rapide que la mienne :D

Edit : mais curieusement avec FACTORIELLE(2000) je suis 2 à 3 fois plus rapide que vous :confused:

(...)
Curieux, en effet... Je n'ai pas trouvé d'explication, mais, du coup, j'ai retravaillé mes précédentes propositions en les enrichissant de quelques-unes de vos idées, notamment l'utilisation du type Currency. J'obtiens quelques améliorations de performance :
2[SUP]30 000[/SUP] (9 031 chiffres) en 0,25 s.
2[SUP]100 000[/SUP] (30 103 chiffres) en 2,5 s.
2000 ! (5 736 chiffres) en 1,2 s.
3278 ! (10 103 chiffres) en 3,6 s.

Les fonctions sont dans le classeur joint. J'y ai adjoint le calcul du n[SUP]ième[/SUP] terme de la suite du Fibonacci. Par exemple :
F[SUB]100 000[/SUB] (20 899 chiffres) en 3,6 s.
F[SUB]1 000 000[/SUB] (208 988 chiffres !) en moins de six minutes.

D'autre part, cette discussion m'a fait souvenir d'un exercice amusant du temps (ancien, hélas !) où, jeune morveux, je faisais ma propédeutique.
Car avant d'être un vieux con, je fus un jeune morveux.
Il s'agissait de démontrer ces deux théorèmes :

  1. Étant donnée une séquence de chiffres décimaux arbitrairement choisie, il existe une puissance de deux dont l'écriture en base dix contient cette séquence.
  2. Plus fort, il existe une puissance de deux dont l'écriture en base dix commence par cette séquence.
(Je laisse le plaisir de la démonstration aux amateurs de ces belles choses ; en cas de difficulté, votre professeur de mathématiques préféré vous règlera cela en deux temps trois mouvements...)

Par exemple et au hasard, le cas de la séquence 2327 se résout presque instantanément :


  1. 2[SUP]383[/SUP] = 19701003098197239606139520050071806902539869635232723333974146702122860885748605305707133127442457820403313995153408
  2. 2[SUP]6 861[/SUP] = 23270207214694213556696440543218667015389378259712190988844574005420492465849235791212919309302471972645135700700358776169781942467313150376297116764815503632573189331236793719795331350518744993409895892612535309868778617702252752341377459611210861080338021531215266976740218827381147854681837606195813538687150487225388313171497815106155527846734449995489224908952643193704075244024012088521779050342968436505766424940902017071527983577759739260403882248503070139280208448912537473219769741796226110065545490846835907268821022606688947453724420249051439902882346477417467266740024621156608459954955490973829392850860491435328764506705029943206029829430969005164799914851321992672813565931284327929843760036683762850925333056158893625016357180541239932946531315392886992177536293009683137564732817374555247097085367688283206424739967694275612162754748349436389767682019036267724445798035438168195656755603787253681662472595560041714814871558554058057300816059174480034526904673586646799722559893217355252635324449394786284230613687893622916595101131144144020653954788258409968253846271307308613414063715340227941267103458495784359289114823694827959268114445574159479633001201664148873848174475323152735254103649542057298807463124170015245941625684157219813258451708178798191525973674941280485581170736351847513946037561007215012326869767121663672358696563675587400465707674030075826575715682256772403415724387204210655295562016601260480928534535835709366337837697169003318517851046213111898094531313455131295208794028120264136261203459924270248829076345678619971802932594006872618574055463601707711926874757608563966389290348393449446901380486738244727160947031922932576984726536206607207364813330755190494659320599522101932447610251864358418929588514954872765242422820660278315502886553274482565312670517458124550104457019392469029240405234292883080658258318597904717716429818662513468938487843026637488992943910130186291694343852983549570764021579107607000372055628758781598471903186661148431443873714432534850981749383388230688173701946515703124068127171204349952

C'est assez spectaculaire. Et pas toujours aussi simple... La plus petite puissance de deux dont l'écriture décimale commence par 999900 est 2[SUP]100 000[/SUP], qui s'écrit avec 30 103 chiffres (obtenus en 9 minutes).

On trouvera d'autres exemples dans le classeur.


Bon amusement.


ROGER2327
#6724


Samedi 28 Tatane 140 (Nativité de Saint Bruggie - fête Suprême Quarte)
23 Thermidor An CCXXI, 1,5602h - lentille
2013-W32-6T03:44:40Z


P. s. : Pour une version .xls, voir le message suivant.
 

Pièces jointes

  • Puissance_de_2_contenant_une séquence_donnée (2).xlsm
    97.5 KB · Affichages: 44
  • Puissance_de_2_contenant_une séquence_donnée (2).xlsm
    97.5 KB · Affichages: 48
  • Puissance_de_2_contenant_une séquence_donnée (2).xlsm
    97.5 KB · Affichages: 50
Dernière édition:

ROGER2327

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

Suite...


J'ai oublié la version .xls de la chose...
(Comme d'habitude, cette version modifiée n'est pas testée, faute de disposer d'Excel 2003.)


ROGER2327
#6725


Samedi 28 Tatane 140 (Nativité de Saint Bruggie - fête Suprême Quarte)
23 Thermidor An CCXXI, 3,5318h - lentille
2013-W32-6T08:28:35Z
 

Pièces jointes

  • Puissance_de_2_contenant_une séquence_donnée (2).xls
    186 KB · Affichages: 51
  • Puissance_de_2_contenant_une séquence_donnée (2).xls
    186 KB · Affichages: 51
  • Puissance_de_2_contenant_une séquence_donnée (2).xls
    186 KB · Affichages: 46

Staple1600

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

Bonjour à tous

ROGER2327:
Je me charge illico-presto de tester sous XL2K3 ;)

EDITIONI: J'ai sélectionné les cellules A2:A17 puis appuyer sur Calcule et... Excel 2003 (virtualisé je précise) est en train de rendre l'âme.
RIPXL20013.png
EDITIONII: à 10h37, il agonise toujours, je vais donc lui appliquer un CTRL+ALT+SUPPR, afin de le ramener parmi nous
et je vais retester avec moins de cellules sélectionnées.
EDITIONIII:
Excel 2003 lâche la rampe quand je sélectionne la cellule A12
(Avec A2:A11 sélectionnées , pas de problème, c'est ensuite que les problèmes apparaissent, à partir de A12)
 
Dernière édition:

ROGER2327

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

Bonjour à tous

ROGER2327:
Je me charge illico-presto de tester sous XL2K3 ;)

EDITIONI: J'ai sélectionné les cellules A2:A17 puis appuyer sur Calcule et... Excel 2003 (virtualisé je précise) est en train de rendre l'âme.
Regarde la pièce jointe 279547
EDITIONII: à 10h37, il agonise toujours, je vais donc lui appliquer un CTRL+ALT+SUPPR, afin de le ramener parmi nous
et je vais retester avec moins de cellules sélectionnées.
EDITIONIII:
Excel 2003 lâche la rampe quand je sélectionne la cellule A12
(Avec A2:A11 sélectionnées , pas de problème, c'est ensuite que les problèmes apparaissent, à partir de A12)

Dommage...
Dans le code de l'onglet Suite de chiffres dans 2^n, il faut probablement diminuer la valeur de la constante k. Mettre, par exemple, 8000 (ou moins, peut-être ?). Mais c'est moins rigolo...

En tout cas, merci pour le boulot de test !



ROGER2327
#6726


Samedi 28 Tatane 140 (Nativité de Saint Bruggie - fête Suprême Quarte)
23 Thermidor An CCXXI, 3,7892h - lentille
2013-W32-6T09:05:39Z
 

MJ13

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

Bonjour à tous

Moi aussi sur XL2007, sur la dernière version de Roger, cela bug sur les chiffres au dessus de la ligne 11 :confused:.

Et sinon, le code paraît joli, mais cela sert à quoi ce truc :confused::confused:.
 

Statistiques des forums

Discussions
312 294
Messages
2 086 899
Membres
103 404
dernier inscrit
sultan87