Misez rapide, accélérez n°1

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 rapide, accélérez n°1

Message par C.Ret »

A la lecture de vos expérimentation et de vos implémentations, il semnle fort que mon programme pour HP-41C soit ralenti par tous ces XEQ.

En fait XEQ GOSUB et GSB même poisse.

Je décompile donc mon code et propose celui-ci :

Code : Tout sélectionner

001 LBL "MRA
002   RCl X  2  MOD  x=0? GTO 01  RDN
008   RCl X  3  MOD  x=0? GTO 01  RDN
014   RCL X  5  MOD  x=0? GTO 01  RDN
020   RCl X  7  MOD  x=0? GTO 01  RDN
026 LBL 00
027   RCL X  4  LastX  +  MOD  x=0? GTO 01  RDN
035   RCL X  2  LastX  +  MOD  x=0? GTO 01  RDN
043   RCL X  4  LastX  +  MOD  x=0? GTO 01  RDN
051   RCL X  2  LastX  +  MOD  x=0? GTO 01  RDN
059   RCL X  4  LastX  +  MOD  x=0? GTO 01  RDN
067   RCL X  6  LastX  +  MOD  x=0? GTO 01  RDN
075   RCL X  2  LastX  +  MOD  x=0? GTO 01  RDN
083   RCL X  6  LastX  +  MOD  x=0? GTO 01  RDN
091   LastX  x^2  X<>Y  x>y? GTO 00  
096   STO L
097 LBL 01
098   LastX  TONE 1
100 STOP
.END.

Ce qui donne le petit résumé des performances suivantes:

Code : Tout sélectionner

              zpalm     zpalm     C.Ret    C.Ret      C.Ret     gégé alain1261 caloubugs
            HP-41CX    HP-29E     C128D    HP-41C    HP-28S   PB-700    PB-100     TI-95
     1231      3"58                  "1       3"2        "4                          1"5
     2007       "90                  "1       1"4        "4
    71327     21"33      24"8        "8      18"8       2"2      27"         3"      7"
   123679     26"27      29"9        "9      22"7       3"0       5"         8"
  1000003   1'17"80    1'28"5       2"7    1'07"7       5"9    1'19"        14"     23"
  2100151      2"85                  "1       3"2        "7
  8043509   3'13"64    3'41"9       6"7    2'47"8      14"1    3'14"
 10000019   4'02"71    4'36"7       8"4    3'30"7      18"9                       2'06"
 31629593   7'10"40    8'11"0      14"8    6'13"5      31"8
998812807                        1'23"0              3'00"4
999999937                        1'23"2   35'08"     3'00"7                      11'45"

Pour HP-28S, j'avais pensé publier:

Code : Tout sélectionner

MRAs:
« « IF DUP2 MOD NOT THEN KILL END »  → TEST
  « 2 TEST EVAL  1 + TEST EVAL  2 + TEST EVAL  2 + TEST EVAL
    DO
       4 + TEST EVAL  2 + TEST EVAL  4 + TEST EVAL  2 + TEST EVAL  
       4 + TEST EVAL  6 + TEST EVAL  2 + TEST EVAL  6 + TEST EVAL
    UNTIL  DUP2 SQ <  END
    DROP  » »
Mais je prends le temps d'essayer le 'code décompilé' suivant avant :

Code : Tout sélectionner

MRA:
« 2   IF DUP2 MOD NOT THEN KILL END
  1 + IF DUP2 MOD NOT THEN KILL END
  2 + IF DUP2 MOD NOT THEN KILL END
  2 + IF DUP2 MOD NOT THEN KILL END
  DO
     4 + IF DUP2 MOD NOT THEN KILL END
     2 + IF DUP2 MOD NOT THEN KILL END
     4 + IF DUP2 MOD NOT THEN KILL END
     2 + IF DUP2 MOD NOT THEN KILL END
     4 + IF DUP2 MOD NOT THEN KILL END
     6 + IF DUP2 MOD NOT THEN KILL END
     2 + IF DUP2 MOD NOT THEN KILL END
     6 + IF DUP2 MOD NOT THEN KILL END
  UNTIL  DUP2 SQ <  END
  DROP
»
Cette dernière version a été saisie à l'aide des chaines de caractères, modififées puis convertie en programme avec la commande STR->. C'est l'équivalent des recopies de ligne en BASIC.

