dimanche 31 mars 2019

Le best-seller des années 80 : la TI-57

Texas Instruments présenta sa fameuse TI-57 en 1977. Elle a tant marqué sa génération qu'elle en est aujourd'hui devenue incontournable pour tout collectionneur qui se respecte. Son succès durera une bonne dizaine d'années grâce à son prix plancher sur le segment des scientifiques programmables. La TI-57 que j'ai sous les yeux a été fabriquée en Italie. Quatre chiffres dans son numéro de série, gravé au dos, représentent la semaine et l'année de production. La mienne est donc sortie de l'usine la semaine 17 de 1981. Elle aura probablement été vendue en France dans la foulée, pour la modique somme de 205 Francs ; soit moins de la moitié du prix de la Casio FX-502P ou de la HP-33 (source : l'Ordinateur de poche numéro 1). Les autres calculatrices de la même génération, avec plus de mémoire, parfois non volatile, étaient en effet beaucoup plus chères ; voire inaccessibles. Une HP-41C, par exemple, valait 1430 Francs en 1981.

TI-57 versus HP-25

Avec quelques touches en plus, la TI-57 est légèrement plus grande qu'une HP-25, mais son ergonomie n'est pas déroutante. Le principe de l'inclinaison de son écran vers l'utilisateur sera repris sur plusieurs modèles TI ultérieurs. La sérigraphie est bien contrastée, plus aérée que sur les Casio. On peut avoir jusqu'à trois fonctions par touches avec les combinaisons de [2nd] et de [INV]. Mais si on évoque le confort d'utilisation, il faut bien avouer que le clavier de la Texane est raide. J'ai mesuré plus de 270 grammes de pression en moyenne sur les touches avec ma balance de cuisine. Pour comparer avec la pression à exercer sur une machine récente, on se rapproche de la fermeté du clavier de la DM42, avec le bruit du plastique dur en plus sur la TI. Par ailleurs, l'interrupteur à glissière de la TI-57 est épouvantable.

En 2019, la TI-57 se trouve encore facilement sur les sites d'annonces. Bien entendu, en quarante ans, de l'eau a coulé sous les ponts ; et il arrive donc fréquemment qu'elle soit incomplète (sans manuel, sans chargeur, ou sans housse). Quant à ses accumulateurs Ni-Cd originaux, ils sont en général bons pour le recyclage. Le problème s'aggrave lorsque l'électrolyte des accus, à l'hydroxyde de potassium corrosif, fuit dans le boitier. Le premier module à souffrir est le redresseur intégré dans le compartiment batterie. Avec peu de composants, ce circuit possède deux fonctions :
  1. transformer le courant 8,5 V alternatif en sortie du chargeur Texas (120 mA), en courant continu pour la recharge des deux batteries Ni-Cd
  2. transformer le 2,4 V issu des batteries en 9 V pour alimenter la machine
circuit redresseur intégré dans le compartiment batterie de la TI-57

Attention, dans le connecteur qui relie le pack de batteries à la carte mère, les couleurs des fils ont été inversées : le fil rouge est relié à la borne négative, et le fil noir à la borne positive. Qu'est-ce qui a bien pu passer par la tête des ingénieur Texas Instruments ? Est-ce une erreur ? Heureusement, si on alimente la calculatrice en 9 V à l'envers pendant une courte période, il ne se passe pas grand chose, mais cela ne la détruit pas.

L'autonomie de la TI-57 est limitée, principalement à cause de son affichage à LED rouges. Mais que valent ses performances par rapport aux machines de sa génération ? Pour les mesurer, j'ai repris mon programme de test de primalité, dans une version proche de la première que j'avais écrite pour la TI-66. Sans chercher l'optimisation, la syntaxe condensée de la TI-57 permet de faire rentrer le même algorithme dans 42 pas (au lieu de 62) :


Avec 2701 en entrée, mon programme retourne 37. Il s'agit du plus petit diviseur de 2701, qui n'est donc pas premier. Avec 524287 en entrée, il affiche 1 après un peu plus de 8 minutes de calcul. C'est un temps correct, sans plus ; la HP-25 que j'avais testée précédemment faisait mieux.

Une machine aussi rudimentaire que la TI-57, armée de 8 mémoires et de 50 pas de programme seulement, est-elle capable de résoudre un problème plus complexe ? Par exemple, la recherche des zéros de la fonction ci-dessous est-elle à sa portée ?


f(x) = 1 - (x+4)^2*cos(sqrt(x))*e^((-x)/5) 

Celle-ci est formulée ci-dessus au format de la barre de recherche Google. Voici son graphe :

f(x) = 1 - (x+4)^2*cos(sqrt(x))*e^((-x)/5)

Eh bien oui, la TI-57 relève ce défi avec brio ! Je suis arrivé à faire rentrer au chausse pied dans la calculette une adaptation de mon programme de recherche de zéros par la méthode de la sécante. L'algorithme est identique à celui que j'avais implémenté dans mes articles précédents pour la PB-1000 et la FX-602P.  L'équivalence avec les variables du programme en Basic sera la suivante :

Basic --- TI-57
    X --- 00
    A --- 01
    Z --- 02
    I --- 07

Voici donc ce code, en 26 pas :


La fonction f(x) dont on recherche les zéros est codée à partir du pas 27 :


Ouf, ça rentre juste, au pas près ! Mode d'emploi de ce programme :
  1. modifier si besoin f(x) à partir du pas 28. Les mémoires 3 à 6 ne sont pas utilisées dans le reste du programme.
  2. stocker le X initial dans la mémoire 0. Par exemple avec [2] [STO] [0]
  3. stocker la précision dans la mémoire 7. Par exemple [1] [EE] [8] [+/-] [STO] [7]
  4. n'oubliez pas de passer en mode radian, si f(x) contient de la trigonométrie
  5. vous pouvez éventuellement calculer quelques valeurs de f(x) pour avoir une idée de la forme de la courbe : stocker X dans la mémoire 0, puis lancer [SBR] [1].
  6. [RST] puis [R/S] pour lancer la recherche d'un zéro
  7. le résultat s'affiche à l'écran
Pour terminer, voici une petite démonstration en vidéo, dans laquelle je recherche trois zéros de l'équation f(x) décrite ci-dessus :


Les trois solutions de f(x) = 0 trouvées par la TI-57 sont donc :
  • 2,3442043
  • 23,626136
  • 37,051386

dimanche 3 février 2019

Un solveur pour la FX-602P

Dans mon article précédent, je vous avais proposé de développer un solveur numérique pour la Casio FX-602P. Ce programme lui permet en effet de combler une de ses lacunes par rapport à la HP-15C qui possède la fonction [solve] d'origine. Il n'y a probablement pas de grand secret mais, malgré les explications données en annexe D du manuel de la 15C, je ne sais pas exactement quel est l'algorithme implémenté dans la HP. Alors j'ai choisi la méthode numérique de la sécante. Elle est proche de la méthode de Newton, mais plus facile à programmer, car on n'aura pas à calculer de dérivée. On obtiendra néanmoins une bonne approximation d'un zéro de f(x) en quelques itérations seulement.

Recherche d'un zéro de f(x) = x^3 - 2x -5

J'ai repris le vieux programme en Basic pour PB-1000 qui m'avait rendu de bons et loyaux services dans les années 90. Pour la toute première version, je m'étais inspiré d'un algorithme nommé "Newton" donné dans un vieux bouquin d'analyse numérique dont j'ai oublié le titre, et que j'avais emprunté à la bibliothèque de la Fac des Sciences Montpellier II. Andreas Wichmann avait publié mon programme pour PB-1000 sur son site quelques années plus tard, avec mon accord. Le voici de retour en 2019 dans une version écrémée :

10 ANGLE1:GOTO40
20 Y=X^3-2*X-5
30 RETURN
40 PRINT"X initial="X;:INPUTX:I=1E-8
50 A=X:GOSUB20:Z=Y:X=X+I:GOSUB20
60 X=A-Z*I/(Y-Z):PRINTA;X:IFABS(X-A)>I THEN50
70 PRINT"F(X)="Z;"X="X

Usage :
  1. éditer le programme pour entrer la fonction sous la forme Y=F(X) à la ligne 20
  2. si besoin, modifier la précision qui est codée en dur à la fin de la ligne 40 (variable I)
  3. lancer le programme
  4. répondre à la question "X initial= ... ?" par exemple avec la valeur 1.
  5. le programme pour PB-1000 affiche les valeurs de A et X à chaque itération
  6. affichage du résultat à la fin (contrôle avec F(X) qui doit être proche de zéro). Attention, dans certains cas particuliers, il se pourrait qu'il n'y ait pas convergence. Dans ce cas, on utilisera la touche [BRK] pour interrompre le programme. 
Pour illustrer le déroulement de ce programme, j'ai créé l'image ci-dessous avec un montage Gimp de trois copies d'écran PB-1000 :

Convergence de l'algorithme de la sécante sur PB-1000 (montage)

Pour le portage sur la FX-602P qui nous intéresse plus particulièrement dans cet article, j'utiliserai les quatre mémoires listées ci-dessous avec les variables équivalentes dans le listing en Basic :

Basic --- FX-602P
    X --- 00
    A --- 01
    Z --- 02
    I --- F

Ce qui nous donne le programme en 38 pas ci-dessous. Il est moyennement lisible, je vous l'accorde ! Vous pouvez le saisir par exemple en P1, toujours en une seule ligne de programme sur la 602P :

Min00 1 EXP 8 +/- MinF 
LBL0 MR00 Min01 GSBP0 Min02 MR00 + MRF = 
GSBP0 - MR02 = 1/x * MRF * MR02 = +/- + MR01 = PAUSE 
Min00 - MR01 = ABS x>=F GOTO0 MR00

Ce programme fait appel au sous-programme P0 ci-dessous, qui doit contenir la fonction f(x) ; ici [ x^3 - 2x - 5 ] en 10 pas :

Min00 x^y 3 - 2 * MR00 - 5 =

Usage :
  1. entrer la fonction f(x) dans P0
  2. si besoin, modifier la précision, codée en dur au pas 4 (variable F)
  3. taper le X initial, par exemple 1
  4. lancer le programme P1
  5. pause et affichage de la valeur de X à chaque itération ; le résultat à la fin
Sur la HP-15C, pour comparer les performances de son solveur intégré, j'ai utilisé le programme suivant :

001-42,21,11   LBL A
002-      36   ENTER
003-      36   ENTER
004-       3   3
005-      14   y^x
006-      34   x<>y
007-       2   2
008-      20   *
009-      30   -
010-       5   5
011-      30   -
012-   43 32   RTN

Je vous rétrocède ci-dessous les vitesses d’exécution que j'ai mesurées sur les trois machines avec le calcul donné en exemple. Sur les versions Casio, l'affichage intermédiaire permet de suivre la convergence, mais prend évidemment du temps :

- Casio PB-1000 : environ 5 secondes pour afficher le résultat (calcul à partir de X=1)
- Casio FX-602P avec [pause] à chaque itération : 16 secondes (calcul à partir de X=1)
- HP-15C avec la fonction [solve] intégrée : temps très variables, qui dépassent parfois la minute, en fonction de l'intervalle de recherche initial (registres X et Y).

Pour conclure, j'ai réalisé une petite vidéo, à visionner de préférence en 1080p, qui permet de revivre les sensations vintage procurées par la FX-602P et la HP-15C en les faisant tourner en parallèle :  


La calcul est super long sur la HP-15C parce que l'intervalle de recherche est arbitrairement fixé à [1, 51] dans la vidéo. Pour plus d'équité dans la comparaison, j'aurais pu fixer une valeur de Y plus basse. Par exemple, en fixant l'intervalle initial à [2, 3] le temps de calcul peut être réduit à 38 secondes environ. Parmi les autres optimisations possibles, on peut désactiver le mode de calcul complexe (merci C.Ret) via la séquence de touche peu intuitive [g] [CF] [8]. Il est également intéressant de retirer les deux [ENTER] superflus en début de programme. L'inconvénient de cette méthode, c'est qui ne faudra pas oublier le double [ENTER] manuel préalable si on utilise le programme pour un calcul direct (par exemple : f(1) = -6). Enfin, on peut factoriser la formule via la méthode de Horner ; comme cela a été suggéré dans le premier commentaire à cet article (ci-dessous). Voici un nouveau programme qui prend en compte ces remarques :

001-42,21,11   LBL A
002-      20   *
003-       2   2
004-      30   -
005-      20   *
006-       5   5
007-      30   -
008-   43 32   RTN

Dernier truc : un [ENTER] de trop, quand on saisit l'intervalle de recherche initial, a également une influence sur la performance ! Par conséquent, il vaut mieux taper [2] [ENTER] [3] sans deuxième [ENTER], et directement [f] [SOLVE] [f] [A]. Grâce à ces optimisations, le temps de calcul pour afficher le résultat 2,094551481 est ramené à 12 secondes pour la HP-15C. La différence avec les calculs précédents est substantielle. Cependant, elle ne suffit pas à faire la différence face à une FX-602P bien plus réactive.

dimanche 27 janvier 2019

La Casio FX-602P : petite mais ultra-efficace

La Casio FX-602P est une calculatrice parmi les plus anciennes de ma collection. En réalité, je ne l'ai pas connue pendant mes années lycée. J'ignorais même son existence jusqu'à récemment, où j'ai souhaité l'acquérir. Je trouve en effet plaisant de manipuler la maman de la FX-4000P qui reste l'une de mes machines préférées. La FX-602P est sortie au Japon en septembre 1982, à la même époque que la HP-15C, donc deux ans avant la HP-71B que je testais dans mon article précédent. La 15C, d'un gabarit comparable à la 602P, est certainement sa concurrente de la même période la plus sérieuse. Le positionnement tarifaire de la Casio, autour de 900 Francs en 1982, puis à 600 Francs en 1984 (source : Micro Systèmes numéro 45), la situait dans une fourchette de prix basse. Et même si la HP-15C était possédée, voire encensée, par une de mes connaissances, j'aurais eu beaucoup de mal à choisir entre ces deux machines à l'époque. Pour bien situer le niveau technique de la FX-602P, on la compare parfois à la HP-41C qui était beaucoup plus chère. Au sommet de cette gamme de prix, le Sharp PC-1500 était vraiment plus encombrant que les trois machines citées précédemment ; sans pour autant se démarquer fondamentalement pour un usage type calculette, en math ou en physique. Quant aux Texas Instruments de l'époque, elles étaient vraiment dépassées. La TI-66 par exemple pouvait faire valoir l'argument de sa simplicité d'accès et de son large clavier très lisible, mais elle était larguée sur tout le reste.

Une Casio FX-602P dans son jus ; quelques touches sont un peu effacées.

Parmi les nombreux avantages de la Casio, on apprécie immédiatement :
  • son clavier compact, sa robustesse (même 35 ans plus tard), sa légèreté, sa finesse
  • le connecteur d'extension qui permet de la raccorder sur une interface Casio FA-1 ou FA-2, pour les sauvegardes sur cassettes, ou sur l'imprimante FP-10 à "film métallique", vendue 450 Francs à l'époque (à ne pas confondre avec le traceur FA-10 du PB-700).
  • sa logique de calcul dite "algébrique" avec 11 niveaux de parenthèses ;  même si cette logique ne s'applique qu'aux opérations arithmétiques, et non aux fonctions trigonométriques par exemple.
  • son ensemble de fonctions mathématiques complet, son langage machine "Turing-complet"
  • son afficheur LCD lisible et évolué pour l'époque, à 10 caractères alphanumériques, plus deux chiffres d'exposant, et 11 petits indicateurs de mode (en haut).
Cet afficheur simplifie grandement la programmation, notamment pendant les phases le débogage. Autre cas d'usage de l'afficheur alphanumérique : il est ici facile d'écrire un programme de conversion décimal vers hexadécimal. Cet exemple est donné dans le manuel qui, en 68 pages seulement, est à l'image de la simplicité globale de la machine. D'autre part, même si la précision interne de la FX-602P inclut deux chiffres de plus que la 15C, elle reste limitée au calcul de 69! (grands nombres). Cependant, à la fin de ce dernier calcul, la Casio exhibe directement trois chiffres significatifs de plus que la HP. Si les fonctions classiques sont bien présentes sur la 602P, on regrette l'absence des nombres complexes, des matrices, de la résolution d'équations et de l'intégration numérique. Ces programmes intégrés avancés resteront pendant longtemps l'exclusivité des HP. Cependant, force est de constater que la relative lenteur de la 15C entraîne de sacrés limitations sur le calcul numérique. Je dévoile déjà ma conclusion, mais nous verrons ci-dessous que la Casio se démarque nettement sur la vitesse de calcul.

Mon programme habituel de test de primalité a été rapide à porter sur la FX-602P. Bien que très différent en apparence de la version HP-15C, je l'ai écrit d'une façon aussi compacte, en 39 pas. Et je vous le livre donc ci-dessous dans un tableau Gnumeric commenté. Cette représentation ne me plaît pas beaucoup car elle n'est pas fidèle à la sérigraphie des touches. J'essaierai de faire mieux, un jour...

"Ce nombre est-il premier ?" pour Casio FX-602P

Vu l'intérêt limité du truc, je ne crois pas que l'un de mes rares lecteurs souhaitera recopier ce programme. Néanmoins, j'écris ici vite fait un mode d'emploi résumé :


  1. passer en [MODE][2] (WRT), puis [P0] par exemple, pour saisir le programme ci-dessus
  2. revenir en [MODE][1] (RUN)
  3. saisir le nombre 'n' à tester, puis lancer le programme par [P0]. Pendant le calcul, vous observerez un mini segment horizontal à l'extrême droite du LCD.
  4. affichage du premier diviseur de n, ou bien 1, si n est premier


Le test sur le nombre 524287 s’exécute sur la FX-602P en un peu moins d'une minute. Cette jolie Casio au corps bardé d'aluminium est donc, à la louche, huit fois plus rapide que la HP-15C. Ce bon score me donne envie de re-programmer une version de l'algorithme de Newton pour la 602P, pour compenser l'absence de solveur numérique. Je vous propose donc une suite au prochain numéro !

samedi 13 octobre 2018

Le haut du panier en 1984, la HP-71B

La vie est-elle plus chère aujourd'hui qu'il y a trente ans ? Si on prend l'exemple du très classieux ordinateur de poche HP-71B que j'ai sous les yeux, on serait tenté de répondre négativement. En effet, en 1984, ce petit objet fut mis en vitrine à un prix très aérien de 5690 Francs français ! De plus, à l’instar de certaines marques de voiture allemandes, la liste des options proposées par HP était longue comme le bras. Alors, même si ma tentative de comparaison de prix prenait correctement en compte l'inflation, elle trouverait rapidement ses limites. On peut néanmoins s’autoriser à penser que le HP-71B était plus cher, pour l'époque, que les smartphones 2018 les plus onéreux. Bien entendu, si on se cantonne au monde scolaire, le top de la calculette autorisée aux examens reste actuellement bien plus abordable que la somme qu'on aurait dû débourser au début des années 80.

Sans disposer des chiffres de ventes officiels, j’ai l’impression que le HP-71B était moins répandu en France que ses concurrents japonais de la même génération ; à savoir le Sharp PC-1500 et le Casio PB-700. La première fois que j’ai entendu parler de la 71B, c’est lorsque je me suis intéressé à nouveau aux machines rétro il y a quelques années, et notamment à la HP-28S de 1988. En effet, ces deux HP partagent un certain nombre de points communs, et notamment leur architecture CPU Saturn 4 bits. C'est grâce à la documentation publique abondante de la 71B que les développements communautaires les plus intéressants de la 28S, bien plus fermée, ont été rendus possibles. Néanmoins, malgré les sept ouvertures présentes sur son boitier, en plus de la trappe à pile, de la prise pour un chargeur externe et de la fente pour le lecteur de cartes magnétiques, l'adjectif "ouvert" s'applique difficilement à la 71B. En effet, bien que sa documentation soit abondante, il reste selon moi un produit propriétaire fermé, qui ne supporte que les standards HP. Par exemple, l'échange de données avec un ordinateur, à travers l'interface HP-IL, reste onéreux et compliqué, même en 2018. Malgré ces réticences, j’ai fini par craquer, et par enchérir sur une HP-71B en bon état sur eBay.

La première chose que j'ai eu envie de calculer, c'est la factorielle de 70. En effet, la plupart des calculettes équivalentes sont limitées à 69!. Ici, le résultat approché de FACT(70) s'affiche sans erreur de dépassement de capacité : 1.197857167E100. Le HP-71B est effectivement la première calculette à proposer une implémentation de la norme IEEE 754 (1985). On a par exemple la commande INF pour symboliser l'infini, ou encore MAXREAL qui correspond à 9.99999999999E499 sur HP-71B.

Sur le HP-71B, quatre trappes en face avant sont prévues pour insérer des extensions mémoires.

Les touches "Rotate and Clic" sont typiques des HP de l'époque, mais leur disposition est ici originale. L'usage tenu à deux mains, loin d'une table, est possible ; contrairement à la configuration à charnière de ma PB-1000 favorite qui est conçue pour être utilisée posée à plat exclusivement. La tenue de cette HP-71B rigide, en manipulant le clavier à deux pouces, est possible occasionnellement. A l'allumage, on se retrouve en mode d'édition "remplacement", ce qui est classique pour cette génération de pocket. Par contre, la touche [INS] pour le mode insertion est ici nommée [I/R]. Dans le même style, l'habituelle touche [DEL] est ici remplacée par [-CHAR]. D'autre part, la touche [SPC] n'est pas plus large que les autres.

Dans la documentation il est mentionné trois modes d'opération :
  1. mode éxécution Basic. Dans ce mode, il est possible de faire des calculs directs, sans taper "PRINT". C'est le mode par défaut.
  2. mode édition programme Basic. En fait, c'est presque le même que le (1). Mais la machine détecte automatiquement que la ligne de programme en cours de saisie commence par un numéro.
  3. mode calcul. On doit l'appeller par la combinaison des deux touches [f][CALC]. Ce n'est pas un mode RPN, mais il affiche néanmoins le résultat des calculs intermédiaires. L'équivalent de la touche [ANS] des Casio est ici nommée [RES].

Le HP-71B est facile à utiliser comme une calculette en notation algébrique directe.
Avec le langage Basic relativement standard du HP-71B, le portage de mon programme habituel de test de primalité est ultra rapide. Le symbole "@" est nécessaire pour séparer plusieurs instructions sur la même ligne. C'est un peu inhabituel par rapport au ":" que l'on trouve dans d'autres Basic.

10 INPUT "N?";N
20 J=INT(SQR(N)) @ I=2
30 IF FP(N/2)=0 THEN 80
40 FOR I=3 TO J STEP 2
50 IF FP(N/I)=0 THEN 80
60 NEXT I
70 BEEP @ PRINT "1 "; @ GOTO 10
80 PRINT I; @ GOTO 10

Le test sur le nombre 524 287 s'exécute ici en 10 secondes environ. Ce score est un peu meilleur que celui de ses contemporains de 1984, à savoir le Casio PB-700 et le Sharp PC-1500A. Mais, bien entendu, ce n'est pas seulement avec le seul argument de la vitesse que l'on peut justifier un tel écart de prix.

Mon deuxième programme de test, qui teste si un nombre est de Keith, et qui, dans le cas contraire affiche le nombre de Keith suivant, est lui aussi très simple à convertir. Si vous avez oublié ce qu'est un nombre  de Keith, j'avais détaillé un algorithme dans mon article précédent sur la WP-34S.

10 DIM N(10)
20 INPUT"N?";N1
30 L=INT(LOG10(N1))+1 @ M=N1 @ S=0
40 FOR I=L TO 1 STEP -1
50 N(I)=MOD(M,10) @ S=S+N(I) @ M=INT(M/10) @ NEXT I
60 I=I+1 @ IF I>L THEN I=1
70 M=2*S-N(I) @ N(I)=S @ S=M @ IF S<N1 THEN 60 
80 IF S=N1 THEN BEEP @ PRINT S;"est un Keith" @ END
90 N1=N1+1 @ GOTO30

En Basic basique donc, le Saturn cadencé à 640 kHz seulement s'en sort bien sur ce calcul entier un peu compliqué, avec un score en moins de 5 min 30 s pour trouver le Keith 7385 en commençant le calcul à partir de N=7000.

En conclusion, cette machine polyvalente et riche en fonctions reste toujours passionnante même 34 ans plus tard. En dehors de l'étroitesse de son afficheur LCD, elle n'a qu'un défaut majeur, c'est son prix !

lundi 12 février 2018

Les nombres de Keith et la WP-34S

En 2016, pendant mes essais de la TI-89 sur ce blog, j'avais commencé à utiliser un programme de recherche des nombres de Keith comme nouveau prétexte à tester mes calculettes. En effet, même s'il reste relativement simple, ce calcul me paraissait un peu plus original que le très banal test de primalité. Pour mes lecteurs, pas si rares que ça (!), qui ne connaîtraient pas la définition des nombres de Keith, il y a un article sur Wikipedia qui en parle. Il y a également une vidéo sur numberphile.com qui décrit les propriétés de ces nombres rares. Je vais tout de même tenter de rédiger ici une explication à ma sauce, et de vous détailler mon algorithme.

En ce qui concerne les applications pratiques, on connaît bien l'usage des nombres premiers en cryptographie. Quant aux nombres de Keith, dont personne n'est parvenu à prouver qu'ils existent en nombre infini (ou pas), ils ne font actuellement l'objet d'aucune utilisation industrielle en dehors des jeux mathématiques. Cela dit, comme souvent en informatique, "il n'y a de vraiment beau que ce qui ne peut servir à rien" (Théophile Gautier).

Alors, comment vérifier si un nombre 'n' est "de Keith" ou pas ? La méthode est la suivante :

1) on démarre le calcul du premier terme de la suite en faisant la somme des chiffres de 'n'

