Misez p'tit Optimisez n°53 : la suite de Syracuse

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

OlidaBel a écrit : 17 avr. 2021 11:28C'est bon j'ai trouvé, c'est la division par 2 qui coince, les nombres sont trop grands, tronqués sans doute...?. J'ai remplacé par le Modulo 2 et c'est OK.
Qui comprend cette limite ?
Bonjour, et bienvenue sur le forum !

Oui, la limite s'explique très bien. Pour calculer FRAC(n/2), il faut dans un premier temps calculer n/2. Or, on est limité à 12 chiffres, donc tout ira bien jusqu'à ce que l'on ai à diviser un nombre entier n impair de justement 12 chiffres supérieur ou égal à 2.10^11 car il y aura forcément un soucis pour représenter exactement le résultat de la division.

C'est ce qu'on appelle une erreur d'arrondi (round-off error), c'est l'apparition de ce type de soucis qui me permet d'arrêter le programme sur la version pour HP-71B par l'instruction TRAP INeXact.

Comme le suggère gégé, sur l'HP Prime qui ne gère pas les erreurs d'exception mathématiques, le mieux est d'utiliser le mode CAS qui permet de travailler sans souci avec des entiers représentés exactement jusqu'à plus de 1500 chiffres.


Voilà qui me donne l'occasion d'essayer la nouvelle version Béta- du tout nouveau firmware de mon HP Prime G1:
HP prime Graphing Calculator

Software version 2.1.14541 (2021 04 13)
Hardware Version: C
Serial Number: 3CD62202N1
Operating system: V0.050.640

(c)2021 HP development Compagny, L.P.
Notez, l'utilisation d'un onglet CAS dans la nouvelle disposition de l'environnement de programmation :
MPO53.syr_CAS_beta.gif
MPO53.syr_CAS_beta.gif (23.43 Kio) Vu 8848 fois
La capture suivante donne les résultats et le temps de calcul pour les valeurs entières exactes concernées.
MPO53 HP Prime Syracuse.png
MPO53 HP Prime Syracuse.png (12.48 Kio) Vu 8848 fois
remarquons que le temps de vol pour 63728127 n'est pas de 950 mais de seulement de 949. L'HP-48GX de notre ami OlidaBel semble être convenablement exploitée et trouve cependant la bonne altitude maximale.

Code : Tout sélectionner

#Cas                                 // Drapeau activemode CAS
SYR(n):=
BEGIN                               
  IP(n)►n►m;0►f;TICKS►t;             // Initialisation: n entier m maximum  t temps calculs
  WHILE n>1 DO                       // Tant que n>1 : 
    1+f►f;                           //   Incrémente Temps de Vol f
    IF even(n)                       //   Si n est pair
      THEN n/2►n                     //   alors divise n par deux
      ELSE 3*n+1►n;MAX(m,n)►m        //   sinon triple n et ajoute 1, met à jour maximum m        
    END;
  END;
  RETURN {f,m,(TICKS-t)*.001_(s)};   // Renvoi { ToF , MxAlt , eTime(ms) } 
END;
#end

P.S.: Les résultats obtenus avec le nouveau firmware de ma Prime pour 63728127 et 127456254 sont confirmés par mon HP-71B en respectivement 30.56" et 30.61".
Un HP-71B n'est donc que 13.7x plus lent qu'une HP Prime G1 !!
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.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 106
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par OlidaBel »

C.Ret a écrit : 17 avr. 2021 14:50 Bonjour, et bienvenue sur le forum !
Oui, la limite s'explique très bien. Pour calculer FRAC(n/2), il faut dans un premier temps calculer n/2. Or, on est limité à 12 chiffres, donc tout ira bien jusqu'à ce que l'on ai à diviser un nombre entier n impair de justement 12 chiffres supérieur ou égal à 2.10^11 car il y aura forcément un soucis pour représenter exactement le résultat de la division.

C'est ce qu'on appelle une erreur d'arrondi (round-off error), c'est l'apparition de ce type de soucis qui me permet d'arrêter le programme sur la version pour HP-71B par l'instruction TRAP INeXact.

