factorielle

Les derniers trucs auxquels vous avez joué, les derniers ordinateurs que vous avez bidouillés.

Modérateur : Politburo

Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

factorielle

Message par Ben »

Salut,

J'ai passé quelques heures sur mon petit PC-1500 à lui faire calculer tous les chiffres d'une factorielle.
Y a t'il un moyen de déterminer le nombre de chiffres du résultat ?

Ben
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5633
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: factorielle

Message par ledudu »

Salut,
Déterminer ou estimer ?
Y'en a qui ont essayé...
Avatar du membre
leglatin
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 761
Enregistré le : 03 févr. 2003 19:46
Localisation : Berville-sur-Mer (27)
Contact :

Re: factorielle

Message par leglatin »

Faire une simple somme des logarithmes décimaux des facteurs ?
Commodore 7970 - Texas Instruments TI-30, 57, 60, 66, 74, 76.fr, 80, 81, 82, 82 Stats.fr, 83, 85, 86, 89, 92 - Casio PB-100, PB-110, PB-410, PB-500, PB-700, PB-770, FX-180Pv, FX-7500G, FC-200, FA-3, FA-4, FA-5, FA-10, FA-11, FA-20, FP-12, CM-1, OR-1, OR-1(E), OR-4, OR-8, RC-2, RC-4 - Canon X-07 - Psion Series 5 mx - PalmOne Tungsten E2 - Compaq iPAQ H3900 - HP iPAQ HX2110 - Philips VG8020, NMS8255, VY0010, VY0011, VS0080, D6450, VW0030, SBC3810, NMS1112, NMS1150, NMS1170 - Atari 1040 STE
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: factorielle

Message par gege »

Bonjour,
Utilises la formule de Stirling.
G.E.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8385
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: factorielle

Message par badaze »

gege a écrit :Bonjour,
Utilises la formule de Stirling.
G.E.
Il en a même fait un livre.
:arrow:
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: factorielle

Message par Ben »

Bonjour,

Je fais le programme sur le PC-1500 et le Commodore 128.

Sur le Sharp, les tableaux sont limités à 255 éléments. Chaque élément peut contenir un chiffre jusqu'à 7 positions (sinon, on se retrouve avec 1.123456E10), ce qui nous fait 1785 chiffres. Avec l'algorithme de la somme des LOG, j'ai trouvé, de manière empirique, que 733! fais 1784 positions.

Bon, je vous épargne les 1784 chiffres du résultat

Code : Tout sélectionner

10 FAST:SCNCLR
20 PRINT "CALCUL DE LA FACTORIELLE"
30 PRINT "------------------------"
40 DIM FA(500)
50 INPUT "NB=";NB
60 FA(1)=1:B=1:T=TI
70 FOR I=1 TO NB
80 J=0
90 J=J+1
100 RL=FA(J)*I+RT:IF RL>999999999 THEN PRINT I,B,RL:STOP
110 RT=INT(RL/1000000)
120 FA(J)=RL-1000000*RT
130 IF J=B AND RT<>0 THEN B=B+1
140 IF J<B THEN 90
150 NEXT I
155 T=(TIME-TI)/60
160 PRINT "FACTORIELLE DE";NB;"="
165 PRINT FA(B);
166 T=1
190 FOR I=B-1 TO 1 STEP -1
200 WN$=STR$(FA(I)):GOSUB 300:PRINT WN$;" ";
205 T=T+1:IF T>9 THEN PRINT:T=0
210 NEXT I
220 PRINT:PRINT "calcul en ";t; "sec"
230 print "nbr tableau=";b
240 print "nbr chiffre=";(b-1)*6+len(str$(fa(b)))-1
250 end
300 wn$=right$(wn$,len(wn$)-1)
310 if len(wn$)=6 then 399
320 for j=1 to 6-len(wn$)
330 wn$="0"+wn$
340 next j
399 return
La version C128 du programme. Les éléments du tableau ne peuvent dépasser 6 positions, mais le tableau peut être plus grand que 255 éléments

Ben
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: factorielle

Message par Hobiecat »

