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 : 6172
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 »

8O Well done! But as you noticed, there are many more keys to press at each calculation!
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
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 292
Enregistré le : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

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

Message par Xerxes »

For more comfort, we need 2 program areas and some more steps:

Code : Tout sélectionner

P1:
01  -
02  -
03  1
04  Kin1
05  x<->y

Code : Tout sélectionner

P2:
01  Kin*1
02  =
03  x>0
04  Kout1
Usage exampe: 69 P1 P2
Avatar du membre
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 292
Enregistré le : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

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

Message par Xerxes »

The FX-190 has no K vars, but Viktor Toth from rskey.org found an elegant solution:

Code : Tout sélectionner

01  Min
02  *
03  (
04  MR
05  -
06  1
07  )
08  x>0
09  1
10  =
Usage example: 69 P1

And an improved version for the FX-180P that uses a K var instead of M, based on his idea:

Code : Tout sélectionner

01  Kin1
02  *
03  1
04  Kin-1
05  Kout1
06  x>0
07  x<->y
Usage example: 69 P1
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: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

En hommage à la nouvelle acquisition de notre ami badaze, je donne ici un programme de calcul de n! pour n normal, grand ou très grand.

Code : Tout sélectionner

01     14 33	f CLreg 	.	.	.	n
02     14 08	f LOG		...	...	...	lg n
03  23 51 00	  STO+0		.	.	.	lg n
04     14 73	f LASTx		.	.	lg n	n
05        01	   1		.	lg n	n	1
06        41	   -		.	.	.	n-1
07     15 61	g  x<>0?
08     13 02	  GTO 02	...	...	...	n-1
09     24 00	  RCL0		.	.	0	SUM lg n
10     14 01	f INT		.	.	.	EEE
11     14 73	f LASTX		.	.	EEE	SUM lg n
12     15 01	g FRAC		.	.	EEE	.xxxxxxx
13     15 08	g 10^x		.	.	EEE	f.ffffff

Pour calculer 435!, il faut une HP-25 fonctionnelle pendant environ 8 min.
Mettre celle-ci en FIX 6 ou FIX 7, sasir le code ci-dessus puis saisir 435 et lancer le code par R/S (éventuellement précédé de GTO 00)
La calculatrice affiche d'abord la mantisse f.ffffff puis une pression sur X:Y (ou RDN) permet d'afficher l'exposant de 10.

Je trouve 435 ! ~= 3.492568 x10^ 960.
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 : 8385
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 »

Waouh.
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: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

Bof.

Je viens à l'instant de me rendre compte qu'il ne fonctionne pas avec n égal à zéro.
Avec tout le mal que certains se sont donné au cours de ce MPO, je ne peux pas laisser cela en état.

Heureusement un patch est disponible et le même code corrigé donne:
HP25 / HP25C FACT n avec n nul ou grand
HP25 / HP25C FACT n avec n nul ou grand
MPO 32 - HP-25 FACT n with n large or null.gif (33.18 Kio) Vu 12548 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 : 6172
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 »

Beau travail ! Ça mérite bien un...
435.JPG
435.JPG (9.9 Kio) Vu 12521 fois
!
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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
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 »

Bonjour, C.Ret,