Sans surprise, cette dernière version est plus rapide, 999999937 est résolu en 3'00" au lieu de 3'45" avec la version compacte.



En cours, BASIC : TI-74, PC-1360 et PC-1211
Modifié en dernier par C.Ret le 30 août 2015 09:58, 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.
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez rapide, accélérez n°1

Message par caloubugs »

C.Ret a écrit : Pour HP-28S, j'avais pensé publier:

Code : Tout sélectionner

MRAs:
« « IF DUP2 MOD NOT THEN KILL END »  → TEST
  « 2 TEST EVAL  1 + TEST EVAL  2 + TEST EVAL  2 + TEST EVAL
    DO
       4 + TEST EVAL  2 + TEST EVAL  4 + TEST EVAL  2 + TEST EVAL  
       4 + TEST EVAL  6 + TEST EVAL  2 + TEST EVAL  6 + TEST EVAL
    UNTIL  DUP2 SQ <  END
    DROP  » »
C'est vrai que la disposition du modulo dans le langage est un sacré avantage et évite de faire une division et une extraction de valeur décimale tout en ayant un contrôle de test super simplifié.

Sinon, si tu t'occupes de la TI74, je m'attaque à la HP71B, la Casio Z-1GR, la PB1000 et le Canon X07 (pas tout en même temps !)
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez rapide, accélérez n°1

Message par caloubugs »

alain1261 a écrit :Sans surprise, en utilisant GOSUB, c'est deux fois plus lent. :(
On pert donc l'avantage de l'algorithme optimisé à cause de la lenteur du GOSUB ! :?
Mouaip, les sauts dans les programmes, c'est pas top pour la rapidité. Dire que les sous-programmes sont faits pour gagner du temps c'est juste côté codage et aussi pour l'espace mémoire. Toute la difficulté sur ces machines est justement de jongler entre les gains horloge et les contraintes précédentes...

Mais 2 fois plus de temps par ce biais, ça fait quand même mal...
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2930
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez rapide, accélérez n°1

Message par zpalm »

C.Ret a écrit :C'est clair que ce code, bien que plus court, est bien plus lent !

Est-ce la fonction MOD ou le grand nombre d'appels XEQ 02 ? :?:
la fonction MOD est une excellente idée!! En remplaçant dans mon programme les séquences / FRC par MOD je gagne 20% de rapidité !!
Et ça me permet comme tu l'as fait d'utiliser le registre LASTx pour stocker le diviseur (au lieu du registre 01) pour un gain total de 28% :D
Par contre j'ai toujours besoin du registre 0 pour stocker le nombre N, je n'ai pas vu d'optimisation permettant de s'en passer sans dégrader les performances.
Au passage je gagne aussi 14 pas de programme, ce qui fait 83 pas si l'on ne tient pas compte des 14 pas utilisés pour le chronométrage.
Mais ça ne marche que sur 41CX, pas sur ma 29E qui n'a pas d'instruction MOD.

Code : Tout sélectionner

  nombre     / FRC        MOD    MOD+LASTx
   71327     21"33      17"11      15"17
  123679     26"27      20"88      18"58
 1000003   1'17"80    1'01"14      55"75
 8043509   3'13"64    2'33"89    2'18"63
10000019   4'02"71    3'13"26    2'54"20
31629593   7'10"40    5'42"92    5'09"23

01  LBL"MRA     21  RCL 00      41  LASTx       61  4           81  LASTx
02  0           22  3           42  MOD         62  +           82  6
03  SETSW       23  MOD         43  X=0?        63  MOD         83  +
04  RDN         24  X=0?        44  GTO 01      64  X=0?        84  MOD
05  RUNSW       25  GTO 01      45  RCL 00      65  GTO 01      85  X=0?
06  XEQ 02      26  RCL 00      46  LASTx       66  RCL 00      86  GTO 01
07  STOPSW      27  5           47  4           67  LASTx       87  RCL 00
08  RCLSW       28  MOD         48  +           68  2           88  LASTx
09  FIX 6       29  X=0?        49  MOD         69  +           89  2
10  CLA         30  GTO 01      50  X=0?        70  MOD         90  +
11  ATIME24     31  1           51  GTO 01      71  X=0?        91  MOD
12  AVIEW       32  STO L       52  RCL 00      72  GTO 01      92  X=0?
13  RDN         33  LBL 00      53  LASTx       73  RCL 00      93  GTO 01
14  RTN         34  LASTx       54  2           74  LASTx       94  GTO 00
15  LBL 02      35  6           55  +           75  4           95  LBL 01
16  STO 00      36  +           56  MOD         76  +           96  LASTx
17  2           37  x^2         57  X=0?        77  MOD         97  RTN
18  MOD         38  RCL 00      58  GTO 01      78  X=0?         
19  X=0?        39  X<Y?        59  RCL 00      79  GTO 01         
20  GTO 01      40  RTN         60  LASTx       80  RCL 00   
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 rapide, accélérez n°1

