Idée de programme : dessin de nombres

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
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Idée de programme : dessin de nombres

Message par gege »

Marcus von Cube a écrit :Mémoire R n'est jamais modifié. Il manque une instruction comme...
Exact, j'ai oublié une ligne :

Code : Tout sélectionner

R+List 2[J]->Z
Int(Z/M)->R
Z-MR->List 2[J]:Next
Mea culpa

Sympa ça :

Code : Tout sélectionner

StoPic "Pics\Fib"
Gilles59 a écrit :Gege, juste pour l'anecdote. En remplaçant 1 par 'n' en (2,1) dans la matrice, FIBO(400) donne :

200.n^200 +1333300.n^199+ 2666333 etc...
Euh c'est quoi l'intérêt de cette formule ???

G.E. perplexe
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

gege a écrit :
Marcus von Cube a écrit :Mémoire R n'est jamais modifié. Il manque une instruction comme...
Exact, j'ai oublié une ligne :

Code : Tout sélectionner

R+List 2[J]->Z
Int(Z/M)->R
Z-MR->List 2[J]:Next
Mea culpa

Sympa ça :

Code : Tout sélectionner

StoPic "Pics\Fib"
Gilles59 a écrit :Gege, juste pour l'anecdote. En remplaçant 1 par 'n' en (2,1) dans la matrice, FIBO(400) donne :

200.n^200 +1333300.n^199+ 2666333 etc...
Euh c'est quoi l'intérêt de cette formule ???

G.E. perplexe
Aucun si ce n'est voir comment la HP50 calcule et que c'est tres lourd lol ...
Je laisse tomber cette façon de faire et refais le prog sans (voir mon post précédent :
1 1
1. 400. START DUP2 + NEXT

va environ 400 fois plus vite pour calculer toute la série et on comprend ce qui se passe derrière ...
)

Ca rejoint ce qu'on disait sur la complexité cachée. Dans la cas présent une usine à gaz !
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Idée de programme : dessin de nombres

Message par Marcus von Cube »

gege a écrit : Sympa ça :

Code : Tout sélectionner

StoPic "Pics\Fib"
Mais le fichier qu'on trouve quand la calculatrice est branché sur le PC ne sert à rien. Le format est de type g3p. J'ai pas essayé de le analyser.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

Version simplifiée et commentée et calcul du temps :

Code : Tout sélectionner

« "" ""   -> Ogr Zero                    @ Ogr : Objet graphique - Zero : Ligne remplie de 0
  « TIME                                 @ Heure de lancement du prog
    1. 70. START "0" 'Zero' STO+ NEXT    @ Génére ligne de pixels vides. 1 quartet = 4 pixels. 70 quartets = 280 pixels
    
    1 1                                  @ Les 2 premiers nombres de Fibonacci
    1. 398. START DUP2 + NEXT            @ Génére les 400 premiers nbres de Fibonacci sur la pile en ~ 1 sec 
    
    1. 400. START                        @ la boucle dépile tout et génère le code hexa pour affichage binaire.
      "" SWAP                            @ Initialise graphique de la ligne 
      WHILE 16 IDIV2 DUP2 OR REPEAT      @ Conversion hexadécaimale au format graph GROB                
        "084C2A6E195D3B7F"  SWAP 1 +     @  nécessaire car le premier pixel d'un octet est le bit de
        DUP SUB ROT + SWAP               @  poids fort de l'octet : 1000000b pour afficher le premier pixel
      END                                @  et pas 00000001b comme on pourait le croire
     DROP2 
     Zero SWAP DUP SIZE 70.              @ Calcul la longueur de la ligne à afficher 
     SWAP - 1. + SWAP REPL               @  et rempli le début avec des 0
     'Ogr' STO+                          @ Concaténe dans l'objet graphique
    NEXT
    
    "GROB 280 400 " Ogr +  OBJ->         @ Génére l'objet graphique sous forme de chaine de caractères
    
    TIME SWAP                            @ Heure de fin et place le graph au niveau 1 de la pile
  »
»
La génération des 400 nombres de Fibonnaci est très rapide. (~1sec)
Par contre la génération du fichier graphique est bien plus longue !

Le prog génére la totalité du graphe binaire pour FIB(1) à FIB(400) soit un graph de de 280x400 en 22 minutes (avec l'émulateur HP50/ PC 1 minute :O - il faut savoir que le processeur de la 50 est bridée de façon logicielle pour économiser les piles;) Comme la calcu est alimentée par le port USB quand connectée au PC et n'utilise pas les piles HP pourrait prévoir un mode 'turbo' ;)