2) les termes suivants sont obtenus par récurrence, avec des additions dont le nombre d'opérandes est le même que la somme initiale. Pour calculer le terme suivant, on efface un opérande à gauche (le chiffre en rouge dans l'exemple ci-dessous) et on ajoute un opérande à droite qui correspond à la somme précédemment calculée (en bleu ci-dessous).

3) à chaque itération, on vérifie si 'n' apparaît dans la suite. Si c'est le cas, 'n' est un Keith. Par contre, tant qu'on n'a pas dépassé 'n', on poursuit le calcul au (2).

Pour fixer les idées, voici un exemple avec le nombre 197 qui comporte trois chiffres. Les additions successives seront donc à trois opérandes. Les valeurs de la suite sont calculées séquentiellement de la façon suivante :

197
1 + 9 + 7 = 17   
    9 + 7 + 17 = 33
        7 + 17 + 33 = 57
            17 + 33 + 57 = 107
                 33 + 57 + 107 = 197 

On s'arrête là, car on vient de retomber sur 197 qui fait partie de la suite. C'est précisément la définition d'un nombre de Keith. Par conséquent, 197 est un nombre de Keith.

J'avais contribué sur ce thème dans le forum silicium avec une version en C61 Basic (Casio), et également avec une version en GFA Basic (Atari ST). Comme cela est requis dans l'énoncé de ce mini défi, mon programme ne se contente pas de vérifier si le nombre donné en entrée est un Keith ou pas ; il affiche le Keith immédiatement supérieur (ou égal).

