Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachions)

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

Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2933
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachions)

Message par zpalm »

Sommaire des MPO

Suite aux résultats du sondage, voici donc le fil pour discuter du MPO de la Gazette n°2 sur les batrachions.
Il s'agit de calculer de la manière la plus efficace les termes de la suite :
  • un = un-un-1 + 1 avec u1=1 et u2=1
Pour commencer voici la solution proposée par dprtl dans le fil de la gazette n°2:
dprtl a écrit :Je ne savais pas trop où répondre, alors, en attendant un sujet dédié, voici ma proposition de réponse au MPO de la Gazette n°2, Spécial Noël "Les Batrachions".

Programme pour WP-34S, en 18 pas :

Code : Tout sélectionner

001 STO 00
002 1
003 STO 01
004 0
005 STO 02
006 LBL 01
007 DSE 00
008 GTO 02
009 RCL 02
010 RTN
011 LBL 02
012 DSE 01
013 GTO 01
014 1
015 STO+ 02
016 RCL 02
017 STO 01
018 GTO 01
Il calcule u(9999) = 141 en 9 secondes environ. Mais je pense que l'on peut encore largement mieux faire ! :)
Avatar du membre
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par dprtl »

Il y avait une petite ambiguïté dans l'énoncé initial : u1 valait-il 1, ou bien 0 (comme c'était indiqué dans le code Basic pour PB-700) ? Cela dit, comme cela ne change rien, apparemment, j'avais choisi u1 = 0 au départ... et puis, finalement, le programme ci-dessous retourne u1 = 1 :-)

Pour WP-34S, voici ma dernière proposition en 15 pas qui calcule U9999 = 141 instantanément :

Code : Tout sélectionner

001 STO 00
002 0   
003 ENTER   
004 1     
005 LBL 01
006 x<>Y    
007 ENTER  
008 1    
009 +    
010 ENTER  
011 x<>Z   
012 +      
013 X<?00    
014 GTO 01 
015 DROP
Par contre, pour calculer U999999999 = 44721, ça prend environ 1 min 42.

Le même algorithme, pour FX-4000P ou FX-7500G, est bien plus lisible, mais consomme 36 pas :

Code : Tout sélectionner

?->N:1->A:0->B:Lbl 1:B+1->B:A+B->A:A<N=>Goto 1:B&
Caractères spéciaux :
  • '->' correspond à l'affectation d'une variable
    '=>' est l'implication ([shift] [7] sur FX-4000P)
    '&' est le triangle orange ([shift] [:] sur FX-4000P)
Modifié en dernier par dprtl le 03 janv. 2014 22:23, modifié 1 fois.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par C.Ret »

Sympa de mettre le code en 'illisible' pour éviter de spoiler les lecteur de ce fils. Je vais faire de même.

Voici ma première proposition , à utiliser en mode DEF sur les SHARP Pokect Computer (tous modèles).

1 " " AREAD N:PRINT N,INT (1.46061*√N):END

L'indice n étant affiché, on presse sur [shift][SPC] pour obtenir le terme de la suite correspondant. Ou du moins une approximation qui n'est ni trop fausse, ni trop longue à programmer. Mais pas toujours juste :( :|

On notera qu'avec ce code, u_1=0 et qu'il existe même une extrapolation donnant u_0=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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2933
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par zpalm »

Bonjour C.Ret, ta formule est intéressante mais c'est effectivement une approximation qui ne donne pas le bon résultat dans tous les cas:
u5051=100 :arrow: OK
u5052 = 100 :arrow: ce devrait être 101
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par gege »

Bonjour,
Il existe une formule directe en effet, mais on peut aussi utiliser la récurrence pour faire (peut-être) plus court...
G.E.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par C.Ret »

Très juste, ma formule n'est juste que dans 98.5% des cas. Et le principal reproche que l'on peut lui faire est de ne pas indiquer quand elle est fausse.

Seul avantage, elle est fort simple.

Pour ce qui est de la récurrence, un HP-28S/C le fait directement :

Code : Tout sélectionner

« -> n 'IFTE(n<4,n-1,U(n-U(n-1))+1' » 'U' STO
Et là c'est 100% des cas la bonne réponse. (Enfin j'espère, à vous de vérifier :twisted: )
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
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par dprtl »

