ICOM Normal.dot for Word 6.0
Transcription
ICOM Normal.dot for Word 6.0
Introduction au Calcul Formel Philippe Fortin Vous trouverez dans la première partie de ce document des éléments permettant de mieux maîtriser l'utilisation d'outils de calcul formel, afin en particulier d'éviter bon nombre d'erreurs classiques. La seconde partie est consacrée à une étude plus approfondie des méthodes de représentations des expressions mathématiques ainsi qu'à la mise en œuvre de certains algorithmes effectivement utilisés par les logiciels de calcul formel. De nombreux exemples, issus de l'utilisation de Maple et du logiciel de calcul formel de la TI-89 et TI-92 Plus, permettent d'illustrer les points les plus importants. Sommaire Possibilités et limites d'une calculatrice 2 La simplification des expressions 5 Les risques de la simplification automatique… 8 Le domaine utilisé pour les calculs 11 La comparaison de deux expressions 15 La fiabilité des calculs 17 L'exemple de la résolution des équations 19 La représentation d'une expression 20 La fonction part 22 Un exemple complet d'utilisation de part : la dérivation 24 Disposer d'un bon outil ne dispense pas de réfléchir ! 30 Le calcul formel pas à pas 32 Bases de Gröbner 37 Possibilités et limites d'une calculatrice Nous allons découvrir dans la suite de ce document de nombreuses particularités liées à l'utilisation d'un système de calcul formel. Comme nous le verrons, certains de ces points conduisent parfois à la production de résultats erronés, ou plus exactement, pouvant donner lieu à des interprétations erronées. Avant d'aborder cette partie, il n'est peut-être pas inutile de rappeler que l'utilisation de n'importe quel outil de calcul, y compris purement numérique, peut causer des erreurs liées à la façon dont seront traitées les données. Seule une connaissance minimale de certaines particularités de fonctionnement des calculatrices numériques et graphiques permet de les interpréter correctement. Erreur numérique lors d'un calcul isolé Une calculatrice numérique ne peut pas manipuler de nombres réels dont le développement décimal n'est pas limité à 12, 13 ou 14 décimales (suivant les modèles). De ce fait, des calculs simples comme 3*(1/3) peuvent éventuellement conduire à des résultats inexacts. L'arrondi effectué lors de l'affichage du résultat peut dans certains cas masquer le problème, mais on peut facilement le mettre en évidence. Dans l'écran suivant, les trois premiers calculs sont effectués en mode approché, et la TI-92 se comporte comme une calculatrice ordinaire. Les trois derniers calculs sont effectués sous forme symbolique, ce qui fait naturellement disparaître le problème. En particulier, il ne faudra jamais tester l'égalité de deux nombres décimaux dans un programme, il est largement préférable d'utiliser un test pour voir si la valeur absolue de la différence de ces nombres est bien inférieure à une certaine valeur. Imaginons par exemple un programme chargé de résoudre les équations du second degré. Typiquement, un tel programme va comporter un test sur les valeurs de delta. Que va-t-il se passer avec l'équation x 2 + 2 2 x + 2 = 0 ? Si l'on calcule un discriminant associé à une équation de ce type, suivant la calculatrice utilisée, il est tout à fait possible d'obtenir un résultat non nul, éventuellement négatif ! On va retrouver la même situation dans d'autres cas, comme par exemple pour l'étude de la colinéarité de deux vecteurs. Certaines machines "trichent" un peu et arrondissent les résultats très petits... ce n'est bien sûr qu'une solution très approximative, et qui peut conduire à d'autres erreurs... (par exemple lorsque l'on étudie si une matrice est inversible à partir de la valeur de son déterminant...). Cumul d'erreurs Naturellement ce type d'erreur va avoir des conséquences encore plus importantes si l'on effectue des calculs en cascades, comme par exemple lors d'un calcul des valeurs des termes d'une suite définie par récurrence. Le résultat final est parfois totalement incorrect. 3 T © Texas Instruments Introduction au calcul formel 2/46 Ce point est étudié plus en détail dans le document présentant l'étude de la suite un+1 = (n + 1)un − 1 avec u0 = e − 1 . On peut montrer que cette suite possède une limite nulle, alors que l'on obtient des résultats totalement aberrants, et contradictoires d'un modèle à l'autre, lorsque l'on tente de faire un calcul numérique des termes de cette suite. Représentations graphiques chaotiques... On peut être tenté de "se faire une idée" de la valeur d'une limite en utilisant sa calculatrice. 10 a f lne1x+10x j . Considérons par exemple f x = Quelle est la limite de cette fonction quand x tend vers 0 ? Une étude à partir de la représentation graphique (sur [-0.1, 0.1]) ou de la table des valeurs a de quoi nous laisser perplexes ! Comment interpréter tout cela ? C'est facile si on sait par exemple que 1 + 10 −14 sera arrondi à 1, que le logarithme de cette expression sera donc égal à 0, et que la division par 10 −14 ne changera rien à cela ! 3 T © Texas Instruments Introduction au calcul formel 3/46 Une étude formelle permet heureusement de rétablir un résultat correct : Nous allons dans la suite de ce document tenter de mieux comprendre certaines particularités de l'utilisation des logiciels de calcul formel. Pour cela nous devrons approfondir un peu certains aspects parfois un peu techniques de ces logiciels. Comme dans les premiers exemples numériques de cette section, il est indispensable de les connaître si l'on souhaite pouvoir correctement maîtriser, et être en mesure d'interpréter les résultats fournis par un logiciel de calcul formel. 3 T © Texas Instruments Introduction au calcul formel 4/46 La simplification des expressions Un des problèmes que l'on rencontre très vite lorsque l'on manipule un logiciel de calcul formel, que ce soit sur une calculatrice ou un ordinateur concerne la forme parfois inattendue d'un résultat, qui, bien que correct, n'est pas exprimé sous la "forme simplifiée" à laquelle on s'attendait. Nous allons revenir à plusieurs reprises sur cette question dans ce document, mais il est important de mesurer très vite la complexité des problèmes soulevés par cette question. Pour commencer, il faut absolument comprendre qu'il est bien difficile lorsque l’on fait des calculs sur des expressions symboliques de définir ce qu’est la forme simplifiée d’une expression. La plus simple à utiliser… pourrait-on être tenté de répondre. Commençons par un exemple simple, lié à l'étude des fonctions polynômes. Lorsqu'il s'agit de calculer les valeurs d'un polynôme en un point, on peut convenir que la forme simplifiée est la forme qui nécessite un minimum d'opérations. Par exemple, pour calculer les valeurs du polynôme af p x = 243 x 5 + 405 x 4 + 270 x 3 + 90 x 2 + 15 x + 1 c'est à dire de af p x = 243 ⋅ x ⋅ x ⋅ x ⋅ x ⋅ x + 405 ⋅ x ⋅ x ⋅ x ⋅ x + 270 ⋅ x ⋅ x ⋅ x + 90 ⋅ x ⋅ x + 15 ⋅ x + 1 on doit, a priori, effectuer 15 multiplications et 5 additions. Une idée classique consiste à utiliser une forme équivalente de l'expression, mais moins coûteuse lors que l'on souhaite effectuer des calculs. La méthode de Horner consiste à écrire ce polynôme sous la forme : af a e c b f g h j p x = 1 + 15 + 90 + 270 + 405 + 243 ⋅ x ⋅ x ⋅ x ⋅ x ⋅ x . Il ne faut pas se laisser abuser par la présence de nombreuses parenthèses. Cette expression est effectivement moins coûteuse en calculs que l'expression initiale du polynôme. Il suffit maintenant de calculer 5 produits et 5 sommes Cet exemple est une première illustration de l'existence de méthodes de calcul spécialement développées en vue de l'utilisation de systèmes informatiques. Un élève peut très bien terminer sa scolarité au lycée sans avoir jamais écrit une fonction polynôme sous cette forme, et sans que cela ne lui pose aucun problème. Dans ce cas particulier, une bien meilleure méthode consiste à factoriser ce polynôme : af a f p x = 3x + 1 5 Cette factorisation est également particulièrement intéressante si l'on veut résoudre l'équation af p x =0 ou encore obtenir une forme simplifiée de la fonction dérivée. Faut-il pour autant en déduire que l'on doit systématiquement rechercher une forme factorisée lorsque l'on a besoin de faire des calculs de ce type avec des fonctions polynômes ? Il suffit de prendre par exemple le polynôme défini par af q x = x 5 − 32 pour se convaincre du contraire. La forme factorisée (à coefficients entiers) est af a fe q x = x − 2 x 4 + 2 x 3 + 4 x 2 + 8 x + 16 3 T © Texas Instruments Introduction au calcul formel j 5/46 et on ne peut pas dire qu'elle soit beaucoup plus efficace lorsqu'il s'agit de calculer des valeurs, ni même pour une étude de signe, où il est plus simple d'utiliser la monotonie de x x 5 que d'étudier le 4 3 2 signe du produit x − 2 x + 2 x + 4 x + 8 x + 16 . a fe j Cet exemple illustre bien la difficulté que pose l'écriture d'un logiciel de calcul formel… il n'existe bien souvent pas de méthode optimale, utilisable avec toute une catégorie d'objets, et apte à résoudre dans les meilleures conditions possibles un problème donné. En ce qui concerne la simplification des expressions, deux types d'attitude sont possibles. • Laisser à l'utilisateur un contrôle complet des simplifications à effectuer. • Choisir de proposer systématiquement une forme simplifiée relativement optimale. Maple, par exemple, laisse un contrôle total à l'utilisateur qui peut décider d'utiliser telle ou telle règle de simplification, tout en en ignorant d'autres. Dans un quotient comme Q= cos 2 x + sin 2 x ln( 4) − 2 ln(2) + 1 on pourra par exemple choisir d'appliquer les règles de calcul sur les fonctions trigonométriques, ou celles concernant les logarithmes, ou encore décider d'appliquer toutes les règles de simplification disponibles : Considérons à présent l'exemple de l'expression A= 32 c 5 5 −1 + 5 h 5 + 32 c 5 h 5 1+ 5 5 obtenue lors du calcul du quatrième terme de la suite de Fibonacci en utilisant les méthodes classiques de calcul des termes d'une suite récurrente double. Nous savons que les termes de cette suite définie par un + 2 = un +1 + un u0 = u1 = 1 sont tous des entiers, ce qui est loin d'être évident avec l'expression précédente. Il existe donc une forme plus simple de cette expression, que l'on peut d'ailleurs obtenir très simplement en calculant les premiers termes de la suite. 3 T © Texas Instruments Introduction au calcul formel 6/46 Voyons comment cette simplification peut être conduite avec Maple : Cette fois l'utilisation de la fonction simplify n'a pas été suffisante, et on a dû utiliser des fonctions de mise en forme plus élaborées (normal ou radsimp dans cet exemple), avec les options appropriées pour parvenir au résultat souhaité. Il est facile avec ces exemples de comprendre la puissance de Maple dans ce domaine (on peut intervenir de façon très progressive, en utilisant seulement certaines règles bien précises), mais aussi la complexité d'utilisation d'un tel système. Voici à titre d'exemple la liste des options utilisables avec la fonction simplify : BesselI, BesselJ, BesselK, BesselY, Ei, GAMMA, RootOf, LambertW, dilog, exp, ln, sqrt, polylog, pg pochhammer, trig, hypergeom, radical, power, "@". Et il existe naturellement d'autres fonctions destinées à mettre en forme une expression comme par exemple : collect, combine, convert, expand, factor, normal ou encore radsimp, pouvant elles-mêmes utiliser d'autres options. À l'inverse, la TI-89 vise à assurer un maximum de facilité à son utilisateur. C'est pourquoi certaines simplifications seront automatiquement effectuées, comme on peut le voir sur les écrans suivants qui reprennent nos deux exemples précédents : Il est bien évident que l'on gagne énormément en simplicité d'utilisation, mais il faut bien voir que l'on perd en revanche toute possibilité de simplification partielle. 3 T © Texas Instruments Introduction au calcul formel 7/46 Les risques de la simplification automatique… Nous avons déjà vu que la notion de forme simplifiée d'une expression est souvent très dépendante du contexte, et de la suite que l'on souhaite donner aux différents calculs. Nous allons aborder ici le problème de la validité de ces simplifications, et des conséquences que cela peut avoir lorsque l'on souhaite par exemple résoudre une équation faisant intervenir des paramètres. Nous savons tous qu'il existe un moyen simple de déterminer le PGCD de deux polynômes, en utilisant l'algorithme d'Euclide, et qu'il est donc facile de simplifier une fraction rationnelle. À partir de là, il est possible de choisir entre deux attitudes très différentes. On peut laisser les fractions rationnelles telles qu'elles ont été saisies, ou au contraire choisir de les simplifier de manière automatique. Il n'existe pas de choix universel en ce domaine. Par exemple, Maple ne fait ces simplifications qu'à la demande, ainsi que le montre la copie d'écran ci-dessous : En revanche, la TI-89 et la TI-92 Plus vont automatiquement réaliser ce type de simplifications : On peut penser que ce deuxième choix va généralement permettre d'obtenir des résultats sous une forme plus utilisable, mais il faut être conscient que cela va également avoir des conséquences dans certains cas. Prenons par exemple le cas de la recherche du numérateur d'une fonction. Avec Maple, on doit utiliser la fonction numer : 3 T © Texas Instruments Introduction au calcul formel 8/46 Que se passe-t-il avec une TI-89 si l'on souhaite effectuer le même calcul ? Pour comprendre ce résultat, on doit savoir que la TI-89 commence toujours par simplifier les fractions rationnelles. Lors de l'évaluation de l'expression getdenum F x 2 − 1I GH x − 1 JK on commence par simplifier le quotient x2 − 1 x −1 ce qui conduit à x +1 , puis on recherche le numérateur de cette expression. Dans cet exemple, il était facile de prévoir cette situation. Il existe par contre des cas où l'on peut obtenir un résultat faux ou incomplet alors que le problème étudié ne faisait pas, a priori, intervenir des fractions rationnelles. Considérons par exemple le système RSmx + y = 1 Tx + my = 1 Il est facile de constater que les deux cas m = 1 et m = −1 devront faire l'objet d'un traitement séparé. Pour les autres valeurs, on obtient facilement (en utilisant une méthode de résolution par combinaisons, ou, ce qui est équivalent, les formules de Cramer) x=y= m −1 2 m −1 = 1 . m +1 Comme on peut le voir dans l'écran ci-dessous, c'est bien cette forme simplifiée qui est obtenue par la TI-89. On risque alors de croire qu'elle est valable pour toutes les valeurs de m autres que −1 , et que 1 l'on obtient en particulier x = y = pour m = 1. 2 L'écran de droite permet de vérifier qu'il n'en est rien : on obtient une infinité de solutions pour m = 1, et aucune solution pour m = −1. Il est indispensable de prendre conscience de ce type de problème lorsque l'on manipule un logiciel de calcul formel. 3 T © Texas Instruments Introduction au calcul formel 9/46 On peut vérifier que l'on obtient exactement le même type de situation avec Maple : On peut également constater qu'aucun avertissement ne vient prévenir un utilisateur de la non validité de certains calculs lors d'une résolution par étapes à partir de l'inverse de la matrice du système : Cette absence de prise en compte des cas particuliers est une caractéristique essentielle des logiciels de calcul formel actuels. 3 T © Texas Instruments Introduction au calcul formel 10/46 Le domaine utilisé pour les calculs Tous les logiciels de calcul formel travaillent a priori dans l'ensemble des nombres complexes, ce qui peut poser quelques problèmes lors de l'utilisation de ces outils avec des élèves de lycée ne connaissant rien à propos de ces nombres. Considérons par exemple une fonction comme af f x = x −1 x−2 Peut-on calculer la valeur de cette fonction au point x = −3 ? La réponse est bien évidemment non, si l'on pense à un calcul dans l'ensemble des nombres réels. Le problème, c'est que la notation x peut avoir également un sens dans l'ensemble des nombres complexes, et désigner le nombre a, nul si x = 0 ou tel que • a= x π π • arg a = α [2π ] avec α ∈ − , et 2α = arg x [2π ] 2 2 pour x ≠ 0 . af OP Q OP Q af On peut tout de suite remarquer qu'avec cette nouvelle fonction, on a bien d x i2 = x mais que l'on n'a pas les mêmes propriétés que la fonction racine carrée classiquement définie dans l'ensemble des nombres positifs. Par exemple, avec x et y complexes quelconques, les égalités x2 = x ou encore xy = x y ne sont plus vérifiées ! C'est d'ailleurs pour cela que certains mathématiciens avaient décidé d'exclure la notation (Par exemple pour éviter des calculs du type −1 = −1 × −1 = −1 −1 = 1 = 1 ??? ). a fa f −1 . Il est de la même façon tout à fait possible de définir le logarithme d'un complexe, ou encore l'arcsinus d'un nombre supérieur à 1… Revenons au calcul de af f x = x −1 x−2 au point x = −3… Si l'on se place dans l'ensemble des nombres complexes, on aura a f f −3 = −4 i 4 2 2 5 = = = . −5 i 5 5 5 Le résultat final, parfaitement réel, ne laisse pas entrevoir la nature complexe des calculs intermédiaires. Ce n'est absolument pas une anomalie, et c'est bien dans cet esprit qu'avaient été introduits les complexes (par exemple pour pouvoir faire certains calculs intermédiaires lors de la résolution d'une équation du troisième degré… tout en recherchant des solutions qui seraient parfaitement réelles). 3 T © Texas Instruments Introduction au calcul formel 11/46 Le problème réside seulement dans le risque de confusion que peut faire l'utilisateur du fait de la similitude de notation entre des fonctions purement réelles, définies sur des intervalles bien particuliers, et ces fonctions de la variable complexe. Cette situation est dans une certaine mesure aggravée sur des calculatrices offrant le choix de mode de fonctionnement réel ou complexe. Il est indispensable de savoir, par exemple dans le cas des TI-89 et TI-92 Plus, que l'on s'interdit seulement d'afficher un résultat final complexe en mode réel lorsque l'on traite un problème réel, mais que cela ne signifie pas que tous les calculs intermédiaires ont été faits dans l'ensemble des réels. En conséquence, on risque d'obtenir des résultats incorrects lors de l'utilisation des fonctions racines carrées, logarithme, ou encore trigonométriques inverses lorsque celles-ci ne sont pas utilisées sur leur ensemble de définition. La représentation graphique obtenue en bas de cette feuille de calcul Maple a de quoi surprendre bien des utilisateurs non avertis. C'est pourtant la conséquence logique des simplifications par le nombre complexe i lorsque x −1 et x − 2 sont tous les deux négatifs. On retrouve naturellement le même type de situation sur une TI-89 ou sur une TI-92 puisque ces calculatrices travaillent également dans le corps des complexes. L'autre problème concerne l'absence d'utilisation, ou au contraire l'utilisation systématique, de certaines règles de calcul spécifiques aux seuls nombres réels, lorsque l'on utilise des fonctions comme la conjugaison, la partie réelle, ou encore la partie imaginaire… a f Que se passe-t-il par exemple si l'on cherche à simplifier une expression comme Re x + i y ? 3 T © Texas Instruments Introduction au calcul formel 12/46 Comme on peut le voir dans la copie d'écran précédente, Maple considère par défaut que les variables qu'il rencontre sont complexes, ce n'est que lorsque l'on indique explicitement que les variables manipulées sont des réels que l'on obtient une simplification de l'expression. Les concepteurs de la TI-89 ont choisi un point de vue différent. Par défaut, toutes les variables symboliques non affectées sont réelles. a f Cela permet d'obtenir la simplification d'expression comme Re x + iy ou encore x + iy . x − iy Lorsque l'on souhaite manipuler une variable symbolique complexe, et éviter l'utilisation de règles de simplification spécifiques aux variables réelles, il faut lui donner un nom se terminant par le caractère _ qui indique au système la nature particulière de cette variable. Il faut enfin savoir que certaines fonctions ne donneront pas la même valeur suivant que l'on est en mode réel ou complexe. Calculons par exemple la racine cubique de -8 avec Maple : Ce résultat a de quoi surprendre un utilisateur non averti. Il est pourtant tout à fait prévisible si l'on sait que Maple travaille dans l'ensemble des complexes. Pour calculer le module du résultat, on prend la racine cubique au sens usuel du module de −8 , c'est à dire de 8, et on obtient r = 2 . Pour calculer l'argument, on utilise la valeur de l'argument du nombre -8 contenue dans l'intervalle −π , π . On divise ensuite cette valeur par 3. On obtient ainsi θ = 3 T © Texas Instruments Introduction au calcul formel π 3 . 13/46 FG F π I + i sinF π I IJ = 2FG 1 + i 3 IJ = 1 + i H H 3 K H 3 KK H 2 2 K On obtient ainsi z = 2 ei π / 3 = 2 cos 3. Sur une TI-89, c'est la méthode qui sera utilisée lorsque l'on est en mode complexe. Par contre, en mode réel, on obtiendra la valeur "habituelle", c'est à dire -2. On retrouve une situation un peu semblable lorsque l'on veut manipuler des variables à valeurs entières. En particulier des expressions comme −1 2 n +1 ou encore cos n π peuvent se simplifier facilement dans le cas où n est un entier. a f a f Dans l'écran ci-dessus, on a explicitement indiqué à Maple que la variable n est entière afin d'obtenir une forme simplifiée des expressions. Cette fonctionnalité n'est pas présente sur la TI-89 pour le cas des variables entières. De plus, si l'on utilise une variable quelconque, le résultat affiché dépend du mode dans lequel on se trouve. Sur l'écran de gauche la machine est en mode complexe, alors que sur l'écran de droite elle est en mode réel. Dans ce mode réel, une tentative de simplification avec passage à la forme complexe provoque une erreur lorsque l'on veut manipuler une expression comme ( −1)2 n +1 + 1 Tout rentre par contre dans l'ordre si on indique à la TI-89 que l'on veut faire un calcul pour une variable entière en utilisant une variable dont le nom est du type @n1, @n2, …, @n255. 3 T © Texas Instruments Introduction au calcul formel 14/46 La comparaison de deux expressions C'est un des problèmes les plus critiques lorsque l'on manipule des logiciels de calcul formel. Dans certains cas, la différence d'aspect entre deux expressions est suffisamment minime pour ne poser aucun problème. Par exemple lorsque l'on calcule z af af sin x 3 cos x 5 dx on obtient : af af af F − sin2 a xf − 1 I cos6 a xf avec une TI-89 GH 8 24 JK 1 1 − sin 2 x cos6 x − cos6 x avec Maple 8 24 • • Un simple coup d'œil permet de s'assurer qu'il s'agit bien de deux formes équivalentes d'un même résultat, mais ce n'est pas toujours aussi simple. Nous allons par exemple rechercher une primitive de la fonction définie par af f x = af af sin x − 1 cos x + 1 avec Maple et la TI-89. Voici pour commencer le résultat obtenu avec Maple : Et celui obtenu avec une TI-92 Plus, placée en mode Complex Format = REAL1 : Cette fois, les deux résultats sont suffisamment éloignés pour dérouter plus d'un étudiant. Si l'on n'a pas en tête l'existence de formules permettant d'exprimer cos x en fonction de tan x / 2 , on risque d'avoir quelques difficultés à trouver un lien entre ces deux expressions. af 1 a f Il n'y aurait pas de valeur absolue en mode complexe. 3 T © Texas Instruments Introduction au calcul formel 15/46 Il faut bien être conscient que ce type de situation va se généraliser avec l'arrivée d'autres calculatrices symboliques… La situation décrite ici se retrouvera donc bientôt dans toutes les classes ! Pour comparer ces deux expressions nous avons ici demandé à Maple de simplifier leur différence. On remarquera qu'il a été nécessaire de préciser que x était un réel afin d'obtenir une simplification de af cos x + 1 tenant compte du fait que pour tout x réel : af cos x + 1 ≥ 0 Un étudiant de lycée, et même du supérieur, a toutes les chances d'ignorer ce type de problème. Même s'il a déjà rencontré l'expression d'un cosinus sous la forme d'une série entière, il lui faudra sans doute prendre un peu de recul pour deviner la cause de l'échec de la première tentative de simplification. Il est en fait probable qu'il se contente de penser que Maple "ne sait pas" que cette quantité est positive, et que la valeur absolue est donc parfaitement inutile… Cet exemple montre bien que la connaissance des particularités de fonctionnement des logiciels de calcul formel est vraiment indispensable si l'on veut pouvoir s'en servir efficacement. Il existe de plus des cas où ce type de comparaison sera beaucoup plus difficile, comme par exemple lors de la résolution d'équations différentielles faisant intervenir des constantes d'intégration, ou même parfois dans la simple expression de racines d'une équation polynomiale faisant intervenir des racines carrées imbriquées. En fait, il n'existe que quelques cas dans lesquels on est absolument assuré de pouvoir vérifier si deux expressions sont identiques ou non. C'est en particulier vrai pour les expressions polynomiales (qu'il suffit de développer) ainsi que pour les polynômes trigonométriques (que l'on pourra linéariser2 totalement). 2 Cette linéarisation s'obtient avec la fonction tcollect sur la TI-89 ou la TI-92 Plus, ou en utilisant la fonction combine avec l'option trig avec Maple. 3 T © Texas Instruments Introduction au calcul formel 16/46 La fiabilité des calculs Il est important de se poser la question de la fiabilité des résultats fournis par des logiciels de calcul formel. Peut-on faire confiance aux résultats obtenus ? Globalement… oui… mais ce qui précède montre clairement qu'il faut effectivement être prudent en la matière. Pour commencer, un bug, c'est à dire une erreur de programmation, est toujours possible compte tenu du niveau de complexité atteint par les logiciels de calcul formel. C'est la raison d'être des "patches" que l'on peut charger sur le site Internet de Maple. Une possibilité de mise à jour est absolument indispensable dans ce domaine. On comprend bien que l'utilisation de la technologie de la mémoire Flash introduite pour la première fois par Texas Instruments à l'occasion de la sortie de la TI-89 soit en train de se généraliser sur les machines concurrentes. Mais comme nous l'avons vu, il y a aussi toutes les erreurs relatives à un usage incorrect. Voici quelques erreurs particulièrement répandues : • Erreur dans la réinitialisation des variables. On place une valeur dans une variable x, puis un peu plus tard au cours de la même session de travail avec Maple, ou même plusieurs jours plus tard avec une calculatrice disposant d'une mémoire permanente comme la TI-89, on effectue un calcul utilisant cette variable symbolique x, par exemple pour tester si une expression est constante en la dérivant… • Erreur de notation dans la saisie des expressions. Ce problème existe déjà avec les calculatrices numériques classiques. L'affichage en "pretty print", c'est à dire sous forme mathématique usuelle, de l'expression saisie est absolument indispensable. Dans le cas des calculatrices symboliques, il faut aussi éviter toute erreur liée à l'utilisation des symboles spéciaux comme e ou i. Les produits implicites, comme par exemple y x +1 peuvent également générer des difficultés. a f • Conflit avec les mesures d'angles. Ce problème ne se rencontre que sur les calculatrices offrant le choix de calculer en degrés ou en radians. Par exemple, les formules de dérivation classiques ne s'appliquent pas à la fonction donnant le sinus d'un angle exprimé en degrés. • Problèmes liés à l'utilisation des nombres complexes dans des calculs intermédiaires. Nous avons déjà vu quelques exemples dans ce document. Un bug spectaculaire : z π /2 0 af sin 2 x dx = −1, présent dans une précédente version de Maple, était sans doute lié à ce problème. • Calculs non valides dans certains cas, sans que cela puisse se voir dans l'expression de la solution. C'est tout le problème des simplifications abusives dont nous avons déjà parlé. • Erreurs liées à la mauvaise interprétation de ce que font certaines fonctions. C'est par exemple le cas si on utilise la fonction variance disponible sur la TI-89 sans savoir que l'on va effectuer une division par n −1, et non par n, lors du calcul de la moyenne des écarts. 3 T © Texas Instruments Introduction au calcul formel 17/46 En bref, il y a effectivement de quoi se montrer prudent lors de l'utilisation de ces outils. Mais il faut rappeler que certains formulaires, donnant la liste des primitives de fonctions "classiques", et que l'on utilisait précédemment, comportaient jusqu'à 10% d'erreurs ! Il serait donc totalement absurde de rejeter les logiciels de calcul formel sous ce prétexte. Cela montre en revanche combien il serait illusoire de penser pouvoir manipuler de tels outils sans disposer des connaissances mathématiques indispensables pour savoir en déjouer les pièges et interpréter correctement les résultats fournis. Les logiciels de calcul formel sont de fantastiques outils. Ils ne remplacent en aucun cas une étude approfondie des Mathématiques ! 3 T © Texas Instruments Introduction au calcul formel 18/46 L'exemple de la résolution des équations Nous allons dans la seconde partie de ce document entrer un peu plus dans le détail du fonctionnement des systèmes de calcul formel. Pour cela, nous allons partir de l'exemple de la résolution des équations polynomiales. af Si l'on veut résoudre à la main une équation du type p x = 0 , la méthode à utiliser dépend étroitement de la nature de p x . af Voyons comment se présente la situation pour un élève de seconde/première : af • On possède une méthode directement utilisable lorsque p x est un polynôme du premier degré. • On sait également résoudre les équations du type a x n = 0 , en se ramenant à a x = 0 . • Si l'on a p x = a x ⋅ b x , on est ramené à la résolution de a x = 0 ou de b x = 0 . • À défaut, on cherche à se ramener à une expression de ce type en factorisant l'expression. C'est l'exercice typique en début de seconde avec des exemples comme p x = x 2 − 2 , af af af af af af af af a af af fa f p x = 4 x + 4 x + 1 , ou encore des expressions comme p x = x − 4 + 3x + 6 x − 3 . 2 2 • Les équations du second degré peuvent être traitées avec une méthode spécifique, mais on évite en général d'utiliser cette méthode pour des équations comme x 2 − 3 x = 0 ou encore x 2 − 4 = 0 . • Dans certains cas, si aucune factorisation n'est possible, on devra au contraire développer l'expression, en espérant que quelques simplifications se produisent au passage, et permettent de se ramener à un type d'équation connu, comme par exemple avec p x = x +1 x + 3 − x + 2 x + 4 . a f a fa f a fa f • Il existe enfin des exercices que l'on ne sait pas encore résoudre à ce niveau comme par exemple une équation du type x 3 + x − 1 = 0 . Plusieurs points importants sont mis en évidence par cet exemple : • En fonction de la nature de l'expression, des stratégies aussi différentes que le développement d'une expression, ou au contraire la recherche de facteurs communs pourront être utilisées. • Le choix de cette stratégie dépend de la nature de l'expression, qu'il faut donc être en mesure d'analyser. • Lors d'un calcul à la main, on utilise parfois certaines astuces destinées à éviter des calculs laborieux. Ce problème est moins critique dans un calcul automatisé, il est plus rapide par exemple d'utiliser systématiquement les formules de résolution d'une équation du second degré que de tester la présence de tel ou tel cas particulier. • Il existe des cas où l'on ne peut pas résoudre le problème posé… et il est indispensable de savoir les détecter aussi rapidement que possible ! 3 T © Texas Instruments Introduction au calcul formel 19/46 La représentation d'une expression a f a fa f p x = x + 1 x + 2 + x + 3 est une somme de trois termes. af Si l'on veut par exemple résoudre l'équation p x = 0 , on aura besoin de développer cette somme. a f a fa fa f En revanche, p x = x + 1 x + 2 x + 3 développer. est un produit, et il faudra au contraire éviter de le La reconnaissance de la nature d'une expression est très importante pour tout outil de calcul formel. Elle est étroitement liée à la représentation utilisée pour décrire cette expression. Dans ce qui précède, nous avons utilisé une écriture classique, qui nous semble facile d'utilisation, que ce soit pour l'écriture ou la lecture d'une expression. Cependant, il faut être conscient que cette écriture nécessite l'utilisation de nombreuses règles pour être correctement interprétée : rôle des parenthèses, règles de priorités algébriques… On peut aussi rencontrer certaines ambiguïtés, en particulier lors de la notation des produits sous forme implicite. x y + 1 désigne-t-il un produit ou le calcul d'une fonction x en un point y + 1 ? a f Il est indispensable de passer à autre type de représentation si l'on souhaite faire manipuler des expressions par un logiciel de calcul formel. L'idée principale repose sur une interprétation fonctionnelle de toute expression mathématique. Par exemple, x +1 est obtenu en appliquant la fonction somme aux arguments x et 1. a f On pourrait noter cette expression sous la forme som x,1 . a f a f De même x ^3 ↔ puiss x,3 , et x y ↔ prod x, y . Les expressions plus complexes sont obtenues en composant différentes fonctions. Par exemple, a x + 1fa x + 2f + x + 3 ↔ somc prodbsoma x,1f, soma x,2fg, x, raca3fh a x + 1fa x + 2fd x + 3 i ↔ prodcsoma x,1f, soma x,2f, somb x, raca3fgh Cette seconde formulation peut sembler plus complexe, et pourtant, elle permet immédiatement de faire la différence entre un produit de trois facteurs et une somme de trois termes : il suffit de regarder la nature de la fonction utilisée en dernier lors de la construction de l'expression. Une variante classique de cette représentation est la syntaxe utilisée en LISP pour coder les expressions mathématiques, avec une petite nuance : une expression du type f a, b, c,… est notée sous la forme f a b c … . a a f f Le premier élément de la liste correspond à la fonction à utiliser, le reste de la liste nous donne la liste des arguments. Pour décrire des expressions plus complexes, il n'y a plus qu'à reprendre le même principe, en imbriquant des listes lorsque les arguments sont eux-mêmes des expressions. Par exemple, l'expression a x + 1fa x + 2f + x + cosa3f sera notée : d+ c* a+ f a+ x 1 x 2 fh x acos 3fi Cette notation, presque illisible pour un être humain, est au contraire très bien adaptée à un traitement informatique. Par exemple, pour savoir quelle est la nature d'une expression (somme, produit…), il suffit de tester le premier élément de la liste. Pour connaître les termes d'une somme, il suffit de prendre les éléments suivants dans la liste décrivant l'expression. 3 T © Texas Instruments Introduction au calcul formel 20/46 Une autre façon de visualiser cette structure consiste à noter les expressions sous la forme d'arbres3 : Cette visualisation est probablement la manière la plus efficace de comprendre la structure d'une expression algébrique. Quel que soit le mode de représentation adopté, il faut retenir le fait que toute expression mathématique s'obtient en appliquant une fonction à une liste d'arguments pouvant être des nombres, des variables symboliques, ou des sous-expressions, elles-mêmes définies en utilisant d'autres fonctions, et que tout logiciel de calcul symbolique est capable d'accéder facilement à ces différents éléments, et donc de déterminer le type de l'expression manipulée. De plus, on sait parfaitement bien représenter ce type de structure dans la mémoire d'un ordinateur. L'idée est que chaque élément est décrit par une liste donnant la nature de l'expression associée ainsi que la liste des arguments. Les "atomes" c'est à dire les éléments de base des expressions comme x, 10 ou π peuvent eux-mêmes être représentés par des descripteurs permettant de connaître leur valeur, leur nom, et éventuellement certaines de leurs propriétés4. La représentation interne d'une expression comme x ⋅ x + y pourrait être quelque chose comme : a f Prod sum name x name y On voit ici deux types de descripteurs : des descripteurs d'expressions (prod, sum) et des descripteurs de variables (name). Les flèches figurant dans le diagramme précédent sont remplacées par des adresses mémoire indiquant l'emplacement du descripteur associé à chaque argument. Les descripteurs associés aux variables x et y comportent ici trois champs. Le premier donne le type de l'objet représenté (ce sont des variables), le second permet de connaître le nom, le troisième permet de préciser la valeur de la variable lorsque celle-ci est affectée. L'absence de pointeur dans cette troisième case des descripteurs des variables x et y correspond au fait que ces variables n'ont pas reçu de valeur. 3 Il est possible de générer automatiquement ce type de représentation avec Maple en utilisant la fonction tree dont l'écriture est décrite dans le livre Premiers pas en Maple, paru aux éditions Vuibert. 4 Il existe différentes façons de représenter une liste en mémoire. Nous n'entrerons pas ici dans le détail de cette représentation. On pourra aussi se reporter au livre Introduction to Maple, André Heck, Springer-Verlag pour avoir plus de précision sur les méthodes utilisées par Maple pour la représentation interne des expressions. 3 T © Texas Instruments Introduction au calcul formel 21/46 La fonction part Si l'on utilise une TI-89 ou une TI-92 Plus, il est possible d'accéder, du moins indirectement, à ces différents éléments en utilisant la fonction part. • Utilisée avec un seul argument, elle donne le nombre de sous-expressions composant l'expression. • Pour avoir accès à la fonction permettant de construire l'expression (celle qui figure en haut de l'arbre…), on utilise part avec un deuxième argument égal à 0. • Pour avoir accès aux sous-expressions utilisées pour former l'expression, on utilise part avec un second argument égal au numéro de la sous-expression. En voici quelques exemples : Comme on peut le voir, cette fonction ne suit pas exactement le modèle précédent lorsqu'elle donne les éléments d'une expression. De manière interne, une somme peut avoir un nombre quelconque de termes, il en est de même pour un produit… a fa fb a fg Dans le dernier calcul, on utilise l'expression sin x x + 3 1 + sin x , qui est le produit des trois facteurs sin x , x + 3 , et 1 + sin x . afa f b a fg On pourrait donc s'attendre à obtenir la valeur 3 lors du calcul de part(sin(x)(x+3)(1+sin(x)). Mais en fait, avec la fonction part, les différents termes ou facteurs seront regroupés de manière à toujours se ramener à une somme de deux termes ou à un produit de deux facteurs. Voici à présent quelques exemples "d'extraction" de l'opérateur utilisé pour construire une expression, et des sous-expressions auxquelles il s'applique : Une fois encore, il faut insister sur le fait que la fonction part ne traduit pas toujours exactement la véritable structure interne des expressions. 3 T © Texas Instruments Introduction au calcul formel 22/46 Nous l'avons déjà signalé pour les sommes de plusieurs termes, ou avec les produits de plusieurs facteurs, mais c'est aussi par exemple le cas avec des expressions comme a + b − c . Une expression de ce type est traitée en interne comme une somme de trois termes : a, b, − c , alors que la fonction y verra la différence entre a + b et c comme le montre l'écran suivant : N.B. Cette particularité de la fonction part a pour avantage de toujours se ramener à des produits de deux facteurs, des sommes de deux termes, … mais elle complique par contre l'écriture de certains programmes où il est souhaitable de pouvoir disposer directement de la liste de tous les facteurs d'un produit ou de tous les termes d'une somme. On doit alors écrire une fonction utilisant des appels récursifs à la fonction part pour construire cette liste. Sur les TI-89 et les TI-92 Plus, on dispose également de la fonction getType qui permet de savoir quelle est la nature du contenu d'une variable. Par exemple, on obtient "NONE" si la variable n'a pas de valeur, "NUM" si c'est une valeur entière, ou un nombre rationnel, "VAR" si c'est le nom d'une autre variable, "EXPR" si c'est une expression faisant intervenir une somme, un produit, ou toute autre fonction. Comme on expression numérique exemple ln peut le voir dans l'écran ci-dessus, cette fonction ne permet pas de distinguer entre une faisant intervenir des variables symboliques, comme sin x + x , et une expression constante nécessitant l'utilisation de fonctions particulières pour son expression. Par 2 ou encore 5 sont de type "EXPR". af af Les spécialistes pourront également remarquer que cette fonction a un caractère un peu particulier. Généralement, lorsque l'on utilise une fonction f avec un argument arg la TI-89 commence par évaluer la valeur de arg, puis transmet la valeur obtenue à la fonction f. af af Dans l'exemple précédent, le calcul de f x serait équivalent à celui de f y , et donc de f d 2i. Ici c'est bien le type de x que l'on a obtenu, et non celui de y. Nous allons à présent voir comment utiliser ces outils pour mettre en évidence certains aspects du fonctionnement des logiciels de calcul formel. 3 T © Texas Instruments Introduction au calcul formel 23/46 Un exemple complet d'utilisation de part : la dérivation Non, n'ayez pas d'inquiétude, la TI-89 est bien capable de calculer une dérivée. Nous allons cependant voir comment lui apprendre à le faire, afin d'avoir un exemple d'utilisation de part un peu plus complet que celui de la recherche d'un ensemble de définition déjà présent dans le manuel. Pour cela, il faut prendre le temps de comprendre comment on procède à la main. • Si l'on a une expression qui ne comporte qu'un seul élément simple, comme x, y ou 10, on regarde si cette expression est ou non égale à la variable par rapport à laquelle on souhaite dériver. Si c'est le cas, la dérivée est égale à 1, sinon la dérivée est égale à 0. • Si l'on a une expression construite en appliquant une fonction à une expression, comme par exemple sin x ou encore ln x 2 + 1 , on doit appliquer la formule de dérivation d'une expression af e j du type f bua x fg qui est f ′bua x fg ⋅ u ′a x f . af Le calcul de f ′ sera fait par simple lecture dans la table des dérivées usuelles, le calcul de u′ x sera fait en appliquant la méthode de dérivation que nous sommes en train de décrire à u x . af • Si l'on a une somme ou une différence (ces deux notions sont distinctes pour la fonction part, contrairement à ce qui se passe en interne) alors on peut appliquer la formule de dérivation d'une somme ou d'une différence. Le calcul de la dérivée de chaque terme se fait en appliquant la méthode que nous sommes en train de décrire. • Si l'on a un produit, on dispose de la formule uv ′ = u ′v + uv ′ . (Le cas du produit par une constante est un cas particulier du précédent. Dans la mesure où nous ne cherchons pas à écrire une programme destiné à afficher les étapes pas à pas et travaillant de la même façon qu'un étudiant, il n'est pas utile de le traiter.) • Si l'on a un quotient on dispose de la formule a f F u I ′ = u′v −2uv′ . H vK v (Le cas d'un inverse, c'est à dire le cas où le numérateur est égal à 1, est un cas particulier. Pour la même raison que dans le cas du produit par une constante, il est inutile de le traiter.) • Si l'on a une puissance, la méthode à utiliser dépend du type de l'exposant et du type de la base. Dans un calcul manuel, on distinguerait les cas : f x = u x α , avec f ′ x = α u′ x u x α −1 . af af af afaf x f a x f = e , avec f ′a x f = e x , et plus généralement f a x f = a x = e x lna a f avec f ′a x f = lnaaf a x a f b a fg , avec f ′a x f = FG u′a x f ⋅ va x f + lnbua x fg ⋅ v′a x fIJ ua x fva x f f a x f = ua x f a f = e H ua x f K v x v x ln u x Cette dernière formule n'est sans doute pas connue des élèves. Nous pouvons par contre parfaitement décider de l'utiliser systématiquement afin d'éviter des tests sur la nature de l'exposant et de la base. Elle se simplifiera lorsque l'un ou l'autre sera constant. • Faut-il prévoir d'autres cas ? Nous pouvons pour l'instant décider de ne pas les traiter, quitte à revenir sur ce problème si cela est vraiment nécessaire. Dans cette rubrique pourrait par exemple figurer le cas d'une expression faisant intervenir une af intégrale, comme f x = 3 T © Texas Instruments z 1 −t 2 e dt . x Introduction au calcul formel 24/46 Il existe des techniques de programmation (programmation orientée objet) qui permettent une prise en compte automatique de nouvelles méthodes, sans avoir besoin de modifier la fonction principale. Il n'est cependant pas possible de développer ce type de méthodes dans le cadre de ce document, nous allons donc travailler en nous limitant à l'utilisation de techniques tout à fait classiques de programmation, et dans le cas présent notre énumération va se traduire par une simple instruction If … EndIf assortie de plusieurs cas. La programmation de notre fonction ne sera cependant pas totalement naïve. Comme le montre l'énumération précédente, la dérivation d'une expression fait intervenir le résultat obtenu en dérivant une ou plusieurs sous-expressions de cette expression. Notre fonction de dérivation va donc être récursive et s'appeler elle-même. Naturellement ce processus s'arrête de lui-même lorsque l'on arrive à une sous-expression suffisamment simple, c'est à dire à une variable ou à une constante (cf. premier cas.). Pour alléger un peu l'écriture de nos différentes fonctions, nous allons supposer que la fonction que nous souhaitons dériver est une fonction de x. Nous allons à présent pouvoir écrire la fonction de dérivation : der(ex) Func Local ex1,ex2,op,fonc If part(ex)=0 Then when(ex=x,1,0,0) ElseIf part(ex)=1 Then part(ex,0)→fonc part(ex,1)→ex1 derfonc(fonc,ex1) ElseIf part(ex)=2 Then part(ex,0)→op part(ex,1)→ex1 part(ex,2)→ex2 If op="+" Then dersum(ex1,ex2) ElseIf op="-" Then derdif(ex1,ex2) ElseIf op="*" Then derprod(ex1,ex2) ElseIf op="/" Then derquot(ex1,ex2) ElseIf op="^" Then derpuiss(ex1,ex2) Else d(ex,x) EndIf EndFunc Comme on peut le voir, cette fonction fait appel à d'autres fonctions : derfonc, dersum, derdif, derprod, derquot, derpuiss qui seront chargées de traiter les cas des expressions du type f u x , les sommes, différences, produits, quotients et puissances d'expressions. Ces fonctions n'existent pas encore. Nous les définirons ultérieurement. b a fg 3 T © Texas Instruments Introduction au calcul formel 25/46 Voici ce que donnent quelques essais de notre fonction, dans l'état actuel d'avancement du projet : On peut facilement voir que la fonction der effectue bien le tri en fonction des différents cas, et qu'elle appelle la fonction de dérivation adaptée à chaque situation, en transmettant les arguments dont on a besoin pour poursuivre les calculs. Naturellement, le calcul s'arrête aussitôt puisque les différentes fonctions n'ont pas encore été définies. Définissons par exemple les fonctions dersum et derprod : dersum(ex1,ex2) Func der(ex1)+der(ex2) EndFunc derprod(ex1,ex2) Func der(ex1)*ex2+ex1*der(ex2) EndFunc Nous pouvons à présent faire quelques essais supplémentaires : Nous allons maintenant aller un peu plus loin en définissant la fonction derfonc qui est chargée de dériver les expressions du type f u x . La bonne méthode consiste à gérer une table dans laquelle sont placés les noms de fonctions et la formule à utiliser pour les dériver. b a fg Pour éviter de trop entrer dans des détails techniques, nous allons nous contenter d'utiliser une fonction qui sera capable de dériver les fonctions trigonométriques et logarithmes. C'est essentiellement cette partie qu'il faudrait développer pour obtenir un noyau de dérivation vraiment performant. af Pour écrire cette fonction, il faut également savoir qu'une expression comme − cos x est vue par la TI-89 comme le résultat obtenu en appliquant la fonction "opposé" à l'expression cos x . Dans la pratique, la valeur retournée par part(ex,0) sera alors égale à "⁻". af Cela correspond au premier cas étudié dans le texte de la fonction : If op="⁻" Then... Les cas suivants correspondent à l'utilisation des fonctions cosinus, sinus, tangente et logarithme népérien. Il est en revanche inutile de prévoir le cas de la fonction exponentielle car celui-ci est traité par la fonction chargée de dériver les puissances. 3 T © Texas Instruments Introduction au calcul formel 26/46 derfonc(op,arg) Func Local a der(arg)→a If op="⁻" Then ⁻a ElseIf op="cos" Then ⁻a*sin(arg) ElseIf op="sin" Then a*cos(arg) ElseIf op="tan" Then a*(1+(tan(arg))^2) ElseIf op="ln" Then a/arg EndIf EndFunc Quelques nouveaux essais permettent de se rendre compte des progrès réalisés par notre système de dérivation avec l'ajout des dernières fonctions : Il ne reste plus qu'à écrire les dernières fonctions permettant de dériver une différence, un quotient ou une puissance pour aller encore plus loin. derdif(ex1,ex2) Func der(ex1)-der(ex2) EndFunc derquot(ex1,ex2) Func (der(ex1)*ex2-ex1*der(ex2))/ex2^2 EndFunc derpuiss(ex1,ex2) Func (der(ex1)*ex2/ex1+ln(ex1)*der(ex2))*ex1^ex2 EndFunc À présent, notre module de dérivation permet d'effectuer des calculs qui commencent à devenir un peu compliqués : 3 T © Texas Instruments Introduction au calcul formel 27/46 Un peu trop compliqués même… et ici il n'est pas inutile de demander une factorisation pour y voir un peu plus clair ! Naturellement, cet appel à la fonction factor pourrait très bien être intégré dans la fonction de calcul de la dérivée. C'est d'ailleurs le cas avec la fonction de dérivation intégrée dans la TI-89. À ce propos, on peut remarquer que dans l'état actuel, très peu de simplifications sont effectuées sur les résultats obtenus. af af af Voici par exemple ce que l'on obtient si l'on dérive f x = cos x sin x : D'où vient ce résultat ? Pour dériver cette expression, la fonction der a commencé par déterminer à l'aide de la fonction part qu'il s'agissait d'un produit, puis les deux arguments ont été extraits, toujours en utilisant la fonction part, et on a appliqué la fonction derprod à ces deux arguments. Cette fonction a alors effectué le calcul de der(sin(x)) . cos(x)+sin(x) . der(cos(x)). On peut refaire à la main les principales étapes de ce calcul : On obtient le même type de résultat, également non simplifié, dans l'écran de calcul. Pour obtenir une expression plus simple, il suffit de provoquer une simplification supplémentaire, comme par exemple en mémorisant le résultat dans une variable, ou encore en lui appliquant tout simplement une fonction définie par Id x = x . On peut le vérifier sur l'écran suivant : af 3 T © Texas Instruments Introduction au calcul formel 28/46 Tout cela peut sembler un peu mystérieux… • Avec la première méthode, c'est l'utilisation de la variable a qui provoque une évaluation/simplification de son contenu. Cette variable contient en fait l'expression non simplifiée. On peut le vérifier en utilisant la touche F6:Contents dans le menu VAR-LINK, qui permet de visualiser le contenu d'une variable, tel qu'il est sans aucune modification. Voici ce que l'on obtient : • Dans le second cas, lors de l'utilisation de la fonction Id, l'argument qui est égal à la valeur (non simplifiée) de l'expression va être évalué et simplifié avant d'être transmis à cette fonction. C'est donc lors de l'appel de cette fonction que la simplification a lieu. Ensuite, la fonction se contente de renvoyer la valeur telle qu'elle l'a reçue. Tout cela permet d'entrevoir la complexité des mécanismes d'évaluation et de simplification mis en jeu dans les logiciels de calculs symboliques. Le choix de la façon dont ces règles seront utilisées est spécifique à chaque système de calcul formel. Dans le cas de la TI-89 / TI-92, une simplification importante est effectuée dès que l'on utilise une expression, comme par exemple lors de l'appel d'une fonction. La majorité des utilisateurs peuvent éventuellement ne pas être au courant de ce type de détail. Par contre, cela peut prendre une importance capitale si l'on cherche à programmer du calcul formel. Par exemple, pour comprendre les résultats fournis par la fonction part dans l'écran ci-dessous (et donc ne pas faire d'erreur lors de son utilisation), il est indispensable de savoir qu'une simplification a lieu lors de l'appel de cette fonction. Dans le premier cas, on est resté avec la même expression, car celle-ci n'a pas pu être simplifiée par la calculatrice. C'est donc bien une somme de deux termes qui a été analysée par part. Par contre, dans les deux cas suivants, la simplification préalable a conduit à l'analyse d'expressions constantes. Tout se passe comme si l'on avait en fait calculé part(1) et part(0). C'est un choix des concepteurs du logiciel présent sur cette calculatrice, mais il n'y a pas de règle uniforme en la matière. Par exemple, avec Maple on dispose de la fonction op pour récupérer la liste des sous-expressions. Lors d'un appel de la forme op(3^2+2*3+1-(3+1)^2), l'expression qui ne fait intervenir que des entiers sera automatiquement simplifiée, mais ce ne sera pas le cas avec op(x^2+2*x+1-(x+1)^2). 3 T © Texas Instruments Introduction au calcul formel 29/46 Disposer d'un bon outil ne dispense pas de réfléchir ! Un des principaux problèmes que l'on rencontre lors de l'utilisation de systèmes de calcul formel par des étudiants néophytes dans ce domaine est l'absence, parfois totale, de réflexion avant de se lancer dans des calculs pourtant voués à l'échec. Il suffit pourtant d'exemples très simples pour voir comment un minimum de travail préalable peut parfois considérablement changer la nature des calculs à accomplir. Considérons par exemple la suite définie par R|Su0 = 1 |Tun = un2−1 + 2un−1 On dispose sur la TI-89 et la TI-92 Plus d'une manière particulièrement simple de programmer une suite de ce type. Il suffit d'utiliser une instruction du type when(n=0,1, u(n-1)^2+2* u(n-1) → u(n) pour définir la fonction u permettant de calculer les termes par récurrence. Voyons ce que l'on obtient dans l'écran ci-dessous : Apparemment, ça marche… Cependant, le calcul de u10 a nécessité près de 55 secondes… Si vous avez déjà fait de la programmation récursive, vous connaissez sans doute l'origine du problème… mais adoptons ici le point de vue d'un utilisateur débutant dans ce domaine. Une première "explication" serait de penser que la calculatrice a tout simplement eu du mal à effectuer tous les calculs exacts sur les grands entiers intervenant ici. Ce n'est pas totalement faux, et on peut en effet se demander s'il est bien judicieux d'effectuer un calcul exact dans ce cas précis. Mais ce n'est pas la seule raison du problème, loin de là. Pour s'en convaincre, il suffit de choisir la valeur u0 = 0 , qui conduit à un = 0 pour toutes les valeurs de n. Cette fois les calculs ne devraient pas présenter de difficultés… Il a encore fallu environ 50 secondes pour obtenir ce dernier résultat, le calcul du terme suivant u11 nécessite près d'une 1'40"… Et pourtant, on ne fait que manipuler des nombres qui sont tous égaux à 0… 3 T © Texas Instruments Introduction au calcul formel 30/46 Il faut donc chercher une autre explication, qui va s'appuyer sur le nombre de fois où la fonction u va devoir être utilisée lors de notre calcul de un . Le nombre an d'appels nécessaires à la fonction u pour calculer un est de • 1 pour calculer u0 • 3 pour calculer u1 = u02 + 2u0 : on doit calculer u 1 – appel n°1 –, ce qui va automatiquement lancer le calcul de u 0 – appel n°2 – que l'on va élever au carré, suivi d'un nouveau calcul de u 0 – appel n°3 – qui sera multiplié par 2. af af af De même, pour les valeurs supérieures, le calcul de un+1 va utiliser deux calculs de un , et le nombre d'appels an vérifie donc: an = 1 + 2 an −1 . (On trouve ici l'explication du doublement du temps de calcul nécessaire lorsque l'on passe de u10 à u11 ). Pour calculer an , il suffit de remarquer que la suite wn = an + 1 est géométrique, de premier terme w0 = 1 + 1 = 2 , et de raison 2. On en déduit wn = 2 n ⋅ 2 = 2 n +1 et donc an = 2 n +1 − 1 En fait, une simple transformation de la formule de récurrence permet ici de faire disparaître totalement ce problème. Il suffit par exemple d'utiliser une mise sous forme canonique : R|u0 = 1 S|un = b1 + un−1g2 − 1 T Ce qui peut se traduire par when(n=0,1, (1+u(n-1))-1) →u(n) Le calcul est alors beaucoup plus rapide, et seule l'opération d'affichage du résultat nécessite un peu de temps. Cela s'explique facilement. Le nombre d'appels nécessaires vérifie à présent la relation de récurrence RSa0 = 1 Tan = an−1 + 1 Et on a donc an = n + 1 . Une autre solution aurait consisté à utiliser une fonction intermédiaire pour définir le calcul à effectuer par récurrence, comme on le fait dans l'écran ci-dessous : En effet, ici aussi, on ne fait appel qu'une seule fois au calcul de un−1 dans le calcul de un . Le résultat est ensuite passé en argument à la fonction f, qui se charge d'effectuer le calcul nécessaire à partir de la valeur transmise. Le nombre d'appels de la fonction u est donc ici aussi égal à an = n + 1 . Attention cependant, cela ne suffira pas à résoudre les éventuels problèmes liés à la taille des nombres manipulés. On a ici u10 ≈ 1,80 × 10308 et u11 ≈ 3,23 × 10616 . Le calcul de u12 provoquera immanquablement un dépassement des capacités de la calculatrice… 3 T © Texas Instruments Introduction au calcul formel 31/46 Le calcul formel pas à pas Les logiciels de calcul formel que nous connaissons sont plutôt des boîtes noires (même s'il est parfois possible de soulever un peu le couvercle, comme nous allons le faire avec Maple). Ils fournissent des résultats, mais ne permettent généralement pas à un étudiant de savoir comment ils ont été obtenus. Maple propose cependant un moyen de suivre un peu certains calculs moyennant l'utilisation d'une option particulière5. Voici par exemple les commentaires générés lors du calcul d'une primitive de la fonction af f x = af af af af cos x + sin x . sin x − cos x {--> enter int, args = (sin(x)+cos(x))/(sin(x)-cos(x)), x int/indef: int/indef2: first-stage indefinite integration second-stage indefinite integration {--> enter diff, args = _X, _X <-- exit diff (now in int/indef2) = 1} {--> enter diff, args = sin(_X)-cos(_X), _X <-- exit diff (now in int/indef2) = sin(_X)+cos(_X)} int/indef2: int/indef: applying derivative-divides first-stage indefinite integration <-- exit int (now at top level) = ln(sin(x)-cos(x))} Sans entrer dans les détails, il est assez facile de voir que Maple a utilisé une méthode proche de celle d'un élève, avec en particulier un calcul de la dérivée du dénominateur, permettant une conclusion rapide. Passons à présent à un deuxième exemple, à peine différent. af On veut cette fois calculer une primitive de f x = af af af af cos x − sin x . sin x + cos x En dérivant le dénominateur, on obtient l'opposé du numérateur, et un calcul "à la main" conduit rapidement à − ln cos x − sin x . c af a fh On peut d'ailleurs le vérifier sans difficulté sur une TI-89 : Avec Maple, on obtient F F 1 xI 2 − 1 + 2 tanF 1 xI I + lnF1 + tanF 1 xI 2 I GH H 2 K H 2 K JK GH H 2 K JK − ln tan Comment en est-on arrivé là ? 5 infolevel[int]:=5, complété par les commandes debug(int) et debug(der). 3 T © Texas Instruments Introduction au calcul formel 32/46 Ici aussi on peut demander l'affichage des étapes : {--> enter int, args = (cos(x)+sin(x))/(cos(x)-sin(x)), x int/indef: int/indef2: first-stage indefinite integration second-stage indefinite integration {--> enter diff, args = _X, _X <-- exit diff (now in int/indef2) = 1} {--> enter diff, args = cos(_X)-sin(_X), _X {--> enter diff, args = _X, _X <-- exit diff (now in diff/cos) = 1} {--> enter diff, args = _X, _X <-- exit diff (now in diff/sin) = 1} <-- exit diff (now in int/indef2) = -sin(_X)-cos(_X)} {--> enter diff, args = cos(_X), _X <-- exit diff (now in int/indef2) = -sin(_X)} {--> enter diff, args = sin(_X), _X <-- exit diff (now in int/indef2) = cos(_X)} int/trigon: int/ratpoly: case of integrand containing trigs rational function integration {--> enter diff, args = _X2-1+2*_X, _X <-- exit diff (now in int/ratpoly/ratpoly) = 2*_X+2} {--> enter diff, args = 1+_X2, _X <-- exit diff (now in int/ratpoly/ratpoly) = 2*_X} <-- exit int (now at top level) = -ln(tan(1/2*x)2-1+2*tan(1/2*x))+ln(1+tan(1/2*x)2)} Comme on peut le voir, ou plus exactement le deviner, Maple a bien effectué le calcul de la dérivée du dénominateur, mais il n'a pas fait de rapprochement avec le numérateur. On est donc entré dans la méthode d'intégration des fonctions trigonométriques avec un changement de variable classique, suivi d'un appel à la méthode d'intégration rationnelle. Les expressions _X2-1+2*_X et 1+_X2 correspondent au dénominateur des fractions rationnelles résultant de la décomposition en éléments simples de la fraction obtenue lors du changement de variable t = tan x 2 . a f Il est d'ailleurs possible de suivre ce calcul en surveillant6 les appels à la fonction convert qui se charge de cette décomposition lorsque l'on utilise la syntaxe convert(expression, parfrac, variable). C'est cet appel qui figure sur la ligne placée en gras ci-dessous. {--> enter int, args = (cos(x)+sin(x))/(cos(x)-sin(x)), x […] int/trigon: int/ratpoly: case of integrand containing trigs rational function integration {--> enter convert, args = (_X2-1-2*_X)/(_X2-1+2*_X)/(1+_X2), parfrac, _X […] Comme nous l'avons vu, l'affichage de ces étapes est possible, mais n'est pas immédiat. De plus il n'est pas particulièrement lisible. Imaginons à présent que les auteurs de Maple aient ajouté quelques lignes de code permettant d'afficher plus clairement ces différentes étapes. Peut-on dire que cela constituerait une aide pédagogique efficace pour l'utilisateur ? 6 Avec la commande debug(convert). 3 T © Texas Instruments Introduction au calcul formel 33/46 Dans le cas précèdent, la méthode utilisée reste compréhensible, même s'il est clair qu'elle ne serait pas judicieuse dans le cas d'un calcul à la main. La situation est parfois beaucoup plus complexe. Par exemple, le calcul de z +∞ af ln x dx 0 1 + x2 est un exercice relativement classique en prépa. Après avoir justifié la convergence, le changement de variable t = 1 x permet de montrer que z 1 a f dx = − z +∞ lna xf dx , ln x 0 1 + x2 1 1 + x2 ce qui montre que l'intégrale est nulle. Voyons quelles sont les principales étapes de Maple pour parvenir à ce résultat : {--> enter int, args = ln(x)/(1+x2), x = 0 .. infinity {--> enter diff, args = Beta(z,w), z {--> enter diff, args = z, z <-- exit diff (now in diff/Beta) = 1} {--> enter diff, args = w, z <-- exit diff (now in diff/Beta) = 0} {--> enter diff, args = z+w, z <-- exit diff (now in diff/Beta) = 1} <-- exit diff (now in int/cook/ngritty) = (Psi(z)-Psi(z+w))*Beta(z,w)} {--> enter diff, args = Beta(z,w), w {--> enter diff, args = z, w <-- exit diff (now in diff/Beta) = 0} {--> enter diff, args = w, w <-- exit diff (now in diff/Beta) = 1} {--> enter diff, args = z+w, w <-- exit diff (now in diff/Beta) = 1} <-- exit diff (now in int/cook/ngritty) = (Psi(w)-Psi(z+w))*Beta(z,w)} <-- exit int (now in g) = 0} Les méthodes utilisées ici ne sont sans doute connues que par quelques spécialistes7… Encore une fois, il est bien normal que Maple n'ait pas cherché à "voir" s'il y avait une méthode rapide pour parvenir au résultat. Il s'est contenté d'appliquer des algorithmes permettant d'arriver au résultat, quitte à faire certains calculs inutiles. Cette démarche est tout à fait logique de la part d'un système de calcul formel. Par contre, il est clair que présenter les étapes d'un tel calcul serait parfaitement inutile. Concrètement, cela signifie qu'il sera le plus souvent nécessaire de réécrire totalement la partie du logiciel de calcul formel correspondant à une notion étudiée par un étudiant si l'on souhaite présenter du calcul pas à pas. C'est en fait le seul moyen de s'assurer que le logiciel n'utilisera que des notions effectivement connues par les étudiants. 7 Elles n'ont d'ailleurs pas été intégrées dans le logiciel de calcul formel de la TI-89, qui bascule ici en mode de calcul approché pour obtenir une valeur effectivement très proche de 0. 3 T © Texas Instruments Introduction au calcul formel 34/46 De plus, même dans des cas relativement simples, il est souvent possible de choisir entre plusieurs méthodes. Comment résoudre, au niveau du lycée, une équation du type x 3 + x 2 + x + 1 = 0 ? • En remarquant que x = −1 est racine évidente. • Ou en remarquant directement que x 3 + x 2 = x 2 x + 1 , et qu'il est donc facile de factoriser cette a fe j a f équation sous la forme x + 1 x + 1 = 0 . 2 Comment allez-vous poursuivre la résolution ? • En déclenchant la méthode "second degré", et donc en calculant un discriminant… • Ou en remarquant plus simplement que x 2 + 1 est visiblement strictement positif (sous réserve d'une résolution dans l'ensemble des réels). Pour en rester à un niveau très élémentaire, comment effectuer la résolution de l'équation x 2 = 4 ? • Est-il nécessaire de regrouper les termes dans le premier membre, de reconnaître une identité remarquable, de factoriser, puis d'indiquer qu'un produit est nul si et seulement si un produit de facteurs est nul… • Peut-on passer directement à l'énoncé de la solution x = 2 ou x = −2 ? Dans chacun de ces cas, la réponse dépend du niveau de l'élève, pas seulement de la classe où il se trouve, mais du travail qui y a déjà été effectué depuis le début de l'année scolaire… Autant de contraintes à prendre en compte si l'on veut véritablement créer un logiciel permettant d'effectuer du calcul formel pas à pas présentant des qualités pédagogiques. On en est encore assez loin aujourd'hui8. Il est par contre possible de créer de tels outils, adaptés à un certain niveau d'enseignement, et à une partie bien précise du programme, tout en sachant que dans telle ou telle situation particulière la solution proposée ne sera pas la plus simple9. On peut par exemple parfaitement créer un logiciel permettant d'aider un élève de première à résoudre une équation rationnelle avec les outils dont il dispose à ce niveau (factorisation, second degré, recherche de solution évidente,…). Il sera même possible de disposer de ce type de logiciel sur une "simple" calculatrice. Les TI-89 et TI-92 Plus, par exemple, offre une puissance de calcul parfaitement suffisante pour cela. Voici par exemple les principales étapes d'un calcul pas à pas de la dérivée d'une fonction sur l'écran d'une TI-92 Plus. 8 Prétendre par exemple qu'une calculatrice comporte un mode pas à pas susceptible d'apporter une aide pédagogique, sans préciser si cet outil s'adresse à un élève de seconde ou de classes préparatoires, relèverait un peu de la publicité mensongère. 9 Des logiciels de ce type ont déjà été réalisés, il y a une dizaine d'années, pour des micro-ordinateurs dont la puissance de calcul était bien inférieure à celle dont on dispose sur une TI-89. Par exemple, le logiciel Intégrale permettait à un élève de s'engager dans au calcul pas à pas, contrôlé et assisté au besoin par l'ordinateur, de toute primitive dont la recherche relevait des méthodes enseignées dans le cadre du programme d'une classe de terminale scientifique. Ce logiciel nécessitait seulement 128 ko de mémoire vive pour fonctionner correctement, et tournait sur un micro-processeur cadencé à une vitesse inférieure de celle du 68000 qui équipe la TI-89. L'interface plutôt rudimentaire de ce logiciel pourrait largement être améliorée aujourd'hui. On peut à ce sujet s'étonner que la grande majorité des logiciels commerciaux grand public, destinés au soutien à domicile en mathématiques, en soient restés ces dernières années au stade du QCM plus ou moins amélioré, même si ce mode de fonctionnement est caché sous une interface graphique particulièrement attractive… Une évolution importante est plus que probable dans ce domaine. 3 T © Texas Instruments Introduction au calcul formel 35/46 On peut vérifier sur le dernier écran que le résultat obtenu est bien identique au résultat que l'on obtient en utilisant directement la fonction de dérivation de la TI-92 Plus. Il ne s'agit naturellement que d'un exemple de programme pas à pas, qu'il serait facile d'améliorer pour tenir compte de tel ou tel besoin. Le groupe de programmes correspondant à l'exemple ci-dessus est en particulier disponible sur le site Internet : http://perso.wanadoo.fr/info.calc/ Il utilise des techniques comparables à celles décrites dans la section présentant l'écriture d'un noyau de dérivation formelle. 3 T © Texas Instruments Introduction au calcul formel 36/46 La résolution des systèmes d'équations. Bases de Gröbner L'utilisation systématique d'algorithmes généraux risque parfois, même dans le cas où une solution "astucieuse" était à la portée d'un étudiant, de conduire un système de calcul formel à des calculs inextricables, pouvant parfois provoquer une saturation de la mémoire et donc un échec de la résolution. À moins que ce ne soit le temps nécessaire pour ces différents calculs qui conduise l'utilisateur à perdre patience et à provoquer l'interruption des calculs en cours ! Un bon exemple de cette situation est l'utilisation de la méthode des Bases de Gröbner pour la résolution d'un système d'équations polynomiales. Nous allons tenter de décrire ici les grandes idées de cette méthode, ce qui nous permettra aussi d'en comprendre certaines limites. Il faut pour cela rappeler quelques notions très élémentaires sur la notion d'idéal engendré par une famille de polynômes à plusieurs variables. Par définition, l'idéal engendré par une famille de polynômes P1, P2 ,…, Pk de X1, X2 ,… Xn est l'ensemble des polynômes de la forme P = A1P1 + A2 P2 + + Ak Pk avec ∀i ∈1, k Ai ∈ X1, X2 ,… Xn Nous allons à présent voir comment cette notion intervient dans le cadre de la résolution des systèmes d'équations. Prenons par exemple le cas de deux polynômes A1 et A2 de K [ X , Y ]. Ces deux polynômes engendrent un idéal I formé par l'ensemble des polynômes de la forme P = A1. P1 + A2 . P2 avec P1 ∈ K [ X , Y ] et P2 ∈ K [ X , Y ] . a f a f a f a f a f a f a f On peut voir en particulier que si x et y sont des valeurs telles que A1 x, y = 0 et A2 x, y = 0 , alors pour tout polynôme P de cet idéal I, on aura P x, y = A1 x, y ⋅ P1 x, y + A2 x, y ⋅ P2 x, y = 0 . Il existe naturellement d'autres familles de polynômes de deux variables engendrant le même idéal. Supposons par exemple que celui-ci soit également engendré par deux polynômes B1 et B2 de K [ X , Y ]. D'après ce qui précède, puisque B1 et B2 sont dans I, on a déjà |RS A1a x, yf = 0 ⇒ |RSB1a x, yf = 0 T| A2 a x, yf = 0 T|B2 a x, yf = 0 Réciproquement, puisque A1 et A2 sont dans I, qui est aussi engendré par B1 et B2 , on a l'implication réciproque : |RS A1a x, yf = 0 ⇒ |RSB1a x, yf = 0 |T A2 a x, yf = 0 |TB2 a x, yf = 0 Il est donc équivalent de résoudre le système initial, ou tout autre système associé à un ensemble de générateurs de l'idéal. Avant d'aller plus loin, il peut être intéressant de voir ce que cela donne dans le cas d'un système défini par deux polynômes d'une même variable. L'idéal engendré par A et B est l'ensemble des polynômes de la forme AU + BV , avec U et V polynômes quelconques. Nous savons que cet idéal est également engendré par D, le polynôme unitaire plus grand diviseur commun de A et B. Le fait que D soit dans l'idéal est lié à l'existence d'une relation de Bezout du type AU1 + BV1 = D , le fait qu'il soit générateur est immédiat : A et B étant des multiples de D, tout élément du type AU + BV est également multiple de D. Ce qui précède se traduit alors simplement par RSA( x) = 0 ⇔ D( x) = 0 TB( x) = 0 Ce qui n'est pas vraiment une surprise ! En particulier, si A et B sont premiers entre eux, D = 1 et le système n'a pas de solution. 3 T © Texas Instruments Introduction au calcul formel 37/46 Certaines familles de générateurs sont particulièrement intéressantes et sont appelées Bases de Gröbner (nous verrons plus loin comment les construire, ainsi que la définition exacte de cette notion). Un des intérêts majeurs10 de ces bases réside dans le fait qu'un système d'équations admet un nombre fini de solutions si et seulement si la base de Gröbner associée contient un polynôme s'exprimant en fonction d'une variable seulement. Il suffit alors d'utiliser ce polynôme pour calculer les valeurs possibles de cette variable. De plus, on peut toujours ensuite calculer de proche en proche les autres variables en utilisant les relations définies par les autres polynômes de cette base. Considérons par exemple le système R|x 2 + y2 − 1 = 0 |Sx 2 − y2 − z = 0 ||x + y − z2 = 0 T af af af on peut montrer que l'idéal engendré par A x = x 2 + y2 − 1, B x = x 2 − y2 − z et C x = x + y − z 2 est également engendré par la base de Gröbner suivante : a f Qa x, y, z f = −4 x 4 + 4 x 2 + x + y − 1 Ra x, y, z f = 8 x 8 − 16 x 6 − 4 x 5 + 12 x 4 + 4 x 3 − 3 x 2 − x P x, y, z = −2 x 2 + z + 1 Le dernier polynôme s'exprime en fonction de x seulement. L'utilisation d'algorithmes classiques sur la factorisation des polynômes à coefficients entiers montre que a f a fe je j R x, y, z = x x − 1 2 x 2 − 1 4 x 4 + 4 x 3 − 2 x 2 − 4 x − 1 . Ce qui permet de déterminer les valeurs de x. a f a f La résolution de Q x, y, z = 0 donne ensuite immédiatement y, puis celle de P x, y, z = 0 permet de déterminer les valeurs de z. Nous allons présenter ici un aperçu de l'algorithme de construction de ces Bases de Gröbner, ce qui nous permettra de mieux comprendre certaines particularités de cette méthode. Nous devons pour cela définir quelques notions : ordre sur les monômes, monôme principal d'un polynôme, réduction d'un polynôme par rapport à une famille de polynômes, et enfin s-polynômes. Il ne faut pas se laisser impressionner par certains de ces termes. On peut dans une certaine mesure considérer qu'il ne s'agit que d'une généralisation des méthodes appliquées lors d'une division euclidienne, ou encore lors d'une réduction de Gauss d'un système linéaire. Le premier problème est celui de l'ordre dans lequel on va classer les différents monômes d'un polynôme. Une méthode classique consiste à choisir un ordre sur les variables, puis à l'étendre aux différents termes en utilisant un ordre lexicographique. Par exemple, l'ordre induit par Y X est : Y 3 > Y 2 X > Y 2 > YX 7 > YX > X Par contre, avec X Y , on aura X 7Y > XY 2 > XY > X > Y 3 > Y 2 10 Nous parlons ici de la résolution des systèmes d'équations, mais il faut savoir que ces Bases de Gröbner sont également très utilisées lorsque l'on cherche à simplifier une expression en tenant compte des relations existant entre les différentes variables, ou sous-expressions, qui la composent. On pourra par exemple simplifier une expression trigonométrique en utilisant le fait que sin 2 ( x ) + cos 2 ( x ) = 1 , ou encore simplifier un polynôme symétrique en utilisant les polynômes symétriques élémentaires. 3 T © Texas Instruments Introduction au calcul formel 38/46 On peut alors définir le monôme principal d'un polynôme comme étant celui qui est maximal pour cet ordre. Par exemple, si on prend af P X = X 7Y + XY 2 + X + Y 3 + Y 2 le monôme principal associé au choix de l'ordre induit par Y choisit X Y . X est Y 3 , alors que c'est X 7Y si on Nous pouvons maintenant définir la notion de réduction d'un polynôme P par rapport à une famille de polynômes P1,…, Pn . b g b g On dit qu'un polynôme P est réduit par rapport à une famille de polynômes P1,…, Pn si aucun monôme principal des polynômes de la famille ne divise le monôme principal de P. Dans le cas contraire, il est possible d'éliminer le monôme principal de P en utilisant une opération du type Q ← P − M ⋅ Pi avec M monôme. Il est important de bien comprendre que cette notion dépend de celle de terme maximal, et que les opérations de réduction que l'on pourra faire dépendent de l'ordre choisi pour ordonner les monômes. Considérons par exemple le polynôme b P = X 4Y + XY 4 g et la famille P1, P2 avec P1 = X 2Y + Y 4 P2 = X 2Y 4 + XY 5 • Si on choisit d'utiliser l'ordre lexicographique induit par X il est divisible par celui de P1 qui est X 2Y . Y , le terme principal de P est X 4Y , et On peut l'éliminer par l'opération e j e j Q ← P − X 2 P1 = X 4Y + XY 4 − X 2 X 2Y + Y 4 = XY 4 − X 2Y 4 • Choisissons à présent l'ordre lexicographique induit par Y utilisant cet ordre : X et réécrivons les polynômes en P = Y 4 X + YX 4 P1 = Y 4 + YX 2 P2 = Y 5 X + Y 4 X 2 le terme principal de P est Y 4 X , celui de P1 est Y 4 , celui de P2 est Y 5 X et on peut donc réduire le monôme principal de P en utilisant l'opération e j Q ← P − XP1 = Y 4 X + YX 4 − X Y 4 + YX 2 = YX 4 − YX 3 De même, on dit qu'un polynôme P est totalement réduit par rapport à une famille de polynômes P1,…, Pn si aucun monôme de P n'est divisible par le monôme principal d'un élément de P1,…, Pn . b g b g Par exemple P = X 6 + X 5Y est réduit par rapport à P1 = X 2Y + Y 4 et P2 = X 2Y 4 + XY 5 : X 6 n'est divisible ni par X 2Y , ni par X 2Y 4 . (On choisit ici X Y ). Par contre, il n'est pas totalement réduit. X 5Y est divisible par X 2Y et l'opération e j e j Q ← P − X 3 P1 = X 6 + X 5Y − X 3 X 2Y + Y 4 = X 6 − X 3Y 4 3 T © Texas Instruments Introduction au calcul formel 39/46 permet donc "d'éliminer" le terme X 5Y . Réduire totalement un polynôme par rapport à une famille de polynômes consiste à appliquer autant de fois que possible ce type d'opérations jusqu'à ce que l'on parviennent à un polynôme totalement réduit11. Cette notion de réduction par rapport à une famille de polynômes permet de définir précisément ce qu'est une Base de Gröbner12. Elle est très importante dans le domaine du calcul formel13. Il reste à présent à définir la notion de s-polynôme. Étant donnés deux polynômes P1 et P2 , de monômes principaux respectifs M1 et M2 , on appelle s-polynôme le polynôme obtenu en calculant : ppcm( M1, M2 ) ppcm( M1, M2 ) Q= P1 − P2 M1 M2 Cette opération a pour effet "d'éliminer" les monômes M1 et M2 . Par exemple, pour P1 = X 2Y + Y 4 et P2 = X 2Y 4 + XY 5 , on obtient Q= X 2Y 4 X 2Y 4 P − P = Y3 P1 − P2 = Y 7 − XY 5 = − XY 5 + Y 7 1 2 2 4 2 X Y X Y On obtient une base de Gröbner en utilisant un algorithme (algorithme de Buchberger) qui utilise des calculs de s-polynômes et des réductions de polynômes. Vous trouverez plus d'informations à ce sujet page 43, avec un exemple d'utilisation. Le point important est que la façon dont seront effectuées les étapes de cet algorithme et le résultat final dépendent de l'ordre choisi pour ordonner les monômes. Par exemple, dans le cas d'un systèmes d'équations polynomiales en x et y, le choix y x va conduire à une élimination prioritaire des termes en y, et on obtiendra un polynôme s'exprimant uniquement en fonction de x. Par exemple, pour le système R|x3y3 − 2 = 0 S|x3y2 + y − 1 = 0 T 11 Dans le cas où l'on travaille avec des polynômes d'une seule variable, et où la famille ne comporte qu'un seul polynôme P1 , cette suite de réductions est équivalente à la recherche du reste de la division euclidienne par P1 . 12 Par définition, B est une Base de Gröbner d'un idéal I engendré par une famille de polynôme, si et seulement si l'appartenance d'un polynôme P à I est caractérisée par le fait que la réduction de P par rapport à B conduit au polynôme nul. 13 Ces notions de bases de Gröbner et de réduction peuvent également être utilisées lors de la démonstration de propriétés géométriques. On traduit pour cela les hypothèses sous forme analytique, ce qui conduit à écrire que certains polynômes de plusieurs variables (les coordonnées des points considérés) sont nuls. On considère alors une base de Gröbner de l'idéal I engendré par cette famille de polynômes. La conclusion à démontrer se traduit également par le fait qu'un ou plusieurs polynômes de plusieurs variables doivent être nuls. Cela sera vrai s'ils sont dans l'idéal I, c'est à dire si la réduction de ces polynômes par rapport à la base de Gröbner conduit au polynôme nul. Comme nous l'avons vu, cette notion de réduction généralise celle de division euclidienne, et cela permet de donner une sens, sans aller plus loin dans les notions de calculs modulo un idéal, à une formule pour le moins surprenante au premier abord : "Pour démontrer qu'un théorème est vrai, il suffit de diviser la conclusion par les hypothèses… si le reste est nul, le théorème est démontré.". Il n'est pas possible de préciser tout cela en détail dans le cadre de ce document d'initiation. Si vous souhaitez approfondir ce type de sujet, et plus généralement ce qui concerne l'utilisation des outils de calcul formel, vous pourrez vous reporter à différents ouvrages. On peut par exemple citer le livre Calcul formel mode d'emploi, Gomez Salvy Zimmermann. Éditions Masson. 3 T © Texas Instruments Introduction au calcul formel 40/46 avec y x , on obtient R|4 x6 + 5x3 + 2 = 0 S|− y + 4 x3 + 3 = 0 T Par contre, si on choisit x y , on est conduit à R|− y2 + y − 2 = 0 S|4 x3 − y + 3 = 0 T Le choix de l'ordre y x conduit ici à un polynôme de degré 6 en x, alors que le choix de l'ordre x conduit à un polynôme de degré 2 seulement en x. y Voici à présent les différentes bases de Gröbner que l'on obtient en choisissant successivement les ordres x y z , x z y , y x z , y z x , z x y puis z y x dans le cas du système : R|x 2 + y2 − 1 = 0 |Sx 2 − y2 − z = 0 ||x + y − z2 = 0 T Elles ont été obtenues avec Maple en utilisant la fonction gbasis14, présente dans le package grobner. 14 Le premier argument est la liste des polynômes, le deuxième l'ordre à utiliser entre les différentes variables – il y a ici 6 possibilités – le troisième indique comment cet ordre est étendu aux monômes s'exprimant en fonction de plusieurs variables. On utilise ici le choix plex qui correspond à l'ordre lexical. 3 T © Texas Instruments Introduction au calcul formel 41/46 Notons que l'on obtient dans certains cas une famille de quatre polynômes. Cela n'a rien d'anormal. Les "Bases" de Gröbner ne se comportent pas comme les bases auxquelles nous sommes habitués dans le cadre de l'algèbre linéaire. Elles ne comportent pas toutes un même nombre d'éléments, et ce nombre peut être supérieur au cardinal de la famille génératrice initiale15. On peut aussi constater que le degré des polynômes manipulés augmente avec la complexité du système initial. Dans certains cas, les calculs générés par l'algorithme de construction deviennent trop complexes, et entraînent une saturation des capacités du système de calcul formel utilisé. Ce qui précède montre que le choix utilisé pour ordonner les variables a une importance considérable. Il est automatiquement déterminé par le système en fonction de différents critères. Dans le cas de la TI-89, une réécriture sous une forme différente des équations permet parfois d'aboutir à un choix différent, et à une complexité moins grande, qui sera naturellement accompagnée d'une réduction du temps de calcul. Par exemple, la fonction cSolve permet d'obtenir en quelques secondes seulement les solutions du système : R|x3y3 − 2 = 0 S|x3y2 + y − 1 = 0 T aSf alors qu'il faut environ 1'40" si on demande de résoudre le système obtenu en permutant le rôle des inconnues x et y : |RSy3x3 − 2 = 0 |Ty3x 2 + x − 1 = 0 aS ′f Ce qui précède permet de le comprendre facilement. Dans les deux cas, la TI-89 a choisi d'éliminer en priorité la variable x afin d'obtenir une équation polynomiale en y. Permuter ces deux variables revient en fait à inverser l'ordre qui sera utilisé lors de la recherche d'une base de Gröbner. On retrouve donc les calculs correspondant aux deux choix x y et y base de Gröbner associée au polynômes définissant le système S . af x lors de la recherche d'une Comme nous l'avons vu page 41, cela conduit à une équation de degré 2 dans le premier cas, alors que dans le second on obtient une équation de degré 6. Par ailleurs, cet algorithme ne sera pas automatiquement utilisé par une TI-89 pour résoudre le système formé par 1 1 + =1 x y 1 1 − =2 x y alors qu'il est facile de se ramener à un système polynomial, et que ce système est de plus clairement à la portée d'un élève de seconde moyennant un simple changement de variable… Une fois encore il est important de savoir que les logiciels de calcul formel n'ont aucune raison d'être astucieux, ils se contentent d'appliquer des méthodes générales qui doivent, même au prix de calculs inutiles permettre d'obtenir la ou les solutions d'un problème donné. Une raison supplémentaire de prendre un peu de temps avant de se lancer aveuglément dans certains calculs sur un logiciel de calcul formel, au risque de bien des déceptions ! 15 3 Cela s'explique par l'ajout éventuel de polynômes au cours de l'algorithme de construction, voir page 43. T © Texas Instruments Introduction au calcul formel 42/46 Annexe : un exemple complet de recherche de base de Gröbner b g Soit P1,…, Pn une famille de polynômes. Voici comment16 obtenir une base de Gröbner : • • a f Si pour tout couple d'entiers distincts i, j ∈1, n , le s-polynôme S de Pi et Pj peut être réduit à 0 en utilisant, plusieurs fois au besoin, des opérations de réductions du type S ← S − M ⋅ Pi , alors la famille est une base de Gröbner, et l'algorithme est terminé. Dans le cas contraire, 1. On ajoute la forme réduite d'un s-polynôme ne se réduisant pas à 0 à la famille initiale. 2. On remplace ensuite chaque polynôme par sa forme réduite par rapport à la sous-famille constituée par les autres polynômes de la famille. Lorsque la forme réduite obtenue est égale à 0, on supprime ce polynôme de la famille. 3. On recommence ce qui précède à partir de cette nouvelle famille de polynômes… Vous trouverez ci-dessous un exemple complet des calculs effectués pour la recherche par cette méthode de la base de Gröbner de l'idéal engendré par P = x 3 y3 − 2 et Q = x 3 y2 + y − 1 . Cette base pourra ensuite être utilisée pour déterminer les solutions du système : R|x3y3 − 2 = 0 S|x3y2 + y − 1 = 0 T N.B. Les lignes suivantes ont été générées par un programme, ce qui explique leur aspect répétitif. De plus, les polynômes sont renumérotés lors de l'ajout ou de la suppression de polynômes dans la famille. Une série de lignes de la forme suivante : Étude de la réduction éventuelle de x3 y-2 x3+y-1 x3 y avec 1/4 y P2 : -2 x3+3/4 y-1+1/4 y3 -2 x3 avec -1/2 P2 : 1/4 y3+3/4 y-1/2-1/2 y2 1/4 y3 avec -1/4 y P1 : -1/4 y2+1/4 y-1/2 … traduit une suite de réductions rendues possibles par le fait que le monôme principal d'un polynôme de la famille divise le monôme principal17 du polynôme à réduire. Dans le cas présent, la première ligne indique que l'on a éliminé le monôme x 3 y à l'aide du polynôme y 3y y3 ⋅ P2 , et que l'on a obtenu −2 x 3 + − 1 + . On a ensuite éliminé le monôme 4 4 4 3 −2 x figurant dans ce dernier polynôme en utilisant le polynôme P2 , et ainsi de suite… P2 en calculant P − 1/ Calcul liés au choix de l'ordre x y. Étude de la famille composée de : P1 = x3 y3-2 P2 = x3 y2+y-1 Calcul du s-polynôme de P1 et P2 : Réduction - pas de réduction pour -y2+y-2 -y2+y-2 Ce n'est pas une base de Gröbner. Il faut ajouter -y2+y-2 16 Il s'agit ici d'une version simplifiée et non optimisée. Il est par exemple inutile de recalculer et d'étudier la réduction de tous les s-polynômes à chaque nouvelle étape. Cette description permet cependant de comprendre les idées de cette méthode, qui se termine toujours après un nombre fini (mais parfois élevé…) d'opérations. 17 3 Ou un monôme quelconque dans le cas de la recherche d'une réduction totale. T © Texas Instruments Introduction au calcul formel 43/46 Nouvelle famille génératrice (avant réduction): P1 = x3 y3-2 P2 = x3 y2+y-1 P3 = -y2+y-2 Recherche des éléments à supprimer Étude de la réduction éventuelle de x3 y3-2 x3 y3 avec y P1 : -y2+y-2 -y2 avec P2 : 0 Étude de la réduction éventuelle de x3 y2+y-1 3 2 3 3 3 x y avec -x P2 : y-1+x y-2 x - pas de réduction pour x3 y-2 x3+y-1 Étude de la réduction éventuelle de -y2+y-2 - pas de réduction pour -y2+y-2 Nouvelle famille génératrice (après réduction): P1 = x3 y-2 x3+y-1 P2 = -y2+y-2 Test de la nouvelle famille génératrice Étude de la famille composée de : P1 = x3 y-2 x3+y-1 P2 = -y2+y-2 Calcul du s-polynôme de P1 et P2 : x3 y-y2+y+2 x3 Réduction x3 y avec P1 : 4 x3-y2+1 - pas de réduction pour 4 x3-y2+1 Ce n'est pas une base de Gröbner. Il faut ajouter 4 x3-y2+1 Nouvelle famille génératrice (avant réduction): P1 = x3 y-2 x3+y-1 P2 = -y2+y-2 P3 = 4 x3-y2+1 Recherche des éléments à supprimer Étude de la réduction éventuelle de x3 y-2 x3+y-1 3 3 x y avec 1/4 y P2 : -2 x +3/4 y-1+1/4 y3 -2 x3 avec -1/2 P2 : 1/4 y3+3/4 y-1/2-1/2 y2 1/4 y3 avec -1/4 y P1 : -1/4 y2+1/4 y-1/2 -1/4 y2 avec 1/4 P1 : 0 Étude de la réduction éventuelle de -y2+y-2 - pas de réduction pour -y2+y-2 Étude de la réduction éventuelle de 4 x3-y2+1 4 x3 avec P2 : -y+4 x3+3 - pas de réduction pour 4 x3-y+3 Nouvelle famille génératrice (après réduction): P1 = -y2+y-2 P2 = 4 x3-y+3 Test de la nouvelle famille génératrice Étude de la famille composée de : P1 = -y2+y-2 P2 = 4 x3-y+3 Calcul du s-polynôme de P1 et P2 : 4 x3 y-8 x3-y3+3 y2 Réduction 4 x3 y avec y P2 : -8 x3-y3+4 y2-3 y -8 x3 avec -2 P2 : -y3+4 y2-5 y+6 -y3 avec y P1 : 3 y2-3 y+6 3 y2 avec -3 P1 : 0 Le s-polynôme de P1 et P2 se réduit à 0 C'est une base de Gröbner 3 T © Texas Instruments Introduction au calcul formel 44/46 On obtient donc ici le système équivalent : 2/ Calcul liés au choix de l'ordre y R|− y2 + y − 2 = 0 S|4 x3 − y + 3 = 0 T x Étude de la famille composée de : P1 = y3 x3-2 P2 = y2 x3+y-1 Calcul du s-polynôme de P1 et P2 : Réduction - pas de réduction pour -y2+y-2 -y2+y-2 Ce n'est pas une base de Gröbner. Il faut ajouter -y2+y-2 Nouvelle famille génératrice (avant réduction): P1 = y3 x3-2 P2 = y2 x3+y-1 P3 = -y2+y-2 Recherche des éléments à supprimer Étude de la réduction éventuelle de y3 x3-2 y3 x3 avec y P1 : -y2+y-2 -y2 avec P2 : 0 Étude de la réduction éventuelle de y2 x3+y-1 y2 x3 avec -x3 P2 : y x3+y-2 x3-1 - pas de réduction pour y x3+y-2 x3-1 Étude de la réduction éventuelle de -y2+y-2 - pas de réduction pour -y2+y-2 Nouvelle famille génératrice (après réduction): P1 = y x3+y-2 x3-1 P2 = -y2+y-2 Test de la nouvelle famille génératrice Étude de la famille composée de : P1 = y x3+y-2 x3-1 P2 = -y2+y-2 Calcul du s-polynôme de P1 et P2 : -y2+y x3+y+2 x3 Réduction -y2 avec P2 : y x3+2 x3+2 y x3 avec P1 : -y+4 x3+3 - pas de réduction pour -y+4 x3+3 Ce n'est pas une base de Gröbner. Il faut ajouter -y+4 x3+3 Nouvelle famille génératrice (avant réduction): P1 = y x3+y-2 x3-1 P2 = -y2+y-2 P3 = -y+4 x3+3 Recherche des éléments à supprimer Étude de la réduction éventuelle de y x3+y-2 x3-1 3 3 3 6 y x avec -x P2 : y+x -1+4 x y avec -P2 : 4 x6+5 x3+2 - pas de réduction pour 4 x6+5 x3+2 Étude de la réduction éventuelle de -y2+y-2 2 3 -y avec y P2 : -2 y-2-4 y x -4 y x3 avec -4 P1 : 2 y-6-8 x3 3 T © Texas Instruments Introduction au calcul formel 45/46 2 y avec -2 P2 : 0 Étude de la réduction éventuelle de - pas de réduction pour -y+4 x3+3 -y+4 x3+3 Nouvelle famille génératrice (après réduction): P1 = 4 x6+5 x3+2 P2 = -y+4 x3+3 Test de la nouvelle famille génératrice Étude de la famille composée de : P1 = 4 x6+5 x3+2 P2 = -y+4 x3+3 Calcul du s-polynôme de P1 et P2 : -5 y x3-2 y-16 x9-12 x6 Réduction -5 y x3 avec 5 x3 P2 : -2 y-16 x9-32 x6-15 x3 -2 y avec 2 P2 : -16 x9-32 x6-23 x3-6 -16 x9 avec -4 x3 P1 : -12 x6-15 x3-6 -12 x6 avec -3 P1 : 0 Le s-polynôme de P1 et P2 se réduit à 0 C'est une base de Gröbner On obtient le système équivalent : R|4 x6 + 5x3 + 2 = 0 S|− y + 4 x3 + 3 = 0 T Attention, il ne s'agit ici que d'un exemple assez simple, il faudrait plusieurs pages pour afficher la liste des étapes effectuées lors d'un calcul de Base de Gröbner associée à un système donné. Voici à titre d'exemple la fin des calculs occasionnés par un autre système : Étude de la famille composée de : P1 = y2+x2-1 P2 = -z-y2+x2 P3 = -z2+y+x … … P1 = -z+2*x2-1 P2 = y-4*x4+4*x2+x-1 P3 = 16*x8-32*x6-8*x5+24*x4+8*x3-6*x2-2*x … Calcul du s-polynôme de P2 et P3 : -64 x^12+64 x10+16 x9-16 x8+32 y x6+8 y x5-24 y x4-8 y x3+6 y x2+2 y x Réduction - 32y x6 avec 32x6 P2 : 8y x5-24y x4-8y x3+6y x2+2y x-64x12+192x10+16x9-144x8-32x7+32x6 - 8y x5 avec 8 x5 P2 : -24y x4-8y x3+6y x2+2y x-64x12+192x10+48x9-144x8-64x7+24x6+8x5 - -24y x4 avec -24x4 P2 : -8y x3+6y x2+2y x-64x12+192x10+48x9-240x8-64x7+120x6+32x5-24x4 - -8 y x3 avec -8 x3 P2 : 6 y x2+2 y x-64 x12+192 x10+48 x9-240 x8-96 x7+120 x6+64 x5-16 x4-8 x3 - 6 y x2 avec 6 x2 P2 : 2 y x-64 x12+192 x10+48 x9-240 x8-96 x7+144 x6+64 x5-40 x4-14 x3+6 x2 - 2 y x avec 2 x P2 : -64 x12+192 x10+48 x9-240 x8-96 x7+144 x6+72 x5-40 x4-22 x3+4 x2+2 x - -64 x12 avec -4 x4 P3 : 64 x10+16 x9-144 x8-64 x7+120 x6+64 x5-40 x4-22 x3+4 x2+2 x - 64 x10 avec 4 x2 P3 : 16 x9-16 x8-32 x7+24 x6+32 x5-16 x4-14 x3+4 x2+2 x - 16 x9 avec x P3 : -16 x8+32 x6+8 x5-24 x4-8 x3+6 x2+2 x - -16 x8 avec -P3 : 0 Le s-polynôme de P2 et P3 se réduit à 0 C'est une base de Gröbner On arrive ici à un polynôme de degré 8 en x (mais on peut le factoriser, voir page 40). 3 T © Texas Instruments Introduction au calcul formel 46/46