MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

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 : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par C.Ret »

FLISZT a écrit : 04 déc. 2022 22:14 Présentation du système Ouragan

Code : Tout sélectionner

<< DUP { } →  n m l
    <<    CASE
		m 18 ALOG > THEN 200 END
		m 15 ALOG > THEN 88 END
		m 12 ALOG > THEN 74 END
		m 9 ALOG > THEN 60 END
		m 6 ALOG > THEN 45 END
		m 3 ALOG > THEN 30 END
		m 2 ALOG > THEN 16 END
		m 2 ALOG ≤ THEN 12 END
	  END 
	  'm' STO

Code : Tout sélectionner

	  { } { } 1 CF
	  m
	  WHILE 1 ≠

Code : Tout sélectionner

	  REPEAT m FIB DUPDUP
		n ≤ IF
		THEN UNROT + SWAP NEG
			 'n' STO+
			  1 'l' STO+
			 SWAP
			 "F" m + +
			 1 SF
		ELSE DROP2 
		     1 FS? 
		     1 == { 0 ::l STO+ } IFT
		END

Code : Tout sélectionner

		'm' DECR
	  END
		l REVLIST 
  >>
>>
2) Le module "Fiboget"

Code : Tout sélectionner

<<
	[[1 1][1 0]] 
	SWAP ^
	2 GET
>>
Je me suis d'abord demandé pourquoi il y avait un module accélérateur aussi sophistiqué avec pas moins de huit niveaux. Puis ensuite, j'ai réalisé qu'effectivement calculer les grands nombres de Fibonacci pouvait être très long en commençant avec 1+1 = 2 , 1+2 =3, 2+3 =5, ...

Et effectivement. Mais il y a quand même comme un petit problème. Le Grieg's Baron Von Nervigstück am Petrus me fait remarquer qu'il n'y a que huit niveaux et que la suite de l'algorithme ne décrémente la variable locale 'm' que pas à pas. Le Baron se demande donc s'il n'y a pas là un moyen de faire plus rapide. Surtout qu'avec un "Fiboget" aussi performant, il devrait être possible d'économiser des tentatives de pointage en utilisant l'inverse de la formule du Binet comme le fait zpalm pour mieux approcher la valeur m.

J'aurai volontiers essayé, mais nous n'avons pas ici de matériel aussi performant. Les seuls systèmes RPL mobilisés sur notre front sont les Achtundzwanzig Spezial en action au nord du pays.

Elles sont munies du code suivant qui formate parfaitement les rapports de tirs en laissant les décompositions sous forme algébrique, les indices sous forme de liste et le code résultat sous forme binaire. En interne, les valeurs de Fibonacci et leur indice sont mémorisées dans la pile sous forme de valeur complexe (k,Fk).

Code : Tout sélectionner

« 0 { } #0b → n S F b
  « 0 (1,1)                                             @ Initialise F0 et F1 respectivement (0,0)=0 et (1,1) 
    DO DUP2 OVER RE 1 - - +                             @ Calcul  F(k)=F(k-1)+F(k-2) et rempli la pile avec les (k,Fk)
    UNTIL n OVER IM  ≤ END                              @ Boucle tant que n≤Fk
    WHILE DUP RE                                        @ Tant que k>0
    REPEAT IF n S →NUM - OVER IM <                      @ Si le reste est plus petit que Fk 
           THEN DROP 0                                  @     Retire (k,Fk) de la pile et retenue binaire nulle
           ELSE C→R F ROT + 'F' STO                     @ sinon Store nouvelle liste des indices
                S a + DUP SIZE ROT EXSUB 'S' STO 1 END  @       Store nouvelle somme algébrique et retenue binaire unaire
           b SL + 'b' STO END END                       @ Store nouvelle valeur binaire 'b'
    DROP n S F b 20 MENU » »                            @ Affiche les quatre résultats et rétracte la barre de menu
Ci-dessous le résultat de la décomposition de l'entier 100:

Code : Tout sélectionner

4:                  100
3:             '89+8+3'
2:           { 11 6 4 }
1:       # 10000101000b
Ci-dessous le résultat de la décomposition de l'entier 221111:

Code : Tout sélectionner

4:                          221111
3: '196418+17711+6765+144+55+13+5'
2:          { 27 22 20 12 10 7 5 }
1:  # 100001010000000101001010000b
Ci-dessous le résultat de la décomposition de l'entier 123456789:

Code : Tout sélectionner

4:                                                            123456789
3: '102334155+14930352+5702887+317811+121393+46368+2584+987+233+13+5+1'
2:                                 { 40 36 34 28 26 24 18 16 13 7 5 2 }
1:                          # 1000101000001010100000101001000001010010b

Evidemment, le code pourrait être plus court... Je laisse à chaque Capitaine d'Unité le soin d'optimiser le code de ses dotations.
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.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

Le 11 nov. dernier, en lisant l'ordre de mission, nous avons fortement pensé, au sein de l'escadron 50G, que le mieux était peut-être de faire comme si nous ne l'avions pas reçu, mais… nous ne pûmes (du verbe pumer) nous résoudre à déserter. Et c'est, calculatrices au clair, que nous y sommes allés.

On n'a peut-être pas fait dans la dentelle, mais "de pile en listes", nous avons tenté d'avoir un système fonctionnel, puis d'améliorer notre "ouvrage".
Nous savions toutefois que notre système Ouragan manquait de rapidité sur des ennemis en faible nombre.