Pour mémoire, voici la version en GFA Basic :

DIM n%(10)
DO
  INPUT "N?",n1%
  PRINT TIME$;"  ";
  DO
    l%=INT(LOG10(n1%))+1
    m%=n1%
    s%=0
    FOR i%=l% TO 1 STEP -1
      n%(i%)=m% MOD 10
      ADD s%,n%(i%)
      DIV m%,10
    NEXT i%
    REPEAT
      INC i%
      IF i%>l%
        i%=1
      ENDIF
      m%=SHL(s%,1)
      SUB m%,n%(i%)
      n%(i%)=s%
      s%=m%
    UNTIL s%>=n1%
    EXIT IF s%=n1%
    INC n1%
  LOOP
  PRINT s%;" est un Keith.  ";TIME$
LOOP

Pour accélerer un peu les choses, je n'utilise dans le programme ci-dessus que des variables entières (suffixées avec le symbole '%'), et quelques instructions spécifiques. Par exemple SHL signifie "shift left". C'est un décalage de bits vers la gauche, équivalent à une multiplication par deux, mais plus rapide. Cette version est capable d'afficher le premier nombre de Keith supérieur à 7000 en 4 secondes environ sur un ST à 8 MHz. 

Alors, si ce score de 4 secondes était bon pour un langage interprété du milieu des années 80, de quoi est réellement capable la WP-34S produite 25 ans plus tard au bas mot ? Son CPU ARM variablement cadencé entre 32 KHz et 40 MHz (mais pas souvent à fond) peut-il battre un Atari ST sur des additions entières ? Pour réaliser ce test, il va d'abord falloir s'arracher quelques cheveux pour écrire une version sur-mesure du même programme, optimisée, mais sans changer l'algorithme. 

