MPO 95 : Balayage des rationnels

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
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: MPO 95 : Balayage des rationnels

Message par C.Ret »

"C.Ret l'a fait", c'est vite dit. Il y a encore beaucoup d'erreurs et cela ne marche pas bien au-delà de 15 H (c'est à dire un niveau de plus que celui sur la capture précédente).

Comme ton code, je suis limité dans le nombre de caractère pour écrire chaque rationnel; prévoir une taille fixe a l'inconvénient d'agrandir considérablement l'arbre avec des espaces perdus. Ajuster l'arbre à la taille des rationnels imprimés rend le programme plus complexe et perd son auteur dans les méandres des routines et sous-routines.

Effectivement, pas besoin du tableau P(), la comparaison de A et B donne à chaque niveau l'information pour continuer vers l'autre branche sœur ou remonter vers le père.
Mon code actuel qui est pas beau fait l'inverse, j'ai créé un maximum de tableaux indexé par niveaux ou par rationnels pour mémoriser les coordonnées graphique (x,y), les longueurs des bras des H, la couleur, le numérateur, le dénominateur, la taille des cellules , etc... et tout cela est mal organisé.

Il faudrait que je fasse le tri surtout dans les sous-routines BASIC mal réparties ou mal définies. Sans compter que le passage de leurs arguments est une catastrophe ainsi que le gestion des soucis créés par les bord de page et les défilements de l'écran ...

Concernant le sens d'enroulement des rationnels, c'est un vrai sujet (et la source d'un énorme bug de mon programme). Il faut de je revois cela, ce qui va tout réglé (si j'arrive à m'organiser mieux) en laissant le choix à l'utilisateur enter différentes options d' "enroulement":
- rotation anti-horaire ou horaire à chaque nœud,
- orientation croissante ou décroissante vers la droite ou le haut,
- autre critère pour orienter les branches ???

Ensuite, il faut que je revois le fonctionnement du programme et envisage trois phases :
- premier aller-retour dans l'arbre afin de le dimensionner et éventuellement en précalculer chaque "cellule graphique"
- afficher ou imprimer une partie de l'arbre (en fonction de la taille disponible) en centrant sur une cellule
- permettre à l'utilisateur de se "balader" dans l'arbre en scrollant et redessinant l'arbre à l'écran au fur et à mesure.
- A tout moment,
.....utiliser le rationnel sous le curseur pour un "zoom in" (ou "zoom out" si à la racine du sous-arbre) qui consiste à recalculer M niveau à partir de la sélection
.....demander à afficher graphiquement les ancêtres en remontant si possible jusqu'à 1/1
.....sortir du programme pour aller prendre une bonne dose d'aspirine.

Tout un programme...
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.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

J'étais parti pour programmer un truc avec une batterie de tableaux censés représenter la surface de l'écran disponible, au centre duquel on place la première fraction, puis que l'on coupe en deux verticalement, puis horizontalement, avec à chaque fois le rationnel au centre, jusqu'à ce qu'il n'y ait plus de place pour écrire le nombre, ce qui aurait constitué la clause d'arrêt du parcours en profondeur de l'arbre.

Puis, en effectuant quelques travaux ménagers, je me suis dit que plutôt que m'embarquer dans des considérations qui appartiennent davantage à une procédure récursive dans un langage structuré (qui, au moins, gère la pile d'appels et les variables locales à ma place), je devais faire plus simple. J'ai pensé à un plateau de Scrabble (15x15), et aux bras de la représentation en H qui se divisent en 2 à chaque passage d'un niveau à l'autre.

Donc, on repart dans un parcours en profondeur où chaque rationnel est accompagné des coordonnées d'une case sur un plateau carré de taille 2^n-1 :

100 CLEAR:A=1:B=1:D=2
102 INPUT "NUMER";A,"DENOM";B,"NBR 'H' IMBRIQUES";D:D=2^D:X=D:Y=D:T=D:U=D
110 IF U=1; GOTO 120
112 B=B+A: IF T=U;T=T/2:X=X-T: GOTO 110
114 U=U/2:Y=Y-U: GOTO 110
120 PRINT STR$(X);",";STR$(Y);":";A;"/";B
130 IF U=1; GOTO 140
132 A=B+A: IF T=U;T=T/2:X=X+T: GOTO 110
134 U=U/2:Y=Y+U: GOTO 110
140 IF T=D; END
142 IF A>B; GOTO 150
144 B=B-A: IF T=U;Y=Y+U:U=U*2: GOTO 120
146 X=X+T:T=T*2: GOTO 120
150 A=A-B: If T=U;Y=Y-U:U=U*2: GOTO 140
152 X=X-T:T=T*2: GOTO 140

Il n'y a pas une instruction de trop ! T désigne la longueur du bras horizontal, U celle du vertical. Comme on sait s'orienter dans l'arbre, il suffit de suivre le chemin dans l'échiquier en partant du centre par des mouvements de T ou U cases, en décidant qu'on part à l'horizontale d'abord, et qu'on arrête quand le bras vertical a atteint son minimum.

Cet algorithme est toujours dans la même zone de programme de ma fx-880P, d'où les numéros de ligne élevés. J'ai découvert ce qui cloche dans le premier algo avec le parenthésage, je corrigerai ça.
Programmeur abscons.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

Comme je l'indiquais, je reprends mon programme posté le 5 septembre :

20 IF I=M;GOTO 30
22 PRINT MID$(O$,M-I,1);
24 B=A+B:I=I+1:P(I)=1
26 GOTO 20

La modification est mineure (inversion du PRINT et du passage au fils gauche) permet de permettre au 2ème paramètre du MID$ d'être identique à celui de la parenthèse fermante.

Le test de la ligne 20 a un double usage : servir de clause d'arrêt pour le parcours en profondeur, et empêcher que chaque fraction soit ornée d'une paire de crochets.

Pour limiter les consommations excessives d'aspirine, ces codes sont organisés de la façon suivante :
  • Instructions du début ;
  • Premier appel récursif "Fils gauche" ;
  • Instructions du milieu : traitement du nœud courant ;
  • Second appel récursif "Fils droit" ;
  • Instructions de fin ;
  • Retour vers le "père".
Dans mon type de BASIC, chacun de ces alinéas correspond à un numéro de ligne finissant par '0'. Les deux appels récursifs sont branchés sur les instructions du début, ce qui nécessite de mémoriser quelque part le niveau de profondeur du parcours et le numéro d'appel récursif dans une pile (tableau P()), pour permettre le branchement conditionnel du retour vers les instructions du milieu (si on vient du fils gauche) ou de fin. La qualité de l'arbre de Calkin-Wilf rend la pile caduque, mais pas l'indication de profondeur.

Le parenthésage fait typiquement partie des instructions de début et de fin, mais la parenthèse ouvrante (dans le programme corrigé ci-avant) a été logée là pour profiter d'un test bien opportun.

Dans le code de mon message d'hier, la longueur des "bras" réduite en horizontal, puis en vertical, puis augmentée dans l'ordre inverse, en analogie au parenthésage, sert d'évaluation de la profondeur de parcours. Graphiquement, c'est comme si on dessinait sans lever le crayon une ligne brisée fermée de caractère fractal.
Programmeur abscons.
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: MPO 95 : Balayage des rationnels

Message par C.Ret »

Le code proposé par jxano est si bien pensé, que je n'ai pu m'empêcher de le saisir sur mon Commodore.

Et comme il est bien fait et bien organisé, il m'a suffit de quelques ajouts pour avoir les graphiques en H et en couleur :
MPO 95 C128D jxnno Calkin Wilf H-tree 1 1 depth 2.gif
MPO 95 C128D jxnno Calkin Wilf H-tree 1 1 depth 2.gif (12.02 Kio) Vu 6874 fois
MPO 95 C128D jxnno Calkin Wilf H-tree 3 1 depth 3.gif
MPO 95 C128D jxnno Calkin Wilf H-tree 3 1 depth 3.gif (47.61 Kio) Vu 6874 fois

Avez-vous trouvé U(500) sur ce dernier écran ??




J'ai gardé l'organisation des n° de ligne et les GOTO. J'avais fait avec des DO ... LOOP mais il faut inverser l'ordre de certains block alors c'est pas aussi clair que c'est le code de notre ami.
MPO 95 C128D jxnno Calkin Wilf H-tree listing.gif
MPO 95 C128D jxnno Calkin Wilf H-tree listing.gif (74.88 Kio) Vu 6874 fois
J'ai, par contre, changé les variables T et U en respectivement H et V plus explicite (déplacements Horizontal et Vertical).

J'ai aussi ajouté S (scale en x car il faut 5 caractères par cellule ##/##) , S$ le symbole de séparation qui n'est un slash que si A=B et qui donne le sens dans lequel il faut tracer le trait de liaison. Les sous-programmes 160 à 166 servent à cela et ils sont déclenchés par le ON ... GOSUB de la ligne 122. L'instruction INSTR renvoyant l'index ad'hoc.

le symbole séparateur S$ est choisi à chaque changement de coordonnées X ou Y. Il y a une petite astuce aux lignes 144 et 146 car le sens dépend à la fois de la direction (H ou V) mais aussi du coté de la branche où A/B se trouve.
J'ai bien compris ce qu'explique jxano, je me sers des comparaisons H=V et A<B pour m'y retrouver.
Les variables A$ et B$ contiennent respectivement A et B débarrassés des espaces afin de faciliter l'affichage.
Les affichages sont réalisés à l'aide d'instructions CHAR qui permettent de positionner le texte affiché. L'instruction GRAPHIC CLR est nécessaire afin fermer un éventuel écran graphique bitmap sur l'affichage 40 col. N'oublions pas que les C128/C128D affichent simultanément leurs écrans 80 col et 40 col.

D'ailleurs le programme fonctionne aussi sur l'affichage 40 col. :
MPO 95 C128D jxnno Calkin Wilf H-tree 11 15 depth 2 40 col.gif
MPO 95 C128D jxnno Calkin Wilf H-tree 11 15 depth 2 40 col.gif (34.54 Kio) Vu 6874 fois
Mais c'est moins drôle, on est limité à deux niveaux au lieu de trois (40 vs 80 col.). Mais on peut facilement créer une fenêtre (ESC-T) et partager l'écran :
MPO 95 C128D jxnno Calkin Wilf H-tree 15 4 depth 2 40 col.gif
MPO 95 C128D jxnno Calkin Wilf H-tree 15 4 depth 2 40 col.gif (58.47 Kio) Vu 6866 fois
Belle astuce, mais il manque le rationnel au centre de la branche centrale ! Enfin ,j'espère que tout le monde sait de quel rationnel il s'agit !!
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.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

Voilà qui apporte du concret à un algorithme bien abstrait, qui se bornait à donner des numéros de case dans un quadrillage.

J'aime beaucoup les barres partant vers le haut ou le bas pour montrer que le bout d'arbre représenté fait partie d'un ensemble plus grand.

Je me suis essayé à produire un affichage de ce genre sur l'afficheur virtuel en 8 lignes de 32 colonnes de ma 880P, mais avec une séquence de sept instructions PRINT calés avec un croquis préparatoire, c'est moins aéré et moins joli, forcément.
Programmeur abscons.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

Je reviens sur le fameux arbre en H de la page 4 du présent fil, et que je reproduis dans un autre message ci-après.

La présentation de l'arbre sur l'image est un peu sèche. Il n'y a que les rationnels et les liens directs entre eux. Les valeurs en 1/n et n/1 semblent s'enrouler symétriquement à l'axe vertical. On ne voit pas l'intérêt de cette disposition, en fait.

Chaque rationnel a un numéro, dont les programmes proposés ci-avant établissent la correspondance bijective. J'ai reconstruit l'arbre au bloc-notes en ajoutant les numéros (avec "#"), et en mettant en évidence l'enchaînement de ceux-ci : le passage N->2*N est montré par un signe '-', celui de N->2*N+1 par un '+'. Si on remplaçait ces signes par '0' et '1', on retrouverait la représentation en base 2 de ces nombres.

Code : Tout sélectionner

     #74       #73           #70       #69    .    #122      #121          #118      #117
    11/18     15/11          9/13      5/14   .    9/14     13/9          11/15     18/11
      -   #18   +             -   #17   +     .     -   #30   +             -   #29   +
#37 11/7 +4/7- 4/11 #36  #35 9/4 +5/4- 5/9 #34.#61 9/5 +4/5- 4/9 #60  #59 11/4 +7/4- 7/11 #58
      +    |    -             +    |    -     .     +    |    -             +    |    -
    18/7   -   4/15         13/4   +  14/9    .   14/9   -   4/13         15/4   +   7/18
     #75   |   #72    #4     #71   |   #68    .    #123  |   #120   #7     #119  |   #116
       #9 4/3_____+___1/3___-_____1/4 #8      .     #15 4/1_____+___3/1___-_____3/4 #14
     #76   |   #79     |     #64   |   #67    .    #124  |   #127    |     #112  |   #115
     7/17  +  13/3     |     1/7   -  11/5    .    5/11  +   7/1     |     3/13  -  17/7
      -    |    +      |      -    |    +     .     -    |    +      |      -    |    +
 #38 7/10-7/3+10/3 #39 | #32 1/6 -1/5+ 6/5 #33.#62 5/6 -5/1+ 6/1 #63 | #56 3/10-3/7+10/7 #57
      +   #19   -      -      +   #16   -     .     +   #31   -      +      +   #28   -
    17/10     10/13    |     7/6       6/11   .   11/6       6/7     |    13/10     10/17
     #77       #78     |     #65       #66    .    #125      #126    |     #113      #114
                       |                     #1                      |
                   #2 1/2________________-___1/1___+________________2/1 #3
                       |                      .                      |
     #82       #81     |     #94       #93    .    #98       #97     |     #110      #109
    11/19     14/11    |     9/11     16/9    .    9/16     11/9     |    11/14     19/11
      -   #20   +      +      -   #23   +     .     -   #24   +      -      -   #27   +
#41 11/8 +3/8- 3/11 #40| #47 9/2 +7/2- 7/9 #46.#49 9/7 +2/7- 2/9 #48 |#55 11/3 +8/3- 8/11 #54
      +    |    -      |      +    |    -     .     +    |    -      |      +    |    -
    19/8   -   3/14    |    11/2   +   7/16   .   16/7   -   2/11    |    14/3   +   8/19
     #83   |   #80     |     #95   |   #92    .    #99   |   #96     |     #111  |   #108
      #10 3/5_____-___3/2___+_____5/2 #11     .     #12 2/5_____-___2/3___+_____5/3 #13
    #84    |   #87    #5     #88   |   #91    .    #100  |   #103   #6     #104  |   #107
    8/21   +  18/5           5/17  -  19/7    .    7/19  +  12/17          5/18  -  21/8
     -     |    +             -    |    +     .     -    |    +             -    |    +
 #42 8/13-8/5+13/5 #43   #44 5/12-5/7+12/7 #45.#50 7/12-7/5+12/5 #51   #52 5/13-5/8+13/8 #53
     +    #21   -             +   #22   -     .     +   #25   -             +   #26   -
   21/13      13/18         17/12     12/19   .   19/12     17/5          18/13     13/21
    #85        #86           #89       #90    .    #101      #102          #105      #106
L'arbre prend alors une toute autre allure :
  • Il y a du Mandelbrot dans ces volutes en '-' qui tournent dans le sens horaire et celles en '+' dans le sens trigonométrique ;
  • Et aussi un peu de "flocon de neige" dans les numéros eux-mêmes en les suivant de 1 en 1 à partir d'une puissance de deux ; d'une puissance à la suivante, il semble que les segments entre numéros consécutifs se muent en lignes brisées de façon assez régulière.
Le caractère fractal du diagramme en H est bien plus évident.
Modifié en dernier par jxano le 04 oct. 2020 21:30, modifié 1 fois.
Programmeur abscons.
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: MPO 95 : Balayage des rationnels

Message par C.Ret »

jxano a écrit : 29 sept. 2020 21:18 L'arbre prend alors une toute autre allure :
  • Il y a du Mandelbrot dans ces volutes en '-' qui tournent dans le sens horaire et celles en '+' dans le sens trigonométrique ;
  • Et aussi un peu de "flocon de neige" dans les numéros eux-mêmes en les suivant de 1 en 1 à partir d'une puissance de deux ; d'une puissance à la suivante, il semble que les segments entre numéros consécutifs se muent en lignes brisées de façon assez régulière.
Le caractère fractal du diagramme en H est bien plus évident.

.
mpo95 HP Prime MAP 2.png
mpo95 HP Prime MAP 2.png (84.54 Kio) Vu 6710 fois
.
mpo95 HP Prime MAP 3.png
mpo95 HP Prime MAP 3.png (83.71 Kio) Vu 6710 fois
Les échelles de couleur [ R ]= a [ G ]= tree level (niveau de l'arbre) [ B ]= b; a et b petit donne mauve foncé, plus c'est rouge plus a>b


.
mpo95 HP Prime MAP 5.png
mpo95 HP Prime MAP 5.png (21.39 Kio) Vu 6710 fois
.
mpo95 HP Prime MAP 4.png
mpo95 HP Prime MAP 4.png (58.4 Kio) Vu 6710 fois
.
Les échelles de couleur [ R ]= a>b [ G ]= tree level (niveau de l'arbre) [ B ]= a<b;
Pixel rouge a>b (donc a/b > 1) et Pixel bleu b>a (donc a/b<1)


Je suis d'accord, j'aime bien l'aspect fractal de cet arbre. Par contre, j'ai grand mal à mettre en évidence les enroulement '+' et '-' dont tu parles. Je les devine sur les figures, mais je n'ai pas (encore) trouvé les codes couleur et le moyen de zoomer pour mettre cela en évidence.

.
mpo95 HP Prime MAP 1.png
mpo95 HP Prime MAP 1.png (69.14 Kio) Vu 6710 fois
.
Les échelles de couleur [ R ]= a [ B ]= b; a et b petit donne mauve foncé, plus c'est rouge plus a>b (pas d'arbre, pas de vert)
mpo95 HP Prime MAP 6.png
mpo95 HP Prime MAP 6.png (32.94 Kio) Vu 6707 fois
.
Les échelles de couleur [ R ]= a>b [ G ]= tree level (niveau de l'arbre) [ B ]= a<b;
Arbre jaune ~= vert/rouge car a>b (donc a/b > 1) et Arbre cyan ~= vert/bleu car b>a (donc a/b<1)
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
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: MPO 95 : Balayage des rationnels

Message par Danny »

C'est choli (comme on dit en Alsace) !
La Prime met combien de temps à sortir des arbres de cette taille ?
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
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: MPO 95 : Balayage des rationnels

Message par C.Ret »

Elle met entre 0'23" et 1'40" avec un code suivant l'algorithme de jxano selon la méthode de colorisation et le nombre de pixels demandé.

Par exemple, la figure suivante met 0'23" :
mpo95 HP Prime MAP 7.png
mpo95 HP Prime MAP 7.png (28.96 Kio) Vu 6653 fois
avec le code suivant :

Code : Tout sélectionner

EXPORT COLMAPRAT95(p)
BEGIN
   LOCAL n:=2^p,a:=1,b:=1;
   LOCAL x:=n,y:=n,i,j,h:=n,v:=n,m:=2590;
   LOCAL d:=1,t:=0,l:=2*p+4,Ca,Cb;
// ----------------------------------------------------------------------------------- Initi Color Maps
   MAKEMAT(5+250*J/l,l)►Ca;    MAKEMAT(5+250*J^.6/m^.6,m)►Cb;
// ----------------------------------------------------------------------------------- Clear Screen
   RECT_P(#0);
// =================================================================================== Main drawing loop 
   WHILE d≠2 OR h<n DO
      x►i;y►j;
      CASE 
	   // ........................................................................ Go low / up / left  as much as possible 
         IF d==1 THEN             a+b►b;l-1►l;0►t;     IF h==v THEN h/2►h;x-h►x
                                                               ELSE v/2►v;y-v►y END; END; 
	   // ........................................................................ Go high one step to father or brother depending on sign a<b  
         IF d==2 THEN IF a<b THEN b-a►b;l+1►l;1►t;3►d; IF h==v THEN y+v►y;2*v►v 
                                                               ELSE x+h►x;2*h►h END; 
                             ELSE a-b►a;l+1►l;0►t;     IF h==v THEN y-v►y;2*v►v
                                                               ELSE x-h►x;2*h►h END; END;
	   // ........................................................................ Go low / down / right one step and return case 1
         IF d==3 THEN             a+b►a;l-1►l;0►t;1►d; IF h==v THEN h/2►h;x+h►x;
                                                               ELSE v/2►v;y+v►y END; END;
      END;
      // ............................................................................  Smallest space reached, stop, go high again
      IF h≤1 OR v≤1 THEN 2►d;1►t END;


      // ----------------------------------------------------------------------------- Draw tree branchs
      IF v≥4 AND d≥2 THEN LINE_P(i,j,x,y,RGB(.5*Cb(a),Ca(l),.4*Cb(b),0)) END;
      // ----------------------------------------------------------------------------  Plot rational spots
      IF t==1 THEN PIXON_P(x,y,RGB(Cb(a),.1*Ca(l),.8*Cb(b),0)) END; 
   END;
// =================================================================================== End main Loop and wait for key press 
   WAIT;
END;


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.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

Intéressants, les dessins sur Prime ! Je note le coloriage en fonction de a/b, je prépare quelque chose sur le sujet.

Je reviens sur cette représentation graphique empruntée à Wikipedia, avec sa disposition des rationnels si particulière et ses petites choses qui manquent :

Image

La mise au point a été longue... Voici un programme (toujours issu de la même zone de fx-880P) qui propose une façon de construire une telle représentation, mais plus étoffée :

150 CLEAR:A=1:B=1:D=2:F$="^>v<"
152 O=.5:N=1:S$="="
154 INPUT "LGR BRAS (1,2,3...)";D
156 D=2^D:X=D:Y=D:T=D
160 IF T=1;IF O=0 OR O=.5;GOTO 170
162 B=B+A:N=2*N:S$="-"
164 O=FRAC(O+.25):GOSUB 200:GOTO 160
170 PRINT MID$(F$,1+O*4,1);" ";CHR$(X+64);MID$(STR$(Y),2);" ";
172 PRINT S$;STR$(A);"/";MID$(STR$(B),2);" #";MID$(STR$(N),2);".";
174 J=J+1:IF J=4;J=0:PRINT ""
180 IF T=1; IF O=0 OR O=.5;GOTO 190
182 A=A+B:N=2*N+1:S$="+"
184 O=FRAC(O+.75):GOSUB 200:GOTO 160
190 IF T=D;PRINT " FIN":END
191 N=INT(N/2)
192 IF O=0;Y=Y+T:T=T*2
193 IF O=.25;X=X-T
194 IF O=.5;Y=Y-T:T=T*2
195 IF O=.75;X=X+T
196 IF A>B;A=A-B:GOSUB 210:GOTO 190
198 B=B-A:GOSUB 210:GOTO 170
200 IF O=0;Y=Y-T:RETURN
202 IF O=.25;T=T/2:X=X+T:RETURN
204 IF O=.5;Y=Y+T:RETURN
206 T=T/2:X=X-T:RETURN
210 IF A<B;S$="-":RETURN
212 IF A>B;S$="+":RETURN
214 S$="=":RETURN

L'idée et la construction sont identiques à celles de mes codes précédents. J'y ai ajouté une orientation O qui donne la direction vers laquelle pointe le bras courant (le choix des valeurs m'évite quelques instructions IF), et un signe S$ pour la qualité inférieur / supérieur à 1 du rationnel courant. N désigne le numéro du rationnel, T la longueur courante du bras, A et B le rationnel lui-même, X et Y sa position, que j'affiche sous forme "case de tableur" pour clarifier un peu l'affichage non graphique.

Voici un bout de brouillon qui a guidé ma recherche :

Code : Tout sélectionner

 A1 #18          C1 #17       v    E1 #30          G1 #29
    4/7             5/4       .       4/5             7/4
 A2  -    B2 #4      +        v    E2  -    F2 #7      +
 #9 4/3_+<1_1/3_1>-_1/4 #8    4   #15 4/1_+<1_3/1_1>-_3/4 #14
     +       ^       -  C2    v        +       ^       -   G2
    7/3      2      1/5       .       5/1      2      3/7
 A3 #19      |   C3 #16       v    E3 #31      |   G3 #28
             -             D4 #1               +
      B4 #2 1/2________-_2_<_1/1_>_2_+________2/1 #3 F4
             +                                 -
 A5 #20      |   C5 #23            E5 #24      |   G5 #27
    3/8      2      7/2               2/7      2      8/3
 A6  -       v       +             E6  -       v       +
#10 3/5_-<1_3/2_1>+_5/2 #11       #12 2/5_-<1_2/3_1>+_5/3 #13
     +    B6 #5      -   C6            +    F6 #6      -   G6
    8/5             5/7               7/5             5/8
 A7 #21          C7 #22            E7 #25          G7 #26
Mon système n'est pas très souple et ne permet de représenter que les arbres de profondeur paire.
Programmeur abscons.
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: MPO 95 : Balayage des rationnels

Message par C.Ret »

J'ai moi aussi eut un peu de mal à refondre convenablement mon code afin de contrôler l'enroulement des branches de l'arbre.
Je me rends compte alors que les captures d'écrans sont faites , que je tourne dans le sens inverse de celui de jxano. Ce n'est pas grave, les auditeurs inverseront mentalement les images afin de comparer mes résultats à ceux de mon honorable collègue, lui aussi explorateur de l'arbre de Calkin-Wilf.
mpo95 HP Prime MAP 19.png
mpo95 HP Prime MAP 19.png (35.55 Kio) Vu 6579 fois
Avec un enroulement orienté systématiquement, les puits de rationnels décroissants ou croissant sont afin mis en évidence sur les figures colorées.
Pour cela, je colore en bleu les plus petits rationnels a/b (soit a<<b) et en rouge les plus grandes valeur a/b (soit a>>b). Les puits sont d'autant plus intenses qu'il sont important par rapport à l'ensemble des rationnels de la figure.
Les variations du fond mauve correspondante aux valeurs absolues du numérateur a (lié au à la composante rouge) et du dénominateur b (lié au bleu).
Comme pour les figures précédentes, l'arbre lorsqu'il est dessiné est représenter avec des variations de verts d'autant plus foncé que l'on s'enfonce dans les tréfonds et les méandres de la structure tourmentée de l'arbre.

mpo95 HP Prime MAP 20.png
mpo95 HP Prime MAP 20.png (33.58 Kio) Vu 6579 fois
mpo95 HP Prime MAP 17.png
mpo95 HP Prime MAP 17.png (17.95 Kio) Vu 6579 fois
En retirant l'arbre, on peut mieux observer la répartition des rationnels, avec le fond continu (tons mauvasse) et les puits que forme les petits rationnels (en bleu) ou les grands (en rouge).
mpo95 HP Prime MAP 15.png
mpo95 HP Prime MAP 15.png (15.23 Kio) Vu 6579 fois
mpo95 HP Prime MAP 12.png
mpo95 HP Prime MAP 12.png (48.71 Kio) Vu 6579 fois
On peut aussi observer que l'enzemble Z ainsi rangé est une vraie en "serpillière". Les points les plus lumineux sont en périphérie des faisceaux de branches, au niveau des "fissures"; ce sont les niveaux les plus profonds, c'est pas là que l'infini s'insinue en strie d'accroissement.
mpo95 HP Prime MAP 13.png
mpo95 HP Prime MAP 13.png (32.19 Kio) Vu 6579 fois
mpo95 HP Prime MAP 14.png
mpo95 HP Prime MAP 14.png (32.14 Kio) Vu 6579 fois

Je mets un aperçu du code pour donner une idée de la méthode utilisée :

Code : Tout sélectionner

EXPORT MAPRAT2(p,a,b)
BEGIN
 LOCAL n:=120,m:=987;
 LOCAL x:=160,y:=120,i,j,h:=n,v:=n,t;
 LOCAL l:=p,u:=-p,d:=0,r,coR,coG,coB;
 LOCAL Co:=MAKEMAT(255*J^1.4/m^1.4,m);
// --------------------------------------------- Clear Screen
 RECT_P(#0);
// --------------------------------------------- MAIN LOOP
 WHILE l<p OR u≠2 DO
  // ------------------------------------------- Step State System (u)
  //  a:a b:b     l: level     d:direction 
  //  u: state    d: move direction r: retract/expand branch  t:move on/off
  CASE 
   // ----------- go lowest a/b in this branche , left-turn each step 
   IF u<0  THEN             a+b▶b; l-1▶l; 1+u▶u; 1▶t; -1▶r; d-1▶d END;
   // ----------- node reached : goto father/brother (resp. state 1/2) depending of a<?>b 
   IF u==0 THEN IF a<b THEN b-a▶b; l+1▶l;   1▶u; 1▶t;  0▶r; d-2▶d
                       ELSE a-b▶a; l+1▶l;   2▶u; 1▶t;  1▶r; d-2▶d END END;
   // ----------- start explore brother's branche  
   IF u==1 THEN             a+b▶a; l-1▶l;  -l▶u; 1▶t;             END;
   // ----------- display father and turn right   
   IF u==2 THEN                             0▶u; 0▶t;       d+1▶d END;
  END;
  // ----------------------------------- move allowed
  IF t THEN
     x▶i;y▶j; d MOD 4▶d;
     // ------------------------ retract branches length  
     IF r==-1 THEN IF d==0 OR d==2 THEN v/2▶v ELSE h/2▶h END; END;
     // ------------------------ move in direction d (0:up 1:right 2:down 3:left)
     CASE
      IF d==0 THEN y-v▶y END;
      IF d==1 THEN x+h▶x END;
      IF d==2 THEN y+v▶y END;
      IF d==3 THEN x-h▶x END;
     END;
     // ------------------------ expand branches lenght
     IF r==1 THEN IF d==0 OR d==2 THEN 2*v▶v ELSE 2*h▶h END; END;
     // ------------------------ draw tree 
  END;    
  // ------------------------- draw node/back ground 
  IF u>=0 THEN  
     // --------------------- compose color code
     Co(a)▶coR; 232l/p▶coG; Co(b)▶coB;
     IF m^2*b>a*(p+1) THEN 255*b/a/(p+1)▶coB END; 
     IF m^2*a>b*(p+1) THEN 255*a/b/(p+1)▶coR END;
     // --------------------- draw branch
     IF u>0 AND l>1 THEN LINE_P(i,j,x,y,RGB(coR,coG,coB,0)) END;  
     // --------------------- draw node/background/rationals
     IF u==0 THEN 
        PIXON_P(x,y,RGB(coR,0,coB,0));
        IF p<7 THEN TEXTOUT_P(a+"/"+b,x-12,y-8,0,RGB(coR/2,coG,coB/2,0),72,RGB(0,0,0,96)) END;
     END;
  END;
 END;
 WAIT;
RETURN z;
END;
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.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: MPO 95 : Balayage des rationnels

Message par Gilles59 »

Je ne comprends à peu près rien mais c'est très beau! Je ne serai presque pas surpris de voir apparaitre le Saint Suaire de Turin dans ces graphiques ;D

Plus sérieusement je relirai ça calmement quand mon cerveau sera libéré de des milles sujets du boulot :/
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
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

Je n'ai pas une vision des couleurs suffisante pour bien appréhender les graphiques de C.Ret dans leur ensemble, mais je note tout de même que les valeurs extrêmes (en rouge et en bleu) se répartissent dans des régions de l'arbre bien particulières.

Mes réflexions, une fois de plus, m'ont inspiré le petit bout de code pour fx-790P suivant :

10 PRINT "FONCTION MYSTERE": CLEAR
20 INPUT "ENTIER",E:N=E:I=0:R=0
30 IF N=1; GOTO 40
32 N=N/2:R=2*(R+ FRACN):N= INTN:I=I+1: GOTO 30
40 PRINT E;" =>";R+2^I: GOTO 20

Non, ce n'est pas ma proposition pour le MPO 96. Cela dit, on n'en est pas très loin. Il sera surtout intéressant de discuter du sens et de la portée de ce petit programme.
Programmeur abscons.
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: MPO 95 : Balayage des rationnels

Message par C.Ret »

Quel curieuse fonction.

Je me suis empressé de tapoter cela sur l'HP-41C qui passait par hasard juste à coté du clavier de mon portable:

Code : Tout sélectionner

001 LBL "FMYST
002  0  STO Z  X<>Y  2
006  LBL 00  x>y?  GTO 01
009   ST+ T  ST/ Y  X<>Y  FRC  ST+ Z  ST- L  X<> L  X<>Y  STO* Z  GTO 00
019  LBL 01  ST/ T  *  R^  y^x  +
023 END
(Je fais express de tout faire et uniquement dans la pile, il y a certains qui ont acquis récemment une toute nouvelle DM41X qui seront ravi de suivre pas à pas cet algorithme sur leur écran tout neuf).

Et alors en observant les résultats qui s'impriment sur mon HP82240A (il n'y a pas que le DM41X qui peuvent imprimer sur cette imprimante IR), je me suis dit : « Quelle étrange et mystérieuse bijection ! »

Code : Tout sélectionner

1 → 1 → 1    8 →  8 →  8   16 → 16 → 16
             9 → 12 →  9   17 → 24 → 17
2 → 2 → 2   10 → 10 → 10   18 → 20 → 18
3 → 3 → 3   11 → 14 → 11   19 → 28 → 19
            12 →  9 → 12   20 → 18 → 21
4 → 4 → 4   13 → 13 → 13   21 → 26 → 21
5 → 6 → 5   14 → 11 → 14   22 → 22 → 22
6 → 5 → 6   15 → 15 → 15   23 → 30 → 23
7 → 7 → 7                  24 → 17 → 24  
                           25 → ...
Je laisse aux lecteurs de ce fil le soin de continuer et d'arriver à la même conclusion que moi. Ce bout de code donne la fonction bijective qui permet de lier les éléments de deux objets dont il est question ici.
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.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: MPO 95 : Balayage des rationnels

Message par jxano »

Je reviens brièvement sur le "gros" programme que je donnais il y a huit jours (le samedi 3) pour reproduire les enroulements des rationnels en 1/n et n/1. J'ai rajouté deux instructions concernant justement l'orientation O des branches des H :

196 IF A>B;A=A-B:O=FRAC(O+.25):GOSUB 210:GOTO 190
198 B=B-A:O=FRAC(O+.75):GOSUB 210:GOTO 170

En recopiant mon code sur un autre fx-880P, je me suis étonné que les attributions de cases (à la manière d'un tableur) ne se faisaient pas de façon attendue. Dans le 880 source, j'ai inversé les angles .25 et .75 dans les lignes ci-dessus, et les cases sont attribuées de façon unique et harmonieuse. Je n'avais pas suffisamment contrôlé ce point pourtant capital de mon programme.

C'est en revenant dans mon message du 3 octobre que je m'aperçois que ces instructions de changement d'orientation sont carrément absentes... Je les rétablis donc ici.
Programmeur abscons.
Répondre

Retourner vers « Tous les Pockets »