La possibilité d'apporter des améliorations à notre plan ne fait donc aucun doute.
D'ailleurs, le Baron Von Nervigstück am Petrus y est arrivé… wunderbar gut!

Sa version, testée sur une 28S que nous gardons en réserve, est plus rapide et plus courte !
Mais, du fait d'un problème de compatibilité, nous n'avons malheureusement pas pu la tester sur notre hp-50G, notamment avec de très très grands nombres :

⇒ EXSUB n'existe plus, depuis la sortie de la hp-48SX, et a été ""remplacée"", dans l'application EQW, par REPL.
Il y a peut-être une solution (avec une instruction programmable), mais elle reste à trouver…

(À noter, une coquille dans le code : un END surnuméraire dans l'avant-dernière ligne.
Le Baron serait sûrement furieux d'apprendre que son code a été altéré, même un peu… :D )
C.Ret a écrit : 26 déc. 2022 13:56 (…)

Code : Tout sélectionner

« 0 { } #0b → n S F b
  « 0 (1,1)                                             @ Initialise F0 et F1 respectivement (0,0)=0 et (1,1) 
    DO DUP2 OVER RE 1 - - +                             @ Calcul  F(k)=F(k-1)+F(k-2) et rempli la pile avec les (k,Fk)
    UNTIL n OVER IM  ≤ END                              @ Boucle tant que n≤Fk
    WHILE DUP RE                                        @ Tant que k>0
    REPEAT IF n S →NUM - OVER IM <                      @ Si le reste est plus petit que Fk 
           THEN DROP 0                                  @     Retire (k,Fk) de la pile et retenue binaire nulle
           ELSE C→R F ROT + 'F' STO                     @ sinon Store nouvelle liste des indices
                S a + DUP SIZE ROT EXSUB 'S' STO 1 END  @       Store nouvelle somme algébrique et retenue binaire unaire
           b SL + 'b' STO END END                       @ Store nouvelle valeur binaire 'b'
    DROP n S F b 20 MENU » »                            @ Affiche les quatre résultats et rétracte la barre de menu
(…)
Avec "2", par exemple, on obtient sur la pile, avant message d'erreur "Bad Argument Type" (si on tente de remplacer EXSUB par REPL) :

Code : Tout sélectionner

6:	0
5:	(1.,1.)
4:	(2.,1.)
3:	'a'
2:	1.
1:	2.
L'expression 'a' est pour nous un mystère, même en mode pas-à-pas (sur 28S).
Nous ne sommes pas des matheux mais des hussards vaguement poètes…

(le mot "hussard" a des origines hongroises, comme un certain L… ;) )
Modifié en dernier par FLISZT le 27 déc. 2022 01:07, modifié 1 fois.
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par Danny »

FLISZT a écrit : 26 déc. 2022 20:56 L'expression 'a' est pour nous un mystère, même en mode pas-à-pas (sur 28S).
C’est pas juste la variable locale a qui n’est pas déclarée, du coup il la prend telle quelle faute de pouvoir l’évaluer ? :geek:
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

Danny a écrit : 26 déc. 2022 23:29
FLISZT a écrit : 26 déc. 2022 20:56 L'expression 'a' est pour nous un mystère, même en mode pas-à-pas (sur 28S).
C’est pas juste la variable locale a qui n’est pas déclarée, du coup il la prend telle quelle faute de pouvoir l’évaluer ? :geek:
Comme 'a' n'est pas déclaré, je dirais que ça ne peut pas être une variable locale.
Il reste deux possibilités : une expression algébrique indéfinie ou un nom tout aussi indéfini.

La syntaxe de EXSUB est :

Code : Tout sélectionner

3:	'symb1'
2:	n
1:	'symb2'
avec pour résultat :

Code : Tout sélectionner

1:	'symb3'
Juste avant l'exécution de EXSUB, le contenu de la pile se présente sous la forme :

Code : Tout sélectionner

4:	…
3:	'a'
2:	n2
1:	n1
Si je prends mon exemple précédent (avec la valeur "2" ), la pile contient :

Code : Tout sélectionner

6:	0
5:	(1,1)
4:	(2,1)
3:	'a'
2:	1.
1:	2.
puis EXSUB retourne au niveau 1 :

Code : Tout sélectionner

4:	0
3:	(1,1)
2:	(2,1)
1:	2
Donc… ?! :geek:
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par C.Ret »

Oui désolé, je suis au front cette semaine.
Image
J'envois ce message par l'entremise de mon intendant.

Il y a effectivement deux grosses erreurs dans la retranscription du code:
La première a été notée par notre perspicace observateur FLISZT. Ach! Heureusement qu'il y a des gens de qualité dans nos rangs, attentifs et méticuleux, sans eux cette "saleté" de guerre serait encore bien pire qu'elle n'est actuellement.

En effet, il y a un END copié deux fois, mais surtout la variable a doit être entre guillemets simple. Ce n'est pas une variable locale, c'est un objet algébrique. Il faut aussi que l'HP-28S soit dans son mode nominal et autorise l'évaluation algébrique si le drapeau qui force l'évaluation numérique est levé, alors l'utilisation de cette inconnue explique les soucis rencontrés par le Brigadier FLISZT.

Voici une retranscription corrigée du code en dotation dans les Achtundzwanzig Spezial:

