jeudi 27 septembre 2012

"Ce nombre est-il premier ?"... avec une HP-15C

La HP-15C est sortie en 1982 (série Voyager), soit 7 ans après la HP-25. Si on compare les prix, la HP-25 valait $195 (595 francs en 1978 à la FNAC) contre $135 pour la HP-15C. Les prix baissent (relativement) et de nouvelles fonctionnalités apparaissent : c'est la règle avec le matériel informatique.

En termes de nouvelles fonctionalités intégrées à la ROM, on peut dire que la HP-15C était bien fournie. Jugez plutôt : calculs avec les nombres complexes (e^(2i.Pi) = 1 ... ou presque), calcul matriciel (dim maxi 8 x 8), résolution numérique d'équations, intégration numérique, fonctions statistiques, etc.

Mais en performance pure ça donne quoi ? Que vaut le CPU "Nut" à 220 kHz de la HP-15C, en techno CMOSC, face au CPU à 180 kHz de la HP-25 en techno P-MOS ? Eh bien, aussi étonnant que cela puisse paraître, c'est la HP-25 qui est la plus rapide !

En tout cas, avec mon programme légèrement adapté (sans optimisation), le même calcul sur le nombre premier 524 287 prend plus de 8 minutes sur la HP-15C ! La HP-25 serait donc, à la louche, 60% plus rapide ?


"Ce nombre est-il premier ?" pour HP-15C

En tout, il y a 4 pas de programmes en plus à cause des labels. Sur HP-15C le simple GTO vers un numéro (hors label) n'est plus supporté en mode programme.  De plus, le test "x >= y" n'est plus sur une touche, mais en indirect (TEST 9). Je ne pense pas que cela suffise à expliquer un tel écart de performance ?


Deux calculatrices "dans leur jus"

Une autre implémentation pour la HP-15C du même algorithme est disponible sur http://www.hpmuseum.org/software/15prnuck.htm.

3 commentaires:

  1. Salut Daniel !

    Je suis tombé un peu par hasard sur ton blog. En lisant ton code pour déterminer si un nombre est premier, je me suis rendu compte qu'il faisait 39 pas comme le mien.
    J'ai donc essayé avec 524287 en mesurant le temps nécessaire. Mon HP-15C a mis moins de 3'52" grâce à deux "petites" astuces. Il n'est pas nécessaire de calculer la racine carrée. Lors du test de divisibilité où l'on divise n par F, le quotient q=n/F doit être supérieur à F, sinon c'est que l'on a dépassé la racine.
    L'autre perfectionnement consiste à ne pas tester tous les facteurs F impairs. Mon code teste les facteurs 2 3 5 et 7 puis 8 facteurs judicieusement choisis pour chaque tranche de 30 unités qui suivent. Le pas moyen d'avancement est donc alors de 3.75 au lieu de 2. Les 8 facteurs sont déterminés de telle sorte qu'ils ne sont pas des multiples de 2 3 ou 5.


    000-
    001- LBL A
    002- CLREG STO 0 GSB 2 1 GSB 0 GSB 2 GSB 2
    009- LBL 1 GSB 3 GSB 3 GSB 4 GSB 6 GSB 2 GSB 6 GTO 1

    017- LBL 3 GSB 4
    019- LBL 2 2 GTO 0
    022- LBL 4 4 GTO 0
    025- LBL 6 6
    027- LBL 0 STO+1 1 RCL 1 RCL 0 RCL/1 x0? RTN
    038- RDN
    039- R/S

    Voilà; évidemment , ce code est utilisable sur une HP-25 qui sera à nouveau plus rapide. qu'une HP-15C !

    RépondreSupprimer
    Réponses
    1. Merci pour ce programme. Belle optimisation en effet !

      Supprimer
  2. Bonjour Daniel,
    Avec la HP15C Collector's Edition le test prend 4 secondes pour 524 287.
    En utilisant la fonction ISG, avec ce code, 1=>Premier, 0=>Factorisable :

    001 - f LBL A
    002 - STO 0
    003 - 2
    004 - ÷
    005 - f FRAC
    006 - g x=0
    007 - GTO 1
    008 - RCL 0
    009 - √x̅
    010 - g INT
    011 - .
    012 - 0
    013 - 2
    014 - +
    015 - 3
    016 - CHS
    017 - 10ˣ
    018 - ×
    019 - 3
    020 - +
    021 - STO 1
    022 - f LBL 0
    023 - RCL 0
    024 - RCL 1
    025 - g INT
    026 - ÷
    027 - f FRAC
    028 - g x=0
    029 - GTO 1
    030 - f ISG 1
    031 - GTO 0
    032 - 1
    033 - g RTN
    034 - f LBL 1
    035 - 0
    036 - g RTN

    RépondreSupprimer