Bien qu'elle soit moins lisible, car moins bien structurée que la version GFA, du moins en apparence, je suis revenu à ma version en C61 Basic ci-dessous pour servir de référence. Par ailleurs, afin de pouvoir retrouver ses petits dans le programme en mode touche ("keystroke programming") de la WP-34S, les labels (LBL) porteront les même noms que les numéros de ligne du Basic (ex : 30, 40, 60). Voici donc le programme Basic initial :

10 DIM N(10)
20 INPUT"N?",N1
30 L=INT(LOG N1)+1:M=N1:S=0
40 FOR I=L TO 1 STEP-1
50 N(I)=M MOD10:S=S+N(I):M=INT(M/10):NEXT
60 I=I+1:IF I>L THEN I=1
70 M=2*S-N(I):N(I)=S:S=M:IF S<N1 THEN60 
80 IF S=N1 THEN BEEP:PRINT S;"est un Keith":END
90 N1=N1+1:GOTO30

Pour l'utiliser, il suffit de taper le nombre N1 en base 10. Le programme commence par calculer le nombre de chiffres de N1 à la ligne 30 (variable L). Ensuite, à partir de la ligne 40 on décompose N1 en chiffres. Ils seront stockés dans le tableau N(I). On sort de cette première boucle avec la somme des chiffres déjà calculée dans S. Les choses se compliquent un peu après la ligne 60 : il s'agit du calcul des sommes S successives. A la ligne 70, M est une variable temporaire qui contient la nouvelle somme. On retrouvera les valeurs de la suite dans le tableau N(I). Mais il n'y a pas de longue addition avec L opérandes comme on pourrait s'y attendre. Pour optimiser le calcul, j'ai utilisé la formule suivante pour passer au terme suivant de la suite :