Code : Tout sélectionner

« 0 { } #0b → n S F b
  « 0 (1,1)                                             @ Initialise F0 et F1 respectivement (0,0)=0 et (1,1) 
    DO DUP2 OVER RE 1 - - +                             @ Calcul  F(k)=F(k-1)+F(k-2) et rempli la pile avec les (k,Fk)
    UNTIL n OVER IM  ≤ END                              @ Boucle tant que n≤Fk
    WHILE DUP RE                                        @ Tant que k>0
    REPEAT IF n S →NUM - OVER IM <                      @ Si le reste est plus petit que Fk 
           THEN DROP 0                                  @     Retire (k,Fk) de la pile et retenue binaire nulle
           ELSE C→R F ROT + 'F' STO                     @ sinon Store nouvelle liste des indices
                S 'a' + DUP SIZE ROT EXSUB 'S' STO 1 END@       Store nouvelle somme algébrique et retenue binaire unaire
           b SL + 'b' STO END                           @ Store nouvelle valeur binaire 'b'
    DROP n S F b 20 MENU » »                            @ Affiche les quatre résultats et rétracte la barre de menu
L'ennemi a fait une saillie ce matin, je suis coincé du mauvais coté de la rupture de la ligne de front, je ne peux rejoindre les unités Achtundzwanzig Spezial qui mitraillent de l'autre coté pour aller m'informer de la configuration exacte des drapeaux liés à l'évaluation.

Image
Danny a écrit : 26 déc. 2022 23:29
FLISZT a écrit : 26 déc. 2022 20:56L'expression 'a' est pour nous un mystère, même en mode pas-à-pas (sur 28S).
C’est pas juste la variable locale a qui n’est pas déclarée, du coup il la prend telle quelle faute de pouvoir l’évaluer ? :geek:
L'objet algébrique 'a' est la clef de voute de la construction de la somme algébrique:
La variable locale S contient la somme en cours. (par exemple '89+8' )
La séquence S a + produit la racine nécessaire la l'extension de S (c'est à dire '89+8+a' )
La séquence DUP SIZE donne la taille de l'expression '89+8+a' c'est à dire la position de l'objet algébrique a (ici 5 )
Finalement le ROT met en place les arguments '89+8+a' 5 3 de l'instruction EXSUB qui produira la nouvelle somme '89+8+3' à mémoriser dans 'S'.
Modifié en dernier par C.Ret le 08 avr. 2023 11:48, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

C.Ret a écrit : 27 déc. 2022 09:24 (…)
Il y a effectivement deux grosses erreurs dans la retranscription du code:
La première a été notée par notre perspicace observateur FLISZT. Ach! Heureusement qu'il y a des gens de qualité dans nos rangs, attentifs et méticuleux, sans eux cette "saleté" de guerre serait encore bien pire qu'elle n'est actuellement.

En effet, il y a un END copié deux fois, mais surtout la variable a doit être entre guillemets simple. Ce n'est pas une variable locale, c'est un objet algébrique.
(…)
J'ai saisi a (sans guillemets simples) dans notre hp-28S… ça fonctionne et c'est normal :
« a » est "interprété" comme étant un nom global indéfini − puisque n'ayant pas de valeur − et le RPL le retranscrit 'a'.
Ceci explique aussi que j'ai écrit 'a' dans mon post précédent, me contentant de recopier le contenu de la pile de notre hp-28S.
Il n'y avait donc qu'une seule coquille.
Un END de trop, même si l'on n'y voit rien, la calculatrice, elle, n'aime pas et le fait savoir. :)

C.Ret a écrit : 27 déc. 2022 09:24 Il faut aussi que l'HP-28S soit dans son mode nominal et autorise l'évaluation algébrique si le drapeau qui force l'évaluation numérique est levé, alors l'utilisation de cette inconnue explique les soucis rencontrés par le Brigadier FLISZT.
Ach… nicht genau.
Ich bitte um Entschuldigung, aber…
1°) Es ist Hauptmann (Capitaine) FLISZT (kein Brigadier) − les brigadiers n'ont plus accès au web, sauf les "radio"… bien trop d'abus !
2°) Le programme, avec ou sans guillemets, fonctionne parfaitement bien − et très rapidement ! − sur la hp-28S entreposée dans notre modeste musée. (votre musée, à l'état-major, n'est pas mal non plus … ;) :D )
3°) Le problème rencontré sur la hp-50G est d'un tout autre ordre.
  • EXSUB n'existe pas (plus depuis la hp-48SX).
    • S'il existe une commande équivalente ET programmable, mes hommes et moi ne la connaissons pas.
      • Les arguments attendus sur la pile risquent alors d'être différents (ou leur ordre).
    Tout ceci, s'il y a une solution, impliquera une refonte, au moins partiel, du programme.
C.Ret a écrit : 27 déc. 2022 09:24 L'objet algébrique 'a' est la clef de voute de la construction de la somme algébrique:
La variable locale S contient la somme en cours. (par exemple '89+8' )
La séquence S a + produit la racine nécessaire la l'extension de S (c'est à dire '89+8+a' )
La séquence DUP SIZE donne la taille de l'expression '89+8+a' c'est à dire la position de l'objet algébrique a (ici 5 )
Finalement le ROT met en place les arguments '89+8+a' 5 3 de l'instruction EXSUB qui produira la nouvelle somme '89+8+3' à mémoriser dans 'S'.
Et là, tout s'éclaire ! :idea: (LED)
C'est exactement comme utiliser {} (liste vide) quand on a besoin d'une liste qui va se remplir au fil du programme.
Au 50G, nous sommes plus coutumiers des listes que des expressions algébriques… (va falloir y songer).

