χ\chiCAS pour Numworks N0110

Bernard.Parisse@univ-grenoble-alpes.fr

Novembre 2022

Avertissement : Depuis aout 2021, Numworks verrouille ses calculatrices et les ferme aux développements tiers. Il est donc essentiel de ne pas mettre à jour votre calculatrice sur le site de Numworks.. Si vous avez mis à jour vers Epsilon en version 16 ou plus ou si votre calculatrice est déjà en version 16 ou plus, des failles logicielles trouvées par la communauté permettent dans certains cas de déverrouiller votre calculatrice.

Si vous achetez une calculatrice Numworks d’occasion, demandez au vendeur si le numéro de version du logiciel est \leq15.5. Si vous achetez une calculatrice chez Numworks que vous ne pouvez pas déverrouiller, vous pouvez utiliser votre droit de rétractation pour la retourner.

Pour échanger des fichiers, vous pouvez utiliser ce kit de connexion Numworks ou une version à jour de Xcas (1.7.0-31 au moins) qui permet dorénavant d’échanger des programmes entre la calculatrice et votre ordinateur.

Les versions récentes de Khi/KhiCAS ajoutent une protection contre une mise à jour sans intervention de l’utilisateur.

Si vous trouvez cette évolution désastreuse, je vous invite à contacter Numworks et leur faire part de votre opinion. Diffusez l’information aux personnes susceptibles de faire une mise à jour, par exemple à vos camarades de lycée ou à vos élèves si vous êtes profs. Prenez garde si vous vous connectez sur le workshop de Numworks, le site vous propose cette mise à jour sans vous avertir que cela bloque χ\chiCAS .

Table des matières

1  Introduction

Ce document explique comment prendre en main et utiliser efficacement sur calculatrices Numworks N0110 le système de calcul formel χ\chiCAS, une version adaptée du logiciel Xcas pour cette calculatrice. χ\chiCAS permet de transformer votre calculatrice graphique en calculatrice graphique formelle (CAS) pour faire du calcul littéral (développer, factoriser, calculer une limite, une dérivée, une primitive, résoudre des équations, faire du calcul matriciel exact ou approché, ...) et ajoute aussi des fonctionnalités pour les élèves qui envisagent une poursuite d’études en sciences ou en maths : table périodique des éléments, plus grande varitété de représentations graphiques (suite récurrentes, champ de tangentes et solution d’une équation différentielle, lignes de niveau...), géométrie analytique, arithmétique et cryptographie (corps finis premiers et extensions, polynômes, etc.), algèbre, algèbre linéaire, analyse numérique, calcul flottant multi-précision et certifié (arithmétique d’intervalle), etc.

χ\chiCAS propose aussi une application tableur et une application de géométrie (2d/3d), qui permet de combler l’absence de ces fonctionnalités dans le système Epsilon fourni par Numworks. Enfin, un interpréteur MicroPython est maintenant inclus dans χ\chiCAS pour les programmes qui nécessitent une compatibilité stricte avec Python que le mode de compatibilité de Xcas n’apporte pas. Ce MicroPython est plus complet que celui de Numworks, il comprend un module permettant de faire du calcul formel, un module d’arithmétique (test de primalité, PGCD, identité de Bézout), deux modules pour faire du calcul vectoriel et matriciel et trouver des racines de polynome et un module graphique plus complet (polygones, cercles, formes remplies). La version la plus récente de KhiCAS permet de faire des représentations graphiques en 3d (cf. l’appendice B).

Toutes les fonctionnalités de χ\chiCAS sont intégrées, on peut représenter sur un même graphique un histogramme et un graphe de fonction et une droite, on peut écrire un programme pour faire une simulation et représenter les résultats graphiquement, ou utiliser les fonctions mathématiques dans un programme en syntaxe Python ou utiliser un programme en syntaxe Python dans le tableur.

La philosophie de χ\chiCAS est très éloignée de celle du système Epsilon de la Numworks qui a des applications ciblées, faciles à utiliser, mais aux fonctionnalités mathématiques relativement limitées et qui communiquent peu entre elles. Ici, on passera un peu de temps à apprendre comment utiliser le shell et les outils d’édition pour ensuite les faire travailler harmonieusement ensemble, sans autres limites que la mémoire (malheureusement vite remplie) et la vitesse de la Numworks (tout à fait raisonnable pour une calculatrice). Il est donc fortement recommandé de lire cette documentation pour une utilisation optimale de χ\chicas, à l’exception de la section 19 qui s’adresse uniquement aux programmeurs qui souhaitent programmer leur calculatrice en C ou C++.

N.B. : Ce document est interactif, vous pouvez modifier les commandes et voir le résultat de l’exécution des commandes proposées en exemple en cliquant sur le bouton exe (ou en validant avec la touche Entrée).

2  Installation

Attention, certains concours ou examens interdisent l’utilisation de calculatrices formelles. Il est de la responsabilité de l’utilisateur de vérifier que les calculatrices formelles sont autorisées avant d’utiliser χ\chiCAS dans un examen ou concours. Les auteurs ne sauraient être tenus pour responsables en cas d’utilisation non autorisée.

Avant d’installer ou mettre à jour χ\chiCAS, pensez à sauvegarder vos données, car elles pourraient être effacées. Si vous faites une mise à jour, il pourra être nécessaire de faire reset+4 sur votre calculatrice pour accéder à la flash (i.e. appuyer sur la touche 4, puis enfoncer une pointe à l’arrière sur reset, relacher la touche 4). Puis choisir une des méthodes :

  1. Via Internet avec un navigateur compatible avec webUSB
    Cliquez sur ce lien en utilisant un navigateur supportant web USB tel que Chromium ou Edge ou Google Chrome. Connectez la calculatrice et cliquez sur le bouton Installer ou mettre à jour KhiCAS.
  2. Depuis Xcas (Windows et Linux)
    C’est une méthode d’installation locale (une fois Xcas installé)1.
    Connecter la calculatrice, ouvrez Xcas, puis dans le menu Fich, sous-menu Numworks, sélectionner Installer KhiCAS sur la calculatrice. Lorsqu’on vous demande de faire un reset de la calculatrice, appuyez sur le bouton RESET à l’arrière de la calculatrice.
  3. Installation manuelle
    Pour installer ou mettre à jour χ\chiCAS sur votre Numworks N0110 : récupérez sur votre ordinateur le fichier khi.zip.
    • Si nécessaire, installez dfu-util
      • sur Mac, installez brew si nécessaire puis depuis un Terminal (dans Utilitaires) faire
        brew install dfu-util
      • sous Linux debian compatible, ouvrir un Terminal et faire
        sudo apt-get install dfu-util
        Vous pouvez aussi compilez et installer à partir du source.
        Récupérez ce fichier et copiez le dans /etc/udev/rules.d. Si vous avez installé un package debian, cela peut se faire par la commande
        sudo cp /usr/share/giac/doc/50-numworks-calculator.rules /etc/udev/rules.d Vous pouvez aussi créer un fichier /etc/udev/rules.d/50-numworks-calculator.rules de contenu :
        SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="a291", TAG+="uaccess"
        SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="df11", TAG+="uaccess"
        
      • sous Windows, téléchargez et installez la version 64 bits ou 32 bits (provenance). L’exécutable s’appelle dfu-util-static.exe. Si nécessaire éditez le fichier updaten110.bat (64 bits) ou updaten110_32.bat (32 bits) pour adapter les chemins d’installation. Le fichier actuel suppose que l’on a desarchivé khi.zip et dfu-util-0.9-win64.zip depuis le même répertoire racine (par exemple c:\temp) et qu’on lance updaten110.bat (64 bits) ou updaten110_32.bat (32 bits) en cliquant sur le fichier dans l’explorateur de fichiers.
    • Tapez la commande ./updaten110 (Linux/Mac) ou exécutez updaten110.bat (Windows 64 bits) ou updaten110_32.bat (Windows 32 bits). Les commandes dfu-util sont les suivantes
      dfu-util -i 0 -a 0 -s 0x08000000 -D bootloader.bin -R
      dfu-util -i 0 -a 0 -s 0x90000000 -D khi.A.bin -R
      dfu-util -i 0 -a 0 -s 0x90180000 -D khi.B.bin -R
      dfu-util -i 0 -a 0 -s 0x90200000:force -D apps.tar
      
      Vous pouvez ajouter des fichiers scripts Python ou sessions Xcas (ou même des programmes) à l’archive apps.tar avec la commande tar rvf apps.tar <filenames>. Ils seront alors visibles depuis χ\chiCAS hors mode examen (et l’ajout est compatible avec la certification du firmware disponible depuis le kit de connexion Numworks).

Après installation, redémarrez la calculatrice par appui sur le bouton RESET si nécessaire.

Multi-boot
Si vous avez installé une version récente de χ\chiCAS, votre calculatrice peut dorénavant lancer deux firmwares :

Pour vérifier l’état des slots de votre calculatrice, maintenez la touche 4 enfoncée et en appuyant sur le bouton RESET à l’arrière, puis relachez la touche 4. Cela lance le multi-boot et affiche le contenu des slots. Notez que le slot 3 est incompatible avec χ\chiCAS (il s’agit du slot B du multi-boot φ\varphi).

Pour passer du slot 1 au slot 2, appuyez sur la touche 1 ou 2, faites simultanément RESET à l’arrière, puis relachez la touche 1 ou 2.

Protection contre des sites potentiellement malveillants
Si vous ne l’avez pas déjà fait, mettez à jour χ\chi et χ\chiCAS afin de bénéficier d’un minimum de protection si vous naviguez sur Internet avec votre calculatrice branchée. Une fois cela fait, en fonctionnement normal, il est impossible à un site d’écrire dans la flash de la calculatrice. Vous ne pourrez modifier la flash qu’en activant le multi-boot (par reset+4) ou le mode de récupération (reset+6). Soyez particulièrement vigilants avant de faire reset+4 ou reset+6. En particulier, si vous voulez conserver le controle de votre calculatrice (éviter un verrouillage) et la compatibilité avec χ\chiCAS, ne faites jamais reset+4 ou reset+6 depuis les sites de Numowrks même si on vous le demande. Si votre calculatrice est bloquée ou pour échanger des scripts, rendez-vous sur mon kit de connexion Numworks.

Mode examen
L’installation de χ\chiCAS et χ\chi dans les slots 1 et 2 est conforme à la réglementation française du mode examen. Un surveillant d’examen qui souhaite s’assurer qu’une calculatrice Numworks n’a pas subi de modifications pour frauder peut le certifier depuis mon kit de connexion Numworks.

Lancement de χ\chiCAS
Tapez sur la touche Back puis Entree pour lancer χ\chiCAS.

Licences d’utilisation :
la licence choisie par Numworks pour son système d’exploitation rend impossible la publication d’un firmware binaire unique contenant également un logiciel libre. Le logiciel est donc décomposé en deux parties, khi.*, sous licence Creative Commons Attribution-NonCommercial- ShareAlike 4.0 International Public License et apps.tar sous licence GPL2.

Numworks verrouillée
Si votre calculatrice est verrouillée et que vous n’arrivez pas à la déverrouiller, il est possible d’installer une version dégradée de χ\chiCAS dessus depuis le site de Nwagyu. Cette version dégradée est malheureusement incapable de lire/sauvegarder/échanger des sessions ou des scripts Python, n’est pas accessible en mode examen et est désactivée en cas de crash ou de reset.

3  Premiers pas

Depuis le menu principal de la Numworks, tapez la touche Back ou déplacez le curseur jusqu’à l’icone KhiCAS puis tapez EXE. Ceci ouvre un “shell” dans lequel vous pouvez taper la plupart des commandes de calcul formel de Xcas. Au premier lancement, vous avez le choix de l’évaluateur entre Xcas et MicroPython, on suppose ici que vous choisissez Xcas en tapant OK ou EXE. Si vous avez choisi MicroPython, lisez la section correspondante 13. Pour passer à Xcas (respectivement Python), depuis une ligne de commande vide, taper les touches shift ) 8 OK.

Pour revenir au menu principal de la Numworks, il faut taper HOME plusieurs fois (2 fois depuis le shell).

Par exemple, tapez 1/2+1/6 puis EXE, vous devriez voir le résultat 2/3 s’afficher sur la ligne du dessous.

Vous pouvez recopier dans la ligne de commande une commande de l’historique en utilisant le curseur vers le haut ou vers le bas puis EXE, puis vous pouvez modifier la commande et l’exécuter. Par exemple, taper sur la touche curseur vers le haut, EXE et remplacez 1/6 par 1/3.

Vous pouvez utiliser le résultat de la dernière commande avec la touche Ans de la calculatrice. Il vaut en général mieux définir une variable comme résultat d’une commande si on souhaite la réutiliser. Pour cela, on utilise une des deux instructions d’affectation :

Pour vous aider à saisir les commandes Xcas les plus utiles, χ\chiCAS dispose d’un catalogue d’une centaine de commandes, avec une courte description et le plus souvent un exemple d’exécution facile à recopier. Appuyez sur la touche Toolbox, choisissez une catégorie avec le curseur, par exemple Algebre, tapez EXE, puis choisissez une commande avec le curseur, par exemple factor. Un deuxième appui sur la touche Toolbox vous affiche une courte description de la commande, en général avec un exemple. En tapant sur Ans (ou EXE), vous recopiez l’exemple en ligne de commande. Vous pouvez alors valider (EXE) ou modifier la commande et valider (EXE) pour factoriser un autre polynôme que celui donné en exemple. Essayez avec factor (touche Toolbox, puis Algebre).

