Misez p'tit Optimisez n°86 : la spirale d'Ulam

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
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2391
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 16 nov. 2018 21:40

Bonsoir à tous et toutes.

Dimanche dernier, j'avais un peu de temps et j'en ai profité pour faire un petit check-up du vétéran des ordinateurs personnels de la maison.
J'en ai profité pour lui connecter une petite télé THOMSON qui affiche l'écran 40 col. ou graphique . Ce qui me permet d'avoir simultanément les deux écrans sous les yeux sans avoir à switcher entre les deux modes de mon moniteur Commodore 1801.

Pour tester tout cela, j'ai écrit, un peu vite, un petit programme, très simple, qui dessine une Spirale d'Ulam dont la capture d'écran a fait l'objet d'une question du dimanche.

Certains, on très vite trouvé.


Par contre, j'ai bien du mal à l'optimiser, la raison principale est que je suis incapable de trouver la relation entre les nombres et leurs coordonnées sur la spirale.

L'objet de ce M.P.O. ne sera pas de tracer une spirale, la plupart de nos calculettes ne sont pas graphiques.

Non, la motivation de ce M.P.O. est de m'aider à trouver un code simple et efficace qui me permette de trouver la relation entre le nombre et ses coordonnées sur la spirale.

Si vous acceptez le défit, merci de me proposer vos meilleurs codes pour déterminer les coordonnées (x,y) d'un nombre n sur la spirale d'Ulam à l'aide de votre calculette ou pocket préféré.


Pour que nous fournissions les mêmes résultats, nous considéreront la spirale générée de la façon suivante :
Spirale Ulam.png
Spirale Ulam.png (13.4 Kio) Consulté 5776 fois


N est un nombre entier strictement positif
x est l'abscisse (c'est à dire la position relative entière sur l'axe horizontal : négatifs à gauche et positifs à droite de l'origine)
y est l'ordonnée (c'est à dire la position relative sur l'axe vertical : négatifs en bas et positifs en haut)

L'origine des coordonnées étant centrée sur le nombre 1 placé au centre de la spirale.


Ainsi, nous obtenons les coordonnée suivantes pour ces quelques exemples :

Code : Tout sélectionner

N          x  ,  y
------  ----  ----
     1     0     0
     9     1    -1
    15     0     2
    21    -2    -2
   401   -10    10
 13987   -59    -3
 47217   109    19
100916    50   159


Si possible, le code proposé devra prendre N en argument, saisi par l'utilisateur d'une façon ou d'une autre, puis afficher (ou imprimer) le couple de coordonnées (x,y) soit simultanément, soit dans l'ordre x puis y .

Mais bon, avec de très vieux machins, on comprendra que l'ordre inverse puisse/doivent être obtenu, ou qu'il faille appuyer sur une touche spécifique (ou bizarre) pour swapper de l'une à l'autre des deux coordonnées.
Dernière édition par C.Ret le 17 nov. 2018 09:20, édité 1 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5356
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 16 nov. 2018 23:44

Sympa ! J'ai mon idée...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par zpalm » 17 nov. 2018 02:25

Voici un programme sur HP Prime que l'on doit pouvoir facilement adapter en BASIC.
On considère des carrés concentriques, le carré 0 étant constitué des nombres 1,2,3,4, le carré 1 des nombres 5,6,7,8,9,10,11,12,13,14,15,16, le carré 2 des nombres 17,18, etc...
Ensuite on calcule la position du nombre N par rapport au plus petit nombre du carré.
Puis sur quel quart du carré on se trouve.
Enfin pour chacun des 4 quarts on a une formule donnant x et y.

Code : Tout sélectionner