Encore bravo Baron bravo !
(répété rapidement, ça pourrait faire un bon virelangue, voire un mantra pour les adeptes de la secte ! )
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par C.Ret »

FLISZT a écrit : 27 déc. 2022 18:13 J'ai saisi a (sans guillemets simples) dans notre hp-28S… ça fonctionne et c'est normal :
« a » est "interprété" comme étant un nom global indéfini − puisque n'ayant pas de valeur − et le RPL le retranscrit 'a'.
Ceci explique aussi que j'ai écrit 'a' dans mon post précédent, me contentant de recopier le contenu de la pile de notre hp-28S.
Il n'y avait donc qu'une seule coquille.
Ben oui justement, le danger est justement que le a sans les guillemets reste l'objet algébrique 'indéfini' (noté 'a') uniquement si aucun objet global a n'existe. Et c'est là le problème, si jamais un objet porte ce nom, alors il sera évalué et c'est la catastrophe...

Donc, il faut mettre les deux guillemets sinon danger !
FLISZT a écrit : 27 déc. 2022 18:13Un END de trop, même si l'on n'y voit rien, la calculatrice, elle, n'aime pas et le fait savoir. :)
C'est tout le problème du RPL, c'est illisible. Demandez à marge ce qu'il en pense car il a raison. Heureusement le parseur est rigoureux, bête et têtu.
FLISZT a écrit : 27 déc. 2022 18:13Et là, tout s'éclaire ! :idea: (LED)
C'est exactement comme utiliser {} (liste vide) quand on a besoin d'une liste qui va se remplir au fil du programme.
Au 50G, nous sommes plus coutumiers des listes que des expressions algébriques… (va falloir y songer).
C'est préférable, les listes sont des animaux bien sages et primitifs; Il existe même des languages de programmation basés sur les listes comme le LISP. Par contre, les objets algébriques sont plus vicieux et plus évolués; Ils nécessitent d'être domptés. Il existe même une science pour les maitriser ; l'Algèbre.

Entre autre propriété mortelle, les objets algébriques sont métamorphes. Une liste est initialisée par une liste vide et toutes opérations sur une liste ne donnera qu'une liste. Par contre, voyez comment dans le code, la somme algébrique S est initialement l'entier 0 et comment elle va se métamorphosée. Au 28S, nous ne nous basons pas sur des rites coutumiers, mais sur la magie et la rigueur des mathématiques.
MPO 114 - EXSUB commande exotique aujourdhui disparue.gif
MPO 114 - EXSUB commande exotique aujourdhui disparue.gif (39.74 Kio) Vu 3165 fois
Dans ce manuel, j'ai aussi retrouvé le numéro du drapeau qui peut poser problème, c'est le n°36 "Evaluation symbolique de fonction" et pour que le code fonctionne, il faut que ce drapeau soit dressé. S'il est baissé, l'utilisation de l'objet indéfini 'a' créera inéluctablement une erreur # 204h "Undefined Name". Il me parait donc judicieux d'ajouter une commande 36 SF au début du code; Qu'en pensez-vous ??

Image
Frédéric le Grand tenant dressé le drapeau n°36 des unités Achtundzwanzig Spezial à la bataille de Zorndorf après une bonne salve de Zeckendorf-Darstellung, peinture de Carl Röchling, 1904
FLISZT a écrit : 27 déc. 2022 18:13Ach… nicht genau.
Ich bitte um Entschuldigung, aber…
1°) Es ist Hauptmann (Capitaine) FLISZT (kein Brigadier)
Ah! Non, je n'ai ici aucune fiche de carrière d'un FLISZT avec un grade aussi élevé. Je n'ai sous les yeux que celle d'un Einjahriger-Freiwilliger FLISZT incorporé le 09 mars 2022 à 19:14.
Il n'y a aucun officier par ici qui n'est pas au moins servi fidèlement dix ans notre Empereur sans jamais avoir osé réclamer quoique ce soit et (bien souvent même) s'être contenter des miettes sans jamais avoir trouvé à y redire.

Mais, bon je profite que j'ai sorti les fiches de carrière pour épingler marge, zpalm et (malgré tout) FLISZT sur le Rangaufstiegs-Ehrentafel. Demain matin, je n'aurais plus qu'à inviter Son Excellence à bien vouloir ériger cette promotion.
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.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

C.Ret a écrit : 27 déc. 2022 21:32 Ben oui justement, le danger est justement que le a sans les guillemets reste l'objet algébrique 'indéfini' (noté 'a') uniquement si aucun objet global a n'existe. Et c'est là le problème, si jamais un objet porte ce nom, alors il sera évalué et c'est la catastrophe...
Si j'ai saisi a sans guillemets, c'est uniquement parce que je me suis efforcé de saisir à la lettre ce qui était écrit in dem Direktionale Handbuch.
Entre le petit écran de la hp-28, le mode INS qu'il faut activer, il y a à faire.
Quand je dis que ça marche, je parle bien sûr du cas présent.
Mais d'une manière générale, effectivement a au lieu de 'a' − et inversement − peut entraîner divers problèmes.