badaze a écrit :Il en a même fait un livre.
:arrow:
:mrgreen:
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: factorielle

Message par C.Ret »

Je confirme, la factorielle de 733 se compose effectivement de 1784 chiffres.

Image

J'ai vérifié moi aussi sur un Commodore C128D, mais avec un programme bien plus court, en tirant profit des boucles DO...LOOP que permet son Basic Microsoft v7.0
et en mémorisant la factorielle directement sous la forme d'une chaine de caractères.
Comme les registres ne peuvent contenir que 256 caractères, j'utilise implicitement un tableau F$(...)

Code : Tout sélectionner

10 fast:clr:c%=1:f$(0)="1":input "n ";n
20 do while n%<n:n%=n%+1:for f=0 to f%:for i=len(f$(f)) to 1 step -1:q%=r%+n%*val(mid$(f$(f),i,1)):r%=q%/10:q%=q%-10*r%:mid$(f$(f),i,1)=chr$(48+q%):next i,f
30 do while r%:q%=r%:r%=r%/10:q%=q%-10*r%:c%=c%+1:if len(f$(f%))>254then f%=f%+1
40 f$(f%)=chr$(48+q%)+f$(f%):loop:loop:print n%;"[←]!=";:for f=f% to 0 step -1:print f$(f);:next f:print ".(";c%;")":end
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: factorielle

Message par Ben »

Le calcul de la factorielle se fait de la ligne 70 à 150. Le reste, ce sont les stats, la présentation, ...
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8385
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: factorielle

Message par badaze »

C.Ret a écrit :Je confirme, la factorielle de 733 se compose effectivement de 1784 chiffres.

Image

J'ai vérifié moi aussi sur un Commodore C128D, mais avec un programme bien plus court, en tirant profit des boucles DO...LOOP que permet son Basic Microsoft v7.0
et en mémorisant la factorielle directement sous la forme d'une chaine de caractères.
Comme les registres ne peuvent contenir que 256 caractères, j'utilise implicitement un tableau F$(...)

Code : Tout sélectionner

10 fast:clr:c%=1:f$(0)="1":input "n ";n
20 do while n%<n:n%=n%+1:for f=0 to f%:for i=len(f$(f)) to 1 step -1:q%=r%+n%*val(mid$(f$(f),i,1)):r%=q%/10:q%=q%-10*r%:mid$(f$(f),i,1)=chr$(48+q%):next i,f
30 do while r%:q%=r%:r%=r%/10:q%=q%-10*r%:c%=c%+1:if len(f$(f%))>254then f%=f%+1
40 f$(f%)=chr$(48+q%)+f$(f%):loop:loop:print n%;"[←]!=";:for f=f% to 0 step -1:print f$(f);:next f:print ".(";c%;")":end
Quand on pense que le nombre d'atomes dans tout l'univers observable est estimé à 2x10^79 !!!
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: factorielle

Message par C.Ret »

Ben a écrit :Le calcul de la factorielle se fait de la ligne 70 à 150. Le reste, ce sont les stats, la présentation, ...
Très juste, et j'ai oublié de dire que mon programme très court est aussi très lent. Il est même bien trop lent et il lui faut plus de 4h pour déterminer les 1784 chiffres de 733!.


Voici une version plus rapide:

Code : Tout sélectionner

list

10 fast:clr:c%=1:dim f(399):f(0)=1:s$="":input "[wht]n [yel]";n%:ti$="000000":if n%>1 then begin:e%=9-log(n%)/log(10):e=int(10↑e%)
20 for n=2 to n%:r=0:for f=0 to f%:q=n*f(f)+r:r=int(q/e):f(f)=q-e*r:next f:if r then f%=f%+1:f(f%)=r
30 next n:c%=1+log(f(f%))/log(10)+e%*f%:bend
40 print n%;"[←]!=";:for f=f% to 0 step -1:color 5,4+(fand1):print right$(s$+mid$(str$(f(f)),2),e%);:s$="00000000":next f:print ".[wht](";c%;":";f%;")";ti$:getkey s$