M = 2*S - N(I)

On peut représenter cette optimisation avec le schéma ci-dessous. La flèche rouge représente l'addition décrite dans la définition initiale, que je calcule différemment à partir des variables bleues :

Le début de la suite de Keith avec 197.

Il est facile de prouver que cette optimisation est correcte. Par exemple, j'exprime ici les calculs par récurrence à partir d'un nombre dont les 3 chiffres sont respectivement nommés a, b et c :

a, b, c, (a + b + c), b + c + (a + b + c), etc. 

Or :

b + c + (a + b + c) = 2 (a + b + c) - a

Maintenant, si vous avez bien compris mon algorithme, vous ne devriez avoir aucun mal à comprendre le programme WP-34S ! J'ai essayé d'utiliser au mieux la pile (registres X, Y, Z, T). Ceci permet de grappiller quelques pas, même si la lisibilité en prend un coup. Si vous n'avez pas totalement décroché, voici donc ce fameux programme en 55 pas :

Recherche du nombre de Keith immédiatement supérieur pour WP-34S.

Les registres utilisés, en plus de la pile, sont les suivants :

  • R00 : variable nommée N1 dans le programme Basic
  • R01 à R12 : tableau N(I)
  • R13 : somme S
  • R14 : index I

Rien que pour saisir à la main sans erreur ce court programme de 55 pas, comptez entre 10 et 20 minutes, en fonction de votre agilité, et de votre habitude de la machine. Ce que je trouve difficile, pour être rapide avec le clavier surchargé de la WP-34S, c'est qu'il faut mémoriser où sont les fonctions :
  • soit en accès direct (par exemple [BASE10] pour basculer en mode entier 64 bits, c'est la touche [10] en jaune. Le symbole "différent", que j'ai noté comme en C au pas 053, c'est la touche bleue puis [1].) 
  • soit en accès par un menu déroulant (par exemple [DROP] dans le menu [P.FCN])
  • soit en accès par une combinaison (par exemple [STO->] que l'on saisit avec la touche [STO] puis [->] en haut ; ou encore l'échange de X avec Z, touche [x<>Z], que l'on obtient avec la touche verte [x<>] puis [Z])

Très honnêtement, je ne crois pas qu'un lecteur de ce blog ne recopiera jamais ce programme, ni sur une vraie WP-34S, ni sur un émulateur. Néanmoins, si vous trouvez l'exercice fun, n'hésitez surtout pas à poster un petit commentaire ci-dessous !

Pour critiquer un peu l'usage de la machine, il faut bien avouer que le débug n'est pas enfantin sur WP-34S. Néanmoins, il est possible de faire tourner un programme en mode pas à pas, grâce aux flêches verticales sur la gauche. En outre, la touche [SHOW] (bleue) permet de visualiser à chaque étape le contenu de la pile, ainsi que les registres.

En guise de conclusion, les performances de la vraie calculatrice, avec des piles correctes (sinon le calcul plante), ça donne quoi ? Eh bien, avec 7000 en entrée il faut environ 24s à la WP-34S pour afficher le résultat (7385 est le Keith suivant). On peut remarquer sur ce test que le temps de calcul est approximativement dans la même seconde qu'on soit en mode SLOW ou en mode FAST. C'est donc juste six fois plus lent que le programme en GFA Basic.... et assez laborieux à saisir sur le clavier de la WP-34S ; malgré le fait qu'il y ait moins de touches à taper. Et je ne parle pas des phases d'optimisation, et de mise au point du programme, ardues sur WP-34S. Mais là, ça vient peut-être de moi ! Au final, malgré les souhaits de certains clients (les plus de 50 ans ?) on commence à comprendre pourquoi ce style de programmation en RPN est en perte de vitesse chez HP, au profit du Basic, comme sur la très récente HP Prime.

Dans la vidéo d'illustration ci-dessous, je fais les choses suivantes :
  1. j'affiche le niveau des piles (2,8 volts) 
  2. je fais défiler le programme que j'ai publié ci-dessus
  3. je le teste avec les valeurs 100, 197+1, et 7000 :
En résolution 1080p, on peut constater l'usure de l'overlay en vinyle collé sur les touches.



lundi 25 septembre 2017

Elle est libre la WP-34S

Au rythme où je publie les articles dans ce blog, je risque d'avoir du mal à couvrir l'ensemble de ma collection ; même si elle s'agrandit plutôt lentement. La calculatrice que je teste aujourd'hui, bien que très proche des productions HP, n'a jamais été commercialisée officiellement par la marque. Il s'agit de la fameuse WP-34S, que j'ai acquise en 2013. Mon exemplaire est basé sur le hardware de la HP-30b ; mais la HP-20b (à ne pas confondre avec la HP-20S) conviendrait également. La principale différence entre la HP-30b (calculette financière) et la WP-34S (avec S comme scientifique) provient du firmware de cette dernière, qui est diffusé sous licence GPLv3. Ce logiciel a été développé par deux allemands et un australien, tous trois probablement nostalgiques des calculettes RPN : Walter Bonin, Marcus von Cube, et Paul Dale. Mais d'autres contributions au projet sont également notables. Par exemple, celles des américains Eric Rechlin et Gene Wright, qui ont respectivement réalisé les overlays en vinyl, et diffusé des câbles de programmation spécifiques. Dans la genèse de la WP-34S, on peut aussi mentionner le rôle important de Cyrille De Brébisson (HP) qui, dès 2008, avait mis à disposition l'indispensable kit de développement (SDK). Celui-ci était initialement prévu pour la création par les équipes HP du firmware officiel de la HP-20b. Cette démarche, louable, reste exceptionnelle chez les fabricants de calculettes. Et elle ne devrait pas se développer outre mesure dans les années à venir ; peut-être à cause des nouvelles règles aux examens, qui tendent à verrouiller de plus en plus les calculatrices autorisées.

La HP-30b originale a été fabriquée en Chine entre 2010 et 2012 environ. Cependant, grâce aux stocks des distributeurs, il a été possible d'en acheter des neuves au moins jusqu'en 2014. En 2017, on trouve assez facilement des produits reconditionnés à partir de 30€ environ. Cette calculatrice est l'une des rares sur lesquelles on peut flasher un firmware personnalisé, non contrôlé par le constructeur. En sus, quelques améliorations hardware sont possibles. Par exemple, sur la mienne, un cristal de quartz 32,768 kHz et deux condensateurs ont été soudés sur la carte mère. Cette modification permet au firmware de la WP-34S d'accéder à une horloge interne précise. La fonction chronomètre, qui n'est pas si courante sur les calculatrices, est ici directement accessible en deux touches : [CPX] puis [R/S]. Certains utilisateurs de la WP-34S ont également ajouté un port infrarouge pour pouvoir connecter une imprimante. D'autre part, il existe un adaptateur USB interne pour la WP-34S, développé par Harald Pott. Il permet de se passer du câble série d'origine, à la connectique très spécifique. Je possède un exemplaire de ce fameux câble HP qui est équipé d'un bouton "Reset" et d'un bouton "Erase". Comme il n'est plus fabriqué, il pourrait dorénavant être difficile de s'en procurer un. Seulement voilà : on se rend compte rapidement que la WP-34S n'est pas spécialement prédisposée à l'échange régulier de données avec un ordinateur. Néanmoins, ce câble m'a permis de mettre à jour sans encombre le firmware de ma WP-34S en version 3.3. On peut noter que l'ouverture du boîtier de la calculette par l'arrière ne nécessite pas d'outil. Le branchement se fait ensuite avec la prise perpendiculaire à la machine ; ce qui est moyennement pratique, comme on peut le constater sur la photo ci-dessous.

Câble WP-34S (RS-232 prise DB9)

Les piles sont de banales CR2032 montées en parallèle. Lorsqu'elles sont en fin de vie, cette connectique permet de les changer une par une sans effacer l'espace des 2 Ko de RAM sauvegardés par piles. L'afficheur LCD sur deux lignes, malgré une bonne lisibilité, reste quelque peu décevant de nos jours. En effet, la petite matrice graphique, en haut, ne fait malheureusement que de 43 x 6 pixels. Les nombres sont affichés la plupart du temps sur la ligne du bas à segments classiques (12 chiffres de mantisse + 3 chiffres d'exposant).

L'afficheur LCD de la WP-34S

Ces limitations ont pour conséquence, par exemple, que la lecture complète de tous les chiffres significatifs nécessite de faire défiler avec la flèche jaune ou la flèche bleue. Par ailleurs, ces dernières ne sont pas en accès direct sur le clavier ; ce n'est pas très ergonomique. La forme des touches physiques de la WP-34S ressemble à celle des touches de la HP-28S, mais la machine chinoise du XXIe siècle est à cent lieues du silence et du confort de la "vraie HP" fabriquée aux USA en 1988. Et malgré des dimensions d'écrans LCD comparables, on regrette, bien entendu, de ne pas disposer d'un affichage graphique similaire à celui de la HP-28S. Enfin, pour terminer sur ma description sommaire du hardware de la WP, on peut noter que son CPU est un ARM 7 fabriqué par Atmel. Il est cadencé à une fréquence variable comprise entre 32 KHz (économie d'énergie) et 40 MHz. Cette valeur élevée est une excellente surprise sur une calculatrice positionnée plutôt en bas de gamme. Pour le logiciel embarqué, on devra toutefois se contenter des 128 Ko de la ROM "flashable" et de 6 Ko de RAM au total ; ce qui la rapproche du Sharp PC-1500 de 1984 que j'ai testé précédemment.