Image transférée sur PC
Image

Sur l'écran de la HP (on scrolle avec les flêches) :
Image

PS :Marcus, quelles est la résolution de la Prizm? Ca a l'air bien précis !La résolution (131x80) est pour moi le point faible de la 50G.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
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: Idée de programme : dessin de nombres

Message par gege »

Bonjour,
Avec l'astuce des pixels j'obtiens le graphe de 1 à 127 en 2 minute 10 secondes sur la Graph 85.
J'ai piqué l'idée de Marcus de faire le graphe horizontalement, on voit bien mieux.
Le programme ici ce soir, 144 octets tout mouillé et 5 variables (pas de liste) !!
Cool - à plusieurs on trouve des trucs.
G.E.
Avatar du membre
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Idée de programme : dessin de nombres

Message par Marcus von Cube »

J'ai préparé trois versions pour fx-7400G, CFX-9850G et Prizm. Les résolutions utilisables sont :
7400 : 79x47
9850 : 127x63
Prizm : 379 x 187 (l'écran est plus gros que cela !)

Les logicielles
Les textes sont tous fabriqués sur la Prizm avec SAVE-AS et transféré par USB. Les versions pour la CFX-9850G et pour la fx-7400G sont écrites sur les propres machines et transféré par cable ronde vers la Prizm. Vous trouvez tout ça complet avec des fichiers *.cat pour FA-123/FA-124 ici.

Prizm :

Code : Tout sélectionner

'ProgramMode:RUN
32->P
ClrGraph:AxesOff:LabelOff
2^P->M:187 Int/ P+1->Q
Q->Dim List 1
Q->Dim List 2
1->List 2[1]
"DEBUT"?->N
For 1->I To N+378
List 1+List 2->List 3
List 2->List 1
List 3->List 2
0->R:For 1->J To Q
List 2[J]+R->Z
Z Int/ M->R
Z-MR->List 2[J]:Next
If N<=I:Then 
For 1->J To Q
List 2[J]->Z:I+1-N->C
PJ->K:K->L:K>187=>187->L
For K-P+1->R To L
Z/2->Z
If 0<Frac Z
Then Black PxlOn R,C
'_Else __Yellow __PxlOn _R,C
IfEnd
Int Z->Z:
Z=0=>Break
Next:Next
IfEnd
Next
StoPict "Pict\Fib"
Image

CFX-9850G :

Code : Tout sélectionner

'ProgramMode:RUN
32->P
ClrGraph:AxesOff:LabelOff
2^P->M:64/P->Q
Q->Dim List 1
Q->Dim List 2
1->List 2[1]
"DEBUT"?->N
For 1->I To N+126
List 1+List 2->List 3
List 2->List 1
List 3->List 2
0->R:For 1->J To Q
List 2[J]+R->Z
Int (Z/M)->R
Z-MR->List 2[J]:Next
If N<=I
Then For 1->J To Q
List 2[J]->Z:I+1-N->C
PJ->K:K->L:K>63=>63->L
For K-P+1->R To L
Z/2->Z
0<Frac Z=>PxlOn R,C
Int Z->Z
Z=0=>Break
Next:Next
IfEnd
Next
StoPict 1
Image

Même programme sur Prizm :
Image

fx-7400G :

Code : Tout sélectionner

'ProgramMode:RUN
24->P
ClrGraph
ViewWindow 1,79,0,47,1,0
2^P->M:2->Q
{0,0}->List 1
{1,0}->List 2
"DEBUT"?->N
For 1->I To N+78
List 1+List 2->List 3
List 2->List 1
List 3->List 2
0->R:For 1->J To Q
List 2[J]+R->Z
Int (Z/M)->R
Z-MR->List 2[J]:Next
If N<=I
Then For 1->J To Q
List 2[J]->Z:I+1-N->C
PJ->K:K->L:K>47=>47->L
For K-P+1->R To L
Z/2->Z
0<Frac Z=>Plot C,R
Int Z->Z
Z=0=>Break
Next:Next
IfEnd
Next
Image

Même programme sur Prizm :
Image

La différence entre les images de la Prizm vient du fait que la fx-7400G ne connaît pas PxlOn. J'ai échangé PxlOn avec Plot qui applique un facteur calculé de paramètres du ViewWindow.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

gege a écrit :Bonjour,
Avec l'astuce des pixels j'obtiens le graphe de 1 à 127 en 2 minute 10 secondes sur la Graph 85.
J'ai piqué l'idée de Marcus de faire le graphe horizontalement, on voit bien mieux.
Le programme ici ce soir, 144 octets tout mouillé et 5 variables (pas de liste) !!
Cool - à plusieurs on trouve des trucs.
G.E.
Intéressant! mais j'ai pas trop compris l'"astuce des pixels" :O

Pour 1 à 127, 2mn01 sec sur la 50G avec le prog d'au dessus (298,5 octets) .99% du temps est le recodage en hexa de nombres entiers longs . En fait c'est la division d'entiers "précision infinis" qui est tres lente (alors que l'addition est étonnamment rapide)... Convertir FIBO(400) en hexadécimal prends plus de 6 sec :O