Parmi ces commandes, celles qui sont le plus utilisées sont accessibles par des menus rapides activés par la touche shift suivi d’un chiffre, de ., de 10^x, de ( ou de ), comme le rappelle la ligne en bas de l’écran, par exemple shift suivi de 1 affiche un menu d’algèbre où on retrouve la commande factor.

Lorsqu’une commande est entrée sans arguments, un “tooltip” (petit rectangle sur fonds jaune) affiche une courte description de ce que fait la commande et la syntaxe, pour voir en entier l’aide sur la commande il suffit de taper sur la touche flèche vers le bas (ou sur la touche var). Taper sur Ans pour entrer les arguments du premier exemple de l’aide. Taper sur la touche Back (à droite de OK) pour effacer le tooltip.

Lorsque vous exécutez une commande et qu’elle renvoie une expression, celle-ci est affichée en écriture naturelle (affichage 2-d). Vous pouvez faire défiler l’affichage avec les touches du curseur lorsque l’expression est grande. Tapez sur Back (à droite de OK) pour revenir au shell.

Maintenant essayez de taper la commande plot(sin(x)). Indication: tapez Toolboox, puis sélectionner Courbes, ou utilisez le menu rapide shift 3.

Lorsqu’une commande renvoie un graphe, celui-ci est affiché. Vous pouvez modifier la fenêtre graphique d’affichage avec les touches + ou - (zoom in ou out), les touches du curseur, orthonormaliser le repère (touche /) ou faire une recherche automatique de l’échelle (autoscale touche *). Pour enlever ou remettre les axes et graduations, tapez sur var. Tapez sur Back pour revenir au shell.

Vous pouvez effacer l’historique des calculs et les variables pour commencer un nouvel exercice : depuis le menu HOME sélectionnez 9 Effacer historique. Vous avez ensuite le choix entre effacer l’écran en conservant les variables (OK) ou en les effaçant (Back). Vous pouvez visualiser la place occupée par les variables en tapant sur la touche var. Pour effacer une variable pour faire de la place en mémoire, sélectionnez la commande purge dans ce menu, puis taper le nom de variable à effacer (ou sélectionnez la variable depuis le menu var).

Pour quitter χ\chiCAS depuis le shell, appuyez sur la touche HOME 2 fois. Lorsque vous lancez une autre application, les variables et l’historique des calculs sont sauvegardés, ils seront restaurés lorsque vous reviendrez dans χ\chiCAS.

Remarques :

4  Sauvegarde et échange de données.

4.1  Depuis un navigateur comme Chromium ou Chrome, compatible webusb

4.2  Depuis Xcas pour Windows, Linux

Vérifiez que Xcas. est en version 1.7.0-31 ou ultérieure, si nécessaire installez ou mettez à jour.

Sous Linux, vérifiez que dfu-util est bien installé et que le fichier 50-numworks-calculator.rules a été copié dans /etc/udev/rules.d. Si vous avez installé un package debian, cela peut se faire par la commande
sudo cp /usr/share/giac/doc/50-numworks-calculator.rules /etc/udev/rules.d

Les outils pour se connecter avec la Numworks se trouvent dans le menu Fich, sous-menu Numworks. Vous pouvez :

Sur Mac, il est recommandé d’utiliser le kit de connectivité web Numworks de la section précédente.

4.3  Gestion de la mémoire flash sur la calculatrice

Depuis la version du 14 octobre 2021, vous pouvez lancer un mini-gestionnaire de fichiers en flash (actuellement en phase de test beta) depuis le menu Applications de KhiCAS (touche Home puis valider puis avant-avant-dernier item). Ce gestionnaire permet

Attention, si vous faites des modifications, cela écrit en flash, or on ne peut pas écrire indéfiniment sur le même secteur en flash (pour la flash externe, Numworks a assigne une taille de 64K aux secteurs). Pour augmenter la durée de vie de la mémoire flash, il est conseillé de ne vider la corbeille que lorsqu’il est vraiment nécessaire de faire de la place. En effet, si on ne vide pas la corbeille, les nouveaux fichiers ajoutés en flash vont progressivement être écrits dans de nouveaux secteurs, ce qui répartira mieux l’usure de la flash. (Un “vrai” système de fichiers fait normalement cela automatiquement). Si vous n’avez pas besoin de beaucoup de place pour stocker des fichiers par rapport au 1M de disponible, vous pouvez aussi ajouter un gros fichier inerte de taille un multiple de 64K vers le début de l’archive (à partir du fichier d’indice 10 si vous voulez conserver la certification), que vous changez de temps en temps.

Par ailleurs, lorsque vous lancez le mode examen, l’état de la calculatrice est automatiquement sauvegardé dans le dernier secteur de la mémoire flash (sauf s’il n’y a aucun script Python). Plus tard, lorsque vous avez quitté le mode examen (en branchant la calculatrice), vous pouvez restaurer l’état de la calculatrice depuis le menu HOME, Configuration/mode examen.

5  Commandes usuelles de calcul formel

5.1  Développer et factoriser

Depuis le catalogue, sélectionner le sous-menu Algebre (2) ou le menu rapide shift-1

5.2  Analyse

Depuis le catalogue (Toolbox), sélectionner le sous-menu Analyse (4) ou le menu rapide shift-2

5.3  Résoudre

Depuis le catalogue, sélectionner le sous-menu Resoudre (Toolbox puis touche ln)

5.4  Arithmétique

Lorsque cela est nécessaire, on distingue l’arithmétique des entiers de celle des polynômes par l’existence du préfixe i (comme integer) dans un nom de commande, par exemple ifactor factorise un entier (pas trop grand) alors que factor factorise un polynôme (et cfactor factorise un polynôme sur les complexes). Certaines commandes fonctionnent à la fois pour les entiers et les polynômes, par exemple gcd et lcm.

5.4.1  Entiers

Depuis le catalogue, sélectionner le sous-menu Arithmetic, Crypto (Toolbox 5)

Les commandes asc et char permettent de convertir une chaine de caractères en liste d’entiers (entre 0 et 255) et réciproquement, ce qui permet de faire facilement de la cryptographie avec des messages sous forme de chaines de caractères.

5.4.2  Polynômes

Depuis le catalogue, sélectionner le sous-menu Polynomes (8). La variable est par défaut xx, sinon il faut la spécifier en général en dernier argument, par exemple degree(x^2*y) ou degree(x^2*y,x) renvoient 2, alors que degree(x^2*y,y) renvoie 1

5.4.3  /n\mathbb{Z}/n\mathbb{Z} et corps finis

Pour travailler avec des classes modulo nn, utiliser la notation a mod n, par exemple sqrt(2 mod 7). Ceci s’applique aussi pour travailler sur des corps finis premiers /p\mathbb{Z}/p\mathbb{Z}. Pour travailler sur des corps finis non premiers, il faut d’abord définir le corps avec GF, puis on utilise un polynôme en le générateur du corps.

5.5  Algèbre linéaire, vecteurs, matrices

Xcas ne fait pas de différence entre vecteur et liste. Par exemple pour faire le produit scalaire de deux vecteurs, on peut saisir :

v:=[1,2]; w:=[3,4]

onload

Pour saisir une matrice élément par élément, taper sur shift-7 (touche M comme matrice) puis matrix( ou HOME i (editer matrice). Vous pouvez ensuite créer une nouvelle matrice ou éditer une matrice existante parmi la liste de variables proposées. Pour de petites matrices, vous pouvez aussi entrer en ligne de commandes une liste de listes de même taille. Par exemple pour définir la matrice A=(1 2 3 4)A=\left(\begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array}\right) on tape

A:=[[1,2],[3,4]]

onload
ou

Il est fortement conseillé de stocker les matrices dans des variables pour éviter de les saisir plusieurs fois.

Pour entrer une matrice dont les coefficients sont donnés par une formule, on peut utiliser la commande matrix, par exemple

renvoie la matrice dont le coefficient ligne jj et colonne kk vaut 1j+k+1\frac{1}{j+k+1} (attention les indices commencent à 0).

La matrice identité de taille nn est renvoyée par la commande idn(n), alors que ranm(n,m,loi,[parametres]) renvoie une matrice à coefficients aléatoires de taille n,mn,m. Par exemple



Pour exécuter une commande sur des matrices, s’il s’agit d’arithmétique de base (+,-,* inverse), on utilise les opérations au clavier. Pour les autres commandes. depuis le catalogue, sélectionner le sous-menu Matrices (Toolbox sin)

6  Probabilités et statistiques

6.1  Tirages aléatoires

Depuis le catalogue, sélectionner le sous-menu Probabilites (Toolbox 9) puis sélectionnez
(réel selon la loi uniforme dans [0,1][0,1]) ou
(entier entre 1 et nn). De nombreuses autres fonctions aléatoires existent, avec comme préfixe rand, suivi par le nom de la loi, par exemple randbinomial(n,p) renvoie un entier aléatoire selon la loi binomiale de paramètres n,pn,p. Pour créer un vecteur ou une matrice aléatoire, utiliser la commande ranv ou ranm (menu Alglin, Matrice), par exemple pour un vecteur de 10 composantes selon la loi normale centrée réduite

6.2  Lois de probabilités

Depuis le catalogue, sélectionner le sous-menu Probabilites (9). Les lois proposées dans le catalogue sont la loi binomiale, la loi normale, la loi exponentielle et la loi uniforme. D’autres lois sont disponibles depuis Tout : chisquared, geometric, multinomial studentd, fisherd, poisson.

Pour obtenir la distribution cumulée d’une loi, on saisit le nom de la loi et le suffixe _cdf (sélectionner cdf dans le catalogue sous-menu Probabilités et taper Ans). Pour obtenir la distribution cumulée inverse, on saisit le nom de la loi et le suffixe _icdf (sélectionner cdf dans le catalogue sous-menu Probabilités et taper EXE).

Exemple : calcul de l’intervalle centré II pour la loi normale de moyenne 5000 et d’écart-type 200 tel que la probabilité d’être en-dehors de II soit de 5% :

6.3  Statistiques descriptives 1-d

Ces fonctions agissent sur des listes par exemple

l:=[9,11,6,13,17,10]

onload
Depuis le catalogue, sélectionner le sous-menu Statistiques (Toolbox log)

Pour les statistiques 1-d de listes avec effectifs, on remplace l par deux listes de même longueur, la 1ère liste est la liste des valeurs de la série statistique, la 2ème liste est la liste des effectifs. Voir aussi les commandes du menu shift-3 histogram et barplot.

6.4  Statistiques descriptives 2-d, régressions.

Voir aussi la section 15 expliquant le tableur.