C.Ret a écrit : 27 déc. 2022 21:32 C'est préférable, les listes sont des animaux bien sages et primitifs; Il existe même des langages de programmation basés sur les listes comme le LISP. Par contre, les objets algébriques sont plus vicieux et plus évolués; Ils nécessitent d'être domptés. Il existe même une science pour les maîtriser ; l'Algèbre.
Liste vs algèbre, tout dépend de quoi l'on parle et d'où l'on se place.
La notion de liste a certainement plus inspiré la création de langages informatiques que l'algèbre à proprement parler.
Le seul langage algébrique utilisé couramment doit être le SQL. (?)

Oui, LISP… puis tous les langages dits "fonctionnels" − plus ou moins "purs" − qui s'en sont inspirés par la suite, sysRPL et userRPL compris.

En LISP, je ne suis pas sûr que l'on puisse faire un distinguo très évident entre "liste" et "algèbre", surtout si l'on s'en tient à la partie la plus basique de cette dernière : l'arithmétique.

En LISP les deux « s'interpénètrent ». On pourrait même dire que la liste englobe quasiment tout le reste en LISP.

Ex. : un simple 2+2 s'écrit (+ 2 2) en LISP, en tout cas en GNU CLISP 2.49 lancé via un "terminal" sur mon portable (Linux).

Une écriture très proche est possible, à priori dès la hp-48SX : {2 2 +} suivi de EVAL.

Dès la hp-28, "2 2 +" STR→ retourne 4.
Ceci venant du fait qu'une chaîne a une structure très proche (sinon identique ? ) de celle d'une liste, en sysRPL.

Pour revenir à nos chères machines, sur une hp-50G, je peux écrire :
{ 0 > "+" "−" IFTE }
Après un EVAL, le contenu de cette liste sera évalué comme un programme.
Par exemple, "+" sera affiché si dans la pile (au niveau 2) il y a une valeur strictement positive, "−" dans le cas inverse.

C.Ret a écrit : 27 déc. 2022 21:32 Dans ce manuel, j'ai aussi retrouvé le numéro du drapeau qui peut poser problème, c'est le n°36 "Evaluation symbolique de fonction" et pour que le code fonctionne, il faut que ce drapeau soit dressé. S'il est baissé, l'utilisation de l'objet indéfini 'a' créera inéluctablement une erreur # 204h "Undefined Name". Il me parait donc judicieux d'ajouter une commande 36 SF au début du code; Qu'en pensez-vous ??
Selon le hp28-BordbuchØ, le drapeau 36 est levé par défaut. Mais on peut toujours rajouter un 36 SF.
Ici au 50G, on ne touche jamais à ce drapeau de la hp-28S.
L'équivalent sur hp-50G doit être le −03… on n'y touche pas non plus.

C.Ret a écrit : 27 déc. 2022 21:32 Ah! Non, je n'ai ici aucune fiche de carrière d'un FLISZT avec un grade aussi élevé. Je n'ai sous les yeux que celle d'un Einjahriger-Freiwilliger FLISZT incorporé le 09 mars 2022 à 19:14.
Il n'y a aucun officier par ici qui n'est pas au moins servi fidèlement dix ans notre Empereur sans jamais avoir osé réclamer quoique ce soit et (bien souvent même) s'être contenter des miettes sans jamais avoir trouvé à y redire.
« Engagez-vous, rengagez-vous ! » qu'ils disaient. :pirat:
« Vous prendrez du galon ! » (… pas impérial, celui-là ! )

Noch ein mal, bitte ich um Entschuldigung, aber…
Qui dirige un escadron ? Et donc notamment le 50G ? Ein Kapitän ! Ein Hauptmann ! (officier subalterne)

Près de 40 ans au service de l'empire Ostro-Hungaro-Hewlitik, au sein du 15C, du X41, du 2-S8 et maintenant du 50G, sans oublier ma période OPEX au Canon aux côtés des services X07 du royaume du Unitedbritt, ou encore ma jeunesse à l'école "CZ" puis "57".
Avec cette vache de guerre, il a dû y avoir un problème dans les fichiers Personalressourcen impériaux.

NB : In Frankreich jusqu'à la révolution (hors Gendarmerie ou Police), et encore aujourd’hui dans certains pays, Brigadier était / est un grade très élevé ! (officier supérieur) ;)
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
Docd
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 195
Enregistré le : 13 déc. 2022 16:24
Localisation : Belgique

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par Docd »

Carabinier J. Offenbach au rapport!
Carabinier Offenbach.jpg
Carabinier Offenbach.jpg (52.62 Kio) Vu 2412 fois
Je viens de Belgique et j'ai traversé les lignes ennemies, marchant toujours de nuit et ????
... (*)
Was ??? Der Krieg ist vorbei ??? Unmöglich. Nein, Nein, Nein.
...
Ach, un armistice ??? C'est pas la paix, ça!!! Et s'ils reviennent ????
...
(*) Réponse de l'officier de garde en temps de paix

Bref, AU CAS OU, la résistance Belge a développé un CANON type X-07 de calibre BAS-IC 19/83 (335b) contenant des sous-munition de 14c en nombres variables, fort nuisible aux forces entières. Un test, discret, a éliminé en une fois (un tir contenant 21 sous-munitions) un bataillon entier de 14 échelons! Trente secondes puis plus rien. Wirklich wahr! Ja.