EXPORT ulam_xy(N)
BEGIN
 LOCAL c,p,q,x,y;
 c:=IP(√(N-1)/2);  // carré
 p:=N-4*c^2-1;     // position sur le carré
 q:=IP(p/(1+2*c)); // quart du carré
 IF q==0 THEN 
  x:=−c;
  y:=c-p;
 END;
 IF q==1 THEN  
  x:=p-3*c;
  y:=−c;
 END;
 IF q==2 THEN 
  x:=c+1;
  y:=p-5*c-1;
 END;
 IF q==3 THEN  
  x:=7*c+3-p;
  y:=c+1;
 END;
 RETURN {x,y};
END;

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5356
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 17 nov. 2018 03:46

Pfiuuuu... tu ne chômes pas, zpalm ! Bravo !
Posté à 1 h 25 du matin, cela donne une idée de l'effort.
Combien ça fait d'octets ?

En fait, plus que d'un MPO, il s'agirait plutôt d'un
MIsez Rapide, vu les capacités de la machine de départ de C.ret. Mais j'aime bien !
Je continue à lambiner sur la mienne, d'idée que j'ai... :idea: ...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 746
Inscription : 06 oct. 2012 14:37

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par tyann » 17 nov. 2018 09:33

Bonjour

Selon une petite astuce que j'avais signalé dans un fil il y a quelques temps déjà
http://www.silicium.org/forum/viewtopic ... 46&t=40809
Le code de Zpalm peut -être optimisé de la façon suivante :

Code : Tout sélectionner

ULAM(N)
BEGIN
LOCAL c,p,q,x,y;
LOCAL s:={"{-c,c-p}","{p-3*c,-c}","{c+1,p-5*c-1}","{7*c+3-p,c+1}"};
 c:=IP(√(N-1)/2);  // carré
 p:=N-4*c^2-1;     // position sur le carré
 q:=IP(p/(1+2*c)); // quart du carré
 EXPR(s(q+1));
 END;
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 5120, 9200, 9600

Canon X-07

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par zpalm » 17 nov. 2018 12:25

tyann a écrit :
17 nov. 2018 09:33
Selon une petite astuce que j'avais signalé dans un fil il y a quelques temps déjà
http://www.silicium.org/forum/viewtopic ... 46&t=40809
Le code de Zpalm peut -être optimisé de la façon suivante :
Excellent ! Je ne m'en souvenais plus...
Du coup voici un programme pour tracer la spirale d'Ulam sur la HP Prime:

Code : Tout sélectionner

ulam_xy(N)
BEGIN
 LOCAL c,p,q;
 LOCAL s:={"{-c,c-p}","{p-3*c,-c}","{c+1,p-5*c-1}","{7*c+3-p,c+1}"};
 c:=IP(√(N-1)/2);  // carré
 p:=N-4*c^2-1;     // position sur le carré
 q:=IP(p/(1+2*c)); // quart du carré
 EXPR(s(q+1));
END;