Message par C.Ret »

Oui, très mal. A ce demander comment la machine fait pour aller d'une ligne à l'autre !

Là où je suis déçu c'est pour l'HP-41C qui est sencée mémoriser l'offset du saut afin de ganger du temps au saut suivant. Mais ça n'a pas l'air d'être au point.

Autre déception, c'est le RPL, qui comme le FORTH n'utilise que des pointeurs. Utiliser un 'sous-programme' ne devrait pas faire de diffèrence. Mais il semble qu'il y ai malgré tout un artéfact qui ralenti la version 'compact'.

Bon la TI-74 (sans sous-programme) s'en sort bien avec le code suivant:

Code : Tout sélectionner

1 ACCEPT AT(22),N                     13 F=2+F:Q=N/F:IF Q=INT(Q) THEN 20
2 F=2:Q=N/F:IF Q=INT(Q) THEN 20       14 F=4+F:Q=N/F:IF Q=INT(Q) THEN 20
3 F=3:Q=N/F:IF Q=INT(Q) THEN 20       15 F=6+F:Q=N/F:IF Q=INT(Q) THEN 20
4 F=5:Q=N/F:IF Q=INT(Q) THEN 20       16 F=2+F:Q=N/F:IF Q=INT(Q) THEN 20
5 F=7:Q=N/F:IF Q=INT(Q) THEN 20       17 F=6+F:Q=N/F:IF Q=INT(Q) THEN 20
10 F=4+F:Q=N/F:IF Q=INT(Q) THEN 20    18 IF Q>F THEN GOTO 10 ELSE Q=1
11 F=2+F:Q=N/F:IF Q=INT(Q) THEN 20    20 IF Q>1 THEN PRINT N;"=";F;"x";Q; ELSE PRINT N;"is prime";
12 F=4+F:Q=N/F:IF Q=INT(Q) THEN 20    21 GOTO 1

Ce qui donne le petit résumé suivant:

Code : Tout sélectionner

              zpalm     zpalm     C.Ret     C.Ret     C.Ret     C.Ret     gégé alain1261 caloubugs
            HP-41CX    HP-29E     C128D    HP-41C    HP-28S     TI-74   PB-700    PB-100     TI-95
     1231                            "1       3"2        "4        "4                          1"5
     2007                            "1       1"4        "4        "4
    71327     15"17      24"8        "8      18"8       2"2       2"9      27"         3"      7"
   123679     18"58      29"9        "9      22"7       3"0       3"6       5"         8"
  1000003     55"75    1'28"5       2"7    1'07"7       5"9       9"9    1'19"        14"     23"
  8043509   2'18"63    3'41"9       6"7    2'47"8      14"1      23"6    3'14"
 10000019   2'54"20    4'36"7       8"4    3'30"7      18"9      29"4                       2'06"
 31629593   5'09"23    8'11"0      14"8    6'13"5      31"8      51"4
998812807                        1'23"0              3'00"4          
999999937                        1'23"2   35'08"     3'00"7    4'45"5                      11'45"
P.S.: J'ai mis à jour les temps avec la nouvelle version pour HP-41CX.

En comparant , j'ai compris que nos deux versions, j'ai compris que le RCL 00 joue le même rôle que mon RCL X. Mais ma façon de faire implique des mouvements de la pile qui allongent et relentissent le tout.

J'ai alors penser à éviter ces trop nombreux RCL 00 ou RCL X ainsi que la collection des LastX

J'arrive à un code plus rapide que ma version précèdente, mais qui reste un tout petit peu plus lent que la version ultime de zpalm (3 à 6s de plus à chaque fois ! La CX aurait-elle un accélérateur ?)