Gut, pour les archives, voici mon rapport et les plans de l'arme:

1 DATA 6,11,16,20,25,30,35,39,44,49,54,49,63,68
2 CLS:CLEAR:R=SQR(5)
3 DIM A(50):DIM B(68)
4 DEFFNRO(X) = (((X-FIX(X))>0.5)*-1)+FIX(X)
5 DEFFNFI(X)=((1+R)^X-(1-R)^X)/(2^X*R)
9 T1$=TIME$
10 INPUT F:L=LEN(STR$(F))-1:IF L>14 THEN CLS:GOTO 30
20 FOR I=1 TO L:READ D:NEXT I
30 FOR I=D TO 1 STEP -1
40 E=FNFI(I):E=FNRO(E):IF F<E THEN GOTO 60
50 B(I)=1:C=C+1:F=F-E:A(C)=I:? "F";A(C);"+ ";
60 NEXT I:? " 0":T2$=TIME$

Résultat:
99.999.999.999.999 (*) est décomposé en 21 éléments F(X) et 32 secondes:
F68+F65+F63+F61+F59+F54+F47+F43+F41+F39+F37+F35+F31+F29+F25+F22+F15+F13+F10+F8+F6
(*) Ce nombre est la limite possible en entiers avant de passer automatiquement à la notation EE.

Tailles:
335 bytes avant RUN
1433 après RUN

Fonctions:
DEFFNRO: Le Canon X-07 ne disposant pas de fonction ROUND, il a fallu écrire DEFFNRO. FIX est utilisé pour extraire la partie entière au lieu de INT car FIX se contente de tronquer alors que INT évalue et donne un entier différent selon que la source est positive ou négative (INT(-3.9)=-4 alors que INT (3.9)=3).

DEFFNFI: Donne directement le nombre entier correspondant à l'indice X dans la suite de Fibonacci, selon la formule de Binet:
(1+sqr(5))^X - (1-sqr(5))^X
------------------------------------
2^X x sqr(5)
Ici, sqr(5) est pré-calculée une fois (dans R) et passée comme second paramètre. Ceci évite trois calcul de racine carrée par appel à la fonction FNFI.

Tableaux:
A(): indices f de Fibonacci (f(A(x))), en séquence descendante (68 -> 1)
B(): codage de Zeckendorff (f(68)->f(1)) , si A(x) est rempli B(A(x)) vaut 1 sinon 0

Variables:
C: compteur d'indices de f
E: variable de calcul, réduit de f(x) à chaque première possibilité (F>f(x))
F: nombre à traiter (de 1 à 14 chiffres)
I: compteur de boucle for/next
L: longueur de F, sert d'indice pour lire la liste DATA ligne 1 (-1 est retiré de L lors du STR$(L) car le Basic x-07 ajoute un " " pour le signe lors de l'évaluation: LEN(STR$(12345)) ou LEN(STR$(-12345)) donnent tous deux 6)
Variables accessoires:
T1$: heure de démarrage du calcul (après initialisation des fonctions)
T2$: heure de fin du traitement complet

Ligne DATA:
DATA contient 14 valeurs, classées par nombre de chiffres générés par f(x). Par exemple f(6) est le dernier de la suite à générer un nombre à 1 chiffre (8), f(11) le dernier à générer un nombre à 2 chiffres (89), f(16) le dernier à générer un nombre à 3 chiffres (987), ...

Raisonnement:
Le nombre de chiffres composant le nombre à traiter permet de savoir rapidement avec quel indice de f() commencer le codage Zeckendorff. En déterminant le premier indice de départ, on épargne toutes les boucles descendantes à partir de 68. Par exemple, avec un nombre à six chiffres, on commence avec l'indice 30, gagnant ainsi 38 boucles de calcul. Suivant ce raisonnement, le programme détermine avec quel indice maximal commencer en testant la longueur du nombre à traiter et en choisissant l'indice f() maximal correspondant, puis l'analyse se fait en décrémentant vers 1.

Dob Zecret ... A prûler AVANT d'avoir lu!

Didier
Fonctionne à piles.
Sujet à des crises de tetrapilectomie sévère, parfois aigüe.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

Docd a écrit : 05 avr. 2023 01:35 Carabinier J. Offenbach au rapport!
Carabinier Offenbach.jpg
Je viens de Belgique et j'ai traversé les lignes ennemies, marchant toujours de nuit et ????
... (*)
Was ??? Der Krieg ist vorbei ??? Unmöglich. Nein, Nein, Nein.
Hallo!

Ja… ganz vorbei!
Tu n'as jamais fait partie de la cavalerie par hasard ? ;)
1 DATA 6,11,16,20,25,30,35,39,44,49,54,49,63,68
2 CLS:CLEAR:R=SQR(5)
3 DIM A(50):DIM B(68)
4 DEFFNRO(X) = (((X-FIX(X))>0.5)*-1)+FIX(X)
5 DEFFNFI(X)=((1+R)^X-(1-R)^X)/(2^X*R)
9 T1$=TIME$
10 INPUT F:L=LEN(STR$(F))-1:IF L>14 THEN CLS:GOTO 30
20 FOR I=1 TO L:READ D:NEXT I
30 FOR I=D TO 1 STEP -1
40 E=FNFI(I):E=FNRO(E):IF F<E THEN GOTO 60
50 B(I)=1:C=C+1:F=F-E:A(C)=I:? "F";A(C);"+ ";
60 NEXT I:? " 0":T2$=TIME$
J'ai vu ton programme hier soir, mais je ne l'ai essayé qu'aujourd'hui, histoire de faire prendre l'air à de mon X-07.