J'ai trouvé une formule intéressante :

Code : Tout sélectionner

f(x) = (x^2 + x + 4)/2
Lorsque x prend des valeurs entières : 0, 1, 2, 3, 4, 5, 6, 7, f(x) donne la suite 2, 3, 5, 8, 12, 17, 23, 30...

Ces valeurs correspondent aux "sauts" de la suite Un. Mon problème, c'est que je ne sais pas quoi en faire pour le moment !
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5266
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par bernouilli92 »

La formule utilisant la récurrence sur hp 28 est la plus élégante mais aussi la moins rapide.
Testée sur hp48sx, voici les temps de réponse :
U(10) : 1.4 secondes
U(20) : 23 secondes
U(30) : 235 secondes
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2933
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par zpalm »

J'ai un algorithme qui donne la réponse exacte immédiatement quelque soit le nombre entré: 16 pas sur WP 34S, 21 pas sur 41C et 64 pas sur Casio Pro FX-1.

En m'inspirant de la formule de C.Ret j'ai trouvé une formule directe qui donne un résultat exact pour tous les nombres jusqu'à 999.999.999, au-delà quand on multiple par un facteur 10 on tombe sur les erreurs d'arrondi et le résultat est faux pour certains nombres. Testé sur 41C en 12 pas.

U999.961.561 = 44720
U999.961.562 = 44721
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par C.Ret »

bernouilli92 a écrit :La formule utilisant la récurrence sur hp 28 est la plus élégante mais aussi la moins rapide.
Testée sur hp48sx, voici les temps de réponse :
U(10) : 1.4 secondes
U(20) : 23 secondes
U(30) : 235 secondes
Comptez le double de temps sur un HP-28S/C !

C'est le problème avec cette façon de programmer, simple , concise, élégante, directement recopiée de la page de cours ou du tableau noir (j'ai souvent utiliser cette façon de faire pendant mes longues études).

Dans certains cas on profite même des capacités analytiques et du calcul formel de la machine (très utile à défaut de réel CAS)

Mais le souci majeur est que les calculs sont longs car très très très nombreux.
Pour calculer U(30), il faut évaluer U(29) et U(23) qui eux-mêmes nécessitent d'une part d'évaluer U(28) et U(22) ainsi que U(22) et U(17) ... Et par exemple U(22) est bel et bien évalué deux fois de façons indépendantes. Et donc à chaque pas on multiplie par quatre le nombre d'évaluations...

Quand on réfléchit, on se rend compte que cela est possible grâce à la pharaonique capacité mémoire de ces calculettes et qu'elles calculent vite en fait. Mais beaucoup ...

Pour remédier à cela, le plus commun est d'utiliser la mémoïsation; on sauvegarde au fur et à mesure des calculs les termes de la suite dans une liste en stockée en mémoire (un vecteur dans notre cas car plus économique justement)


Il y a donc deux objets dans le menu USER, la fonction U calculant les termes de la suite u(n) et le tableau de donnée UDAT qui contient les valeurs u(n) déjà rencontrée.

Code : Tout sélectionner

[ 0 1 ] 'UDAT' STO          @ Initialise le vecteur de mémoïsation

« -> n                      @ Prend l'indice 
  « IFERR
      UDAT n GET            @ Tente de retrouver sa valeur dans le vecteur mémoïsé
    THEN
       DROP2                @ En cas d'échec efface de la pile les deux arguments 
 
       n n 1 - U - U 1 +    @ Calcule u(n)=u(n-u(n-1))+1 par récurrence
                            @ Cette étape modifie éventuellement le contenu de UDAT

       UDAT {n} RDM         @ Redimensionne le vecteur de mémoïsation
       { n } 3 PICK PUT     @ Mémoïse la nouvelle valeur
       'UDAT' STO           @ Et sauvegarde dans UDAT
    END
  »