ready.
La saisie de N et l'initialisation du calcul se font à la ligne 10,
Le calcul des chiffres de la factorielle à la ligne 20,
La détermination du nombre de chiffres à la ligne 30,
La mise en forme et l'affichage des résultats à la ligne 40.

Le GETKEY final permet de figer l'écran afin de capturer l'intégralité des informations qui y figure.
Le nombre de décimales mémorisées dans chaque registre F() est calculé au début du programme (variable E%).
Le nombre de décimales C% de la factorielle est obtenu à la fin de leur détermination à l'aide de E%, du nombre F% de registres F() utilisés et du nombre de chiffres contenu dans le dernier registre F(F%).

Image

L'alternance des couleurs met en évidence la succession des registres F().
( 1784 : 297 )002511 signifie que la factorielle comporte 1784 chiffres, utilise 298 registres (de 0 à 297) et que la détermination a nécessité 00h 25min 11s.

badaze a écrit :Quand on pense que le nombre d'atomes dans tout l'univers observable est estimé à 2x10^79 !!!


Effectivement, mais il y a maintenant déjà un certain temps que je me prépare activement à observer l'invisible et l'incommensurable.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: factorielle

Message par Ben »

J'ai calculé 733! sur le Sharp, le pauvre. Il a tout de même mis 3h48 :-)
Avatar du membre
leglatin
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 761
Enregistré le : 03 févr. 2003 19:46
Localisation : Berville-sur-Mer (27)
Contact :

Re: factorielle

Message par leglatin »

Voici ma version pour TI-57 : avec ce programme, elle peut calculer la factorielle d'un entier naturel compris entre 1 et 54 inclus, avec tous ses chiffres.

Pour obtenir les chiffres de n!, saisir RST, n, R/S. A l'issue du calcul, les chiffres de n! sont stockés en mémoire tel que :

n!=[RCL7]*10^54+[RCL6]*10^45+[RCL5]*10^36+[RCL4]*10^27+[RCL3]*10^18+[RCL2]*10^9+[RCL1]

Dans le cas où le calcul s'achève avec l'affichage de 0 en notation scientifique ( "0 00" ), multiplier le tout par 10^9.

Exemple : 54!. On obtient à l'issue du calcul l'affichage "0 00" et en mémoire :
RCL7 = 230843697
RCL6 = 339241380
RCL5 = 472092742
RCL4 = 683027581
RCL3 = 083278564
RCL2 = 571807941
RCL1 = 132288000

d'où 54! = 230843697339241380472092742683027581083278564571807941132288000000000000

© C. Le Glatin, 1992. :mrgreen:

Image

PS : Le pas 03 se programme par programmation synthétique ; si vous ne savez faire, pas grave : enlever les pas 00 à 02 du programme et saisissez manuellement RST, INV C.t, n, R/S pour lancer le calcul.
Commodore 7970 - Texas Instruments TI-30, 57, 60, 66, 74, 76.fr, 80, 81, 82, 82 Stats.fr, 83, 85, 86, 89, 92 - Casio PB-100, PB-110, PB-410, PB-500, PB-700, PB-770, FX-180Pv, FX-7500G, FC-200, FA-3, FA-4, FA-5, FA-10, FA-11, FA-20, FP-12, CM-1, OR-1, OR-1(E), OR-4, OR-8, RC-2, RC-4 - Canon X-07 - Psion Series 5 mx - PalmOne Tungsten E2 - Compaq iPAQ H3900 - HP iPAQ HX2110 - Philips VG8020, NMS8255, VY0010, VY0011, VS0080, D6450, VW0030, SBC3810, NMS1112, NMS1150, NMS1170 - Atari 1040 STE
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8385
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: factorielle

Message par badaze »

Un mot. Bravo !!!

Je n'aurais jamais pensé que ce soit possible.
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: factorielle

Message par Ben »

C.Ret a écrit :la détermination a nécessité 00h 25min 11s.
Bravo! Mon programme met plus du double, un peu moins d'une heure pour faire le calcul
Répondre

Retourner vers « A quoi t'as joué hier ? »