P.S.: Les résultats obtenus avec le nouveau firmware de ma Prime pour 63728127 et 127456254 sont confirmés par mon HP-71B en respectivement 30.56" et 30.61".
Un HP-71B n'est donc que 13.7x plus lent qu'une HP Prime G1 !!
re-Bonjour !
Je me doutais bien que la division par 2 butait sur la mantisse ou qqch comme ça, j'ai assez vite incriminé la division. Mais MOD s'en sort bien dans ce cas-ci , une chance.
J'ai repris mon code initial écrit (en fait) sur l'émulateur iHP48, que j'ai ré-écrit dans la 50g (maintenant qu'elle est arrivée, autant en profiter). Ensuite j'ai vu ta version RPL 28S plus haut, bien torchée, bravo 8) . Je l'ai reprise, analysée et complétée avec les TICKS et MOD, comme ça je peux débloquer pour les plus grands nombres et comparer l'effet bénéfique du 100% pile versus utilisation de variables locales.
Dans ma version j'ai essayé cette fonction INCR (incrémente une variable et laisse la nouvelle valeur dans la pile).
Gestion misérable/innocente du MAX, ça se voit que je ne code plus :D :

(transfert du texte via SD...ça aussi c'est nouveau)

Code : Tout sélectionner

«TICKS SWAP 0. DUP -> m c
  « WHILE DUP 1. >
    REPEAT 'c' INCR DROP
      IF DUP 2. MOD
      THEN 3. * 1. +
        IF DUP m >
        THEN DUP 'm' STO
        END
      ELSE 2. /
      END
    END DROP c m
  » TICKS 4. ROLL - B->R 8192. /
»
pour 27 : 1.22 s.
pour 63,728,127 : 10.62 s

Ton code modifié avec utilisation du MOD et les TICKS

Code : Tout sélectionner

« TICKS SWAP DUP 0.
  WHILE ROT DUP 1. >
  REPEAT
    IF DUP 2. MOD
    THEN 3. * 1. +
    ELSE 2. /
    END ROT OVER MAX
ROT 1. +
  END DROP TICKS 4.
ROLL - B->R 8192. /
»
Plus court, plus rapide :pirat:

pour 27 sur 50GX : 0.95 s (et sur HP 48GX réelle : 2.61 s)
pour 63,728,127 sur 50GX : 8.5 s ( et sur HP 48GX réelle : 25.2 s)
pour 127456254 : 8.48 s

L'amélioration du programme (avec la gestion de la pile, donc) permet de gagner du temps de calcul : -20% !
Ta Prime est ici 3.8 fois plus rapide que la 50g. :wink:
Voilà un avantage de la Prime supplémentaire que j'ignorais : le travail sur les grands nombres.

Rem: c'est quoi ce caractère "triangle noir" ? le STO ? (edit : j'arrive pas à lancer ce programme, j'ai un (!) orange. La syntaxe est correcte. RTFM :lol: )
Modifié en dernier par OlidaBel le 17 avr. 2021 22:07, modifié 7 fois.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 106
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par OlidaBel »

gege a écrit : 17 avr. 2021 13:39 Bonjour,
De façon générale tout ce qui travaille sur des nombres entiers potentiellement grands devrait être programmé comme des fonctions "CAS".
Il me semble que les calculs sont alors exacts jusqu'à 1500 chiffres.
A tester
G.E.
oui, merci Gege. Je découvre... :ugeek:
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: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

OlidaBel a écrit : 17 avr. 2021 20:12 Ta Prime est ici 3.8 fois plus rapide que la 50g. :wink:
Non, c'est la calculatrice HP-50g qui est 3.8 foix plus lente qu'une HP Prime ! :)
Voilà un avantage de la Prime supplémentaire que j'ignorais : le travail sur les grands nombres.
Avantage directement hérité de l'HP-50g qui elle aussi permet d'utiliser les grands nombres et l'arithmétique exacte avec aussi des millier de chiffres possibles.

Il suffit pour cela de paramétrer convenablement le mode exact et d'utiliser des entier long (des entier sans le point décimal), comme le fait par exemple Gilles59 sur son HP-50g en mode UserRPL ou en NewRPL.

Voir son post du 25.oct.2017 00:35

Code : Tout sélectionner

«
 0 OVER
 DO
  SWAP 1 +   
  UNROT 
  DUP 2 MOD   « 3 * 1 + SWAP OVER MAX » « 2 / SWAP » IFTE
  UNROT 
 UNTIL DUP 1 == END  
 DROP 2 ->LIST
»
Certes, le mode exact sur l'HP-50g permet les entiers longs ou très longs au détriment de la vitesse contrairement au NewRPL qui le fait sans perte d'efficacité.

Rem: c'est quoi ce caractère "triangle noir" ? le STO ? (edit : j'arrive pas à lancer ce programme, j'ai un (!) orange. La syntaxe est correcte. RTFM :lol: )
C'est l'affection postfixe des valeurs obtenue en pressant sucessivement [Shift] et [Sto►].

