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
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5226
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

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

Message par bernouilli92 »

Encore plus court, bon d'accord c'est un peu de la triche ;-)

pour HP48S(X) seulement :

Code : Tout sélectionner

«
 # 1BB02h SYSEVAL
»
Et pour wp34s :

Code : Tout sélectionner

000 LBL A
001 1
002 +
003 Г
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Enregistré le : 30 mai 2012 16:57

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

Message par bkg2018 »

En BASIC:

1 INPUT N:F=1:FOR I=2 TO N:F=F*I:NEXT:PRINT F

Arf ... C'est chiant.
HP : 67 25 34C 15C 41CX 48S* 48SX 48GX 35S* WP34S* 39gII*
TI : SR52 57 58C* 59 Programmer 66 74S 65
Sharp : PC 1245 1251* 1262 G-850S G-850V
Canon : X-07* F-800P*
Casio : CG-8 SF5300E*
*: persos d'époque
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

bernouilli92 a écrit :Encore plus court, bon d'accord c'est un peu de la triche ;-)

Et pour wp34s :

Code : Tout sélectionner

000 LBL A
001 1
002 +
003 Г
encore un peu plus court, et valable aussi pour les HP-11C et 15C :wink:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 Py,x
04 RTN
Donne bien 0!=1
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

bkg2018 a écrit :Sur TI57 avec la contrainte 0!=1 et une utilisation sans préstockage dans les registres je n'ai pas grand chose de dément...

00 Sto 0
01 1
02 Sto 1
03 Lbl 0
04 Inv Dsz
05 Gto 1
06 Rcl 0
07 Prd 1
08 Gto 0
09 Lbl 1
10 Rcl 1
11 R/S

On ne peut plus ruser avec RST à cause de l'initialisation de R0 et R1. Et on ne peut pas trop éviter deux labels : un pour boucler, un pour sortir de la boucle.
... 10 pas avec RST, sans label et avec 0!=1

Code : Tout sélectionner

00 2nd C.t
01 x=t?
02 1
03 STO 0
04 =
05 INV 2nd DSZ (Decrement & Skip if not Zero)
06 INV SBR     (RTN)
08 *
08 RCL 0
09 RST         (Reset program counter to first step = GTO 00)
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8384
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 »

bernouilli92 a écrit :Voici ma version en RPL :

Code : Tout sélectionner

« 1 OVER 1 - FOR I I * NEXT »
Et ma version pour hp41, mais elle ne fonctionne pas pour la valeur 0 (et inférieur) :

Code : Tout sélectionner

000 LBL FACTO
001 ENTER
002 LBL 00
003 1 
004 -
005 x=0?
006 GTO 01
007 *
008 LASTx
009 GTO 00
010 LBL 01
011 +

J'étais arrivé à la même conclusion.

Code : Tout sélectionner

01 ENTER
02 LBL 0
03 1
04 -
05 x=0
06 GTO 1
07 x
08 Last x
09 GTO 0
10 LBL 1
11 x><y
12 R/S
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 »

zpalm a écrit :encore un peu plus court, et valable aussi pour les HP-11C et 15C :wink:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 Py,x
04 RTN
Donne bien 0!=1
Très fort, ce qui me donne une idée pour du RPL en deux instructions :

« DUP PERM »

Mais c'est un peu de la gruge non ?

autant faire en une seule instruction :
« FACT »

:?: :?: :mrgreen:
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
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5226
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

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

Message par bernouilli92 »

zpalm a écrit :
bernouilli92 a écrit :Encore plus court, bon d'accord c'est un peu de la triche ;-)

Et pour wp34s :

Code : Tout sélectionner

000 LBL A
001 1
002 +
003 Г
encore un peu plus court, et valable aussi pour les HP-11C et 15C :wink:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 Py,x
04 RTN
Donne bien 0!=1
Excellente astuce, je ne sais pas si on peut considérer cela comme pareil qu'utiliser FACT. C'est en tout cas moins limite que l'utilisation de la fonction Gamma.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5226
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

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

Message par bernouilli92 »

C.Ret a écrit :
zpalm a écrit :encore un peu plus court, et valable aussi pour les HP-11C et 15C :wink:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 Py,x
04 RTN
Donne bien 0!=1
Très fort, ce qui me donne une idée pour du RPL en deux instructions :

« DUP PERM »

Mais c'est un peu de la gruge non ?

autant faire en une seule instruction :
« FACT »

:?: :?: :mrgreen:
C'est ce que fait mon code avec SYSEVAL ;-)
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

C.Ret a écrit :
zpalm a écrit :encore un peu plus court, et valable aussi pour les HP-11C et 15C :wink:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 Py,x
04 RTN
Donne bien 0!=1
Très fort, ce qui me donne une idée pour du RPL en deux instructions :

« DUP PERM »

Mais c'est un peu de la gruge non ?

autant faire en une seule instruction :
« FACT »