Avec ce gros pocket et son petit écran, si le nombre entré est suffisament grand, la suite de valeurs va s'afficher sur plus de quatre lignes et le début sera perdu. On peut certes faire un "ON/BREAK" puis un SHIFT+F5 (CONT) pour reprendre le calcul, mais ce n'est pas top.

J'ai essayé divers choses (sauf une à base de INIT#n,"CON:" etc, mais pas sûr que ça fonctionne, de toute façon).
Le plus fonctionnel que j'ai trouvé est de remplacer la ligne 50 par ces deux lignes :

50 B(I)=1: C=C+1: F=F−E: A(C)=I :REM jusqu'ici pas de changements

55 PRINT USING "!";"F";: PRINT USING "##";A(C);: PRINT USING "!";"+";

Ça permet d'afficher davantage de valeurs sur 4 lignes, mais cette solution a ses limites et pèse un peu plus lourd.

Quoi qu'il en soit, ton programme aura permis d'écrire, au son du canon, une nouvelle page à ce MPO tant historique - tout est vrai - qu'épique ! :D

https://www.youtube.com/watch?v=IQQYoq4kXyg … normalement ça devrait, au moins par moment, vous rappeler qq chose.
(composé par Schumann 50 ans après… )
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

Je m'y suis remis et j'ai pu améliorer ma précédente proposition en terme d'affichage.

On peut avoir le résultat de 99 999 999 999 sur l'écran, par ex.
Mais ça serait nettement mieux s'il n'y avait pas ce saut de ligne systématique après la dernière ligne affichée ! :evil:
S'il y a un moyen de l'éviter, je ne le connais pas.

1 DATA 6,11,16,20,25,30,35,39,44,49,54,49,63,68
2 CLS:CLEAR:R=SQR(5)
3 DIM A(50):DIM B(68)
4 DEFFNRO(X) = (((X-FIX(X))>0.5)*-1)+FIX(X)
5 DEFFNFI(X)=((1+R)^X-(1-R)^X)/(2^X*R)
9 T1$=TIME$

10 INPUT F:L=LEN(STR$(F))-1:IF L>14 THEN CLS:GOTO 30
20 FOR I=1 TO L:READ D:NEXT I
30 FOR I=D TO 1 STEP -1
40 E=FNFI(I):E=FNRO(E):IF F<E THEN GOTO 60

50 B(I)=1:C=C+1:F=F-E:A(C)=I


60 PRINT USING "!";"F";
65 IF A(C)>=10 THEN GOSUB 500 ELSE GOSUB 510
70 PRINT USING "!";"+";


80 NEXT I: PRINT "0";: T2$=TIME$
90 END


500 PRINT USING "##";A(C);: RETURN
510 PRINT USING "#";A(C);: RETURN
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
Docd
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 195
Enregistré le : 13 déc. 2022 16:24
Localisation : Belgique

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par Docd »

Ponjour Pruno,
Ja… ganz vorbei!
Tu n'as jamais fait partie de la cavalerie par hasard ? ;)
Ach, nein. Doude ma carrière tans les Carabiniers d'Offenbach et ch'en zuis vier! :lol:

Plus sérieusement, belle solution avec ce PRINT USING, qui permet aussi de se débarrasser du " " réservé au signe lors de l'impression d'un entier positif. Je n'y avais pas pensé. Si la taille du programme n'est pas un critère d'exclusion pour ce MPO, alors cette méthode pourrait être utilisée pour afficher le code binaire présent dans la table S(x), après une pression sur une touche pour effacer la solution sous forme de suite de f(x). Je m'y mets, pour voir.

Merci pour les commentaires constructifs et pour avoir pris le temps de revoir un plan de bataille en temps de paix!

Cordialement,

Didier
Fonctionne à piles.
Sujet à des crises de tetrapilectomie sévère, parfois aigüe.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

Hallo Tidier !

Hoe gaat het?
Docd a écrit : 06 avr. 2023 12:54
Ja… ganz vorbei!
Tu n'as jamais fait partie de la cavalerie par hasard ? ;)
Ach, nein. Doude ma carrière tans les Carabiniers d'Offenbach et ch'en zuis vier! :lol:
Au moins contrairement à la cavalerie, tu as de l'avance. :lol:
Plus sérieusement, il n'est pas si rare que des MPOistes aguérris reprennent un MPO, d'autant qu'il n'y en a pas un nouvau chaque semaine.

À propos de MPO, tu me suggérais avec raison que la solution précédente, à base de USING et sous-programmes, était peut-être un peu longue.

En voici, une un peu plus courte :

1 DATA 6,11,16,20,25,30,35,39,44,49,54,49,63,68
2 CLS:CLEAR:R=SQR(5)
3 DIM A(50):DIM B(68)
4 DEFFNRO(X) = (((X-FIX(X))>0.5)*-1)+FIX(X)
5 DEFFNFI(X)=((1+R)^X-(1-R)^X)/(2^X*R)