Code : Tout sélectionner

#Cas
SYR(n):=
BEGIN
  IP(n)►n►m;0►f;TICKS►t;
  WHILE n>1 DO 1+f►f;
    IF even(n)
      THEN n/2►n
      ELSE 3*n+1►n;MAX(m,n)►m
    END;
  END;
  RETURN {f,m,(TICKS-t)*.001_(s)};
END;
#end
A coté du point d'exclamation, il y a marqué quoi ?
Sur l'HP Prime, ne pas oublier de cocher la case devant CAS en créant le programme et de l'exécuter en mode CAS (le lien est dans le menu (Vars) > ²Program > °SYR
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.
OlidaBel
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 106
Enregistré le : 04 avr. 2021 16:09
Localisation : 50.693165,4.573478

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par OlidaBel »

C.Ret a écrit : 18 avr. 2021 08:51 Non, c'est la calculatrice HP-50g qui est 3.8 foix plus lente qu'une HP Prime ! :)
Je te remercie ! ça fait mal ! :( :D
Et je confirme, après avoir enfin trouvé comment activer le mode exact, ça passe. Mais vachement moins vite 8O
Le mot "exact" était bien celui à rechercher dans la doc, j'ai pas trouvé tout de suite.
C.Ret a écrit : 18 avr. 2021 08:51 Il suffit pour cela de paramétrer convenablement le mode exact et d'utiliser des entier long (des entier sans le point décimal), comme le fait par exemple Gilles59 sur son HP-50g en mode UserRPL ou en NewRPL.
subtil quand même.
nettoyage du code , on enlève les ".", et l'option CAS exact, j'obtiens la bonne valeur sur 123456789123456789123
C.Ret a écrit : 18 avr. 2021 08:51 A coté du point d'exclamation, il y a marqué quoi ?
Sur l'HP Prime, ne pas oublier de cocher la case devant CAS en créant le programme et de l'exécuter en mode CAS (le lien est dans le menu (Vars) > ²Program > °SYR
Rien écrit, juste le "!". Je lançais le programme à partir du menu Program (fort logiquement quoi !), que dalle => "!".
Après réflexion, j'ai fait littéralement confiance à ton explication, je vois d'où démarre le programme (en ligne de commande CAS avec le paramètre entre ( ) ) : encore tout retourné par la logique de fonctionnement et l'ergonomie de cette calculette, misère. Admiration ou découragement ? :| :D
Ce qui est certain, c'est qu'elle dépote bien.
Merci beaucoup, ça m'aide!
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

J'ai tapé tel quel le programme de C.Ret initialement prévue pour le HP-41C (j'ai juste enlever la pause du pas 26) sur un vrai calculateur WP 34S (qui est la calculatrice financière HP 30b modifiée), je suis impressionné par les vitesses des réponses qui sont comparables à celles de la HP Prime 8O

Pour N = 27 : 0,15 seconde
Pour N = 837799 : 1,1 seconde
Pour N = 63728127 : 2,1 secondes
Pour N = 127456254 : 2,1 secondes

Je vous ai fait une petite vidéo de 30 secondes

La machine a également un mode SLOW (en cas de piles faibles), dans ce cas on obtient :

Pour N = 27 : 0,15 seconde
Pour N = 837799 : 2 secondes
Pour N = 63728127 : 3,9 secondes
Pour N = 127456254 : 3,2 secondes

Est-ce que quelqu'un a les temps avec un HP-42S ou un DM 42 (SwissMicro) ? Et pourquoi ont-ils mis un processeur aussi rapide sur une calculatrice financière ??

Code : Tout sélectionner

001 LBL A
002 0
003 x[<->] Y
004 ENTER[^]
005 ENTER[^]
006 LBL 00
007 CLx
008 1
009 x=? Y
010 GTO 01
011 STO+ T
012 STO+ X
013 /
014 ENTER[^]
015 FP
016 x=0?
017 GTO 00
018 CLx
019 6
020 [times]
021 1
022 +
023 x>? Y
024 STO Y
025 ENTER[^]
026 GTO 00
027 LBL 01
028 R[v]
029 R[v]
030 END
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: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

Bien la vidéo, on voit les résultats s'afficher presque instantanément.

Et pourtant mon code pour HP-41C n'est peut-être pas le plus adapté à une WP 34S !

Pourquoi ne pas essayer avec un code spécialement fait pour cette machine , comme celui posté par zpalm le 27 mars 2014 à 00:20

Code : Tout sélectionner

001 LBL A          011 3
002 FILL           012 *
003 STO- Y         013 INC X
004 x≠1?           014 x>?Z
005 SKIP 002       015 STO Z
006 DROP           016 BACK 008
007 RTN            017 2
008 INC Y          018 /
009 EVEN?          019 BACK 015
010 SKIP 006
Il doit être plus rapide car il utilise plus directement la ile et les capacités de la WP 34S :)