Et avec des nombre entier des plus de 84 chiffres ca fait un paquet de division pour transformer en hexa .. Je me demande si çà n'irait pas plus vite en divisant par 2 en boucle (afficher un pixel si impair, rien si pair...). Ca ferait un prog tres concis en tout cas...

PS (180,5 octets - Pour l'anecdote si je remplace les entiers binaires par des entiers, la taille du prog passe à 137 octets.- du au fait je suppose que les entiers binaires sont codés en 64 bits ):

Code : Tout sélectionner

«
 1 1                                 
 1. 131. START DUP2 + NEXT               
 #0d #130d FOR i 
   #0d 'j' STO                     
   WHILE 2 IDIV2 DUP2 OR REPEAT
    IF THEN i j 2 ->LIST PIXON END
    #1d 'j' STO+
   END
   DROP2
 NEXT
»
Image

Concis mais .... 10mn30s !
Modifié en dernier par Gilles59 le 30 déc. 2010 17:56, modifié 3 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
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: Idée de programme : dessin de nombres

Message par gege »

Hello,
2 minutes c'est bien ! J'avais l'impression que c'était beaucoup plus d'après tes dires.
L'astuce des pixels est ce qu'indiquait C.ret :
C.ret a écrit :En effet, la relation de récurence F(n)=F(n-1) + F(n-2) signifie que chaque ligne du graphique peut être générée à partir des deux lignes précèdentes. Et oui.
Donc on ne stocke rien, on allume des pixels et pour savoir lesquels doivent l'être, on teste ceux des deux lignes au-dessus.
Programme :

Code : Tout sélectionner

ClrGraph:AxesOff
PxlOn 1,1:PxlOn 1,2
For 3->I To 127
Min({63,.7I})->Q
0->R:For 1->J To Q
R+PxlTest(J,I-2)+PxlTest(J,I-1)->P:P/2->P
0<Frac P=>PxlOn J,I
Int P->R:Next
Next:StoPic 14
144 octets.
Voilà,
G.E.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

gege a écrit :Hello,
2 minutes c'est bien ! J'avais l'impression que c'était beaucoup plus d'après tes dires.
G.E.
En fait, les temps explosent pour les "grandes tailles" de dessin à cause de la conversion hexadécimale qui nécessite de diviser des entiers long et visiblement c'est (relativement) très lent sur HP49/50. Je suppose que c'est du à la façon dont les entiers 'précision infini' sont codé dans la machine (par contre les sommes sont très très rapide).

Je vais regarder ton algo de plus près ;)
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

gege a écrit :Hello,
Programme :

Code : Tout sélectionner

ClrGraph:AxesOff
PxlOn 1,1:PxlOn 1,2
For 3->I To 127
Min({63,.7I})->Q
0->R:For 1->J To Q
R+PxlTest(J,I-2)+PxlTest(J,I-1)->P:P/2->P
0<Frac P=>PxlOn J,I
Int P->R:Next
Next:StoPic 14
144 octets.
Voilà,
G.E.
Gege, Je converti tel quel. C'est quoi le .7I dans la fonction Min ? 0.7 * i ?
Min comme minimum je suppose...
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Idée de programme : dessin de nombres

Message par Marcus von Cube »

Gilles59 a écrit : C'est quoi le .7I dans la fonction Min ? 0.7 * i ?
Min comme minimum je suppose...
Min() c'est minimum d'une liste. Le facteur .7 est une "chiffre magique". C'est l'inclinaison de la droite qui limite le graphe.

J'ai porté le programme sur la Prizm:

Code : Tout sélectionner

'ProgramMode:RUN
ClrGraph:AxesOff
Black PxlOn 1,1:Black PxlOn 1,2
For 3->I To 379
Min({187,.7I})->Q
0->R:For 1->J To Q
(R+PxlTest(J,I-2)+PxlTest(J,I-1))/2->P
0<Frac P=>Black PxlOn J,I
Int P->R:Next
Next
StoPict "Pict\Fib2"
Il est plus compact mais de la même lenteur que la version précédente (~1h50mn).

