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
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3312
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 15 janv. 2013 15:23

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 de l’utilisateur
bkg2018
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 359
Inscription : 30 mai 2012 16:57

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

Message par bkg2018 » 15 janv. 2013 15:49

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 de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 16:41

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 de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 17:21

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 de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6882
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

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

Message par badaze » 15 janv. 2013 17:58

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 de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2024
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 » 15 janv. 2013 18:04

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 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803+ sd2iec. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator |HP-15C | CASIO fx-602p + FA-1. .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3312
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 15 janv. 2013 18:07

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 de l’utilisateur
bernouilli92
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3312
Inscription : 21 nov. 2012 14:03
Localisation : Ile de France

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

Message par bernouilli92 » 15 janv. 2013 18:07

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 de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 18:42

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.
Dernière édition par zpalm le 15 janv. 2013 18:58, édité 1 fois.

Avatar de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6882
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

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

Message par badaze » 15 janv. 2013 18:49

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 de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3017
Inscription : 06 sept. 2011 14:57
Localisation : Normandie / Antwerpen

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

Message par Hobiecat » 15 janv. 2013 19:29

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 de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 450
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

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

Message par babaorhum » 15 janv. 2013 19:32

(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,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Avatar de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2499
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 15 janv. 2013 19:41

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 de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 450
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

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

Message par babaorhum » 15 janv. 2013 19:54

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,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Avatar de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3017
Inscription : 06 sept. 2011 14:57
Localisation : Normandie / Antwerpen

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

Message par Hobiecat » 15 janv. 2013 20:09

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

Revenir vers « Tous les Pockets »