Il évite les RCL X en utilisant le fait que la valeur se duplique au sommet de la pile. Je laisse ainsi celle-ci toujours pleine de la valeur N. Il me faut cependant éliminer le resultat des tests, pour cela j'utilise X<>L ce qui effet de bords évite l'utilisation de la pluspart des LastX.
J'espérai gagner du temps, mais hélas pas assez pour faire mieux que la dernière version publiée par zpalm.

Code : Tout sélectionner

001  LBL"MRA
002    ENTER^  ENTER^  ENTER^ 
005    5  MOD  x=0? GTO 01  Clx
010    3  MOD  x=0? GTO 01  Clx
015    2  MOD  x=0? GTO 01  STO L
020  LBL 00
021    X<> L
022    6  +  MOD  x=0?  GTO 01  X<> L
028    4  +  MOD  x=0?  GTO 01  X<> L
034    2  +  MOD  x=0?  GTO 01  X<> L
040    4  +  MOD  x=0?  GTO 01  X<> L
046    2  +  MOD  x=0?  GTO 01  X<> L
052    4  +  MOD  x=0?  GTO 01  X<> L
058    6  +  MOD  x=0?  GTO 01  X<> L
064    2  +  MOD  x=0?  GTO 01  X<> L
070    x^2  x<=y?  GTO 00
073    RDN  STO L
075  LBL 01
076    LastX  TONE 1
078  RTN
Modifié en dernier par C.Ret le 21 oct. 2017 10:37, 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.
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez rapide, accélérez n°1

Message par caloubugs »

Pour la Canon X07, l'utilisation de sous-programmes intensifs coute aussi très cher (ça double le temps de réalisation aussi).
Du coup, je verrai pour refaire une version optimisée pour la TI95 (même si je trouve la machine décevante alors qu'on est censé n'avoir que du code machine non ?). Surtout face à la TI74 avec qui elle partage pas mal de hard.

Sympa ton tableau C.Ret, j'ai fait aussi une synthèse avec le ratio sqr(n)/temps dans mon message initial.
Une petite erreur pour la TI95 les 2'06" c'est pour la valeur suivante, elle a mis 1'11" pour 10000019 (mais bon, si je refais le code, ça devrait tomber).

Ca donne pour le X07 :
1231 : 1"
71327 : 3"
1000003 : 11"
10000019 : 36"
31629593 : 1'04"
999999937 : 6'15"
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2930
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez rapide, accélérez n°1

Message par zpalm »

J'ai entré mon premier programme (celui de la 29E sans fonction MOD) sur ma HP-15C LE et les résultats sont remarquablement rapides: moins de 40 secondes pour le nombre le plus grand testé par C.Ret.

Code : Tout sélectionner

   nombre      41CX       29E    15C-LE
    71327     15"17      24"8        "6
   123679     18"58      29"9        "7
  1000003     55"75    1'28"5       1"6
  8043509   2'18"63    3'41"9       3"5
 10000019   2'54"20    4'36"7       4"3
 31629593   5'09"23    8'11"0       7"3
998812807  29'09"68                39"0   
999999937                          39"1
Modifié en dernier par zpalm le 30 août 2015 15:33, modifié 1 fois.
alain1261
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 21
Enregistré le : 11 juil. 2015 00:28

Re: Misez rapide, accélérez n°1

Message par alain1261 »

zpalm a écrit :
C.Ret a écrit :C'est clair que ce code, bien que plus court, est bien plus lent !

Est-ce la fonction MOD ou le grand nombre d'appels XEQ 02 ? :?:
la fonction MOD est une excellente idée!! En remplaçant dans mon programme les séquences / FRC par MOD je gagne 20% de rapidité !!
Et ça me permet comme tu l'as fait d'utiliser le registre LASTx pour stocker le diviseur (au lieu du registre 01) pour un gain total de 28% :D
Par contre j'ai toujours besoin du registre 0 pour stocker le nombre N, je n'ai pas vu d'optimisation permettant de s'en passer sans dégrader les performances.
Au passage je gagne aussi 14 pas de programme, ce qui fait 83 pas si l'on ne tient pas compte des 14 pas utilisés pour le chronométrage.
Mais ça ne marche que sur 41CX, pas sur ma 29E qui n'a pas d'instruction MOD.