Je ne sais pas pourquoi une 'simple' calculatrice financière a un processeur aussi rapide ... Mais en tout cas ça dépote bien :D
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
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Merci C.Ret, je n'avais pas vu le code de zpalm spécial WP 34S ! On obtient effectivement des temps légèrement inférieurs (de l'ordre de 10%).

Pour N = 27 : 0,12 seconde
Pour N = 837799 : 1 seconde
Pour N = 63728127 : 1,9 secondes
Pour N = 127456254 : 1,9 secondes
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Ben »

Ca faisait longtemps que je n'avais plus rien publié. Ma petite contribution en version assembleur 6502. Cette version n'utilise que la page 0. Pour le moment, il ne compte que le temps de vol.

Contrairement à son équivalent BASIC, la réponse est instantanée. Je suis toujours surpris de la différence de vitesse. :-)

Code : Tout sélectionner

$FA ADR1 Lo
$FB ADR2 Hi
$FC TEMP Lo
$FD TEMP Hi
$FE Compteur de vol

d c00 c4a
. 00c00  d8       cld
. 00c01  a9 00    lda #$00
. 00c03  85 fc    sta $fc
. 00c05  85 fd    sta $fd
. 00c07  85 fe    sta $fe	Initialise les zones de travail
. 00c09  46 fb    lsr $fb
. 00c0b  66 fa    ror $fa	
. 00c0d  b0 0f    bcs $0c1e	Test si chiffre pair ou impair
. 00c0f  e6 fe    inc $fe	Pair - Addition le vol
. 00c11  a9 01    lda #$01
. 00c13  c5 fa    cmp $fa
. 00c15  d0 f2    bne $0c09
. 00c17  a9 00    lda #$00
. 00c19  c5 fb    cmp $fb
. 00c1b  d0 ec    bne $0c09	Test si le nombre restant est à 1
. 00c1d  60       rts		Fin du programme
. 00c1e  e6 fe    inc $fe	Impair - Addition le vol
. 00c20  26 fa    rol $fa
. 00c22  26 fb    rol $fb	Rétabli le nombre (car /2 pour le test)
. 00c24  a5 fa    lda $fa
. 00c26  0a       asl
. 00c27  85 fc    sta $fc
. 00c29  a5 fb    lda $fb
. 00c2b  2a       rol
. 00c2c  85 fd    sta $fd	Multiplie le nombre par 2 (*2)
. 00c2e  18       clc
. 00c2f  a5 fa    lda $fa
. 00c31  65 fc    adc $fc
. 00c33  85 fc    sta $fc
. 00c35  a5 fb    lda $fb
. 00c37  65 fd    adc $fd
. 00c39  85 fd    sta $fd	Addition encore une fois le nombre (*3)
. 00c3b  18       clc
. 00c3c  a9 01    lda #$01
. 00c3e  65 fc    adc $fc
. 00c40  85 fa    sta $fa
. 00c42  a9 00    lda #$00
. 00c44  65 fd    adc $fd
. 00c46  85 fb    sta $fb	Ajoute 1 au nombre (+1)
. 00c48  4c 09 0c jmp $0c09	Boucle
Ben
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: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

Salut ben,

Si je comprends bien, on charge les octets $FA et $FB avec l'argument n. c'est un peu différent de ma façon de faire où l'argument était saisi par l'utilisateur en haut de l'écran 40 col.

Par exemple pour mesurer le temps de vol de n= 27, on met l'adresse $00FB à zéro et $00FA à $1B ? (C'est du petit indien bien typique des CBM - j'aime bien -)
POKE 250,27:POKE 251,0
Puis on lance le code à l'adresse $0C00
SYS 3072
Et l'octet $00FE contient le temps de vol .
? PEEK(254)
Devrait afficher 111.
Je poste ce message et j'allume mon C=128D

