Misez P'tit, Optimisez - N°32 (factorielle)

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6189
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par Marge »

Bonsoir,

J'améliore mon programme de calculs de Permutations (ou factorielles), d'Arrangements et de Combinaisons - PAC pour les intimes - pour HP-29C/E.
C'est un peu hors-propos, mais c'est l'unique moyen que j'ai trouvé pour essayer d'obtenir 22/20 en informatique (comprenne qui peut ;)).

En 39 pas (un peu mieux que le précédent), il est surtout beaucoup plus rapide car il ne calcule que le nécessaire ; par exemple, le calcul de la combinaison C(52,3)= 22 100 prend moins de trois secondes contre dix-sept précédemment (sur HP-29E).

Voici :

Code : Tout sélectionner

01 LBL 1 | Factorielle ou son application immédiate : Permutations (combien de possibilités d'agencer des éléments un par un ?)
02 1
03 X>Y?
04 RTN   | Si le nombre à factoriser égale zéro, il vaudra un.
05 x><y
06 ENTER | On copie X en Y, on bénéficiera ainsi de la formule des arrangements : N!/(N-P)!=N!/1
07 GSB 2
08 RTN
09 LBL 2 | Arrangements
10 FIX 0 | Tous les sous-programmes passent par ici, la mise en forme de l'affichage est donc placée ici.
11 1
12 STO 1 | ... En raison des multiplications ultérieures sur ce registre... cela évite aussi un effacement général.
13 Rd
14 x><y
15 -
16 Lst x
17 +
18 STO - 0
19 Lst x | Différents travaux pour positionner le N et le N-P et placer le curseur Mémoire correctement. 
20 LBL 0 | La boucle de factorielle proprement dite.
21 STO * 1
22 1
23 -
24 ISZ   | Si on atteint 0 (par en dessous), cela signifie qu'on ne doit plus multiplier. 
25 GTO 0
26 RCL 1
27 RTN
28 LBL 3 | Combinaisons ; on va tirer profit des permutations en divisant par P! leur résultat.
29 STO 2
30 GSB 2
31 RCL 2
32 x><y
33 STO 2
34 x><y
35 GSB 1
36 RCL 2
37 x><y
38 /
39 RTN
Permutations (factorielles) : 13! {[1] [3] [GSB] [1]} = 6 227 020 800 en moins de 4 secondes.
Arrangements : A(8,3) {[8] [ENTER] [3] [GSB] [2]} = 336 en... pfiuuu... une seconde et demie ?
Combinaisons : C(52,3) {[5] [2] [ENTER] [3] [GSB] [3]} = 22 100 en moins de trois secondes.

Le programme prend en compte le fait que 0!=1 ; on comprend que le calcul de l'arrangement ou de la combinaison nécessite le cas où N=P, et si on avait zéro, ça ficherait la pagaille.
Et comme il se doit, seule la partie entière est montrée (FIX 0 au LBL 2) pour éviter les erreurs d'approximation.

Trois registres (0, 1 et 2), 39 pas : 60 octets.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

Je reviens avec un code pour HP-19C qui tire profit de son imprimante intégrée. Cette machine est une petite merveille qui permet d'imprimer beaucoup de données grâce à ces 30 registres et presque 100 pas de programme.

Ce code permet de calculer et afficher tous les chiffre de la factorielle de 0 (inclus) à (j'estime, pas essayé) 132.
Il n'est pas très rapide, ni particulièrement lent et pourra être facilement adapté à une HP-29E qui affichera les résultats assez rapidement. Mais il faudra les recopier, corvée qui est épargnée aux heureux utilisateur d'une HP-19C.
MPO 32 - HP-19C - code print all digits of n!.gif
MPO 32 - HP-19C - code print all digits of n!.gif (23.49 Kio) Vu 6956 fois
Dans cette version, les registres R1 à R28 permettent de mémoriser jusqu'à 6 chiffres de la factorielle. On peut ainsi les déterminer jusqu'à n=132; Il est possible d'utiliser un regroupement par 7, mais la relecture sera plus ardue. En effet, les groupes de 6 chiffres permettent de facilement recopier le nombre en groupant traditionnellement en 3 par 3 chiffres.

Voici un exemple de détermination exacte de quelques factorielles:
MPO 32 - HP-19C - print samples.gif
MPO 32 - HP-19C - print samples.gif (34.7 Kio) Vu 6953 fois
J'ai utilisé un FIX6 pour afficher tous les chiffres et notamment les zéros au début de chaque groupe (c'est plus rapide à recopier). Il ne faut donc pas tenir compte des "0." en début de ligne. Si cela gène, il est facile d'effacer les pas 46 47 et 48 afin de n'avoir à l'impression que des entiers (le FIX6 ou autre pourra être placé en fin de code pour retrouver son format habituel) mais les zéros en début de groupe ne seront pas imprimés (ou afficher) et il faudra penser à les ajouter (je trouve cela bien moins pratique cf. exemple ci-dessus de 12! ).
Modifié en dernier par C.Ret le 12 janv. 2020 14:32, modifié 2 fois.
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.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6189
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par Marge »

Bien joué, c'est en effet correctement tirer partie des nombreux registres des HP-19/29C.
Sur ma 29E, je pourrai ajouter une diode plus tard pour l'impression sur la "sans fil" d'HP dont la référence m'échappe.
Mais pourquoi n'as-tu pas regroupé les chiffres par groupes de neuf ?
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

Par groupe de neuf, je ne peux pas à cause des erreurs d'arrondi que cela entraînera dès que l'on aura dans la boucle des multiplications un produit qui fera plus de 10 chiffres. cela aura de grande chance de ce produire dès que l'on sera au-delà de n=10

En réalité, je n'avais pas essayé !

Il est facile de changer les pas 11 et 48 par respectivement 9 et FIX9. En essayant 49 GSB0 on obtient alors :
49 GSB0 608 281 863 989 859 392 230 361 318 627 905 686 254 528 379 905 149 440 000 000 000. ***
au lieu de
49 ! = 608 281 864 034 267 560 872 252 163 321 295 376 887 552 831 379 210 240 000 000 000.

De nombreux chiffres sont erronés du fait des nombreuses erreurs d'arrondi rencontrées lorsque le registre contient trop de chiffres et que le produit avec un facteur dépasse les dix chiffres du calculateur.

On pourrait complexifier la façon de faire chaque produit mais cela va allonger le code et ralentir son exécution. Pour un gain minime. Avec 9 chiffres par registre (soit 252 au total), on n'ira pas plus loin que 145! (au lieu de 132! avec des groupe de 6 permettant 168 chiffres mémorisables).
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.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6189
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par Marge »

C'est cohérent.
Tu pensais aux logarithmes pour le gain, j'imagine. Enfin, pas sûr, il y a aussi moyen d'utiliser un registre intermédiaire.
Bon dimanche !
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

Je n'ai pas vu de code pour TI58/58c/59

A priori si une TI58/58c/59 a son module "Master Library n°1" enfiché, elle possède une fonction factorielle qui s'utilise en mode calcul :

Code : Tout sélectionner

Pour calculer la factorielle 7! faire :
2nd Pgm 16        // Appel du programme depuis le module Solid State ROM
7 A                     // Saisi de l'argument n
C affiche 5040.   // Affiche la factorielle de n!
Sans utiliser le module, un programme de factoriel possible peut-être :

Code : Tout sélectionner

.000 42 09            STO 09             mémorise n dans registre #9
.002 01                1                 initialise produit   n!=1×2×3×…×n
.003 44 09            SUM 09             incrémente n d'une unité
→005 22 97 09 00 16   INV Dsz 09 016 →   décrémente n et sort
.010 65	               ×                 
.011 43 09            RCL 09             effectue le produit    
.013 61 00 05         GTO 005 → 
→016 95                =                 calcule n!
.017 91               R/S
Soyez indulgent c'est un de mes tout premier programme sur une TI-58c. Ca ressemble à une TI-57 LCD mais ce n'est pas pareil du tout J'appuie sur R/S au lieu de sortir ou entrer dans le mode programmation !

Usage:
7 RST R/S affiche après quelques secondes 5040.
0 RST R/S affiche bien 1
69 RST R/S affiche 1.7112245 98 en environ 37 secondes.

Toute valeur de n supérieure à 69 provoque un affichage erroné clignotant "
Modifié en dernier par C.Ret le 27 févr. 2022 09:13, modifié 1 fois.
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.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8410
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par badaze »

Pour TI 57.
Il faut mettre le nombre dans le registre 0.

Code : Tout sélectionner

RCL 0
X
DSZ 
RST
1
=
R/S
Ne marche pas pour 0!
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
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par tyann »

Bonjour
Sans utiliser le module, un programme de factoriel possible peut-être :
CODE : TOUT SÉLECTIONNER

.000 42 09 STO 09 mémorise n dans registre #9
.002 01 1 initialise produit n!=1×2×3×…×n
.003 44 09 SUM 09 incrémente n d'une unité
→005 22 97 09 00 16 INV Dsz 09 016 → décrémente n et sort
.010 65 ×
.011 43 09 RCL 09 effectue le produit
.013 61 00 05 GTO 005 →
→016 95 = calcule n!
.017 91 R/S
Soyez indulgent c'est un de mes tout premier programmes sur une TI-58c. Ca ressemble à une TI-57 LCD mais ce n'est pas pareil du tout J'appuie sur R/S au lieu de sortir ou entrer dans le mode programmation !
Tu peux économiser 1 pas avec OP 29 à la place de 1 SUM 09.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

tyann a écrit : 27 févr. 2022 07:43Tu peux économiser 1 pas avec OP 29 à la place de 1 SUM 09.
Oui, mais alors qu'advient-il du résultat de 0! ??
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.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par tyann »

Salut C.ret

Ha oui désolé.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

tyann a écrit : 27 févr. 2022 10:53Ha oui désolé.
Pas de mal, ce qui m'a donné l'idée de relire le chapitre des OP spéciales des TI-58/59, chose que je n'avait pas encore faite. Je croyais qu'il n'y avait là que des opérations concernant l'imprimante. Mais je découvre qu'il y a les opérations pour les statistiques, le traitement des exceptions mathématiques et les OP 20 à 29 et OP 30 à 39 pour respectivement incrémenter ou décrémenter les registres 0 à 9.
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.
Répondre

Retourner vers « Tous les Pockets »