nombre / FRC MOD MOD+LASTx
71327 21"33 17"11 15"17
123679 26"27 20"88 18"58
1000003 1'17"80 1'01"14 55"75
8043509 3'13"64 2'33"89 2'18"63
10000019 4'02"71 3'13"26 2'54"20
31629593 7'10"40 5'42"92 5'09"23

...
Beau gain. :wink:

:idea: Il me semble que l'on peut encore gagner un peu de temps en stockant tous les nombres qui se trouvent dans la boucle principale (2, 4, 6, ..) dans des mémoires, car si je ne me trompe, le rappel mémoire est nettement plus rapide que l'entrée d'un nombre sur HP41
Mon parcours : TI30 -> F-73 -> PC1261 -> PC1475 -> TI92 -> Voyage 200
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 rapide, accélérez n°1

Message par C.Ret »

Je n'avais pas pensé à cette dernière astuce.

Code : Tout sélectionner

             zpalm  zpalm  zpalm  C.Ret   C.Ret  C.Ret  C.Ret   gégé alain1261  caloubugs caloubugs
           HP-41CX HP-29E 15C-LE  C128D  HP-41C HP-28S  TI-74 PB-700    PB-100      TI-95 Canon X07
     1231                     "6     "1     3"8     "4     "4                         1"5        1"
    71327    15"17   24"8     "7     "8    13"7    2"2    2"9    27"         3"       7"         3"
   123679    18"58   29"9            "9    17"3    3"0    3"6     5"         8" 
  1000003    55"75 1'28"5    1"6    2"7    49"3    5"9    9"9  1'19"        14"      23"        11"
  8043509  2'18"63 3'41"9    3"5    6"7  2'01"6   14"1   23"6  3'14"                                
 10000019  2'54"20 4'36"7    4"3    8"4  2'32"7   18"9   29"4                      1'11"        36"
 31629593  5'09"23 8'11"0    7"3   14"8  4'30"8   31"8   51"4                      2'06"      1'04"
998812807                   39"0 1'23"0         3'00"4       
999999937                   39"1 1'23"2 25'34"2 3'00"7 4'45"5                     11'45"      6'15"

Avec l'astuce donnée par alain1261, je gagne quelques secondes :

Le code suivant tourne à condition que les registre 02: 03: et 04 contiennent respectivement les valeurs 2, 6 et 4.

Code : Tout sélectionner

001  LBL"MRA
002    ENTER^  ENTER^  ENTER^ 
005    5  MOD  x=0? GTO 01
009    Clx  3  MOD  x=0? GTO 01
014    Clx  RCL 02  MOD  x=0? GTO 01
019    STO L
020  LBL 00
021    X<> L  RCL 03  +  MOD  x=0? GTO 01
027    X<> L  RCL 04  +  MOD  x=0? GTO 01
033    X<> L  RCL 02  +  MOD  x=0? GTO 01
039    X<> L  RCL 04  +  MOD  x=0? GTO 01
045    X<> L  RCL 02  +  MOD  x=0? GTO 01
051    X<> L  RCL 04  +  MOD  x=0? GTO 01
057    X<> L  RCL 03  +  MOD  x=0? GTO 01
063    X<> L  RCL 02  +  MOD  x=0? GTO 01
069    X<> L  x^2  x<=y?  GTO 00
073    RDN  STO L
075  LBL 01
076    LastX  TONE 1
078  RTN

J'ai alors des temps d'exécution bien plus cours, mais cela ne compte pas.
Car si l'on initialise les registres hors du programme, alors c'est la porte ouverte à toute sorte de gruge.
Comme par exemple faire deux programmes, l'un initialisant une centaine de registres avec les nombres premiers. Le second qui permet à partir de ce tableau de tester la primalité ou déterminer le plus petit facteur d'un nombre.
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.
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 434
Enregistré le : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: Misez rapide, accélérez n°1

Message par caloubugs »

Zou, sur la Z-1GR en basic (me suis fait une frayeur : la bécane a tout d'un coup balancé plein de caractères bizarres à l'écran et n'a plus voulu démarrer. J'ai tout viré, piles et pile de sauvegarde, réinit et ouf ça repart. Du coup une question : un problème avec la mémoire ? ou autre chose ?)

Code : Tout sélectionner