Les octets $00FC et $00FD ne servent qu'au calcul des 3n+1.
Comme la valeur n est sur 16 bits, il n'y a pas de souci tant que la valeur maximale ne dépasse pas 65535. Ce qui doit être le cas avec n=27.

J'aime bien l'enchainement LSR $fb ROR $fa pour diviser par deux est obtenir la parité dans le drapeau indicateur C.
On peut aussi obtenir la parité de la valeur n (stockée en $00FB-$00FA) sans faire la division par LDA #1 BIT $FA et l'indicateur Z est levé (set) pour les nombres n impairs (car le bit0 (2°= 1) est à 1) ou couché (clear) pour les n pairs (car bit0 est à 0 ).

On pourrait modifier un peu ton code pour effectuer 3n+1 sans utiliser $00FC et $00FD qui sont alors disponibles pour mémoriser l'altitude maximale. Comme il n'y a pas d'instruction MAX sur un 6502, une solution serait de détecter une valeur n (dans $FB:$FA) plus grande que m (dans $FD:$FC) à l'aide du signe (indicateur N) d'une ou deux comparaisons CMP.

Reste à trouver le moyen d'utiliser les registres A, X ou Y du 65022 pour calculer 3n+1 et en profiter pour faire un test d'arrêt en cas de dépassement - une TRAP INX sur 6502 !! j'aime bien l'idée ).

C'était justement l'idée d'étendre à de grand nombre cette technique et de ne pas perdre de temps qui m'avais conduit à utiliser un calcul chiffre à chiffre directement dans l'écran 40 col. La détection de dépassement avait été réglée à 240 chiffres c'est à dire exactement 6 lignes d'affichage.


EDIT: Le code de ben m'a bien inspiré pour cette version qui fonctionne de la même façon, mais qui mémorise l'altitude MAX dans les registres $FC:FD.
mpo 53 - Assembler 6502-6510 page zero Syracuse 16bits max.gif
mpo 53 - Assembler 6502-6510 page zero Syracuse 16bits max.gif (37.78 Kio) Vu 8282 fois
Sur un Commodore C128D la recherche du temps de vol et de l'altitude maximal de 27 paraît être immédiate:
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 : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par C.Ret »

Après la phase de conception, il y a d'abord la phase de saisie du code, ici directement dans le moniteur intégré de l'engin:
mpo 53 -  Assemblage Syracuse BEN - 80Col - C128.gif
mpo 53 - Assemblage Syracuse BEN - 80Col - C128.gif (7.77 Kio) Vu 8242 fois
Puis la sauvegarde (indispensable, en langage machine, la moindre erreur et c'est le plantage du système et il faudra, au mieux faire un soft reset, mais en général il faut éteindre et rallumer; tout est perdu.

Enfin, on peut effectuer un petit test, ici avec n=27 qui est saisi >FA +27 +0 afin de profiter de la conversion DEC→HEX automatique du moniteur.
Le moniteur a la bonneidée de nous donner en retour le contenu de la mémoire. On vérifie que n=27 c'est à dire FA: contient B1 et FB:00
Puis on lance le code (sous programme en fait lancé par la commande Jump ) à l'adresse 0C00 en bank 0 (d'où le 00C00 ).
Le curseur réapparait immédiatement.
mpo 53 -  Sauvegarde Syracuse BEN et execution pour n=27.gif
mpo 53 - Sauvegarde Syracuse BEN et execution pour n=27.gif (3.5 Kio) Vu 8242 fois
Un M FA FE va permettre de lire les résultats du calcul : n=1 (FA:01 FB:00) on est bien arrivé à terme. l'altitude maximale m=9232 (FC:10 FD:24) et le temps de vol T = 111 (FE:6F) :
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
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Je suis actuellement en train de découvrir le calculateur HP 19Bii Business Consultant, je pensais m'ennuyer (car pas spécialiste des finances et a priori machine non programmable) mais grâce à un post de @zpalm & @Miskatonic91, j'ai récupéré le livret "Technical Applications" de chez HP qui permet d'étendre largement les possibilités en utilisant LET et GET.

Comme d'habitude je ferai une vidéo plus complète sur la machine mais en attendant voici ma version pour Syracuse :

Code : Tout sélectionner

SYR=0*N*T*M+Σ(I:1:1000:1:0*(L(M:MAX(M:N))+L(T:T+1)+L(N:IF(MOD(N:2)=1:3*N+1:N/2))+IF(N=1:1/0:0)))
Image

Image

Image