:?: :?: :mrgreen:
A priori Py,x n'utilise pas la fonction factorielle en interne pour des questions d'overflow (voir par ex. cette discussion sur le sujet). La solution devrait donc être conforme à l'énoncé du MPO par Mr Badaze.
Modifié en dernier par zpalm le 15 janv. 2013 17:58, modifié 1 fois.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8384
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 »

zpalm a écrit :
C.Ret a écrit :
zpalm a écrit :encore un peu plus court, et valable aussi pour les HP-11C et 15C :wink:

Code : Tout sélectionner

01 LBL A
02 ENTER
03 Py,x
04 RTN
Donne bien 0!=1
Très fort, ce qui me donne une idée pour du RPL en deux instructions :

« DUP PERM »

Mais c'est un peu de la gruge non ?

autant faire en une seule instruction :
« FACT »

:?: :?: :mrgreen:
A priori Py,x n'utilise pas la fonction factorielle en interne pour des questions d'overflow (voir par ex. cette discussion sur le sujet). La solution devrait donc être conforme à l'énoncé du MPO par Mr Badaze.
Va falloir faire valider les MPO par un cabinet d'avocats bientôt.
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
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

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

Message par Hobiecat »

zpalm a écrit :A priori Py,x n'utilise pas la fonction factorielle en interne pour des questions d'overflow (voir par ex. cette discussion sur le sujet). La solution devrait donc être conforme à l'énoncé du MPO par Mr Badaze.
Intéressante cette discussion du MOHPC...
badaze a écrit :Va falloir faire valider les MPO par un cabinet d'avocats bientôt.
Oui, mais non... sinon ça prendra 1 mois pour lancer un MPO ! :mrgreen:
PS : intéressant ce MPO au final... :wink:
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

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

Message par babaorhum »

(Mon premier "vrai" post sur le forum !)

En m'inspirant de la proposition de C.Ret, que je trouve fort élégante :
C.Ret a écrit :Pour les calculettes biologiques :

Code : Tout sélectionner

« IF DUP 1 >
  THEN
    DUP 1 - F! *
  END
»
'F!' STO
ou

Code : Tout sélectionner

« 1
  DUP ROT FOR f
    f *
  NEXT
»
'FCT!' STO
Et pour les machine moins biologiques:

Code : Tout sélectionner

                        n
001 LBL "FCT    
002 1             n     1
003 x<>Y          1     n
004 Lbl 00      prd     f
005 ST* Y     prd.f     f
006 DSE X     prd.f   f-1
007 GTO 00
                 n!     0
008 Rdn
009 END                n!

Code : Tout sélectionner

 1:"F"AREAD N:F=1:FOR I=1 TO N:F=FI:NEXT I:PRINT N,F:END
et en ajoutant juste un petit test au début, on obtient :

001 LBL "FCT
002 x=0?
003 1
004 1
005 x<>Y
006 Lbl 00
007 ST* Y
008 DSE X
009 GTO 00
010 Rdn

Et ca marche pour 0! =1

pour info 69!=1,7112245E98 en 10,5 s sur ma 41CX

Sur mon PC1500 la solution basic de base donne 1,11224527E98 en 2,7s

Sur mon HP75C la même solution donne 1,112245243E98 en 0,71s

Je constate un petit écart de précision entre mes 2 pocket basic et un 75C qui va presque 16 fois plus vite que la 41CX !!

et je suis au taquet des possibilités du HP75C avec 253!=5.17346099269E499 en ... 2,58 s

Je me coucherai moins bète ce soir .....

Et faudrait que je fasse un chrono sur ma 48GX que je n'ai pas sous la main ...

Voili
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm »

babaorhum a écrit :et en ajoutant juste un petit test au début, on obtient :

001 LBL "FCT
002 x=0?
003 1
004 1
005 x<>Y
006 Lbl 00
007 ST* Y
008 DSE X
009 GTO 00
010 Rdn

Et ca marche pour 0! =1
Si on place le test après le LBL 00 on gagne un pas:

Code : Tout sélectionner

001 LBL "FCT
002 1
003 x<>Y 
004 Lbl 00 
005 x#0?
006 ST* Y
007 DSE X
008 GTO 00
009 Rdn[
010 END
Avatar du membre
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 454
Enregistré le : 13 janv. 2013 19:44
Localisation : Marseille-est

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

Message par babaorhum »

Yes zpalm !

solution testée et approuvée 0!=1

Mais 69! est calculé en ... 13,5s (car le test est désormais dans la boucle) mais c'est hors cahier des charges !

@ bientôt
BaBaoRhum
HP J728,200LX,1000CX,75C,71B,48GX,42s,41CX,32E,32Sii,28S,22s,21,16C,11C
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74,92,95 ; Canon X-07 ; TANDY EC-4026 ; Wp34S
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

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

Message par Hobiecat »

Sur 15C, en respectant 0!=1 (et avec un registre, j'ai eu la flemme de ne faire que sur la pile...)

Code : Tout sélectionner

01 1
02 STO 0
03 +
04 LBL A
05 1
06 -
07 x=0?
08 GTO B
09 STO x 0
10 GTO A
11 LBL B
12 RCL 0
Répondre

Retourner vers « Tous les Pockets »