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 de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5593
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

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

Message par Marge » 10 janv. 2020 23:24

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 !

« Boris », c'est juste Maurice enrhumé.

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

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

Message par C.Ret » 12 janv. 2020 15:21

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) Consulté 1948 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) Consulté 1945 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! ).
Dernière édition par C.Ret le 12 janv. 2020 15:32, édité 2 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5593
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

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

Message par Marge » 12 janv. 2020 15:28

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 !

« Boris », c'est juste Maurice enrhumé.

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

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

Message par C.Ret » 12 janv. 2020 16:22

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 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5593
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

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

Message par Marge » 12 janv. 2020 16:31

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 !

« Boris », c'est juste Maurice enrhumé.

Répondre

Revenir vers « Tous les Pockets »