10 INPUT N:TIMER=0:S=SQR(N)
20 D=2:IF N MOD D=0 THEN 100
21 D=3:IF N MOD D=0 THEN 100
22 D=5:IF N MOD D=0 THEN 100
23 D=7:IF N MOD D=0 THEN 100
30 D=D+4:IF N MOD D=0 THEN 100
31 D=D+2:IF N MOD D=0 THEN 100
32 D=D+4:IF N MOD D=0 THEN 100
33 D=D+2:IF N MOD D=0 THEN 100
34 D=D+4:IF N MOD D=0 THEN 100
35 D=D+6:IF N MOD D=0 THEN 100
36 D=D+2:IF N MOD D=0 THEN 100
37 D=D+6:IF N MOD D=0 THEN 100
38 IF D>S THEN D=N ELSE 30
100 PRINT D;TIMER/10
On dispose ici du salvateur Modulo qui fait ses preuves...
1231 : 0"1
71327 : 0"7
1000003 : 2"8
10000019 : 8"5
31629593 : 15"
999999937 : 1'24"4

Ensuite en C interprété, pas évident de repasser en structuré avec tous ces Goto... :slime:

Code : Tout sélectionner

main(){
double f,d,n,s;
scanf("%lf",&n);
f=0;s=sqrt(n);
d=2;if(n==d*(int)(n/d)){f=d;}
d=3;if((n==d*(int)(n/d))&&(f==0)){f=d;}
d=5;if((n==d*(int)(n/d))&&(f==0)){f=d;}
d=7;if((n==d*(int)(n/d))&&(f==0)){f=d;}
while((d<s)&&(f==0)){
  d+=4;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=2;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=4;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=2;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=4;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=6;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=2;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  d+=6;if((n==d*(int)(n/d))&&(f==0)){f=d;}
  }
if(f>0){printf("%lf est divisible par %lf",n,f);}
else{printf("%lf est premier",n);}
}
Y'a peut-être mieux, j'ai les neurones qui se touchent avec cette châleur...

Bon là, c'est dommage, j'ai pas le Timer du basic, alors faut se coltiner tout à la mimine :
1231 : <0"5
71327 : 1"
1000003 : 3"5
10000019 : 11"5
31629593 : 20"5
999999937 : 1'57"

Pas terrible, j'ai des problèmes de temps sûrement à cause des cast intempestifs, du coup, je tente en entier long :

Code : Tout sélectionner

main(){
long f,d,n,s;
scanf("%ld",&n);
f=0;s=(int)sqrt(n);
d=2;if(n==d*(n/d)){f=d;}
d=3;if((n==d*(n/d))&&(f==0)){f=d;}
d=5;if((n==d*(n/d))&&(f==0)){f=d;}
d=7;if((n==d*(n/d))&&(f==0)){f=d;}
while((d<s)&&(f==0)){
  d+=4;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=2;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=4;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=2;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=4;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=6;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=2;if((n==d*(n/d))&&(f==0)){f=d;}
  d+=6;if((n==d*(n/d))&&(f==0)){f=d;}
  }
if(f>0){printf("%ld est divisible par %ld",n,f);}
else{printf("%ld est premier",n);}
}
1231 : <0"5
71327 : <1"
1000003 : 1"5
10000019 : 5"
31629593 : 8"5
999999937 : 47"
Bon ça change tout !!! C'est bien là le problème en C !

D'ailleurs, certains BASIC permettent de définir une variable en entier (à voir, ça peut gagner aussi du temps !)
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5259
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Misez rapide, accélérez n°1

Message par bernouilli92 »

C.Ret a écrit :
J'ai alors des temps d'exécution bien plus cours, mais cela ne compte pas.
Car si l'on initialise les registres hors du programme, alors c'est la porte ouverte à toute sorte de gruge.
Comme par exemple faire deux programmes, l'un initialisant une centaine de registres avec les nombres premiers. Le second qui permet à partir de ce tableau de tester la primalité ou déterminer le plus petit facteur d'un nombre.
Rien ne t'empêche d'initialiser ces registres au début de ton programme.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Misez rapide, accélérez n°1

Message par gege »

Intéressant tout ça !
C'est un peu tricher la HP15C LE, non ?
C'est un modèle récent (plus que la Graph 85), et puissant.
Sur la 15 d'origine on doit être dans les 50 fois plus lent...
G.E.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2930
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez rapide, accélérez n°1

Message par zpalm »