Il faut qu'on dessine en noir pour que PxlTest ne retourne que 0 et 1. J'ai essayé avec une autre couleur : le numéro de la couleur est retourné par PxlTest(), une chiffre entre 0 et 7.

Modification pour dessiner en une autre couleur:

Code : Tout sélectionner

(R+(0<PxlTest(J,I-2))+(0<PxlTest(J,I-1)))/2->P
P.S.: La fx-9860G Slim (OS 2.0) est beaucoup plus vite : 2mn50s our 127x63 vers ~12mn sur la Prizm pour la même portion du graphe. C'est PxlOn qui est lente sur la Prizm. :( J'attends la prochaine version du OS. ;)
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

Même algo version HP50

Code : Tout sélectionner

«
 TIME
 ERASE {#0d,#0d} PVIEW
 {#1d,#1d} PIXON 
 {#2d,#1d} PIXON 

 #3d #127d FOR i
  #0d
   i .7 *  
   #1d SWAP FOR j
     i #2d - j 2 ->LIST PIX? i #1d - j 2 ->LIST PIX? + + DUP
     IF #1d AND #0d <> THEN  i j 2 ->LIST  PIXON END
     ASR 
  NEXT
  DROP
NEXT
TIME
»
Puisque j'utilise des entiers cette fois, j'utilise ASR (décalge logique des bit) pour division entière par deux et je teste le bit de poids faible pour vérifier la parité.

Le {#0d,#0d} PVIEW permet de voir le graphique se dessiner.
Ca met 4mn30 (en assembleur, ca devrait mettre qqe chose comme 0 sec lol)

Un truc agaçant en RPL c'est cette curieuse idée de HP de devoir passer par une liste pour afficher ou tester un pixel ... x y PIXON ou x y PIX? aurait été plus pratique (et certainement plus rapide)
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Idée de programme : dessin de nombres

Message par Marcus von Cube »

Code : Tout sélectionner

IF #1d AND #0d ‹ THEN
Cela ne marche pas. J'ai le changé comme ça :

Code : Tout sélectionner

IF #1d AND #1d == THEN
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Idée de programme : dessin de nombres

Message par Gilles59 »

Marcus von Cube a écrit :

Code : Tout sélectionner

IF #1d AND #0d ‹ THEN
Cela ne marche pas. J'ai le changé comme ça :

Code : Tout sélectionner

IF #1d AND #1d == THEN
C'est le signe différent (un égal barré) en fait mais il n'existe pas sur PC et j'ai oublié de le corriger. J'ai modifié au dessus
Avec == tu dois l'avoir en inversion vidéo par rapport à moi ;) Comme je transfère avec l'émulateur et fait un copier-coller,je dois faire les modifs en collant ici
J'utilise HPUserEdit v5 qui est vraiment excellent et a un lien direct avec l'émulateur HP50G.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
Marcus von Cube
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 914
Enregistré le : 20 avr. 2006 13:48
Localisation : Wehrheim, Allemagne
Contact :

Re: Idée de programme : dessin de nombres

Message par Marcus von Cube »

Gilles59 a écrit : Avec == tu dois l'avoir en inversion vidéo par rapport à moi ;)
Non, parce-que j'ai aussi changé le chiffre : #0d =/= contre #1d ==
Gilles59 a écrit :J'utilise HPUserEdit v5 qui est vraiment excellent et a un lien direct avec l'émulateur HP50G.
C'est interessant. :)

Ma version finale, testé sur HP 48gii et HP 50g :

Code : Tout sélectionner

%%HP: T(3)A(R)F(.);
\<< 
  TIME 
  PICT SIZE 
  #1d - SWAP #1d - 
  \-> t h w
  \<<
    ERASE 
    { #0d #0d } PVIEW 
    { #0d #0d } PIXON 
    { #1d #0d } PIXON 
    #2d w
    FOR i 
      #0d
      #0d 
      i B\->R .7 * 
      h B\->R 
      MIN R\->B  
      FOR j 
        i #2d - j 2. \->LIST PIX? + 
        i #1d - j 2. \->LIST PIX? + 
        IF DUP #1d AND #1d == THEN
          i j 2. \->LIST PIXON
        END 
        ASR
      NEXT 
      DROP
    NEXT 
    PICT RCL 'FIBPICT' STO
    TIME t - 
    \->HMS 100 * 2 RND
    PICTURE
  \>>
\>>
Répondre

Retourner vers « Tous les Pockets »