»
'U' STO
C'est bien plus rapide sauf lors du premier calcul (par exemple si l'on demande tout de suite U(3000).
Autre écueil, il faut s'attendre à un dépassement de capacité mémoire. Le nombre de valeur ne pouvant pas être infinie.

Temps Initiaux* sur un HP-28S:
U(10) 4s U(20) 8s U(30) 16s U(100) 1min 37s U(300) ~5min

Mais U(300) n'est calculé qu'en 5min40s après avoir calculé U(100)
et U(310) est calculé en 7s après avoir calculé U(300).

* en remettant UDAT à sa valeur initiale [ 0 1 ]
Les temps de calcul de tout u(n) avec n inférieur ou égal au plus grand nombre mémorisé sont tous identiques et largement inférieur à 0,3 s


P.S.: Le DROP2 n'est nécessaire que si le mode LASTARG est actif. Dans le cas contraire il faut s'en passer.


J'suis pas prêt de calculer U(5051) ou U(5052) avec cette méthode.
M'reste à chercher une formule ou une méthode brute...
Modifié en dernier par C.Ret le 03 juil. 2021 16:08, 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
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par dprtl »

bernouilli92 a écrit :La formule utilisant la récurrence sur hp 28 est la plus élégante
C.Ret a écrit :cette façon de programmer, simple, concis
[...]
cela est possible grâce à la pharaonique capacité mémoire de ces calculettes, et qu'elles calculent vite
Subjectivité ou relativisme ? Les adjectifs ci-dessus pourraient faire sourire ! Cela dit, comme je n'ai toujours pas la formule optimale directe, ça m'encourage à dévoiler en clair mes propositions intermédiaires :-)
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3419
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par C.Ret »

dprtl a écrit :[...]Subjectivité ou relativisme ? Les adjectifs ci-dessus pourraient faire sourire !
Les deux mon général.
Cela dit, comme je n'ai toujours pas la formule optimale directe, ça m'encourage à dévoiler en clair mes propositions intermédiaires :-)
J'en suis au même point. J'aimerais trouver un moyen de calculer U(99961561) pour l'instant je n'ai que des méthodes approximatives et itératives lentes !!
Modifié en dernier par C.Ret le 03 juil. 2021 16:09, 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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2933
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par zpalm »

@ledudu: j'ai regardé un peu ton programme sur la Pro FX-1. C'est le même algorithme que le mien mais je pense qu'il y a deux petits différences qui expliquent que ton programme ne marche pas pour tous les cas. Tout tourne autour du test.
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par cgh »

zpalm a écrit :@ledudu: j'ai regardé un peu ton programme sur la Pro FX-1. C'est le même algorithme que le mien mais je pense qu'il y a deux petits différences qui expliquent que ton programme ne marche pas pour tous les cas. Tout tourne autour du test.
Un programme pour FX-1 Pro :slime: :slime: Les "grands ancetres" se reveillent ! J'espere que vous allez le publier...
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5645
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: Misez p'tit, Optimisez - N°51 (Gazette N°2-Les batrachio

Message par ledudu »

Salut,
@cgh,
cgh a écrit :Un programme pour FX-1 Pro :slime: :slime: Les "grands ancetres" se reveillent ! J'espere que vous allez le publier...
J'en ai publié un hier :Sujet: Misez p'tit, Optimisez - N°6

Celui-ci, on va le publier, c'est sûr mais il dévoile la fonction directe qui pour l'instant doit rester mystérieuse... 8)

@zpalm
zpalm a écrit :Tout tourne autour du test.
Merci, j'avais fini par croire que c'était une impasse...
Répondre

Retourner vers « Tous les Pockets »