À l'usage, les concepts en notation RPN implémentés sur la WP-34S reprennent ceux qui avaient fait le succès de la toute première machine programmable que j'ai testée dans ce blog, à savoir la HP-25 de 1976. La programmation en mode séquence de touches est relativement simple, bien qu'elle puisse déboucher sur du code spaghettis, à partir d'une certaine complexité.

Mon packaging WP-34S de collectionneur n'aurait pas été complet si je n'avais pas commandé le gros manuel broché de Walter Bonin (version imprimée pour le firmware 3.2). Ses 244 pages en couleur au format "US letter" pourront êtres lues sans lunettes par les néo-presbytes, dont je fais partie. Et en complément, il existe un manuel aide-mémoire, d'un format plus en adéquation avec la petite taille de la WP-34S, écrit par Andrew Nikitin : http://nsg.upor.net/sys/wp34s/pocket-reference.html. Avec les retouches de zpalm, je m'en suis imprimé un exemplaire en double face sur papier classique (pliage, découpage au massicot, et deux agrafes au milieu).

Comme la bibliographie sur la WP-34S n'est pas colossale sur le net, je vous recommande le visionnage de la présentation de Marcus Von Cube au HHC 2011: "How WP 34S Came Into Existence", et également la présentation de Jake Schwartz au HHC 2012 : "The WP-34S and the HP Calculator Way" (vidéo).