PS. Il faut moins de 15 secondes pour avoir les résultats avec N=27 et avec N = 8400511, elle trouve le temps de vol 685 et le max 159 424 614 880 en 1 ' 30 "
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Je viens d'acquérir une CASIO FX-602P, c'est vraiment une machine sympathique et agréable à programmer. Mon premier essai est comme d'habitude la suite de Syracuse, j'ai vu que @meridian en avait fait une version en 2015, la mienne est assez différente d'où l'éventuel intérêt de mon post :

Code : Tout sélectionner

"nb" HLT Min01 Min00	# Mémoire 1 contiendra le Max
1 X↔M00			# Mémoire 0 = TOF
LBL0
÷ 2 ×
FRAC x=0 GOTO1		# Si pair on multiplie par... 1
6 +			# sinon par 6 et on ajoute...
LBL1
1 Min0F =		# ...1, que l'on met dans mémoire F
x=F GOTO2		# Si x = 1 on a terminé
ISZ			# TOF augmente de 1
X↔M01 Min0F X↔M01	# Max dans mémoire F et récup X
x≥F Min01		# Si X≥Max on remplace le Max
GOTO0
LBL2
"TOF=AR00" HLT		# On récupère TOF
"MAX=AR01"		# et le Max
Environ 23 secondes avec nb=27 pour retrouver TOF=111 et MAX=9232
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Version RPN pour la calculatrice financière HP 30b :

Code : Tout sélectionner

Pas	Code
1	Syr		; Nom du programme
2	STO 2		; Registre pour Max atteint
3	0
4	STO 0		; Tps de vol (TOF)
5	) Swap		; On récupère N
6	Lbl 01
7	2
8	/
9	=		; On duplique N/2 sur la pile
10	Math		; Partie entière
11	Up		; sur
12	Up		; 3 octets !
13	) Swap
14	?≠		; N/2 ≠ ENT(N/2) ?
15	GT 03		; Si vrai -> Lbl 03
16	Lbl 02
17	1
18	STO + 0		; 1 + TOF -> TOF
19	) Swap
20	?=		; N = 1 ?
21	GF 01		; Si Faux -> Lbl 1
22	RCL 2		; Affichage
23	Disp9		; Max
24	RCL 0		; et
25	R/S		; TOF
26	Lbl 03		; Nb impair
27	6		; N/2 * 6 + 1 = 3N + 1
28	*
29	1
30	+
31	RCL 2		; Max
32	) Swap
33	?≥		; Max ≥ N ?
34	GT 02		; Si oui -> Lbl 2
35	STO 2		; Remplacer le max
36	Gto 02
Résultat instantané pour N = 27 (Max = 9232, TOF = 111)
A peine une seconde pour N = 8388607 (Max = 188286357652, TOF = 473)

Si vous voulez voir d'autres exemples en vidéo (tableau d'amortissement, marchand de glaces, âge de votre mère, années identiques), c'est par là.
Avatar du membre
Schraf
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 499
Enregistré le : 05 mars 2020 20:45
Contact :

Re: Misez p'tit Optimisez n°53 : la suite de Syracuse

Message par Schraf »

Bonjour à tous,

Nouvelle idée concernant la fameuse conjecture de Syracuse ! Un prof de maths de ma région et amateur de la HP-48G montre sur Twitter l'utilisation de la représentation graphique via le mode Truth.

Après avoir de mon côté proposé quelques exemples (représentation des nombres entiers, des carrés, des coefficients binomiaux et de la suite de Fibonacci), je me suis dit que ce serait peut-être une bonne idée de faire la même chose pour Syracuse.

En effet, l'intérêt est que l'on pourrait lire graphiquement et assez rapidement toutes les valeurs exactes de la suite. Par exemple ci-dessous on veut lire la valeur exacte du pic, il suffit de mettre un cache sur l'écran de la machine pour bien repérer la colonne correspondante et de récupérer les numéros des lignes, ici k = 4, 10 et 13. Le nombre cherché est donc 2^4 + 2^10 + 2^13 = 9232 !

9232 en binaire
9232 en binaire
syr_bin.png (167.8 Kio) Vu 2471 fois
L'autre intérêt que j'y vois est que 2^20 dépasse 1 million, il suffit donc de très peu de pixels en hauteur pour les représentations graphiques. Par exemple la CASIO fx-7000G a 96*64 pixels, on pourrait représenter l'intégralité d'une suite sur plusieurs lignes, chacune 20 pixels de haut.

Le script en Python : https://my.numworks.com/python/schraf/bin_syr
Répondre

Retourner vers « Tous les Pockets »