Joli programme que je viens de tester sur ma HP-29E (quelle machine ! j'en parlerai un autre jour). Je l'améliorerais volontiers pour qu'il donne les résultats sans logarithme quand ce n'est pas nécessaire... ce sera pour une autre fois.
Mais en attendant, je trouve une erreur pour 12! (qui serait donc mieux placé en entier dans l'affichage parce qu'il vaut 479 001 600) qui donne 4.790015988 * 10^8 (ou 479 001 598,8) ; je suppose que les erreurs de logarithmes se cumulent...
Ce n'est peut-être pas très grave pour ceux dont la mantisse dépasse les dix chiffres sur ces engins, mais gênant pour les autres. 13!, par exemple (le dernier à tenir entièrement dans l'affichage avec 6 227 020 800) donne 6,227020780*10^9 - je n'ai pas vérifié les autres.
Il faudrait probablement scinder ton programme pour utiliser un autre algorithme en première partie (pour les entiers jusqu'à 13) si les erreurs ne gênent pas le calcul au-delà (12! -> -251*10^-9 % ; 13! -> -321*10^-9 %). Quand tu auras le temps, hein, rien ne presse ; quant à moi je dois d'abord terminer mon épreuve d'équitation...
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 : 3405
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 »

EDIT:Excellente remarque. Je n'avais pas vu l'erreur de calcul liée aux logarithmes successifs pour les petits nombres. Mais cela n'a rien de surprenant, c'est un code pour calculer les factorielles de grands nombres (et de zéro pour la seconde version - là effectivement il y a un bien un souci de cohérence )

Ta suggestion d'utiliser deux méthodes de calcul en fonction de l'argument me plait bien.

Il faut que je cogite cela. Il doit y avoir un moyen de faire sans trop alourdir le programme, voir de se passer du test x=0? pour calculer la factorielle 0!

Je vais voir quelle astuce nous permet une HP-25. Il faut que je me documente un peu.

Les codes sont valables, il n'y a pas d'erreur en utilisant, comme indiqué, l'affichage FIX 6 ou FIX 7.
Voir explications dans post suivant
Modifié en dernier par C.Ret le 08 janv. 2020 22:49, 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
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

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

Message par gege »

Bonjour,
Un petit arrondi doit permettre de redonner leur bonne valeur à tes factorielles.

Sur une Citizen 280N récemment j'ai constaté que la table des factorielles était en ROM, ou du moins je le pense vu la rapidité d'apparition de la valeur.
Cette machine n'a qu'une mémoire mais peut traiter des statistiques (à une dimension) avec 80 valeurs éditables (donc stockées) !!
Moi pas comprendre.
G.E.
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: Misez P'tit, Optimisez - N°32 (factorielle)

Message par C.Ret »

J'ai retrouvé mes notes.

Gégé a raison, il suffit d'arrondir pour que les résultats soient tous corrects.

J'avais d'ailleurs prévu l'effet du cumul des erreurs d'arrondi des logarithmes successifs.
C'est d'ailleurs pour cela que j'avais précisé d'effectuer les calcul en FIX 6 ou FIX 7 c'est l'affichage du résultat dans ce format qui garanti la justesse des résultats y compris pour les petits nombres.

Ci-dessous les résultats pour les nombres de 0 à 16 en FIX 7: je ne trouve pas d'erreur (et des résultats identiques sur HP-15C et GO-25C).

Code : Tout sélectionner

n	Y:		X:		Calcul direct (par multiplications sucessives)
0	 0.0000000	1.0000000	 0!=         1. ok
1	 0.0000000	1.0000000	 1!=         1. ok	
2	 0.0000000	2.0000000	 2!=         2. ok
3	 0.0000000	6.0000000	 3!=         6. ok
4	 1.0000000	2.4000000	 4!=        24. ok
5	 2.0000000	1.2000000	 5!=       120. ok
6	 3.0000000	1.4400000	 6!=      1440. ok
7	 3.0000000	5.0400000	 7!=      5040. ok
8	 4.0000000	4.0320000	 8!=     40320. ok
9	 5.0000000	3.6288000	 9!=    362880. ok
10	 6.0000000	3.6288000	10!=   3628800. ok
11	 7.0000000	3.9916800	11!=  39916800. ok
12	 8.0000000	4.7900160	12!= 479001600. ok
13	 9.0000000	6.2270208	13!=6227020800. ok
14	10.0000000	8.7178291	14!=8.7178291 E 10 même précision que le calcul direct
15	12.0000000	1.3076744	15!=1.3076744 E 12  "       "      "       "      " 
16	13.0000000	2.0922790	16!=2.0922790 E 13  "       "      "       "      "

Remarquons que dès 14! le calcul direct ne permet plus de déterminer complètement la valeur factorielle qui possède alors plus de 10 chiffres, l'unité n'est plus déterminée ni affichée car l' HP-25 passe en affichage scientifique.

Je ne modifie pas mon code, sauf peut-être à ajouter quelque part un FIX 7.
L'effet dû aux logarithmes approchés doit être minime (car log n est une fonction croissante en fonction de n et l'addition se fait avec n décroissant ) et ne doit être visible que pour les grands et très grands nombres.
Dans ce cas, il peut être prudent d'utiliser FIX 4 ou FIX 5 afin de ne pas afficher de chiffre erronés.

Marge a écrit : 08 janv. 2020 20:50[…) je trouve une erreur pour 12! […] qui donne 4.790015988 * 10^8 (ou 479 001 598,8) ;[…]
En FIX 7, on a bien : 12 (R/S) affiche 4.7900160 (x::y) 8.0000000 c'est à dire exactement 12! = 4 ' 7900 ' 1600 c'est à dire 479'001'600.