Entrez les deux listes de données dans deux variables, par exemple X:=[1,2,3,4,5] et Y:=[3,5,6,8,11], ou dans une variable matrice ayant 2 colonnes, depuis le shell avec le menu shift-6 8 matrix(.
Depuis le catalogue, sélectionner le sous-menu Statistiques (touches Toolbox log), pour les régressions, depuis le shell, tapez shift-6.

Ainsi pour afficher la droite de régression linéaire correspondant aux données X=[1,2,3,4,5] et Y=[3,5,6,8,11], tapez les deux commandes ci-dessus ou éditez une matrice ayant 2 colonnes avec le raccourci shift-6 8. Puis shift-6 EXE (ou Toolbox log puis sélectionnez la commande linear_regression_plot() complétez la commande par X,Y) ou par le nom de variable de la matrice puis EXE.

Remarque : si vos données sont dans une matrice m ayant 2 lignes au lieu de 2 colonnes, vous pouvez utiliser m^* pour transposer (en fait cela transconjugue, ce qui est identique pour des données réelles).

7  Courbes et autres représentations graphiques.

Pour obtenir une représentation graphique, on saisit une commande de tracé (ou plusieurs commandes séparées par ;). Depuis le catalogue, sélectionner le sous-menu Courbes (accès rapide par Toolbox 7, ou shift-3 depuis le shell).

Lorsqu’un graphique comporte des tracés de courbes (graphes de fonction, courbes en paramétriques ou en polaires), le mode “trace” est activé par défaut. Dans ce mode, l’appui sur la touche curseur vers la droite ou la gauche permet de déplacer un pointeur sur la courbe active, en affichant les coordonnées du pointeur (et du paramètre pour une courbe en paramétriques) et d’un vecteur tangent. S’il y a plusieurs arcs de courbe, les touches de curseur haut et bas permettent de changer l’arc d’étude. L’appui sur shift-2 permet d’afficher les informations sur la courbe courante, si on confirme par OK ou EXE on accède à un tableau de valeurs.

Le menu Toolbox item 2 étude de courbes (raccourci touche x,n,t) permet d’ajouter un vecteur normal pointant vers le centre de courbure (raccourci shift-4), ou/et le cercle osculateur (shift-5) et le rayon de courbure. On peut aussi à partir de ce menu déplacer le pointeur vers une position déterminée, ou vers un point remarquable: racine, tangente horizontale ou verticale, point d’inflexion, intersection avec un autre arc de courbe. On peut enfin calculer une longueur d’arc ou l’aire sous la courbe entre le pointeur et la marque.

Lorsque vous faites une étude de courbe, les variables x0,x1,x2,y0,y1,y2 sont automatiquement affectées avec l’expression de la position, vitesse et accélération sur la courbe étudiée. Lors de la recherche d’une racine, tangente horizontale, inflexion, longueur d’arc, aire sous la courbe, des variables contenant la dernière recherche sont crées.

Le menu Options (Toolbox ,) vous permet de spécifier certaines options graphiques :

Les versions récentes de χ\chiCAS permettent de représenter en 3d ou 4d des fonctions de 2 variables à valeur réelle ou complexe, par exemple plot(x^2-y^2) pour représenter la fonction de 2mahtbbR\mathbb{R}^2 \rightarrow \mahtbb{R} ou plot((x+i*y)^2-9) pour représenter la fonction de mahtbbC\mathbb{C} \rightarrow \mahtbb{C} qui à zz associe z 29z^2-9. Dans ce dernier cas, le module est représenté selon l’axe OzOz et l’argument par une couleur de l’arc en ciel, de π-\pi en bleu violet à 0 en vert (en passant par jaune et orange) et de 0 à π\pi en passant par cyan.

Pour préciser des options en 3d/4d, il faut utiliser la commande plotfunc, par exemple
plotfunc((x+i*y)^3-1,[x=-2..2,y=-2..2],nstep=500)
pour tracer zz 31z \rightarrow z^3-1 depuis le carré du plan complexe centré en l’origine de coté 4, avec une discrétisation utilisant 500 petits rectangles.

8  Géométrie analytique.

Les versions récentes de χ\chiCAS proposent une application de géométrie interactive 2d et 3d. L’application de géométrie permet de construire des figures dans le plan ou dans l’espace, et de faire bouger un point et tout ce qui en dépend pour illustrer certaines propriétés (géométrie dynamique). On peut faire des constructions de géométrie euclidienne pure, mais aussi avec des graphes de fonction, des coniques, etc. L’application possède deux “vues”: la vue graphique et la vue symbolique qui contient les commandes Xcas permettant de créer la figure (la philosophie de cette application est proche de celle du logiciel Geogebra, avec les commandes de Xcas).

8.0.1  Modes, vue graphique et symbolique.

Taper Home 1 pour afficher la liste des applications additionnelles, puis OK puis sélectionnez soit une nouvelle figure 2d ou 3d soit une figure existante. Vous pouvez aussi ouvrir l’application de géométrie depuis un graphe (par exemple après avoir tapé plot(sin(x))) en tapant Home puis Sauvegarder figure.

Au lancement on est dans la vue graphique en mode repère, les touches de curseur permettent de changer de point de vue. Pour changer le mode, utiliser la touche Toolbox, pour passer en vue symbolique et vice-versa taper OK. Par exemple tapez Toolbox 3 pour passer en mode point qui permet de construire des points en déplaçant le pointeur et en tapant OK ou tapez Toolbox 5 pour passer en mode triangle qui permet de construire un triangle à partir de ses 3 sommets, on déplace le pointeur et on tape OK trois fois. Pour déplacer le pointeur, utiliser les touches de déplacement, pour se déplacer plus rapidement, faire shift touche de curseur. Si on est proche d’un point existant, son nom apparait en bas. Pour déplacer le pointeur vers un point existant, vous pouvez aussi taper le nom du point (par exemple touche alpha A).

Le mode pointeur permet de sélectionner un point et de le déplacer pour observer comment la construction varie, ce qui permet de mettre en évidence des propriétés de la figure, par exemple concurrence de 3 droites.

Si vous tapez sur la touche Back depuis la vue graphique de l’application, vous revenez au mode repère ou si vous y étiez vous passez en vue symbolique. Vous pouvez ajouter des objets à la construction depuis cette vue, en mettant une commande par ligne. Tapez shift-OK pour passer à la ligne. Tapez OK pour revenir à la vue graphique. Dans la vue symbolique, vous pouvez sauvegarder la construction géométrique au format texte (avec une extension .py, même s’il ne s’agit pas d’un script Python). Tapez Back pour quitter l’application de géométrie.

Lorsque vous quittez l’application de géométrie, la figure est automatiquement sauvegardée dans une variable Xcas qui a le même nom que celui du nom de fichier affiché dans la vue symbolique. Vous pouvez purger la variable Xcas si vous voulez effacer la figure de la session.

Exemple : cercle circonscrit.
Depuis le shell, taper Home 1 sélectionner nouvelle figure 2d et valider OK. Puis Toolbox 5 Triangle, OK pour créer le premier sommet du triangle puis déplacer le pointeur avec les touches de déplacement, OK pour créer le 2ème sommet du triangle, déplacer le pointeur à nouveau et OK pour créer le triangle.

Version longue en construisant le centre : Taper Toolbox 7, sélectionner 8 Mediatrice, déplacer le pointeur de sorte que seul un segment du triangle soit sélectionné (affichage en bas à droite perpen_bisector D5,D), taper OK pour créer la médiatrice du segment, déplacer le curseur sur une autre arête du triangle et OK pour créer la 2ème médiatrice, optionnellement sur le 3ème segment pour avoir les 3 médiatrices. Puis Toolbox 6 et 4 Intersection unique. Déplacer le curseur vers une des médiatrices, taper OK puis vers une autre médiatrice, taper OK, ceci crée le centre du cercle circonscrit. Pour tracer le cercle, taper Toolbox 4, déplacer le curseur au centre du cercle (vous pouvez utiliser les touches de déplacement ou juste taper alpha H ou la bonne lettre si le centre du cercle s’appelle autrement), puis OK puis sur un des sommets et OK.

Version courte avec la commande circonscrit : taper Toolbox 9 puis circonscrit puis sélectionner chaque sommet avec OK (alpha A OK alpha B OK alpha C OK, remplacez A, B, C par les lettres du sommet du triangle).

Version en vue symbolique : taper Back puis en fin de script sur une ligne vide (taper EXE s’il faut en créer une), taper
c:=circonscrit(A,B,C) OK

Exemple 3d: bac septembre 2019 
Taper Home OK pour lancer l’application de géométrie puis nouvelle figure 3d. Puis Back ou OK pour passer en vue symbolique. Puis alpha c shift = puis Toolbox flèche haut deux fois pour sélectionner 3D puis OK puis 5 pour cube puis Home (aide), qui explique que les 2 premiers arguments de cube sont les sommets d’une arête, le troisième est un point d’un plan d’une face. Le premier exemple nous convient ici exactement, on tape Ans et on obtient c=cube([0,0,0],[1,0,0],[0,1,0]) On tape EXE pour voir le cube puis + plusieurs fois pour zoomer et EXE pour revenir à la vue symbolique. Vous pouvez sauvegarder à tout moment la construction au format texte depuis le menu Home. On passe à la ligne en tapant shift OK. Puis on définit les sommets du cube en tapant A,B,C,D,E,F,G,H:= (taper alpha shift A , alpha shift B etc.), puis Toolbox et flèche vers le haut 3 fois pour sélectionner Géometrie puis flèche vers le haut 4 fois pour sélectionner sommets OK et mettre c en argument sommets(c). Taper OK pour visualiser puis OK à nouveau pour revenir en vue symbolique. Passer à la ligne avec EXE puis créer le plan ABG en tapant alpha shift P = puis shift-2 pour ouvrir le menu rapide lines et 8 pour saisir plane. La commande plan prend en arguments 3 points pour définir le plan (on peut aussi donner une équation cartésienne, ici A,B,G, P=plan(A,B,G, on va lui ajouter une couleur avec le menu rapide shift 4 disp display=filled+green, vérifier en visualisant avec OK OK. On passe à la ligne (EXE) et on crée le segment DE alpha S = shift 2 sélectionner la commande segment avec OK puis D,E et shift 4 pour lui donner une couleur S=segment(D,E,color=cyan) (on pouvait aussi créer le segment depuis la vue graphique en mode Lignes mais déplacer le pointeur est un peu lent). La construction est donc la suivante:

c=cube([0,0,0],[1,0,0],[0,1,0])
A,B,C,D,E,F,G,H=sommets(c)
P=plan(A,B,G,display=filled+green)
S=segment(D,E,display=cyan)

Vous pouvez taper OK pour la visualiser et utiliser les flèches de déplacement pour changer de point de vue. Taper OK ou Back pour revenir en vue symbolique. Pour quitter l’application taper Back. Taper F1 pour sauvegarder la figure si nécessaire. Vous pouvez depuis le shell de KhiCAS accéder à de nombreuses informations de géométrie analytique, par exemple equation(P) (menu Toolbox Géométrie) vous donnera l’équation cartésienne du plan PP ou is_orthogonal(P,S) (à saisir depuis le catalogue complet Toolbox OK) vous confirmera que le plan PP est orthogonal au segment SS.

9  Unités et constantes physiques.

Le menu Toolbox, constantes physiques (raccourci Toolbox pi) et unités physiques (raccourci Toolbox sqrt) affiche

Exemples :
60_(km/h) => _(m/s)
mksa(_hbar_)
usimplify(1_W*1_s)
ufactor(1_W,1_J)

10  L’éditeur d’expressions

Lorsqu’un calcul renvoie une expression, elle est affichée en plein écran dans l’éditeur d’expression 2d. Depuis l’historique des calculs, si le niveau sélectionné est une expression, l’appui sur shift-5 (2d) affiche l’expression dans l’éditeur 2d. En ligne de commande, l’appui sur shift-5 ouvre aussi l’éditeur 2d, soit avec 0 si la ligne de commande était vide, ou avec le contenu de la ligne de commande si celle-ci est syntaxiquement correcte.

Lorsque l’éditeur 2d est ouvert, l’expression est affichée en plein écran et une partie de l’expression est sélectionnée. On peut alors agir sur la sélection en exécutant des commandes saisies via les menus ou le clavier, on peut aussi éditer la sélection (en mode de saisie 1d). Ceci permet de retravailler des sous-expressions ou d’éditer une expression en écriture naturelle.

Vous pouvez annuler la dernière modification effectuée en tapant sur shift-3 (undo).

Taper OK pour quitter l’éditeur 2d et copier l’expression en ligne de commande, taper Back pour quitter sans recopier l’expression.

Exemple 1 : nous allons saisir lim x0sin(x)x\lim_{x \rightarrow 0} \frac{\sin(x)}{x} Depuis une ligne de commande vide, taper shift-5 (2d), vous devez voir 0 sélectionné. Tapez sur la touche x et EXE, maintenant c’est x qui est en surbrillance. Tapez sur la touche sin, c’est sin(x)\sin(x) qui est en surbrillance. Tapez sur la touche de division (au-dessus de -), vous devez voir sin(x)0\frac{\sin(x)}{0} avec 0 en surbrillance, tapez x puis EXE, vous devez voir sin(x)x\frac{\sin(x)}{x} avec x au dénominateur en surbrillance. Tapez sur le curseur flèche vers le haut pour mettre sin(x)x\frac{\sin(x)}{x} en surbrillance, puis shift-2 4 (pour limit). L’expression est correcte, vous pouvez taper OK pour la recopier en ligne de commande et OK à nouveau pour exécuter le calcul. Si on avait voulu une limite en ++\infty, il aurait fallu déplacer la sélection avec curseur vers la droite, puis faire shift-1 7 (oo) OK.

Exemple 2 : nous allons saisir 0 +1x 4+1dx\int_0^{+\infty} \frac{1}{x^4+1} \ dx Depuis une ligne de commande vide, taper shift-5 (2d), puis shift-2 3 (integrate), vous devez voir 0 10dx\int_0^1 0 \ dx avec xx sélectionné. Il faut donc changer le 1 de la borne supérieure et le 0 à intégrer. Pour modifier le 0, curseur vers la gauche pour le sélectionner puis 1/(x^4+1) EXE, puis curseur vers la gauche shift-1 7 EXE. Taper sur OK pour recopier vers la ligne de commande puis OK pour effectuer le calcul, le résultat s’affiche dans l’éditeur 2d, OK quitte l’éditeur avec dans l’historique l’intégrale et sa valeur (en syntaxe algébrique 1d).

Exemple 3 : nous allons calculer et simplifier 1x 4+1dx\int \frac{1}{x^4+1} \ dx Depuis une ligne de commande vide, taper shift-5 (2d), puis shift-2 3 (integrate), vous devez voir 0 10dx\int_0^1 0 \ dx Déplacez le curseur sur le 0 de la borne inférieure de l’intégrale et tapez sur la touche DEL, vous devez voir 0dx\int 0 \ dx avec le tout sélectionné. Utilisez le curseur vers le bas pour sélectionner 0 et tapez 1/(x^4+1) EXE puis OK pour recopier en ligne de commande puis OK pour exécuter le calcul, le résultat s’affiche maintenant dans l’éditeur 2d.
On peut alors sélectionner avec les touches du curseur par exemple l’argument d’un des arctangentes et exécuter shift-1 EXE (simplify) pour effectuer une simplification partielle du résultat, puis recommencer avec l’autre arctangente.
On peut simplifier encore plus, en rassemblant les logarithmes. Pour cela il faut d’abord échanger deux des arguments de la somme. Sélectionnez un des logarithmes avec des déplacements du curseur, puis tapez shift-curseur droit ou gauche, cela échange l’argument sélectionné avec son frère de droite ou de gauche. Tapez ensuite alpha curseur vers la droite ou vers la gauche, ceci augmente la sélection en ajoutant le frère de droite ou de gauche. Une fois les deux logarithmes sélectionnés, menu shift-1 2 EXE (factor), puis descendez la sélection sur la somme ou différence de logarithmes, allez dans le menu Toolbox puis EXE (Tout), tapez les lettres l, n, c ce qui déplace à la première commande commençant par lnc, sélectionnez lncollect, validez et tapez enfin sur EXE (eval).

11  Sessions de calculs

11.1  Edition de l’historique.

En utilisant la touche curseur vers le haut/bas, on se déplace dans l’historique des calculs, le niveau courant est en surbrillance.

Pour modifier l’ordre des niveaux dans l’historique des calculs, tapez alpha-curseur vers le haut ou vers le bas. Pour effacer un niveau, appuyez sur la touche DEL (le niveau est recopié dans le presse-papiers).

Pour modifier un niveau existant, on tape sur shift-5 ou sur shift-4. Dans le premier cas, c’est l’éditeur 2d qui est appelé si le niveau est une expression, dans le deuxième cas, c’est l’éditeur texte qui est appelé. Taper Back pour annuler les modifications ou EXE pour valider. Si les modifications sont validées, les lignes de commande situées en-dessous de la ligne modifiée seront automatiquement calculées, tenant compte des modifications, par exemple si vous modifiez un niveau comme A:=1, les lignes situées en-dessous dépendant de A seront actualisées.

Ce processus peut être automatisé en utilisant un curseur, que l’on peut créer avec un assistant, depuis le menu HOME, Parameter. Une fois créé, vous pouvez modifier un curseur en tapant sur les touches + ou - lorsque le niveau contenant la commande assume ou parameter est sélectionné (tapez * ou / pour une modification plus rapide).

11.2  Variables

En appuyant sur la touche var vous affichez la liste des variables qui ont une valeur, ainsi que des commandes de gestion de variables. Déplacez le curseur vers une variable puis EXE pour la recopier en ligne de commande, DEL copie en ligne de commande la commande d’effacement de la variable (confirmez ensuite avec EXE). La commande restart permet d’effacer toutes les variables. La commande assume permet de faire une hypothèse sur une variable, par exemple assume(x>5) (> se trouve dans le menu shift-PRGM).

12  Programmation

L’environnement de programmation de χ\chicas est assez complet: un éditeur, l’interpréteur de Xcas avec toutes ses commandes (compatibilité partielle avec les modules Python math, cmath, random, turtle, numpy, scipy, giacpy, matplotlib et un sur-ensemble du module kandinsky), avec un outil de mise au point permttant l’exécution en pas à pas.

Vous pouvez programmer en utilisant les structures de commande en français de Xcas ou en utilisant la compatibilité de syntaxe Python. Les programmes très courts (en une ligne) peuvent être saisis directement en ligne de commande. Les programmes plus longs ou que l’on souhaite sauvegarder seront saisis dans l’éditeur de programmes sur la calculatrice, ou bien transférés depuis un PC ou une autre calculatrice.

Trois programmes sont installés après un reset de la calculatrice (des polygones avec la tortue, la fractale de Mandelbrot, le calcul des racines d’un polynôme de degré 2). Vous pouvez les visualiser depuis le shell en tapant shift-4 (edit) puis HOME 4 (Inserer), les interpréter avec la touche OK et les exécuter depuis le shell (Back puis var pour sélectionner la fonction).

12.1  Prise en main (programmation)

Un premier exemple en ligne de commande :
une fonction définie par une expression algébrique. On saisit nom_fonction(parametres):=expression Par exemple, pour définir le périmètre d’un cercle de rayon rr, on peut taper
puis on peut calculer
.

Autre exemple, pour calculer l’intervalle de confiance de seconde connaissant une fréquence pp et un effectif nn, on tape


puis on teste

Autre exemple : avec la tortue de Xcas
La tortue de Xcas est un petit robot qui se déplace selon des ordres qui lui sont donnés en laissant une trace de son passage. Les commandes de la tortue sont accessibles depuis le dernier item du menu Toolbox, par le raccourci Toolbox x 2x^2. Saisir la commande avance dans ce menu puis valider, vous devez voir la tortue (symbolisée par un triangle) avancer de 10 pixels. Taper Back pour revenir en ligne de commande. Saisir la commande tourne_gauche et valider, la tortue a tourné de 90 degrés. Répéter 3 fois ces deux commandes pour afficher un carré.
Pour effacer le dessin et ramener la tortue à l’origine, saisir la commande efface. Pour faire des dessins tortue, il est conseillé d’utiliser l’éditeur de programmes (cf. ci-dessous).

Autre exemple : une boucle “oneliner” en syntaxe Xcas.
Ouvrez le menu Programmes (Toolbox cos), puis sélectionnez l’exemple de pour (curseur sur pour puis Ans)

tapez sur EXE, vous devez voir les carrés des entiers de 1 à 10.

Exercice : faire faire un carré à la tortue en utilisant une boucle.

Utilisation de l’éditeur
Modifions cet exemple pour faire afficher les carrés de 1 à nn en utilisant la syntaxe compatible Python et l’éditeur de programmes. Tapez sur Back pour passer du shell à l’éditeur de programmes. Si on vous demande programme ou Tortue faites OK. Ceci ouvre l’éditeur avec une maquette de fonction def f(x): Vérifiez que la syntaxe Python est activée (menu HOME), sinon activez-la (8). Remplacez x par n, puis déplacez le curseur en fin de ligne et passez à la ligne (EXE). Tapez Shift-2 puis EXE (for), placez un j entre for et in range( puis un n entre les parenthèses de range(). À la ligne suivante, tapez shift-3 7 (print) et validez (EXE), puis tapez j,j^2). Vous devriez avoir le programme suivant :

def f(n):
  for j in range(1,n+1):
    print(j,j^2)
  return x


Remplacez x par n dans return (ou effacez la ligne). N.B.: pour la puissance, on peut utiliser ^ ou ** dans KhiCAS (il faut utiliser ** en Python).

Maintenant, tapez OK. Si tout va bien, vous devez voir Success dans la ligne d’état. Sinon, le numéro de ligne de la première erreur est indiqué ainsi que le mot qui a provoqué l’erreur. Le curseur est positionné sur la ligne où l’erreur a été détectée (il peut arriver que l’erreur soit située avant mais détectée un peu plus loin seulement). Si vous utilisez la syntaxe en Python, notez que les structures de programmation sont traduites en langage Xcas, les erreurs affichées le sont par rapport à cette traduction (donc des mots-clefs de fin de structure comme end peuvent avoir été ajoutées).

Si le programme est syntaxiquement correct, vous pouvez le sauvegarder depuis le menu HOME. Pour l’exécuter, revenez à la ligne de commande en tapant la touche Back, tapez par exemple f(10), vous devriez voir s’afficher les carrés de 1 à 10.

3ième exemple : Calcul de l’intervalle de confiance de terminale S
En syntaxe Xcas. On peut le saisir en ligne de commande
On peut éviter les calculs redondants en utilisant une variable locale (utiliser Toolbox Programmes pour saisir fonction, local, return et ffonction)

fonction F(P,N) 
  local D; 
  D:=1.96*sqrt(P*(1-P)/N); 
  return [P-D,P+D]; 
ffonction;


Exercice  Créez un fichier carre.py contenant un script pour afficher un carré avec la tortue. Créez un fichier carren.py pour afficher un carré de nn pixels, en utilisant une fonction d’argument nn et l’instruction repete.

Solution  Depuis l’éditeur de script, faire HOME 5 (Effacer). Puis shift-4 efface. Ajouter 4 fois avance; tourne_gauche;. Appuyer sur OK pour tester. Sauvegardez (HOME 3 Sauvegarder comme).

Effacer à nouveau (HOME 5 effacer) Puis shift-4 efface. Ajouter avant la ligne efface

def f(n):
  for j in range(4):
    avance(n)
    tourne_gauche

puis après la ligne efface; tapez par exemple f(40) puis OK. Ensuite faire HOME 3 (Sauvegardez comme).

Un exemple de fonction non algébrique : le calcul du PGCD de 2 entiers.
Utiliser EXE pour passer à la ligne. En syntaxe Xcas

fonction pgcd(a,b)
  tantque b!=0 faire
    a,b:=b,irem(a,b);
  ftantque;
  return a;
ffonction


Le même en syntaxe Python

def pgcd(a,b):
  while b!=0:
    a,b=b,a % b
  return a


On vérifie

Mise au point
La commande debug permet d’exécuter une fonction en mode pas-à-pas, i.e. visualiser l’évolution des variables instruction par instruction, par exemple
debug(pgcd(12345,3425))

12.2  Quelques exemples

Le répertoire prog de l’archive khicasio.zip contient quelques exemples de TP pour classes de seconde de l’IREM de Grenoble :

ainsi que quelques autres programmes (avec fréquemment une représentation graphique) :

12.3  Commandes utilisables

Contrairement aux adaptations de MicroPython proposées par les constructeurs (dont celui de la Numworks N0110), la programmation en (simili-)Python dans KhiCAS n’est pas une application indépendante. Vous pouvez donc utiliser tous les types de Xcas (par exemple les rationnels) et appliquer toutes les commandes de Xcas dans vos programmes. Ceci correspond plus ou moins à un environnement Python avec les modules math, cmath, random (plus complet que le module urandom fourni par les constructeurs), scipy, numpy, un petit module de graphiques pixelisé (set_pixel(x,y,c), set_pixel() pour synchroniser l’affichage, clear(), draw_line(x1,y1,x2,y2,c), draw_polygon([[x1,y1],[x2,y2],...],c), draw_rectangle(x,y,w,h,c), draw_circle(x,y,r,c), la couleur+epaisseur+remplissage c est un paramètre optionnel, draw_arc(x,y,rx,ry,t1,t2,c) permet de tracer un arc d’ellipse). et pour remplacer matplotlib on peut utiliser les commande graphiques dans un repère de χ\chiCAS (point, line, segment, circle, barplot, histogram et les commandes plot...). De plus, vous pouvez travailler avec des expressions et faire du calcul formel dessus. Pour la liste complète des commandes et une présentation détaillée, on renvoie à la documentation de Xcas.

13  Interpréteur MicroPython intégré

χ\chiCAS est maintenant fourni avec son propre interpréteur MicroPython (qui n’est pas identique à celui fourni par Numworks). Pour passer dans χ\chiCAS de l’interpréteur Xcas à MicroPython et réciproquement vous pouvez taper la commande python ou xcas dans le shell sur une ligne vide. Ces commandes sont accessibles dans le menu rapide shift ).

Attention, si vous lancez MicroPython après avoir travaillé avec Xcas ou/et avec le tableur, il peut ne pas y avoir assez de mémoire pour le tas MicroPython, dans ce cas vous risquez de perdre votre session de travail, pensez à la sauvegarder. Par défaut, 40K sont réservés pour MicroPython. Vous pouvez modifier cette valeur jusqu’à 64K dans la configuration (touche Home puis touche ln). Si vous choisissez une valeur haute, il peut être nécessaire de quitter χ\chiCAS et de le réouvrir pour que le tas puisse être alloué dans une zone mémoire contiguë (problème de fragmentation du tas sinon).

Remarque : lorsque l’interpréteur Xcas est actif, si vous passez en argument à la commande xcas ou python le nom de variable d’une fonction que vous avez programmée, cela affiche son texte source sous forme d’une chaine de caractères en syntaxe Xcas ou Python. Vous pouvez donc programmer en syntaxe Xcas et traduire ensuite en Python si vous devez vous conformer à des règles qui imposent ce langage.

13.1  Les modules math, cmath, random

Ce sont les modules natifs fournis par MicroPython (urandom a été renommé random), et qui sont conforme au standard. D’autres modules MicroPython standard qui ne sont pas destinés à faire des maths sont disponibles.

13.2  Le module graphic

Il s’agit d’un module natif MicroPython qui exporte de Xcas des fonctions de tracé pixelisés. Une partie des commandes est accessible depuis le menu rapide shift 0. Ce module a des synonymes, kandinsky et casioplot afin de faciliter l’utilisation de scripts Python pour calculatrices Numworks (Epsilon) et Casio.

13.3  Le module matplotl

Il s’agit d’un module natif MicroPython qui exporte de Xcas des fonctions de tracé repéré et vise à une certaine compatibilité avec le module matplotlib (ou un de ses sous-modules) sur PC. Une partie des commandes est accessible depuis le menu rapide shift .

13.4  Le module arit

C’est un module natif qui exporte de Xcas des fonctions d’arithmétique entière : test de primalité et prochain nombre premier (par Miller-Rabin), factorisation d’entiers pas trop gros (détection par Pollard-rho du plus petit facteur premier, donc jusqu’à environ 9 chiffres), pgcd et identité de Bèzout, indicatrice d’Euler (si on sait factoriser). J’y ai aussi inclus deux fonctions de conversion liste vers chaine de caractères pour faciliter l’enseignement d’un peu de cryptographie.

13.5  Le module linalg

Il permet de manipuler les listes comme des vecteurs et les listes de listes comme des matrices. Contrairement à Xcas, Python n’est pas un langage spécifiquement adapté aux maths, il faut utiliser des commandes préfixées add, sub, mul pour effectuer les opérations arithmétiques de base + - * sur les vecteurs et matrices représentés par des listes.

Le module linalg est un module natif, qui utilise Xcas pour effectuer la quasi-totalité des calculs.

13.6  Le module numpy

C’est une surcouche du module linalg qui définit une classe array pour représenter les vecteurs et les matrices. On peut alors utiliser + - * pour faire les opérations de base sur vecteurs et matrices.

Le module numpy n’est pas un module natif, c’est un texte source écrit en Python. Son importation consomme donc de la mémoire RAM. Vous pouvez écrire votre propre version de numpy.py et la stocker dans le scriptstore, elle prendra alors la précédence sur la version utilisée par défaut. Cette dernière vise à assurer un minimum de compatibilité avec le module du même nom sur PC. Bien que non natif, ce module est disponible en mode examen (le texte source par défaut est intégré au code source de l’interpréteur MicroPython).

import linalg
import math
class array: 
    def __init__(self, a): 
        self.a = a 
  
    def __add__(self, other): 
        return array(linalg.add(self.a , other.a))
  
    def __sub__(self, other): 
        return array(linalg.sub(self.a , other.a))
  
    def __mul__(self, other):
        if type(self)==array:
            if type(other)==array:
                return array(linalg.mul(self.a , other.a))
            return array(linalg.mul(self.a,other))
        return array(linalg.mul(self,other.a))
    
    def __rmul__(self, other): 
        if type(self)==array:
            if type(other)==array:
                return array(linalg.mul(self.a , other.a))
            return array(linalg.mul(self.a,other))
        return array(linalg.mul(self,other.a))

    def __matmul__(self, other):
        return __mul(self,other)

    def __getitem__(self,key):
        r=(self.a)[key]
        if type(r)==list or type(r)==tuple:
            return array(r)
        return r

    def __setitem__(self, key, value):
        if (type(value)==array):
            (self.a)[key]=value.a
        else:
            (self.a)[key]=value
        return None

    def __len__(self):
        return len(self.a)
    
    def __str__(self): 
        return 'array('+str(self.a)+')'
  
    def __repr__(self): 
        return 'array('+str(self.a)+')'
  
    def __neg__(self):
        return array(-self.a)

    def __pos__(self):
        return self
    
    def __abs__(self):
        return array(linalg.abs(self.a))

    def __round__(self):
        return array(linalg.apply(round,self.a,linalg.matrix))

    def __trunc__(self):
        return array(linalg.apply(trunc,self.a,linalg.matrix))

    def __floor__(self):
        return array(linalg.apply(floor,self.a,linalg.matrix))

    def __ceil__(self):
        return array(linalg.apply(ceil,self.a,linalg.matrix))

    def T(self):
        return array(linalg.transpose(self.a))
            
def real(x):
    if type(x)==array:
        return array(linalg.re(x.a))
    return x.real

def imag(x):
    if type(x)==array:
        return array(linalg.im(x.a))
    return x.imag

def conj(x):
    if type(x)==array:
        return array(linalg.conj(x.a))
    return linalg.conj(x)

def sin(x):
    if type(x)==array:
        return array(linalg.apply(math.sin,x.a,linalg.matrix))
    return math.sin(x)

def cos(x):
    if type(x)==array:
        return array(linalg.apply(math.cos,x.a,linalg.matrix))
    return math.cos(x)

def tan(x):
    if type(x)==array:
        return array(linalg.apply(math.tan,x.a,linalg.matrix))
    return math.tan(x)

def asin(x):
    if type(x)==array:
        return array(linalg.apply(math.asin,x.a,linalg.matrix))
    return math.asin(x)

def acos(x):
    if type(x)==array:
        return array(linalg.apply(math.acos,x.a,linalg.matrix))
    return math.acos(x)

def atan(x):
    if type(x)==array:
        return array(linalg.apply(math.atan,x.a,linalg.matrix))
    return math.atan(x)

def sinh(x):
    if type(x)==array:
        return array(linalg.apply(math.sinh,x.a,linalg.matrix))
    return math.sinh(x)

def cosh(x):
    if type(x)==array:
        return array(linalg.apply(math.cosh,x.a,linalg.matrix))
    return math.cosh(x)

def tanh(x):
    if type(x)==array:
        return array(linalg.apply(math.tanh,x.a,linalg.matrix))
    return math.tanh(x)

def exp(x):
    if type(x)==array:
        return array(linalg.apply(math.exp,x.a,linalg.matrix))
    return math.exp(x)

def log(x):
    if type(x)==array:
        return array(linalg.apply(math.log,x.a,linalg.matrix))
    return math.log(x)

def size(x):
    if type(x)==array:
        return linalg.size(x.a)
    return linalg.size(x)

def shape(x):
    if type(x)==array:
        return linalg.shape(x.a)

def dot(a,b):
    return a*b

def transpose(a):
    if type(x)==array:
        return array(linalg.transpose(x.a))

def trn(a):
    if type(x)==array:
        return array(linalg.conj(linalg.transpose(x.a)))
    return linalg.conj(linalg.transpose(x.a))

def zeros(n,m=0):
    return array(linalg.zeros(n,m))

def ones(n,m=0):
    return array(linalg.ones(n,m))

def eye(n):
    return array(linalg.eye(n))

def det(x):
    if type(x)==array:
        return linalg.det(x.a)
    return linalg.det(x)

def inv(x):
    if type(x)==array:
        return array(linalg.inv(x.a))
    return linalg.inv(x)

def solve(a,b):
    if type(a)==array:
        if type(b)==array:
            return array(linalg.solve(a.a,b.a))
        return array(linalg.solve(a.a,b))
    if type(b)==array:
        return array(linalg.solve(a,b.a))
    return linalg.solve(a,b)

def eig(a):
    if type(a)==array:
        r=linalg.eig(a.a)
        return array(r[0]),array(r[1])
    return linalg.eig(a)

def linspace(a,b,c):
    return array(linalg.linspace(a,b,c))

def arange(a,b,c=1):
    return array(linalg.arange(a,b,c))

def reshape(a,n,m=0):
    if type(n)==tuple:
        m=n[1]
        n=n[0]
    if type(a)==array:
        return array(linalg.matrix(n,m,a.a))
    return linalg.matrix(n,m,a)

14  Applications additionnelles

Les applications additionnelles sont accessibles en tapant HOME 1. Il y a actuellement un tableur, le tableau périodique des éléments (d’après Maxime Friess), et trois exemples d’addin qui peuvent servir de modèle aux programmeurs : la suite de Syracuse (très simple), la fractale de Mandelbrot et les bassins d’attraction de la méthode de Newton, et un jeu de mastermind (qui peut aussi servir de passe-temps).

15  Le tableur

Au lancement, vous avez un tableau de 14 lignes et 4 colonnes remplies de 0. Vous pouvez changer la dimension depuis la configuration du tableur (touche Home, configuration), mais attention, chaque cellule utilise de la mémoire, un peu moins de 100 octets pour une cellule remplie d’un nombre, plusieurs centaines d’octets si elle est remplie par une formule, et la mémoire de la Numworks est très limitée, s’il n’y a pas assez de mémoire lors d’une allocation, vous perdrez votre session de travail. Pensez à faire une sauvegarde de votre session de temps en temps!

La syntaxe pour créer une formule est identique à celle d’un tableur classique, on tape sur shift = puis on entre la formule, avec des références relatives (par exemple =a1+1) ou absolues (=$a$1+1). On peut utiliser les commandes de Xcas ainsi que des fonctions qu’on a programmées.

Il y a des assistants de saisie spécifiques au tableur dans les menus rapides shift 1, 2 et 3. Par exemple pour générer des entiers consécutifs, taper shift 3 puis OK ce qui crée une ligne de commande contenant range(, il suffit de mettre un entier aa ou deux entiers aa et bb en arguments pour créer la liste des entiers entre 0 et a1a-1 ou entre aa et b1b-1 et la dispatcher sur la colonne.

Autre exemple, pour avoir un tableau de valeurs de fonctions, se placer au début d’une colonne vide dont la colonne à droite est aussi vide et taper shift 3, sélectionner tablefunc puis passer en argument l’expression, par exemple sin(x) (ou f(x) si vous avez défini une fonction f). Vous pouvez ensuite régler la valeur de début et le pas dans le tableur. Pour une suite récurrente, se placer en haut d’une colonne vide et utiliser la commande tableseq du menu rapide shift 3.

Pour sélectionner une plage de cellules, taper simultanément sur shift et une touche de direction, vous pouvez ensuite relacher shift et déplacer le curseur en fin de sélection. Tapez OK pour valider (si vous la passez en argument d’une formule saisie dans une cellule du tableur), ou shift copy si vous voulez copier la sélection dans le presse-papier pour par exemple la recopier dans le shell avec shift paste.

Si vous utilisez un des assistants de statistiques 2d, faites la sélection des 2 colonnes avant de choisir la commande. Par exemple, en 1ère ligne, 1ère colonne, tapez shift 3 sélectionnez range puis complétez en range(6) comme valeurs de X puis en face en 2ème colonne entrez des valeurs et Y. Déplacez le curseur en 1ère ligne et en 1ère colonne, puis shift-curseur vers le base puis déplacements du curseur pour rejoindre l’autre extrémité de la sélection, puis shift 2, puis par exemple polygonscatterplot. Pour voir le graphique, tapez shift 6. Pour voir sur le même graphique la droite de régression linéaire correspondante, vous pouvez recommencer la procédure ou bien recopier la cellule contenant la formule de polygonscatterplot avec shift-copy shift-copy et la coller avec shift paste en-dessous, puis la modifier (shift 4 OK) en remplaçant polygonscatterplot par linear_regression_plot

Lorsqu’on utilise une plage de cellule en argument d’une commande, la plage de cellule est aplatie en une seule liste. Si on souhaite utiliser une matrice comme argument d’une commande, il faut reconstruire la matrice à partir de la liste en utilisant la commande matrix(l,c,liste)l,c sont les dimensions de la matrice (c’est ce que fait l’assistant scatterplot du menu rapide de statistiques 2d (shift 2) si on sélectionne la plage de cellules auparavant).

Dans le menu accessible depuis la touche HOME, vous pouvez insérer ou effacer une ligne ou une colonne, vous pouvez aussi donner un nom de variable au tableur, la matrice des valeurs sera alors automatiquement sauvegardée dans cette variable, que vous pouvez utiliser ensuite depuis le shell.

Si vous entrez dans une cellule une formule donnant un résultat vecteur ou matrice, celle-ci sera dispatchée par défaut dans plusieurs cellules. On peut modifier cela dans la configuration du tableur.

16  Raccourcis claviers.

Dans l’éditeur de programmes :

17  Remarques

La mémoire vive (RAM) disponible sur la Numworks est vraiment très faible (espérons que ce sera modifié dans les prochains modèles!). χ\chiCAS implémente des garde-fous lorsque la mémoire est saturée, mais vous risquez de perdre le travail qui n’a pas été sauvegardé dans χ\chiCAS, ou pire dans l’ensemble des applications de la calculatrice si elle reboote.

Il est donc conseillé de transférer vos programmes sur un ordinateur en branchant la calculatrice et en faisant pointer sur l’ordinateur le navigateur Chromium ou compatible sur ce site ou avec les fonctions d’échange avec Xcas PC.

Il n’y a pas pour le moment de mécanisme de sauvegarde sur la flash des données. Ce serait bienvenu, d’une part cela libérerait un peu de RAM, d’autre part cela permettrait d’être résistant à un crash et d’avoir une bibliothèque bien plus importante de programmes mais aussi de sessions compatibles Xcas, Xcas pour Firefox et χ\chicas pour Casio (qu’il serait agréable de pouvoir échanger sur le workshop Numworks ou sur un autre espace par exemple sur tiplanet).

Certains changements de Khi affectent l’application Python ou l’ensemble des applications :

18  Copyright, licences et remerciements

19  Développement en C/C++.

Cette section s’adresse aux utilisateurs avancés qui souhaitent programmer leur calcultrice en exploitant toute sa puissance, donc sans être limité par la faible quantité de mémoire disponible pour des scripts Python et la lenteur relative du langage interprété. Le système non modifié de la Numworks permet de le faire, mais il est difficile de le maitriser, au-delà de modifications simples du code existant (par exemple modifier la valeur de certains paramètres), il faut bien connaitre C++, la programmation orienté objet et se limiter à une librairie standard très spartiate. Cela limite à mon avis le nombre de développeurs et la vitesse de développement sur cette plateforme, encore plus si on est habitué à un environement de développement frugal, personnellement j’utilise emacs comme éditeur de texte et un terminal, les arborescences à plusieurs niveaux et les espaces de noms imbriqués d’Epsilon sont un cauchemar. Le temps nécessaire à la compilation d’Epsilon est d’ailleurs un indicateur de cette complexité.

Un autre problème est que modifier Epsilon nécessite d’utiliser la même licence de logiciel, on ne peut donc pas développer du logiciel libre.

Damien Nicolet et moi-même avons développé des modifications autour de Epsilon, qui permettent de lancer un firmware d’extensions à partir de Epsilon. C’est le projet Delta/Khi, qui permet d’utiliser la newlib, une implémentation complète de la libc et de la libstdc++, et offre un SDK en langage C et en C– (i.e. avec un paradigme de programmation impératif très proche du C donc beaucoup plus accessible, avec les avantages que procurent la librairie standard C++). Ainsi ajouter une application toute simple comme la suite de Syracuse nécessite une dizaine de lignes de code, programmer la fractale de Mandelbrot et les bassins d’attraction ou le jeu de mastermind font une bonne centaine de lignes (ces trois exemples se trouvent dans le fichier kadd.cc du source de giac) et l’interface du tableur de χ\chiCAS de l’ordre d’un millier de lignes.

Licences
L’utilisation du SDK de base de l’OS (19.4) vous impose de choisir une licence permettant d’utiliser les services de base d’un OS propriétaire, ce que toute licence de logiciel raisonnable devrait permettre, c’est le cas en particulier de la GPL. L’utilisation des autres fonctions du SDK impose une licence compatible avec la GPL.

19.1  Installation de l’environnement de développement.

Je décris l’installation sous Linux debian/ubuntu compatible depuis un terminal avec comme shell bash. On peut programmer sur d’autres OS, mais c’est plus facile sous Linux (en tout cas c’est plus facile pour moi d’expliquer comment faire!). Si vous travaillez habituellement sur Mac ou Windows, vous pouvez installer une machine virtuelle, par exemple avec Virtualbox et y mettre une distribution Linux debian-compatible, par exemple xubuntu.

On installe les packages nécessaires pour compiler giac et pour cross-compiler pour le processeur ARM :

sudo apt-get install wget gdb gcc g++ libgmp-dev libmpfr-dev libmpfi-dev libpari-dev libgsl0-dev libxext-dev libpng-dev libjpeg-dev libreadline-dev libncurses5-dev mesa-common-dev libx11-dev libxt-dev libxft-dev libntl-dev libgl1-mesa-dev libgl-dev libao-dev hevea debhelper libfltk1.3-dev
sudo apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi dfu-util

19.1.1  Epsilon 15.3.1/Khi (calculatrice), 12.3 (simulateur)

Khi
Pour récupérar les sources du simulateur, faire

wget https://www-fourier.univ-grenoble-alpes.fr/~parisse/numworks/delta_simu.tar.bz2
tar xvfj delta_simu.tar.bz2 

Version du source calculatrice avec le multi-boot : faites

wget https://www-fourier.univ-grenoble-alpes.fr/~parisse/numworks/khi2.tgz
tar xvfz khi2.tgz
wget https://www-fourier.univ-grenoble-alpes.fr/~parisse/numworks/khi18.tgz
tar xvfz khi18.tgz
wget https://www-fourier.univ-grenoble-alpes.fr/~parisse/numworks/khiext.tgz
tar xvfz khiext.tgz

khi2 est pour le slot 1, khi18 pour le slot 2 (et contient le bootloader avec slot 2 en 0x90180000 et slot 3 en 0x90400000).

Il y a quatre arborescences distinctes, trois pour la calculatrice (khi18, khi2 et khiext), une (delta) pour avoir un environnement de développement avec possibilité d’exécuter le code pas à pas. Cela pour deux raisons

Le répertoire khi2 contient l’arborescence pour compiler pour l’OS calculatrice, khiext pour les extensions. Les librairies nécessaires sont précompilées dans le répertoire khiext/apps.

cd khi2
make MODEL=bootloader epsilon.A.bin  
cd ../khiext
make 

Si vous voyez des messages tels que ... switch -mcpu=cortex-m7 conflicts..., c’est que le cross-compilateur ARM de votre distribution Linux est trop ancien. Allez sur le site du ARM SDK, descendez jusqu’à faire apparaitre la version 9 (vous pouvez essayer une version plus récente si votre distribution Linux est récente), téléchargez pour Linux x64 et exécutez la commande
cd && tar xvfj Downloads/gcc-arm-none-eabi-9-2020-q2-update-linux.tar.bz2
puis ajoutez dans votre fichier ~/.bashrc la ligne
export PATH=~/gcc-arm-none-eabi-9-2020-q2-update/bin:$PATH
sauvegardez, puis tapez les commandes
source ~/.bashrc
cd chemin_vers_khi2
make
cd ../khiext
make
cd ../
Vous pouvez aussi éditer les scripts mkarm des répertoires khi2 et khiext et les exécuter à la place de make

Le fichier firmware de la version modifiée de Epsilon, epsilon.A.bin est dans le sous-répertoire output/release/device/bootloader de khi2, le fichier contenant les applications externes est apps.tar dans le répertoire khiext. Pour les flasher sur la calculatrice, faire reset+4 sur la calculatrice et

dfu-util -i0 -a0 -s 0x90000000 -D khi2/output/release/device/bootloader/epsilon.A.bin -R
dfu-util -i0 -a0 -D khiext/apps.tar -s 0x90200000:force

Le premier fichier est le firmware Epsilon avec les modifications des projet Delta/Omega/Khi. Ce projet fournit une interface pour programmer la calculatrice en C et permet d’exécuter du code contenu dans un fichier apps.tar qui est stocké dans le deuxième firmware.

Le répertoire khi18 contient une version allégée de Epsilon pour fournir un firmware de lancement minimal, qui permet d’accéder à plus de mémoire RAM dans KhiCAS. La compilation est quasi-identique à celle dans khi2
make MODEL=bootloader epsilon.B.bin
ou éditer et exécuter le script mkarm.

Pour compiler le simulateur, vous pouvez lancer le script delta/mksimu ou vous pouvez exécuter les instructions suivantes

cd delta/ext/giac-1.6.0/src
ln -sf config.h.numworks.gmp config.h
make -f Makefile.numworks.simulator
/bin/cp simu/libgiac.a ../../simulator/lib
cd ../../..
/bin/rm output/simulator/debug/epsilon.elf
make V=1 DEBUG=1 PLATFORM=simulator
ln -sf output/simulator/debug/epsilon.elf simu

Essayez mantenant de taper ./simu puis de lancer Khicas sur le simulateur en tapant \ (cette touche permet de simuler l’appui sur la touche HOME).

Attention, le support de MicroPython et de l’exécution en mode pas à pas n’est pas compatible, à cause du code assembleur de certaines fonctions situées dans les fichiers delta/python/src/py/nlr*. En conséquence si vous sélectionnez MicroPython pour évaluer dans KhiCAS, le simulateur plantera dès la première évaluation. Pour contourner ce problème, il faut compiler ces fichiers nlr* en mode release puis copier les fichiers objets obtenus dans le répertoire debug d’Epsilon/Delta. Pour faire cela, vous pouvez lancer le script delta/mksimu, puis le script delta/cpnlr. La prochaine exécution de delta/mksimu devrait alors donner un exécutable simu qui permet d’activer simultanément l’évaluation MicroPython et la mise au point.

KhiCAS
Si vous modifiez le source de giac, il faut recompiler la librairie libgiac.a et la copier dans ../../lib, pour cela vous pouvez utiliser le script mkarm dans le répertoire khiext. N’oubliez pas de répercuter la modification dans le code source du simulateur.

19.2  Utilisation du débuggueur

Le simulateur peut se lancer avec le débuggueur en tapant gdb ./simu ou depuis votre éditeur de texte ou votre environnement de développement. Par exemple si vous utilisez emacs, tapez Esc x gdb, valider, mettre simu comme nom d’exécutable, valider. Voir par exemple ici un guide de prise en main d’utilisation du débuggueur avec emacs. Vous pouvez exécuter la commande
cp delta/ext/giac-1.6.0/src/.gdbinit delta
pour définir la macro v de gdb qui vous permettra de visualiser les variables de type giac::gen de manière plus parlante qu’avec la commande p.

Par exemple, si vous faites dans la console gdb la commande b khicas_addins_menu (breakpoint, i.e. point d’arrêt à cette fonction), puis r pour lancer le programme, il s’interrompra dans le menu d’affichage des applications tierces (Home 1), vous pouvez alors exécuter ligne après ligne avec la commande n, en visualisant le contenu des variables avec la commande p ou v pour des variables Xcas de type gen.

19.3  Intégration avec le shell Khicas

Pour ajouter une application au menu Home 1 des applications ajoutées dans Khicas, il faut modifier la fonction khicas_addins_menu() dans kadd.cc. Incrémentez smallmenu.numitems, définissez smallmenuitems[j].text pour la première valeur de j disponible, puis dans la boucle while(1) {...}, ajoutez la définition de votre fonction ou un appel vers votre fonction avec if (smallmenu.selection==j+1). Pour compiler et tester, cf. la fin de la section 19.1.1.

L’exemple de la suite de Syracuse vous montre comment faire entrer une valeur, afficher un graphique repéré, et entrer quelque chose en ligne de commande. L’exemple de la fractale de Mandelbrot montre comment afficher un graphique pixelisé pixel par pixel. L’exemple du jeu de Mastermind montre comment afficher un graphique pixelisé avec des formes plus complexes et interagir avec l’utilisateur lorsqu’il appuie sur une touche.

Conseils :

Les paragraphes qui suivent décrivent brièvement le SDK. Pour plus de détails, il faut ensuite se référer à k_csdk.h et kdisplay.h/kdisplay.cc pour l’interface et aux fichiers headers de giac pour toutes les fonctions de giac.

19.4  Fonctions de base de l’OS.

Les fonctions de bas niveau de Epsilon sont déclarées dans k_csdk.h et sont utilisables depuis un programme C et tout langage qui s’interface avec C (donc quasiment tout langage).

Si vous voulez créer une extension indépendante de KhiCAS, vous pouvez vous inspirer d’une des applications de final/nw-external-apps, définissez votre propre fonction int main() et linkez avec votre fichier objet à la place de -lgiac, dans ce cas vous pouvez choisir n’importe quelle licence de logiciel qui peut se lier avec une licence d’OS propriétaire.

Le clavier :

Les affichages.
Notez que y=0y=0 correspond à la première ligne en-dessous de la ligne d’état (18 pixels de hauteur), on a donc 0y<2220 \leq y&lt;222 et 0x<3200\leq x &lt;320
Les couleurs utilisent un entier 16 bits au format RGB 565, on peut convertir depuis RGB888 par

int rgb888to565(int c){
  int r=(c>>16)&0xff,g=(c>>8)&0xff,b=c&0xff;
  return (((r*32)/256)<<11) | (((g*64)/256)<<5) | (b*32/256);
}

Le système de fichiers.

Gestion du temps

19.5  Commandes graphiques complémentaires

19.6  Interaction avec l’UI Khicas

Certaines fonctions utilisent un pointeur vers le contexte du moteur de calcul (qui contient les variables assignées, le mode radian/degré, etc.), de type giac::context *, et dont la valeur est en général stockée dans la variable contextptr dans les fonctions d’interface de Khicas de kdisplay.cc (on peut aussi passer un pointeur nul).

L’internationalisation est gérée par la commande
const char * gettext(const char *)
Pour ajouter une chaine en plusieurs langues, par exemple Hello, mettez dans votre code gettext("Hello"), et ajoutez au fichier numworks_translate.h, dans l’ordre alphabétique une ligne du type
{"Hello",0,0/* zt */,"Bonjour" /* fr */,"Guten Tag" /* de */,0 /* es */,0 /* nl */,0 /* pt */,0},
Attention, l’utilisation du fichier numworks_translate.h ne peut se faire qu’avec du code GPL qui est linké avec KhiCAS (mais rien ne vous empêche d’utiliser gettext dans un programme compatible avec la GPL avec un autre fichier de traductions en repartant de zéro).

19.7  Interaction avec giac

Le type giac::gen permet de travailler avec tous les types de Xcas : entier, flottant, fraction, nom de variable, expression, fonction... On peut construire un gen avec les types de base C

gen g(1.2),h(3);

ou avec l’interpréteur (avec une chaine de caractères), dans ce dernier cas il faut évaluer le gen avec un appel à eval, par exemple

gen g("x^4-1",contextptr);
g=eval(g,1,contextptr);

En général une fonction de Xcas a un équivalent C++ avec le même nom précédé par _, et deux arguments, un de type giac::gen et un deuxième qui est un pointeur sur le contexte d’évaluation. Lorsqu’une commande Xcas prend plusieurs arguments, il faut les grouper en un gen de type vecteur, en utilisant une commande makesequence. Par exemple _randNorm(makesequence(0.0,2.0),contextptr) équivaut à la commande randNorm(0.0,2.0) de Xcas. Notez que les fonctions usuelles n’ont pas de préfixe _.

19.8  Sauvegardes et restauration

Il est possible de sauvegarder l’ensemble des données de votre calculatrice en local sur votre PC, i.e. sans connexion Internet. Xcas le permet depuis le menu Numworks. On peut aussi appeler dfu-util directement, cf. la section 2. Il faut ensuite récupérer les informations sur la calculatrice avec la commande
dfu-util -i0 -a0 -s 0x080001c4:0x20 -U platform.info
ce qui place dans le fichier binaire platform.info (de taille 32 octets) des informations sur la Numworks (cf. ion/src/shared/platform_info.cpp)

Ensuite en remplaçant A et T par leur valeur dans la commande
dfu-util -i0 -a0 -s A:T:force -U numworks.storage
vous pouvez archiver l’ensemble des données de votre calculatrice dans le fichier numworks.storage. A devrait valoir 0x20000b60, et T 0x8014 (dont 4 octets valant 0xEE0BDDBA puis 32K de data puis à nouveau les 4 octets du début, et 3 pointeurs) ce qui donne la commande
rm -f numworks.storage &&dfu-util -i0 -a0 -s 0x20000b60:0x8014:force -U numworks.storage

Vous pourrez ensuite restaurer l’archive par la commande
dfu-util -i0 -a0 -s A:T:force -D numworks.storage
avec Khi
dfu-util -i0 -a0 -s 0x20000b60:0x8014:force -D numworks.storage

20  Opinions

20.1  Quelques mots sur les calculatrices.

La calculatrice est devenue incontournable dans les enseignements de mathématique au lycée, avec trop souvent une utilisation presse-boutons, alors qu’elle est sous-utilisée dans les études scientifiques, partiellement en réaction. De ce fait, les constructeurs mettent l’accent sur le développement de fonctionnalités pour le lycée, en faisant apprendre des séquences de touches à effectuer pour certaines taches bien précises, plutot qu’une méthode plus générale, un peu moins conviviale pour ces taches, mais plus adaptable. C’est par exemple ce qu’on retrouve dans la philosophie des applications de Numworks, si on veut effectuer une tache pour laquelle elles sont prévues, c’est facile et en général intuitif, mais il devient vite difficile de faire quelque chose qui n’est pas prévu (par exemple simuler des données avec un programme et les utiliser dans une des applis de statistiques, représenter graphiquement une fonction définie par un programme, utiliser dans Calculs ou dans Python certaines fonctions des applications probabilité ou statistiques, ...).

Je pense que ce n’est pas adapté pour les élèves qui doivent pouvoir expérimenter des choses que le constructeur n’a pas implémenté parce que cela ne correspond pas aux programmes (c’est particulièrement vrai pour les bons élèves si on ne veut pas qu’ils s’ennuient!). À court terme, c’est plus facile pour enseigner d’utiliser une application comme Fonctions, mais à long terme, c’est plus formateur pour de futurs étudiants (au moins en sciences et en maths) d’apprendre à utiliser un shell puissant en y tapant des commandes2. Bien sur, les deux approches doivent se compléter. Or les élèves sont souvent tributaires du choix de modèle demandé par leur enseignant de seconde, ils n’ont pas encore de recul pour choisir un autre modèle que celui demandé par l’enseignant et comprendre toutes les conséquences du choix, en particulier si la calculatrice ne permet pas d’y installer ou/et utiliser un shell puissant. Il est donc important de pouvoir proposer pour le plus possible de modèles populaires une alternative à la calculatrice officielle, permettant aussi aux bons élèves d’exploiter toutes les possibilités de leur calculatrice et de favoriser leur curiosité3.

Il faut aussi que les enseignants qui conseillent un modèle de calculatrices en seconde prennent bien conscience que le choix ne se limite pas à une utilisation pendant une année ou même pendant les 3 années de lycée mais impacte toutes les années d’études, en particulier pour les élèves bons en sciences et en maths. La Numworks non verrouillée réalise d’une certaine manière un bon équilibre entre la facilité d’utilisation pour tous en seconde (Epsilon 15 ici) et les possibilités ensuite pour les bons élèves qui auront des maths ensuite (χ\chiCAS ici). Mais le passage à une version plus récente d’Espilon casse cet équilibre, un enseignant soucieux de ses bons élèves devrait les mettre en garde pour qu’ils ne mettent pas à jour!

20.2  Mes relations difficiles avec Numworks.

C’est en mai 2016 que j’ai entendu parler pour la première fois de Numworks. Romain Goyet, qui démarrait son projet, m’a contacté pour me sonder un peu dans le domaine des calculatrices. La recommandation principale que je lui avais faite était la suivante : il ne faut pas chercher à faire des économies sur la mémoire, car on le regrette. Ensuite, je n’ai plus eu aucune nouvelle avant d’apprendre par tiplanet le lancement de la calculatrice en aout 2017, en particulier je n’ai pas participé au programme de beta-tests. Cette attitude a sans doute contribué à ce que j’exprime sans retenue mon scepticisme vis-à-vis de la Numworks dans plusieurs posts sur tiplanet : à propos de la mémoire, des fonctionnalités et de la communication à mon avis trompeuse sur le caractère open-source. Ce qui m’a sans doute valu d’être considéré comme un anti-Numworks par Goyet, alors que l’accueil du reste de la communauté était à l’époque très (trop?) enthousiaste. Mais je ne regrette pas du tout d’avoir exprimé publiquement mes réserves, si tout le monde était resté sans rien dire, il n’y aurait pas eu de changement dans la licence d’Epsilon, et les firmwares Omega, Upsilon, Delta (et Khi leur héritier direct) n’auraient pas pu exister.

Je ne sais pas si ma recommandation de 2016 sur la mémoire a eu un quelconque effet, peut-être que sans elle, les premières Numworks auraient encore eu moins de mémoire. En tout cas, la mémoire disponible était et reste encore vraiment très limitée, même s’il y a eu un progrès pour le stockage en flash avec le passage de 1M à 8M en 2019, probablement parce que Numworks s’est rendu compte que la taille des firmwares successifs atteindrait plus vite que prévu la taille de 1M. Il me semble qu’il y aurait des marges de progression peu onéreuses sur la RAM. Et je continue à penser que Numworks a perdu et perd toujours beaucoup de temps de développement avec la gestion de la très faible quantité de RAM (256K).

Les relations avec Numworks se sont ensuite améliorées en 2018, lors d’une rencontre à l’APMEP de Bordeaux, où je leur avais montré mon module de tortue logo sur les calculatrices Casio (J.B. Boric avait aussi implementé un module turtle pour la Numworks). Numworks comprend alors l’intérêt d’avoir un module officiellement supporté pour faire la transition avec le collège. À cette occasion, ils me donnent une N0100. J’apprécie le geste, même si je n’en ai pas l’usage pour y porter Giac (à cette époque, Damien Nicolet, alias zardam, avait réussi à porter Giac sur sa Numworks N0100 mais en modifiant le hardware ce dont je suis personnellement incapable). En mai 2019, Numworks me contacte pour me proposer de signer un accord de confidentialité, ce que j’interprète comme le signe qu’un nouveau modèle allait sortir permettant de porter Giac (sans modification hardware). Mais certaines clauses de l’accord ne me convenaient pas : je voulais m’assurer que rien n’entrave le développement de Giac/Xcas. Numworks refusant de modifier les clauses en question, je ne signe pas l’accord de confidentialité. Le nouveau modèle de Numworks (N0110) est annoncé deux mois plus tard, et j’en achète un. À la rentrée 2019, avec l’aide de J.B. Boric et Damien Nicolet, j’arrive à faire tourner sur ma N0110 un prototype logiciel qui permet d’utilise le moteur de calcul de Giac dans l’appli Calculs. Se pose alors la question de l’incompatibilité des licences entre Giac sous licence GPL et Epsilon, qui n’est pas un logiciel libre. Mais Numworks est inflexible sur la licence d’Epsilon. Ce qui conduit Damien Nicolet à développer un système permettant de compiler deux firmwares à installer séparément, l’un dérivé d’Epsilon (sous sa licence) et l’autre sous licence GPL (le deuxième sera remplacé plus tard par la gestion des applications externes dans Delta/Omega/Upsilon/Khi). En novembre 2019, nous informons Numworks de ce succès et leur demandons s’ils voient encore des problèmes juridiques. Fin 2019, n’ayant pas reçu de réponse, nous publions alors la première version de Delta/KhiCAS. Je n’ai pas de statistiques du nombre de personnes qui ont installé KhiCAS sur leur Numworks, j’ai par contre le nombre de personnes qui ont consulté la documentation, pour l’année 2020/21 cela dépasse un peu les 5000 et pour 2021/22 on dépasse les 9000, ce qui n’est pas négligeable du tout comparé aux chiffres de ventes estimés.

En 2017/2018, les ventes de calculatrices Numworks en France ont du être confidentielles : avec une sortie fin aout 2017, ce ne sont pas des scolaires qui ont acheté, uniquement des passionés et des profs (avec le soutien de L. Chéno de l’inspection générale). En 2018/19, quelques profs enthousiastes (en particulier par le module de programmation en Python) ont commencé à recommander la Numworks à leurs élèves, mais les ventes étaient certainement encore faibles (j’estime à quelques milliers d’unités). Le succès en France s’est dessiné à la rentrée 2019 (j’estime qu’ils ont vendu 10 à 15 000 calculatrices en 2019/20) et encore plus en 2020 (probablement le double). À la rentrée 2022, j’estime que Numworks possède environ la moitié du marché des calculatrices couleurs avec de l’ordre de 40 000 calculatrices vendues par an. Je pense que c’est en voyant les ventes décoller à la rentrée 2019, que Numworks a décidé de tourner le dos au calcul formel sur leurs calculatrices, par crainte de ne pas pouvoir se développer à l’étranger, alors qu’en mai 2019, ils envisagaient encore la chose en se disant que cela pouvait aider à booster les ventes en France (sinon ils ne m’auraient pas proposé de signer un accord de confidentialité). Ils ont dû être très désagréablement surpris de la solution technique réalisée par zardam (et qui est sans équivalent de leur coté à ce jour!), alors qu’ils espéraient sans doute pouvoir bloquer la diffusion par des questions de licence. La suite n’a fait que confirmer cette tendance : ils ont commencé par cacher les (maigres) capacités de calcul symbolique d’Epsilon (on peut les retrouver dans Omega et Khi), puis décidé de verrouiller leurs calculatrices et modifié la licence d’Epsilon.

L’objectif de Numworks, c’est maintenant le marché américain. On verra si ils réussissent aussi bien qu’en France, où les conditions étaient bien plus favorables : maintenant ils ne peuvent plus communiquer sur l’open-source, le chauvinisme ne va pas dans le bon sens (vis-à-vis de Texas Instruments en particulier) et il n’y a probablement pas d’équivalent à un inspecteur général qui vous soutient parce que vous allez dans le sens de sa réforme Python. C’est un pari pour Numworks, sans compter que TI est sans doute vacciné par ce qui s’est passé en France. Le choix fait par Numworks risque d’être perdant-perdant : malgré sa faible mémoire, la N0110 est (je devrais plutôt dire était) une calculatrice avec un excellent rapport qualité-prix pour installer Khicas (avec Xcas en parallèle), et coté Numworks, KhiCAS ouvrait le marché français des BTS et prépas scientifiques, et aux USA des tests autorisant le calcul formel.

En conclusion, c’est quand même dommage de ne pas chercher une solution, il y a pas mal de pistes possibles (par exemple avoir deux modèles de calculatrices, avoir plusieurs modes examens, signer un firmware KhiCAS pour la France...). Il est d’ailleurs assez symptomatique que Numworks ait discuté du verrouillage pendant plusieurs mois avec beaucoup de monde dans la communauté ... mais jamais avec moi! Je me demande si, suite au succès rencontré en France, Numworks pense à faire son propre modèle CAS (avec des fonctionnalités symboliques limitées au lycée), qui comme chez les concurrents, serait vendu plus cher et avec plus de marge. Ce serait une raison de plus d’empêcher l’installation d’un module de calcul formel plus puissant sur le modèle moins cher vendu aujourd’hui 80 euros.

20.3  Développer pour Epsilon/Omega/Upsilon vs Giac/KhiCAS : une querelle ancien-moderne?

Epsilon (et ses dérivés) est écrit en C++ en utilisant des fonctionnalités avancées du langage, il est difficile de naviguer dans le code source avec des éditeurs comme emacs (il y a beaucoup de petits fichiers sources avec des arborescences profondes et des espaces de noms imbriqués) et pour compiler il faut une version récente de gcc (9). Giac est aussi écrit en C++ mais en fait c’est un style très proche du C, impératif, avec des noms de fonction courts, peu de fichiers sources dans un même répertoire et on peut compiler avec des versions anciennes de gcc (4).

Epsilon n’utilise pas les librairies standards (libc, libstdc++) contrairement à Giac. Il n’y a pratiquement pas de mémoire sur le tas pour allouer des structures de données avec malloc ou new. Je pense que ce choix, lié aux faibles capacités mémoire de la calculatrice, a fait et fait perdre pas mal de temps de développement, d’abord parce que dans les premières versions Epsilon utilisait le tas, ils a fallu réécrire ensuite autrement, ensuite parce qu’ils doivent rajouter manuellement des algorithmes standard des librairies standards lorsqu’ils en ont besoin, enfin parce que l’architecture du système est beaucoup plus complexe.

La complexité est parfois nécessaire, mais si on se laisse fasciner, on risque d’oublier l’objectif ou/et coder de manière inefficace ou renoncer devant des objectifs plus difficiles. Et surtout la marche est haute pour commencer à développer : ici il faut s’approprier une architecture complexe et compiler un firmware complet, voir par exemple un tutoriel ici. Très bien fait, mais on est déjà bien fatigué avant d’avoir pu écrire un algorithme un peu original! Pas étonnant finalement qu’il n’y ait que deux applications Omega (RPN et Atomic) qui ne sont pas de Numworks (trois si on y ajoute External qui permet d’utiliser KhiCAS, un éditeur hexa, des jeux), alors que les sources de l’OS sont disponibles depuis 5 ans. Upsilon, un fork du projet Omega, est de mon point de vue un peu meilleur sur cet aspect de développement original, avec une application liseuse de fichiers texte (support partiel de commandes LaTeX) et un support de MicroPython plus récent que celui de Numworks et avec des modules scientifiques complémentaires. On peut aussi observer que ni Epsilon ni ses forks ne proposent de tableur, plus de 5 ans après la sortie de la première version d’Epsilon. (alors qu’il existait plusieurs tableurs développés par la communauté pour les HP48 il y a 25 ans, bien sur, avec une interface plus rudimentaire, mais fonctionnels). Il y a des centaines de programmes disponibles pour les calculatrices concurrentes avec des communautés assez actives, on ne peut pas dire que c’est le cas pour la Numworks, l’activité récente de Omega et Upsilon consiste essentiellement à rester compatible avec les protections des dernières versions d’Epsilon.

On verra s’il y a des développeurs qui se lancent pour créer des applications externes avec ce que propose Epsilon 16 ou supérieur, mais le squelette d’application exemple est aussi relativement complexe, cf. l’exemple, avec 21 fichiers sources pour 773 lignes de code. On peut comparer avec les exemples d’applications additionnelles dans KhiCAS de complexité croissante, allant de la suite de Syracuse (25 lignes) à la fractale de Mandelbrot (29 lignes), au mastermind (132 lignes) ou au tableau périodique (environ 400 lignes) jusqu’au tableur (un peu plus de 1000 lignes), le tout dans un ou deux fichiers source (kadd.cc, kdisplay.cc pour le tableau périodique).

Comme je l’écrivais en titre, c’est peut-être une querelle ancien-moderne. Mais peut-être aussi une question de culture. Le matheux que je suis voit vraiment l’informatique comme un outil pour calculer, et écrire des algorithmes, en général en lien avec les maths. Écrire du code d’interface ne m’intéresse pas, je le fais par obligation. L’inverse est certainement vrai pour beaucoup de passionés d’informatique, en tout cas c’est mon impression quand j’enseigne les maths en parcours informatique ou quand j’échange sur les forums. Lorsque Numworks dit que sa calculatrice va faire aimer les maths, cela n’a absolument pas le même sens pour eux que pour moi. Pour eux, cela veut visiblement dire proposer une belle interface qui donne aux élèves avec le moins d’effort possible les réponses aux problèmes types de maths donnés au lycée. Alors que moi je souhaite rendre les élèves autonomes pour être capable de résoudre des problèmes en-dehors des exercices types de lycée, et donner aux élèves motivés l’envie d’aller au-delà des programmes scolaires en utilisant toute la puissance de calcul à leur disposition sur la calculatrice pour explorer. Malheureusement, j’ai l’impression que de moins en moins de gens sont de mon avis, y compris chez certains profs de maths. La principale raison à mon avis, c’est le déclassement du métier de prof, qui a conduit à une crise de recrutement, et un niveau moyen en maths des étudiants au capes de plus en plus faible. Parallèlement, le mauvais usage des outils de calcul (en presse-boutons) conduit à une contre-réaction hostile parmi les profs de maths qui sont bons dans leur discipline.

Il y a aussi une controverse sur les outils de développement et collaboration. L’outil de synchronisation à la mode aujourd’hui est git avec un hébergement sur github et les jeunes ne jurent que par Discord. Personnellement, je travaille essentiellement seul et j’ai l’habitude d’utiliser des archives tar pour mes sauvegardes. Pour collaborer, j’ai l’habitude d’utiliser svn, que je trouve plus simple pour faire un commit que git (une étape et pas deux). Je n’aime pas du tout l’idée d’héberger des projets sur github, cela donne trop de controle à l’hébergeur (Microsoft ici) et c’est aussi bien trop centralisé à mon gout (le contraire de ce qui a donné naissance à Internet), sans compter que le cout en ressources doit être gigantesque (vu le nombre de forks de certains projets). Si d’autres développeurs le font, je respecte leur choix, et je consulte ou utilise du code source indépendamment de la façon dont il est produit, ce qui importe c’est le code lui-même. Je n’ai jamais essayé Discord et je n’ai pas l’intention d’essayer, c’est peut-être très convivial en particulier pour de la communication synchrone, mais c’est du logiciel propriétaire sur lequel on n’a aucun controle alors qu’il y a des logiciels libres qui permettent de gérer des forums, où on discute de manière asynchrone ce qui de plus me convient mieux. Bref, je ne vois pas au nom de quoi github+discord devrait être la seule et unique façon de développer et collaborer, surtout que cela pourrait être remplacé par d’autres outils dans quelques années (comme cvs par svn puis git, ou SourceForge). Il y a une forme d’intégrisme dans l’usage de l’outil informatique chez certains (y compris au plus haut niveau de l’éducation nationale avec l’imposition de Python comme unique langage de programmation au lycée), qui devient un peu comme une religion. Il serait souhaitable je pense qu’il y ait plus de tolérance, la diversité est une richesse.

Je travaille depuis 22 ans sur Giac et je programme du calcul formel depuis presque 30 ans, au début le web n’existait même pas, les échanges se faisaient via des newsgroup et des serveurs ftp. Je ne suis sur aucun réseau social, ni sur des systèmes d’échange synchrones et je n’en vois pas trop l’intérêt, la consultation asynchrone de forums et d’emails me semble bien plus approprié, on est dans sa bulle quand on code et on ne se laisse pas distraire par des notifications. Je ne me précipite pas sur la dernière mise à jour ou la dernière nouveauté, j’ai appris à mes dépens que quand quelque chose marche, il faut y réfléchir à deux fois avant de le modifier (et bien conserver une sauvegarde de ce qui marchait). J’ai aussi appris que le monde est complexe, il m’a fallu parfois plusieurs mois pour porter Giac et ses dépendances sur une calculatrice. Les erreurs de compilation ou d’édition de liens lors d’un nouveau portage sont normales et se comptent souvent par centaines. Si on ne travaille que sur des petits projets ou des projets récents, on risque de prendre des habitudes de confort où tout marche du premier coup et de renoncer à la première difficulté.

A  Si vous avez mis à jour vers Epsilon 16 sans en connaitre les conséquences.

Une faille du système de verrouillage a été découverte par M4x1m3, il est donc temporairement possible à la date du 27 mars 2022 de déverrouiller votre calculatrice si elle est verrouillée, rendez-vous ici. Numworks a comblé cette faille le 28 mars, si vous avez mis à jour après, la faille ne fonctionnera plus pour vous, je vous invite à lire le reste de cette section.

Remarque préliminaire : je ne suis pas juriste, et de toutes façons le droit est soumis à des interprétations, contrairement à la preuve d’un théorème mathématique. Néanmoins, j’ai pas mal étudié les questions juridiques liées aux logiciels, j’en ai discuté et jusqu’à présent personne n’a contesté sérieusement cette analyse. Si vous y voyez des erreurs, merci de me les signaler.

Si vous avez mis à jour vers Epsilon 16 sans en réaliser toutes les conséquences4, il vous reste un recours : contacter rapidement Numworks et leur demander un moyen technique permettant l’effacement complet de leurs logiciels, i.e. le retour au bootloader de ST (ensuite vous pourrez installer au choix Khi, Omega ou Epsilon 15). Je pense qu’ils n’ont légalement pas le droit de refuser, car pour le moment ils n’affichent aucun avertissement sur le changement de licence du logiciel lors de la mise à jour et n’en demandent pas l’approbation. Voici un argumentaire juridique.

L’utilisation du logiciel de la calculatrice se fait selon un contrat de licence qui lie l’utilisateur à l’éditeur (Numworks). En l’absence d’autre indication5, c’est la licence indiquée sur le site github d’Epsilon qui fait foi, pour la version 15.5 d’Epsilon ou pour Omega ou Delta “NumWorks Epsilon is released under a [CC BY-NC-SA License]” Pour la version 16, la mention a été changée en “All rights reserved” (commit f06b642 le 30 Juillet 2021 par EmilieNumworks).

C’est une différence fondementale en droit avec les mises à jour précédentes d’Epsilon (ou celles proposées par les constructeurs concurrents). car ce changement de licence logicielle est une modification unilatérale du contrat de licence. L’article 1193 du code civil stipule que “Les contrats ne peuvent être modifiés ou révoqués que du consentement mutuel des parties, ou pour les causes que la loi autorise”. Comme il ne s’agit pas ici d’un cas particulier autorisé par la loi, Numworks aurait du vous avertir du changement de licence et vous demander d’approuver la modification du contrat (et pour un élève mineur, je pense que c’est un représentant légal qui doit approuver la nouvelle licence).

Or cela n’est pas fait me semble-t-il sur le site de Numworks lors de la mise à jour (je n’ai évidemment pas testé toute la procédure en risquant de voir ma calculatrice mise à jour). Rien n’est explicitement indiqué dans la lettre d’information Numletter du 1er Septembre incitant à faire cette mise à jour “Nous vous invitons à installer la dernière mise à jour disponible (version 16) sur votre calculatrice pour profiter de nos nouveautés. Léo vous enverra très prochainement un email pour vous les détailler.” et dans la lettre du 6 octobre de Léo, on a déjà été invité par trois fois à faire la mise à jour avant d’avoir un lien sur les changements liés à la sécurisation.

Si Numworks refuse de vous permettre de déverrouiller votre calculatrice, en argumentant sur une exigence de sécurité aux examens, vous pouvez contrer l’argument en indiquant que la réglementation n’a pas évolué en France6. De plus, si vous avez installé KhiCAS, vous pouvez certifier sur cette page que le firmware installé est conforme à la réglementation en vigueur en France.

Agissez vite, plus le temps passe, plus votre absence de réaction risque d’être interprétée comme une acceptation tacite de la nouvelle licence. Par comparaison, la modification unilatérale par le fournisseur d’un service de communications est possible dès lors que l’abonné est informé d’une telle modification et qu’il a la liberté de sortir du contrat, mais il y a un délai pour sortir du contrat. La sortie du contrat de licence signifie ici que l’on doit pouvoir effacer tous les logiciels sous licence avec Numworks, y compris le logiciel de verrouillage, et revenir au bootloader de ST. Pour cela Numworks pourrait publier un mini-firmware signé qui repasse la protection de niveau 1 au niveau 0, ce qui a pour effet d’exécuter un effacement complet (il est d’ailleurs fort possible que ce mini-firmware existe déjà en usage interne chez Numworks).

Il ne faut probablement pas s’attendre à une réponse positive de Numworks sur un simple email du type “Je veux retourner en version 15.5”, il faut bien motiver votre courrier. Il faudra peut-être une pression plus importante, ça peut être un nombre important de courriers (surtout si ce sont des profs qui les écrivent), ou ayant un aspect plus officiel (par exemple courrier d’une association de consommateurs, lettre recommandée avec accusé de réception...). Si la pression est suffisamment importante, j’espère que Numworks réalisera que sa meilleure stratégie7 est de permettre aux possesseurs de Numworks N0110 de déverrouiller leurs calculatrices, et de vendre à destination des USA (et autres marchés dont ils envisagent la conquête) un nouveau modèle (disons une N0120) verrouillée dès le départ. D’autant plus que du point de vue sécurité c’est une solution bien plus sure. En effet, rien n’empêche un possesseur de Numworks N0110 non verrouillée de simuler ce qu’un surveillant pourra raisonnablement vérifier, par exemple le numéro de version dans les Paramètres. Avec un modèle différent et facile à distinguer, il suffit aux pays qui le souhaitent d’autoriser la N0120 et interdire la N0110.

B  Moteur de rendu 3d et géométrie.

La dernière version de KhiCAS pour Numworks fournit un moteur de rendu de graphique 3d, inspiré au départ par le script Python 3d de Eric Schrafstetter. Pour l’essayer rendez-vous sur cette page, et choisissez la mise à niveau alpha.

Ce moteur de rendu apparait si vous entrez dans le shell ou l’éditeur de programmes une commande renvoyant un graphe dans l’espace, par exemple depuis le menu Toolbox, sous-menu 3d (raccourci () :

Depuis le moteur, appuyez sur la touche Toolbox pour modifier les réglages numériquement et pour voir la liste des raccourcis clavier, dont voici les plus importants :

Il est possible de créer des figures géométriques 2d ou 3d, et de faire des calculs de géométrie analytique. Ouvrez l’éditeur de programmes, effacez si nécessaire le patron def ... ou efface ..., puis entrez une instruction par ligne. Pour passer à la ligne, utilisez la touche EXE, pour afficher la construction utilisez la touche OK. Les principales commandes de géométrie se trouvent dans le menu Toolbox. Le menu rapide shift + affiche les commandes de géométrie les plus fréquentes, le menu shift * permet de donner facilement des couleurs aux objets géométriques créés.

C  Équivalents dans χ\chiCAS de fonctionnalités mathématiques d’Epsilon \geq 16.

Dans cette section on explique comment faire avec χ\chiCAS pour retrouver les fonctionnalités mathématiques récemment introduites par Numworks dans Epsilon. En effet χ\chiCAS s’utilise conjointement avec la version 15.5 d’Epsilon et il n’est pas commode ou pas possible d’installer une version plus récente d’Epsilon en parallèle.

  


1
sous Linux, vérifiez que dfu-util est bien installé et que le fichier 50-numworks-calculator.rules a été copié dans /etc/udev/rules.d
2
On peut d’ailleurs sérieusement se demander à quoi cela rime d’apprendre un peu de programmation en Python sans avoir au préalable un minimum de maitrise dans l’écriture d’une ligne de commande simple
3
Pour moi, une calculatrice qui fait aimer les maths, c’est une calculatrice qui va donner envie à un élève d’expérimenter sur sa calculatrice des questions en prolongement du programme scolaire. À coté d’applications intuitives, il faut un espace de liberté qui ne soit pas limité aux quelques fonctionnalités d’une interface d’application. C’est le sens de χ\chiCAS, pour Numworks ici, disponible également pour d’autres modèles (Casio Graph 90/35eii, TI Nspire).
4
Attention, vous n’êtes pas concerné si vous avez acheté une calculatrice qui était préchargée avec Epsilon 16
5
Contrairement à d’autres constructeurs. Par exemple lors de l’achat d’une TI Nspire CX, j’ai trouvé dans le boitier un contrat de licence imprimé intitulé “Les unités Nomades d’Apprentissage des Mathématiques et des Sciences TI-Nspire 3.x, Licence Individuelle d’Utilisation” qui reprend des extraits de lois du code de la propriété intellectuelle
6
Et même si la réglementation évolue, il y a une hiérachie en droit, une loi est prioritaire sur une réglementation
7
Certainement meilleure que de finir comme le cas de la console PS3/linux. Si on compare avec ce cas, on peut quantifier la perte de fonctionnalité CAS du verrouillage d’Epsilon 16 en regardant la différence de prix entre calculatrice non CAS et CAS qui est d’environ 50 euros.
Retour à la page principale de Giac/Xcas.
Ce document a été traduit de LATEX par HEVEA