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

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°86 : la spirale d'Ulam

Message par C.Ret »

Excellent marge, alors sur la spirale du temps YYYYmmDD, nous devions être adversaire, car j'étais dans un carré opposé (-2218 , 11)

Pour faire plaisir à Badaze qui vient d'acquérir un magnifique HP-28S, je me permets de donner le code suivant:
MPO86_HP28S.png
MPO86_HP28S.png (109.58 Kio) Vu 9515 fois

Ce code n'effectue aucun test et n'utilise aucun GOTO, il se contente pour tout nombre n supérieur ou égal à 2 de calculer une approximation extrêmement proche du couple de coordonnées (x,y) correspondant à la position de n sur une spirale comme celle d'Ulam.

En fait, les coordonnées calculées sont même rigoureusement exactes pour tous les nombres entiers alignés sur les axes horizontaux, verticaux et les deux diagonales. Ce qui fait huit directions par tour de la spirale.

Et une version pour SHARP PC-1210/1211/1212 :

Code : Tout sélectionner

10:"N" AREAD N:DEGREE :K=(√N-1)/2,K=INT K+(K>INT K,T=(4KK+4K+1-N)/K,P=1-T+2*INT .5T,D=K*√(1+PP   73o
20:A=315-45T+SIN 180P*EXP √2:PRINT D*COS A,D*SIN A                                               33o
MEM: 1318STEPS   164MEMORIES                                                              Total 106o


EDIT: J'oubliais de vous donner la version pour HP-15C.

Pour rendre le code plus facile à lire, j'ai regrouper les instructions en une ligne pour chacune des valeurs intermédiaires calculées.
MPO86_HP-15C linestep.gif
MPO86_HP-15C linestep.gif (40.49 Kio) Vu 9480 fois
Il manque à cette machine les fonctions CEIL et MOD. Le code fait donc 61 instructions, mais il doit pouvoir être amélioré, notamment en utilisant des astuces plus efficaces pour palier à ce manque.
Modifié en dernier par C.Ret le 27 nov. 2018 17:54, modifié 3 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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

alors sur la spirale du temps YYYYmmDD, nous devions être adversaire, car j'étais dans un carré opposé (-2218 , 11)
Bah... aujourd'hui : - 2246 ; - 814. Nous suivons le cours du temps, non ?

(édité grâce à l'intervention spatio-temporelle de C.Ret)
Modifié en dernier par Marge le 06 déc. 2018 20:39, modifié 1 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
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°86 : la spirale d'Ulam

Message par C.Ret »

C'est tout à fait cela :

Image
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
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°86 : la spirale d'Ulam

Message par C.Ret »

J'ai eu du mal à trouver une fonction CEIL sur mon HP-41C, je l'ai noté en rouge.

Par contre, j'ai trouvé fortuitement un moyen de simplifier mon algorithme et de me passer des fonctions polaires/cartésiennes.
Il y a donc convergence des algorithmes avec ce dernier code qui, comme les méthodes de zpalm et marge exploite quatre cas distincts.

Par contre, la symétrie de la spirale me permet de traiter ces quatre orientations à l'aide d'une seule boucle de quelques instructions indicée par le registre T de la pile. La puissance de l'HP-41C s'avère alors une grande aide:

HP-41C mpo 86.png
HP-41C mpo 86.png (67.08 Kio) Vu 9419 fois

Le programme affiche d'abord la coordonnée x: ; comme pour l'HP-15C, il faut presser sur la touche [X:Y] pour voir la coordonnée y:


Ce nouvel algorithme ouvre des possibilités, la version SHARP PC-1211 devient donc un one-liner :

Code : Tout sélectionner

1:INPUT N:X=-INT (.5-√N/2,D=4XX+4X+1-N,Q=INT (D/2X,Y=X-D+2XQ:FOR I=0 TO Q:Z=-X,X=Y,Y=Z:NEXT I:PRINT X,Y
         78 octets 
La version HP Prime un enchantement:
HP-Prime mpo 86.png
HP-Prime mpo 86.png (17.17 Kio) Vu 9401 fois
La version RPL est un mono-block enflammé :

Code : Tout sélectionner

« DUP √ 1 - 2 / CEIL 				n , k=CEIL((√n-1)/2)
  DUP 2 * 1 + SQ ROT -				k , d=(2k+1)²-n
  OVER 2 * / LAST MOD				k , Q=d/2k , m=d MOD 2k
  ROT DUP ROT -  				Q , k , k-m 
  0 4 ROLL START				k , k-m , 0 , Q
     SWAP NEG					~  k-m,-k  ~  -k,m-k  ~  m-k,k  ~  k,k-m ~ 
  NEXT R→C »					(x,y)
La version HP-15C un peu plus énervante:
HP15C mpo 86.png
HP15C mpo 86.png (92.27 Kio) Vu 9396 fois

Je laisse à Marge le soin de faire les versions très énervantes et pénibles comme faut pour les spices, pionniers et autres classics dont il est le garant.


Ne reste plus qu'une version pour quelques CASIO, TI ou autres ?
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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

En attendant quelques versions énervantes pour HP, voici l'adaptation du programme de dprtl pour Casio PB-1000 sur Sharp PC-1403 :

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 LET X=X+1:GOTO 90
40: IF D=1 THEN LET Y=Y+1:GOTO 70
50: IF D=2 THEN LET X=X-1:GOTO 90
60: Y=Y-1
70: IF T=0 THEN LET D=D+1:T=S:D=D-(INT(D/4)*4)
80: GOTO 100
90: IF T=0 THEN LET D=D+1:T=S:S=S+1
100: NEXT I
Petites adaptations :
  • l'instruction LET est toujours nécessaire après un THEN ;
  • la fonction MOD n'existant pas, j'ai dû la taper in extenso.
Le plus drôle est que ça fonctionne sans que je sache comment. :lol: Mais je vais faire un effort. :wink:

Je travaille par ailleurs depuis longtemps sur une autre idée, mais j'ai vraiment du mal à l'appliquer...

J'ajoute que contrairement à ce que tu affirmes, C.ret, ("il y a donc convergence des algorithmes avec ce dernier code qui, comme les méthodes de zpalm et marge exploite quatre cas distincts."), ma méthode ne traite pas réellement de quatre cas distincts géométriques comme chez zpalm, mais plutôt de quatre conditions algébriques (pair, impair, etc.).
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
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°86 : la spirale d'Ulam

Message par C.Ret »

J'attends avec impatience l'expression de cette nouvelle idée.

Et je me réjouis qu'il n'y ait pas convergence des solutions, c'est bien plus intéressant et amusant.


Quelle bonne idée une SHARP PC-1403 ! J'aime bien cette petite machine (ce n'est pas un Pocket car on y voit très clairement les touches SIN COS TAN et EXP en haut à droite). Cette calculatrice qui a le bon ton de se programmer en BASIC.

Par contre, j'ai voulu essayer de retrouver à l'aide de ton code les coordonnées spiralo-temporelles de nos dates de naissance, mais c'est bien fastidieux ! Combien de fois va-t-il me falloir appuyer sur la touche ENTER pour voir enfin s'afficher le résultat ? La PC-1403 égraine les résultats en s'arrêtant à chaque valeur de N (cf. le PRINT de la ligne 20).

Par ailleurs, l'avantage du PC-1403 est qu'il a une fonction (x MOD 4), il suffit d'utiliser (x AND 3). Bon d'accord, cette astuce ne fonctionne pas pour toutes les valeurs. Mais uniquement pour les entiers puissances de 2^n lorsque la fonction (X MOD 2^n) peut être remplacer avantageusement par un (X AND (2^n-1))

Comme nous nous affrontons ici au sein d'un MPO, je me suis donc permis de réécrire pour la SHARP PC-1403 le code de dprl, en abusant des astuces qu'offre le BASIC des SHARP, BASIC fort complet sur une PC-1403.

Code : Tout sélectionner

 1:CLEAR :INPUT "n=";N:FOR I=2 TO N
 2:T=T+1,X=X+(D=0)-(D=2),Y=Y+(D=1)-(D=3):IF T>L LET T=0,L=L+(D AND 1),D=(D+1) AND 3
 3:NEXT I:PRINT STR$ N;":";X;STR$ Y

Notons que le IF ... THEN se contente très naturellement (dans la famille des Pockets SHARP) d'un IF ... LET plus concis.
Que l'instruction CLEAR me permet en une seule instruction d'initialiser toutes mes variables (j'ai gardé les noms des variables du code initial)
Le spaghetti de GOTO et la myriade de structures IF … THEN qui permettaient d'incrémenter ou décrémenter X ou Y sont dissous en utilisant l'astuce des évaluations binaires (0:FAUX 1:TRUE)

J'aimais bien le jeu subtil des sauts en ligne 70 et 90 qui permettait, l'air de rien, d'incrémenter la taille de la spirale deux fois par tour, je l'ai malgré tout fait disparaitre et tirant profit du fait que la direction D est impaire une fois sur deux. Un (D AND 1) permet donc d'incrémenter L au bon rythme.
Enfin, comme je l'ai signalé ci-dessus, j'utilise ((D+1) AND 3) pour faire cycler D sur les quatre directions [ 0:droite 1:haut 2:gauche et 3:bas ].

Comme vous l'aurait très certainement remarqué, cette version ne fonctionne pas pour n=1 (elle donne le même résultat que pour n=2; Corriger cette imperfection est fort simple, mais je préfère économiser les précieux octets. Et ce petit défaut n'est rien par rapport au problème majeur suivant:


Il faut patienter un peu pour obtenir les coordonnées de 2018 :
PC1403_2018_mpo86_1.gif
PC1403_2018_mpo86_1.gif (63.76 Kio) Vu 9304 fois
PC1403_2018_mpo86_2.gif
PC1403_2018_mpo86_2.gif (65.15 Kio) Vu 9304 fois
Cette nouvelle bouture de l'algorithme de dprl et marge ne règle donc toujours pas mon problème. Je n'arrive pas à retrouver les coordonnées de nos dates de naissances dans un temps non infini.
Modifié en dernier par C.Ret le 08 déc. 2018 17:13, modifié 2 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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

Bravo, C.ret, c'est en effet encore mieux ainsi. Je ne connaissais pas ces astuces de logique booléenne, ni d'ailleurs du THEN facultatif avec LET.

Alors certes, ce type de programme nécessite "un certain temps" pour arriver au résultat, mais l'idée procède d'un vrai bon sens : on imagine mal un mathématicien désœuvré dans une conférence commençant à dessiner une spirale d'entiers par le haut de la page !
Commencer par le centre est très logique, alors que chercher à connaître les coordonnées d'un entier quelconque demeure dans le domaine de l'amusement mathématique. Mais ce qui compte ici, c'est qu'on s'amuse.

Allez, promis, je donnerai quelque chose avant dimanche soir.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

La deuxième mi-temps !

Image

Cette impressionnante image nous mène bien loin des terrains de football... Qui sait si, à calculer un million de fois ce qui est représenté sur cette figure, et à le représenter sur un écran approprié, l'on ne découvrirait pas le sens de la vie ? Voilà une question pour quelques dimanches !

Il est assez surprenant que depuis le lancement de ce MPO, nous ayons dans l'ensemble depuis zpalm jusqu'à moi-même (avec peut-être l'exception de dprtl dont je n'ai toujours pas éclairci le programme...) en passant naturellement par C.Ret suivi des chemins plutôt géométriques pour obtenir le dessin de la spirale ; or quoi de plus naturel ? lorsqu'on évoque une spirale, on pense "escargot", "lavabo", "galaxie", "serpentin", "amorces de revolver" (oui, vous vous souvenez de votre panoplie de cow-boy ?), "ressort d'horloge" et même "boule de neige"...

Pourtant, dessiner à la main une spirale en escalier n'est pas exactement la même chose que d'observer la croissance d'un gastéropode. Cela exige de se conformer à des règles qui ne sont pas celles de Léonard de Vinci à Chambord, d'accord, mais qu'il faut suivre impérativement et sans erreur.

Image

Que se passe-t-il dans notre cerveau lorsque nous traçons ces nombres entiers ?
Peu seraient capables de le dire, et je serais le dernier de ceux-là. On peut éventuellement estimer que le cerveau va suivre au plus près la figure (fœtale ?) qui se dessine peu à peu, et ce sera une grosse approximation du processus réel.

Ce que je sais en revanche est que rendre compte de cela algébriquement n'est pas trop compliqué. À simplement noter certaines coordonnées successives des entiers et des opérations effectuées sur x et y pour les obtenir, on perçoit des régularités propices aux calculs qui nous intéressent. En effet :

Code : Tout sélectionner

| N  |  X  |  Y  | Opération 
| 1  |  0  |  0  | x=x+1            
| 2  |  1  |  0  | y=y+1     
| 3  |  1  |  1  | x=x-1      
| 4  |  0  |  1  | x=x-1 
| 5  | -1  |  1  | y=y-1
| 6  | -1  |  0  | 
Si vous avez déjà deviné l'opération exigée à partir de l'entier 6 pour obtenir les coordonnées de l'entier 7, vous avez fait l'essentiel du travail de compréhension !

Nous verrons plus tard qu'il est possible d'appliquer ce principe de détermination des coordonnées pour la recherche de celles d'un entier quelconque, mais pour l'instant, observons que nous devrons additionner alternativement à x et à y les valeurs 1 et -1 selon une progression arithmétique élémentaire puisqu'elle suit celle des entiers naturels eux-mêmes : 1, 2, 3, 4, etc.

Autrement dit :
  • Ajoutons 1 à X une fois,
  • ajoutons 1 à Y une fois,
  • ajoutons -1 à X deux fois,
  • ajoutons -1 à Y deux fois,
  • ajoutons 1 à X trois fois,
  • ajoutons 1 à Y trois fois,
  • etc.
À chaque modification de X ou de Y, naturellement, N varie.

C'est là que j'ai rencontré d'énormes difficultés à représenter la suite d'opérations nécessaires à une machine pour qu'elle réalise ce calcul. Je n'ai pas pu éviter l'organigramme relativement bâclé que voici :

Image

Je dois être honnête : j'ai réalisé des dizaines de tentatives sur une feuille (que dis-je ? une bonne dizaine de feuilles !) avant de me résoudre à l'évidence que le passage sur écran, comme nous y a habitué C.Ret avec ses magnifiques explications, était indispensable.
J'ai aussi essayé, dans un élan d'orgueil ridicule, d'immédiatement appliquer ce que je croyais être une trouvaille majeure sur une HP-41 en évitant scrupuleusement l'usage des registres ! Mais n'est pas zpalm qui veut... :wink:

Que se passe-t-il dans notre pauvre cerveau entre l'inscription de la spirale sur un bout de papier et l'adaptation de cette exécution à un ordinateur ?
Je sens que la réponse à cette question exigera des prolongations...

Revenons à notre schéma :

On initialise la machine avec :
  • La variable I (I pour Index), qui représentera les entiers successifs de 1 à N ;
  • X et Y les coordonnées classiques ;
  • U (U pour Unité) qui prendra les valeurs 1 et -1 alternativement ;
  • F qui représentera Fibonacci, c'est-à-dire les entiers successifs correspondant au nombre de boucles sur X puis sur Y ;
  • G qui gardera Fibonacci au chaud !


L'utilisateur entre la valeur N dont il doit trouver les coordonnées.


La machine vérifie si I égale N et dans ce cas, affiche le résultat immédiat et stoppe le programme.


1. C'est bien sûr ici que ça devient intéressant : on incrémente F pour commencer la boucle sur X. On note cette valeur dans G pour la ressortir éventuellement plus tard et l'appliquer sur Y, puis éventuellement sur le X suivant, etc.

2. Test de parité très lourd et très lent ; il suffit en réalité d'attribuer alternativement 1 et -1 à U, ce qui est faisable bien plus rapidement pour ce programme de recherche de TOUS les N. La recherche sur un N quelconque exigera néanmoins ce test, je le conserve donc ainsi (mais rien ne vous empêche de le changer !).

3.Travail sur X : tant que N n'est pas atteint et tant que F n'est pas à zéro, on continue à modifier X et par conséquent N.

4.Travail sur Y : tant que N n'est pas atteint et tant que F n'est pas à zéro, on continue à modifier Y et par conséquent N.

Voici un programme très grossier pour HP-41, je n'en suis pas fier mais il fonctionne : je le place ici pour vous donner de quoi vous occuper, n'hésitez pas à l'améliorer. Je m'intéresse plutôt à la version OPL pour l'instant !

Code : Tout sélectionner

01 LBL ULAM
02 CLRG
03 STO 00
04 1
05 STO 01
06 STO 04
07 X=Y?
08 GTO 00
09 LBL 01
10 1
11 ST+ 05
12 RCL 05
13 STO 06
14 2
15 /
16 FRC
17 X=0?
18 GTO 02
19 1
20 STO 04
21 GTO 03
22 LBL 02
23 1
24 CHS
25 STO 04
26 LBL 03
27 RCL 04
28 ST+ 02
29 1
30 ST+ 01
31 RCL 00
32 RCL 01
33 X=Y?
34 GTO 00
35 1
36 ST-05
37 RCL 05
38 X=0?
39 GTO 04
40 GTO 03
41 LBL 04
42 RCL 06
43 STO 05
44 LBL 06
45 RCL 04
46 ST+ 03
47 1
48 ST+ 01
49 RCL 00
50 RCL 01
51 X=Y?
52 GTO 00
53 1
54 ST- 05
55 RCL 05
56 X#0?
57 GTO 06
58 RCL 06
59 STO 05
60 GTO 01
61 LBL 00
62 RCL 00
63 PSE
64 RCL 02
65 PSE
66 RCL 03
67 PSE
68 RTN

Je pense que ce programme, largement amélioré, devrait être très rapide. :D

À bientôt.

PS : de manière surprenante, ma 41CX dont le voyant "BAT" était allumé depuis ce matin vient de totalement s'éteindre...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
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°86 : la spirale d'Ulam

Message par C.Ret »

Je me délecte, cette présentation est un délice.

Effectivement, cette méthode est bien différente des deux précédentes exploité précédemment.

Je viens de passer un peu de temps sur l'organigramme; c'est un délice, j'ai pu à la voler en faire un programme BASIC qui a fonctionné du premier coup.
mpo 86 - MARGE's C128D BASIC.gif
mpo 86 - MARGE's C128D BASIC.gif (40.64 Kio) Vu 9233 fois
C'est effectivement une bonne idée d'utiliser cette symétrie dans l'accroissement de X et Y puis le décroissement des deux mêmes X et Y.
J'ai moins aussi tracé des dizaine de spirale et rempli une bonne vingtaine de feuille Excel avant de maitriser convenablement le mouvement des coordonnées.

mais c'est un point crucial, car il y a plein de symétrie et de choses troublantes comme des propriété entre le nombres de nombres se trouvant entre deux carrés impairs successifs et le nombre d'octets de nombres que compose chaque boucle de la spirale.
mpo 86 -  8k spire structure.gif
mpo 86 - 8k spire structure.gif (53.39 Kio) Vu 9233 fois
Il y a là encore de quoi déceler d'autres symétries et périodicités, optimiser les algorithmes, simplifier tout cela et surtout pouvoir calculer x et y presque directement à partir d'un N donné.
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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

1.jpeg
1.jpeg (37.04 Kio) Vu 9206 fois
Voici un code pour les Psion 3, 3a et 3mx à partir de l'organigramme que j'ai donné hier ; a priori il doit aussi fonctionner pour les Serie 5, voire le Psion 7 :

Code : Tout sélectionner

Proc Uxy:
Local i%,x%,y%,n%,f%,g%,u%
Print "n= " :input n%
i%=1
IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
Boucle1::
f%=f%+1 :g%=f%
IF f% AND 1
	u%=1
ELSE
	u%=-1
ENDIF
Boucle2::
x%=x%+u% :i%=i%+1
IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
f%=f%-1
IF f<>0
	GOTO Boucle2
Endif
f%=g%
Boucle3::
y%=y%+u% :i%=i%+1
IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
f%=f%-1
IF f%<>0
	GOTO Boucle3
ENDIF
f%=g%
GOTO Boucle1
ENDP
Pour l'affichage du résultat, je n'ai pas voulu avoir à transférer les paramètres entre les procédures (ce qui équivaudrait à appeler une sous-routine en BASIC), donc je répète trois fois :

Code : Tout sélectionner

IF i%=n%
	Print n%,x%,y%
	get
	STOP
Endif
Oui, je sais, c'est pas bien.
J'améliorerai cela.

C'est la première fois que j'utilise la logique booléenne pour la parité, c'est bien pratique.

Enfin, l'utilisation des variables d'entiers simples limite le calcul à environ 32 000.

Sur le 3mx, le résultat est quasi instantané pour 2018 (moins d'une seconde) et prend 8 secondes pour 32 000.

(Illustration Mass Made Soul : https://www.massmadesoul.com/psion-3/)
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
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°86 : la spirale d'Ulam

Message par C.Ret »

Je ne connaissais pas l'OPL, mais cela me semble un petit language fort bien fait et sympathique.

Il y a donc une autre façon de suivre l'organigramme sans répétitions de la partie finale. En plus celle-ci est disposée à la fin du code ce qui est fort bien :

Code : Tout sélectionner

PROC Ulam:
  LOCAL N%,I%,x%,y%,f%,g%,u%
  I%=1 :g%=0 :u%=-1
  PRINT "n=", :INPUT N%
  DO                                             REM ==== boucle principale (Boucle1::)
    g%=g%+1 :u%=-u%                              REM      version sans test
    f%=g% :WHILE I%<N% AND F%>0                  REM ---- boucle sur X (boucle2::)
             x%=x%+u% :f%=f%-1 :I%=I%+1 :ENDWH
    f%=g% :WHILE I%<N% AND F%>0                 REM ---- boucle2 sur Y (Boucle3::)
             y%=y%+u% :f%=f%-1 :I%=I%+1 :ENDWH  
  UNTIL I%=N%
  PRINT N%,x%,y% :GET                             REM ---- Fin du calcul
ENDP
Modifié en dernier par C.Ret le 12 déc. 2018 11:35, modifié 3 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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

Oui, bravo, je constate que tu maîtrises fort bien ce langage pour un débutant !
En effet, les boucles WHILE... ENDWH et DO... UNTIL sont beaucoup plus appropriées ici. Je m'en suis aperçu seulement en ouvrant le gros manuel OPL en y cherchant autre chose - pour quelqu'un qui bosse sur ce langage depuis quelques années, c'est un comble ! Mais que veux-tu, je suis ainsi fait et j'ai fort bêtement suivi mon organigramme.
Je travaille (très laborieusement) à obtenir quelque chose sur l'écran. Réponse ce dimanche !

Edit : attention à tes déclarations de variables ; a priori, toutes les variables sont d'entiers simples et prennent la forme V%.
Modifié en dernier par Marge le 11 déc. 2018 21:06, modifié 1 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
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°86 : la spirale d'Ulam

Message par C.Ret »

Je n'ai pas de mérite, le Microsoft BASIC 0.7 de mon Commodore utilise aussi les structures Do...LOOP avec WHILE et UNTIL

Il y a d'ailleurs pas mal de points communs entre ce BASIC et l'OPL. Cela doit provenir de l'origine anglosaxone des concepteurs qui ont donc utiliser les même mnémoniques…

D'ailleurs à titre d'illustration, voici la version correspondante:

Code : Tout sélectionner

10 clr:i=1:u%=-1:input "n=";n
20 do :g%=g%+1:u%=-u%
30 :  f%=g%:do while i<n and f%>0: x%=x%+u%:f%=f%-1:i=i+1: loop
40 :  f%=g%:do while i<n and f%>0: y%=y%+u%:f%=f%-1:i=i+1: loop
50 loop until i=n
60 print n,x%;y%

Par contre, il faudra peut-être corriger mon listing OPL en ajoutant quelques sauts de ligne ou des : manquants !!

Je me suis plongé dans un peu de lecture, j'aime bien comme les fonctions statistiques sont intégrées à l'OPL ainsi que la gestion des enregistrements dans un fichier de données, sans compter tous les outils pour intégrer ses propres applications à l'environnement global du PSion.

C'est quand même de sacrées machines ! Agenda, répertoire, pense-bête, mais aussi très facilement customisable pour des calculs ou une gestion d'un fichier clients ou techniques personnalisé et spécifique. Le tout parfaitement portable, amené dans chacun de ses déplacements, en train, en avion, au bureau, au labo chez les clients à la maison mère ...


Risque pas d'emmener partout et aussi facilement mon C128D et ces deux moniteurs (malgré la poignée escamotable placée sur son flan ) :)



Bon, nous avançons. Il ne reste plus qu'à "vectorialiser" pour obtenir le résultat sans faire toutes ces aditions avec u% égal à +1 ou -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
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6186
Enregistré le : 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 »

Bonsoir, C.Ret,
Non, les sauts de lignes sont parfaits et mieux : on peut concaténer les boucles, ce que je vois pour la première fois :geek:
En revanche il faut impérativement placer l'espace et les deux points entre chaque instruction sur la ligne.
Enfin comme je l'ai signalé, tu dois déclarer des variables cohérentes.

À bientôt.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Répondre

Retourner vers « Tous les Pockets »