Mon programme habituel, sur ce blog, de test de primalité, est à peu près identique à celui que j'avais écrit pour la HP-15C en 2012. Ici, j'ai supprimé les commentaires, mais je n'ai pas cherché à optimiser quoi que ce soit, pour ne pas fausser la comparaison. Le programme ci-dessous occupe donc également 39 pas. D'autre part, on peut utiliser des labels numériques sur la WP-34S, mais sur deux caractères :

001  ENTER
002  STO 00
003  2
004  STO 02
005  /
006  FP
007  x=0?
008  GTO 02
009  3
010  STO 02
011  ENTER
012  RCL 00
013  \/x
014  IP
015  STO 01
016  LBL 00
017  x>=? Y
018  GTO 01
019  GTO 03
020  LBL 01
021  RCL 00
022  ENTER
023  RCL 02
024  /
025  FP
026  x=0?
027  GTO 02
028  2
029  STO+ 02
030  RCL 02
031  ENTER
032  RCL 01
033  GTO 00
034  LBL 02
035  RCL 02
036  RTN
037  LBL 03
038  1
039  RTN

Dans le listing ci-dessus, j'ai représenté la touche racine carrée par "\/x".


Avec le nombre 524287 en entrée, le résultat 1 (=> nombre premier) s'affiche en à peine plus d'une seconde sur la WP-34S. Pour obtenir une mesure plus précise, j´ai ajouté quelques instructions qui permettent de faire appel à l'horloge interne de la calculette : j'obtiens une durée d'exécution comprise entre 11 et 15 ticks en mode FAST (1 tick = 0,1 seconde), et jusqu'à 17 ticks en mode SLOW. C'est la calculatrice la plus rapide que j'aie testé jusqu'à présent ! Seul l'Atari ST faisait mieux... mais il ne peut pas fonctionner sur une seule pile 3V, et sa consommation est très supérieure à 0,25 mW.

Parmi les autres programmes que j'ai créés pour la WP-34S, le plus long, en nombre de pas, est celui que j'avais publié en avril 2014, titré "Le petit professeur sort enfin du Texas", dans la Gazette des Pocketiquaires numéro 3 (page 55). Il s'agissait d'un remake du jeu électronique bien connu "Little Professor", édité par Texas Instruments en 1976. Dans le listing que j'ai publié, attention à la saisie de la ligne 118, par exemple, que j'ai notée de la façon suivante :

118 [alpha]IP 02

Il s'agit d'une fonction qui est est bien décrite dans le manuel :

Fonction [ALPHA]IP sur WP-34S
Petite astuce : pour accéder plus rapidement dans le catalogue de la WP-34S aux fonctions commençant par une lettre grecque comme α, on peut appuyer sur la touche [g], pour l'alphabet grec, suivie des lettres voulues. Ici, on pourra donc utiliser la séquence de touche suivante pour un accès direct à cette fameuse fonction AIP :

[h][X.FCN][g][α][I]

Il faut procéder assez rapidement entre les touches [α] et [I] ; sinon on revient aux fonctions qui commencent par 'I'.

En conclusion, le projet WP-34S était une excellente idée, dont la réalisation finale est très aboutie, malgré le hardware HP un peu limité. Certes, cette machine n'est pas destinée à tous les utilisateurs, mais les plus expérimentés sauront en extraire la substantifique moelle.

samedi 28 janvier 2017

Le Sharp PC-1500, machine mythique des années 80

L'ordinateur de poche que j'ai sous les yeux aujourd'hui est un Sharp PC-1500A. Cette machine fut fabriquée entre 1984 et 1985. Avec ce 'A', la firme d'Osaka apporte au moins quatre améliorations au PC-1500 qui avait été présenté dès 1981 :
  • la quantité de RAM d'origine a été augmentée
  • la couleur est brun plus sombre en haut de la façade alu
  • la sérigraphie est légèrement différente
  • quelques corrections ont été réalisées dans la ROM 

