caloubugs a écrit : ↑14 juin 2014 09:55
zpalm a écrit :Une petite optimisation de plus avant d'aller dormir :
J'ai ajouté la ligne 15 et modifié la ligne 20 : inutile de tester si N=1 après la ligne 30 car (N*3+1)/2 est > N.
Je passe sous la barre des 12s avec 11,66s sur mon HP 71B fonctionnant à 634,448 kHz !
Alors là, chapeau !
...
Sur ma 71T (pour turbo
) : 11,5 s
Ayant depuis peu un nouvel engin à ma disposition, j'ai relu avec intérêt cette partie de la discussion afin de reproduire les codes pour HP-71B et d'en apprendre le fonctionnement.
J'ai donc suivit pas à pas l'évolution de l'algorithme et tenu compte des remarques et observation formulée par
caloubugs et
zpalm. Et comme eux, j'ai vu mon HP-71B aller de plus en plus vite pour trouver temps de vol et altitudes maximales.
Je me suis inspiré de leurs code pour produire un code plus court et plus efficace en ajoutant une astuce supplémentaire qui vient s'ajouter aux astuces déjà exploité par mes confrère et fait gagner quelque cycle :
L'idée est de ne pas mettre à jour l'altitude maxime ni faire le test de dépassement systématiquement.
On sait que l'altitude maximale ne croit que lorsque N est impair.
Tous les codes pour HP-71B publiés jusqu'ici mettent à jour l'altitude maximale lorsque N est impair en utilisant l'instruction M=MAX(M,N).
Mon idée était de tenter de gagner un peu de temps en effectuant la mise à jour de M après un test afin de ne pas exécuter systématiquement l'affectation avec la fonction MAX. J'utilise donc un code du type IF M<N THEN M=N
Le gain serait resté minime si je n'avais pas eu l'idée de ne plus faire le test de dépassement sauf lorsque que je mets à jour le registre M.
Après avoir un peu bataillé avec les contraintes imposées par le vérificateur de syntaxe du HP-71B, j'ai trouvé un moyen de faire une sorte de IF M<N THEN M=N @ IF M>Lim THEN DISP ("Dépassement")
Tenant compte de la suggestion de
zpalm et après avoir étudié le fonctionnement des exceptions mathématiques gérées sur l'HP-71B, j'en suis arrivé à passer sous la barre des 10 secondes pour 77031 et moins de 15 seconde pour 16777251 :
Code : Tout sélectionner
CAT MPO53 BASIC 167 12/08/20 21:25
1 INPUT "Syracuse ";N @ T=TIME @ S=0 @ M=N @ CFLAG INX
2 IF N=1 THEN DISP S;2*M;TIME-T @ END
3 IF NOT MOD(N,2) THEN N=N DIV 2 @ S=S+1 @ GOTO 1
4 N=(3*N+1) DIV 2 @ S=S+2 @ IF M>N THEN 3 ELSE M=N @ IF FLAG(INX) THEN DISP "Overflow" ELSE 3
RUN Syracuse 27 111 9232 3.17"
Syracuse 8388609 168 25165828 4.8"
Syracuse 77031 350 21933016 9.67"
Syracuse 8388607 473 188286357652 13.34
Syracuse 16777215 474 564859072960 14.55"
Syracuse 837799 524 2974984576 15.83"
Syracuse 33554431 Overflow
Décidément ce fil aura été le lieu de mon entrainement sur plusieurs machines HP Prime, fx-602p, TI-92 II et HP-71B.
Ainsi qu'un des premiers code en assembleur pour mon Commodore C128D...
WOW