10 INPUT F:L=LEN(STR$(F))-1:IF L>14 THEN CLS:GOTO 30
20 FOR I=1 TO L:READ D:NEXT I
30 FOR I=D TO 1 STEP -1
40 E=FNFI(I):E=FNRO(E):IF F<E THEN GOTO 80
50 B(I)=1:C=C+1:F=F-E:A(C)=I


55 PRINT "F";
60 IF A(C)<10 THEN 70
65 PRINT USING "##";A(C);: GOTO 75
70 PRINT USING "#";A(C);
75 PRINT "+";


80 NEXT I: PRINT "0";
90 END


J'ai supprimé les deux PRINT USING "!"; qui étaient inutiles et qui étaient des restes d'essais.
Ils ont été remplacé par de simple PRINT (lignes 55 et 75).

J'ai également supprimé les appels à des sous-programmes, ce qui élimine deux GOSUB / RETURN.
Utilisation de IF THEN au lieu de IF THEN ELSE, etc.

Suppression des deux affectations T1$=TIME$ et T2$=TIME$ qui, telles quelles, ne servaient à rien.
La ligne 90 pourrait également être supprimée (ainsi que le END).

Ça faisait bien longtemps que je ne m'étais pas servi de mon X-07 ! :D
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Avatar du membre
Docd
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 195
Enregistré le : 13 déc. 2022 16:24
Localisation : Belgique

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par Docd »

Bonjour Bruno,
tout d'abord,
À propos de MPO, tu me suggérais avec raison que la solution précédente, à base de USING et sous-programmes, était peut-être un peu longue.
loin de moi la volonté de critiquer une solution à laquelle je n'étais pas arrivé seul. Si c'est ce que j'ai laissé paraître, c'est involontaire et je te prie de m'excuser.

Ensuite, j'ai fait pire: J'ai repris les "GOSUB" à mon compte et les ai utilisés à outrance dans un programme de 775 bytes, qui donne les valeurs F(), par deux lignes avec contrôle de l'affichage si plus de deux lignes, puis le code Z, toujours avec contrôle, puis les statistiques (nombre d'éléments F, nombre de bits). Ne correspondant plus à la définition générale des MPO, je ne le publie pas d'office (je peux te l'envoyer pas MP si tu es intéressé).
Suppression des deux affectations T1$=TIME$ et T2$=TIME$ qui, telles quelles, ne servaient à rien.
La ligne 90 pourrait également être supprimée (ainsi que le END).
les variables T1$ et T2$ m'ont servi à calculer le temps d'exécution, pour répondre aux critères MPO.
Idem pour la ligne "END" car j'avais compris qu'il fallait en avoir une (pour les calculatrices programmables, par exemple ou on mesure du LBL au R/S).

Enfin, merci pour tes commentaires constructifs, le temps que tu y as passé et pour tes améliorations.

Cordialement,

Didier
Fonctionne à piles.
Sujet à des crises de tetrapilectomie sévère, parfois aigüe.
FLISZT
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 655
Enregistré le : 09 mars 2022 19:14

Re: MPO n°114: Eine Zeckendorf-Darstellung ganzer Zahlen

Message par FLISZT »

Bonsoir Didier,
Docd a écrit : 07 avr. 2023 18:10
À propos de MPO, tu me suggérais avec raison que la solution précédente, à base de USING et sous-programmes, était peut-être un peu longue.
loin de moi la volonté de critiquer une solution à laquelle je n'étais pas arrivé seul. Si c'est ce que j'ai laissé paraître, c'est involontaire et je te prie de m'excuser.
Je te rassure tout de suite, il n'y a pas le moindre début d'une offense dans ce que tu as écrit.
J'ai lu ici ou ailleurs des échanges qui, eux, étaient assurément "musclés"… mais bon, nous sommes de grands garçons !

Je ne suis pas sûr que ma version finale soit plus courte que la tienne. Il me semble que mon programme faisait 429 octets (?).
Certes dans les MPO, on essaye de faire court, mais chacun est libre de publier ce qu'il veut.
Le plus important est sans aucun doute d'arriver à écrire quelque chose de fonctionnel et si ça répond à 100% aux "exigences" de l'énoncé, c'est encore mieux.
Perso, je préfère une version longue et bien écrite à une version "moche" et courte. Cela ne m'empêche pas néanmoins de publier du "long" et du "moche" à l'occasion… peut-être même plus souvent que ça ! :lol:

Quant au fait de reprendre à son compte les astuces ou trucs des autres… crois-moi ici, c'est monnaie courante ! :wink:
J'ai des noms… certains plus que d'autres ! :pirat:

Tu peux m'envoyer ta nouvelle version en MP si tu le veux, mais ne crains pas de la publier ici. Elle intéressera tout ceux qui ont un "basic".
Le BASIC du X-07 est assez standard pour être repris tel quel sur un autre "pocket" ou avec peu de modifications.
Tu pourras même profiter d'éventuelles suggestions de différents membres.

Finalement, c'est moi qui te remercie d'avoir permis à mon X-07 de se dégourdir les jambes (comme les chevaux) !
:D
Bruno
Sanyo CZ-0124 ? TI-57 ? HP-15C ? Canon X-07 + XP-140 Monitor Card ? HP-41CX ? HP-28S ? HP-50G ? HP-50G
Répondre

Retourner vers « Tous les Pockets »