Le microprocesseur est toujours le LH5801 CMOS, avec son jeu d'instruction proche du Z80. Il reste cadencé à 1,3 MHz. Du côté de la RAM, le PC-1500A, armé de 8,5 Ko au total, dont seulement 6144 octets pour l'utilisateur, et 5946 octets pour le Basic, bridera toute velléité de programmation trop complexe. Un module d'extension pourra même devenir rapidement indispensable.

Loin du style rébarbatif de certaines documentations, les manuels Sharp présentent un contenu très pédagogique, avec une bonne dose d'humour. Le mini clavier qwerty du PC-1500, à touches décalées, est plutôt confortable. Cependant, pour éviter la frappe fastidieuse de certaines commandes, les concepteurs ont imaginé un système d'abréviation des commandes Basic. Les mnémoniques, à 1 ou 2 caractères, sont faciles à mémoriser. Par exemple, voici quelques instructions d'usage fréquent :

G. GOTO
I. INPUT
N. NEXT
P. PRINT
R. RUN
T. THEN

L'indication discrète du niveau des piles, par un point en haut de l'écran LCD, est assez peu fréquente pour que je la signale ici. Le mode réserve, qui permet de mémoriser des mots clés, ou des phrases, est également spécifique à cette lignée de machines.

Sharp PC-1500A

Le PC-1500A offre donc un environnement simplifié idéal pour apprendre la programmation et les concepts universels que l'on doit à John Von Neumann. Et avec toutes ces qualités, je m'étonne que les machines de poche japonaises n'aient jamais été retenues par l'Éducation Nationale française pour équiper les lycéens et les enseignants des années 80. J'ai retrouvé quelques prix pratiqués à l'époque :
  • Thomson MO5 : 2390 francs   (le choix de l'Éducation nationale, en 1985)
  • Sharp PC-1500A : 2200 francs
  • Casio PB-700 avec module OR-4 : 2090 francs

Par rapport à sa concurrente Casio, le graphisme sur l'écran LCD du PC-1500 est limité à 156x7 pixels. Ceci pourra éventuellement être compensé par l'imprimante traceur à 4 stylos de couleur ; la Sharp CE-150. Par ailleurs, pour les bidouilleurs, le PC-1500, grâce aux fameuses instructions PEEK, POKE et CALL, présente un avantage déterminant sur la très verrouillée Casio PB-700. En effet, celles-ci permettent l'accès total au système et au langage machine LH5801. Toutefois, on ne disposera pas du confort d'un assembleur intégré, comme c'est le cas sur la Casio PB-1000. Dans les années 80, le succès planétaire des machines Sharp a permis l'éclosion de nombreuses publications et livres qui leur étaient dédiés. Par exemple, j'ai sous la main "Basic, Système et Langage Machine - Voyage à l'intérieur du Sharp PC-1500/A" de Jean-Christophe Krust (1984). Ce bouquin détaille, entre autres, la structure mémoire de l'afficheur LCD, que je me suis amusé à redessiner en couleur ci-dessous. Les 156 colonnes de 7 pixels sont codées d'une façon que je qualifierais de "non triviale", répartis en deux blocs de 78 octets :
  • bloc 1 : à partir de l'adresse &7600 jusqu'à à &764E
  • bloc 2 : de &7700 à &774E

Chacun de ces blocs code simultanément deux parties non contiguës de l'afficheur :
  • le bloc 1 (en bleu et rose sur la figure) contrôle l'affichage des colonnes numérotées à partir de la gauche, de 0 à 38, et de 78 à 116. 
  • le bloc 2 (en vert et jaune) contrôle l'affichage des colonnes de 39 à 77, et de 117 à 155

Carte mémoire de l'afficheur LCD du Sharp PC-15000

Les octets pairs correspondent aux 4 pixels du haut de l'afficheur (exemple encadré en rouge). Tandis que les octets impairs contiennent l'information pour les 3 pixels du bas ; avec leur dernier bit qui n'est pas utilisé.

Enfin, un ultime effet Kiss Cool qui ne facilite pas la représentation mentale, chaque octet est coupé en deux :
  • les 4 bits de poids faible de chaque octet sont pour la partie gauche de l'afficheur 
  • les 4 bits de poids fort pour la partie droite, adressée par le même bloc

Comme on peut le visualiser sur la figure, j'ai choisi pour l'exemple 4 pixels de l'écran, qui peuvent être noircis en deux POKE :

10:POKE &7600,32
20:POKE &7703,81
30:IF INKEY$ <>" "THEN GOTO 30
40:PRINT POINT 118

L'instruction Basic "POINT" permet de connaître l'état des pixels affichés. Ici, le résultat retourné pour la colonne 118 sera 80 (soit 01010000 en binaire). Avez-vous suivi mon explication ? :-)

À l'instar de sa descendance, le Sharp PC-1500 ne dispose pas de la fonction modulo. J'ai donc adapté mon programme de test de primalité à partir de la version PC-E500 :

10:INPUT "N?",N
20:J=INT (SQR (N)):I=2
30:IF (N-2*INT (N/2))=0THEN 80
40:FOR I=3TO JSTEP 2
50:IF (N-I*INT (N/I))=0THEN 80
60:NEXT I
70:BEEP 1:PRINT "1":GOTO 10
80:PRINT I:GOTO 10

Avec 2701 en entrée, qui n'est pas un nombre premier, ce programme répond "34" très vite. Mais avec 524287, qui est premier, le programme répondra "1" (son plus petit diviseur)  au bout de 26 secondes. C'est un chrono dans le même ordre de grandeur que sa contemporaine, la Casio PB-700. Pour chipoter, on remarquera rapidement que certains espaces insérés automatiquement par l'éditeur sont parfois superflus sur cet écran de 26 caractères de large. Pour compléter mes tests sur le PC-1500A, j'ai également porté mon programme de recherche des nombres de Keith :

10:DIM N(10)
20:INPUT "N?",N1
30:L=INT (LOG N1)+1:M=N1:S=0
40:FOR I=LTO 1STEP -1
50:N(I)=M:M=INT (M/10):N(I)=N(I)-10*M:S=S+N(I):NEXT I
60:I=I+1:IF I>LTHEN LET I=1
70:M=2*S-N(I):N(I)=S:S=M:IF S<N1THEN 60
80:IF S=N1THEN BEEP 1:PRINT S;" est un Keith":END
90:N1=N1+1:GOTO 30

Avec 7000 en entrée, on obtient "7385 est un Keith" en un peu plus de 9 minutes. La hiérarchie établie au test précédent est respectée : malgré sa fréquence de CPU un peu plus élevée, la Sharp PC-1500 (1981) est donc un peu plus lente que la Casio FX-850P (1987).