EXPORT ulam()
BEGIN
 LOCAL n:=2;
 RECT_P();
 WHILE n≤320*320 DO
  PIXON_P(ulam_xy(n)*{1,−1}+{160,120},#FFh);
  n:=nextprime(n);
 END;
 FREEZE;
END;
C'est quand même bien agréable d'avoir une machine aussi puissante que la Prime.

Image

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Hobiecat » 17 nov. 2018 15:52

Impressionnant et bravo pour cette résolution rapide !
L'intérêt de la Prime doit aussi être sur le temps d'exécution de ce graphique ?

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5356
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 17 nov. 2018 23:03

Bonsoir,
En dehors de C.ret et moi, personne ne se lance ?
Je demande ça parce que c'est le genre de programme intéressant pour un psioniste (ce que je suis) mais que je me suis lancé dans un programme pour HP... 34C (graphique, pas vraiment).

C'est aussi attrayant sur HP-48, hein, bernouilli92 ! :wink:

Mais je reconnais qu'un mpo lancé par C.ret et résolu en trois heures par zpalm sur Prime, c'est un peu comme acheter Neymar tout en gardant Zlatan pour une rencontre du PSG contre Guingamp : ça tue un peu le match... :lol:
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par zpalm » 18 nov. 2018 00:52

Marge a écrit :
17 nov. 2018 23:03
Mais je reconnais qu'un mpo lancé par C.ret et résolu en trois heures par zpalm sur Prime, c'est un peu comme acheter Neymar tout en gardant Zlatan pour une rencontre du PSG contre Guingamp : ça tue un peu le match... :lol:
:lol: :lol: :lol:
Marge a écrit :
17 nov. 2018 23:03
En dehors de C.ret et moi, personne ne se lance ?
Voici une version RPN pour HP 42S/Free42/DM42 du calcul des coordonnées x et y (que l'on retrouve dans les registres X et Y après l'exécution du programme).
60 pas et aucun registre. Ça doit marcher aussi sur HP 41C et on doit pouvoir faire plus court sur WP 34S.

ulam.raw

Code : Tout sélectionner

00 { 88-Byte Prgm }
01▸LBL "ULAM"
02 RCL ST X
03 1
04 -
05 SQRT
06 2
07 ÷
08 IP
09 X<>Y
10 RCL ST Y
11 X↑2
12 4
13 ×
14 -
15 1
16 -
17 RCL ST Y
18 2
19 ×
20 1
21 +
22 RCL ST Y
23 X<>Y
24 ÷
25 IP
26 X<> ST T
27 GTO IND ST T
28▸LBL 00
29 -
30 +/-
31 X<>Y
32 +/-
33 RTN
34▸LBL 01
35 +/-
36 STO ST Z
37 3
38 ×
39 +
40 RTN
41▸LBL 02
42 5
43 ×
44 -
45 1
46 -
47 X<>Y
48 RCL+ ST L
49 RTN
50▸LBL 03
51 7
52 ×
53 -
54 2
55 -
56 1
57 STO+ ST Z
58 -
59 +/-
60 END

Avatar de l’utilisateur
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 390
Inscription : 27 janv. 2013 01:26
Localisation : Strasbourg
Contact :

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par dprtl » 18 nov. 2018 18:08

Voici ma modeste contribution en 10 lignes pour Casio PB1000. Mon programme n'est pas optimal pour le temps de calcul, mais il affiche tous les résultats jusqu'à N. On pourrait, par exemple, les sauvegarder ou bien les imprimer :

Code : Tout sélectionner

10 X=0:Y=0:D=0:T=1:S=1:INPUT"N";N
20 FOR I=1 TO N:PRINT I;X;Y:T=T-1
30 IF D=0 THEN X=X+1:GOTO 90
40 IF D=1 THEN Y=Y+1:GOTO 70
50 IF D=2 THEN X=X-1:GOTO 90
60 Y=Y-1
70 IF T=0 THEN D=D+1:T=S:D=D MOD 4
80 GOTO 100
90 IF T=0 THEN D=D+1:T=S:S=S+1
100 NEXT
Résultat :

Image

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

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par zpalm » 20 nov. 2018 00:05

Voici de quoi tracer la spirale d’Ulam sur une DM42 et son écran de 400x240 pixels :

Image

Pour générer cette image il faut 5'31" à la DM42 branchée sur USB (80MHz), et 12'24" sur batterie (24MHz). Par comparaison la Prime met 19” pour générer l'image 320x320 et 29” si on étend à 400x400 comme sur la DM42 qui souffre du manque d'une fonction Next Prime native (pour générer l'image 400x240 mon programme couvre toute la spirale dans l'aire 400x400, je n'ai pas trouvé d'astuce simple pour sauter les parties non affichées).

Il y a trois programmes:
  • UXY : calculs des coordonnées x et y d’un nombre sur la spirale (l’objet de ce MPO)
  • NP : Next Prime, calcul du prochain nombre premier, pour cela j’ai privilégié la rapidité en utilisant le test de primalité du MRA n°1.
  • ULAM : traçage de la spirale

Les .raw à charger dans votre DM42 : MPO86.zip

Code : Tout sélectionner

00 { 59-Byte Prgm }
01▸LBL "ULAM"
02 3 STO "GrMod" CLD 0 STO 00
07▸LBL 00 RCL 00 XEQ "NP" XEQ "UXY"
11 200 + 400 X<Y? RTN
16 X<> ST Z +/- 120 + X<0? GTO 00
22 X<>Y PIXEL GTO 00
 
 
00 { 132-Byte Prgm }
01▸LBL "NP"
02 2 X=Y? SIGN + STO 00 XEQ 02
08 RCL 00 X=Y? RTN GTO "NP"
12▸LBL 02
13 2 STO 02 4 STO 04 6 STO 06 + + CLX
22 5 MOD X=0? GTO 01 CLX
27 3 MOD X=0? GTO 01 CLX
32 RCL 02 MOD X=0? GTO 01
36 STO ST L
37▸LBL 00
38 X<> ST L RCL 06 + MOD X=0? GTO 01
44 X<> ST L RCL 04 + MOD X=0? GTO 01
50 X<> ST L RCL 02 + MOD X=0? GTO 01
56 X<> ST L RCL 04 + MOD X=0? GTO 01
62 X<> ST L RCL 02 + MOD X=0? GTO 01
68 X<> ST L RCL 04 + MOD X=0? GTO 01
74 X<> ST L RCL 06 + MOD X=0? GTO 01
80 X<> ST L RCL 02 + MOD X=0? GTO 01
86 X<> ST L X↑2 X≤Y? GTO 00
90 R↓ STO ST L
92▸LBL 01
93 LASTX
94 END
 
00 { 87-Byte Prgm }
01▸LBL "UXY"
02 RCL ST X 1 - SQRT 2 ÷ IP
09 X<>Y RCL ST Y X↑2 4 × - 1 -
17 RCL ST Y 2 × 1 + RCL ST Y X<>Y ÷ IP
26 X<> ST T
27 GTO IND ST T
28▸LBL 00
29 - +/- X<>Y +/-
33 RTN
34▸LBL 01
35 +/- STO ST Z 3 × +
40 RTN
41▸LBL 02
42 5 × - 1 - X<>Y RCL+ ST L
49 RTN
50▸LBL 03
51 7 × - 2 - 1 STO+ ST Z - +/-
60 END

Pour calculer le temps d’exécution j’ai utilisé ce programme:

Code : Tout sélectionner

00 { 26-Byte Prgm }
01▸LBL "UT"
02 TIME STO 10
04 XEQ "ULAM"
05 TIME →HR RCL 10 →HR - →HMS
11 CLA ATIME AVIEW
14 END

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5356
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 20 nov. 2018 01:31

Joli, Neymar ! :D

Je demande un peu de temps pour ma réponse, je m'échauffe, là...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2391
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 20 nov. 2018 19:01

Marge, tu as tout le temps que tu jugeras nécessaire, le match n'a pas encore réellement commencé.

En voyant le code pour la DM42, j'ai tout de suite reconnu le code de notre Misez Rapide Accéléré. C'est un bon point, mais j'ai bien peur que la méthode qui fait comme Jürgen Keller est plus rapide, surtout avec un vrai Sudaram utilisant un min-Heap bien implémenté :D . L'HP-42S ne manque pas de registres et l'indexation indirecte y est facile.


Comme il s'agit de spirale, j'ai trouvé une façon de faire bien moins alambiquée que celle proposée par notre fort rapide ami zpalm. Même, si je dois l'avouer, j'avais comme lui abordé le sujet moi aussi en repérant des carrés qui structurent la spirale d'Ulam. Comme zpalm j'avais quatre cas à exploiter et une astuce de parité me permettait de n'en retenir que deux.

Mais, j'ai progressé, sans avoir le temps encore d'expliciter mes recherches. Pour donner une piste, je dirais que j'ai trouvé à la Section n°2 : Numeric Functions de la page 31 du manuel de mon HP-15C quelques schémas et explications qui vont me permettre de faire bien plus court:
mpo86_HP15C_manual_extract.gif
mpo86_HP15C_manual_extract.gif (13.39 Kio) Consulté 5542 fois

Mais je n'en suis pas encore là, comme dprtl le seul programme qui fonctionne bien, court mais lent, surtout pour les grandes valeurs de n, se base sur le même principe.

Voici une version pour Pockets SHARP PC-1360 qui devrait être facilement adapté pour la plupart de ces types d'engins:

Code : Tout sélectionner

1:CLEAR : INPUT "n = ";N: FOR I=1 TO N-1: T=T+1,X=X+(D=0)-(D=2),Y=Y+(D=1)-(D=3)
2:IF T>L LET T=0,L=L+(D AND 1),D=(D+1) AND 3
3:NEXT I: BEEP 1: PRINT CHR$ 40;STR$ X; CHR$ 44;STR$ Y;CHR$ 41: END
Et pour l'ancêtre mémorable de la gamme :

Code : Tout sélectionner

1:CLEAR :INPUT "N=";N:FOR I=1TO N-1:T=T+1,X=X+(D=0)-(D=2,Y=Y+(D=1)-(D=3
2:IF T>L LET T=0,L=L+(D=1)+(D=3,D=D+1:IF D=4LET D=0
3:NEXT I:BEEP 1:PRINT N;X;Y:END
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2391
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par C.Ret » 24 nov. 2018 12:32

Je n'avance pas aussi vite que je le souhaiterai …

Mais je donne quelques indices de plus sur la méthode que je vais utiliser :

La spirale d'ULAM, c'est quel genre de spirale ?

C'est bien une spirale au sens qu'il s'agit d'un enroulement.

Image

Mais ce n'est pas une spirale hyperbolique, ni equiangulaire..



Image Image

C'est n'est non plus celle d'Archimède, de Galilée ou de Fermat.

Bien que cette dernière… présenterai , en partie, comme une propriété ou une forme , qui…
Image


Mais je n'en dis pas plus, je vous laisse un peu chercher…
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Avatar de l’utilisateur
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5356
Inscription : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit Optimisez n°86 : la spirale d'Ulam

Message par Marge » 24 nov. 2018 21:36

Et voici... GUINGAMP !

Image

Il faut reconnaître que le stade Roudouron, plutôt quadrangulaire, convient très bien à l'illustration de notre problème.

Je précise que je suis depuis toujours supporteur des équipes qui valorisent le collectif par rapport à l'individuel, particulièrement de celles qui peuvent créer la surprise - je soutenais d'ailleurs le FC Nantes contre l'AS Saint-Étienne dans ma prime adolescence contre vents et marées.
Allez, Guin-gamp !

Première mi-temps

La stratégie de l'entraîneur consiste à faire jouer sur les ailes, alternativement gauche et droite, en permettant au ballon d'y circuler librement au moyen de la pression exercée sur le centre par certains joueurs au tempérament plus entier et aux épaules carrées !

ulam1.png
ulam1.png (12.77 Kio) Consulté 5451 fois

On considère ici les carrés formés par les carrés, ce qui est assez pragmatique et n'aurait pas déplu à Guy Roux. D'ailleurs, à observer la figure, on trouve plein de caractéristiques intéressantes. Enfin, surtout une, à utiliser peut-être plus tard...

Pour trouver les coordonnées (x,y) de chaque entier, la clef est de chercher celles de l'entier au milieu du "coude" formé par la soustraction géométrique du carré considéré par celui qui lui est immédiatement inférieur ; ainsi dans le "carré 4", le retrait de 1 donne le coude formé des éléments 2, 3 et 4 dont l'entier 3 se trouve au milieu. Connaissant ses coordonnées, on déduit par soustraction de (N-Nm) la distance de l'entier N dont on cherche le couple (x,y) à cet "entier du milieu" Nm et, en prenant garde à l'alternance des carrés impairs et pairs qui modifient le lieu et le sens du calcul, on parvient à connaître N(x,y).

"C'est intéressant, mais cela provoque la difficulté d'avoir à décaler les coordonnées de chaque carré successif", me direz-vous, "puisqu'ils n'ont pas tous le même centre..." Et vous aurez raison.

Mais si on observe la figure, on constate que les coordonnées, en valeur absolue, appartiennent toujours aux carrés impairs ; c'est-à-dire que le |Xmax| du "carré 4", par exemple, (=1) est aussi celui du "carré 9" ; de même pour |Ymax| qui a naturellement la même valeur. Il faut donc prendre en valeur absolue la plus grande coordonnée possible dans le carré supérieur si celui que l'on considère est pair.
Ensuite, on peut attribuer le signe correct à Nm en fonction de la parité du carré considéré : un carré pair contient toujours un entier du milieu aux coordonnées strictement positives, et vice-versa.
Enfin, il "suffit" (j'y ai quand même passé beaucoup de temps !) d'appliquer l'opération adéquate (addition ou soustraction) au bon couloir (ligne ou colonne) en fonction de la différence (positive ou négative) et du carré (pair ou impair).

J'ai utilisé mon HP-34C car j'avais des batteries dedans. C'est un hasard d'y avoir rencontré ses drapeaux dont j'ai fait, je crois, l'usage nécessaire. Si vous comptez utiliser le programme sur une HP-67, faites attention au désarmement automatique de certains drapeaux - sur cette machine en effet, les drapeaux 2 et 3 sont désarmés une fois testés. Je ne vois pas de difficulté à l'adapter à une 41, en dehors du fait que j'ai profité des touches A et B pour permettre le lancement de l'exécution par la première et la répétition de la séquence d'affichage des x et y par la deuxième. Je viens de tester ma date de naissance sous la forme AAAAMMJJ et j'ai obtenu -300 et 2216 en 5 et 7 secondes respectivement...

Voici le programme brut :

Code : Tout sélectionner

001	LBL A		015	F? 0		029	1		043	ENTER		057	PAUSE		071	GTO B
002	CL.Reg		016	RCL 0		030	-		044	SQR		058	RCL 2
003	CF 0		017	ENTER		031	2		045	-		059	RTN
004	CF 1		018	ENTER		032	/		046	1		060	LBL 1
005	CF 2		019	2		033	F? 1		047	+		061	F? 2
006	STO 0		020	/		034	GTO 1		048	RCL 0		062	STO + 2
007	SQR		021	FRAC		035	ENTER		049	X<->Y		063	F? 1
008	ENTER		022	X#0		036	FRAC		050	-		064	STO - 2
009	INT		023	SF 1		037	+		051	X<0		065	GTO B
010	X=Y		024	X=0		038	CHS		052	GTO 1		066	LBL 2
011	SF 0		025	SF 2		039	LBL 1		053	X>0		067	F? 2
012	1		026	Rd		040	STO - 1		054	GTO 2		068	STO - 1
013	+		027	ENTER		041	STO - 2		055	LBL B		069	F? 1
014	x²		028	SQR		042	Rd		056	RCL 1		070	STO - 1
71 pas + 3*7 octets = 92 octets
Les drapeaux 1 et 2 signalent la parité du carré considéré, le drapeau 0 si N est égal à l'entier maximal (et carré) du carré.

Avec cette machine et cet algorithme, je ne crois pas qu'on puisse se passer des registres 1 et 2 des coordonnées.
Il devrait être possible, en ordonnant le programme différemment, de se passer du registre 0 qui contient N ; j'ai bien essayé avec cet ordre initial, mais je bute (BUT ! ah non, pardon...) sur le fait que N sort ainsi de la pile...

Ce sera sans doute fait pour la deuxième mi-temps ! S'il reste encore du public... ;)
3 hommes, 3 demis, un 3a... Magnéto, Serge !

« Boris », c'est juste Maurice enrhumé.

Répondre

Revenir vers « Tous les Pockets »