L'astuce est que les valeurs exactes des factorielles se terminent par des zéro de plus en plus nombreux au fur et à mesure que l'on multiplie par des multiples de deux et de cinq). L'arrondi corrige donc efficacement les erreurs des calculs, même dans le cas de logarithmes mal approchés (ce qui n'est pas le cas sur les HP)
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 : 6172
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 »

Bonne correction. Il faut donc additionner le pas FIX 7. Je conviens que tu l'avais annoncé et que ce n'est pas nécessaire pour ce défi, mais ça le serait pour d'autres projets.
Sur la 34C ou la 15C, cela peut même être géré par le registre I - ça ne tiendrait toutefois pas dans un MPO...
Je cherche à programmer quelque chose de plus complet avec les combinaisons et les arrangements pour HP-29E/C, c'est la raison de mon retour à ce vieux sujet (toujours vert !). Il faut d'ailleurs observer que ces résultats ne pourraient être utilisés tels quels dans les formules que nous avons vues au lycée.
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 : 3405
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 »

Sur les Hp-19C Hp-29C et Hp-29E il est possible de calculer tous les chiffres d'une factorielle jusqu'à au moins .475.

Il suffit pour cela d'utiliser les nombreux registres comme je le fais avec mon SHARP 1211 pour les mémoriser. Le registre I (ou 0) servant alors d'index pour les multiplications à chaque boucle et reportant les retenues.
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 : 6172
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 »

Voici une première mouture HP-29C/E bien lourdingue (42 pas, 5 registres) pour calculer :

- les permutations (ou factorielles) ->GSB 1 ;
- les combinaisons ->GSB 2 ;
- les arrangements ->GSB 3,

à partir des fameuses formules

C (n,p) = n!/[(n-p)!*p!]
et
A (n,p) = n!/(n-p)!.

Code : Tout sélectionner

LBL 3
-
STO 2
Last x
+
GSB 1
STO 3
RCL 2
GSB 1
RCL 3
x><y
/
RTN
LBL 2
STO 3
x><y
STO 4
x><y
-
GSB 1
STO 2
RCL 4
GSB 1
STO 4
RCL 3
GSB 1
STO*2
RCL 4
RCL 2
/
RTN
LBL 1
STO 0
1
STO 1
LBL 0
RCL 0
STO*1
DSZ
GTO 0
RCL 1
RTN
Exemples :
Combien de tirages de trois cartes différentes dans un jeu de 52 ?
52
ENTER
3
GSB 2

Réponse après 17 secondes (!) sur la 29E ou 49 secondes (!!) sur la 29C (en fait la 29E en mode Basse Vitesse) : 22 100. En comparaison, la 15C (pas la Limited Edition !) qui possède la fonction Cy,x trouve cette solution en... une seconde.

Si on a au départ 8 chevaux, combien y a-t-il de possibilités de tiercés ?

8
ENTER
3
GSB 3
Réponse (bcp plus rapide) : 336.

Ce qui me surprend, c'est surtout que le calcul de la combinaison nécessite le calcul de 52! (8.0658175*10^67), de 49! (6.08288186*10^62) et que la division de l'un par l'autre (lui-même multiplié par p!, soit 6) donne exactement le bon résultat. Comme dirait gege, "Moi pas comprendre."

Il doit y avoir de nombreux moyens d'améliorer ce programme, à commencer par l'algorithme qui ne tient pas compte ici des multiplications redondantes de factorielles.
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 : 3405
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 »

Marge a écrit : 09 janv. 2020 00:32[…] Il faut donc additionner le pas FIX 7. Je conviens que tu l'avais annoncé et que ce n'est pas nécessaire pour ce défi, mais ça le serait pour d'autres projets.[…]
Je suis tout à fait d'accord, je n'ai pas rappelé ce point crucial dans mon second post. Grave erreur qui peut occasionner bien des soucis et qui fait que je n'ai pas immédiatement compris d'où venait l'écart que nous signalait Marge en utilisant mon code pour estimer la factorielle de 12 !

Je corrige donc immédiatement ma coupable omission et publie ci-dessous la version corrigée :
MPO 32 - HP-25 n FACT  with correctness cheat FIX7.gif
MPO 32 - HP-25 n FACT with correctness cheat FIX7.gif (67.5 Kio) Vu 10914 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.
Répondre

Retourner vers « Tous les Pockets »