C.Ret a écrit : J'arrive à un code plus rapide que ma version précèdente, mais qui reste un tout petit peu plus lent que la version ultime de zpalm (3 à 6s de plus à chaque fois ! La CX aurait-elle un accélérateur ?)

Il évite les RCL X en utilisant le fait que la valeur se duplique au sommet de la pile. Je laisse ainsi celle-ci toujours pleine de la valeur N. Il me faut cependant éliminer le résultat des tests, pour cela j'utilise X<>L ce qui effet de bords évite l'utilisation de la pluspart des LastX.
J'espérai gagner du temps, mais hélas pas assez pour faire mieux que la dernière version publiée par zpalm.
Je l'ai testé sur ma 41CX et ton programme est bien plus rapide que le mien :D C'est ta 41C qui doit être moins rapide que ma CX. Comme la fréquence de l'horloge est déterminée par un réseau RC, la vitesse de chaque machine varie en fonction de la tolérance des composants utilisés.

En combinant ton programme avec l'astuce d'alain1261 sur le stockage des incréments (j'ai utilisé les registres 2, 4 et 6 pour stocker les valeurs 2, 4 et 6 au début du programme) je mesure les temps suivants sur ma 41CX:

Code : Tout sélectionner

   nombre      41CX
    71327     11"80 
   123679     14"31
  1000003     41"16
  8043509   1'41"83
 10000019   2'07"90
 31629593   3'46"93
998812807  21'28"07 
999999937  21'30"25
Comparé à ma première version ça fait 48% de temps en moins : 3'46"93 vs. 7'10"40 pour 31629593.
Bravo pour les optimisations !!

Code : Tout sélectionner

001  LBL"MRA
002    2 STO 2 4 STO 4 6 STO 6 + + CLx
011    5  MOD  x=0? GTO 01 CLx
016    3  MOD  x=0? GTO 01 CLx
021    RCL 02  MOD  x=0? GTO 01
025    STO L
026  LBL 00
027    X<> L  RCL 06  +  MOD  x=0? GTO 01
033    X<> L  RCL 04  +  MOD  x=0? GTO 01
039    X<> L  RCL 02  +  MOD  x=0? GTO 01
045    X<> L  RCL 04  +  MOD  x=0? GTO 01
051    X<> L  RCL 02  +  MOD  x=0? GTO 01
057    X<> L  RCL 04  +  MOD  x=0? GTO 01
063    X<> L  RCL 06  +  MOD  x=0? GTO 01
069    X<> L  RCL 02  +  MOD  x=0? GTO 01
075    X<> L  x^2  x<=y?  GTO 00
079    RDN  STO L
081  LBL 01
082    LastX  TONE 1
084  RTN
alain1261
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 21
Enregistré le : 11 juil. 2015 00:28

Re: Misez rapide, accélérez n°1

Message par alain1261 »

Bravo pour ces résultats. :wink:
zpalm a écrit :
C.Ret a écrit : J'arrive à un code plus rapide que ma version précèdente, mais qui reste un tout petit peu plus lent que la version ultime de zpalm (3 à 6s de plus à chaque fois ! La CX aurait-elle un accélérateur ?)
...
Je l'ai testé sur ma 41CX et ton programme est bien plus rapide que le mien :D C'est ta 41C qui doit être moins rapide que ma CX. Comme la fréquence de l'horloge est déterminée par un réseau RC, la vitesse de chaque machine varie en fonction de la tolérance des composants utilisés.
Il me semble avoir lu que les 41C étaient légèrement plus rapide que les CV/CX :?:

J'avais des résultats inconstants sur la HP41 (programme plus lent malgré certaines optimisations 8O ) jusqu'à ce que je fasse un GTO.. systématiquement après chaque modification du programme dans la calculatrice. :idea:
Attention à bien mettre un label alpha de plus d'1 caractère pour retrouver facilement le programme avec CATALOG 1
Mon parcours : TI30 -> F-73 -> PC1261 -> PC1475 -> TI92 -> Voyage 200
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2930
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez rapide, accélérez n°1

Message par zpalm »

alain1261 a écrit : J'avais des résultats inconstants sur la HP41 (programme plus lent malgré certaines optimisations 8O ) jusqu'à ce que je fasse un GTO.. systématiquement après chaque modification du programme dans la calculatrice.
C'est aussi ce que je fait après chaque modification :)
Répondre

Retourner vers « Tous les Pockets »