12.07.2015 Views

Algorithmes de calcul formel - Free

Algorithmes de calcul formel - Free

Algorithmes de calcul formel - Free

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Algorithmes</strong> <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>B. ParisseInstitut FourierUMR 5582 du CNRSUniversité <strong>de</strong> Grenoble IRésuméCe document décrit une partie <strong>de</strong>s algorithmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> utiliséspour le logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> Giac/Xcas, cf.http://www-fourier.ujf-grenoble.fr/~parisse/giac_fr.htmlTable <strong>de</strong>s matières1 Calculer sur ordinateur 41.1 Problèmes spécifiques au <strong>calcul</strong> <strong>formel</strong> . . . . . . . . . . . . . . . 41.1.1 Calcul exact et approché, types, évaluation. . . . . . . . . 41.1.2 Forme normale et reconnaissance du 0. . . . . . . . . . . 51.1.3 Valeur générique <strong>de</strong>s variables et hypothèses . . . . . . . 61.2 Structures <strong>de</strong> données . . . . . . . . . . . . . . . . . . . . . . . . 71.2.1 Calculatrices <strong>formel</strong>les HP . . . . . . . . . . . . . . . . . 81.2.2 Calculatrices <strong>formel</strong>les TI . . . . . . . . . . . . . . . . . 91.2.3 Maple, MuPAD, Mathematica, ... . . . . . . . . . . . . . 101.2.4 Giac/xcas . . . . . . . . . . . . . . . . . . . . . . . . . . 101.3 <strong>Algorithmes</strong> et complexité. . . . . . . . . . . . . . . . . . . . . . 112 Quelques algorithmes d’arithmétique <strong>de</strong> base. 142.1 Pour en savoir plus. . . . . . . . . . . . . . . . . . . . . . . . . . 153 Exercices sur types, <strong>calcul</strong> exact et approché, algorithmes <strong>de</strong> bases 164 Le PGCD 184.1 Le sous-résultant. . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2 Le pgcd en une variable . . . . . . . . . . . . . . . . . . . . . . . 214.2.1 Le pgcd heuristique. . . . . . . . . . . . . . . . . . . . . 214.2.2 Le pgcd modulaire . . . . . . . . . . . . . . . . . . . . . 244.3 Le pgcd à plusieurs variables. . . . . . . . . . . . . . . . . . . . . 284.3.1 Le pgcd heuristique. . . . . . . . . . . . . . . . . . . . . 284.3.2 Le pgcd modulaire multivariables. . . . . . . . . . . . . . 284.3.3 EZGCD. . . . . . . . . . . . . . . . . . . . . . . . . . . 314.4 Quel algorithme choisir ? . . . . . . . . . . . . . . . . . . . . . . 354.5 Pour en savoir plus. . . . . . . . . . . . . . . . . . . . . . . . . . 355 Le résultant 361


6 Les suites <strong>de</strong> Sturm 387 Exercices (PGCD, résultant, ...) 397.1 Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397.1.1 Entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . 397.1.2 Polynômes . . . . . . . . . . . . . . . . . . . . . . . . . 407.1.3 Calculs modulo n . . . . . . . . . . . . . . . . . . . . . . 417.2 Exercices PGCD . . . . . . . . . . . . . . . . . . . . . . . . . . 417.3 Exercices (résultant) . . . . . . . . . . . . . . . . . . . . . . . . 427.4 Exercice (Bézout modulaire) . . . . . . . . . . . . . . . . . . . . 427.5 Exercice (Géométrie et résultants). . . . . . . . . . . . . . . . . . 448 Factorisation 448.1 Les facteurs multiples . . . . . . . . . . . . . . . . . . . . . . . . 458.2 Factorisation en une variable . . . . . . . . . . . . . . . . . . . . 468.2.1 Factorisation dans Z/pZ[X] . . . . . . . . . . . . . . . . 478.2.2 Distinct <strong>de</strong>gree factorization . . . . . . . . . . . . . . . . 478.2.3 La métho<strong>de</strong> <strong>de</strong> Cantor-Zassenhaus . . . . . . . . . . . . . 498.2.4 La métho<strong>de</strong> <strong>de</strong> Berlekamp . . . . . . . . . . . . . . . . . 508.2.5 Remontée (Hensel) . . . . . . . . . . . . . . . . . . . . . 518.2.6 Combinaison <strong>de</strong> facteurs . . . . . . . . . . . . . . . . . . 558.3 Factorisation à plusieurs variables . . . . . . . . . . . . . . . . . 568.4 Preuve <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée . . . . . . . . . . . . . 588.5 Algorithme <strong>de</strong> Bézout généralisé . . . . . . . . . . . . . . . . . . 598.6 Pour en savoir plus . . . . . . . . . . . . . . . . . . . . . . . . . 598.7 Exercices (factorisation <strong>de</strong>s polynômes) . . . . . . . . . . . . . . 609 Intégration 629.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629.2 Fonctions élémentaires . . . . . . . . . . . . . . . . . . . . . . . 629.2.1 Extensions transcendantes, tour <strong>de</strong> variables . . . . . . . . 629.2.2 Théorème <strong>de</strong> structure <strong>de</strong> Risch . . . . . . . . . . . . . . 639.2.3 Théorème <strong>de</strong> Liouville . . . . . . . . . . . . . . . . . . . 679.3 L’algorithme <strong>de</strong> Risch . . . . . . . . . . . . . . . . . . . . . . . . 709.3.1 Intégration d’une fraction propre . . . . . . . . . . . . . . 719.3.2 Réduction sans facteurs multiples . . . . . . . . . . . . . 719.3.3 La partie logarithmique . . . . . . . . . . . . . . . . . . . 719.3.4 La partie polynomiale (généralisée) . . . . . . . . . . . . 739.3.5 Extension logarithmique . . . . . . . . . . . . . . . . . . 739.3.6 Extension exponentielle . . . . . . . . . . . . . . . . . . 749.4 Quelques références . . . . . . . . . . . . . . . . . . . . . . . . . 7910 Algèbre linéaire 7910.1 Résolution <strong>de</strong> systèmes, <strong>calcul</strong> <strong>de</strong> déterminant. . . . . . . . . . . 7910.1.1 La métho<strong>de</strong> du pivot <strong>de</strong> Gauß. . . . . . . . . . . . . . . . 7910.1.2 Le déterminant. . . . . . . . . . . . . . . . . . . . . . . . 8010.1.3 Systèmes linéaires . . . . . . . . . . . . . . . . . . . . . 8210.1.4 Base du noyau . . . . . . . . . . . . . . . . . . . . . . . 8210.2 Réduction <strong>de</strong>s endomorphismes . . . . . . . . . . . . . . . . . . 822


10.2.1 Le polynôme minimal . . . . . . . . . . . . . . . . . . . 8210.2.2 Le polynôme caractéristique . . . . . . . . . . . . . . . . 8310.2.3 La métho<strong>de</strong> <strong>de</strong> Hessenberg . . . . . . . . . . . . . . . . . 8410.2.4 La métho<strong>de</strong> <strong>de</strong> Leverrier-Fad<strong>de</strong>ev-Souriau . . . . . . . . . 8410.2.5 Les vecteurs propres simples. . . . . . . . . . . . . . . . 8610.2.6 La forme normale <strong>de</strong> Jordan . . . . . . . . . . . . . . . . 8610.2.7 Exemple 1 . . . . . . . . . . . . . . . . . . . . . . . . . 8810.2.8 Exemple 2 . . . . . . . . . . . . . . . . . . . . . . . . . 8910.2.9 Le polynôme minimal par Fad<strong>de</strong>ev . . . . . . . . . . . . 9010.2.10 Formes normales rationnelles . . . . . . . . . . . . . . . 9010.2.11 Fonctions analytiques . . . . . . . . . . . . . . . . . . . . 9310.3 Quelques autres algorithmes utiles . . . . . . . . . . . . . . . . . 9310.4 Quelques références . . . . . . . . . . . . . . . . . . . . . . . . . 9410.5 Bézout et les p-adiques. . . . . . . . . . . . . . . . . . . . . . . . 9410.6 Exercices (algèbre linéaire) . . . . . . . . . . . . . . . . . . . . . 9710.6.1 Instructions . . . . . . . . . . . . . . . . . . . . . . . . . 9710.6.2 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . 9710.7 L’algorithme du simplexe . . . . . . . . . . . . . . . . . . . . . . 9911 Interpolation 9911.1 Lagrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9911.2 Différences divisées . . . . . . . . . . . . . . . . . . . . . . . . . 10011.3 Les splines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1013


1 Calculer sur ordinateur1.1 Problèmes spécifiques au <strong>calcul</strong> <strong>formel</strong>1.1.1 Calcul exact et approché, types, évaluation.Dans les langages <strong>de</strong> programmation traditionnel (C, Pascal,...), il existe déjà<strong>de</strong>s types permettant une représentation exacte <strong>de</strong>s données (type entier) ou une représentationapprochée (type flottant). Mais ces types <strong>de</strong> donnée <strong>de</strong> base occupentune taille fixe en mémoire, le type entier est donc limité à un intervalle d’entiers(par exemple [0, 2 32 − 1] pour un entier non signé sur une machine utilisant unprocesseur 32 bits) alors que le type flottant peut représenter <strong>de</strong>s nombres réels,mais est limité à une précision en nombre <strong>de</strong> digits <strong>de</strong> la mantisse et <strong>de</strong> l’exposant(par exemple 12 chiffres significatifs et un exposant compris entre -499 et 499).En <strong>calcul</strong> <strong>formel</strong>, on souhaite pouvoir <strong>calcul</strong>er rigoureusement d’une part, etavec <strong>de</strong>s paramètres dont la valeur n’est pas connue d’autre part ; il faut donc s’affranchir<strong>de</strong> ces limites :– pour les entiers relatifs, on utilise <strong>de</strong>s entiers <strong>de</strong> précision arbitraire dont lataille en mémoire est dynamique (déterminée pendant l’exécution et non à lacompilation),– pour les nombres complexes, on utilise un couple <strong>de</strong> nombres réels,– pour les rationnels, on utilise un couple d’entiers relatifs,– pour les irrationnels algébriques (par exemple √ 2), on utilise un polynômeirréductible dont ils sont racines,– pour les paramètres (x, y, z, t...), on utilise un type structuré contenant unchamp <strong>de</strong> type chaine <strong>de</strong> caractères pour représenter le nom du paramètre etun champ pour attribuer une valeur à (ou une hypothèse sur) ce paramètre,– pour les nombres transcendants (par exemple π), on est obligé d’introduireun paramètre auquel on attribue une valeur numérique, qui ne sera utiliséequ’au moment où on veut une approximation numérique d’une expressioncontenant ce nombre transcendant, on parle <strong>de</strong> constante,– lorsqu’on a besoin d’une approximation numérique d’un nombre, on peututiliser <strong>de</strong>s conversions <strong>de</strong> ces types en un type flottant. On peut aussi pourlutter contre les erreurs d’arrondi utiliser <strong>de</strong>s nombres flottants étendus dontla précision est dynamique ou même <strong>de</strong>s intervalles <strong>de</strong> flottants étendus,– il faut aussi un nouveau type, appelé expression ou symbolique, permettantd’appliquer une fonction qu’on ne peut évaluer directement sur les objetsprécé<strong>de</strong>nts, par exemple sin(x). Il doit s’agir d’une opération <strong>de</strong> clôture, ausens où appliquer une fonction à un objet symbolique ne nécessite pas lacréation d’un nouveau type (en général on renvoie un objet symbolique).Enfin, il faut pouvoir évaluer un objet (en particulier symbolique) : par exempleévaluer sin(x) lorsqu’on assigne une valeur à x. Dans cet exemple, on voit qu’ilfaut d’abord remplacer x par sa valeur avant <strong>de</strong> lui appliquer la fonction sinus.C’est le mécanisme général <strong>de</strong> l’évaluation, mais il y a quelques exceptions où onsouhaite empêcher l’évaluation d’un ou plusieurs arguments d’une fonction avantl’évaluation <strong>de</strong> la fonction. Par exemple si on veut <strong>calcul</strong>er la valeur numériqued’une intégrale par <strong>de</strong>s métho<strong>de</strong>s <strong>de</strong> quadrature, on ne souhaitera pas rechercherune primitive <strong>de</strong> la fonction à intégrer. Dans le jargon, on parle alors <strong>de</strong> “quoter”un argument (l’origine du terme vient probablement <strong>de</strong> la notation ’ du langage4


Lisp). Certaines fonctions doivent toujours quoter leurs arguments (par exemple lafonction qui permet <strong>de</strong> purger le contenu d’un paramètre), on parle parfois d’autoquotation.1.1.2 Forme normale et reconnaissance du 0.Une fois défini ces types <strong>de</strong> base représentant les nombres d’un système <strong>de</strong><strong>calcul</strong> <strong>formel</strong>, il faut pouvoir comparer ces nombres, en particulier déci<strong>de</strong>r si <strong>de</strong>uxreprésentations distinctes correspon<strong>de</strong>nt au même nombre ou, ce qui revient aumême, par soustraction déci<strong>de</strong>r quand un nombre est nul. Par exemple 4/2 et 2représentent le même nombre. Lorsqu’on dispose d’un algorithme permettant <strong>de</strong>représenter un nombre d’une manière unique, on parle <strong>de</strong> forme normale. C’estpar exemple le cas pour les nombres rationnels, la forme normale usuelle est lafraction irréductible <strong>de</strong> dénominateur positif. C’est aussi le cas pour les fractionsrationnelles <strong>de</strong> polynômes à coefficients entiers représentées par une fraction irréductible,avec au dénominateur un coefficient <strong>de</strong> plus haut <strong>de</strong>gré positif. Malheureusement,il n’est pas toujours possible <strong>de</strong> trouver une forme normale pourdiverses raisons théoriques ou pratiques :– on ne connaît pas toujours le statut <strong>de</strong> certaines constantes (par exemple laconstante d’Euler),– il n’existe pas d’algorithmes permettant <strong>de</strong> déterminer s’il existe <strong>de</strong>s relationsalgébriques entre constantes,– il n’existe pas forcément une seule forme plus simple, par exemple :( √ 2 + 1)x + 1x + √ 2 + 1= x + √ 2 − 1( √ 2 − 1)x + 1Ce cas se présente fréquemment avec les extensions algébriques.– en pratique il peut être trop coûteux d’utiliser une forme normale, par exemplele polynôme x1000 −1x−1possè<strong>de</strong> 1000 monômesEn résumé, au mieux on a une forme normale, au pire on risque <strong>de</strong> ne pas reconnaîtreun zéro, entre les <strong>de</strong>ux on peut ne pas avoir <strong>de</strong> forme normale mais êtrecapable <strong>de</strong> reconnaître à coup sûr une expression nulle (par contre, si le système <strong>de</strong><strong>calcul</strong> <strong>formel</strong> détermine qu’une expression est nulle, alors elle l’est).Il n’existe pas d’algorithme solution pour le problème <strong>de</strong> la reconnaissancedu zéro pour une classe d’expressions "assez générale". Heureusement, dans laplupart <strong>de</strong>s cas pratiques on sait résoudre ce problème, en se ramenant le plussouvent au cas <strong>de</strong>s polynômes et fractions rationnelles. Par exemple, pour simplifierune expression trigonométrique, on remplace les fonctions trigonométriquessin(x), cos(x), tan(x) par leur expression en fonction <strong>de</strong> t = tan(x/2), on estainsi ramené à une fraction rationnelle en t que l’on écrit sous forme normale.Les polynômes ont un rôle central dans tout système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> puisquesauf dans les cas les plus simples (fractions d’entiers par exemple), la simplificationd’expressions fait appel à un moment ou à un autre à <strong>de</strong>s <strong>calcul</strong>s <strong>de</strong> PGCD <strong>de</strong>polynômes. Le PGCD <strong>de</strong> polynômes est un algorithme très sollicité auquel nousconsacrerons une section. En effet, l’application brutale <strong>de</strong> l’algorithme d’Eucli<strong>de</strong>pose <strong>de</strong>s problèmes d’efficacité ce qui a obligé à inventer <strong>de</strong>s métho<strong>de</strong>s plus efficaces.Anticipons rapi<strong>de</strong>ment sur un exemple qui montre l’un <strong>de</strong>s problèmes majeurs<strong>de</strong>s algorithmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>, l’explosion en taille (ici <strong>de</strong>s coefficients <strong>de</strong>s5


estes successifs). Voici donc les restes successifs lorsqu’on applique l’algorithmed’Eucli<strong>de</strong> pour <strong>calcul</strong>er le PGCD <strong>de</strong> P(x) = (x + 1) 7 − (x − 1) 6 avec sa dérivée(les <strong>de</strong>ux polynômes sont premiers entre eux) :7(x + 1) 6 − 6(x − 1) 516249 x5 + −39049 x4 + 106049 x3 + −78049 x2 + 47449 x + −7849157780729 x4 + −5076402187 x3 + 290864729 x2 + −101528 x + 28028729 729149 (1400328 2645 x3 + −7328882645 x2 + 11333523703 x + −73288818515 )12187 (2161816376832 x 2 + −555436846944 x + 301917024864 )4669921 4669921 46699211907235 (469345063045455 x + −47641670106615 )129411872 1294118725497465490623352995840209648836272383412129Le lecteur voulant tester d’autres exemples pourra utiliser le programme Xcas (cf.l’appendice) suivant :pgcd(a):={local b,r,res;b:=diff(a,x);res:=NULL;for (;b!=0;){res:=res,b;r:=rem(a,b);a:=b;b:=r;}return(res);}1.1.3 Valeur générique <strong>de</strong>s variables et hypothèsesLorsqu’on utilise un symbole sans lui affecter <strong>de</strong> valeurs en mathématiques ons’attend à une discussion en fonction du paramètre représenté par ce symbole. Cequi nécessiterait <strong>de</strong> créer un arborescence <strong>de</strong> <strong>calcul</strong>s (on retrouve ici les problèmesd’explosion évoqués dans la section précé<strong>de</strong>nte). La plupart <strong>de</strong>s systèmes <strong>de</strong> <strong>calcul</strong><strong>formel</strong> contournent la difficulté en supposant que le paramètre possè<strong>de</strong> une valeurgénérique (par exemple la solution <strong>de</strong> (t 2 − 1)x = t − 1 sera x = 1/(t + 1)) ouchoisissent une branche pour les fonctions possédant un point <strong>de</strong> branchement (parexemple pour résoudre x 2 = t en fonction <strong>de</strong> t). Certains systèmes <strong>de</strong>man<strong>de</strong>nt <strong>de</strong>manière interactive à l’utilisateur si la variable est par exemple positive ou différente<strong>de</strong> 1 mais cela s’oppose à un traitement automatique. On peut aussi anticiperce type <strong>de</strong> décision en faisant <strong>de</strong>s hypothèses sur une paramètre, la plupart <strong>de</strong>ssystèmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> actuel proposent cette possibilité.6


1.2 Structures <strong>de</strong> donnéesOn a vu plus haut qu’on souhaitait manipuler <strong>de</strong>s entiers <strong>de</strong> taille non fixe,<strong>de</strong>s réels <strong>de</strong> précision fixe ou non, <strong>de</strong>s fractions, <strong>de</strong>s nombres complexes, <strong>de</strong>s extensionsalgébriques, <strong>de</strong>s paramètres, <strong>de</strong>s expressions symboliques. La plupart <strong>de</strong>ssystèmes proposent un type générique qui recouvre ces divers types <strong>de</strong> scalaire. Onpeut par exemple utiliser un type structuré comportant un champ type et la donnéeou un pointeur sur la donnée (avec dans ce cas un pointeur sur un compteur <strong>de</strong> références<strong>de</strong> la donnée pour pouvoir la détruire dès qu’elle n’est plus référencée 1 ).En programmation orientée objet, on utiliserait plutôt un type abstrait dont dériventces différents scalaires et le polymorphisme.Il faut aussi un type pour les vecteurs, les matrices et les listes. Il faut prendregar<strong>de</strong> à la métho<strong>de</strong> utilisée par le système lorsqu’on modifie un élément d’un vecteur,matrice ou liste : soit on effectue une copie <strong>de</strong> tout l’objet en modifiant l’élément,soit on modifie l’élément <strong>de</strong> l’objet original. La première métho<strong>de</strong> (par valeur)est plus aisée à comprendre pour un débutant mais la secon<strong>de</strong> métho<strong>de</strong> (parréférence) est bien plus efficace.On peut se poser la question <strong>de</strong> savoir s’il faut inclure ces types dans le typegénérique ; en général la réponse est affirmative, une <strong>de</strong>s raisons étant que les interpréteursqui permettront <strong>de</strong> lire <strong>de</strong>s données dans un fichier texte sont en généralbasé sur le couple <strong>de</strong> logiciels lex(flex)/yacc(bison) qui ne peut compilerqu’à <strong>de</strong>stination d’un seul type. Ceci permet également d’unifier en un seultype symbolique les fonctions ayant un ou plusieurs arguments en voyant plusieursarguments comme un vecteur d’arguments. Les fonctions sont le plus souvent ellemêmeincluses dans le type générique permettant ainsi à l’utilisateur <strong>de</strong> saisir <strong>de</strong>scomman<strong>de</strong>s ou programmes fonctionnels (on peut utiliser une fonction comme argumentd’une comman<strong>de</strong>).Pour <strong>de</strong>s raisons d’efficacité, les systèmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> utilisent souvent<strong>de</strong>s représentations particulières pour les polynômes dont on a dit qu’ils jouaientun rôle central. Pour les polynômes à une variable, on peut utiliser la liste <strong>de</strong>s coefficientsdu polynôme, on parle alors <strong>de</strong> représentation <strong>de</strong>nse. On peut aussi déci<strong>de</strong>r<strong>de</strong> ne stocker que les coefficients non nuls, on parle alors <strong>de</strong> représentation creuse(on stocke alors un couple formé par le coefficient et le <strong>de</strong>gré du monôme correspondant).Pour les polynômes à plusieurs variables, on peut les considérer comme<strong>de</strong>s polynômes à une variable à coefficients polynomiaux, on parle alors <strong>de</strong> représentationrécursive. On peut aussi déci<strong>de</strong>r <strong>de</strong> ne pas briser la symétrie entre lesvariables (pas <strong>de</strong> variable principale), on parle alors <strong>de</strong> représentation distribuée,le plus souvent les représentation distribuées sont creuses car les représentations<strong>de</strong>nses nécessitent très vite beaucoup <strong>de</strong> coefficients. Les métho<strong>de</strong>s <strong>de</strong> représentationcreuses sont parfois aussi utilisées pour les matrices ayant beaucoup <strong>de</strong> coefficientsnuls.Voyons maintenant plus précisément sur quelques exemples <strong>de</strong> logiciels <strong>de</strong> <strong>calcul</strong><strong>formel</strong> répandus quelles structures <strong>de</strong> données sont utilisées. Plusieurs élémentsentrent en compte dans les choix faits :1 Certains systèmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> (<strong>calcul</strong>atrices par exemple) utilisent d’ailleurs <strong>de</strong>s métho<strong>de</strong>sspécifiques pour gérer le problème <strong>de</strong> la fragmentation <strong>de</strong> la mémoire, appelés “garbage collector”.Ce type <strong>de</strong> métho<strong>de</strong> est intégré dans <strong>de</strong>s langages comme Lisp ou Java, en C/C++ on trouve <strong>de</strong>slibraries pour cela, par exemple GC <strong>de</strong> Boehm, incluse dans la distribution <strong>de</strong> GCC.7


– le(s) profil(s) d’utilisation (enseignement, ingéniérie, <strong>calcul</strong> intensif, recherche)– les ressources disponibles (mémoire, puissance du processeur...)– la facilité d’implémentation (choix du langage, outils disponibles en particulierdébuggueurs, ...)– l’histoire du système (un système conçu avec les outils disponibles aujourd’huiest forcément différent d’un système conçu il y a 20 ans)Nous allons d’abord parler <strong>de</strong>s <strong>calcul</strong>atrices <strong>formel</strong>les HP et TI (le lecteur pourrafacilement les tester grâce aux émulateurs gratuits pour PC). Ce sont <strong>de</strong>s systèmesplutôt <strong>de</strong>stinés à l’enseignement, soumis à <strong>de</strong> fortes contraintes en termes <strong>de</strong> taillemémoire, et <strong>de</strong>stinés à traiter <strong>de</strong>s petits problèmes. Puis nous présenterons <strong>de</strong>s systèmespour ordinateur où les ressources (par exemple mémoire) sont moins limitéesce qui permet d’utiliser <strong>de</strong>s langages <strong>de</strong> programmation <strong>de</strong> plus haut niveau.1.2.1 Calculatrices <strong>formel</strong>les HPLes langages utilisés pour programmer ces <strong>calcul</strong>ateurs sont l’assembleur etle RPL (Reverse Polish Lisp) adapté à l’écriture <strong>de</strong> co<strong>de</strong> en mémoire morte trèscompact.Le type générique est implémenté avec un champ type appelé prologue (qui esten fait un pointeur sur la fonction chargée d’évaluer ce type d’objet) suivi <strong>de</strong> ladonnée elle-même (et non d’un pointeur sur la donnée, on économise ainsi la placemémoire du compteur <strong>de</strong> référence).Le type entier en précision arbitraire est codé par le nombre <strong>de</strong> digits (sur 5quartets 2 ) suivi du signe sur un quartet et <strong>de</strong> la représentation BCD (en base 10)<strong>de</strong> la valeur absolue <strong>de</strong> l’entier. Le choix <strong>de</strong> la représentation BCD a été fait pouroptimiser les temps <strong>de</strong> conversion en chaîne <strong>de</strong> caractères pour l’affichage. La mémoirevive disponible est <strong>de</strong> 256K, c’est elle qui limite la taille <strong>de</strong>s entiers et non lechamp longueur <strong>de</strong> l’entier. Il n’y a pas <strong>de</strong> type spécifique pour les rationnels (onutilise un objet symbolique normal).Les fonctions internes <strong>de</strong>s HP49/50/40 utilisent le type programme pour représenterles entiers <strong>de</strong> Gauß (complexes dont la partie réelle et imaginaire est entière).Les nombres algébriques ne sont pas implémentés, sauf les racines carrées (représentée<strong>de</strong> manière interne par le type programme). Il y a un type spécifique prévupour les flottants en précision arbitraire, mais l’implémentation <strong>de</strong>s opérations surces types n’a pas été intégrée en ROM à ce jour.Les types listes, programmes et objet symbolique sont composés du prologue(champ type) suivi par la succession d’objets situés en mémoire vive ou <strong>de</strong> pointeurssur <strong>de</strong>s objets situés en mémoire en lecture seule (ROM) et se terminent parun pointeur sur une adresse fixe (appelée SEMI). Ces types sont eux-mêmes <strong>de</strong>sobjets et peuvent donc être utilisés <strong>de</strong> manière récursive. La longueur <strong>de</strong>s typeslistes, programmes, symboliques n’est stockée nulle part, c’est le délimiteur finalqui permet <strong>de</strong> la connaître, ce qui est parfois source d’inefficacité. On utilise <strong>de</strong> manièreinterne les listes pour représenter les polynômes <strong>de</strong>nses (avec représentationrécursive pour les polynômes à plusieurs variables).Les <strong>calcul</strong>atrices HP4xG utilisent une pile 3 , c’est-à-dire une liste <strong>de</strong> taille non2 un quartet=un <strong>de</strong>mi octet3 Plus précisément <strong>de</strong>ux piles, la pile <strong>de</strong> donnée et la pile gérant le flux d’exécution. Cette <strong>de</strong>rnièren’est pas visible par l’utilisateur8


fixée d’objets. On place les objets sur la pile, l’exécution d’une fonction prendces arguments sur la pile et renvoie un ou plusieurs résultats sur la pile (ce quiest une souplesse du RPN comparé aux langages où on ne peut renvoyer qu’unevaleur <strong>de</strong> retour). Il faut donc donner les arguments avant d’appeler la fonctioncorrespondante. Par exemple pour <strong>calcul</strong>er a+b on tapera a b +. C’est la syntaxedite polonaise inversée (RPN). Un avantage <strong>de</strong> cette syntaxe est que le codaged’un objet symbolique par cette syntaxe est évi<strong>de</strong>nte, il suffit <strong>de</strong> stocker la listeprécé<strong>de</strong>nte {a b +}. Les objets symboliques sont donc représenté par une suited’objets écrit en syntaxe polonaise inversée. L’évaluation d’un objet symbolique sefait dans l’ordre polonaise inversé : les arguments sont évalués puis les fonctionsleur sont appliqués. Pour <strong>de</strong>s raisons d’efficacité, on représente souvent les objetscomposites (listes, symboliques) par leurs composants placés sur la pile (appelémeta-objets).Une rigidité <strong>de</strong> la syntaxe polonaise est que les fonctions ont toujours un nombrefixe d’arguments 4 , par exemple l’addition a toujours 2 arguments, ainsi a+b+c estobtenu par (a+b)+c ou par a+(b+c) c’est-à-dire respectivement a b + c +ou a b c + + ce qui brise parfois artificiellement la symétrie <strong>de</strong> certaines opérations.En polonaise inversée, le système doit <strong>de</strong> plus jongler avec l’autoquotepuisque les arguments sont évalués avant l’opérateur qui éventuellement <strong>de</strong>man<strong>de</strong>raità ne pas évaluer ses arguments. À noter l’existence d’une comman<strong>de</strong> QUOTEpermettant à l’utilisateur <strong>de</strong> quoter une sous-expression.Les hypothèses sur <strong>de</strong>s variables réelles sont regroupées dans une liste stockéedans la variable globale REALASSUME, on peut supposer qu’une variable est dansun intervalle. Il n’y a pas à ce jour <strong>de</strong> possibilité <strong>de</strong> supposer qu’une variable estentière (ni à fortiori qu’une variable à une valeur modulo un entier fixé), bien qu’ilait été décidé <strong>de</strong> réserver la variable globale INTEGERASSUME à cet effet. Il n’ya pas <strong>de</strong> possibilité <strong>de</strong> faire <strong>de</strong>s hypothèses ayant une portée locale.1.2.2 Calculatrices <strong>formel</strong>les TILe langage utilisé pour programmer ces <strong>calcul</strong>atrices est le langage C (on peutaussi écrire du co<strong>de</strong> en assembleur pour ces <strong>calcul</strong>atrices). On retrouve ici les différentstypes <strong>de</strong> données regroupé en un type générique qui est un tableau d’octets(aussi appelé quantum). Le champ type est appelé tag dans la documentation TI.Contrairement à ce qui précè<strong>de</strong>, ce champ type est placé en mémoire à la fin <strong>de</strong>l’objet, ce qui est possible car la longueur d’un objet est toujours indiquée au début<strong>de</strong> l’objet. Ceci est fait afin <strong>de</strong> faciliter l’évaluation (cf. infra).Les entiers en précision arbitraire sont codés par un tag parmi <strong>de</strong>ux (pour différencierle signe), un octet pour la longueur, puis la valeur absolue <strong>de</strong> l’entier(en base 256). Ils sont donc limités par le champ longueur à 255 octets, le plusgrand entier représentable est 5 (256 255 − 1). Il existe un tag spécifique pour lesrationnels, pour les constantes réelles et entières qui apparaissent par exemple enrésolvant une équation. Il existe <strong>de</strong>s tags utilisés <strong>de</strong> manière interne, par exemplepour les nombres complexes. Il n’y a pas <strong>de</strong> tag prévu pour les flottants en précision4 Sauf si on utilise comme <strong>de</strong>rnier argument le nombre d’arguments <strong>de</strong> la fonction ou si on utilise(cf. infra) un tag <strong>de</strong> début <strong>de</strong> liste d’arguments5 Toutefois une adaptation du logiciel utilisant comme quantum <strong>de</strong> base par exemple 32 bits porteraitcette limite à 65536 65535 − 19


arbitraire. ni pour les nombres algébriques (racines carrées par exemple).Les listes sont codées par la succession <strong>de</strong> leurs éléments. En principe ellesne peuvent pas contenir <strong>de</strong>s listes (sauf pour représenter une matrice). Quelquesfonctions utilisent les listes pour représenter <strong>de</strong>s polynômes <strong>de</strong>nses à une variable,mais probablement pas pour représenter <strong>de</strong> manière récursive <strong>de</strong>s polynômes àplusieurs variables (puisque le type liste n’est en principe pas récursif).Comme les HP, les TI utilisent une pile (non visible par l’utilisateur) appeléeexpression stack afin <strong>de</strong> traduire un expression mathématique sous forme d’un texteen un objet symbolique codé exactement comme ci-<strong>de</strong>ssus en syntaxe polonaise.Toutefois, la présence du champ longueur permet d’évaluer un objet symboliquesans perdre en efficacité en partant <strong>de</strong> l’opérateur final et en re<strong>de</strong>scendant ensuitesur ces arguments, c’est la stratégie adoptée. C’est pour cela que le tag d’i<strong>de</strong>ntificationse trouve à la fin <strong>de</strong> l’objet. L’utilisation <strong>de</strong> cette métho<strong>de</strong> facilite gran<strong>de</strong>mentl’autoquotation (on peut toutefois regretter que le système n’ait pas prévu d’instructionpermettant à l’utilisateur d’empêcher l’évaluation d’une sous-expression).On ne peut pas faire d’hypothèse globale sur un paramètre par contre on peutfaire <strong>de</strong>s hypothèses <strong>de</strong> type appartenance à un intervalle ayant une portée locale.1.2.3 Maple, MuPAD, Mathematica, ...Ces systèmes ont un noyau fermé, au sens où l’utilisateur n’a pas accès du tout,ou en tout cas pas facilement, aux structures <strong>de</strong> données <strong>de</strong> base. Je ne disposedonc pas d’information sur les structures <strong>de</strong> données utilisées par le noyau (pourMuPAD, on pourrait sans doute en savoir plus en achetant <strong>de</strong> la documentation surla programmation <strong>de</strong>s modules dynamiques).L’interaction système-utilisateur se fait quasiment toujours en utilisant le langage<strong>de</strong> programmation propre au système, langage interprété par le noyau du système(ce qui ralentit l’exécution). Ces langages utilisateurs sont essentiellementnon typés : on travaille avec <strong>de</strong>s variables du type générique sans pouvoir accé<strong>de</strong>raux types sous-jacents. On ne bénéficie en général pas <strong>de</strong>s vérifications faites lors<strong>de</strong> la compilation avec un langage typé, <strong>de</strong> plus ces systèmes ne sont pas toujoursfourni avec <strong>de</strong> bon outils <strong>de</strong> mise au point. Enfin ces langages ne sont pas standardisésd’un système à l’autre et il est en général impossible d’utiliser ces systèmescomme <strong>de</strong>s librairies <strong>de</strong>puis un langage <strong>de</strong> programmation traditionnel. Leur intérêtprincipal rési<strong>de</strong> donc dans une utilisation interactive en profitant <strong>de</strong> la librairie<strong>de</strong> fonctions accessibles.1.2.4 Giac/xcasIl s’agit du système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> que j’implémente actuellement sous formed’une bibliothèque C++ (ce qui permettra aux programmes tiers d’utiliser beaucoupplus facilement du <strong>calcul</strong> <strong>formel</strong> qu’avec les systèmes précé<strong>de</strong>nts). L’objectifest d’avoir un système facile à programmer directement en C++, proche du langageutilisateur, lui-même compatible avec Maple ou MuPAD, tout cela sans trop perdreen performances comparativement aux librairies spécialisées écrites en C/C++. Cequi explique un choix <strong>de</strong> type générique (gen) non orienté objet, avec un champtype et soit une donnée immédiate (pour les nombres flottants par exemple), soitun pointeur vers un objet du type correspondant au champ type pour les données10


<strong>de</strong> taille non fixe (on pourrait donc se contenter du langage C, mais le langageC++ permet <strong>de</strong> redéfinir les opérateurs sur <strong>de</strong>s types utilisateurs ce qui amélioreconsidérablement la lisibilité du co<strong>de</strong> source). Les données dynamiques ne sontpas dupliquées, Giac utilise un pointeur sur un compteur <strong>de</strong> référence pour détruireces données lorsqu’elles ne sont plus référencées.Les entiers en précision arbitraire sont hérités <strong>de</strong> la biblioth`que GMP (écriteen C) du projet GNU. Les flottants en précision arbitraire utiliseront aussi GMP(plus précisément MPFR). Il y a un type fraction, structure C composé d’un champnumérateur et d’un champ dénominateur, et un type nombre complexe.Les listes, vecteurs, matrices utilisent le type paramétré vector <strong>de</strong> la librairiestandard C++ (Standard Template Library). Les objets symboliques sont<strong>de</strong>s structures composés d’un champ sommet qui est une fonction prenant un argument<strong>de</strong> type gen et renvoyant un résultat <strong>de</strong> type gen, et d’un champ feuillequi est <strong>de</strong> type gen. Lorsqu’une fonction possè<strong>de</strong> plusieurs arguments, ils sontrassemblés en une liste formant le champ feuille <strong>de</strong> l’objet symbolique. Les programmessont aussi <strong>de</strong>s objets symboliques, dont le champ sommet est la fonctionévaluation d’un programme. Les listes sont aussi utilisées pour représenter vecteurs,matrices et polynômes en une variable en représentation <strong>de</strong>nse, on peut yaccé<strong>de</strong>r par valeur (:=) ou par référence (=


cients entiers, ou <strong>de</strong>s matrices à coefficients entiers...) on utilise souvent <strong>de</strong>s algorithmesmodulaires et p-adiques. Comme le <strong>calcul</strong> exact nécessite presque toujours<strong>de</strong> <strong>calcul</strong>er avec <strong>de</strong>s entiers, ces métho<strong>de</strong>s ont un rôle central en <strong>calcul</strong> <strong>formel</strong>,nous les présentons donc maintenant brièvement. Dans les prochaines sections,nous utiliserons ce type <strong>de</strong> métho<strong>de</strong>, par exemple pour le <strong>calcul</strong> <strong>de</strong> PGCD ou lafactorisation <strong>de</strong> polynômes à coefficients entiers.Les métho<strong>de</strong>s modulaires consistent à réduire un problème dans Z à son équivalentdans Z/nZ pour une ou plusieurs valeurs <strong>de</strong> n, nombre premier. Le <strong>calcul</strong>dans Z/nZ a l’avantage <strong>de</strong> se faire avec <strong>de</strong>s entiers dont la taille est bornée. Ensuiteà l’ai<strong>de</strong> d’estimations à priori sur la taille <strong>de</strong>s solutions éventuelles du problèmeinitial, on reconstruit la solution au problème initial avec le théorème <strong>de</strong>s resteschinois.Par exemple, on peut <strong>calcul</strong>er un déterminant d’une matrice à coefficients entiersen cherchant ce déterminant dans Z/nZ pour plusieurs premiers n, dont leproduit est plus grand qu’une estimation à priori <strong>de</strong> la taille du déterminant (donnéepar exemple par l’inégalité d’Hadamard, cf. Cohen, p. 50).Les métho<strong>de</strong>s p-adiques commencent <strong>de</strong> manière i<strong>de</strong>ntique par un <strong>calcul</strong> dansZ/nZ, on augmente ensuite la précision <strong>de</strong> la solution en la « liftant »<strong>de</strong> Z/n k Zvers Z/n k+1 Z ou vers Z/n 2k Z (lift linéaire ou lift quadratique), on s’arrête lorsquek est assez grand (à l’ai<strong>de</strong> d’estimations à priori) et on reconstruit alors la solutioninitiale. L’étape <strong>de</strong> « lift »est en général un lemme <strong>de</strong> Hensel dont on verra quelquesexemples dans les prochains articles. L’algorithme commun au lemme <strong>de</strong> Hensel etau théorème <strong>de</strong>s restes chinois est l’i<strong>de</strong>ntité <strong>de</strong> Bézout, que l’on retrouve d’ailleursun peu partout (par exemple pour le <strong>calcul</strong> <strong>de</strong> primitives).Illustrons cette métho<strong>de</strong> sur un exemple simple, la recherche <strong>de</strong> racines rationnellesd’un polynôme P(X) = a d X d + · · · + a 0 à coefficients entiers ou polynomiaux,avec a d et a 0 non nuls. L’algorithme générique (assez connu) consiste àchercher les diviseurs <strong>de</strong> a 0 et <strong>de</strong> a d et à tester toutes les fractions <strong>de</strong> ces diviseurs,on montre en effet aisément que si X = p/q fraction irréductible est racine <strong>de</strong> Palors q divise a d et p divise a 0 . Cet algorithme est très inefficace si a d ou a 0 estun grand entier (car on ne sait pas forcément le factoriser) ou s’il a beaucoup <strong>de</strong>facteurs premiers (la liste <strong>de</strong>s diviseurs à tester est alors très gran<strong>de</strong>).Lorsque les coefficients <strong>de</strong> P sont entiers, la recherche précé<strong>de</strong>nte revient àtrouver un facteur à coefficients entiers qX − p <strong>de</strong> P , on peut donc réduire leproblème modulo un entier premier n qui ne divise pas a d : si un tel facteur existedans Z alors ce facteur (réduit modulo n) est un facteur <strong>de</strong> P dans Z/nZ donc Padmet une racine dans Z/nZ (puisque q est inversible modulo n car on a choisi npremier ne divisant pas a d ). On évalue maintenant P en les n éléments <strong>de</strong> Z/nZ.S’il n’y a pas <strong>de</strong> 0, alors P n’a pas <strong>de</strong> racine rationnelle. S’il y a <strong>de</strong>s racines, on vales lifter <strong>de</strong> Z/n k Z dans Z/n 2k Z.On suppose donc que pour k ≥ 1, il existe un entier p k tel queP(p k ) = 0 (mod n k )Il s’agit <strong>de</strong> trouver un entier x tel que p k+1 = p k + n k x vérifieP(p k+1 ) = 0 (mod n 2k )On applique la formule <strong>de</strong> Taylor à l’ordre 1 pour P en p k , le reste est nul modulo12


n 2k , donc :P(p k ) + n k xP ′ (p k ) = 0 (mod n 2k )soit finalement :x = − P(p k)n k (P ′ (p k ) (mod n k )) −1On reconnaît au passage la métho<strong>de</strong> <strong>de</strong> Newton, pour qu’elle fonctionne il suffitque P ′ (p k ) ≠ 0 (mod n) ce qui permet <strong>de</strong> l’inverser modulo n k (et c’est iciqu’intervient l’i<strong>de</strong>ntité <strong>de</strong> Bézout). En pratique quand on factorise un polynôme,on commence par retirer les multiplicités, on peut donc supposer que P est sansfacteur multiple dans Z. Ceci n’entraîne pas forcément qu’il le reste dans Z/nZce qui crée une contrainte supplémentaire sur le choix <strong>de</strong> n, à savoir que P et P ′restent premier entre eux dans Z/nZ (il existe forcément <strong>de</strong> tels n, par exemple npremier plus grand que le plus grand entier intervenant dans le <strong>calcul</strong> du PGCD <strong>de</strong>P et P ′ dans Z).Reste donc à revenir dans Z à partir d’une racine p k dans Z/(n k Z) (où on peutchoisir k). On va maintenant utiliser la représentation modulaire symétrique : onprend comme représentant modulaire d’un entier z dans Z/n k Z l’unique entiercongru à z modulo n qui est strictement compris entre −n k /2 et n k /2 (si n estpair, la <strong>de</strong>uxième inégalité est choisie large).Si qX − p est un facteur <strong>de</strong> P , alors a d X − a dqp est encore un facteur <strong>de</strong>P (le quotient <strong>de</strong> P par a d X − a dqp est à coefficients rationnels mais le facteurest à coefficients entiers). Si on a choisi k tel que n k > 2|a d a 0 |, l’écriture enreprésentation modulaire symétrique <strong>de</strong> a d X − a dqp est inchangée, en effet on a <strong>de</strong>sestimations à priori sur les entiers p et q : |q| ≤ |a d | et |p| ≤ |a 0 | puisque q divisea d et p divise a 0 . Comme a d X − a dqp est égal à a d (X −p k ) dans Z/(n k Z), il noussuffit d’écrire en représentation modulaire symétrique a d (X − p k ) = a d X − p ′ .Pour conclure, on sait que a d X − p ′ est un multiple entier <strong>de</strong> qX − p. On divisedonc le facteur a d X − p ′ par le pgcd <strong>de</strong> a d et p ′ et on teste la divisibilité <strong>de</strong> P parce facteur réduit.ExempleConsidérons le polynôme 2X 3 − X 2 − X − 3 qui est sans facteur carré. On nepeut pas choisir n = 2 car on réduirait le <strong>de</strong>gré, pour n = 3, on a P ′ = X − 1qui est facteur <strong>de</strong> P , pour n = 5, P ′ = 6X 2 − 2X − 1, on vérifie que P et P ′sont premiers entre eux (par exemple avec GCDMOD sur une HP49 où on aura fixéla variable MODULO à 5).On teste ensuite les entiers <strong>de</strong> -2 à 2 sur P . Seul -1 est racine modulo 5(P(−1) = −5), on va maintenant lifter p 1 = −1.L’estimation à priori est 2|a d ||a 0 | = 12 donc k = 2 (5 2 = 25 > 12), uneitération suffira. On a P ′ (−1) = 7, l’inverse <strong>de</strong> P ′ (−1) (mod 5) est -2 donc :x = − P(−1) (−2) = −(−1)(−2) = −25et p 2 = −1 + 5 × (−2) = −11 est racine <strong>de</strong> P dans Z/25Z. On <strong>calcul</strong>e ensuitea d (X − p k ) = 2(X + 11) = 2X + 22 = 2X − 3 en représentation symétrique,le PGCD <strong>de</strong> 2 et -3 est 1 donc on teste le facteur 2X − 3, ici il divise P donc Padmet un unique facteur entier <strong>de</strong> <strong>de</strong>gré 1 qui est 2X − 3.13


2 Quelques algorithmes d’arithmétique <strong>de</strong> base.– Les algorithmes <strong>de</strong> multiplication et division dit rapi<strong>de</strong>s <strong>de</strong>s entiers et polynômes(Karatsuba, FFT, ...). Cf. par exemple Knuth. ou pour les entiers ladocumentation <strong>de</strong> GMP.– Au lieu <strong>de</strong> la division euclidienne, on utilise très souvent la pseudo-divisionpour les polynômes : étant donné <strong>de</strong>ux polynômes A et B <strong>de</strong> <strong>de</strong>grés a etb à coefficients dans un anneau contenu dans un corps (par exemple Z), onmultiplie A par une puissance du coefficient dominant B b <strong>de</strong> B, plus précisémentpar B a−b+1b, ce qui permet d’effectuer la division par B sans que lescoefficients sortent <strong>de</strong> l’anneau.B a−b+1bA = BQ + ROn utilise cette métho<strong>de</strong> lorsqu’on peut multiplier les polynômes par <strong>de</strong>sconstantes sans changer le problème (par exemple pour l’algorithme d’Eucli<strong>de</strong>).– L’algorithme d’Eucli<strong>de</strong> est un algorithme « générique »<strong>de</strong> <strong>calcul</strong> <strong>de</strong> PGCD. Iln’est en général pas utilisé tel quel. Pour les entiers on utilise une variationadaptée à la représentation binaire <strong>de</strong>s entiers (cf. Cohen ou le manuel <strong>de</strong>GMP version 4 pour plus <strong>de</strong> détails). Nous décrirons <strong>de</strong>s algorithmes <strong>de</strong>PGCD plus efficaces pour les polynômes dans le prochain article.– l’i<strong>de</strong>ntité <strong>de</strong> Bézout, aussi appelée PGCD étendu. Étant donné <strong>de</strong>ux entiersou <strong>de</strong>ux polynômes a et b on <strong>calcul</strong>e u, v et d tels que au + bv = d. On écritla matrice : ( ) a 1 0b 0 1où on remarque que pour chaque ligne le coefficient <strong>de</strong> la 1ère colonne estégal à a multiplié par le coefficient <strong>de</strong> la 2ème colonne additionné à b multipliépar le coefficient <strong>de</strong> la 3ème colonne. Ce qui reste vrai si on effectue <strong>de</strong>scombinaisons linéaires <strong>de</strong> lignes (type réduction <strong>de</strong> Gauß). Comme on travailledans les entiers ou les polynômes, on remplace la réduction <strong>de</strong> Gauß<strong>de</strong>s matrices à coefficients réels par une combinaison linéaire utilisant lequotient euclidien q <strong>de</strong> a par b. On obtient alors le reste r en 1ère colonne :L 3 = L 1 − qL 2⎛⎝a 1 0b 0 1r 1 −qet on recommence jusqu’à obtenir 0 en 1ère colonne. L’avant-<strong>de</strong>rnière ligneobtenue est l’i<strong>de</strong>ntité <strong>de</strong> Bézout (la <strong>de</strong>rnière ligne donne le PPCM <strong>de</strong> a etb). Si l’on veut l’inverse <strong>de</strong> a modulo b on remarque qu’il n’est pas utile<strong>de</strong> <strong>calcul</strong>er les coefficients appartenant à la 3ème colonne. Enfin, les lignesintermédiaires peuvent servir à reconstruire une fraction d’entier représentéepar un entier <strong>de</strong> Z/nZ lorsque le numérateur et le dénominateur sont <strong>de</strong>valeur absolue inférieure à √ n/2.– Le théorème <strong>de</strong>s restes chinois. Si on connaît x = a (mod m) et x = b(mod n) avec m et n premiers entre eux, on détermine c tel que x = c(mod m × n) (c = a + mu = b + nv et on applique Bézout pour trouver uet v, on en déduit c).⎞⎠14


– Les tests <strong>de</strong> pseudo-primalité. Il est essentiel d’avoir une métho<strong>de</strong> rapi<strong>de</strong>permettant <strong>de</strong> générer <strong>de</strong>s nombres premiers pour appliquer <strong>de</strong>s métho<strong>de</strong>smodulaires et p-adiques. On utilise par exemple le test <strong>de</strong> Miller-Rabin,qui prolonge le petit théorème <strong>de</strong> Fermat (si p est premier, alors a p = a(mod p)).2.1 Pour en savoir plus.Sur <strong>de</strong>s aspects plus théoriques :– Knuth : TAOCP (The Art of Computer Programming), volumes 1 et suivants– Henri Cohen : A Course in Computational Algebraic Number Theory– Davenport, Siret, Tournier : Calcul <strong>formel</strong> : Systèmes et algorithmes <strong>de</strong> manipulationsalgébriquesSur <strong>de</strong>s aspects plus pratiques, quelques références en ligne, la plupart sontaccessibles gratuitement :– le co<strong>de</strong> source <strong>de</strong> Giac disponible à l’URL :http://www-fourier.ujf-grenoble.fr/~parisse/giac.html– le co<strong>de</strong> source <strong>de</strong> GiNaC, cf. : http://www.ginac.<strong>de</strong>– le site http://www.hpcalc.org pour les <strong>calcul</strong>atrices HP, on y trouvetout, <strong>de</strong> la documentation, <strong>de</strong>s émulateurs <strong>de</strong> <strong>calcul</strong>atrices HP, <strong>de</strong>s outils <strong>de</strong>développement pour Windows et Unix/Linux, ... Pour ce qui concerne cetarticle, je conseille <strong>de</strong> lirehttp://www.hpcalc.org/hp48/docs/programming/rplman.zip– le site http://www.ticalc.org, on y trouve le portage tigcc du compilateurC <strong>de</strong> GNU, <strong>de</strong>s émulateurs, etc. Des informations <strong>de</strong> cet article ontleur source dans le gui<strong>de</strong> du développeur TI89/92http://education.ti.com/– la librairie du système MuPAD (archivée dans le fichier lib.tar <strong>de</strong>s distributionsUnix, pour une installation par défaut, ce fichier se trouve dans le rérpertoire/usr/local/MuPAD/share/lib), cf. www.sciface.compour obtenir une licence d’utilisation.– en Maple, il est possible <strong>de</strong> décompiler une instruction Maple avec la comman<strong>de</strong>eval(instruction);après avoir tapéinterface(verboseproc=2);– le source du plus ancien système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> maxima (<strong>de</strong>venu logiciellibre) pour les personnes familières du langage Lisphttp://sourceforge.net/projects/maxima<strong>de</strong> même pour le système Axiom– le source <strong>de</strong> librairies plus spécialisées (GMP, GP-PARI, Singular, NTL,Zen, ALP, GAP, CoCoA, ...), rechercher ces moms sur google.15


3 Exercices sur types, <strong>calcul</strong> exact et approché, algorithmes<strong>de</strong> basesPour lancer xcas sous Unix, ouvrir un fenêtre terminal et taper la comman<strong>de</strong>xcas &Lors <strong>de</strong> la première exécution, vous <strong>de</strong>vrez choisir entre différents types <strong>de</strong> syntaxe(compatible C, maple ou TI89). Vous pouvez changer ce choix à tout moment enutilisant le menu Configuration->mo<strong>de</strong> (syntaxe).Pour lancer maple, taper xmaple à la place <strong>de</strong> xcas.L’ai<strong>de</strong> en ligne est accessible en tapant ?nom_<strong>de</strong>_comman<strong>de</strong> sur les 2 logiciels.Elle est en francais pour Xcas, en anglais pour maple. Avec Xcas, vouspouvez aussi taper le début d’un nom <strong>de</strong> comman<strong>de</strong> puis la touche <strong>de</strong> tabulation(à gauche du A sur un clavier francais), sélectionner la comman<strong>de</strong> dans la boite<strong>de</strong> dialogues puis cliquer sur Details pour avoir une ai<strong>de</strong> plus complète dans votrenavigateur. Pour plus <strong>de</strong> détails sur l’interface <strong>de</strong> Xcas, consultez le manuel (Ai<strong>de</strong>->Interface). Si vous n’avez jamais utilisé <strong>de</strong> logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>, vous pouvezcommencer par lire le tutoriel (menu Ai<strong>de</strong>->Debuter en <strong>calcul</strong> <strong>formel</strong>->tutoriel)et faire certains <strong>de</strong>s exercices proposés (<strong>de</strong>s corrigés sous forme <strong>de</strong> sessions Xcassont dans Ai<strong>de</strong>->Debuter en <strong>calcul</strong> <strong>formel</strong>->solutions)Il peut être interessant <strong>de</strong> tester ces exercices en parallèle avec Xcas et maple,ou aussi avec <strong>de</strong>s <strong>calcul</strong>atrices <strong>formel</strong>les....1. Utiliser la comman<strong>de</strong> type ou whattype ou équivalent pour déterminerla représentation utilisée par le logiciel pour représenter une fraction, unnombre complexe, un flottant en précision machine, un flottant avec 100 décimales,la variable x, l’expression sin(x)+2, la fonction x->sin(x), uneliste, une séquence, un vecteur, une matrice. Essayez d’accé<strong>de</strong>r aux parties<strong>de</strong> l’objet pour les objets composites (en utilisant op par exemple).2. Comparer le type <strong>de</strong> l’objet t si on effectue la comman<strong>de</strong> t[2]:=0; aprèsavoir purgé t ou après avoir affecté t:=[1,2,3] ?3. Comparer l’effet <strong>de</strong> l’affectation dans une liste et dans un vecteur ou unematrice sur votre logiciel (en Xcas, on peut utiliser =< au lieu <strong>de</strong> := pourstocker par référence).4. Voici un programme écrit en syntaxe compatible maple (menu Cfg->Mo<strong>de</strong>->maple dans Xcas) qui <strong>calcul</strong>e la base utilisée pour représenter les flottants.Base:=proc()local A,B;A:=1.0; B:=1.0;while evalf(evalf(A+1.0)-A)-1.0=0.0 do A:=2*A; od;while evalf(evalf(A+B)-A)-B0 do B:=B+1; od;B;end;Testez-le et expliquez.5. Déterminer le plus grand réel positif x <strong>de</strong> la forme 2 −n (n entier) tel que(1.0 + x) − 1.0 renvoie 0 sur PC avec la précision par défaut puis avecDigits:=30.16


6. Calculer la valeur <strong>de</strong> a := exp(π √ 163) avec 30 chiffres significatifs, puissa partie fractionnaire. Proposez une comman<strong>de</strong> permettant <strong>de</strong> déci<strong>de</strong>r si aest un entier.7. Déterminer la valeur et le signe <strong>de</strong> la fraction rationnelleF(x, y) = 13354 y6 + x 2 (11x 2 y 2 − y 6 − 121y 4 − 2) + 11 2 y8 + x 2yen x = 77617 et y = 33096 en faisant <strong>de</strong>ux <strong>calcul</strong>s, l’un en mo<strong>de</strong> approchéet l’autre en mo<strong>de</strong> exact. Que pensez-vous <strong>de</strong> ces résultats ? Combien<strong>de</strong> chiffres significatifs faut-il pour obtenir un résultat raisonnable en mo<strong>de</strong>approché ?8. À quelle vitesse votre logiciel multiplie-t-il <strong>de</strong>s grands entiers (en fonctiondu nombre <strong>de</strong> chiffres) ? On pourra tester le temps <strong>de</strong> <strong>calcul</strong> du produit <strong>de</strong>a(a + 1) où a = 10000!, a = 15000!, etc.9. Comparer le temps <strong>de</strong> <strong>calcul</strong> <strong>de</strong> a n (mod m) par la fonction powmod et lamétho<strong>de</strong> prendre le reste modulo m après avoir <strong>calcul</strong>é a n .Programmez la métho<strong>de</strong> rapi<strong>de</strong> et la métho<strong>de</strong> lente.Que se passe-t-il si on essaie d’appliquer l’algorithme <strong>de</strong> la puissance rapi<strong>de</strong>pour <strong>calcul</strong>er (x + y + z + 1) 32 ? Calculer le nombre <strong>de</strong> termes dans ledéveloppement <strong>de</strong> (x + y + z + 1) n et expliquez.10. Déterminer un entier c tel que c = 1 (mod 3), c = 3 (mod 5), c = 5(mod 7) et c = 2 (mod 1)1.11. Programmation <strong>de</strong> la métho<strong>de</strong> <strong>de</strong> HornerIl s’agit d’évaluer efficacement un polynômeP(X) = a n X n + ... + a 0en un point. On pose b 0 = P(α) et on écrit :où :P(X) − b 0 = (X − α)Q(X)Q(X) = b n X n−1 + ... + b 2 X + b 1On <strong>calcul</strong>e alors par ordre décroissant b n , b n−1 , ..., b 0 .(a) Donner b n en fonction <strong>de</strong> a n puis pour i ≤ n − 1, b i en fonction <strong>de</strong> a iet b i+1 . Indiquez le détail <strong>de</strong>s <strong>calcul</strong>s pour P(X) = X 3 − 2X + 5 etune valeur <strong>de</strong> α non nulle.(b) Écrire un fonction horn effectuant ce <strong>calcul</strong> : on donnera en argumentsle polynôme sous forme <strong>de</strong> la liste <strong>de</strong> ces coefficients (dans l’exemple[1,0,-2,5]) et la valeur <strong>de</strong> α et le programme renverra P(α). (Onpourra aussi renvoyer les coefficients <strong>de</strong> Q).(c) En utilisant cette fonction, écrire une fonction qui <strong>calcul</strong>e le développement<strong>de</strong> Taylor complet d’un polynôme en un point.17


4 Le PGCDComme on l’a remarqué dans le premier article, l’algorithme d’Eucli<strong>de</strong> est inefficacepour <strong>calcul</strong>er le pgcd <strong>de</strong> <strong>de</strong>ux polynômes à coefficients entiers. On va présenterici les algorithmes utilisés habituellement par les systèmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> :sous-résultant (PRS), modulaire (GCDMOD), p-adique (EEZGD) et heuristique(GCDHEU). Le premier est une adaptation <strong>de</strong> l’algorithme d’Eucli<strong>de</strong> et s’adapte à<strong>de</strong>s coefficients assez génériques. Les trois autres ont en commun d’évaluer une ouplusieurs variables du polynôme (dans ce <strong>de</strong>rnier cas il est nécessaire <strong>de</strong> bien distinguerle cas <strong>de</strong> polynômes à plusieurs variables) et <strong>de</strong> reconstruire le pgcd par <strong>de</strong>stechniques distinctes, la plupart du temps ces algorithmes fonctionnent seulementsi les coefficients sont entiers.Soit donc P et Q <strong>de</strong>ux polynômes à coefficients dans un corps. Le pgcd <strong>de</strong>P et Q n’est défini qu’à une constante près. Mais lorsque les coefficients <strong>de</strong> Pet Q sont dans un anneau euclidien comme par exemple Z ou Z[i], on appellepgcd <strong>de</strong> P et Q un polynôme D tel que P/D et Q/D soient encore à coefficientsdans l’anneau, et que D soit optimal, c’est-à-dire que si un multiple µD <strong>de</strong> Dvérifie P/µD et Q/µD sont à coefficients dans l’anneau, alors µ est inversible.La première étape d’un algorithme <strong>de</strong> <strong>calcul</strong> <strong>de</strong> pgcd consiste donc à diviser par lepgcd <strong>de</strong>s coefficients entiers <strong>de</strong> chaque polynôme.Exemple : P = 4X 2 − 4 et Q = 6X 2 + 12X + 6. Le polynôme X + 1 estun pgcd <strong>de</strong> P et Q puisqu’il est <strong>de</strong> <strong>de</strong>gré maximal divisant P et Q mais le pgcd <strong>de</strong>P et Q est 2(X + 1). Remarquons qu’avec notre définition −2(X + 1) convientaussi. Par convention on appelera pgcd le polynôme ayant un coefficient dominantpositif.Définition : On appelle contenu c(P) d’un polynôme P le pgcd <strong>de</strong>s coefficients<strong>de</strong> P . On définit alors la partie primitive <strong>de</strong> P : pp(P) = P/c(P). Si c(P) = 1, ondit que P est primitif. On montre que :D = pgcd(P, Q) = pgcd(c(P), c(Q))pgcd(pp(P), pp(Q))4.1 Le sous-résultant.La première idée qui vient à l’esprit pour améliorer l’efficacité <strong>de</strong> l’algorithmed’Eucli<strong>de</strong> consiste à éviter les fractions qui sont créées par les divisions euclidiennes.On utilise à cet effet la pseudo-division : au lieu <strong>de</strong> prendre le reste R <strong>de</strong>la division euclidienne du polynôme P par Q, on prend le reste <strong>de</strong> la division <strong>de</strong>Pq δ+1 par Q, où q désigne le coefficient dominant <strong>de</strong> Q et δ la différence entre le<strong>de</strong>gré <strong>de</strong> P et <strong>de</strong> Q.Exercice : En utilisant votre système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> préféré, <strong>calcul</strong>ez lesrestes intermédiaires générés dans l’algorithme d’Eucli<strong>de</strong> lorsqu’on utilise la pseudodivisionpar exemple pour les polynômes P(x) = (x+1) 7 −(x−1) 6 et sa dérivée.Une solution avec giac/xcas :// -*- mo<strong>de</strong>:C++ -*- a,b 2 polynomes -> pgcd <strong>de</strong> a et bpgcd(a,b):={local P,p,Q,q,R,g,h,d;// convertit a et b en polynomes listes et extrait la partie primitiveP:=symb2poly1(a);18


p:=lgcd(P); // pgcd <strong>de</strong>s elements <strong>de</strong> la listeP:=P/p;Q:=symb2poly1(b);q:=lgcd(Q);Q:=Q/q;if (size(P)


– Si R est constant, on sort <strong>de</strong> l’algorithme en renvoyant 1 comme pgcd– on recopie Q dans P puis R/(gh δ ) dans Q– on recopie q dans g et h 1−δ q δ dans h.Si on sort normalement <strong>de</strong> la boucle, Q est nul, on renvoie donc la partie primitive<strong>de</strong> P qui est le pgcd cherché.Pour tester l’algorithme avec xcas, il suffit <strong>de</strong> décommenter les <strong>de</strong>ux lignesQ :=R/(g*hˆd) ; et g :=q ; h :=qˆd/hˆ(d-1) ; ci-<strong>de</strong>ssus.La preuve <strong>de</strong> l’algorithme est un peu longue et par ailleurs bien expliquée dansle 2ème tome <strong>de</strong> Knuth (The Art of Computer Programming, Semi-numerical Algorithms),on y renvoie donc le lecteur intéressé. L’idée générale (et l’origine dunom <strong>de</strong> l’algorithme) est <strong>de</strong> considérer la matrice <strong>de</strong> Sylvester <strong>de</strong>s polynômes <strong>de</strong>départ P et Q (celle dont le déterminant est appelé résultant <strong>de</strong> P et Q) et <strong>de</strong>traduire les pseudo-divisions qui permettent <strong>de</strong> <strong>calcul</strong>er les restes successifs dusous-résultant en opération <strong>de</strong> ligne sur ces matrices. On démontre alors que lescoefficients <strong>de</strong> R divisés par gh δ peuvent être interprétés comme <strong>de</strong>s déterminants<strong>de</strong> sous-matrices <strong>de</strong> la matrice <strong>de</strong> Sylvester après réduction et c’est cela qui permet<strong>de</strong> conclure qu’ils sont entiers.Par exemple, supposons que P = R 0 , Q = R 1 , R 2 ... diminuent <strong>de</strong> 1 en <strong>de</strong>gréà chaque division (c’est le cas générique dans le déroulement <strong>de</strong> l’algorithmed’Eucli<strong>de</strong>). Dans ce cas, δ = 1, il s’agit par exemple <strong>de</strong> montrer que le reste R 3<strong>de</strong> Q = R 1 par R 2 est divisible par le carré du coefficient dominant <strong>de</strong> Q = R 1 .Voyons comment on obtient les coefficients <strong>de</strong> R 3 à partir <strong>de</strong> la matrice <strong>de</strong> Sylvester<strong>de</strong> P et Q. Prenons la sous-matrice constituée <strong>de</strong>s 2 premières lignes <strong>de</strong> P et<strong>de</strong>s 3 premières lignes <strong>de</strong> Q et réduisons-la sous forme échelonnée sans introduire<strong>de</strong> dénominateur.⎛⎜⎝p n p n−1 p n−2 p n−3 ...0 p n p n−1 p n−2 ...q n−1 q n−2 q n−3 q n−4 ...0 q n−1 q n−2 q n−3 ...0 0 q n−1 q n−2 ...On effectue L 1 ← q n−1 L 1 − p n L 3 et L 2 ← q n−1 L 2 − p n L 4 , ce qui correspond àl’élimination du terme en x du quotient <strong>de</strong> P par Q⎛⎜⎝on effectue ensuite0 q n−1 p n−1 − p n q n−2 ... ... ...0 0 q n−1 p n−1 − p n q n−2 ... ...q n−1 q n−2 q n−3 q n−4 ...0 q n−1 q n−2 q n−3 ...0 0 q n−1 q n−2 ...⎞⎟⎠L 1 ← q n−1 L 1 − (q n−1 p n−1 − p n q n−2 )L 4L 2 ← q n−1 L 2 − (q n−1 p n−1 − p n q n−2 )L 5⎞⎟⎠20


ce qui correspond à l’élimination du terme constant du quotient <strong>de</strong> P par Q, onobtient ⎛⎞0 0 r 2,n−2 ... ...0 0 0 r 2,n−2 ...⎜ q n−1 q n−2 q n−3 q n−4 ...⎟⎝ 0 q n−1 q n−2 q n−3 ... ⎠0 0 q n−1 q n−2 ...si on enlève les lignes 3 et 4, et les colonnes 1 et 2, on obtient (après échanges <strong>de</strong>lignes) une sous-matrice <strong>de</strong> la matrice <strong>de</strong> Sylvester <strong>de</strong> Q et R 2⎛q n−1 q n−2⎞...⎝ r 2,n−2 ... ... ⎠0 r 2,n−2 ...On recommence les opérations <strong>de</strong> réduction <strong>de</strong> cette sous-matrice correspondant àla division euclidienne <strong>de</strong> Q par R 2 , on obtient⎛0 0⎞r 3,n−3⎝ r 2,n−2 ... ... ⎠0 r 2,n−2 ...puis après suppression <strong>de</strong>s colonnes 1 et 2 et <strong>de</strong>s lignes 2 et 3 la ligne <strong>de</strong>s coefficients<strong>de</strong> R 3 .Supposons qu’on se limite dès le début <strong>de</strong> la réduction à ne gar<strong>de</strong>r que lescolonnes 1 à 4 et une 5-ième colonne parmi les suivantes, on obtient à la fin <strong>de</strong>la réduction une matrice 1,1 qui contient un <strong>de</strong>s coefficients <strong>de</strong> R 3 (selon le choix<strong>de</strong> la 5-ième colonne). Donc ce coefficient est égal au déterminant <strong>de</strong> la matrice1,1 qui est égal, au signe près, au déterminant <strong>de</strong> la matrice 3,3 dont il est issupar notre réduction (en effet, dans la 2ième partie <strong>de</strong> la réduction, on a multiplié<strong>de</strong>ux fois L 1 par r 2,n−2 , mais on doit ensuite diviser le déterminant par r2,n−22pour éliminer les colonnes 1 et 2). Quant au déterminant <strong>de</strong> la matrice 3,3, il sedéduit du déterminant <strong>de</strong> la matrice 5,5 par multiplication par qn−1 4 (2 lignes ontété multipliées 2 fois par q n−1 ) et division par qn−1 2 (élimination <strong>de</strong>s colonnes 1 et2). Au final, tout coefficient <strong>de</strong> R 3 est égal au produit d’un déterminant 5,5 extrait<strong>de</strong> la matrice <strong>de</strong> Sylvester <strong>de</strong> P et Q par qn−1 2 , qui est justement le coefficient“magique” par lequel on divise le reste <strong>de</strong> R 1 = Q par R 2 lors <strong>de</strong> l’algorithme dusous-résultant.4.2 Le pgcd en une variable.4.2.1 Le pgcd heuristique.On suppose ici que les coefficients sont entiers ou entiers <strong>de</strong> Gauss. On peutdonc se ramener au cas où les polynômes sont primitifs.L’idée consiste à évaluer P et Q en un entier z et à extraire <strong>de</strong>s informations dupgcd g <strong>de</strong>s entiers P(z) et Q(z). Il faut donc un moyen <strong>de</strong> remonter <strong>de</strong> l’entier g àun polynôme G tel que G(z) = g. La métho<strong>de</strong> consiste à écrire en base z l’entierg, avec une particularité dans les divisions euclidiennes successives on utilise le21


este symétrique (compris entre −z/2 et z/2). Cette écriture donne les coefficientsd’un polynôme G unique. On extrait ensuite la partie primitive <strong>de</strong> ce polynôme G.Lorsque z est assez grand par rapport aux coefficients <strong>de</strong>s polynômes P et Q, sipp(G) divise P et Q, on va montrer que le pgcd <strong>de</strong> P et <strong>de</strong> Q est D = pp(G).On remarque tout d’abord que d := D(z) divise g. En effet D divise P et Qdonc pour tout entier (ou entier <strong>de</strong> Gauss) z, D(z) divise P(z) et Q(z). Il existedonc une constante a telle queg = adOn a aussi pp(G) divise D. Il existe donc un polynôme C tel que :D = pp(G)CNous <strong>de</strong>vons prouver que C est un polynôme constant. On suppose dans la suiteque ce n’est pas le cas. Evaluons l’égalité précé<strong>de</strong>nte au point z, on obtientFinalementd =gc(G) C(z)1 = ac(G) C(z)La procédure <strong>de</strong> construction <strong>de</strong> G nous donne une majoration <strong>de</strong> ces coefficientspar |z|/2, donc <strong>de</strong> c(G) par |z|/2, donc C(z) divise un entier <strong>de</strong> module plus petitque |z|/2, donc|C(z)| |z|2On considère maintenant les racines complexes z 1 , . . .., z n du polynôme C (il enexiste au moins une puisqu’on a supposé C non constant). On a :C(X) = c n (X − z 1 )....(X − z n )Donc, comme c n est un entier (ou entier <strong>de</strong> Gauss) non nul, sa norme est supérieureou égale à 1 et :n∏|C(z)| (|z| − |z j |)j=1Il nous reste à majorer les racines <strong>de</strong> C pour minorer |C(z)|. Comme C divise Dil divise P et Q donc les racines <strong>de</strong> C sont <strong>de</strong>s racines communes à P et Q. On vaappliquer le :Lemme 1 Soit x une racine complexe d’un polynôme P = a n X n + . . .. + a 0 .Alors|x| < |P | + 1, |P | = max|a n | (|a i|)0inApplication du lemme à C(X) : on a 1/|c n | ≤ 1 donc si on a choisi z tel que|z| 2 min(|P |, |Q|) + 2, alors pour tout j, |z j | < |z|/2 donc( ) |z| n|C(z)| >2qui contredit notre majoration <strong>de</strong> |C(z)|.22


Théorème 1 Soit P et Q <strong>de</strong>ux polynômes à coefficients entiers. On choisit un entierz tel que |z| 2 min(|P |, |Q|) + 2, si la partie primitive du polynôme Greconstruit à partir du pgcd <strong>de</strong> P(z)etQ(z) par écriture en base z (avec commereste euclidien le reste symétrique) divise P et Q alors c’est le pgcd <strong>de</strong> P et Q.Pour finir la démonstration du théorème, il nous faut encore montrer le lemme.On a−a n x n = a n−1 x n−1 + . . . . + a 0Donc|a n ||x| n |P |(1 + . . .. + |x| n−1 ) = |P | |x|n − 1|x| − 1Ici on peut supposer que |x| 1, sinon le lemme est démontré, donc |x| − 1 estpositif et|a n |(|x| − 1) |P | |x|n − 1|x| n ⇒ |x| − 1 < |P ||a n |Remarques– Le théorème publié par Char, Ged<strong>de</strong>s et Gonnet porte sur <strong>de</strong>s coefficientsentiers et c’est comme cela qu’il est utilisé par les systèmes <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>(en commençant historiquement par Maple). Peu <strong>de</strong> systèmes l’utilisentpour les polynômes à coefficients entiers <strong>de</strong> Gauss. On peut d’ailleurs généraliserle théorème à d’autres types <strong>de</strong> coefficients, à condition d’avoir unanneau euclidien plongé dans C avec une minoration sur la valeur absolue<strong>de</strong>s élements non nuls <strong>de</strong> l’anneau.– Nous n’avons jusqu’à présent aucune certitu<strong>de</strong> qu’il existe <strong>de</strong>s entiers z telsque la partie primitive <strong>de</strong> G divise P et Q. Nous allons montrer en utilisantl’i<strong>de</strong>ntité <strong>de</strong> Bézout que pour z assez grand c’est toujours le cas. Plusprécisément, on sait qu’il existe <strong>de</strong>ux polynômes U et V tels quePU + QV = DAttention toutefois, U et V sont à coefficients rationnels, pour avoir <strong>de</strong>s coefficientsentiers, on doit multiplier par une constante entière α, donc enévaluant en z on obtient l’existence d’une égalité à coefficients entiersP(z)u + Q(z)v = αD(z)Donc le pgcd g <strong>de</strong> P(z) et Q(z) divise αD(z) = αd. Comme g est unmultiple <strong>de</strong> d, on en déduit que g = βd, où β est un diviseur <strong>de</strong> α. Si on achoisi z tel que|z| > 2|D||α|alors |z| > 2|D||β| donc l’écriture symétrique en base z <strong>de</strong> g est G = βD.Donc la partie primitive <strong>de</strong> G est D, le pgcd <strong>de</strong> P et Q.Exemple 1 Si P 0 = 6(X 2 − 1) et Q 0 = 4(X 3 − 1).Le contenu <strong>de</strong> P 0 est 6, celui <strong>de</strong> Q 0 est 4.On a donc pgcd <strong>de</strong>s contenus = 2, P = X 2 −1, Q = X 3 −1. La valeur initiale <strong>de</strong>z est donc 2 ∗1+2 = 4. On trouve P(4) = 15, Q(4) = 63. Le pgcd entier <strong>de</strong> 15 et63 est 3 que nous écrivons symétriquement en base 4 sous la forme 3 = 1 ∗ 4 − 1,donc G = X − 1, sa partie primitive est X − 1. On teste si X − 1 divise P et Q,c’est le cas, donc c’est le pgcd <strong>de</strong> P et Q et le pgcd <strong>de</strong> P 0 et Q 0 est 2(X − 1).23


Algorithme gcdheuEn arguments <strong>de</strong>ux polynômes P 0 et Q 0 à coefficients entiers ou entiers <strong>de</strong> Gauss.Retourne le pgcd <strong>de</strong> P 0 et Q 0 ou faux en cas d’échec.1. Calculer le contenu <strong>de</strong> P 0 et Q 0 . Vérifier que les coefficients sont entiers <strong>de</strong>Gauss sinon retourner faux.2. Extraire la partie primitive P <strong>de</strong> P 0 et Q <strong>de</strong> Q 0 , <strong>calcul</strong>er le pgcd c <strong>de</strong>s contenus<strong>de</strong> P 0 et Q 03. Déterminer z = 2 min(|P |, |Q|) + 2.4. Début <strong>de</strong> boucle : initialisation du nombre d’essais à 1, test d’arrêt sur unnombre maximal d’essais, avec changement <strong>de</strong> z entre <strong>de</strong>ux itérations (parexemple z ← 2z).5. Calculer le pgcd g <strong>de</strong> P(z) et Q(z) puis son écriture symétrique en base zdont on extrait la partie primitive G.6. Si GnedivisepasP passer à l’itération suivante. De même pour Q.7. Retourner cG8. Fin <strong>de</strong> la boucle9. Retourner faux.On remarque au passage qu’on a <strong>calcul</strong>é le quotient <strong>de</strong> P par G et le quotient <strong>de</strong> Qpar G lorsque la procédure réussit. On peut donc passer à la procédure gcdheu <strong>de</strong>uxparamètres supplémentaires par référence, les <strong>de</strong>ux polynômes que l’on affecteraen cas <strong>de</strong> succès, ce qui optimise la simplification d’une fraction <strong>de</strong> 2 polynômes.4.2.2 Le pgcd modulaireOn part du fait que si D est le pgcd <strong>de</strong> P et Q dans Z (ou Z[i]) alors aprèsréduction modulo un nombre premier n qui ne divise pas les coefficients dominants<strong>de</strong> P et Q, D divise le pgcd G <strong>de</strong> P et Q dans Z/nZ (par convention, le pgcd dansZ/nZ est normalisé pour que son coefficient dominant vaille 1). Comme on <strong>calcul</strong>eG dans Z/nZ, les coefficients <strong>de</strong>s restes intermédiaires <strong>de</strong> l’algorithme d’Eucli<strong>de</strong>sont bornés, on évite ainsi la croissance exponentielle <strong>de</strong>s coefficients. Il faudraensuite reconstruire D à partir <strong>de</strong> G.On remarque d’abord que si on trouve G = 1, alors P et Q sont premiers entreeux. En général, on peut seulement dire que le <strong>de</strong>gré <strong>de</strong> G est supérieur ou égalau <strong>de</strong>gré <strong>de</strong> D. En fait, le <strong>de</strong>gré <strong>de</strong> G est égal au <strong>de</strong>gré <strong>de</strong> D lorsque les restes <strong>de</strong>l’algorithme d’Eucli<strong>de</strong> (<strong>calcul</strong>é en effectuant <strong>de</strong>s pseudo-divisions, cf. l’exercice1) ont leur coefficient dominant non divisible par n. Donc plus n est grand, plus laprobabilité est gran<strong>de</strong> <strong>de</strong> trouver G du bon <strong>de</strong>gré.Dans la suite, nous allons déterminer une borne b à priori majorant les coefficients<strong>de</strong> D. On utilisera ensuite la même métho<strong>de</strong> que dans l’algorithme modulaire<strong>de</strong> recherche <strong>de</strong> racines évi<strong>de</strong>ntes : on multiplie G dans Z/nZ par le pgcd dans Z<strong>de</strong>s coefficients dominants p et q <strong>de</strong> P et Q. Soit ˜D = pgcd(p, q)G le résultatécrit en représentation symétrique. Si n bpgcd(p, q) et si G est du bon <strong>de</strong>gré, onmontre <strong>de</strong> la même manière que D = ˜D. Comme on ne connait pas le <strong>de</strong>gré <strong>de</strong> D,on est obligé <strong>de</strong> tester si ˜D divise P et Q. Si c’est le cas, alors ˜D divise D donc24


˜D = D puisque <strong>de</strong>gre( ˜D) = <strong>de</strong>gre(G) <strong>de</strong>gre(D). Sinon, n est un nombre premiermalchanceux pour ce <strong>calcul</strong> <strong>de</strong> pgcd (<strong>de</strong>gre(G) <strong>de</strong>gre(D)), il faut essayerun autre premier.Remarque : On serait tenté <strong>de</strong> dire que les coefficients <strong>de</strong> D sont bornés parle plus grand coefficient <strong>de</strong> P . C’est malheureusement faux, par exemple (X +1) 2dont le plus grand coefficient est 2 divise (X + 1) 2 (X − 1) dont le plus grandcoefficient (en valeur absolue) est 1.Soit P = ∑ p i X i un polynôme à coefficients entiers. On utilise la normeeuclidienne|P | 2 = ∑ |p i | 2 (1)On établit d’abord une majoration du produit <strong>de</strong>s racines <strong>de</strong> norme supérieure à 1<strong>de</strong> P à l’ai<strong>de</strong> <strong>de</strong> |P |. Ensuite si D est un diviseur <strong>de</strong> P , le coefficient dominant d <strong>de</strong>D divise le coefficient dominant p <strong>de</strong> P et les racines <strong>de</strong> D sont aussi <strong>de</strong>s racines<strong>de</strong> P . On pourra donc déterminer une majoration <strong>de</strong>s polynômes symétriques <strong>de</strong>sracines <strong>de</strong> D et donc <strong>de</strong>s coefficients <strong>de</strong> D.Lemme 2 Soit A = ∑ aj=0 a jX j un polynôme et α ∈ C. Alors|(X − α)A| = |(αX − 1)A|Pour prouver le lemme 2, on développe les produits <strong>de</strong> polynômes. On posea −1 = a a+1 = 0 et on note R la partie réelle.∑a+1∑a+1|(X − α)A| 2 = |a j−1 − αa j | 2 = |a j−1 | 2 + |α| 2 |a j | 2 − 2R(a j−1 αa j )j=0j=0∑a+1∑a+1|(αX − 1)A| 2 = |αa j−1 − a j | 2 = |α| 2 |a j−1 | 2 + |a j | 2 − 2R(αa j−1 a j )j=0j=0Les <strong>de</strong>ux donnent bien le même résultat.Soit P(X) = p ∏ (X − α j ) la factorisation <strong>de</strong> P sur C. On introduit le polynôme∏ ∏˜P = p (X − α j ) (α j X − 1)j/|α j |1j/|α j |


Pour majorer |d m−j |, on commence par majorer |δ k | par β k = max(1, |δ k |). Onest donc ramené à majorerσ j,m (β) =∑choix<strong>de</strong>jparmimvaleursβ k∏β k ∈choixβ kavec pour hypothèse une majoration <strong>de</strong> M = ∏ mk=1 β k donnée par la relation(2). Pour cela, on cherche le maximum <strong>de</strong> σ j,m (β) sous les contraintes M fixé etβ k 1.On va montrer que le maximum ne peut être atteint que si l’un <strong>de</strong>s β k = M(et tous les autres β k = 1). Sinon, quitte à réordonner supposons que les β k sontclassés par ordre croissant. On a donc β m−1 ≠ 1, on pose ˜β k = β k pour k m−2,˜β m−1 = 1 et ˜β m = β m−1 β m . Comparons σ j,m (β) et σ j,nm(˜β). Si le choix <strong>de</strong> jparmi m comporte k = m − 1 et k = m, le produit est inchangé. Sinon on a lasomme <strong>de</strong> <strong>de</strong>ux produits, l’un contenant k = m − 1 et l’autre k = m. On comparedonc B(β m−1 +β m ) et B(1+β m−1 β m ) avec B = ∏ β k ∈resteduchoix β k. Comme1 + β m−1 β m β m−1 + β mpuisque la différence est le produit (1 − β m )(1 − β m−1 ) <strong>de</strong> <strong>de</strong>ux nombres positifs,on arrive à la contradiction souhaitée.Ensuite on décompose les choix <strong>de</strong> σ m,j en ceux contenant M et <strong>de</strong>s 1 et ceuxne contenant que <strong>de</strong>s 1, d’où la majorationσ j,m (β) ( m − 1j − 1)M +( m − 1j)et finalement(( m − 1|d m−j | |d|j − 1) ( |P | m − 1|p| + j))(3)On peut en déduire une majoration indépendante <strong>de</strong> j sur les coefficients <strong>de</strong> D,en majorant |d| par |p| (puisque d divise p) et les coefficients binomiaux par 2 m−1(obtenue en développant (1 + 1) m−1 ). D’où leThéorème 2 (Landau-Mignotte) Soit P un polynôme à coefficients entiers (ou entiers<strong>de</strong> Gauss) et D un diviseur <strong>de</strong> P <strong>de</strong> <strong>de</strong>gré m. Si |P | désigne la norme euclidiennedu vecteur <strong>de</strong>s coefficients <strong>de</strong> P et p le coefficient dominant <strong>de</strong> P alors lescoefficients d j <strong>de</strong> D satisfont l’inégalité|d j | 2 m−1 (|P | + |p|) (4)Avec cette estimation, on en déduit que si n est un premier plus grand que()min 2 <strong>de</strong>gre(P)−1 (|P | + |p|), 2 <strong>de</strong>gre(Q)−1 (|Q| + |q|) , (5)alors le pgcd trouvé dans Z/nZ va se reconstruire en un pgcd dans Z si son <strong>de</strong>gréest le bon.Malheureusement la borne précé<strong>de</strong>nte est souvent très gran<strong>de</strong> par rapport auxcoefficients du pgcd et <strong>calcul</strong>er dans Z/nZ s’avèrera encore inefficace (surtout si26


le pgcd est 1). Cela reste vrai même si on optimise un peu la majoration (5) enrepartant <strong>de</strong> (3).L’idée est donc <strong>de</strong> travailler modulo plusieurs nombres premiers plus petits etreconstruire le pgcd <strong>de</strong>s 2 polynômes à coefficients entiers à partir <strong>de</strong>s pgcd <strong>de</strong>spolynômes dans Z/nZ et du théorème <strong>de</strong>s restes chinois. En pratique on prend <strong>de</strong>snombres premiers inférieurs à la racine carrée du plus grand entier hardware <strong>de</strong> lamachine (donc plus petits que 2 16 sur une machine 32 bits) ce qui permet d’utiliserl’arithmétique hardware du processeur sans risque <strong>de</strong> débor<strong>de</strong>ment.Algorithme du PGCD modulaire en 1 variable :En argument : 2 polynômes primitifs P et Q à coefficients entiers. Le résultatrenvoyé sera le polynôme pgcd.Variable auxiliaire : un entier N initialisé à 1 qui représente le produit <strong>de</strong>snombres premiers utilisés jusqu’ici et un polynôme H initialisé à 0 qui représentele pgcd dans Z/NZ.Boucle infinie :1. Chercher un nouveau nombre premier n qui ne divise pas les coefficientsdominants p et q <strong>de</strong> P et Q2. Calculer le pgcd G <strong>de</strong> P et Q dans Z/nZ. Si G=1, renvoyer 1.3. Si H = 0 ou si le <strong>de</strong>gré <strong>de</strong> G est plus petit que le <strong>de</strong>gré <strong>de</strong> H, recopier Gdans H et n dans N, passer à la 6ème étape4. Si le <strong>de</strong>gré <strong>de</strong> G est plus grand que celui <strong>de</strong> H passer à l’itération suivante5. Si le <strong>de</strong>gré <strong>de</strong> G est égal au <strong>de</strong>gré <strong>de</strong> H, en utilisant le théorème <strong>de</strong>s resteschinois, <strong>calcul</strong>er un polynôme ˜H tel que ˜H = H modulo N et ˜H = Gmodulo n. Recopier ˜H dans H et nN dans N.6. Ecrire pgcd(p, q)H en représentation symétrique. Soit ˜H le résultat renduprimitif. Tester si ˜H divise P et Q. Si c’est le cas, renvoyer ˜H, sinon passerà l’itération suivante.Finalement on n’a pas utilisé b, la borne <strong>de</strong> Landau-Mignotte. On peut penser quel’étape 6 ne <strong>de</strong>vrait être effectuée que lorsque N est plus grand que pgcd(p, q)b.En pratique, on effectue le test <strong>de</strong> l’étape 6 plus tôt parce que les coefficients dupgcd sont rarement aussi grand que b. Mais pour éviter <strong>de</strong> faire le test trop tôt,on introduit une variable auxiliaire H ′ qui contient la valeur <strong>de</strong> H <strong>de</strong> l’itérationprécé<strong>de</strong>nte et on ne fait le test que si H ′ = H (ou bien sûr si on a dépassé laborne).Remarque :L’algorithme ci-<strong>de</strong>ssus fonctionne également pour <strong>de</strong>s polynômes à plusieursvariables.Exemple 1 :Calcul du pgcd <strong>de</strong> (X + 1) 3 (X − 1) 4 et (X 4 − 1). Prenons pour commencern = 2. On trouve comme pgcd X 4 + 1 (en effet −1 = 1 donc on cherchait le pgcd<strong>de</strong> (X + 1) 7 et <strong>de</strong> X 4 + 1 = (X + 1) 4 ). On teste si X 4 + 1 divise P et Q, ce n’estpas le cas donc on passe au nombre premier suivant. Pour n = 3, on trouve X 2 −1.Donc n = 2 n’était pas un bon nombre premier pour ce <strong>calcul</strong> <strong>de</strong> pgcd puisqu’ona trouvé un pgcd <strong>de</strong> <strong>de</strong>gré plus petit. On teste si X 2 − 1 divise P et Q, c’est le casici donc on peut arrêter, le pgcd cherché est X 2 − 1.Exemple 2 :27


Calcul du pgcd <strong>de</strong> (X + 1) 3 (X − 1) 4 et (X 4 − 1) 3 . Pour n = 2, on trouveun polynôme <strong>de</strong> <strong>de</strong>gré 7. Pour n = 3, on trouve X 6 − 1 donc n = 2 était unemauvaise réduction. Comme X 6 − 1 ne divise pas P et Q, on passe à n = 5. Ontrouve X 6 +2X 4 −2X 2 −1. On applique le théorème <strong>de</strong>s restes chinois qui va nousdonner un polynôme dans Z/15Z. On cherche donc un entier congru à 2 modulo5 et à 0 modulo 3, -3 est la solution (écrite en représentation symétrique), donc lepolynôme modulo 15 est X 6 −3X 4 +3X 2 −1 = (X 2 −1) 3 . Ce polynôme diviseP et Q, c’est donc le pgcd <strong>de</strong> P et <strong>de</strong> Q.4.3 Le pgcd à plusieurs variables.4.3.1 Le pgcd heuristique.On suppose comme dans le cas à une variable que les polynômes sont primitifs,donc qu’on a simplifié les polynômes par le pgcd entier <strong>de</strong> leurs coefficients entiers.Le principe est i<strong>de</strong>ntique à celui du PGCD à 1 variable, on évalue les <strong>de</strong>uxpolynômes P et Q <strong>de</strong> k variables X 1 , . . .., X k en un X k = z et on <strong>calcul</strong>e lepgcd g <strong>de</strong>s 2 polynômes P(z) et Q(z) <strong>de</strong> k − 1 variables. On remonte ensuite àun polynôme G par écriture symétrique en base z <strong>de</strong> g et on teste si pp(G) diviseP et Q. Il s’agit à nouveau <strong>de</strong> montrer que si z est assez grand, alors pp(G) estle pgcd cherché. On sait que d = D(z) divise g. Il existe donc un polynôme a <strong>de</strong>k − 1 variables tel que g = ad. On sait aussi que pp(G) divise D, donc il existe unpolynôme C <strong>de</strong> k variables tel que D = C ∗ pp(G). On évalue en z et on obtientd = C(z)g/c(G), où c(G) est un entier, doncc(G) = a ∗ C(z)Comme c(G) est un entier, a et C(z) sont <strong>de</strong>s polynômes constants. Comme précé<strong>de</strong>mment,on a aussi |C(z)| |z|/2 puisque |c(G)| |z|/2.– Premier cas : si C ne dépend que <strong>de</strong> la variable X k . On continue le raisonnementcomme dans le cas unidimensionnel.– Deuxième cas : si C dépend d’une autre variable, par exemple X 1 . On regar<strong>de</strong>le coefficient <strong>de</strong> plus haut <strong>de</strong>gre <strong>de</strong> C par rapport a X 1 . Ce coefficientdivise le coefficient <strong>de</strong> plus haut <strong>de</strong>gre <strong>de</strong> P et <strong>de</strong> Q par rapport a X 1 .Comme C(z) est constant, on en <strong>de</strong>duit que le coefficient <strong>de</strong> plus haut <strong>de</strong>gre<strong>de</strong> P et Q par rapport a X 1 est divisible par X k − z donc le coefficient <strong>de</strong>plus bas <strong>de</strong>gre en X k <strong>de</strong> ces coefficients <strong>de</strong> plus haut <strong>de</strong>gre est divisible parz, ce qui contredit la majoration <strong>de</strong> ce coefficient.En pratique, cet algorithme nécessite le <strong>calcul</strong> récursif <strong>de</strong> pgcd sans garantie <strong>de</strong>réussite. On l’évite donc s’il y a beaucoup <strong>de</strong> variables (la limite est par exemple<strong>de</strong> 5 pour MuPAD).4.3.2 Le pgcd modulaire multivariables.Ici, on travaille modulo X n − α, où X 1 , . . .., X n désignent les variables <strong>de</strong>spolynômes. On considère donc <strong>de</strong>ux polynômes P et Q comme polynômes <strong>de</strong> lavariables X n avec <strong>de</strong>s coefficients dans Z[X 1 , . . .., X n−1 ]. On évalue en X n = α,on obtient <strong>de</strong>ux polynômes en n − 1 variables dont on <strong>calcul</strong>e le pgcd (récursivement).28


Il s’agit <strong>de</strong> reconstruire le pgcd par interpolation. Tout d’abord, on a une borneévi<strong>de</strong>nte sur le <strong>de</strong>gré du pgcd par rapport à la variable X n , c’est le minimum δ<strong>de</strong>s <strong>de</strong>grés par rapport à X n <strong>de</strong>s polynômes P et Q. A première vue, il suffit doncd’évaluer les polynômes en δ + 1 points α.Il faut toutefois prendre gar<strong>de</strong> aux mauvaises évaluations et à la normalisation<strong>de</strong>s pgcd avant d’interpoler. En effet, si D(X 1 , . . .., X n ) désigne le pgcd <strong>de</strong> P et Qet G(X 1 , . . .., X n−1 ) le pgcd <strong>de</strong> P(X 1 , . . .., X n−1 , α) et <strong>de</strong> Q(X 1 , . . .., X n−1 , α),on peut seulement dire D(X 1 , . . .., X n−1 , α) divise G. Plusieurs cas sont doncpossibles lorsqu’on évalue en un nouveau point α :– l’un <strong>de</strong>s <strong>de</strong>grés <strong>de</strong> G est plus petit que le <strong>de</strong>gré du polynôme D ′ reconstruitpar interpolation jusque là. Dans ce cas, toutes les évaluations qui ont conduità reconstruire D ′ étaient mauvaises. Il faut recommencer l’interpolation àzéro ou à partir <strong>de</strong> G (si tous les <strong>de</strong>grés <strong>de</strong> G sont inférieurs ou égaux aux<strong>de</strong>grés du D ′ reconstruit).– l’un <strong>de</strong>s <strong>de</strong>grés <strong>de</strong> G est plus grand que le <strong>de</strong>gré du D ′ reconstruit jusque là.Il faut alors ignorer α.– Tous les <strong>de</strong>grés <strong>de</strong> G sont égaux aux <strong>de</strong>grés du D ′ reconstruit jusque là.Dans ce cas, G est un multiple entier du polynôme D ′ reconstruit jusquelà et évalué en X n = α. Si on suppose qu’on a pu s’arranger pour que cemultiple soit 1, on ajoute le point α aux points d’évaluation précé<strong>de</strong>nts α jen posant :∏D ′ = D ′ + (G − D ′ α)j(X n − α j )∏α j(α − α j )On voit que les mauvaises évaluations se détectent simplement par les <strong>de</strong>grés. Pourla normalisation, on utilise une petite astuce : au lieu <strong>de</strong> reconstruire lepgcdD, onva reconstruire un multiple du pgcd D (ce multiple appartiendra à Z[X n ]). On voitmaintenant P et Q comme <strong>de</strong>s polynômes en n − 1 variables X 1 , . . .., X n−1 à coefficientsdans Z[X n ]. Alors lcoeff(D), le coefficient dominant <strong>de</strong> D (relativementà l’ordre lexicographique sur les variables X 1 , ..., X n−1 ), est un polynôme en X nqui divise le coefficient dominant <strong>de</strong> P et <strong>de</strong> Q donc divise le coefficient dominantdu pgcd <strong>de</strong>s coefficients dominants <strong>de</strong> P et <strong>de</strong> Q. On va donc reconstruire lepolynôme :D ′ ∆(X n )= Dlcoeff(D)(X n ) , ∆(X n) = pgcd(lcoeff(P)(X n ), lcoeff(Q)(X n ))c’est-à-dire D multiplié par un polynôme qui ne dépend que <strong>de</strong> X n .Revenons à G en un point α <strong>de</strong> bonne évaluation. C’est un multiple entier <strong>de</strong>D(X 1 , . . .., X n−1 , α) :G = βD(X 1 , . . .., X n−1 , α)Donc, comme polynômes <strong>de</strong> X 1 , ..., X n−1 à coefficients dans Z[X n ] ou dans Z,lcoeff(G) = βlcoeff(D) |Xn=α. Comme lcoeff(D) divise ∆(X n ), il en est <strong>de</strong> mêmeen X n = α donc lcoeff(G) divise β∆(α). On en déduit que ∆(α)G qui est divisiblepar ∆(α)β est divisible par lcoeff(G). On va donc considérer le polynôme∆(α)G/lcoeff(G) : ses coefficients sont entiers et son coefficient dominant est∆(α) = lcoeff(D ′ (X 1 , . . .., X n−1 , α))29


donc∆(α)G/lcoeff(G) = D ′ (X 1 , . . .., X n−1 , α)Algorithme du pgcd modulaire à plusieurs variables (interpolation <strong>de</strong>nse) :Arguments : 2 polynômes primitifs P et Q <strong>de</strong> n variables X 1 , . . .., X n à coefficientsentiers. Renvoie le pgcd <strong>de</strong> P et Q.1. Si n = 1, renvoyer le pgcd <strong>de</strong> P et Q en une variable.2. Test rapi<strong>de</strong> <strong>de</strong> pgcd trivial par rapport à X n . On cherche <strong>de</strong>s n − 1-uplets αtels que P(α, X n ) et Q(α, X n ) soient <strong>de</strong> même <strong>de</strong>gré que P et Q par rapportà la variable X n . On <strong>calcul</strong>e le pgcd G <strong>de</strong> ces 2 polynômes en une variable.Si le pgcd est constant, alors on retourne le pgcd <strong>de</strong>s coefficients <strong>de</strong> P et Q.3. On divise P et Q par leur contenu respectifs vu comme polynômes en X 1 , . . .., X n−1à coefficients dans Z[X n ], on note C(X n ) le pgcd <strong>de</strong>s contenus. On <strong>calcul</strong>eaussi le pgcd ∆(X n ) <strong>de</strong>s coefficients dominants <strong>de</strong> P et <strong>de</strong> Q.4. On initialise D ′ le pgcd reconstruit à 0, I(X n ) le polynôme d’interpolationà 1, δ = (δ 1 , ..., δ n−1 ) la liste <strong>de</strong>s <strong>de</strong>grés partiels du pgcd par rapport àX 1 , . . .., X n−1 au minimum <strong>de</strong>s <strong>de</strong>grés partiels <strong>de</strong> P et Q par rapport àX 1 , . . .., X n−1 , e le nombre d’évaluation à 0 et E l’ensemble <strong>de</strong>s pointsd’interpolation à la liste vi<strong>de</strong>.5. Boucle infinie :– Faire α=entier aléatoire n’appartenant pas à E jusqu’à ce que<strong>de</strong>gre(P(X 1 , . . .., X n−1 , α))=<strong>de</strong>gre Xn(P(X 1 , . . .., X n )<strong>de</strong>gre(Q(X 1 , . . .., X n−1 , α)) = <strong>de</strong>gre Xn(Q(X 1 , . . .., X n ))– Calculer le pgcd G(X 1 , . . .., X n−1 ) en n−1 variables <strong>de</strong> P(X 1 , . . .., X n−1 , α)et Q(X 1 , . . .., X n−1 , α).– Si <strong>de</strong>gre(G) i < δ i pour un indice au moins. Si <strong>de</strong>gre(G) δ, on poseδ = <strong>de</strong>gre(G), D ′ = G ∆(α) , I = X lcoeff(G)n − α, e = 1 et E = [α], sinonon pose δ = min(δ, <strong>de</strong>gre(G)), D ′ = 0, I = 1, e = 0, E = []. On passe àl’itération suivante.– Si <strong>de</strong>gre(G) > δ, on passe à l’itération suivante.– Si <strong>de</strong>gre(G) = δ, on interpole :– G := G ∆(α)lcoeff(G)– D ′ := D ′ I(X+ n)Qα j ∈E (α−α j) (G − D′ (X 1 , . . .., X n−1 , α))– I := I ∗ (X n − α)– e := e + 1 et ajouter α à E– Si e est strictement plus grand que le minimum <strong>de</strong>s <strong>de</strong>grés partiels <strong>de</strong> Pet Q par rapport à X n , on pose ˜D la partie primitive <strong>de</strong> D ′ (vu commepolynôme à coefficients dans Z[X n ]), on teste si P et Q sont divisiblespar ˜D, si c’est le cas, on renvoie D = C(X n ) ˜DOn observe que dans cet algorithme, on fait le test <strong>de</strong> divisibilite <strong>de</strong> ˜D par P etQ. En effet, même après avoir évalué en suffisamment <strong>de</strong> points, rien n’indiqueque tous ces points sont <strong>de</strong>s points <strong>de</strong> bonne évaluation. En pratique cela resteextrêmement improbable. En pratique, on teste la divisibilité plus tôt, dès que D ′n’est pas modifié par l’ajout d’un nouveau point à la liste <strong>de</strong>s α j .30


Il existe une variation <strong>de</strong> cet algorithme, appelé SPMOD (sparse modular), quisuppose que seuls les coefficients non nuls du pgcd en n − 1 variables sont encorenon nuls en n variables (ce qui a <strong>de</strong> fortes chances d’être le cas). L’étape d’interpolationest alors remplacée par la résolution d’un sous-système d’un système <strong>de</strong>Van<strong>de</strong>rmon<strong>de</strong>. Cette variation est intéressante si le nombre <strong>de</strong> coefficients non nulsen n − 1 variables est petit <strong>de</strong>vant le <strong>de</strong>gré. Si elle échoue, on revient à l’interpolation<strong>de</strong>nse.Notons enfin qu’on peut appliquer cette métho<strong>de</strong> lorsque les coefficients <strong>de</strong>P et Q sont dans Z/nZ mais il faut alors vérifier qu’on dispose <strong>de</strong> suffisamment<strong>de</strong> points d’interpolation. Ce qui en combinant avec l’algorithme modulaire à unevariable donne un algorithme doublement modulaire pour <strong>calcul</strong>er le pgcd <strong>de</strong> 2 polynômesà coefficients entiers. C’est cette métho<strong>de</strong> qu’utilise par exemple MuPAD(en essayant d’abord SPMOD puis l’interpolation <strong>de</strong>nse).Exemple :Dans cet exemple, on donne F et G sous forme factorisée, le but étant <strong>de</strong> fairecomprendre l’algorithme. En utilisation normale, on n’exécuterait cet algorithmeque si F et G étaient développés.P = ((x+1)y +x 2 +1)(y 2 +xy+1), Q = ((x+1)y +x 2 +1)(y 2 −xy −1).Prenons x comme variable X 1 et y comme variable X 2 . Les coefficients dominants<strong>de</strong> P et Q sont respectivement y et −y donc ∆ = y.En y = 0, P(x,0) = x 2 + 1 n’est pas du bon <strong>de</strong>gré.En y = 1, P(x,1) = (x+x 2 +2)(x+2) et Q(x,1) = (x+x 2 +2)(−x) sontdu bon <strong>de</strong>gré. Leur pgcd est G = x 2 + x + 2, ∆(1) = 1, donc D ′ = x 2 + x + 1.On teste la divisibilité <strong>de</strong> P par D ′ , le teste échoue.En y = 2, P(x,2) = (x 2 +2x+3)(2x+5) et Q(x,2) = (x 2 +2x+3)(−2x+3)donc G = x 2 + 2x + 3, ∆(2) = 2. On interpole :D ′ = x 2 +x+2+ y − 12 − 1 (2(x2 +2x+3)−(x 2 +x+2)) = y(x 2 +3x+4)−(2x+2)On teste la divisibilité <strong>de</strong> P par D ′ , le test échoue.En y = 3, P(x,3) = (x 2 +3x+4)(3x+10) et Q(x,3) = (x 2 +3x+4)(−3x+8) donc G = x 2 + 3x + 4, ∆(3) = 3. On interpole :doncD ′ = y(x 2 + 3x + 4) − (2x + 2) +(y − 2)(y − 1) (3(x 2 + 3x + 4) − (3(x 2 + 3x + 4) − (2x + 2)) )(3 − 2)(3 − 1)D ′ = y(x 2 +3x+4)−(2x+2)+(y − 2)(y − 1)(−2x−2) = x 2 y+xy 2 +y 2 +y2On divise D ′ par son contenu et on trouve x 2 + xy + y + 1 qui est bien le pgcd <strong>de</strong>P et Q.4.3.3 EZGCD.Il s’agit d’une métho<strong>de</strong> p-adique. On évalue toutes les variables sauf une,on <strong>calcul</strong>e le pgcd en une variable et on remonte au pgcd variable par variable31


(EEZGCD) ou toutes les variables simultanément (EZGCD) par un lemme <strong>de</strong> Hensel.Il semble qu’il est plus efficace <strong>de</strong> remonter les variables séparément.Soit donc F et G <strong>de</strong>ux polynômes primitifs dépendant <strong>de</strong>s variables X 1 , . . .,X n<strong>de</strong> pgcd D, on fixe une <strong>de</strong>s variables qu’on appelera X 1 dans la suite. Soientlcoeff(F) et lcoeff(G) les coefficients dominants <strong>de</strong> F et G par rapport à X 1 . Onévalue F et G en un n − 1 uplet b tel que le <strong>de</strong>gré <strong>de</strong> F et G par rapport à X 1 soitconservé après evaluation en b. On suppose que D b (X 1 ) = pgcd(F(b), G(b)) a lemême <strong>de</strong>gré que D(b). On a donc l’égalité :(F ∗ lcoeff(F))(b) =( )lcoeff(F(b))D b ∗lcoeff(D b )()F(b) lcoeff(F)(b)D b lcoeff( F(b)D b)et <strong>de</strong> même en remplaçant F par G.Pour pouvoir lifter cette égalité (c’est-à-dire généraliser à plusieurs variables),il faut que D b et F(b)D bsoient premiers entre eux. Sinon, on peut essayer <strong>de</strong> lifterl’égalité analogue avec G. En général, on montre qu’il existe un entier j tel que D bet F(b)+jG(b)D bsoient premiers entre eux. En effet, sinon au moins un <strong>de</strong>s facteursirréductibles <strong>de</strong> D b va diviser F(b)+jG(b)D bpour <strong>de</strong>ux valeurs distinctes <strong>de</strong> j et vadonc diviser à la fois F(b)D bet G(b)D ben contradiction avec la définition <strong>de</strong> D b =pgcd(F(b), G(b)). On lifte alors l’égalité obtenue en remplaçant F par (F + kG)ci-<strong>de</strong>ssus. Dans la suite, on suppose qu’on peut prendre j = 0 pour alléger lesnotations.On va aussi supposer que b = 0. Sinon, on fait un changement d’origine sur lespolynômes F et G pour que b = 0 convienne, on <strong>calcul</strong>e le pgcd et on lui appliquela translation d’origine opposée.On adopte ensuite la notation suivante : si k est un entier, on dit qu’un polynômeP est un O(k) si la valuation <strong>de</strong> P vu comme polynôme en X 2 , . . .., X n àcoefficients dans Z[X 1 ] est supérieure ou égale à k, ou <strong>de</strong> manière équivalente siL’égalité à lifter se réécrit donc :où P 0 =D blcoeff(F(b))lcoeff(D b )P(X 1 , hX 2 , . . .., hX n ) = O h→0 (h k )F lcoeff(F) = P 0 Q 0 + O(1)et Q 0 = F(b)D blcoeff(F)(b)lcoeff( F(b)D b)sont premiers entre eux et <strong>de</strong><strong>de</strong>gré 0 par rapport aux variables X 2 , . . .., X n . Cherchons P 1 = O(1) et Q 1 =O(1) <strong>de</strong> <strong>de</strong>gré 1 par rapport aux variables X 2 , . . .., X n tels queIl faut donc résoudreF lcoeff(F) = (P 0 + P 1 )(Q 0 + Q 1 ) + O(2)F lcoeff(F) − P 0 Q 0 = P 0 Q 1 + Q 0 P 1 + O(2)On peut alors appliquer l’i<strong>de</strong>ntité <strong>de</strong> Bézout qui permet <strong>de</strong> déterminer <strong>de</strong>s polynômesP 1 et Q 1 satisfaisant l’égalité ci-<strong>de</strong>ssus (avec comme reste O(2) nul)puisque P 0 et Q 0 sont premiers entre eux. De plus, on choisit P 1 et Q 1 tels que<strong>de</strong>gre X1P 1 <strong>de</strong>gre X1(F)−<strong>de</strong>gre(Q 0 ) = <strong>de</strong>gre(P 0 ) et <strong>de</strong>gre X1(Q 1 ) <strong>de</strong>gre(Q 0 )32


et lcoeff X1 (P 0 + P 1 ) + O(2) = lcoeff X1 (Q 0 + Q 1 ) + O(2) = lcoeff X1 (F). Ontronque ensuite P 1 et Q 1 en ne conservant que les termes <strong>de</strong> <strong>de</strong>gré 1 par rapport àX 2 , . . .., X n .On trouve <strong>de</strong> la même manière par récurrence P k et Q k homogènes <strong>de</strong> <strong>de</strong>gré kpar rapport à X 2 , . . .., X k , <strong>de</strong> <strong>de</strong>gré par rapport à X 1 respectivement inférieur aux<strong>de</strong>grés <strong>de</strong> Q 0 et <strong>de</strong> P 0 et tels queF lcoeff(F) = (P 0 + . . .. + P k )(Q 0 + . . .. + Q k ) + O(k + 1) (6)et lcoeff(F) = lcoeff X1 (P 0 + . . . . + P k ) + O(k + 1) = lcoeff X1 (Q 0 + . . .. +Q k ) + O(k + 1).Si on est bien en un point <strong>de</strong> bonne évaluation et si k est plus grand que le<strong>de</strong>gré total (par rapport aux variables X 2 , . . .., X n ) du polynôme F lcoeff(F) onva vérifier que P 0 + . . .. + P k = D lcoeff(F) . En effet, si on a <strong>de</strong>ux suites <strong>de</strong>lcoeff(D)polynômes P et P ′ et Q et Q ′ satisfaisant (6) avec les même termes <strong>de</strong> <strong>de</strong>gré zéroP 0 et Q 0 , alors en prenant la différence, on obtient :(P 0 +P 1 . . .+P k )(Q 0 +Q 1 . . .+Q k ) = (P 0 +P ′ 1 . . .+P ′ k )(Q 0+Q ′ 1 . . .+Q ′ k )+O(k+1)On égale alors les termes homogènes <strong>de</strong> <strong>de</strong>gré j, pour j = 1, on obtient P 0 (Q 1 −Q ′ 1 ) = Q 0(P 1 −P 1 ′), donc Q 0 divise Q 1 −Q ′ 1 qui est <strong>de</strong> <strong>de</strong>gré strictement inférieurau <strong>de</strong>gré <strong>de</strong> Q 0 par rapport à X 1 (car on a l’inégalité large et les termes <strong>de</strong> plus haut<strong>de</strong>gré sont égaux), donc Q 1 = Q ′ 1 et P 1 = P 1 ′ . On montre <strong>de</strong> la même manière queQ j = Q ′ j et P j = P j ′ . L’écriture est donc unique, c’est donc l’écriture en polynômehomogène <strong>de</strong> <strong>de</strong>gré croissant <strong>de</strong> D lcoeff(F) que l’on reconstruit.lcoeff(D)Cet algorithme permet donc <strong>de</strong> reconstruire D, il suffit <strong>de</strong> tester à chaqueétape si P 0 + . . .. + P k divise F lcoeff(F). On appelle cette métho<strong>de</strong> <strong>de</strong> remontéelemme <strong>de</strong> Hensel linéaire. Il existe une variante dite lemme <strong>de</strong> Hensel quadratiquequi consiste à passer <strong>de</strong> O(k) à O(2k). Elle nécessite toutefois un <strong>calcul</strong>supplémentaire, celui <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout à O(2k) près pour les polynômesP 0 + . . .. + P k−1 et Q 0 + . . .. + Q k−1 . Ce <strong>calcul</strong> se fait également par lifting.Algorithme EZGCD (Hensel linéaire)Arguments : 2 polynômes F et G à coefficients entiers et primitifs. Renvoie lepgcd <strong>de</strong> F et G ou false.1. Evaluer F et G en (X 2 , . . .., X n ) = (0, . . ..,0), vérifier que les coefficientsdominants <strong>de</strong> F et <strong>de</strong> G ne s’annulent pas. Calculer le pgcd D b <strong>de</strong> F(0) et<strong>de</strong> G(0). Prendre un autre point d’évaluation au hasard qui n’annule pas lescoefficients dominants <strong>de</strong> F et <strong>de</strong> G et vérifier que le pgcd a le même <strong>de</strong>gréque D b . Sinon, renvoyer false (on peut aussi faire une translation d’origine <strong>de</strong>F et <strong>de</strong> G en un autre point mais cela diminue l’efficacité <strong>de</strong> l’algorithme).2. On note lcF et lcG les coefficients dominants <strong>de</strong> F et <strong>de</strong> G par rapport à X 1 .3. Si <strong>de</strong>gre(F) <strong>de</strong>gre(G) et <strong>de</strong>gre(D b ) = <strong>de</strong>gre(G) et F divise G renvoyerF4. Si <strong>de</strong>gre(G) < <strong>de</strong>gre(F) et <strong>de</strong>gre(D b ) = <strong>de</strong>gre(F) et G divise F renvoyerG5. Si <strong>de</strong>gre(F) = <strong>de</strong>gre(D b ) ou si <strong>de</strong>gre(G) = <strong>de</strong>gre(D b ) renvoyer false33


6. Boucle infinie sur j entier initialisé à 0, incrémenté <strong>de</strong> 1 à chaque itération :si pgcd(D b , F(0)+jG(0)D b) = C constant, alors arrêter la boucle()(lcF+jlcG)(0)7. Lifter l’égalité (F + jG)(lcF + jlcG)(0) = D b ∗ . . .. parlcoeff(D b)remontée <strong>de</strong> Hensel linéaire ou quadratique. Si le résultat est false, renvoyerfalse. Sinon renvoyer le premier polynôme du résultat divisé par son contenuvu comme polynôme en X 1 à coefficients dans Z[X 2 , . . .., X n ].Remontée <strong>de</strong> Hensel linéaire :Arguments : F un polynôme, lcF=lcoeff(F) son coefficient dominant, P 0 unfacteur <strong>de</strong> F(0) ayant comme coefficient dominant lcF(0) et dont le cofacteur Q 0est premier avec P 0 .Renvoie <strong>de</strong>ux polynômes P et Q tels que F lcF = PQ et P(0) = P 0 etlcoeff(P) = lcoeff(Q) = lcF.1. Soit G = F lcF, , Q 0 = G(0)/P 0 , P = P 0 , Q = Q 0 .2. Déterminer les <strong>de</strong>ux polynômes U et V <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout (tels queP 0 U + Q 0 V = d où d est un entier).3. Boucle infinie avec un compteur k initialisé à 1, incrémenté <strong>de</strong> 1 à chaqueitération– Si k > <strong>de</strong>gre X2 ,....,X n(G), renvoyer false.– Si P divise G, renvoyer P et G/P .– Soit H = G−PQ = O(k). Soit u = U H d et v = V H d , on a P 0u+Q 0 v =H– Remplacer v par le reste <strong>de</strong> la division euclidienne <strong>de</strong> v par P 0 et u par lereste <strong>de</strong> la division euclidienne <strong>de</strong> u par Q 0 . La somme <strong>de</strong>s <strong>de</strong>ux quotientsest égale au quotient euclidien <strong>de</strong> H par P 0 Q 0 , c’est-à-dire au coefficientdominant <strong>de</strong> H divisé par le produit <strong>de</strong>s coefficients dominants <strong>de</strong> P 0 etQ 0 (qui sont égaux) donc on a l’égalité :P 0 u + Q 0 v = H − lcoeff(H)lcoeff(P 0 ) 2P 0Q 0– Soit α = (lcoeff(F)−lcoeff(P))/lcoeff(P 0 ) et β = (lcoeff(F)−lcoeff(Q))/lcoeff(P 0 ).On ajoute αP 0 à v, ainsi lcoeff(P + v) = lcoeff(F) + O(k + 1) et βQ 0 àu, ainsi lcoeff(Q + u) = lcoeff(F) + O(k + 1)Remarque : on montre alors que α + β = lcoeff(H) + O(k + 1) donclcoeff(P 0 Q 0 )P 0 u + Q 0 v = H + O(k + 1) en utilisant les propriétés :lcoeff(F) = lcoeff(P) + O(k) = lcoeff(Q) + O(k) = lcoeff(P 0 ) + O(1)– Réduire u et v en éliminant les termes <strong>de</strong> <strong>de</strong>gré strictement supérieur à kpar rapport à X 2 , . . .., X n . S’il reste un coefficient non entier, renvoyerfalse– Remplacer P par P + v et Q par Q + u, passer à l’itération suivante.Exemple :F = ((x+1)y +x 2 +1)(y 2 +xy +1), G = ((x+1)y +x 2 +1)(y 2 −xy −1)On a F(0, y) = (y + 1)(y 2 + 1) et G(0, y) = (y + 1)(y 2 − 1), le pgcd estdonc D b = (y + 1). On remarque que D b est premier avec le cofacteur <strong>de</strong> F mais34


pas avec le cofacteur <strong>de</strong> G. Si on évalue en un autre point, par exemple x = 1, ontrouve un pgcd D 1 <strong>de</strong> même <strong>de</strong>gré, donc 0 est vraissemblablement un bon pointd’évaluation (ici on en est sûr puisque le pgcd <strong>de</strong> F et G se <strong>calcul</strong>e à vue...). On alcoeff(F) = x+1, on va donc lifter G = ((x+1)y+x 2 +1)(y 2 +xy+1)(x+1) =PQ où P 0 = (y + 1) et Q 0 = (y 2 + 1).On <strong>calcul</strong>e les polynômes <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout U = (1 − y) et V = 1 avecd = 2, puis à l’ordre k = 1 :H = G − P 0 Q 0 = (2y 3 + 2y 2 + 3y + 1)x + O(2)donc u = reste(UH/d, Q 0 ) = xy et v = reste(V H/d, P 0 ) = −x.Donc Q 1 = xy+αQ 0 avec α = (x+1−1)/lcoeff(P 0 ) = x et Q 0 +Q 1 = (y 2 +1)(x+1)+xy. De même, P 1 = −x+βP 0 , avec β = (x+1−1)/lcoeff(P 0 ) = xdonc P 0 + P 1 = (y + 1)(x + 1) − x. On remarque que P 0 + P 1 et Q 0 + Q 1 sontbien à O(2) près les facteurs <strong>de</strong> F lcoeff(F) :P = (x+1)y+x 2 +1 = P 0 +P 1 +O(2), Q = (x+1)(y 2 +xy+1) = Q 0 +Q 1 +O(2)Une <strong>de</strong>uxième itération est nécessaire. On <strong>calcul</strong>eH = G − (P 0 + P 1 )(Q 0 + Q 1 ) = (2y 2 + y + 1)x 2 + O(3)puis reste(UH/d, Q 0 ) = yx 2 et reste(V H/d, P 0 ) = x 2 . Ici les coefficients α etβ sont nuls car lcoeff(F) n’a pas <strong>de</strong> partie homogène <strong>de</strong> <strong>de</strong>gré 2. On trouve alorsP = P 0 + P 1 + P 2 et Q = Q 0 + Q 1 + Q 2 . Pour <strong>calcul</strong>er le pgcd, il suffit <strong>de</strong><strong>calcul</strong>er la partie primitive <strong>de</strong> P vu comme polynôme en y, ici c’est encore P carle contenu <strong>de</strong> P est 1 (remarque : pour Q le contenu est x + 1).On trouve donc P comme pgcd.4.4 Quel algorithme choisir ?Il est toujours judicieux <strong>de</strong> faire une évaluation en quelques n − 1 uplets pourtraquer les pgcd triviaux. (E)EZGCD sera efficace si (0,...,0) est un point <strong>de</strong> bonneévaluation et si le nombre <strong>de</strong> remontées nécessaires pour le lemme <strong>de</strong> Hensel estpetit donc pour les pgcd <strong>de</strong> petit <strong>de</strong>gré, GCDMOD est aussi efficace si le <strong>de</strong>gré dupgcd est petit. Le sous-résultant est efficace pour les pgcd <strong>de</strong> grand <strong>de</strong>gré car il ya alors peu <strong>de</strong> divisions euclidiennes à effectuer et les coefficients n’ont pas trople temps <strong>de</strong> croitre. SPMOD est intéressant pour les polynômes creux <strong>de</strong> pgcd nontrivial creux. GCDHEU est intéressant pour les problèmes relativement petits.Avec <strong>de</strong>s machines multiprocesseurs, on a probablement intérêt à lancer enparallèle plusieurs algorithmes et à s’arrêter dès que l’un <strong>de</strong>ux recontre le succès.4.5 Pour en savoir plus.Parmi les références citées dans le premier article, ce sont les livres <strong>de</strong> Knuth,H. Cohen, et Davenport-Siret-Tournier qui traitent <strong>de</strong>s algorithmes <strong>de</strong> pgcd. Onpeut bien sûr consulter le source <strong>de</strong> son système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> lorsqu’il estdisponible :35


– pour MuPAD sur un système Unix, <strong>de</strong>puis le répertoire d’installation <strong>de</strong> Mu-PAD (en général /usr/local/MuPAD) après avoir désarchivé le fichierlib.tar du répertoire share/lib par la comman<strong>de</strong>cd share/lib && tar xvf lib.taron trouve les algorithmes <strong>de</strong> <strong>calcul</strong> <strong>de</strong> PGCD dans le répertoireshare/lib/lib/POLYLIB/GCD– Pour l’algorithme EZGCD, je me suis inspiré <strong>de</strong> l’implémentation <strong>de</strong> Singular(logiciel libre disponible à www.singular.uni-kl.<strong>de</strong>)Sur le web on trouve quelques articles en lignes sur le sujet en cherchant les motsclefs GCDHEU, EZGCD, SPMOD sur un moteur <strong>de</strong> recherche, il y a par exempleune <strong>de</strong>scription un peu différente du pgcd heuristique sur :www.inf.ethz.ch/personal/gonnet/CAII/HeuristicAlgorithms/no<strong>de</strong>1.htmlet un article <strong>de</strong> comparaison <strong>de</strong> ces algorithmes par Fateman et Liao (dont la référencebibliographique est Evaluation of the heuristic polynomial GCD. in : ISSACpages 240–247, 1995). Quelques autres références :– K.O.Ged<strong>de</strong>s et al "Alg. for Computer Algebra", Kluwer 1992.– pour GCDHEU Char, Ged<strong>de</strong>s, Gonnet, Gcdheu : Heuristic polynomial gcdalgorithm based on integer gcd computation, in : Journal of Symbolic Computation,7 :31–48, 1989.– pour SPMOD "Probabilistic Algorithms for Sparse Polynomials", in : Symbolic& Algebraic Comp. (Ed E.W.Ng), Springer 1979, pp216,5 Le résultantIl s’agit d’un point <strong>de</strong> vue d’algèbre linéaire sur le PGCD. Considérons <strong>de</strong>uxpolynômes A et B <strong>de</strong> <strong>de</strong>grés p et q et <strong>de</strong> pgcd D et l’i<strong>de</strong>ntité <strong>de</strong> Bézout correspondante:AU + BV = D (7)avec <strong>de</strong>gré(U) < q et <strong>de</strong>gré(V ) < p. Imaginons qu’on cherche U et V en oubliantqu’il s’agit d’une i<strong>de</strong>ntité <strong>de</strong> Bézout, en considérant simplement qu’il s’agit d’unproblème d’algèbre linéaire <strong>de</strong> p + q équations (obtenues en développant et eni<strong>de</strong>ntifiant chaque puissance <strong>de</strong> X <strong>de</strong> 0 à p + q − 1) à p + q inconnues (les pcoefficients <strong>de</strong> V et les q coefficients <strong>de</strong> U) On sait que A et B sont premiers entreeux si et seulement si ce problème d’algèbre linéaire a une solution pour D = 1.Donc si le déterminant du système est non nul, alors A et B sont premiers entreeux. Réciproquement si A et B sont premiers entre eux, le système a une solutionunique non seulement avec comme second membre 1 mais avec n’importe quelpolynôme <strong>de</strong> <strong>de</strong>gré inférieur p + q, donc le déterminant du système est non nul.Définition :On appelle résultant <strong>de</strong> A et B le déterminant <strong>de</strong> ce système (7). Il s’annule siet seulement si A et B ne sont pas premiers entre eux (ont au moins une racinecommune). On appelle matrice <strong>de</strong> Sylvester la transposée <strong>de</strong> la matrice du système36


(les inconnues étant par ordre décroissant les coefficients <strong>de</strong> U et V )⎛⎞a a a a−1 . . . . . . a 0 0 . . . 00 a a . . . . . . a 1 a 0 . . . 0..M(A, B) =0 0 . . . a 0b b b b−1 . . . b 0 0 0 . . . 0⎜⎟⎝ .. ⎠0 0 . . . b 0(cette matrice contient b =<strong>de</strong>gré(B) lignes <strong>de</strong> coefficients du polynôme A et a =<strong>de</strong>gré(A)lignes <strong>de</strong> coefficients du polynôme B)Lien avec l’algorithme du sous-résultant (<strong>calcul</strong> <strong>de</strong> PGCD)On peut <strong>calcul</strong>er le déterminant avec la suite <strong>de</strong>s restes <strong>de</strong> divisions euclidiennes<strong>de</strong> la manière suivante, on part <strong>de</strong> la pseudo-division <strong>de</strong> A par B :b a−b+1bA = BQ + Ron effectue alors sur chaque ligne contenant les coefficients <strong>de</strong> A la manipulation<strong>de</strong> ligne correspondante, c’est-à-dire multiplier la ligne par b a−b+1bet soustraire (q 0fois la ligne <strong>de</strong> B terminant dans la même colonne+q 1 fois la ligne <strong>de</strong> B terminantune colonne avant+...). Toutes les lignes contenant les coefficients <strong>de</strong> A ont étéremplacées par <strong>de</strong>s lignes contenant les coefficients <strong>de</strong> R. Ces lignes contiennentk zéros initiaux avec k ≥ 1, ce qui permet <strong>de</strong> réduire le déterminant à celui <strong>de</strong> lamatrice <strong>de</strong> Sylvester <strong>de</strong> R et B (à un coefficient multiplicatif près qui vaut b k b parrapport au précé<strong>de</strong>nt donc b k−b(a−b+1)bpar rapport au déterminant <strong>de</strong> départ). Onéchange ensuite R et B ce qui change éventuellement le signe et on continue enfaisant les divisions euclidiennes <strong>de</strong> l’algorithme du sous-résultant (cf. Knuth où onutilise la matrice <strong>de</strong> Sylvester pour prouver que l’algorithme du sous-résultant estcorrect). Rappelons que le sous-résultant définit les suites A k (A 0 = A, A 1 = B),d k le <strong>de</strong>gré <strong>de</strong> A k , δ k = d k − d k+1 , g k (g 0 = 1, si k ≠ 0, g k coefficient dominant<strong>de</strong> A k ) h k (h 0 = 1, h k+1 = h 1−δ kkg δ kk+1 ) etg δ k−1+1kA k−1 = A k Q k+1 + g k−1 h δ k−1k−1 A k+1Théorème 3 Le résultant est égal au signe près au coefficient h k où k correspondau reste A k constant (en supposant que le résultant soit non nul).PreuveLa transcription <strong>de</strong> l’égalité précé<strong>de</strong>nte sur les résultants donne par la métho<strong>de</strong>ci-<strong>de</strong>ssus :g (δ k−1+1)d kkRes(A k−1 , A k ) = g d k−1−d k+1kRes(g k−1 h δ k−1k−1 A k+1, A k )On en déduit que :Res(A k−1 , A k )g d kk−1 hd k−1−1k−1= g d k−1−d k+1k(g k−1 h δ k−1k−1 )d kRes(A k+1 , A k )= g d k−1−d k+1 −(δ k−1 +1)d kkh δ k−1d k +1−d k−1k−1Res(A k+1 , A k )37


On observe que :donc :(h δ k−1d k +1−d k−1k−1= h (δ k−1−1)(d k −1)k−1=Res(A k−1 , A k )g d kk−1 hd k−1−1k−1Donc en valeur absolue= g d k−1−d k+1 −(δ k−1 +1)d kk= g d k−1−d k+1 −d k −δ k−1k= Res(A k+1, A k )g d k+1kh d k−1kh δ k−1−1k−1(gδ k−1k( )) δ dkdk −1 g k−1−1=kh kh k| Res(A 0, A 1 )| = | Res(A k−1, A k )|g d 10 hd 0−10) dk −1Res(A k+1 , A k )( 1h k) dk −1Res(A k+1 , A k )g d kk−1 hd k−1−1k−1En prenant le rang k tel que A k est constant, on a d k = 0 et le résultant est égal àg d k−1k, on obtient donc :|Res(A 0 , A 1 )| = |g d k−1kh d k−1−1k−1Comme ici δ k−1 = d k−1 , le terme <strong>de</strong> droite est |h k |.RemarqueOn peut <strong>calcul</strong>er au fur et à mesure le signe du résultant en tenant compte <strong>de</strong>s<strong>de</strong>grés <strong>de</strong> A k pour inverser l’ordre <strong>de</strong> A k−1 et A k dans le résultant.UtilisationLa valeur du résultant est très utile pour savoir si 2 polynômes dépendant <strong>de</strong> paramètressont premiers entre eux en fonction <strong>de</strong> la valeur <strong>de</strong>s paramètres. En effet, lafonction gcd d’un logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> <strong>calcul</strong>era le PGCD par rapport à toutesles variables en incluant les paramètres. En cherchant quand le résultant s’annuleen fonction <strong>de</strong>s paramètres on obtient un autre type d’information.Exemple :Chercher quand le polynône P = x 3 + px + q possè<strong>de</strong> une racine multiple enfonction <strong>de</strong> p et q. On <strong>calcul</strong>e le résultant <strong>de</strong> P et P ′ et on trouve 4p 3 + 27q 2 , doncP a une racine multiple si et seulement si 4p 3 + 27q 2 = 0.Remarque :On peut montrer que le résultant <strong>de</strong> P et P ′ est divisible par le coefficient dominant<strong>de</strong> P , on appelle le quotient discriminant.|6 Les suites <strong>de</strong> SturmL’algorithme du sous-résultant appliqué à un polynôme sans racine multiple Pet à sa dérivée permet, à condition <strong>de</strong> changer les signes dans la suite <strong>de</strong>s restes, <strong>de</strong>38


connaitre le nombre <strong>de</strong> racines réelles d’un polynôme dans un intervalle. Ceci esttrè utile pour par exemple simplifier <strong>de</strong>s valeurs absolues <strong>de</strong> polynômes dans unintervalle.On définit donc la suite <strong>de</strong> polynômes A 0 = P, A 1 = P ′ , ..., A k , 0 par :A i = A i+1 Q i+2 − A i+2 (8)avec A k , le <strong>de</strong>rnier reste non nul, un polynôme constant puisque P n’a pas <strong>de</strong>racine multiple. On utilise plutot l’algorithme du sous-résultant que l’algorithmed’Eucli<strong>de</strong>, il faut alors s’assurer que les signes <strong>de</strong> A i et A i+2 sont opposés lorsqueA i+1 s’annule quitte à changer le signe <strong>de</strong> A i+2 en fonction du signe du coefficientdominant <strong>de</strong> A i+1 , <strong>de</strong> la parité <strong>de</strong> la différence <strong>de</strong>s <strong>de</strong>grés et du signe du coefficientgh 1−δ .On définit s(a) comme étant le nombre <strong>de</strong> changements <strong>de</strong> signes <strong>de</strong> la suiteA i (a) en ignorant les 0. Alors le nombre <strong>de</strong> racines réelles <strong>de</strong> A 0 = P sur l’intervalle]a, b] est égal à s(a) − s(b).PreuveOn considére la suite <strong>de</strong>s signes en un point : elle ne peut contenir <strong>de</strong>ux 0 successifs(sinon toute la suite vaudrait 0 en ce point en appliquant (8), or A k est constant nonnul). Elle ne peut pas non plus contenir +,0,+ ni -,0,- à cause <strong>de</strong> la convention <strong>de</strong>signe sur les restes <strong>de</strong> (8). Donc une racine b <strong>de</strong> A i pour 0 < i < k, n’influe passur la valeur <strong>de</strong> s au voisinage <strong>de</strong> b (il y a toujours un changement <strong>de</strong> signe entreles positions i − 1 et i + 1). Comme A k est constant, seules les racines <strong>de</strong> A 0 = Psont susceptibles <strong>de</strong> faire varier s. Comme A 1 = P ′ , le sens <strong>de</strong> variations <strong>de</strong> A 0 auvoisinage d’une racine <strong>de</strong> A 0 est déterminé par le signe <strong>de</strong> A 1 , donc les possibilitéssont -,+ vers +,+ ou +,- vers -,-, ce qui diminue s d’une unité.7 Exercices (PGCD, résultant, ...)7.1 InstructionsLes instructions arithmétiques sont en général dans la librairie standard. Ellessont dans les menus Math->Integer et Alg->Polynomes/Arit.polynomiale <strong>de</strong> Xcas.Certaines <strong>de</strong> ces instructions sont dans la librairie numtheory (en maple) ounumlib (en MuPAD) (utilisez ?numtheory ou ?numlib pour avoir la liste <strong>de</strong>sfonctions <strong>de</strong> ces librairies), pour éviter <strong>de</strong> taper numlib:: ou numtheory:: àchaque fois, on peut lancer en maple la comman<strong>de</strong> with(numtheory); ou enMuPAD export(numlib);.7.1.1 Entiers– chrem (en MuPAD numlib::ichrem) : restes chinois (entier)– divisors (en maple numtheory::divisors, en MuPAD numlib::divisors) :liste <strong>de</strong>s diviseurs d’un entier– gcd, lcm : PGCD et PPCM– igc<strong>de</strong>x : Bézout pour <strong>de</strong>s entiers– iquo et irem quotient et reste <strong>de</strong> la division euclidienne <strong>de</strong> <strong>de</strong>ux entiers– isprime test <strong>de</strong> primalité. En maple et MuPAD, il s’agit d’un test <strong>de</strong>pseudo-primalité. En Xcas, utiliser is_pseudoprime pour effectuer untest plus rapi<strong>de</strong> <strong>de</strong> pseudo-primalité.39


– mods : reste euclidien symétrique– nextprime et prevprime (en MuPAD numlib::prevprime) : nombrepremier suivant ou précé<strong>de</strong>nt– powmod(a,b,n) (Xcas), a &^ b mod n (Maple), powermod(a,b,n)(Mupad) : <strong>calcul</strong> <strong>de</strong> a b (mod n) par l’algorithme <strong>de</strong> la puissance rapi<strong>de</strong>7.1.2 PolynômesOn peut représenter les polynômes par leur écriture symbolique (par exemplex^2+1), ou par <strong>de</strong>s listes (représentation <strong>de</strong>nse ou creuse, récursive ou distribuée).Xcas, Maple et MuPAD acceptent la représentation symbolique. Xcas propose<strong>de</strong>ux types <strong>de</strong> représentation, <strong>de</strong>nse à une variable (poly1[ ]), ou distribuée(%%%{ }%%%) et <strong>de</strong>s instructions <strong>de</strong> conversion (poly2symb et symb2poly)entre représentations. MuPAD propose également une représentation non symbolique,cf. la documentation ?poly. L’intérêt d’une représentation non symboliqueest l’efficacité <strong>de</strong>s opérations polynomiales, (et la possibilité <strong>de</strong> chronométrer <strong>de</strong>sopérations comme le produit <strong>de</strong> 2 polynômes).Les instructions qui suivent utilisent la représentation symbolique, certainesacceptent les autres représentations.– coeff coefficient(s) d’un polynôme,– coeffs liste <strong>de</strong>s coefficients d’un polynôme (à développer auparavant, enmupad on utilise coeff)– content contenu (pgcd <strong>de</strong>s coefficients)– <strong>de</strong>gree <strong>de</strong>gré– divi<strong>de</strong> division euclidienne,– gcd, lcm PGCD et PPCM– gc<strong>de</strong>x Bézout,– genpoly (en MuPAD numlib::genpoly) : crée un polynôme à partir<strong>de</strong> la représentation z-adique d’un entier (utile pour le PGCD heuristique)– icontent : contenu entier pour un polynôme à plusieurs variables– in<strong>de</strong>ts : liste <strong>de</strong>s noms <strong>de</strong> variables d’une expression– lcoeff : coefficient dominant d’un polynôme– l<strong>de</strong>gree : valuation– (MuPAD) multcoeffs multiplie les coefficients d’un polynôme– (MuPAD) pdivi<strong>de</strong> pseudo-division– (MuPAD) poly(expr,[var],coeff) crée un polynôme à partir <strong>de</strong>l’expression symbolique expr par rapport une variable ou à une liste <strong>de</strong>variables var, on peut indiquer dans quel anneau vivent les coefficients (parexemple dans Z/13Z avec comme 3ème argument IntMod(13))– primpart : partie primitive d’un polynôme– quo, rem (xcas et Maple) quotient et reste euclidien (en MuPAD utiliser lesoptions Quo et Rem <strong>de</strong> divi<strong>de</strong>)– tcoeff : coefficient <strong>de</strong> plus bas <strong>de</strong>gré d’un polynôme– interp (MuPAD interpolate) : interpolation <strong>de</strong> Lagrange– convert(.,sqrfree) (MuPAD polylib::sqrfree) : décompositionen facteurs n’ayant pas <strong>de</strong> racine multiples– convert(.,parfrac) (MuPAD polylib::partfrac) : décompositionen éléments simples40


– resultant (MuPAD polylib::resultant) : <strong>calcul</strong>e le résultant <strong>de</strong>2 polynômes par rapport à une variable.Notez aussi que le menu Exemples->poly->pgcd.xws <strong>de</strong> Xcas contient<strong>de</strong>s exemples <strong>de</strong> programmes <strong>de</strong> <strong>calcul</strong> <strong>de</strong> pgcd <strong>de</strong> type Eucli<strong>de</strong>.7.1.3 Calculs modulo nPour travailler dans Z/nZ[X] :– avec Xcas on utilise la notation % comme en C, par exemple gcd(P % 3,Q % 3). On peut aussi utiliser la notation Maple en mo<strong>de</strong> “syntaxe Maple”(cf. ci-<strong>de</strong>ssous)– avec Maple, on utilise les formes inertes <strong>de</strong>s instructions (qui renvoient l’instructionnon évaluée), dont le nom est le même que le nom <strong>de</strong> comman<strong>de</strong> habituelmais précédé par une majuscule, puis on indique mod n, par exempleGcd(P,Q) mod 11.– avec MuPAD, on désigne le type <strong>de</strong>s coefficients par exemple par IntMod(13)puis on construit <strong>de</strong>s objets ayant <strong>de</strong>s coefficients <strong>de</strong> ce type (par exemple <strong>de</strong>spolynômes, cf. infra). Par exemple poly(x^2+1,[x],IntMod(13)).7.2 Exercices PGCD1. Calculez le pgcd <strong>de</strong> x 202 + x 101 + 1 et sa dérivée modulo 3 et modulo 5.Conclusion ?2. P = 51x 3 − 35x 2 + 39x − 115 et Q = 17x 4 − 23x 3 + 34x 2 + 39x − 115.Calculez le pgcd <strong>de</strong> P et Q modulo 5, 7 et 11. En déduire le pgcd <strong>de</strong> P et Qpar le théorème <strong>de</strong>s restes chinois. Pourquoi ne doit-on pas essayer modulo17 ?3. Écrire un programme qui détermine le <strong>de</strong>gré probable du pgcd <strong>de</strong> 2 polynômesen une variable en utilisant le pgcd modulaire (on considère le <strong>de</strong>gréprobable déterminé lorsqu’on trouve <strong>de</strong>ux nombres premiers réalisant le minimum<strong>de</strong>s <strong>de</strong>grés trouvés)4. Détaillez l’algorithme du PGCD heuristique pour les polynômes P = (x +1) 7 − (x − 1) 6 et sa dérivée. Comparez avec l’algorithme d’Eucli<strong>de</strong> naïf.5. Écrire un programme mettant en oeuvre le pgcd heuristique pour <strong>de</strong>s polynômesà une variable.6. On veut comprendre comment un logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> <strong>calcul</strong>e∫x 6 + 2(x 3 + 1) 2 dxOn se ramène d’abord à une fraction propre (numérateur N <strong>de</strong> <strong>de</strong>gré inférieurau dénominateur), Soit P = X 3 + 1, <strong>calcul</strong>ez le PGCD <strong>de</strong> P et P ′ ,puis <strong>de</strong>ux polynômes U et V tels que :N = UP + V P ′On décompose alors l’intégrale en <strong>de</strong>ux morceaux :∫ NP 2 = ∫ UP + ∫V P ′41P 2


Faites une intégration par parties sur le <strong>de</strong>uxième terme et en déduire lavaleur <strong>de</strong> l’intégrale du départ.7. Écrire un programme mettant en oeuvre l’algorithme modulaire <strong>de</strong> <strong>calcul</strong> duPGCD.8. Écrire un programme qui détermine le <strong>de</strong>gré probable du PGCD par rapportà toutes les variables <strong>de</strong> 2 polynôme à plusieurs variables en utilisantl’évaluation en toutes les variables sauf une.9. Calculer le pgcd par une métho<strong>de</strong> modulaire <strong>de</strong> (xy − x + 1)(xy + x 2 + 1)et (xy − x − y)(xy − x + 1)7.3 Exercices (résultant)1. Pour quelles valeurs <strong>de</strong> p le polynôme X 5 + X 3 − pX + 1 admet-il uneracine multiple ?2. Résoudre le système en éliminant successivement les variables grâce au résultant:⎧⎨ a 3 + b 3 + c 3 = 8a 2 + b 2 + c 2 = 6⎩a + b + 2c = 43. Donner le détail <strong>de</strong>s <strong>calcul</strong>s avec Bézout <strong>de</strong> la décomposition en élémentssimples <strong>de</strong> :1(x 2 − 1) 2 (x + 2)puis <strong>calcul</strong>er le coefficient <strong>de</strong> x n du développement en séries entières <strong>de</strong>cette fraction en 0.4. Calculer ∫ 1 − x21 + x 4 dxen utilisant le résultant pour <strong>calcul</strong>er les logarithmes.5. En utilisant uniquement l’instruction <strong>de</strong> <strong>calcul</strong> <strong>de</strong> PGCD déterminer la multiplicitémaximale d’un facteur irréductible <strong>de</strong> x 14 −x 13 −14x 12 +12x 11 +78x 10 −54x 9 −224x 8 +116x 7 +361x 6 −129x 5 −330x 4 +72x 3 +160x 2 −16x − 327.4 Exercice (Bézout modulaire)Soit A et B <strong>de</strong>ux polynômes à coefficients entiers et premiers entre eux. Soitc ∈ Z ∗ le résultant <strong>de</strong> A et B, on va <strong>calcul</strong>er les polynômes U et V <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong>BézoutAU + BV = c, <strong>de</strong>g(U) < <strong>de</strong>g(B), <strong>de</strong>g(V ) < <strong>de</strong>g(A) (9)par une métho<strong>de</strong> modulaire.1. Montrer, en utilisant les formules <strong>de</strong> Cramer, que les coefficients <strong>de</strong> U et Vsont <strong>de</strong>s entiers <strong>de</strong> valeur absolue inférieure ou égale à la borne <strong>de</strong> Hadamardh <strong>de</strong> la matrice <strong>de</strong> Sylvester <strong>de</strong> A et B (dont le déterminant est c, le résultant<strong>de</strong> A et B). Calculer h en fonction <strong>de</strong> la norme euclidienne <strong>de</strong> A, B et <strong>de</strong>leurs <strong>de</strong>grés.42


2. On <strong>calcul</strong>e c ∈ Z ∗ puis on résoud (9) dans Z/p i Z[X] pour plusieurs nombrespremiers p i (choisis si possible inférieurs à √ 2 31 pour <strong>de</strong>s raisons d’efficacité),puis on <strong>calcul</strong>e par le théorème <strong>de</strong>s restes chinois (9) dans Z/ ∏ p i Z[X].Donner une minoration <strong>de</strong> ∏ i p i faisant intervenir h qui permette <strong>de</strong> garantirque l’écriture en représentation symétrique <strong>de</strong> (9) dans Z/ ∏ p i Z[X] esti<strong>de</strong>ntique à (9) dans Z[X].3. Application : résoudre <strong>de</strong> cette manière l’équation <strong>de</strong> Bézout pourA = (X + 1) 4 (X − 3), B = (X − 1) 4 (X + 2)(vous pouvez utiliser sans justifications l’instruction <strong>de</strong> <strong>calcul</strong> <strong>de</strong> résultant,<strong>de</strong>s coefficients <strong>de</strong> Bézout dans Z/p i Z[X] et <strong>de</strong> reste chinois <strong>de</strong> votre logiciel).4. Écrire une fonction mettant en oeuvre cet algorithme.5. Que pensez-vous <strong>de</strong> l’intérêt <strong>de</strong> cet algorithme par rapport à l’algorithmed’Eucli<strong>de</strong> étendu dans Z[X] ?43


7.5 Exercice (Géométrie et résultants).On cherche une relation algébrique entre les coordonnées <strong>de</strong> 4 points A, B, C, Dqui traduise le fait que ces 4 points sont cocycliques. Cette condition étant invariantepar translation, on cherche une relation entre les 6 coordonnées <strong>de</strong>s 3 vecteursv 1 = (x 1 , y 1 ), v 2 = (x 2 , y 2 ) et v 3 = (x 3 , y 3 ) d’origine A et d’extrémité B,C et D. On peut supposer quitte à translater que le centre du cercle est l’origine, ona donc 5 paramètres : le rayon du cercle R et les 4 angles <strong>de</strong>s points sur le cercleθ 0 , θ 1 , θ 2 et θ 3 . La relation cherchée va s’obtenir en éliminant les 5 paramètres <strong>de</strong>sexpressions <strong>de</strong>s 6 coordonnées en fonction <strong>de</strong> ces paramètres.1. Exprimer les 6 coordonnées en fonction <strong>de</strong> R et a = tan(θ 0 /2), b = tan(θ 1 /2),c = tan(θ 2 /2) et d = tan(θ 3 /2). On obtient ainsi 6 équations, par exempleles <strong>de</strong>ux premières sont <strong>de</strong> la formex 1 − F(R, a, b) = 0, y 1 − G(R, a, b) = 0où F et G sont <strong>de</strong>ux fractions rationnelles.2. En réduisant au même dénominateur, <strong>calcul</strong>er 6 polynômes, fonction <strong>de</strong>x 1 , y 1 , x 2 , y 2 , x 3 , y 3 , R, a, b, c, d, qui doivent s’annuler pour que les pointssoient cocycliques (Vous pouvez utiliser l’instruction numer pour obtenir lenumérateur d’une fraction rationnelle).3. Éliminer b <strong>de</strong>s polynômes contenant x 1 et y 1 et factoriser le polynôme obtenu,faire <strong>de</strong> même avec c, x 2 et y 2 et d, x 3 et y 3 , en déduire (en supposantque les points sont tous distincts) 3 polynômes en x 1 , y 1 , x 2 , y 2 , x 3 , y 3 , R, aqui s’annulent.4. Éliminer R et a, en déduire la relation cherchée.5. Vérifier que cette relation est équivalente à la nullité <strong>de</strong> la partie imaginairedu birapport <strong>de</strong>s affixes α, β, γ, δ <strong>de</strong>s 4 points :( ) α − β δ − γI= 0α − γ δ − β8 FactorisationOn présente ici quelques algorithmes utilisés pour factoriser un polynôme àcoefficients entiers. Pour un polynôme en une variable, cele se fait en plusieursétapes : on commence par se ramener à un polynôme P dont tous les facteurs sont<strong>de</strong> multiplicité un, ensuite on factorise P dans Z/pZ (par la métho<strong>de</strong> <strong>de</strong> Berlekampou Cantor-Zassenhauss), puis on remonte à Z/p k Z pour k suffisamment grand (enfonction <strong>de</strong> la borne <strong>de</strong> Landau sur les facteurs <strong>de</strong> P ), et on recombine enfin lesfacteurs modulaires pour trouver les facteurs <strong>de</strong> P . Lorsque P à plusieurs variables,on utilise une métho<strong>de</strong> analogue à celle permettant <strong>de</strong> trouver le pgcd <strong>de</strong> polynômesà plusieurs variables.RappelLe pgcd <strong>de</strong>s coefficients d’un polynôme est appelé contenu <strong>de</strong> ce polynôme. Unpolynôme est dit primitif si son contenu est égal à 1.44


8.1 Les facteurs multiplesÉtant donné un polynôme P à coefficients entiers, on cherche à écrire :P = Π n k=1 P k koù les P k n’ont pas <strong>de</strong> facteurs multiples et sont premiers entre eux <strong>de</strong>ux à <strong>de</strong>ux.Comme on est en caractéristique 0, cela revient à dire que pgcd(P k , Pk ′) = 1 etpgcd(P k , P j ) = 1. Bien entendu on va utiliser la dérivée <strong>de</strong> P dans l’algorithme<strong>de</strong> recherche <strong>de</strong>s P k :P ′ =n∑k=1Soit G le pgcd <strong>de</strong> P et <strong>de</strong> P ′ . On a :en effet G divise P et P ′ :kP k ′ P k−1kΠ j≠k P j jG = Π n k=1 P k−1k,W 1 = P G = Πn k=1 P k, Z 1 = P ′ n∑G = kP k ′ Π j≠kP jil s’agit <strong>de</strong> vérifier que W 1 et Z 1 sont premiers entre eux. Soit F un facteur irréductibledu pgcd <strong>de</strong> W 1 et Z 1 , alors F divise l’un <strong>de</strong>s P k , appelons P l ce facteur.Comme F divise Π j≠k P j si k ≠ l, on en déduit que F divise le <strong>de</strong>rnier terme <strong>de</strong> lasomme <strong>de</strong> Z 1 , c’est-à-dire que F divise lPl ′ Π j≠lP j donc F divise Pl ′ puisque lesP k sont premiers entre eux. Donc P l et Pl ′ ont un facteur en commun, ce qui estcontraire aux hypothèses.On pose alors :k=1Y 1 = Z 1 − W ′ 1 = ∑ k>1(k − 1)P ′ k Π j≠kP jOn définit alors par récurrence <strong>de</strong>s suites <strong>de</strong> polynômes W n , Y n et G m par :– G m = pgcd(W m , Y m )– W m+1 = W m /G m et Y m+1 = Y m /G m − W m′On va montrer que P m = G m . Commençons au rang n = 1, on voit que P 1 diviseY 1 (puisqu’il est commun à tous les Π j≠k P j car k > 1) et divise W 1 . Et c’est le seulfacteur commun, car tout autre facteur irréductible serait un diviseur d’un P l pourl > 1, donc diviserait (l − 1)Pl ′ Π j≠l,j>1P j , donc diviserait Pl ′ . Le raisonnementen un rang quelconque est i<strong>de</strong>ntique, les polynômes sont donnés par :G m = P m , W m = Π k>=m P k , Y m = ∑ k > m(k − m)P ′ k Π j≥m,j≠kP jLorsqu’on programme cet algorithme, le test d’arrêt est G m = 1.Square-free factorisation (Algorithme <strong>de</strong> Yun)Argument : un polynôme primitif P à coefficients entiers (ou dans Z[i] ou dans uncorps <strong>de</strong> caractéristique nulle).Valeur renvoyée : une liste <strong>de</strong> polynômes P m telle que P = Π n k=1 P k k .1. Initialiser la liste résultat à liste vi<strong>de</strong>.45


2. Initialiser W à P et Y à P ′ . Calculer le pgcd G <strong>de</strong> W et Y et simplifier Wet Y par leur pgcd puis poser Y = Y − W ′ .3. Boucle infinie.4. Calculer le pgcd G <strong>de</strong> W et Y . Si G = 1, on renvoie la liste résultat sinonajouter G à la liste résultat.5. Simplifier W et Y par G, puis poser Y = Y − W ′ et passer à l’itérationsuivante.Remarque : lorsqu’on veut factoriser un polynôme à coefficients modulaires, ilfaut aussi se ramener à un polynôme sans facteurs multiples mais on ne peut pasutiliser cet algorithme tel quel car la caractéristique du corps n’est pas nulle.Exemple :Factorisation sans facteurs multiples <strong>de</strong> P(X) = (X 3 − 1)(X + 2) 2 (X 2 + 3) 3 .En mo<strong>de</strong> interactif avec un logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>, effectuons l’étape d’initialisation:W:=normal((x^3-1)*(x+2)^2*(x^2+3)^3);Y:=diff(W,x);G:=gcd(W,Y);x^5+2*x^4+6*x^3+12*x^2+9*x+18W:=normal(W/G);x^6+2*x^5+3*x^4+5*x^3+-2*x^2+-3*x-6Y:=normal(Y/G);Y:=normal(Y-diff(W,x));5*x^5+8*x^4+3*x^3+-5*x^2+-8*x-3On vérifie bien que W = (x + 2) ∗ (x 3 − 1) ∗ (x 2 + 3) est le produit <strong>de</strong>s facteursP i . On entame maintenant la boucle :G:=gcd(W,Y);x^3-1 -> P1Y:=normal(Y/G);W:=normal(W/G);Y:=normal(Y-diff(W,x));2*x^2+4*xG:=gcd(W,Y);x+2 -> P2Y:=normal(Y/G);W:=normal(W/G);Y:=normal(Y-diff(W,x));0G:=gcd(W,Y);x^2+3 -> P3puis W = 1 et Y = 0 et le prochain G vaut 1, on a bien trouvé tous les facteurs P i .8.2 Factorisation en une variableOn suppose maintenant qu’on veut factoriser un polynôme P sans facteur multiple(et primitif). En général on commence par simplifier P par ses facteurs linéaires(détectés avec l’algorithme présenté dans le premier article <strong>de</strong> cette série).46


On commence par chercher un nombre premier p tel que P dans Z/pZ conservele même <strong>de</strong>gré et reste sans facteur multiple (donc pgcd(P, P ′ )=1 dans Z/pZ), cequi est toujours possible (il suffit <strong>de</strong> prendre p plus grand que le plus grand entierapparaissant dans l’algorithme du sous-résultant pour <strong>calcul</strong>er le pgcd <strong>de</strong> P et P ′dans Z).ConventionTous les polynômes ayant leurs coefficients dans un corps fini sont supposés avoircomme coefficient dominant 1 lorsque le choix existe (par exemple les facteursd’un polynôme modulo p).8.2.1 Factorisation dans Z/pZ[X]On suppose qu’on a un polynôme P à coefficients dans Z/pZ sans facteurmultiple. Il s’agit <strong>de</strong> factoriser P dans Z/pZ[X]. Il existe essentiellement <strong>de</strong>uxstratégies, l’une commence par factoriser par groupes <strong>de</strong> facteurs <strong>de</strong> même <strong>de</strong>grépuis casse les facteurs et l’autre plus directe à base d’algèbre linéaire modulaire(métho<strong>de</strong> <strong>de</strong> Berlekamp). Dans les <strong>de</strong>ux cas, on utilise le fait que si F est un polynôme,alors les polynômes à coefficients dans Z/pZ modulo F forment un anneauA qui est aussi un espace vectoriel sur Z/pZ <strong>de</strong> dimension le <strong>de</strong>gré <strong>de</strong> F (si F estirréductible, alors A est un corps). On s’intéresse alors aux propriétés <strong>de</strong> l’applicationϕ : x ∈ A ↦→ x p . On observe d’abord que cette application est une applicationlinéaire. Cela découle du petit théorème <strong>de</strong> Fermat pour ϕ(λx) = λϕ(x) et <strong>de</strong> laformule <strong>de</strong> Newton et <strong>de</strong> la primalité <strong>de</strong> p pour ϕ(x + y) = ϕ(x) + ϕ(y).Calcul <strong>de</strong> ϕPour mettre en oeuvre ces algorithmes, on commence par déterminer la matrice<strong>de</strong> l’endomorphisme ϕ : x ↦→ x p dans Z/pZ[X] (mod P(X)) muni <strong>de</strong> sa basecanonique {1, X, ..., X <strong>de</strong>g(P)−1 }.8.2.2 Distinct <strong>de</strong>gree factorizationCette métho<strong>de</strong> consiste à détecter les groupes <strong>de</strong> facteurs ayant un <strong>de</strong>gré donné(distinct <strong>de</strong>gree factorization). Si nécessaire, on utilise ensuite un autre algorithmepour casser ces groupes. On utilise ici les propriétés <strong>de</strong>s itérées <strong>de</strong> l’applicationlinéaire ϕ sur <strong>de</strong>s espaces vectoriels <strong>de</strong> corps <strong>de</strong> base Z/pZ. On va déterminer leproduit P k <strong>de</strong> tous les facteurs <strong>de</strong> P <strong>de</strong> <strong>de</strong>gré k en <strong>calcul</strong>ant le pgcd <strong>de</strong> P et <strong>de</strong>X (pk) − X dans Z/pZ[X].Pour k = 1, X p − X est le produit <strong>de</strong>s X − k pour tout k ∈ Z/pZ par le petitthéorème <strong>de</strong> Fermat (k p = k (mod p)), donc le pgcd <strong>de</strong> P et <strong>de</strong> X (p1) − X dansZ/pZ[X] est le produit <strong>de</strong>s facteurs <strong>de</strong> P <strong>de</strong> <strong>de</strong>gré 1.Pour k > 1, le raisonnement se généralise <strong>de</strong> la manière suivante : on considèreun facteur irréductible F(X) <strong>de</strong> P <strong>de</strong> <strong>de</strong>gré k et le corps K = (Z/pZ)[Y ](mod F(Y )). Le corps K est un corps fini, c’est aussi un espace vectoriel surZ/pZ <strong>de</strong> dimension k, donc K possè<strong>de</strong> p k éléments et K ∗ est un groupe multiplicatifà p k −1 éléments, donc tout élément <strong>de</strong> K ∗ vérifie l’équation x pk −1 = 1 donctout élément <strong>de</strong> K vérifie x (pk) = x. En particulier pour x = Y (mod F(Y )) ontrouve que Y (pk) = Y (mod F(Y )) donc F(X) divise X (pk) − X dans Z/pZ.Réciproquement, si on se donne un facteur irréductible F qui divise X pk − X,47


soit K le corps correspondant à F , alors le noyau <strong>de</strong> l’application linéairex ∈ K ↦→ x pk − x ∈ Kest K tout entier, car Y = Y pk (mod F) entraine (Y 2 ) (pk) = Y 2pk = (Y pk ) 2 =Y 2 (mod F) et <strong>de</strong> même pour les autres puissances <strong>de</strong> Y qui, avec Y 0 = 1 égalementdans le noyau, forment une base <strong>de</strong> l’espace vectoriel K sur Z/pZ. Doncle nombre d’éléments <strong>de</strong> K est inférieur ou égal au <strong>de</strong>gré du polynôme X pk − X(puisque X (pk) − X est divisible par X − x pour tout x ∈ K), donc le <strong>de</strong>gré <strong>de</strong> Fest inférieur ou égal à k.Donc P k est égal au pgcd <strong>de</strong> P/Π j ok P est sans facteur multipleP1:=gcd(P,(x^5-x)mod 5);(1 mod 5)*x -2 mod 5 -> P1P:=normal(P/P1);P2:=gcd(P,(x^(5^2)-x)mod 5);1 mod 5 -> pas <strong>de</strong> facteur <strong>de</strong> <strong>de</strong>gre 2P3:=gcd(P,(x^(5^3)-x)mod 5);(x^6+2*x^5+x^2+x+2) mod 5Donc P admet 3 facteurs dans Z/5Z : un <strong>de</strong> <strong>de</strong>gré 1 (x − 2) et <strong>de</strong>ux <strong>de</strong> <strong>de</strong>gré 3(dont le produit est x 6 + 2x 5 + x 2 + x + 2).Le même <strong>calcul</strong> dans Z/7Z donneP:=normal((x^3+x+1)*(x^4-x+1) mod 7);gcd(P,diff(P,x));1 mod 7 -> ok P est sans facteur multipleP1:=gcd(P,(x^7-x)mod 7);1 mod 7P2:=gcd(P,(x^(7^2)-x)mod 7);48


1 mod 7P3:=gcd(P,(x^(7^3)-x)mod 7);(x^3+x+1) mod 7donc P possè<strong>de</strong> un facteur <strong>de</strong> <strong>de</strong>gré 3 modulo 7, donc le facteur restant <strong>de</strong> <strong>de</strong>gré 4est forcément irréductible.On remarque sur cet exemple que 7 est plus intéressant que 5, car la factorisationmodulo 7 donne moins <strong>de</strong> facteurs (à recombiner pour trouver la factorisationdans Z) et la factorisation est complète modulo 7 alors que modulo 5 il faut casserle facteur <strong>de</strong> <strong>de</strong>gré 6 en <strong>de</strong>ux facteurs <strong>de</strong> <strong>de</strong>gré 3. La plupart <strong>de</strong>s algorithmes <strong>de</strong>factorisation effectuent la factorisation en <strong>de</strong>gré distinct modulo plusieurs entiers(ce qui peut <strong>de</strong> plus être parallélisé) et choisissent le meilleur.8.2.3 La métho<strong>de</strong> <strong>de</strong> Cantor-ZassenhausCet algorithme sert à casser <strong>de</strong>s groupes <strong>de</strong> facteurs <strong>de</strong> même <strong>de</strong>gré, c’est unemétho<strong>de</strong> probabiliste. On suppose donc qu’on a un produit P d’au moins <strong>de</strong>uxfacteurs irréductibles <strong>de</strong> <strong>de</strong>gré d à casser. Soit D l’un <strong>de</strong>s polynômes irréductibles<strong>de</strong> <strong>de</strong>gré d à coefficients dans Z/pZ, et soit K = Z/pZ[Y ] (mod D(Y )), on a :X pd − X = Π α∈K (X − α)puisque le corps K possè<strong>de</strong> p d éléments tous racines <strong>de</strong> l’équation X pd = X.On considère un polynôme T non constant, et le polynôme T pd − T . En remplaçantX par T ci-<strong>de</strong>ssus, on en déduit :T pd − T = Π α∈K (T − α)Donc pour tout élément β ∈ K = Z/pZ[Y ] (mod D(Y )), on a(T pd − T)(β) = Π α∈K (T(β) − α) = 0Donc T pd −T est divisible par X pd −X (puisque toutes les racines du second sontracines du premier), donc est divisible par tout polynôme irréductible <strong>de</strong> <strong>de</strong>gréinférieur ou égal à d à coefficients dans Z/pZ. CommeT pd − T = T(T pd −12 − 1)(T pd +12 − 1) (10)et que ces trois facteurs sont premiers entre eux, on en déduit que tout polynômeirréductible <strong>de</strong> <strong>de</strong>gré inférieur ou égal à d à coefficients dans Z/pZ divise l’un <strong>de</strong>strois facteurs ci-<strong>de</strong>ssus. Pour casser P , l’idée consiste alors à <strong>calcul</strong>er le pgcd <strong>de</strong> Pet T pd −12 − 1 pour un polynôme pris au hasard. On sait que P divise le produit <strong>de</strong>s3 termes <strong>de</strong> (10), et on espère que les facteurs irréductibles <strong>de</strong> P ne diviseront pastous le même terme.On va montrer que si T est un polynôme <strong>de</strong> <strong>de</strong>gré ≤ 2d −1 choisi au hasard, laprobabilité que <strong>de</strong>ux facteurs irréductibles <strong>de</strong> P ne divisent pas T pd −T est proche<strong>de</strong> 0.5. Soient donc A et B <strong>de</strong>ux facteurs irréductibles <strong>de</strong> P <strong>de</strong> <strong>de</strong>gré d. D’aprèsl’i<strong>de</strong>ntité <strong>de</strong> Bézout, tout polynôme T <strong>de</strong> <strong>de</strong>gré ≤ 2d −1 s’écrit <strong>de</strong> manière uniquesous la forme :T = AU + BV (11)49


avec <strong>de</strong>gre(U ≤ d − 1) et <strong>de</strong>gre(V ≤ d − 1) et réciproquement une combinaisonlinéaire <strong>de</strong> cette forme est un polynôme <strong>de</strong> <strong>de</strong>gré ≤ 2d − 1. Choisir T au hasardrevient donc à choisir un couple (U, V ) <strong>de</strong> polynômes à coefficients dans Z/pZau hasard et <strong>de</strong> manière indépendante. D’autre part, A et B étant <strong>de</strong> <strong>de</strong>gré d, onsait que dans K = Z/pZ[Y ] (mod D(Y )) ces polynômes admettent d racines.Soit donc α [respectivement β] une racine <strong>de</strong> A [resp. B] dans K. Alors A diviseT pd −12 −1 si et seulement si T(α) pd −12 = 1 (et <strong>de</strong> même pour B et β) car T pd −12 −1a ses coefficients dans Z/pZ (et non dans K). En appliquant (11), A divise T pd −12 −1 si et seulement si :B(α) pd −12 V (α) pd −12 = 1Le premier terme <strong>de</strong> cette égalité est une constante égale à 1 ou -1, le second aune probabilité proche <strong>de</strong> 0.5 (égale à pd −1) <strong>de</strong> valoir 1 ou -1 car, comme A est2p dirréductible, V (α) décrit K lorsque V décrit les polynômes <strong>de</strong> <strong>de</strong>gré ≤ d − 1. Demême, B a une probabilité proche <strong>de</strong> 0.5 <strong>de</strong> diviser T pd −12 −1, et ces 2 probabilitéssont indépendantes puisque U et V le sont, donc la probabilité que soit A soit Bdivise divise T pd −12 − 1 est proche <strong>de</strong> 0.5.Algorithme <strong>de</strong> Cantor-ZassenhausArgument : Un polynôme P à coefficients dans Z/pZ <strong>de</strong> <strong>de</strong>gré k dont tous les facteursirréductibles sont <strong>de</strong> <strong>de</strong>gré d.Valeur renvoyée : la liste <strong>de</strong>s facteurs irréductibles <strong>de</strong> P .– Si k = d renvoyer une liste contenant P .– Déterminer un polynôme T aléatoire <strong>de</strong> <strong>de</strong>gré inférieur ou égal à 2d − 1 et<strong>de</strong> coefficient dominant 1. Calculer le pgcd D <strong>de</strong> P et <strong>de</strong> T (pd −1)/2 − 1. Sile <strong>de</strong>gré <strong>de</strong> T est égal à 0 ou à k recommencer cette étape.– Appeler récursivement cet algorithme avec T et P/T et renvoyer la listeréunion <strong>de</strong>s <strong>de</strong>ux listes renvoyées.Exemple :Cassons le polynôme <strong>de</strong> <strong>de</strong>gré 6 obtenu dans l’exemple précé<strong>de</strong>nt (modulo 5).Donc P := (x 6 +2∗x 5 +x 2 +x+2) (mod 5) et d = 3, 2d−1 = 5, (p d −1)/2 = 62.On choisit au hasard un polynôme <strong>de</strong> <strong>de</strong>gré inférieur ou égal à 5, par exempleT = x 4 −x 3 +x+1, puis on <strong>calcul</strong>e T 62 modulo P ce qui donne (x 5 +x 3 +x 2 +1)(mod 5) puis le pgcd <strong>de</strong> T 62 − 1 et <strong>de</strong> P qui vaut x 3 + x + 1 (mod 5), on a donccassé P en <strong>de</strong>ux. En prenant T := x 4 − x 3 + x + 2, on trouve T 62 = 1 (mod P),donc ce T n’aurait pas permis <strong>de</strong> casser P .8.2.4 La métho<strong>de</strong> <strong>de</strong> BerlekampCette métho<strong>de</strong> permet <strong>de</strong> factoriser un polynôme sans facteurs multiples, ellepeut aussi servir à casser <strong>de</strong>s groupes <strong>de</strong> facteurs <strong>de</strong> même <strong>de</strong>gré. Ici on travailledans l’anneau <strong>de</strong>s polynômes à coefficients dans Z/pZ modulo le polynôme P eton s’intéresse au noyau <strong>de</strong> ϕ − Id (où ϕ : x ↦→ x p ). On suppose que P = Π n j=1 F joù les F j sont irréductibles et premiers entre eux. On va montrer que le noyau <strong>de</strong>ϕ − Id est composé <strong>de</strong>s polynômes Q tels que Q (mod F j ) est constant (dansZ/pZ) pour tout j.50


Si Q (mod F j ) = s j ∈ Z/pZ, alors Q p (mod F j ) = s p j = s j, donc par lethéorème <strong>de</strong>s restes chinois, Q = Q p (mod P).Réciproquement, si Q p − Q = 0 (mod P), en utilisant la factorisation :X p − X = Π j∈Z/pZ (X − j)on en tire P divise Q p −Q = Π j∈Z/pZ (Q(X)−j), donc F j divise l’un <strong>de</strong>s facteurset Q(X) (mod F j ) ∈ Z/pZ. Le noyau <strong>de</strong> ϕ − Id est donc un espace vectoriel <strong>de</strong>dimension n, le nombre <strong>de</strong> facteurs irréductibles <strong>de</strong> P et possè<strong>de</strong> donc p n éléments(en effet pour tout n uplet <strong>de</strong> s j , on peut construire un polynôme Q du noyau parle théorème <strong>de</strong>s restes chinois en posant Q (mod F j ) = s j ).L’intérêt du noyau <strong>de</strong> ϕ − Id est qu’on peut le <strong>calcul</strong>er sans connaitre les F j .Une fois ce <strong>calcul</strong> fait, voyons comment on peut remonter aux F j . On connaitdéjà la dimension du noyau donc le nombre <strong>de</strong> facteurs irréductibles. De plus, onremarque que le polynome constant est un élément du noyau qu’on appellera T 1 , onnote alors T 2 , ..., T n les autres polynômes du noyau. Ensuite, on <strong>calcul</strong>e le pgcd <strong>de</strong>P avec T 2 − jT 1 pour j ∈ Z/pZ. On sait que T 2 = s 2,j (mod F j ), donc ce pgc<strong>de</strong>st égal au produit <strong>de</strong>s facteurs F j tels que s 2,j = jT 1 . L’un au moins <strong>de</strong>s pgcd<strong>calcul</strong>és est non trivial car sinon T 2 = T 1 (mod F j ) pour tout j donc T 2 = T 1 . Sion a <strong>de</strong> la chance tous les s 2,j seront distincts et les pgcd non triviaux <strong>de</strong> P avecT 2 − jT 1 donneront les F k . Sinon il faudra continuer avec T 3 − jT 1 etc.Exemple :Revenons sur la factorisation <strong>de</strong> P := (x 6 +2x 5 +x 2 +x+2) (mod 5). Commençonspar <strong>calcul</strong>er la matrice <strong>de</strong> ϕ dans la base {1, x, x 2 , ..., x 5 }. On a évi<strong>de</strong>mmentϕ(1) = 1 et ϕ(x) = x 5 , puis ϕ(x 2 ) = x 10 = x 5 +x 4 −2x 3 +x (mod P), puis enmultipliant par x 5 et en divisant par P , ϕ(x 3 ) = −x 4 + 2x 3 , <strong>de</strong> la même manièreon obtient ϕ(x 4 ) = −x 5 + 2x 4 + x 3 − x 2 − 2 et ϕ(x 5 ) = x 3 + x 2 − x. La matrice<strong>de</strong> ϕ est donc :⎛⎞1 0 0 0 −2 00 0 1 0 0 −1M =0 0 0 0 −1 1⎜ 0 0 −2 2 1 1⎟⎝ 0 0 1 −1 2 0 ⎠0 1 1 0 −1 0On <strong>calcul</strong>e ensuite le noyau <strong>de</strong> ϕ − Id (comme matrice à coefficients dans Z/5Z),on obtient une base du noyau en prenant par exemple les vecteurs (−1, 0, 0, 0, 0, 0)et (0, 0, −1, −1, 0, −1). Donc le polynôme P possè<strong>de</strong> 2 facteurs dans Z/5Z[X].Pour déterminer les facteurs, on <strong>calcul</strong>e le pgcd <strong>de</strong> P avec le polynôme T 2 − s oùT 2 = −x 5 − x 3 − x 2 correspond au 2ème vecteur <strong>de</strong> la base du noyau. On obtientpour s = 0 un pcgd non trivial (x 3 +x+1), ce qui permet <strong>de</strong> <strong>calcul</strong>er les 2 facteurs.Si on avait essayé d’autres valeurs <strong>de</strong> s, pour s = 1 on obtient comme pgcd 1, pours = 2 on trouve le 2ème facteur x 3 + 2x 2 − x + 2.8.2.5 Remontée (Hensel)Il s’agit <strong>de</strong> passer d’une factorisation <strong>de</strong> P dans Z/pZ[X] à une factorisation<strong>de</strong> P dans Z/p k Z[X], la métho<strong>de</strong> est analogue à celle <strong>de</strong> l’algorithme EZGCD <strong>de</strong><strong>calcul</strong> <strong>de</strong> pgcd <strong>de</strong> polynômes.51


On suppose donc queP = Π n j=1P j (mod p)où les P j sont premiers entre eux <strong>de</strong>ux à <strong>de</strong>ux dans Z/pZ. Il s’agit <strong>de</strong> trouver <strong>de</strong>spolynômes P j,k = P j (mod p) tels queCommençons par le cas k = 2. On poseOn a alors :Donc :P = Π n j=1P j,k (mod p k )P j,2 = P j + pQ j = P j (mod p)P = Π n j=1P j,2 (mod p 2 ) = Π n j=1(P j + pQ j ) (mod p 2 )n∑= Π n j=1P j + p Q j Π k≠j P k (mod p 2 )n∑j=1j=1Q j Π k≠j P k = P − Πn j=1 P jp(mod p)On est ramené à résoudre une i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée. On montrera dansl’appendice le :Théorème 4 (I<strong>de</strong>ntité <strong>de</strong> Bézout généralisée) Soit P 1 , ..., P n (n ≥ 2) <strong>de</strong>s polynômespremiers entre eux <strong>de</strong>ux à <strong>de</strong>ux modulo p. Alors pour tout polynôme Q, ilexiste <strong>de</strong>s polynômes Q 1 , ..., Q n tels que :n∑Q j Π k≠j P k = Q (mod p)j=1On a donc réussi à remonter l’égalité P = ΠP j (mod p) à P = ΠP j,2(mod p 2 ). Le passage <strong>de</strong> P = ΠP j,l (mod p l ) à P = ΠP j,l+1 (mod p l+1 ) esti<strong>de</strong>ntique, on a :P j,l+1 = P j,l + p l Q joù les Q j sont les solutions <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée avec :Q = P − Πn j=1 P j,lp lLorsqu’on programme cet algorithme (cf. l’appendice), on <strong>calcul</strong>e une foispour toutes les solutions <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout pour Q = 1, et on multiplie par Q.Algorithme <strong>de</strong> remontée <strong>de</strong> Hensel linéaireArguments : Un polynôme P à coefficients entiers, la liste L = {P j } <strong>de</strong> ses facteursdans Z/pZ[X]Valeur renvoyée : la liste <strong>de</strong>s facteurs <strong>de</strong> P dans Z/p l Z[X]On <strong>calcul</strong>e la borne <strong>de</strong> Landau-Mignotte 6 pour les facteurs <strong>de</strong> P , on multiplie parle coefficient dominant <strong>de</strong> P et on <strong>calcul</strong>e l tel que p l est strictement plus grand que<strong>de</strong>ux fois cette quantité. On <strong>calcul</strong>e aussi les polynômes Q j <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézoutgénéralisée pour Q = 1Puis on fait une boucle pour k variant <strong>de</strong> 2 à l :6 Rappelons qu’il s’agit d’une majoration sur la valeur absolue <strong>de</strong>s coefficients <strong>de</strong>s facteurs <strong>de</strong> P52


– On détermine P −Π j P j (mod p k ), on divise par p k−1 et on place le résultatdans Q– On multiplie les polynômes Q j <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée (correspondantsau polynôme 1) par Q et on détermine le reste <strong>de</strong> la division euclidienne<strong>de</strong> QQ j par P j , on multiplie par p k−1 et on ajoute le résultat àP j .Il existe une version quadratique <strong>de</strong> cette métho<strong>de</strong>. On passe alors <strong>de</strong> P =ΠP j,l (mod p l ) à P = ΠP j,2l (mod p 2l ). Pour cela, il faut trouver les polynômesQ j solutions <strong>de</strong> l’équation :n∑Q j Π k≠j P k,l = Q (mod p l )j=1Pour l = 1, c’est l’i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée, mais ce n’est plus le cas pourl > 1. En fait, on résout cette égalité en remontant l’i<strong>de</strong>ntité <strong>de</strong> Bézout quadratiquement,plus précisément pour trouver les S j solutions <strong>de</strong>n∑S j Π k≠j P k,2l = Q (mod p 2l )j=1on pose S j = Q j + p l R j , il s’agit donc <strong>de</strong> trouver les R j solutions <strong>de</strong>n∑(Q j + p l R j )Π k≠j P k,2l = Q (mod p 2l )soit :n∑j=1j=1R j Π k≠j P k,l = Q − ∑ nj=1 Q jΠ k≠j P k,lp l (mod p l )on en déduit les R j .Algorithme <strong>de</strong> remontée <strong>de</strong> Hensel quadratiqueArguments et valeur renvoyée i<strong>de</strong>ntiques à l’algorithme <strong>de</strong> remontée <strong>de</strong> Hensellinéaire ci-<strong>de</strong>ssus.On commence comme dans le cas linéaire par <strong>calcul</strong>er les coefficients <strong>de</strong> l’i<strong>de</strong>ntité<strong>de</strong> Bézout généralisée pour Q = 1 et la valeur <strong>de</strong> l telle que p 2l soit supérieur à<strong>de</strong>ux fois la borne <strong>de</strong> Landau <strong>de</strong>s facteurs <strong>de</strong> P fois le coefficient dominant <strong>de</strong> P .On fait une boucle sur k variant <strong>de</strong> 1 à l :– On <strong>calcul</strong>e P − Π j P j (mod p 2k ), on divise par p 2k−1 et on place le résultatdans Q– On multiplie par Q les polynômes Q j <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée(avec comme second membre le polynôme 1), on <strong>calcul</strong>e le reste euclidiendu résultat par P j (modulo p 2k−1 ), on multiplie par p 2k−1 et on ajoute à P j(avec les notations précé<strong>de</strong>ntes, on passe ainsi <strong>de</strong>s P j,2 k−1 aux P j,2 k)– Si k = l on renvoie la liste <strong>de</strong>s P j– On <strong>calcul</strong>e 1 − ∑ j Q jΠ k≠j P k (mod p 2k ), on divise par p 2k−1 et on placele résultat dans Q– On multiplie par Q les polynômes Q j <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout, généralisée eton <strong>calcul</strong>e le reste euclidien du résultat par P j (modulo p 2k−1 ), on multipliepar p 2k−1 et on ajoute à Q j (ce qui ajuste les polynômes Q j qui vérifientmaintenant l’i<strong>de</strong>ntité <strong>de</strong> Bézout modulo p 2k )53


RemarquePendant l’étape <strong>de</strong> remontée <strong>de</strong> Hensel, une optimisation classique consiste à testerla divisibilité dans Z du polynôme P par le facteur lifté P j ( 7 ) lorsqu’il n’apas subi <strong>de</strong> modification pendant 2 étapes successives (autrement dit lorsque P j(mod p l ) = P j (mod p l+1 ) (ou (mod p 2l ) pour le lift quadratique). Si la divisionest exacte, on obtient un facteur irréductible <strong>de</strong> P dans Z. On re<strong>calcul</strong>e alorsla borne <strong>de</strong> Landau <strong>de</strong> P/P j pour diminuer le nombre d’itérations à effectuer danscette étape.Exemple :Reprenons le polynôme P(X) = (X 3 +X +1)(X 4 −X +1) et supposons qu’onait choisi <strong>de</strong> le factoriser modulo 5 puis <strong>de</strong> remonter. On a 3 facteurs a = x − 2,b = x 3 + x + 1 et c = x 3 + 2x 2 − x + 2. Si on développe P , on trouve 6coefficients non nuls <strong>de</strong> valeur absolue 1, on peut <strong>calcul</strong>er la borne <strong>de</strong> Landau-Mignotte correspondante sur les coefficients d’un facteur entier : 2 5 ( √ (6) + 1)soit un peu plus <strong>de</strong> 110, il suffit donc d’effectuer 3 étapes <strong>de</strong> remontée linéaire(5 4 = 625 > 111/2). On commence par trouver 3 polynômes A, B, C tels queA(x 3 + x + 1)(x 3 + 2x 2 − x + 2) + B(x − 2)(x 3 + 2x 2 − x + 2)++C(x − 2)(x 3 + x + 1) = 1 (mod 5)On commence par résoudre D(x 3 + 2x 2 − x + 2) + C(x − 2)(x 3 + x + 1) = 1(mod 5), on trouve C = 2x 2 −2 et D = −2x 3 −2x 2 +2x+1. Puis on <strong>calcul</strong>e A etB en résolvant E(x 3 +x+1)+F(x −2) = 1 qui donne E = 1 et F = −x 2 −2xqu’on multiplie par D, donc A = D et B = 2x 5 + x 4 + 2x 3 − 2x. Ce qui donnel’i<strong>de</strong>ntité <strong>de</strong> Bézout généralisée.Passons aux <strong>calcul</strong>s <strong>de</strong> remontée. On a abc = x 7 −4x 5 +5x 4 + −9x 3 −x 2 −4et P = x 7 + x 5 + x 3 − x 2 + 1, donc Q = (P − abc)/5 = x 5 − x 4 + 2x 3 + 1. Onpose alorsdonc :a 1 = a + 5 (QA (mod a)) (mod 25),b 1 = b + 5 (QB (mod b)) (mod 25),c 1 = c + 5 (QC (mod c)) (mod 25)a 1 = a + 5 × (−2), b 1 = b + 5 × 0, c 1 = c + 5 × (2x 2 − x)En principe, on continue encore 2 itérations <strong>de</strong> la même manière. La 2ème itérationdonne :Q = (P − a 1 b 1 c 1 )/25 = 6x 5 − 3x 4 + 7x 3 + 3x 2 − 2x + 1a 2 = a 1 + 25 (QA (mod a)) (mod 125),b 2 = b 1 + 25 (QB (mod b)) (mod 125),c 2 = c 1 + 25 (QC (mod c)) (mod 125)donc :a 2 = a 1 +25(−1) = x−37, b 2 = b 1 = b, c 2 = c 1 +25(x 2 +1) = x 3 +37x 2 −6x+277 Plus exactement, on multiplie P j par le coefficient dominant <strong>de</strong> P modulo p l54


On peut aussi observer que b 1 = b, ceci laisse à penser que b est un facteur <strong>de</strong> Pdans Z ce qu’on vérifie en effectuant la division euclidienne <strong>de</strong> P par b = x 3 +x+1.Comme elle tombe juste, on est ramené à factoriser x 4 − x + 1 et donc à remonterla factorisation <strong>de</strong> ac. La borne <strong>de</strong> Landau diminue à 8( √ 3 + 1) puisque le <strong>de</strong>gréest 4 et la norme euclidienne du polynôme est √ 3. Il suffit alors <strong>de</strong> remonter dansZ/125Z au lieu <strong>de</strong> Z/625Z (on gagne ainsi une itération).8.2.6 Combinaison <strong>de</strong> facteursLorsqu’on a les facteurs <strong>de</strong> P dans Z/p k Z[X] avec p k plus grand que le produitdu coefficient dominant <strong>de</strong> P multiplié par la borne <strong>de</strong> Landau-Mignotte surles coefficients <strong>de</strong> P , on commence par tester la divisibilité dans Z[X] <strong>de</strong> P parchaque facteur trouvé multiplié par le coefficient dominant <strong>de</strong> P . Si la division estexacte, on a un facteur irréductible, mais si elle n’est pas exacte il peut se produirequ’un facteur irréductible <strong>de</strong> P dans Z[X] soit un produit <strong>de</strong> <strong>de</strong>ux, voir plusieurs,facteurs modulaires. Il faut donc tester la divisibilité <strong>de</strong> P dans Z[X] par toutes lescombinaisons possibles <strong>de</strong> produits <strong>de</strong> facteurs modulaires (toujours multiplié parle coefficient dominant <strong>de</strong> P ). Cette étape peut être exponentiellement longue si lenombre <strong>de</strong> facteurs modulaires est grand et si par exemple P est irréductible, bienque les cas soient très rares.Algorithme <strong>de</strong> recombinaisonArguments : un polynôme à coefficients entiers, primitif et sans facteur multipleP <strong>de</strong> coefficient dominant p n , la liste L <strong>de</strong>s facteurs <strong>de</strong> P dans Z/p l Z[X] pour lassez grand et p lValeur <strong>de</strong> retour : la liste F <strong>de</strong>s facteurs <strong>de</strong> P dans Z.Initialiser F à vi<strong>de</strong>, initialiser le nombre <strong>de</strong> facteurs à combine c à 1, entamer uneboucle infinie :– Si c est strictement supérieur au cardinal <strong>de</strong> L divisé par 2, ajouter le quotient<strong>de</strong> P par le produit <strong>de</strong>s facteurs <strong>de</strong> F à F et retourner F– Initialiser un vecteur v = (v 1 , ..., v c ) à c composantes à la valeur (1, ..., c)– Boucle indéfinie intérieure :1. Faire le produit <strong>de</strong>s facteurs <strong>de</strong> F d’indice v, multiplier par p n dansZ/p l Z, écrire le facteur en représentation symétrique, le rendre primitifet tester si c’est un facteur <strong>de</strong> P dans Z.2. Si on a trouvé un facteur, le rajouter à la liste F et supprimer les indices<strong>de</strong> v <strong>de</strong> la liste L, terminer cette boucle intérieure.3. Sinon, incrémenter v <strong>de</strong> la manière suivante :On fait une boucle sur un in<strong>de</strong>x m initialisé à la taille <strong>de</strong> v, diminuant<strong>de</strong> 1 à chaque itération : on ajoute 1 à l’élement <strong>de</strong> v d’indice m, sil’élément obtenu est inférieur ou égal au cardinal <strong>de</strong> L + m − n, onarrête cette boucle, sinon on passe à l’itération suivante. Si m = 0 à lafin <strong>de</strong> la boucle, v ne peut pas être incrémenté.4. Si v ne peut être incrémenté, on incrémente c et on termine la boucleintérieure.5. Sinon on fait une boucle à nouveau sur m en partant <strong>de</strong> la valeur actuelleincrémentée <strong>de</strong> 1, et tant que m ≤ n on pose v m = v m−1 + 1.Puis on passe à l’itération suivante <strong>de</strong> la boucle intérieure.55


Il existe différentes métho<strong>de</strong>s qui améliorent la complexité <strong>de</strong> cette étape :– La recherche <strong>de</strong>s <strong>de</strong>gré possibles <strong>de</strong> facteurs fondée sur la factorisation en<strong>de</strong>grés distincts pour différents nombres premiers permet d’éviter <strong>de</strong>s tests<strong>de</strong> division si une combinaison <strong>de</strong> facteurs est d’un <strong>de</strong>gré exclu par la factorisationpour d’autres nombres premiers.– Le test <strong>de</strong> divisibilité du coefficient dominant ou du coefficient constant permetaussi d’éviter <strong>de</strong>s divisions complètes <strong>de</strong> polynômes.Mais ces astuces n’évitent pas l’énumération <strong>de</strong> toutes les combinaisons possibles<strong>de</strong> facteurs et donc la complexité exponentielle. Lorsque les combinaisons d’unpetit nombre <strong>de</strong> facteurs (par exemple 3) échouent, les systèmes récents utilisentl’algorithme knapsack <strong>de</strong> Van Hoeij basé sur l’algorithme LLL (recherche <strong>de</strong> based’un réseau ayant <strong>de</strong>s vecteurs <strong>de</strong> petite norme) qui permet d’eliminer complètementcette complexité exponentielle.Exemple :Toujours le même exemple, il nous restait <strong>de</strong>ux facteurs dans Z/125Z, le facteurx 3 + x + 1 ayant été détecté comme un facteur <strong>de</strong> P = x 7 + x 5 + x 3 − x 2 + 1dans Z. On teste chacun <strong>de</strong>s facteurs a 2 = x − 37 et c 2 = x 3 + 37x 2 − 6 ∗ x + 27séparément, sans succès. On les multiplie alors modulo 125, ce qui donne x 4 −x + 1 en représentation symétrique qui est bien un facteur <strong>de</strong> P (donc un facteurirréductible).8.3 Factorisation à plusieurs variablesComme pour le PGCD en plusieurs variables, on se ramène d’abord en unevariable, en général on évalue toutes les variables sauf celle correspondant au <strong>de</strong>grépartiel le plus faible. On factorise ensuite en une variable puis on remonte. Achaque étape <strong>de</strong> remontée, il peut être à nouveau nécessaire <strong>de</strong> combiner plusieursfacteurs. Différentes stratégies existent, comme pour le PGCD : factorisarion heuristique(avec reconstruction z-adique), remontée variable par variable ou toutes lesvariables en même temps comme dans EZGCD. On va présenter ici plus en détailsl’algorithme <strong>de</strong> factorisation heuristique.Soit P un polynôme en X 1 , ..., X n à coefficients entiers avec n > 1, on choisitune <strong>de</strong>s variables par exemple X n , qu’on notera X dans la suite. On considèreP comme un polynôme en X 1 , ..., X n−1 à coefficients dans Z[X]. On supposeque P est primitif (quitte à extraire son contenu qui est dans Z[X]). On <strong>calcul</strong>eensuite P(z) pour un entier z tel que 8 |z| ≥ 2|P | + 2. On factorise P(z) dansZ[X 1 , ..., X n−1 ] :P(z)(X 1 , ..., X n−1 ) = c(z)Π k j=1p j (X 1 , ..., X n−1 ) (12)où c est le contenu du polynôme P(z) (comme polynôme en n − 1 variables àcoefficients entiers). Il s’agit <strong>de</strong> reconstruire les facteurs <strong>de</strong> P à partir <strong>de</strong>s p j et <strong>de</strong>c. Deux problèmes se posent alors, celui <strong>de</strong> la recombinaison possible <strong>de</strong> plusieursfacteurs p j pour obtenir un facteur irréductible <strong>de</strong> P , et l’existence d’un facteurentier du contenu c à combiner avec un ou plusieurs p j pour obtenir ce facteurirréductible. Plus précisément, si P k est un facteur irréductible <strong>de</strong> P , on a :P k (z) = d(z)Π certains jp j , où d(z) divise c(z) (13)8 Ici |P | désigne le plus grand coefficient <strong>de</strong> P en valeur absolue56


On a le :Théorème 5 Soit P(X 1 , ..., X n−1 , X) un polynôme à coefficients entiers ayantau moins 2 variables. On suppose que P est primitif vu comme polynôme en lesvariables X 1 , ..., X n−1 à coefficients dans Z[X]. Il existe une majoration C ducontenu |c(z)| <strong>de</strong> P évalué en X = z (plus précisément on peut trouver un entierC tel que c(z) divise C).Il existe un nombre fini <strong>de</strong> z tels que l’un <strong>de</strong>s facteurs irréductibles P k <strong>de</strong> P évaluéen X = z soit réductible (c’est-à-dire tels que (13) admette plusieurs facteurs p jdistincts)PreuvePour déterminer C, on remarque que les facteurs du contenu <strong>de</strong> P(z) sont <strong>de</strong>sfacteurs communs <strong>de</strong>s coefficients <strong>de</strong> P évalués en z vu comme polynôme enX 1 , ..., X n−1 à coefficients dans Z[X]. Donc c(z) divise le générateur <strong>de</strong> l’idéal engendrépar ces coefficients (ce générateur est un polynôme <strong>de</strong> Z[X] qui est constantcar on a supposé P primitif), on peut aussi dire que <strong>de</strong>ux au moins <strong>de</strong>s coefficientsdans Z[X] <strong>de</strong> P sont premiers entre eux, alors c(z) divise le coefficient <strong>de</strong> l’i<strong>de</strong>ntité<strong>de</strong> Bézout <strong>de</strong> ces 2 coefficients vu comme polynômes en X.Considérons maintenant un facteur irréductible P k <strong>de</strong> P <strong>de</strong> <strong>de</strong>gré d par rapportà X. Pour X 1 , ..., X n−1 fixés, on factorise P k sur C :P k (X) = p k Π d j=1(X − z j )On va maintenant se restreindre à un domaine <strong>de</strong>s X 1 , ..., X n−1 sur lequel les z j ontune dépendance analytique par rapport à X 1 , ..., X n−1 . Pour cela on veut appliquerle théorème <strong>de</strong>s fonctions implicites pour déterminer z j au voisinage d’une solutiondonnée. On <strong>calcul</strong>e donc la dérivée Pk ′ <strong>de</strong> P k par rapport à X. On sait que P n’apas <strong>de</strong> facteurs multiples, donc P k et Pk ′ sont premiers entre eux, donc d’aprèsl’i<strong>de</strong>ntité <strong>de</strong> Bézout, il existe un polynôme non nul D dépendant <strong>de</strong> X 1 , ..., X n−1et <strong>de</strong>ux polynômes U et V dépendant <strong>de</strong> X 1 , ..., X n−1 , X tels que :UP k + V P ′ k = DSi D(X 1 , ..., X n−1 ) ne s’annule pas, on va pouvoir appliquer le théorème <strong>de</strong>s fonctionsimplicites. On se fixe x 1 , .., x n−1 , on <strong>calcul</strong>e dans C les racines z j du polynômeP(x 1 , .., x n−1 , X) pour une solution z j telle que P(x 1 , .., x n−1 , z j ) = 0,comme D est non nul, on a P ′ (x 1 , ..., x n−1 , z j ) ≠ 0, donc on peut écrire au voisinage<strong>de</strong> (x 1 , .., x n−1 )z j = z j (X 1 , ..., X n−1 ), P(X 1 , ..., X n−1 , z j ) = 0avec <strong>de</strong>s fonctions z j analytiques. Si D est constant, D ne s’annule pas, sinon quitteà permuter les variables, on peut supposer que le <strong>de</strong>gré <strong>de</strong> D par rapport à X 1 estnon nul. On peut alors se restreindre à une zone X 1 >> X 2 >> .. >> X n−1 >>1 où D sera non nul ce qui permet <strong>de</strong> suivre analytiquement les z j .Supposons maintenant qu’il existe un nombre infini <strong>de</strong> z tels P k (z) soit réductible.Alors il existe un ensemble infini Z <strong>de</strong> ces valeurs <strong>de</strong> z pour lesquels l’un <strong>de</strong>sfacteurs à coefficients entiers f j <strong>de</strong> P k (z) correspond à un même sous-ensemble R57


<strong>de</strong>s racines z j <strong>de</strong> P k et à un même contenu c (puisqu’il y a un nombre fini <strong>de</strong> combinaisonspossibles <strong>de</strong>s racines en facteur et un nombre fini <strong>de</strong> diviseurs possiblesdu contenu <strong>de</strong> P k ). Pour z ∈ Z, on a :f j (X 1 , ..., X n , z) = cΠ l∈R (z − z j ), f j ∈ Z[X 1 , ..., X n−1 ]Soit L(X) le polynôme obtenu par interpolation <strong>de</strong> Lagrange en cardinal(R) + 1points z <strong>de</strong> Z, égal à f j en X = z. Pour <strong>de</strong>s raisons <strong>de</strong> <strong>de</strong>gré, on a :L = cΠ l∈R (X − z j )donc L est un facteur <strong>de</strong> P . De plus L est un polynôme en X 1 , ..., X n−1 , X à coefficientsrationnels (par construction). Ceci vient en contradiction avec l’hypothèseP k irréductible, car on a construit un facteur <strong>de</strong> P k à coefficients rationnels L <strong>de</strong><strong>de</strong>gré strictement inférieur.CorollairePour z assez grand, la reconstruction z-adique <strong>de</strong> c(z)p j (z) est un polynôme dontla partie primitive est un facteur irréductible <strong>de</strong> P .Preuve du corollaireOn prend z assez grand pour que tous les facteurs irréductibles <strong>de</strong> P évalués enz aient un seul facteur polynomial (i.e. soient <strong>de</strong> la forme d(z)p j (z)). Quitte àaugmenter z, on peut supposer que |z| > 2CL où C est la majoration <strong>de</strong> |c(z)| etL est la borne <strong>de</strong> Landau sur les facteurs <strong>de</strong> P . Alors la reconstruction z-adique <strong>de</strong>c(z)p j (z) est c(z)/d(z)P j , donc sa partie primitive est un facteur irréductible <strong>de</strong>P .Algorithme <strong>de</strong> factorisation heuristique à plusieurs variablesArgument : un polynôme P primitif en au moins 2 variables.Valeur renvoyée : les facteurs irréductibles <strong>de</strong> PChoisir la variable X par rapport à laquelle P est <strong>de</strong> plus bas <strong>de</strong>gré puis factoriserle contenu <strong>de</strong> P vu comme polynôme à coefficients dans Z[X]. Initialiser un entierz à 2|P | + 2 (où |P | est le plus grand coefficient entier <strong>de</strong> P en valeur absolue) etune liste L à la factorisation <strong>de</strong> du contenu <strong>de</strong> P .Boucle indéfinie :– Si P = 1 renvoyer la liste L <strong>de</strong>s facteurs <strong>de</strong> P .– Tant que pgcd(P(z), P ′ (z)) = 0 incrémenter z <strong>de</strong> 1.– Factoriser P(z) = c(z)Πp j– Pour tous les facteurs p j , déterminer le polynôme P j tel que c(z)p j = P j (z)par remontée z-adique (avec les coefficients <strong>de</strong> P j écrit en représentationsymétrique, <strong>de</strong> valeur absolue plus petite que |z|/2). Tester si la partie primitive<strong>de</strong> P j divise P . Si oui, rajouter un facteur irréductible à la liste L, etdiviser P par ce facteur.– Augmenter z, par exemple remplacer z par la partie entière <strong>de</strong> √ 2z.8.4 Preuve <strong>de</strong> l’i<strong>de</strong>ntité <strong>de</strong> Bézout généraliséeElle se fait par récurrence. Pour n = 2, c’est l’i<strong>de</strong>ntité <strong>de</strong> Bézout usuelle. Pourpasser du rang n − 1 au rang n, on isole P n dans l’i<strong>de</strong>ntité à résoudre :⎛⎞n−1∑⎝ Q j (Π 1≤k≤n−1,k≠j P k ) ⎠ P n + Q n Π k≤n−1 P k = Q (mod p)j=158


Comme P n est premier avec Π k≤n−1 P k , en appliquant Bézout, on trouve <strong>de</strong>uxpolynômes Q n et R n tels que :Il reste à résoudreR n P n + Q n Π k≤n−1 P k = Q (mod p) (14)n−1∑Q j Π 1≤k≤n−1,k≠j P k = R n (mod p)j=1ce que l’on peut faire par hypothèse <strong>de</strong> récurrence.8.5 Algorithme <strong>de</strong> Bézout généraliséArguments : une liste P 1 , ..., P n <strong>de</strong> polynômes premiers entre eux 2 à 2 et unpolynôme Q à coefficients dans Z/pZValeur renvoyée : la liste <strong>de</strong> polynômes Q 1 , ..., Q n tels quen∑Q j Π k≠j P k = Q (mod p)j=1On peut commencer par <strong>calcul</strong>er le produit <strong>de</strong> tous les P k puis faire une boucle surj pour <strong>calcul</strong>er les produits <strong>de</strong>s P k pour k ≠ j en divisant le produit complet par P j(on fait ainsi n−1 multiplications et n divisions au lieu <strong>de</strong> n(n−1) multiplications).Boucle indéfinie sur n décrémenté <strong>de</strong> 1 par itération :– Si n = 2, on rajoute à la liste résultat les polynômes Q 1 et Q 2 <strong>de</strong> l’algorithme<strong>de</strong> Bézout usuel et on renvoie la liste– Sinon, on <strong>calcul</strong>e les polynômes R n et Q n vérifiant (14), on rajoute Q n endébut <strong>de</strong> liste, on remplace Q par R n .Remarquons que lorsque nous utiliserons cet algorithme, Q sera la différence entre<strong>de</strong>ux polynômes <strong>de</strong> même <strong>de</strong>gré (le <strong>de</strong>gré <strong>de</strong> P ) et <strong>de</strong> même coefficient dominant1, on peut donc remplacer les Q i par le reste euclidien <strong>de</strong> Q i par P i sans changerl’égalité.8.6 Pour en savoir plusPour factoriser <strong>de</strong>s polynômes ayant <strong>de</strong>s coefficients dans <strong>de</strong>s extensions algébriques,il existe un algorithme assez simple, l’algorithme <strong>de</strong> Trager, qui n’est pasforcément le plus performant (la recherche est encore active dans ce domaine), cf.le livre <strong>de</strong> Henri Cohen pp. 142-144.Pour factoriser sur <strong>de</strong>s corps finis, on peut consulter la thèse <strong>de</strong> Bernardin disponiblesur le web (http://www.bernardin.lu).On peut aussi consulter le co<strong>de</strong> source <strong>de</strong> Mupad, les routines <strong>de</strong> factorisationse trouvent dans le répertoire lib/POLYLIB/FACLIB après avoir désarchivé lalib.tar. Le point d’entrée pour factoriser <strong>de</strong>s polynômes à plusieurs variablessur Z est le fichier mfactor.mu, on observera que l’algorithme utilisé par Mupa<strong>de</strong>st assez différent <strong>de</strong> celui qu’on a détaillé dans la section précé<strong>de</strong>nte.59


8.7 Exercices (factorisation <strong>de</strong>s polynômes)1. Déterminer le nombre <strong>de</strong> racines <strong>de</strong> −x 7 + x 4 + 12x − 5 comprises entre 0et 6 (en utilisant les suites <strong>de</strong> Sturm, on donnera les détails <strong>de</strong>s <strong>calcul</strong>s).2. Écrire un programme <strong>calcul</strong>ant la suite <strong>de</strong> Sturm d’un polynôme supposésquarefree (on peut tester avec sqrfree), en utilisant l’algorithme d’Eucli<strong>de</strong>.3. Trouver les facteurs <strong>de</strong> <strong>de</strong>gré 1 s’ils existent <strong>de</strong> 3x 5 +25x 4 +67x 3 +77x 2 +55x+13 en remontant ses racines dans Z/pZ[X] pour p premier bien choisi.4. Factoriser le polynôme x 5 + x + 1 par la métho<strong>de</strong> <strong>de</strong> Berlekamp.5. Calculer avec un logiciel les valeurs numériques <strong>de</strong>s racines complexes <strong>de</strong>P(x) = x 5 + x + 1. Trouver les combinaisons <strong>de</strong> racines dont la somme estentière (aux arrondis près). En déduire la factorisation en facteurs irréductiblessur Z <strong>de</strong> P .6. Factorisation numérique sur C. Écrire un programme qui <strong>calcul</strong>e une racined’un polynôme à coefficients complexes en utilisant une métho<strong>de</strong> itérative<strong>de</strong> type métho<strong>de</strong> <strong>de</strong> Newton (avec éventuellement un préfacteur lorsqu’ondébute la recherche). Les polynômes seront représentés par la liste <strong>de</strong> leurscoefficients et l’évaluation faite par la métho<strong>de</strong> <strong>de</strong> Horner. Trouver ensuitetoutes les racines du polynôme en éliminant la racine trouvée (toujours avecHorner). Trouver les combinaisons <strong>de</strong> racines correspondant à un facteur àcoefficients entiers.7. Même question pour les facteurs <strong>de</strong> <strong>de</strong>gré 2 d’un polynôme à coefficientsréels sans racines réelles en utilisant la métho<strong>de</strong> <strong>de</strong> Bairstow décrite ci<strong>de</strong>ssous.On cherche un facteur F = x 2 + sx + p <strong>de</strong> P , on <strong>calcul</strong>e le quotient et lereste <strong>de</strong> la division P = FQ + R par une métho<strong>de</strong> <strong>de</strong> type Horner, il s’agit<strong>de</strong> rendre R (vu comme un vecteur à 2 composantes) nul. On <strong>calcul</strong>e donc∂ s,p R (en cherchant le quotient et le reste <strong>de</strong> xQ et Q par F , pourquoi ?) eton pose :(s, p) n+1 = (s, p) n − λ(∂ s,p R) −1 R(s, p) noù λ est un préfacteur compris entre 0 et 1 et ajusté à 1 lorsqu’on est prochedu facteur.8. Soit p un entier premier et P un polynôme à coefficients dans Z/pZ. On a larelation∏gcd(X pk − X, P) = f, f irréductiblef|P,<strong>de</strong>g(f)|kEn utilisant cette relation, déterminer les <strong>de</strong>grés <strong>de</strong>s facteurs <strong>de</strong>(x 3 + x + 1)(x 4 + x + 1)modulo 5 et 7 (sans utiliser la comman<strong>de</strong> factor). Peut-on en déduire quex 3 + x + 1 et x 4 + x + 1 sont irréductibles sur Z ?9. Utiliser les options “verbose” <strong>de</strong> votre logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> pour factoriserx 202 + x 101 + 1 et vérifiez que vous avez compris la métho<strong>de</strong> utilisée.60


10. Montrer que 2x+x 2 y+x 3 +2x 4 +y 3 +x 5 est irréductible sur Z sans utiliserl’instruction factor à 2 variables (on pourra factoriser pour quelques valeurs<strong>de</strong> x ou <strong>de</strong> y)11. Que se passe-t-il lorsqu’on exécute l’algorithme <strong>de</strong> Yun dans Z/nZ ?12. Déterminer les <strong>de</strong>grés <strong>de</strong>s facteurs <strong>de</strong> (x 3 + x + 1)(x 4 + x + 1) modulo 5 et7 (sans utiliser la comman<strong>de</strong> factor). Peut-on en déduire que x 3 + x + 1 etx 4 + x + 1 sont irréductibles sur Z ?13. Utiliser les options “verbose” <strong>de</strong> votre logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> pour factoriserx 202 + x 101 + 1 et vérifiez que vous avez compris la métho<strong>de</strong> utilisée.14. Montrer que 2x+x 2 y+x 3 +2x 4 +y 3 +x 5 est irréductible sur Z sans utiliserdirectement l’instruction factor (on pourra factoriser pour quelques valeurs<strong>de</strong> x ou <strong>de</strong> y)61


9 Intégration9.1 IntroductionQue peut-on espérer d’un système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong> lorsqu’il s’agit <strong>de</strong> <strong>calcul</strong>erune primitive ? Tout d’abord, on peut espérer qu’il sache résoudre ce que l’ondonne en exercice à nos étudiants ! Ceci suppose donc <strong>de</strong> connaitre quelques métho<strong>de</strong>sclassiques, par exemple : intégration <strong>de</strong> polynômes ( !), polynômes multipliéspar exponentielle ou/et fonctions trigonométriques, <strong>de</strong> polynômes trigonométriquespar linéarisation, <strong>de</strong> fractions rationnelles, <strong>de</strong> fractions trigonométriques, <strong>de</strong>fractions <strong>de</strong> racines carrées <strong>de</strong> polynômes du second ordre, <strong>de</strong> fonctions s’y ramenantpar une ou plusieurs intégrations par parties ou par changement <strong>de</strong> fonction(par exemple reconnaissance <strong>de</strong> formes F(u)u ′ ) ou par changement <strong>de</strong> variables,etc.Mais au-<strong>de</strong>là <strong>de</strong> ces métho<strong>de</strong>s (qui ont l’avantage <strong>de</strong> la rapidité mais tiennentparfois plus <strong>de</strong> la recette <strong>de</strong> cuisine que <strong>de</strong> l’algorithme...), on peut se <strong>de</strong>man<strong>de</strong>r sila primitive d’une fonction donnée peut ou non s’exprimer en terme <strong>de</strong>s fonctions“élémentaires”. Par exemple, tout le mon<strong>de</strong> “sait” que la fonction e x2 n’admet pas<strong>de</strong> primitive “simple”, encore faut-il donner un sens mathématique précis à cetteaffirmation. Ceci nécessite <strong>de</strong> donner une définition rigoureuse du terme fonctionélémentaire. On peut alors appliquer un algorithme développé par Risch (pour lesextensions dites transcendantes, obtenue par ajout <strong>de</strong>s fonctions exponentielle etlogarithme) qui permet <strong>de</strong> répondre à la question : il s’agit vu <strong>de</strong> très loin d’uneextension <strong>de</strong> l’algorithme d’intégration <strong>de</strong>s fractions rationnelles.Cet article se décompose en <strong>de</strong>ux parties principales :– la section 9.2 présente les définitions <strong>de</strong> fonctions élémentaires, <strong>de</strong> tour <strong>de</strong>variables, et donne <strong>de</strong>ux théorèmes, le théorème <strong>de</strong> structure <strong>de</strong> Risch quipermet d’écrire une fonction contenant <strong>de</strong>s exponentielles et <strong>de</strong>s logarithmescomme une fonction élémentaire par rapport à une tour <strong>de</strong> variable, et lethéorème <strong>de</strong> Liouville qui donne la forme que peut prendre une primitived’une fonction élémentaire lorsqu’elle est aussi élémentaire.– la section 9.3 décrit l’algorithme d’intégration <strong>de</strong> Risch permettant <strong>de</strong> déci<strong>de</strong>rsi une fonction élémentaire donnée possè<strong>de</strong> ou non une primitive élémentaireet <strong>de</strong> la <strong>calcul</strong>er dans le premier cas. Nous ne présentons ici l’algorithme<strong>de</strong> Risch que pour les extensions transcendantes pures (ln et exp).Le lecteur intéressé par le cas <strong>de</strong>s extensions algébriques pourra consulter la thèse<strong>de</strong> Trager. Pour les extensions plus générales (incluant en particulier les fonctionstangente, arctangente), la référence est le livre <strong>de</strong> Bronstein donnée en section 9.4.9.2 Fonctions élémentaires9.2.1 Extensions transcendantes, tour <strong>de</strong> variablesOn se donne une expression f(x) dépendant <strong>de</strong> la variable x que l’on souhaiteintégrer par rapport à x. L’algorithme <strong>de</strong> Risch s’applique à cette expression si onpeut l’écrire comme une fraction rationnelle à plusieurs variables algébriquementindépendantesx, f 1 (x), f 2 (x, f 1 (x)), ..., f n (x, f 1 (x), f 2 (x, f 1 (x)), ..., f n−1 (x, f 1 (x), ..., f n−2 (x)))62


où les f i sont soit l’exponentielle soit le logarithme d’une fraction rationnelle (lecorps <strong>de</strong> base appelé aussi corps <strong>de</strong> constantes ici est soit C, soit une extension algébrique<strong>de</strong> Q ou une extension algébrique d’un corps <strong>de</strong> fractions rationnelles s’ily a <strong>de</strong>s paramètres). On appelle tour <strong>de</strong> variables la suite <strong>de</strong>s x, f 1 , ..., f n (chaqueétage est donc une exponentielle d’une fraction rationnelle ou le logarithme d’unefraction rationnelle dépendant <strong>de</strong>s étages précé<strong>de</strong>nts) et on dira que f est une fonctionélémentaire par rapport à cette tour <strong>de</strong> variables.L’intérêt <strong>de</strong> l’écriture d’une expression sous forme <strong>de</strong> tour est qu’elle est stablepar dérivation : si on dérive par rapport à x une fonction élémentaire dépendantd’une tour <strong>de</strong> variables, on obtient encore une fonction élémentaire dépendant <strong>de</strong>la même tour <strong>de</strong> variables. Autrement dit, l’ensemble <strong>de</strong>s fonctions élémentairespour une tour fixée est un corps différentiel.Exemples :– e x2 est bien dans ce cas, pour n = 1, f 1 est l’exponentielle <strong>de</strong> x 2 qui estalgébriquement indépendant <strong>de</strong> x. Les fonctions (2x 2 −1)e x2 ou x/(e x2 −1)sont aussi élémentaires par rapport à la tour <strong>de</strong> variables {x, e x2 }.– xln(x)exp(x) est élémentaire par rapport à la tour {x,ln(x), exp(x)}, maisaussi par rapport à la tour {x,exp(x), ln(x)}.– xe x ln(x) est élémentaire, en prenant n = 2, f 1 = ln(x) et f 2 = e xf 1.– x n = e n ln(x) , où n est un paramètre, convient avec comme tour {x,ln(x), e n ln(x)– e ln(x) ne convient pas car il n’est pas algébriquement indépendant <strong>de</strong> x,ln(x)mais on peut le réécrire sous une forme acceptable puisque e ln(x) = x.– e ln(x)/2 ne convient pas non plus car son carré est égal à x. Une réécriturene suffit pas, cet exemple est bien sûr une extension algébrique et non transcendante.Dans la suite, on va s’intéresser aux tours <strong>de</strong> variables dans lesquelles on aeffectué <strong>de</strong>s simplifications évi<strong>de</strong>ntes. On élimine les ln ◦ exp <strong>de</strong> la manière suivante: si f k = ln(g k ), on regar<strong>de</strong> si g k vu comme fraction en f 1 , ..., f k−1 possè<strong>de</strong>un facteur fjm (avec m ∈ Z) lorsque f j = exp(g j ) est une exponentielle. Si c’estle cas, on a f k = mg j + ln(g k /gj m). On change alors <strong>de</strong> tour en remplaçant f k par˜f k = ln(g k /gj m) = f k −mg j . On élimine aussi les exp ◦ ln, si f k = exp(g k ), pourj < k si f j est un logarithme, on regar<strong>de</strong> si c j = ∂ fj g k | fj =0 est un entier, si c’estle cas on remplace f k par ˜f k = f k /g c jk .Exemples :ln( ex2 + 1) → −x 2 + ln(e x2 + 1)e x2e 3ln(x)+ln(x)2 +5→ x 3 e ln(x)2 +59.2.2 Théorème <strong>de</strong> structure <strong>de</strong> RischOn voit donc qu’il est nécessaire <strong>de</strong> disposer d’un algorithme pour déci<strong>de</strong>rsi <strong>de</strong>s exponentielles et logarithmes sont algébriquement indépendants. Cet algorithmeest basé sur un théorème <strong>de</strong> structure dû à Risch :Théorème 6 Soit f = ln(g(x)) le logarithme d’une fonction élémentaire g parrapport à une tour <strong>de</strong> variables T , alors soit f est algébriquement indépendant<strong>de</strong>s variables <strong>de</strong> T , soit f est élémentaire et plus précisément combinaison linéairerationnelle <strong>de</strong>s logarithmes et <strong>de</strong>s arguments <strong>de</strong>s exponentielles <strong>de</strong> la tour T .63


Soit f = exp(g) l’exponentielle d’une fonction élémentaire g par rapport à unetour <strong>de</strong> variables T , alors soit f est algébriquement indépendante <strong>de</strong>s variables<strong>de</strong> T , soit il existe n tel que f n soit élémentaire par rapport à T (on peut alorsappliquer le cas précé<strong>de</strong>nt à ng = ln(f n ))Démonstration :Commençons par le cas <strong>de</strong> l’exponentielle. On considère le polynôme minimal <strong>de</strong>f = exp(g) :a n f n + ... + a 0 = 0, a n ≠ 0, a 0 ≠ 0où les a i sont <strong>de</strong>s fractions rationnelles en T . On dérive et on applique f ′ = g ′ f :(a ′ n + na n g ′ )f n + ... + (a ′ k + ka kg ′ )f k + ... = 0c’est un multiple du polynôme minimal donc il existe une fraction rationnelle C(par rapport à la tour <strong>de</strong> variables) telle que :∀k,(a ′ k + ka kg ′ ) = Ca kComme a n ≠ 0, cela entraine a ′ n/a n + ng ′ = C. Le coefficient constant a 0 estaussi non nul, donc a ′ 0 /a 0 = C etng ′ = a ′ 0/a 0 − a ′ n/a n ⇒ ng = ln( a 0a n) + koù k est constant, donc f n = exp(ng) = e k a 0 /a n est élémentaire.Passons au cas du logarithme, supposons que f = ln(g) dépen<strong>de</strong> algébriquement<strong>de</strong> la tour T , on va commencer par montrer que f est élémentaire. On écrit :a n f n + ... + a 0 = 0où les a i sont <strong>de</strong>s fractions rationnelles en T . On dérive en appliquant f ′ = g ′ /g :a ′ nf n + (na n f ′ + a ′ n−1)f n−1 ... + a 1 f ′ + a ′ 0Comme f ′ est une fraction rationnelle en T , le polynôme a ′ nX n + (na n f ′ +a ′ n−1 )Xn−1 + ... + a 1 f ′ + a ′ 0 qui annule f doit être un multiple du polynômeminimal <strong>de</strong> f, il existe donc une fraction rationnelle C par rapport à T telle que :On en déduit f ′ :a ′ n = Ca n (na n f ′ + a ′ n−1) = Ca n−1 ...f ′ =donc il existe une constante c telle que :a ′ na na n−1 − a ′ ( ) ′n−1 −an−1=na n na nf = −a n−1na n+ cdonc f est élémentaire par rapport à la même tour T que g.Montrons maintenant qu’un logarithme f = ln(g) qui est élémentaire par rapportà une tour <strong>de</strong> variable T est combinaison linéaire à coefficients rationnelles64


<strong>de</strong>s logarithmes et <strong>de</strong>s arguments <strong>de</strong>s exponentielles <strong>de</strong> T 9 . Soit X la <strong>de</strong>rnière variable<strong>de</strong> la tour T . On factorise maintenant le numérateur et le dénominateur <strong>de</strong>g en ∏ j P j j où les P j sont sans facteurs multiples et premiers entre eux 2 à 2 (parrapport à X), il existe C indépendant <strong>de</strong> X tel que :g = C ∏ j∈ZP j j ⇒ ln(g) = ln(C) + ∑ j∈Zj ln(P j ) (15)Alors f ′ = ln(C) ′ + ∑ j jP ′ j /P j donc ∏ P j f ′ est un polynôme en X. Soit N/Dla fraction irréductible représentant f, on a :on vient donc <strong>de</strong> montrer que :⎛⎝ ∏ jf ′ = N ′ D − ND ′D 2P j⎞⎠ N ′ D − ND ′D 2 est un polynôme en X (16)Soit P un facteur irréductible <strong>de</strong> D <strong>de</strong> multiplicité k tel que D = P k Q (donc Ppremier avec Q, mais P est aussi premier avec N car f = N/D est irréductible).Alors en simplifiant numérateur et dénominateur par P k−1 , on a :⎛ ⎞⎝ ∏ P j⎠ N ′ PQ − N(kP ′ Q + PQ ′ )P k+1 Q 2 est un polynôme en X. (17)jOn en déduit, après simplification d’au plus un facteur P au dénominateur avecl’un <strong>de</strong>s P j , que P k divise N ′ PQ−N(kP ′ Q+PQ ′ ) donc P divise P ′ . Ceci n’estpossible que si P = 1 (et donc le dénominateur <strong>de</strong> f est égal à 1) ou si la variableX est une exponentielle et P = X.Montrons que ce <strong>de</strong>uxième cas est en fait exclus : en effet si P = X = exp(Y )est une exponentielle, on a alors D = X k et Q = 1. Comme P ′ = Y ′ X, (17)<strong>de</strong>vient : ⎛ ⎞⎝ ∏ P j⎠ X(N ′ − kNY ′ )X k+1 est un polynôme en XjComme X ne divise pas N, N possè<strong>de</strong> donc un coefficient constant a 0 non nul.Le coefficient constant <strong>de</strong> N ′ − kNY ′ est a ′ 0 − ka 0Y ′ . Si ce terme était nul alorsa ′ 0 = ka 0Y ′ donc a 0 = c exp(kY ) = cX k or a 0 ne dépend pas <strong>de</strong> X donc c = 0donc a 0 = 0, absur<strong>de</strong>. Donc X ne divise pas N ′ − kNY ′ . Comme X k+1 divise∏Pj X(N ′ − kNY ′ ), on en déduit que X k divise un <strong>de</strong>s P j . Donc k = 1 etP j = XQ j . Revenons maintenant à (15), on a :f = ln(g) = ln(C) + j ln(XQ j ) + ∑ l≠jl ln(P l )on dérive :f ′ = ln(C) ′ + jY ′ + j Q′ jQ j+ ∑ l≠jl P ′lP l9 cette preuve peut être sautée en première lecture65


on voit qu’il n’est plus nécessaire <strong>de</strong> multiplier f ′ par P j pour avoir un polynôme,multiplier par Q j suffit, plus précisément⎛ ⎞⎝ ∏ NP l⎠Q ′ D − ND ′jD 2 est un polynôme en X.l≠j( ∏ )donc X k+1 divisel≠j P l Q j X(N ′ − kNY ′ ) ce qui est impossible.Donc D = 1 dans tous les cas et on a f = N. Doncf ′ = N ′ = ln(C) ′ + ∑ jjP ′ j/P j est un polynôme par rapport à XOn en déduit que les P j ne dépen<strong>de</strong>nt pas <strong>de</strong> X sauf si X est une exponentielle etP j = X. Dans les <strong>de</strong>ux cas N ′ ne dépend pas <strong>de</strong> X donc le polynôme N est <strong>de</strong><strong>de</strong>gré 0 ou 1 en X (si X est une exponentielle, N est forcément <strong>de</strong> <strong>de</strong>gré 0)– Si X = exp(Y ) est une exponentielle (avec Y élémentaire ne dépendant pas<strong>de</strong> X), alors f = N est indépendant <strong>de</strong> X. On retire jY à f et on divise g parX j (en posant j = 0 si aucun <strong>de</strong>s P j n’est égal à X), qui <strong>de</strong>vient indépendant<strong>de</strong> X, on conserve ainsi l’égalité f = ln(g) mais avec une variable <strong>de</strong> moinsdans la tour <strong>de</strong> variables par rapport à laquelle f et g sont élémentaires.– Si X n’est pas une exponentielle, N = cX + d avec c dans le corps <strong>de</strong>constantes, et d indépendant <strong>de</strong> X. Si X = x, on a g = exp(cx+d) qui n’estrationnel que si c = 0. On a alors d donc f et g constants. Si X = ln(Y ) estun logarithme (avec Y élémentaire ne dépendant pas <strong>de</strong> X), alors ∀j, P j = 1donc g est élémentaire indépendante <strong>de</strong> X. On a alors :f = N = c ln(Y ) + d = ln(g)avec c dans le corps <strong>de</strong>s constantes, d et g élémentaires indépendants <strong>de</strong> X.On cherche maintenant la fonction élémentaire d. Cette fonction n’est pas lelogarithme d’une fonction élémentaire en général car c n’est pas forcémententier, mais d ′ a les mêmes propriétés que la dérivée du logarithme d’unefonction élémentaire. On peut donc reprendre le même raisonnement maisavec une variable <strong>de</strong> moins dans la tour <strong>de</strong> variables. Si la tour qu’on a choisieest normalisée, alors Y ne contient au numérateur et au dénominateuraucune puissance d’une exponentielle d’une variable <strong>de</strong> la tour donc le polynômeP j du cas précé<strong>de</strong>nt ne peut provenir <strong>de</strong> Y ce qui entraine que j estbien entier dans le cas précé<strong>de</strong>nt (bien que c ne le soit pas forcément).Après avoir fait une récurrence sur le nombre <strong>de</strong> variables <strong>de</strong> la tour, on a doncf qui s’exprime comme combinaison linéaire à coefficients entiers <strong>de</strong>s argumentsg k <strong>de</strong>s variables exponentielles f k = exp(g k ) <strong>de</strong> la tour et à coefficients a prioriquelconque <strong>de</strong>s variables logarithmes f l = ln(g l ) <strong>de</strong> la tour :f = ∑ kj k g k + ∑ lx l ln(g l ) = ln(g)Comme g est élémentaire, h = g/ ∏ k exp(g k) j kest élémentaire <strong>de</strong> logarithme∑l x l ln(g l ). Montrons que si les arguments <strong>de</strong>s ln sont <strong>de</strong>s polynômes sans facteursmultiples, alors les x l sont entiers. Rappelons que les ln(g l ) sont algébriquementindépendants, on peut donc construire <strong>de</strong>s polynômes irréductibles I l par66


apport aux variables <strong>de</strong> la tour tels que I l divise une fois g l mais ne divise pas lesg k précé<strong>de</strong>nts. Soit h = ∏ j∈Z P j jla factorisation sans facteurs multiples <strong>de</strong> h. Ondérive alors ln(h) ce qui donne :∑x l g l ′ /g l = ∑ jP j/P ′ jjloù ∏ j P j j est la décomposition sans facteurs multiples <strong>de</strong> h. Comme I l divise unet un seul <strong>de</strong>s P j on en déduit que x l est égal au j correspondant et est doncentier. (Remarque : si on n’impose pas aux arguments <strong>de</strong>s logarithmes d’être <strong>de</strong>spolynômes sans facteurs carrés, on obtiendrait ici <strong>de</strong>s coefficients rationnels).En pratique :On peut effecter l’algorithme <strong>de</strong> la manière suivante :– on cherche les variables généralisées <strong>de</strong> l’expression qui dépen<strong>de</strong>nt <strong>de</strong> x.– On ajoute les variables généralisées en commençant par la moins longue– Si c’est un logarithme, on extrait les puissances <strong>de</strong>s exponentielles précé<strong>de</strong>ntesdont il dépend. On cherche <strong>de</strong>s relations entre fonctions ln en les réécrivantcomme combinaison linéaire <strong>de</strong> ln indépendants. Pour avoir <strong>de</strong>s lnindépendants, on se ramène d’abord à <strong>de</strong>s polynômes sans facteurs multiplesen utilisant la relation ln(a/b) = ln(a) − ln(b) et en écrivant la factorisationsans facteurs multiples <strong>de</strong> chaque polynôme argument, puis on extraitle PGCD 2 à 2 <strong>de</strong>s arguments <strong>de</strong> logarithmes jusqu’à obtenir <strong>de</strong>s arguments<strong>de</strong> ln premiers entre eux.– Si c’est une exponentielle, on teste si son argument est combinaison linéaireà coefficients rationnels :– <strong>de</strong>s arguments <strong>de</strong>s exponentielles précé<strong>de</strong>ntes,– <strong>de</strong>s ln <strong>de</strong>s logarithmes précé<strong>de</strong>nts,– <strong>de</strong> ln(x) et <strong>de</strong> i ∗ π.Pour cela on substitue les ln par <strong>de</strong>s indéterminées, et on dérive une foispar rapport à cette indéterminée, le résultat doit être un rationnel, pour lesvariables exponentielles, il faut réduire au même dénominateur et résoudrele système linéaire obtenu en i<strong>de</strong>ntifiant les coefficients du numérateur. Sil’exponentielle est indépendante <strong>de</strong>s précé<strong>de</strong>ntes, on extrait <strong>de</strong> l’exponentielleà rajouter la partie linéaire <strong>de</strong> la dépendance en les ln précé<strong>de</strong>nts si lecoefficient correspondant est entier. Par exemple, on réécrit :xe 2ln(x)+ln(x)2 = x 3 e ln(x)2RemarqueOn n’est pas obligé <strong>de</strong> se limiter aux seules fonctions logarithmes et exponentielles,l’essentiel est <strong>de</strong> pouvoir tester l’indépendance algébrique <strong>de</strong>s expressions créées.Pour éviter d’avoir à introduire <strong>de</strong>s exponentielles et logarithmes complexes dansune expression réelle, on peut autoriser par exemple <strong>de</strong>s extensions en tangente ouen arctangente.9.2.3 Théorème <strong>de</strong> LiouvilleOn a vu que la dérivée d’une fonction élémentaire dépendant d’une tour <strong>de</strong>variables est une fonction élémentaire dépendant <strong>de</strong> la même tour <strong>de</strong> variables.67


Réciproquement, supposons qu’une fonction élémentaire admette une primitive quisoit élémentaire, c’est-à-dire qu’elle doit être une fraction rationelle par rapport àune tour <strong>de</strong> variables mais pas forcément i<strong>de</strong>ntique à celle <strong>de</strong> départ. Alors, si unetelle écriture existe, à <strong>de</strong>s termes logarithmiques près, elle ne peut dépendre que <strong>de</strong>la même tour <strong>de</strong> variables, plus précisément on a le théorème <strong>de</strong> Liouville :Théorème 7 Soit f une fonction élémentaire par rapport à une tour <strong>de</strong> variablesT et un corps <strong>de</strong> constantes K admettant une primitive élémentaire F . Alors ilexiste un nombre fini <strong>de</strong> constantes c 1 , ..., c n et <strong>de</strong> fonctions élémentaires v 1 , ..., v npar rapport à T avec comme corps <strong>de</strong> constantes une extension algébrique K ′ <strong>de</strong>K tel que F − ∑ k c k ln(v k ) soit élémentaire par rapport à T et K.Preuve : 10Soit f élémentaire <strong>de</strong> tour T 1 (corps K) et F sa primitive supposée élémentaire <strong>de</strong>tour T 2 et <strong>de</strong> corps K ′ une extension algébrique <strong>de</strong> K. On commence par rajouteraprès les élements <strong>de</strong> T 1 les élements nécessaires <strong>de</strong> T 2 pour obtenir une tour T parrapport à laquelle f et F sont élémentaires (plus précisément F sera élémentairequitte à autoriser <strong>de</strong>s puissances fractionnaires <strong>de</strong>s variables exponentielles <strong>de</strong> T 1 ).Le théorème <strong>de</strong> structure <strong>de</strong> Risch permet <strong>de</strong> faire cela, en effet on regar<strong>de</strong> pourchaque élément <strong>de</strong> T 2 s’il est algébriquement indépendant <strong>de</strong>s éléments <strong>de</strong> T 1 ounon. S’il l’est, on le rajoute à la tour T , s’il ne l’est pas alors dans le cas d’un logarithmeil est élémentaire et dans le cas d’une exponentielle, une <strong>de</strong> ses puissancesest élémentaire. Donc F est bien une fraction rationnelle par rapport aux élémentslogarithmiques <strong>de</strong> T 1 , aux racines n-ième <strong>de</strong>s éléments exponentiels <strong>de</strong> T 1 et à <strong>de</strong>séléments <strong>de</strong> T 2 dans cet ordre (le corps <strong>de</strong>s constantes étant K ′ ).Première étape :Commençons par les éléments restant <strong>de</strong> T 2 . Soit X k l’élément au sommet <strong>de</strong> latour T . La dérivée f <strong>de</strong> F par rapport à X k ne dépend pas <strong>de</strong> X k . Donc soit Fne dépend pas <strong>de</strong> X k et on passe à la variable suivante, soit X k = ln(v k ) est unlogarithme et F = c k ln(v k ) + d k avec c k ∈ K ′ et v k et d k indépendants <strong>de</strong> X k .S’il n’y a pas d’autres éléments restants <strong>de</strong> T 2 , on passe à la 2ème étape. Sinon soitX k−1 la variable suivante (juste en-<strong>de</strong>ssous <strong>de</strong> X k dans la tour). En dérivant, on a :F ′ = c kv ′ kv k+ d ′ k = fSupposons que v k dépen<strong>de</strong> <strong>de</strong> X k−1 , on fait alors un raisonnement analogue àcelui <strong>de</strong> la preuve du théorème <strong>de</strong> structure <strong>de</strong> Risch, en décomposant v k en produit/quotient<strong>de</strong> facteurs sans multiplicités v k = ∏ P j j et en écrivant d k = N/Don a :⎛⎝ ∏ jP j⎞⎠ N ′ D − ND ′D 2est un polynôme en X k−1 . On en déduit comme précé<strong>de</strong>mment que D = 1,N ′ = d ′ k est indépendant <strong>de</strong> X k−1. Comme on a supposé que v k dépend <strong>de</strong> X k−1 ,X k−1 = exp(Y k−1 ) est alors une exponentielle, N = d k ne dépend pas <strong>de</strong> X k−1 etl’un <strong>de</strong>s P j = X k−1 (sinon tous les P j seraient constants en X k−1 donc v k aussi).10 Peut être omise en première lecture68


On élimine alors la variable X k−1 en écrivant ln(v k ) = jY k−1 +ln(w k ), avec Y k−1et w k élémentaires et indépendants <strong>de</strong> X k−1 .Si v k est indépendant <strong>de</strong> X k−1 , alors d ′ k aussi donc soit d k est indépendant<strong>de</strong> X k−1 et on passe à la variable suivante, soit X k−1 est un logarithme et d k =c k−1 ln(v k−1 ) + d k−1 . En continuant pour toutes les variables restantes <strong>de</strong> T 2 , onobtientF = ∑ c k lnv k + dkavec d et v k élémentaires pour T 1 (avec exponentielles modifiées en en prenant uneracine n-ième) et K ′ .Deuxième étape Il s’agit <strong>de</strong> montrer que pour les exponentielles, il n’est en faitpas nécessaire <strong>de</strong> prendre <strong>de</strong> racines n-ième. La compréhension <strong>de</strong> cette étape <strong>de</strong>man<strong>de</strong>un peu <strong>de</strong> familiarité avec l’algorithme <strong>de</strong> Risch (cf. infra). On va fairela preuve pour la variable au sommet <strong>de</strong> la tour T 1 si c’est une exponentielle.On verra dans le déroulement <strong>de</strong> l’algorithme <strong>de</strong> Risch que pour les autres variables,il y a appel récursif <strong>de</strong> l’algorithme d’intégration, donc traiter la variableau sommet suffira. Soit donc exp(Y ) la variable au sommet <strong>de</strong> la tour T 1 , on noteX = exp(Y/n) la racine n-ième <strong>de</strong> cette variable qui est utilisée pour exprimerF = ∑ c k lnv k + N/D comme une fraction rationnelle en X alors que f = F ′est une fraction rationnelle en X n . On a donc :∑ vk′ ck + N ′= f = fraction rationnelle en (X n )v k DNotons que le fait que X soit une exponentielle est essentiel, car par exemple l’intégraled’une fraction rationnelle dépendant <strong>de</strong> x n comme x 3 ou 1/(x 3 − 1) nes’exprime pas en fonction <strong>de</strong> x 3 . On traite d’abord la partie polynomiale généralisée<strong>de</strong> f en X n :∑a j (X n ) jj∈ZSon intégrale est un polynôme généralisé, éventuellement dépendant <strong>de</strong> X, soit∑j∈Z A jX j . On dérive, et on obtient pour k non multiple <strong>de</strong> n, A k Y/n + A ′ k = 0dont A k = 0 est solution. La partie polynôme généralisé ne dépend donc que <strong>de</strong>X n . On effectue aussi les intégrations par parties pour réduire le dénominateur <strong>de</strong>f à un polynôme sans facteurs multiples (réduction <strong>de</strong> Hermite), ce qui se fait enintroduisant <strong>de</strong>s fractions rationnelles en X n uniquement. Reste la partie logarithmique.On utilise le critère du résultant, les coefficients <strong>de</strong>s logarithmes sont lesracines c k du polynôme en tRes X (D, N − tD ′ )où ces racines doivent être indépendantes <strong>de</strong> x (puisque F existe) et les v k correspondantssont égaux àgcd(D, N − c k D ′ )Or comme X est une exponentielle, D ′ est un polynôme en X n , <strong>de</strong> même que Det N, donc v k est un polynôme en X n .Troisième étape Il reste enfin à montrer que seuls les c k et v k nécessitent uneextension algébrique <strong>de</strong> K. Ceci est encore une conséquence <strong>de</strong> l’algorithme <strong>de</strong>Risch, la construction <strong>de</strong> la partie polynomiale (éventuellement généralisée) et <strong>de</strong>69


la partie fractionnaire ne font en effet intervenir que <strong>de</strong>s coefficients dans le corpsK.9.3 L’algorithme <strong>de</strong> RischOn suppose dans la suite qu’on s’est ramené à une fraction rationnelle par rapportà une tour <strong>de</strong> variables (où on a effectué les simplifications évi<strong>de</strong>ntes ln ◦ exp,ainsi que exp ◦ ln, dans le premier cas en extrayant les facteurs évi<strong>de</strong>nts en lesvariables précé<strong>de</strong>ntes exponentielles, dans le <strong>de</strong>uxième cas en extrayant la partielinéaire à coefficient entier en les variables logarithmes précé<strong>de</strong>ntes). On note Xla variable au sommet <strong>de</strong> la tour et N 0 /D 0 l’écriture <strong>de</strong> la fonction élémentairecomme fraction irréductible avec N 0 et D 0 polynômes en X.Exemples∫(2x 2 + 1)e x2 X = e x2 N 0 = (2x 2 + 1)X, D 0 = 1∫xln(x)X = ln(x) N 0 = xX, D 0 = x + Xx + ln(x)La première étape va consister à se ramener à un dénominateur sans facteursmultiples. Elle est analogue au cas <strong>de</strong>s fractions rationnelles <strong>de</strong> x et est basée surl’i<strong>de</strong>ntité <strong>de</strong> Bézout entre P et P ′ vu comme polynômes en la variable du haut<strong>de</strong> la tour. Il apparait toutefois une difficulté pour les extensions exponentielles, àsavoir que X = e f et X ′ = f ′ X ne sont pas premiers entre eux comme polynômesen X, on <strong>de</strong>vra traiter le pôle 0 d’une fraction rationnelle en une exponentielle Xcomme on traite l’intégration d’un polynôme en x. Si P est sans facteurs multipleset premier avec X, alors P(X) et P(X) ′ = f ′ XP ′ (X) vu comme polynômes enX n’ont pas <strong>de</strong> facteurs en commun.On commence donc, si X est une exponentielle et D 0 un multiple <strong>de</strong> X, parappliquer Bézout pour décomposer la fraction N 0 /D 0 en :N 0D 0= N 1D 1+ P X k , gcd(X, D 1) = 1, D 0 = X k D 1On isole aussi la partie polynômiale en effectuant la division euclidienne <strong>de</strong> N 0 parD 0 (ou <strong>de</strong> N 1 par D 1 si X est une exponentielle), on obtient alors une écriture sousla forme :ND + ∑ a j X jjoù la somme sur j est finie et porte sur <strong>de</strong>s entiers positifs ou nul si X n’est pasune exponentielle, ou sur <strong>de</strong>s entiers relatifs si X est une exponentielle.On effectue la même écriture sur la partie fractionnaire <strong>de</strong> F , et en i<strong>de</strong>ntifiantles parties polynomiales et éventuellement la partie polaire en 0 si X est uneexponentielle, on peut séparer l’intégration en 2 parties : intégration <strong>de</strong> la partiepolynomiale (généralisée) et intégration <strong>de</strong> la partie fractionnaire propre.Exemples– (2x 2 + 1)e x2 = 0 + (2x 2 + 1)X est un polynôme,70


––xln(x)x + ln(x) = xXx + X = −x2x + X + xla partie polynomiale est x (<strong>de</strong> <strong>de</strong>gré 0 en X), la partie fractionnaire est−x 2 /(x + X)x(e 2x + 1)e x (e x + 1) 2 = x(X2 + 1)X(X + 1) 2 = − 2x(X + 1) 2 + xX−1la partie polynôme généralisé est xX −19.3.1 Intégration d’une fraction propre9.3.2 Réduction sans facteurs multiplesOn factorise D en ∏ i P ii avec P i sans facteurs multiples (et les P i premiersentre eux 2 à 2) et on décompose en éléments simples relativement à cette factorisation(en appliquant Bézout) :ND = ∑ i>0N iP iiPour chaque polynome P i , on applique Bézout à P i et P ′i :N i = A i P i + B i P ′i ⇒ N iP ii= A iP i−1ion intègre par parties le second terme∫ ∫∫Ni A i B iPii =Pii−1 −(i − 1)Pii−1 ++ B iP ′iP iiB ′ i(i − 1)P i−1ion rassemble les <strong>de</strong>ux intégrales ayant Pii−1 au dénominateur et on recommencejusqu’à avoir une puissance 1 au dénominateur. Il reste alors à intégrer une somme<strong>de</strong> fractions du type N/D avec D et D ′ premiers entre eux.ExempleOn reprend le <strong>de</strong>rnier exemple <strong>de</strong> la section précé<strong>de</strong>nte pour éliminer la puissance2 au dénominateur : N 2 = 2x et P 2 = (X + 1) avec X = e x . On a P 2 ′ = X, doncA 2 = 2x et B 2 = −2x :∫ ∫ ∫2x 2x −2xP′∫(X + 1) 2 = + 2 2xP 2 P22 = + 2x − 2 P 2 P 2 P 2il reste donc à intégrer (2x − 2)/(e x + 1).9.3.3 La partie logarithmiqueComme on l’a vu lors <strong>de</strong> la preuve du théorème <strong>de</strong> structure <strong>de</strong> Risch, si ondérive une fraction en X, le dénominateur <strong>de</strong> la dérivée ne peut se décomposerqu’en produit <strong>de</strong> facteurs <strong>de</strong> multiplicité supérieure ou égale à 2. Il en résulte que71


la fraction à intégrer résiduelle (encore notée f = N/D) après l’étape <strong>de</strong> réductionci-<strong>de</strong>ssus ne peut provenir que <strong>de</strong> la dérivation <strong>de</strong> F = ∑ k c k ln(v k ) :f = N D = F ′ = ( ∑ kc k ln(v k )) ′ = ∑ kc kv ′ kv kEn i<strong>de</strong>ntifiant les décompositions en éléments simples <strong>de</strong> F ′ et f, on montre égalementque les v k divisent D, plus précisément on peut imposer aux v k d’être premiersentre eux 2 à 2 et dans ce cas D = ∏ v k . Donc :et :∑kc kv ′ kv k=N = ∑ kN ∏k v kc k v ′ k∏j≠k= N DSoit t un paramètre, formons le polynôme N − tD ′ :⎛N − tD ′ = ∑ ∏⎝(c k − t)v k′kj≠kv jv j⎞⎠donc le pgcd en X <strong>de</strong>s polynômes N − tD ′ et D est :– si t n’est égal à aucun <strong>de</strong>s c k , N − tD ′ est premier avec v k pour tout k carv k divise ∑ l≠k (c l − t)vl′ ∏j≠l v j et vk′ ∏j≠k v j est premier avec v k . Doncle pgcd est 1.– si t est égal à l’un <strong>de</strong>s c k , alors le pgcd est le produit <strong>de</strong>s v k tels que c k = t(notons que dans ce cas on peut rassembler ces v k à l’intérieur d’un mêmelogarithme)Considérons le polynôme R <strong>de</strong> la variable t égal au résultant par rapport à X <strong>de</strong>spolynômes D et N −tD ′ (rappelons qu’il s’agit du déterminant du système linéaireAD + B(N − tD ′ ) = 1 où les inconnues sont les coefficients <strong>de</strong>s polynômes A etB, ce déterminant est nul si et seulement si le système n’a pas <strong>de</strong> solution donc siet seulement si D et N − tD ′ ne sont pas premiers entre eux), alors ce polynômeen t s’annule si et seulement si t = c k . On cherche les racines c k en t <strong>de</strong> cepolynôme, elles doivent être indépendantes <strong>de</strong> x si F est élémentaire, et dans cecas la primitive F <strong>de</strong> f = N/D vaut∑F = c k ln(gcd(N − c k D ′ , D))Exemples–c k racine <strong>de</strong> R2x − 2e x + 1 , D = X + 1, D′ = e x = X, N − tD ′ = 2x − 2 − tXOn <strong>calcul</strong>e R = −2 ∗ x − t + 2, l’unique racine est t = 2 − 2x qui n’est pasconstante donc cette fonction n’admet pas <strong>de</strong> primitive élémentaire.72


–(2x 2 − x − 2)X − 1X 2 + (x + 1)X + x , X = exp(x2 + x)On a D ′ = 2(2x + 1)X 2 + (1 + (2x + 1)(x + 1))X + 1R = −(2x − 1)(x + 1)(2x + 1)(x − 1) 2 (t + 1)(t − 1)les racines en t sont constantes et égales à 1 et -1, donc c 1 = 1 et v 1 =gcd(N−D ′ , D) = X + 1 et c 2 = −1, v 2 =gcd(N + D ′ , D) = x + X donc :∫ (2x 2 − x − 2)X − 1X 2 + (x + 1)X + x= ln(X + 1) − ln(x + X)Remarque importantePour les extensions exponentielles ou logarithmiques, la dérivée <strong>de</strong> la partie logarithmique<strong>calcul</strong>ée comme ci-<strong>de</strong>ssus contiendra en général une partie entièreconstante par rapport à X, il faut donc retirer cette partie entière à la partie polynomiale.9.3.4 La partie polynomiale (généralisée)On doit résoudre :( ∑ jA j X j ) ′ = ∑ ja j X javec une somme sur j ∈ Z si X est une exponentielle et j ∈ N sinon.Si X = x, j ≥ 0 et la résolution est immédiate : on prend A 0 = 0 et A j+1 =a j /(j + 1).9.3.5 Extension logarithmiqueSi X = ln(Y ) est un logarithme, j ≥ 0 et on doit résoudre :∑(A ′ Y ′j + (j + 1)A j+1j≥0Y )Xj = ∑ ja j X jSoit k la plus gran<strong>de</strong> puissance non nulle <strong>de</strong> f (a j = 0 si j > k et a k ≠ 0). Pourj > k, on a :A ′ j + (j + 1)A j+1Y ′Y = 0On résout pour <strong>de</strong>s valeurs <strong>de</strong> j décroissante, pour j suffisamment grand, on aA j+1 = 0 car la somme sur j est finie, donc A j est constant. Si A j ≠ 0, alors aurang j − 1, on a A ′ j−1 = −jA jY ′ /Y qui n’admet pas <strong>de</strong> solutions car A j−1 nepeut pas dépendre <strong>de</strong> X = ln(Y ). On en déduit que pour j > k + 1, on a A j = 0et A k+1 est constant. En fait la valeur constante <strong>de</strong> A k+1 sera déterminée par unecondition <strong>de</strong> compatibilité en résolvant l’équation au rang du <strong>de</strong>ssous. On continuela résolution <strong>de</strong>A ′ j + (j + 1)A j+1 ln(Y ) ′ = a jpar valeur décroissante <strong>de</strong> j, à chaque rang on va déterminer A j à une constanteprès en résolvant un problème d’intégration (par appel récursif <strong>de</strong> l’algorithme <strong>de</strong>73


Risch, mais si j ≠ 0 sans autoriser l’ajout <strong>de</strong> nouveaux logarithmes sauf ln(Y ))et la valeur <strong>de</strong> la constante <strong>de</strong> A j+1 (on fait varier A j+1 <strong>de</strong> la constante nécessairepour absorber le terme en ln(Y ) qui apparait lors <strong>de</strong> l’appel récursif <strong>de</strong> Risch). Aurang 0, on est ramené à un problème d’intégration avec une variable <strong>de</strong> moins (laconstante indéterminée dans A 1 peut par exemple être choisie comme le coefficientconstant <strong>de</strong> ln(Y ) s’il en apparait un en intégrant).ExempleX = ln(x 2 + 1) et on cherche l’intégrale <strong>de</strong> X 2 . On a donc A 3 est constant,A ′ 2 + 3A 3 ln(x 2 + 1) ′ = 1La primitive <strong>de</strong> 1 est élémentaire et ne fait pas intervenir <strong>de</strong> ln donc A 3 = 0 etA 2 = x + C 2 . Au rang 1, on a :A ′ 1 + 3x 2xx 2 + 1 + C 2 ln(x 2 + 1) ′ = 0On <strong>calcul</strong>e la primitive <strong>de</strong> 6x 2 /(x 2 + 1) qui doit être une fraction rationnelle àun C ln(x 2 + 1) près, on voit que ce n’est pas le cas donc X 2 n’admet pas <strong>de</strong>primitive élémentaire. Remarque : si on avait voulu intégrer X au lieu <strong>de</strong> X 2 ,la même métho<strong>de</strong> montre que la primitive existe, car au rang 0 il n’y a plus <strong>de</strong>contraintes sur les ln qu’on peut rajouter.9.3.6 Extension exponentielleSi X = exp(Y ) est une exponentielle, on doit résoudre :∑(A ′ j + jY ′ A j )X j = ∑ a j X jjjCeci va se faire <strong>de</strong>gré par <strong>de</strong>gré :A ′ j + jY ′ A j = a j (18)ExemplePour <strong>calcul</strong>er ∫ a(x)exp(x 2 ), on a j = 1, et on doit résoudre l’équation différentielle:A ′ 1 + 2xA 1 = a(x)Pour j = 0, il suffit <strong>de</strong> faire un appel récursif à l’algorithme <strong>de</strong> Risch, mais pourj ≠ 0, la situation se complique ! Notons Z la variable située juste en-<strong>de</strong>ssous <strong>de</strong>X dans la tour <strong>de</strong> variables (dans l’exemple ci-<strong>de</strong>ssus Z = x), il s’agit <strong>de</strong> résoudre :y ′ + fy = g (19)avec f, g élémentaires par rapport à une tour dont le variable au sommet est Z, oncherche y élémentaire par rapport à cette tour (ici f = jY ′ est une dérivée maisdans certains cas nous <strong>de</strong>vrons résoudre par appel récursif <strong>de</strong>s équations du typeci-<strong>de</strong>ssus où f ne sera pas une dérivée).Élimination <strong>de</strong>s dénominateursSoit P un facteur irréductible du dénominateur <strong>de</strong> y, notons α < 0 la valuation<strong>de</strong> y par rapport à P , β celle <strong>de</strong> f, γ celle <strong>de</strong> g. Si P n’est pas une exponentielle,74


la valuation <strong>de</strong> y ′ est α − 1, celle <strong>de</strong> fy est α + β. Si β ≠ −1, il n’y a pas <strong>de</strong>simplification possible dans le membre <strong>de</strong> gauche donc α + min(β, −1) = γ.Autrement dit, si β ≥ 0 alors α = γ +1 et si β < −1 alors α = γ −β. On observeque γ < 0 donc P est un facteur du dénominateur g d <strong>de</strong> g. De plus, on va montrerque la valuation α <strong>de</strong> P dans y est l’opposé <strong>de</strong> celle <strong>de</strong> P dans :D = gcd(g d, ∂ Z g d )gcd(c, ∂ Z c) , c = gcd(f d, g d ) (20)En effet, si β ≥ 0, P ne divise pas f d donc ne divise pas c, donc la valuation <strong>de</strong> Pdans D est −γ − 1. Si β < −1, alors α = γ − β < 0 entraine −γ > −β donc lavaluation <strong>de</strong> P dans c est −β et la valuation <strong>de</strong> P dans D est −γ − 1 − (−β − 1).Si β = −1, s’il n’y a pas <strong>de</strong> simplifications dans le membre <strong>de</strong> gauche pourles termes <strong>de</strong> plus petite puissance en P , alors α = γ + 1. S’il y a simplification,on décompose en éléments simples (avec Bézout) puis on ordonne par puissancescroissantes <strong>de</strong> P :y = N 1 P α + ..., f = N 2 P −1 + ...,avec N 1 , N 2 <strong>de</strong> <strong>de</strong>gré plus petit que P , puis on remplace dans (19). On cherche lestermes <strong>de</strong> valuation α − 1 en P qui doivent se simplifier :donc :αN 1 P ′ P α−1 + N 2 P −1 N 1 P α = 0N 2 = −αP ′ce qui détermine α.RécapitulonsSi f est une dérivée, alors β = −1 est exclus et on peut appliquer (20) pour déterminerD. Si f n’est pas une dérivée, on <strong>calcul</strong>e les facteurs <strong>de</strong> <strong>de</strong>gré 1 <strong>de</strong> f d :f 1 =f dgcd(f d , ∂ Z f d )on décompose f par Bézout en isolant la partie N/f 1 les α possibles sont alors lesracines entières (en t) du résultant en Z <strong>de</strong> N − tf ′ 1 et f 1, ils correspon<strong>de</strong>nt auxfacteurs gcd(N − αf ′ 1 , f 1) que l’on retire <strong>de</strong> f d pour appliquer (20).ExempleReprenons y ′ + 2xy = a(x). Si a(x) = 1 (résolution <strong>de</strong> ∫ exp(x 2 )), ou plusgénéralement si a(x) est un polynôme, alors D = 1. Si a(x) = 1/x 2 , on trouveD = x et on pose y = xz, donc x 2 (xz ′ +z)+2x 4 z = 1 soit x 3 z ′ +(2x 4 +1)z = 1.Reste le cas où Z est une exponentielle et P = exp(z). On reprend le mêmeraisonnement, y ′ a pour valuation −α < 0, fy a pour valuation −β − α, donc siβ > 0, α = γ et si β < 0, α = γ − β. Si β = 0, s’il n’y a pas <strong>de</strong> simplificationsdu terme <strong>de</strong> plus bas <strong>de</strong>gré, on est ramené au cas précé<strong>de</strong>nt. Si β = 0 et s’il y asimplification <strong>de</strong>s termes <strong>de</strong> plus bas <strong>de</strong>gré en Z, notons f 0 le coefficient constant<strong>de</strong> f par rapport à Z et y α le coefficient <strong>de</strong> Z α dans y, on ay ′ α + (αz ′ + f 0 )y α = 0donc :∫y α = exp(−αz −f 0 )75


Comme y α est élémentaire et indépendant <strong>de</strong> Z on en déduit par le théorème <strong>de</strong>structure <strong>de</strong> Risch que −αz− ∫ f 0 est combinaison linéaire à coefficients rationnels<strong>de</strong>s logarithmes et <strong>de</strong>s arguments <strong>de</strong>s exponentielles <strong>de</strong> la tour, <strong>de</strong> plus le coefficient<strong>de</strong> z doit être nul pour que y α soit indépendant <strong>de</strong> Z, ce qui impose la valeur <strong>de</strong> α(après avoir résolu récursivement le problème d’intégration pour f 0 )Majoration du <strong>de</strong>gré du numérateur <strong>de</strong> yEn multipliant y par DZ −α , puis en réduisant au même dénominateur, on se ramènealors à une équation différentielle à coefficients polynomiaux par rapport àla variable Z dont l’inconnue est un polynôme N :RN ′ + SN = T (21)On va chercher une majoration sur le <strong>de</strong>gré possible <strong>de</strong> N puis utiliser l’i<strong>de</strong>ntité <strong>de</strong>Bézout pour simplifier cette équation.On écrit maintenant N = ∑ nk=0 N kZ k et on remplace, il y a à nouveau troiscas selon le type <strong>de</strong> Z.Si Z = x : cas exponentielle rationnelleDonc Z ′ = 1, le <strong>de</strong>gré <strong>de</strong> RN ′ est r + n − 1 (si N est non constant c’est-à-dire siT n’est pas un multiple <strong>de</strong> S), le <strong>de</strong>gré <strong>de</strong> SN est s+n. Si r −1 ≠ s, on en déduitque :n = t − max(r − 1, s)Si r − 1 = s, on peut avoir une simplification du terme <strong>de</strong> plus haut <strong>de</strong>gré s + n(sinon on est dans le cas précé<strong>de</strong>nt) si nR r = S s d’où on déduit le <strong>de</strong>gré n <strong>de</strong> N.Par exemple, pour y ′ +2xy = T ou pour x 3 z ′ +(2x 4 +1)z = 1 on a r = s −1donc n + s = t, donc pas <strong>de</strong> solution dans le <strong>de</strong>uxième cas, dans le premier cas ilne peut y avoir <strong>de</strong> solutions que si t ≥ s, en particulier il n’y a pas <strong>de</strong> solution pourt = 1, on a donc démontré que ∫ exp(x 2 ) n’admet pas <strong>de</strong> primitive élémentaire.Si Z = exp(z) : cas exponentielle d’exponentielleIci les N k peuvent ne pas être constants, on a :N ′ =n∑(N k ′ + kN kz ′ )Z kk=0Comme on l’a déjà observé, N ′ n + nN n z ′ ≠ 0, donc le <strong>de</strong>gré <strong>de</strong> N ′ est égal au<strong>de</strong>gré <strong>de</strong> N. On a donc trois cas :– si r ≠ s, alors n = t − max(r, s)– si r = s et les termes <strong>de</strong> plus haut <strong>de</strong>gré du membre <strong>de</strong> gauche ne se simplifientpas, alors, n = t − r = t − s.– si r = s et s’il y a simplification, alors :R r (N ′ n + nN n z ′ ) + S s N n = 0donc :N n ′ + ( S s+ nz ′ )N n = 0R ret :∫SsN n = C exp(−nz − )R rOn appelle alors l’algorithme <strong>de</strong> Risch avec une variable <strong>de</strong> moins (S s etR r ne dépen<strong>de</strong>nt plus <strong>de</strong> Z) pour <strong>calcul</strong>er I = ∫ S s /R r . Il s’agit alors <strong>de</strong>76


trouver n tel que l’exponentielle précé<strong>de</strong>nte soit élémentaire et indépendante<strong>de</strong> la variable Z. Le théorème <strong>de</strong> structure <strong>de</strong> Risch implique que −nz −∫Ss /R r est combinaison linéaire à coefficients rationnels <strong>de</strong>s logarithmeset <strong>de</strong>s arguments <strong>de</strong>s exponentielles <strong>de</strong> autres variables <strong>de</strong> la tour (jusqu’àz non compris). Ceci permet <strong>de</strong> déterminer n <strong>de</strong> manière unique (c’est lecoefficient rationnel <strong>de</strong> ∫ S s /R r en z).Si Z = ln(z) : exponentielle <strong>de</strong> logarithmeIci aussi, les N k peuvent ne pas être constants, on a :N ′ =n∑(N k ′ z ′Zk + kN kz Zk−1 )k=0Si N n n’est pas constant, le terme <strong>de</strong> plus haut <strong>de</strong>gré <strong>de</strong> RN ′ est N ′ nR r Z n+r , si N nest constant, le terme <strong>de</strong> plus haut <strong>de</strong>gré <strong>de</strong> RN ′ est R r (nN n z ′ /z+N ′ n−1 )Zr−1 quiest non nul (sinon z ′ /z = CN ′ n−1 et z = exp(CN n−1) serait une exponentielle).Le terme <strong>de</strong> plus haut <strong>de</strong>gré <strong>de</strong> SN est N n S s Z n+s .– Si r < s ou si r = s sans simplifications, alors n = t − s.– Si r > s + 1 ou si r = s + 1 sans simplifications, alors <strong>de</strong>g(N ′ ) = t − rdonc n = t − r ou n = t − r + 1.– Si r = s + 1, et s’il y a simplifications, alors N n est constant et :R r (nN n z ′ /z + N ′ n−1) + S s N n = 0alors N n−1 = C(− ∫ N n S s /R r − nN n ln(z)) doit être élémentaire et indépendante<strong>de</strong> Z donc ∫ S s /R r est élémentaire, on détermine n en éliminantle coefficient <strong>de</strong> Z = ln(z) provenant <strong>de</strong> ∫ S s /R r .– Si r = s, et s’il y a simplification <strong>de</strong>s termes <strong>de</strong> plus haut <strong>de</strong>gré du membre<strong>de</strong> gauche, alors N ′ nR r + N n S s = 0 donc N n = exp(− ∫ S s /R r ) est élémentaireet indépendante <strong>de</strong> Z. On peut donc changer d’inconnue N =N n M sans changer le fait que M est un polynôme <strong>de</strong> même <strong>de</strong>gré que N.On se ramène alors à une équation du même typeRM ′ + (S − R S sR r)M = T N nmais avec s diminué <strong>de</strong> 1 au moins.Réduction (algorithme SPDE <strong>de</strong> Rothstein)On observe d’abord que si R et S ont un facteur en commun, alors ce facteurdivise T car N ′ et N sont <strong>de</strong>s polynômes en Z. On peut donc quitte à simplifierpar gcd(R, S) se ramener au cas où R et S sont premiers entre eux, il existe donc<strong>de</strong>ux polynômes U et V tels que :RU + SV = T, <strong>de</strong>g(V ) < <strong>de</strong>g(R) (22)En soustrayant (22) <strong>de</strong> (21), on montre que R divise N −V . Soit H = (N −V )/R.Alors N = RH + V doncR(RH ′ + R ′ H + V ′ ) + SRH + SV = T = RU + SVdonc après simplification par SV et division par R, H vérifie l’équation :RH ′ + (S + R ′ )H = U − V ′77


C’est une équation du même type mais avec <strong>de</strong>g(H)=<strong>de</strong>g(N)-<strong>de</strong>g(R) ou H = 0(si N = V ). Donc si <strong>de</strong>g(R) > 0, au bout d’un nombre fini d’étapes on doit tombersur un second membre nul ou <strong>de</strong>s simplifications <strong>de</strong> R avec S + R ′ telles que Rsimplifié soit constant en Z.RésolutionSi R est constant par rapport à Z, on simplifie par R et on doit résoudreN ′ + SN = TSi S = 0, c’est un problème d’intégration. Supposons donc que S ≠ 0. Si S estnon constant par rapport à Z ou si Z = x, le <strong>de</strong>gré <strong>de</strong> N ′ est strictement inférieurau <strong>de</strong>gré <strong>de</strong> SN, on peut donc facilement résoudre. Reste le cas où S = b estconstant non nul par rapport à Z et Z est une exponentielle ou un logarithme.Si Z = exp(z)On a alors doit alors résoudreN ′ k + kN kz ′ + bN k = T kc’est une équation différentielle <strong>de</strong> Risch mais avec une variable <strong>de</strong> moins.Si Z = ln(z)On doit alors résoudreN k ′ + (k + 1)N z ′k+1z + bN k = T kc’est aussi une équation différentielle <strong>de</strong> Risch avec une variable <strong>de</strong> moins.ExempleVoyons comment on intègre x n avec n un paramètre par l’algorithme <strong>de</strong> Risch(cela illustre les possibilités couvertes par l’algorithme mais aussi l’efficacité <strong>de</strong>smétho<strong>de</strong>s traditionnelles d’intégration lorsqu’elles s’appliquent). On écrit d’abordx n = e n ln(x) , donc la tour <strong>de</strong> variables est {x, Z = ln(x), X = e n ln(x) }, il s’agitdonc d’intégrer X qui est un polynôme généralisé. On cherche donc A 1 solution<strong>de</strong> l’équation différentielle <strong>de</strong> RischA ′ 1 + n/xA 1 = 1Par rapport à Z = ln(x) la fonction f = n/x est un polynôme, donc on applique le<strong>de</strong>rnier cas ci-<strong>de</strong>ssus, A 1 est aussi indépendant <strong>de</strong> ln(x) et on se ramène à résoudrela même équation mais avec comme variable principale x et non Z. Cette fois,il y a un dénominateur x en f. Si A 1 possè<strong>de</strong> un dénominateur, il faut qu’il yait annulation du terme <strong>de</strong> plus bas <strong>de</strong>gré en x car le second membre n’a pas <strong>de</strong>dénominateur, on obtient n + α = 0 qui n’a pas <strong>de</strong> solution, donc A 1 est unpolynôme en x et l’équation se réécrit en :xA ′ 1 + nA 1 = xOn majore alors le <strong>de</strong>gré en x <strong>de</strong> A 1 par 1, car il ne peut pas y avoir d’annulation<strong>de</strong> terme <strong>de</strong> plus grand <strong>de</strong>gré. Ensuite, on peut appliquer l’algorithme SPDE <strong>de</strong>Rothstein pour réduire le <strong>de</strong>gré, ou ici conclure à la main, x divise nA 1 donc A 1 =Cx qu’on remplace et C = 1/(n + 1). Finalement, A 1 = x/(n + 1) et ∫ x n =x/(n + 1)x n .78


9.4 Quelques références– M. Bronstein :Symbolic Integration I, Transcen<strong>de</strong>ntal functions, Springer– M. Bronstein :Integration tutorial,http://www-sop.inria.fr/cafe/Manuel.Bronstein/publications/mb_papers.– J.H. Davenport, Y. Siret, E. Tournier :Calcul <strong>formel</strong> : Systèmes et algorithmes <strong>de</strong> manipulations algébriques– R. Risch :les références <strong>de</strong>s articles originaux <strong>de</strong> Risch sont dans le “Integration tutorial”<strong>de</strong> Bronstein.– B. Trager :PHD thesis MIT, 1984– On peut lire en clair le co<strong>de</strong> source <strong>de</strong> l’implémentation en MuPAD (sousUnix, désarchiver le fichier lib.tar du répertoire /usr/local/MuPAD/share/libet regar<strong>de</strong>r dans le sous-répertoire lib/INTLIB)10 Algèbre linéaireOn présente ici <strong>de</strong>s algorithmes autour <strong>de</strong> la résolution exacte <strong>de</strong> systèmes(réduction <strong>de</strong>s matrices sous forme échelonnée) et la recherche <strong>de</strong> valeurs propreset <strong>de</strong> vecteurs propres (diagonalisation et jordanisation <strong>de</strong>s matrices).10.1 Résolution <strong>de</strong> systèmes, <strong>calcul</strong> <strong>de</strong> déterminant.10.1.1 La métho<strong>de</strong> du pivot <strong>de</strong> Gauß.– Le pivot : on détermine à partir d’une ligne i la ligne j où apparait le premiercoefficient non nul p dans la colonne à réduire. On échange les lignes i et j.Puis pour j > i (réduction sous-diagonale) ou j ≠ i (réduction complète),on effectue l’opération L j ← L j − p jp L i.Inconvénient : avec <strong>de</strong>s données exactes <strong>de</strong> taille non bornée, la complexité<strong>de</strong>s coefficients augmente plus vite qu’en choisissant le pivot le plus simplepossible, (remarque, lorsque les données sont approchées, on n’utilise pasnon plus cette métho<strong>de</strong> pour <strong>de</strong>s raisons <strong>de</strong> stabilité numérique). Le domained’utilisation naturel concerne donc les coefficients dans un corps fini (parexemple Z/nZ).– Le pivot partiel. On choisit le meilleur coefficient non nul <strong>de</strong> la colonne,où meilleur dépend du type <strong>de</strong> coefficient : avec <strong>de</strong>s données exactes, onchoisirait le coefficient <strong>de</strong> taille la plus petite possible, avec <strong>de</strong>s données approximatives,on choisit le coefficient <strong>de</strong> plus gran<strong>de</strong> norme dans la colonne.Le domaine d’utilisation naturel concerne les coefficients approchés. Pourles coefficients exacts, on remplacerait la réduction par L j ← pL j − p j L ipour ne pas effectuer <strong>de</strong> division. Mais avec cette métho<strong>de</strong>, la taille <strong>de</strong>s coefficientsaugmente <strong>de</strong> manière exponentielle. On peut améliorer la taille<strong>de</strong>s coefficients intermédiaires en divisant chaque ligne par le PGCD <strong>de</strong> sescoefficients, mais comme pour le <strong>calcul</strong> du PGCD par l’algorithme du sousrésultant,il existe une métho<strong>de</strong> plus efficace présentée ci-<strong>de</strong>ssous.79


– La métho<strong>de</strong> <strong>de</strong> Bareiss : on initialise un coefficient b à 1. On remplace l’étape<strong>de</strong> réduction ci-<strong>de</strong>ssus par L j ← (pL j − p j L i )/b. À la fin <strong>de</strong> l’étape <strong>de</strong> réduction,on met le coefficient b à la valeur du pivot p. L’intérêt <strong>de</strong> la métho<strong>de</strong>est que la division se fait sans introduire <strong>de</strong> fraction (la preuve pour les <strong>de</strong>uxpremières étapes se fait facilement à la main ou avec un système <strong>de</strong> <strong>calcul</strong><strong>formel</strong> (cf. infra), pour le cas général, on vérifie que le déterminant <strong>de</strong> lamatrice <strong>de</strong> départ est égal au <strong>de</strong>rnier coefficient sur la diagonale obtenu parcette métho<strong>de</strong> <strong>de</strong> réduction, ce <strong>de</strong>rnier est donc entier, le même raisonnementfait sur <strong>de</strong>s sous-matrices dont on prend les k premières lignes et colonneset une autre ligne et une autre colonne montre que tous les coefficients <strong>de</strong>smatrices intermédiaires sont entiers). On peut utiliser cette métho<strong>de</strong> aussibien pour la réduction sous-diagonale que pour la réduction complète (leslignes intervenant dans la combinaison linéaire subissent <strong>de</strong>s modificationsi<strong>de</strong>ntiques dans les <strong>de</strong>ux cas).Montrons avec MuPAD ou xcas en mo<strong>de</strong> mupad (comman<strong>de</strong> maple_mo<strong>de</strong>(2))qu’en effet, on n’introduit pas <strong>de</strong> dénominateur dans la métho<strong>de</strong> <strong>de</strong> Bareiss. Sansrestreindre la généralité, il suffit <strong>de</strong> le montrer avec une matrice 3x3 à coefficientssymboliques génériques.pivot:=proc (M,n,m,r) // n ligne du pivot, m colonne, r ligne a modifierlocal col,i,a,b;begincol:=ncols(M);a:=M[n,m];b:=M[r,m];for i from 1 to col do// print(i,a,b,n,m,r);M[r,i]:=a*M[r,i]-b*M[n,i];end_for;return(M);end_proc; /* End of pivot */A:=matrix(3,3,[[a,b,c],[d,e,f],[g,h,j]]);A:=pivot(A,1,1,2); A:=pivot(A,1,1,3); /* reduction 1ere colonne */A:=pivot(A,2,2,3); A:=pivot(A,2,2,1); /* reduction 2eme colonne */factor(A[3,3]);Ce qui met bien en évi<strong>de</strong>nce le facteur a dans A 3,3 .10.1.2 Le déterminant.On peut bien sûr appliquer les métho<strong>de</strong>s ci-<strong>de</strong>ssus en tenant compte <strong>de</strong>s pivotsutilisés et du produit <strong>de</strong>s coefficients diagonaux. Dans le cas <strong>de</strong> la métho<strong>de</strong> <strong>de</strong> Bareiss,si on effectue la réduction sous-diagonale uniquement, il n’est pas nécessaire<strong>de</strong> gar<strong>de</strong>r une trace <strong>de</strong>s pivots et <strong>de</strong> <strong>calcul</strong>er le produit <strong>de</strong>s coefficients diagonaux,montrons que la valeur du déterminant est égal au <strong>de</strong>rnier coefficient diagonal : eneffet si R désigne la matrice réduite et que l’on pose R 0,0 = 1, alors la réductionpar la métho<strong>de</strong> <strong>de</strong> Bareiss <strong>de</strong> la colonne i a pour effet <strong>de</strong> multiplier le déterminant80


<strong>de</strong> la matrice initiale M par (R i,i /(R i−1,i−1 ) n−i . Donc :<strong>de</strong>t(R) = <strong>de</strong>t(M)n∏R i,ii=1R n,n= <strong>de</strong>t(M)= <strong>de</strong>t(M)n−1∏(R i,i /(R i−1,i−1 ) n−ii=1n−1∏R i,ii=1Pour les matrices à coefficients entiers, on peut aussi utiliser une métho<strong>de</strong> modulaire: on <strong>calcul</strong>e une borne à priori sur le déterminant et on <strong>calcul</strong>e le déterminantmodulo suffisamment <strong>de</strong> petits nombres premiers pour le reconstruire par lesrestes chinois. L’avantage <strong>de</strong> cet algorithme est qu’il est facile à paralléliser.On utilise souvent la borne d’Hadamard sur le déterminant :| <strong>de</strong>t(M)| ≤ ∏ √ ∑|m i,j | 21≤i≤n1≤j≤nPreuve <strong>de</strong> la borne : on majore le déterminant par le produit <strong>de</strong>s normes <strong>de</strong>s vecteurscolonnes <strong>de</strong> M.Remarque :Si on veut juste prouver l’inversibilité d’une matrice à coefficients entiers, il suffit<strong>de</strong> trouver un nombre premier p tel que le déterminant <strong>de</strong> cette matrice modulo psoit non nul.Développement par rapport à une ligne ou une colonneOn a tendance à oublier ce type <strong>de</strong> métho<strong>de</strong> car le développement complet dudéterminant (faisant intervenir une somme sur toutes les permutations du groupesymétrique) nécessite d’effectuer n! produits <strong>de</strong> n coefficients et n! additions cequi est gigantesque. Or on peut "factoriser" une partie <strong>de</strong>s <strong>calcul</strong>s et se ramenerà n.2 n opérations élémentaires au lieu <strong>de</strong> n.n!. Remarquons aussi que le nombred’opérations élémentaires n’a guère <strong>de</strong> sens si on ne tient pas compte <strong>de</strong> la complexité<strong>de</strong>s expressions, l’avantage principal <strong>de</strong> la métho<strong>de</strong> <strong>de</strong> développement étantd’éviter d’effectuer <strong>de</strong>s divisions.Calcul du déterminant par développement <strong>de</strong> LaplaceOn <strong>calcul</strong>e d’abord tous les mineurs 2x2 <strong>de</strong>s colonnes 1 et 2 que l’on place dansune table <strong>de</strong> mineurs, puis on <strong>calcul</strong>e les mineurs 3x3 <strong>de</strong>s colonnes 1 à 3 en développantpar rapport à la colonne 3 et en utilisant les mineurs précé<strong>de</strong>nts, puisles mineurs 4x4 avec les mineurs 3x3, etc.. On évite ainsi <strong>de</strong> re<strong>calcul</strong>er plusieursfois les mêmes mineurs. Cf. par exemple l’implémentation en C++ dans giac/xcas(www-fourier.ujf-grenoble.fr/~parisse/giac.html) qui utilise letype générique map <strong>de</strong> la librairie standard C++ (STL) pour stocker les tables<strong>de</strong> mineurs (fonction <strong>de</strong>t_minor du fichier vecteur.cc).Nombre d’opérations élémentaires : il y a ( n 2 ) mineurs d’ordre 2 à <strong>calcul</strong>er nécessitantchacun 2 multiplications (et 1 addition), puis ( n 3 ) mineurs d’ordre 3 nécessitant3 multiplications et 2 additions, etc. donc le nombre <strong>de</strong> multiplications est <strong>de</strong>2( n 2 ) + 3(n 3 ) + ... + n(n n), celui d’additions est ( n 2 ) + 2(n 3 ) + ... + (n − 1)(n n) soit unnombre d’opérations élémentaires majoré par n.2 n .On observe "expérimentalement" que cet algorithme est intéressant lorsque lenombre <strong>de</strong> paramètres dans le déterminant est grand et que la matrice est plutôt81


creuse (majorité <strong>de</strong> coefficients nuls). Il existe <strong>de</strong>s heuristiques <strong>de</strong> permutation <strong>de</strong>slignes ou <strong>de</strong>s colonnes visant à optimiser la position <strong>de</strong>s zéros (par exemple, lesauteurs <strong>de</strong> GiNaC (www.ginac.<strong>de</strong>) suite à <strong>de</strong>s expérimentations privilégient lasimplification <strong>de</strong>s petits mineurs en mettant les colonnes contenant le maximum <strong>de</strong>zéros à gauche selon la <strong>de</strong>scription faite ici).Pour se convaincre <strong>de</strong> l’intérêt <strong>de</strong> cet algorithme, on peut effectuer le test O1<strong>de</strong> Lewis-Westerhttp://www.bway.net/~lewis/calatex.htmlil s’agit <strong>de</strong> <strong>calcul</strong>er un déterminant <strong>de</strong> taille 15 avec 18 paramètres.10.1.3 Systèmes linéairesOn peut appliquer la métho<strong>de</strong> du pivot <strong>de</strong> Gauß ou les règles <strong>de</strong> Cramer. Pourles systèmes à coefficients entiers non singuliers, on peut aussi utiliser une métho<strong>de</strong>p-adique asymptotiquement plus efficace. On <strong>calcul</strong>e d’abord une borne sur lescoefficients <strong>de</strong>s fractions solutions <strong>de</strong> l’équation Ax = b en utilisant les règles <strong>de</strong>Cramer et la borne d’Hadamard. On <strong>calcul</strong>e ensuite l’inverse <strong>de</strong> A modulo p (enchangeant <strong>de</strong> p si A n’est pas inversible modulo p), puis, six = ∑ ix i p i , A( ∑ i


matrice obtenue en écrivant les vecteurs v, Av, etc. en colonne dans cet ordre. Lescoordonnées <strong>de</strong> w donnent alors par ordre <strong>de</strong> <strong>de</strong>gré croissant un polynôme P <strong>de</strong><strong>de</strong>gré minimal tel que P(A)v = 0 donc P divise le polynôme minimal M. Doncsi P est <strong>de</strong> <strong>de</strong>gré n, P = M. Sinon, il faut vérifier que le polynôme obtenu annulela matrice A. On peut aussi <strong>calcul</strong>er en parallèle le polynôme P précé<strong>de</strong>nt pourquelques vecteurs aléatoires et prendre le PPCM <strong>de</strong>s polynômes obtenus.Exemple 1 ( ) 1 −1Polynôme minimal <strong>de</strong>. On prend v = (1, 0), la matrice à réduire est2 4alors :( 1 −1 −112 10 38)→( 1 0 −60 1 5Le noyau est engendré par (−6, 5, −1) donc P = −x 2 + 5x − 6.Exemple 2⎛A = ⎝3 2 −2−1 0 11 1 0en prenant v = (1, 0, 0) on obtient la matrice :⎛⎞ ⎛1 3 5 7A = ⎝ 0 −1 −2 −3 ⎠ → ⎝0 1 2 3⎞⎠)1 0 −1 −20 1 2 30 0 0 0le permier vecteur du noyau est (−1, 2, −1) d’où un polynôme divisant le polynômeminimal −x 2 + 2x − 1.10.2.2 Le polynôme caractéristiquePour une matrice générique, le polynôme caractéristique est égal au polynômeminimal, il est donc intéressant <strong>de</strong> chercher si le polynôme annulateur <strong>de</strong> A sur unvecteur aléatoire est <strong>de</strong> <strong>de</strong>gré n, car le temps <strong>de</strong> <strong>calcul</strong> du polynôme caractéristiqueest alors en O(n 3 ). Si cette métho<strong>de</strong> probabiliste échoue, on se rabat sur une <strong>de</strong>smétho<strong>de</strong> déterministe ci-<strong>de</strong>ssous :– on utilise la formule <strong>de</strong>t(λI − A) déterminé par une <strong>de</strong>s métho<strong>de</strong>s <strong>de</strong> <strong>calcul</strong><strong>de</strong> déterminant ci-<strong>de</strong>ssus. Cela nécessite O(n 3 ) opérations mais avec <strong>de</strong>scoefficients polynômes en λ.– on fait une interpolation <strong>de</strong> Lagrange en donnant n+1 valeurs distinctes à λ.Ce qui nécessite O(n 4 ) opérations mais avec <strong>de</strong>s coefficients indépendants<strong>de</strong> λ, <strong>de</strong> plus cette métho<strong>de</strong> est facile à programmer <strong>de</strong> manière parallèle.– si la matrice est à coefficients entiers on peut utiliser la métho<strong>de</strong> <strong>de</strong> Hessenberg(voir ci-<strong>de</strong>ssous), on <strong>calcul</strong>e une borne à priori sur les coefficients dupolynôme caractéristique (cf. Cohen p.58-59) :|P k | ≤( nn − k)(n − k) (n−k)/2 |M| n−k ,on <strong>calcul</strong>e le polynôme caractéristique modulo suffisamment <strong>de</strong> petits entierspuis on remonte par les restes chinois.⎞⎠83


10.2.3 La métho<strong>de</strong> <strong>de</strong> HessenbergPour les matrices à coefficients <strong>de</strong> taille bornée (modulaires par exemple) onpréfère la métho<strong>de</strong> <strong>de</strong> Hessenberg qui est plus efficace, car elle nécessite <strong>de</strong> l’ordre<strong>de</strong> n 3 opérations sur les coefficients.On se raméne d’abord à une matrice triangulaire supérieure à une diagonaleprès qui est semblable à la matrice <strong>de</strong> départ puis on applique une formule <strong>de</strong>récurrence pour <strong>calcul</strong>er les coefficients du polynôme caractéristique.Algorithme <strong>de</strong> réduction <strong>de</strong> Hessenberg :Dans une colonne m donnée <strong>de</strong> la matrice H, on cherche à partir <strong>de</strong> la ligne m+1un coefficient non nul. S’il n’y en a pas on passe à la colonne suivante. S’il y en aun en ligne i, on échange les lignes m + 1 et i et les colonnes m + 1 et i. Ensuitepour tout i ≥ m + 2, soit u = H i,m /H m+1,m , on remplace alors la ligne L i <strong>de</strong> Hpar L i −uL m+1 et la colonne C m+1 par C m+1 +uC i ce qui revient “à remplacer levecteur e m+1 ( <strong>de</strong> la base par ) le vecteur e m+1 +ue i ” ou plus précisément ( ) à multiplier1 01 0à gauche paret à droite par la matrice inverse (en utilisant−u 1u 1les lignes et colonnes m + 1 et i au lieu <strong>de</strong> 1 et 2 pour ces matrices). Ceci a poureffet d’annuler le coefficient H i,m dans la nouvelle matrice.On obtient ainsi en O(n 3 ) opérations une matrice H ′ semblable à H <strong>de</strong> laforme : ⎛H 1,1 ′ H 1,2 ′ ... H 1,n−2 ′ H 1,n−1 ′ H ′ ⎞1,nH 2,1 ′ H 2,2 ′ ... H 2,n−2 ′ H 2,n−1 ′ H ′ 2,n0 H 3,2 ′ ... H 3,n−2 ′ H 3,n−1 ′ H ′ 3,n0 0 ... H 4,n−2 ′ H 4,n−1 ′ H 4,n′ ⎜⎟⎝ . . ... . . . ⎠0 0 ... 0 H n,n−1 ′ H n,n′On <strong>calcul</strong>e alors le polynôme caractéristique <strong>de</strong> H ′ par une récurrence qui s’obtienten développant le déterminant par rapport à la <strong>de</strong>rnière colonne :h n (λ) = <strong>de</strong>t(λI n − H) = (λ − H ′ n,n)h n−1 (λ) − (−H ′ n−1,n)(−H ′ n,n−1)h n−2 (λ) ++(−H ′ n−2,n)(−H ′ n,n−1)(−H ′ n−1,n−2)h n−3 (λ) − ...où les h i s’enten<strong>de</strong>nt en gardant les i premières lignes/colonnes <strong>de</strong> H ′ . On peutécrire cette formule pour m ≤ n :m−1∑h m (λ) = (λ − H m,m)h ′ m−1 (λ) −H m−i,m′i=1 j=1∏i−1H m−j+1,m−jh ′ i−1 (λ)Pour effectuer cette récurrence <strong>de</strong> manière efficace, on conserve les h m (λ) dans untableau <strong>de</strong> polynômes et on utilise une variable produit contenant successivementles ∏ H ′ m−j+1,m−j .10.2.4 La métho<strong>de</strong> <strong>de</strong> Leverrier-Fad<strong>de</strong>ev-SouriauCette métho<strong>de</strong> permet le <strong>calcul</strong> simultané <strong>de</strong>s coefficients p i (i = 0..n) du polynômecaractéristique P(λ) = <strong>de</strong>t(λI − A) et <strong>de</strong>s coefficients matriciels B i (i =84


0..n − 1) du polynôme en λ donnant la matrice adjointe (ou comatrice) B(λ) <strong>de</strong>λI − A :(λI − A)B(λ) = (λI − A)k≤n−1B ∑k λ k = ( ∑ p k λ k )I = P(λ)I (23)k≤nRemarquons que cette équation donne une démonstration assez simple <strong>de</strong> Cayley-Hamilton puisque le reste <strong>de</strong> la division euclidienne du polynôme P(λ)I par λI−Aest P(A).Pour déterminer simultanément les p k et B k , on a les relations <strong>de</strong> récurrence :B n−1 = p n I = I, B k − AB k+1 = p k+1 I (24)Il nous manque une relation entre les p k et B k pour pouvoir faire le <strong>calcul</strong> parvaleurs décroissantes <strong>de</strong> k, on va montrer le :Théorème 8 La dérivée du polynôme caractéristique P ′ (λ), est égale à la trace<strong>de</strong> la matrice adjointe <strong>de</strong> λI − Atr(B) = P ′ (λ)Le théorème nous donne tr(B k ) = (k + 1)p k+1 . Si on prend la trace <strong>de</strong> (24), on a :tr(B n−1 ) = np n , (k + 1)p k+1 − tr(AB k+1 ) = np k+1donc on <strong>calcul</strong>e p k+1 en fonction <strong>de</strong> B k+1 puis B k :p k+1 = tr(AB k+1)k + 1 − n ,B k = AB k+1 + p k+1 IDémonstration du théorème :Soient V 1 (λ), ...V n (λ) les vecteurs colonnes <strong>de</strong> λI − A et b i,j (λ) les coefficients<strong>de</strong> B, on a :P ′ (λ 0 ) = <strong>de</strong>t(V 1 (λ), V 2 (λ), ..., V n (λ)) ′ |λ=λ 0= <strong>de</strong>t(V 1(λ ′ 0 ), V 2 (λ 0 ), ..., V n (λ 0 )) + <strong>de</strong>t(V 1 (λ 0 ), V 2(λ ′ 0 ), ..., V n (λ 0 )) ++... + <strong>de</strong>t(V 1 (λ 0 ), V 2 (λ 0 ), ..., V n(λ ′ 0 ))Il suffit alors <strong>de</strong> remarquer que V ′i (λ 0) est le i-ième vecteur <strong>de</strong> la base canoniquedonc :<strong>de</strong>t(V 1 (λ 0 ), V 2 (λ 0 ), ..., V ′i (λ 0 ), ..., V n (λ 0 )) = b i,i (λ 0 )Finalement :P ′ (λ 0 ) =n∑b i,i (λ 0 ) = tr (B(λ 0 ))Remarque :En réin<strong>de</strong>xant les coefficients <strong>de</strong> P et B <strong>de</strong> la manière suivante :i=1P(λ) = λ n + p 1 λ n−1 + p 2 λ n−2 ... + p nB(λ) = λ n−1 I + λ n−2 B 1 + ... + B n−185


on a montré que :⎧A 1 = A, p 1 = −tr(A), B 1 = A 1 + p 1 I⎪⎨ A 2 = AB 1 , p 2 = − 1 2 tr(A 2), B 2 = A 2 + p 2 I⎪⎩...A k = AB k−1 , p k = − 1 k tr(A k), B k = A k + p k IOn peut alors vérifier que B n = A n +p n I = 0. D’où ce petit programme à utiliseravec xcas en mo<strong>de</strong> mupad (maple_mo<strong>de</strong>(2);), ou avec MuPAD, ou à adapteravec un autre système :iequalj:=(j,k)->if j=k then return(1); else return(0); end_if;fad<strong>de</strong>ev:=proc(A) // renvoie la liste <strong>de</strong>s matrices B et le polynome Plocal Aj,AAj,Id,coef,n,pcara,lmat;beginn:=ncols(A);Id:=matrix(n,n,iequalj); // matrice i<strong>de</strong>ntiteAj:=Id;lmat:=[];// B initialise a liste vi<strong>de</strong>pcara:=[1];// coefficient <strong>de</strong> plus grand <strong>de</strong>gre <strong>de</strong> Pfor j from 1 to n dolmat:=append(lmat,Aj); // rajoute Aj a la liste <strong>de</strong> matricesAAj:=Aj*A;coef:=-trace(AAj)/j; // mupad linalg::trpcara:=append(pcara,coef); // rajoute coef au polynome caracteristiqueAj:=AAj+coef*Id;end_for;lmat,pcara;// resultatend_proc;10.2.5 Les vecteurs propres simples.On suppose ici qu’on peut factoriser le polynôme caractéristique (ou <strong>calcul</strong>erdans une extension algébrique d’un corps). Lorsqu’on a une valeur propre simpleλ 0 , en écrivant la relation (A−λ 0 I)B(λ 0 ) = P(λ 0 )I = 0, on voit que les vecteurscolonnes <strong>de</strong> la matrice B(λ 0 ) sont vecteurs propres. Remarquer que B(λ 0 ) ≠ 0sinon on pourrait factoriser λ − λ 0 dans B(λ) et apre`s simplifications on aurait :B(A − λ 0 I) (λ 0 ) =λ − λ 0Pλ − λ 0(λ 0 )Ior le 2ème membre est inversible en λ 0 ce qui n’est pas le cas du premier. Pouravoir une base <strong>de</strong>s vecteurs propres associés à λ 0 , on <strong>calcul</strong>e B(λ 0 ) par la métho<strong>de</strong><strong>de</strong> Horner appliquée au polynôme B(λ) en λ = λ 0 , et on réduit en colonnes lamatrice obtenue.10.2.6 La forme normale <strong>de</strong> JordanPour les valeurs propres <strong>de</strong> multiplicité plus gran<strong>de</strong> que 1, on souhaiterait généraliserla métho<strong>de</strong> ci-<strong>de</strong>ssus pour obtenir une base <strong>de</strong> l’espace caractéristique,86


sous forme <strong>de</strong> cycles <strong>de</strong> Jordan. Soit λ i , n i les valeurs propres comptées avec leurmultiplicité. On fait un développement <strong>de</strong> Taylor en λ i :()−P(λ)I = (A − λI) B(λ i ) + B ′ (λ i )(λ − λ i ) + ... + B(n−1) (λ i )(λ − λ i ) n−1(n − 1)!∏= −(λ − λ i ) n i(λ − λ j ) n jIj≠iComme A−λI = A−λ i I −(λ−λ i )I, on obtient pour les n i premières puissances<strong>de</strong> λ − λ i :(A − λ i I) B(n i) (λ i )n i !(A − λ i I)B(λ i ) = 0 (25)(A − λ i I)B ′ (λ i ) = B(λ i ) (26)(A − λ i I) B(n i−1) (λ i )(n i − 1)!− B(n i−1) (λ i )(n i − 1)!... (27)= B(n i−2) (λ i )(n i − 2)!(28)= − ∏ j≠i(λ i − λ j ) n jI (29)Le <strong>calcul</strong> <strong>de</strong>s matrices B (n) (λ i )/n! pour n < n i se fait en appliquant n i foisl’algorithme <strong>de</strong> Horner (avec reste).Théorème 9 L’espace caractéristique <strong>de</strong> λ i est égal à l’image <strong>de</strong> B (n i−1) (λ i )/(n i −1)!.Preuve :On montre d’abord que ImB (ni−1) (λ i )/(n i −1)! est inclus dans l’espace caractéristiquecorrespondant à λ i en appliquant l’équation (28) et les équations précé<strong>de</strong>ntes.Réciproquement on veut prouver que tout vecteur caractéristique v est dans l’image<strong>de</strong> B (ni−1) (λ i )/(n i − 1)!. Prouvons le par récurrence sur le plus petit entier m telque (A − λ i ) m v = 0. Le cas m = 0 est clair puisque v = 0. Supposons le casm vrai, prouvons le cas m + 1. On applique l’équation (29) à v, il suffit alors <strong>de</strong>prouver quew = (A − λ i ) B(ni) (λ i )vn i !appartient à l’image <strong>de</strong> B (n i−1) (λ i )/(n i −1)!. Comme B (n i) (λ i ) commute avec A(car c’est un polynôme en A ou en appliquant le fait que B(λ) inverse <strong>de</strong> A −λI) :(A − λ i ) m w = B(ni) (λ i )(A − λ i ) m+1 v = 0n i !et on applique l’hypothèse <strong>de</strong> récurrence à w.Pour <strong>calcul</strong>er les cycles <strong>de</strong> Jordan, nous allons effectuer une réduction parle pivot <strong>de</strong> Gauß simultanément sur les colonnes <strong>de</strong>s matrices B (k) (λ i )/k! oùk < n i . La simultanéité a pour but <strong>de</strong> conserver les relations (25) à (28) pourles matrices réduites. Pour visualiser l’algorithme, on se représente les matricesles unes au-<strong>de</strong>ssus <strong>de</strong>s autres, colonnes alignées. On commence par réduire la87


matrice B(λ i ) jusqu’à ce que l’on obtienne une matrice réduite en recopiantles opérations élémentaires <strong>de</strong> colonnes faites sur B(λ i ) sur toutes les matricesB (k) (λ i )/k!. On va continuer avec la liste <strong>de</strong>s matrices réduites issues <strong>de</strong> B ′ (λ i ),..., B (n i−1) (λ i )/(n i − 1)!, mais en déplacant les colonnes non nulles <strong>de</strong> B(λ i )d’une matrice vers le bas (pour une colonne non nulle <strong>de</strong> la matrice réduite B(λ)les colonnes correspondantes <strong>de</strong> B (k) (λ i ) réduite sont remplacées par les colonnescorrespondantes <strong>de</strong> B (k−1) (λ i ) réduite pour k décroissant <strong>de</strong> n i − 1 vers 1). Àchaque étape, on obtient une famille (éventuellement vi<strong>de</strong>) <strong>de</strong> cycles <strong>de</strong> Jordan, cesont les vecteurs colonnes correspondants aux colonnes non nulles <strong>de</strong> la matriceréduite du haut <strong>de</strong> la colonne. On élimine bien sûr les colonnes correspondant auxfins <strong>de</strong> cycles déjà trouvés.Par exemple, si B(λ i ) ≠ 0, son rang est 1 et on a une colonne non nulle,et un cycle <strong>de</strong> Jordan <strong>de</strong> longueur n i fait <strong>de</strong>s n i vecteurs colonnes <strong>de</strong>s matricesB (k) (λ i )/k! réduites. Plus généralement, on obtiendra plus qu’un cycle <strong>de</strong> Jordan(et dans ce cas B(λ i ) = 0).10.2.7 Exemple 1⎛A = ⎝3 −1 12 0 11 −1 2λ = 2 est valeur propre <strong>de</strong> multiplicité 2, on obtient :⎛ ⎞ ⎛−2 −1 1B(λ) = λ 2 I + λ ⎝ 2 −5 1 ⎠ + ⎝1 −1 −3⎞⎠1 1 −1−3 5 −1−2 2 2⎞⎠on applique l’algorithme <strong>de</strong> Horner :B(2) =B ′ (2) =⎛⎝⎛⎝1 −1 11 −1 10 0 02 −1 12 −1 11 −1 1⎞⎠ ,⎞⎠Comme B(2) ≠ 0, on pourrait arrêter les <strong>calcul</strong>s en utilisant une colonne nonnulle et le cycle <strong>de</strong> Jordan associé (2, 2, 1) → (1, 1, 0) → (0, 0, 0). Expliquonstout <strong>de</strong> même l’algorithme général sur cet exemple. La réduction <strong>de</strong> B(2) s’obtienten effectuant les manipulations <strong>de</strong> colonnes C 2 + C 1 → C 2 et C 3 − C 1 → C 3 . Oneffectue les mêmes opérations sur B ′ (2) et on obtient :⎛⎝⎛⎝1 0 01 0 00 0 02 1 −12 1 −11 0 0⎞⎠,⎞⎠88


L’étape suivante consiste à déplacer vers le bas d’une matrice les colonnes nonnulles <strong>de</strong> la matrice du haut, on obtient :⎛ ⎞1 1 −1⎝ 1 1 −1 ⎠0 0 0qui se réduit en :⎛⎝1 0 01 0 00 0 0on chercherait alors dans les colonnes 2 et 3 <strong>de</strong> nouveaux cycles (puisque la colonne1 a déja été utilisée pour fournir un cycle).10.2.8 Exemple 2⎞⎠⎛A = ⎝3 2 −2−1 0 11 1 0λ = 1 est valeur propre <strong>de</strong> multiplicité 3. On trouve :⎛ ⎞0 0 0B(1) = ⎝ 0 0 0 ⎠,0 0 0⎛2 2 −2B ′ (1) = ⎝ −1 −1 11 1 −1⎛ ⎞B ′′ 1 0 0(1)= ⎝ 0 1 0 ⎠20 0 1⎞⎠⎞⎠,Le processus <strong>de</strong> réduction commence avec B ′ (1) en haut <strong>de</strong> la liste <strong>de</strong> matrices, oneffectue les opérations élémentaires <strong>de</strong> colonne C 2 − C 1 → C 2 et C 3 + C 1 → C 3et on obtient :⎛⎝2 0 0−1 0 01 0 0⎛⎝1 −1 10 1 00 0 1La première colonne donne le premier cycle <strong>de</strong> Jordan (1, 0, 0) → (2, −1, 1). Ondéplace les premières colonnes d’une matrice vers le bas :⎛⎝⎞⎠ ,⎞⎠2 −1 1−1 1 01 0 189⎞⎠


qu’on réduit par les opérations 2C 2 + C 1 → C 2 et 2C 3 − C 1 → C 3 en :⎛ ⎞2 0 0⎝ −1 1 1 ⎠1 1 1Puis on effectue C 3 − C 2 → C 3 et la <strong>de</strong>uxième colonne nous donne le <strong>de</strong>uxièmecycle <strong>de</strong> Jordan, réduit ici à un seul vecteur propre (0, 1, 1).10.2.9 Le polynôme minimal par Fad<strong>de</strong>evOn vérifie aisément que le <strong>de</strong>gré du facteur (λ−λ i ) dans le polynôme minimal<strong>de</strong> A est égal à n i − k où k est le plus grand entier tel que :∀j < k, B (j) (λ i ) = 010.2.10 Formes normales rationnellesOn se place ici dans une problématique différente : trouver une matrice semblablela plus simple possible sans avoir à introduire d’extension algébrique pourfactoriser le polynôme caractéristique. Quitte à “compléter” plus tard la factorisationet la jordanisation à partir <strong>de</strong> la forme simplifiée. Il existe diverses formesassociées à une matrice et plusieurs algorithmes permettant <strong>de</strong> les relier entre elles,forme <strong>de</strong> Smith, <strong>de</strong> Frobenius, forme normale <strong>de</strong> Jordan rationnelle.On va présenter une métho<strong>de</strong> directe <strong>de</strong> <strong>calcul</strong> d’une forme normale contenantle maximum <strong>de</strong> zéros (dont la forme dite normale <strong>de</strong> Jordan rationnelle peut sedéduire) en utilisant le même algorithme que pour la forme normale <strong>de</strong> Jordan.Soit Q(λ) = q 0 + ... + q d λ d un facteur irréductible <strong>de</strong> <strong>de</strong>gré d et <strong>de</strong> multiplicité qdu polynôme caractéristique P . Il s’agit <strong>de</strong> construire un sous-espace <strong>de</strong> dimensiondq formé <strong>de</strong> “cycles <strong>de</strong> Jordan rationnels”. On part toujours <strong>de</strong> la relation (λI −A) ∑ k≤n−1 B kλ k = P(λ)I. On observe que Q(λ)I − Q(A) est divisible par(λI − A) donc il existe une matrice M(λ) telle que :(Q(λ)I − Q(A))( ∑B k λ k ) = Q(λ) q M(λ)k≤n−1On observe aussi que Q a pour coefficient dominant 1 puisqu’il divise P , on peutdonc effectuer <strong>de</strong>s divisions euclidiennes <strong>de</strong> polynômes donc <strong>de</strong> polynômes à coefficientsmatriciels par Q sans avoir à diviser <strong>de</strong>s coefficients. Ce qui nous permet<strong>de</strong> décomposer B(λ) = ∑ k≤n−1 B kλ k en puissances croissantes <strong>de</strong> Q :B(λ) = ∑ kC k (λ)Q(λ) k ,<strong>de</strong>g(C k ) < qOn remplace et on écrit que les coefficients <strong>de</strong>s puissances inférieures à q <strong>de</strong> Qsont nulles (la k-ième étant non nulle car M(λ) n’est pas divisible par Q pour lesmêmes raisons que pour la forme normale <strong>de</strong> Jordan). On a donc les relations :Q(A)C 0 = 0, C k = Q(A)C k+1ce qui donne une colonne <strong>de</strong> matrice C q−1 → C q−2 ... → C 0 → 0 qui sont imagesl’une <strong>de</strong> l’autre en appliquant Q(A). On peut alors faire l’algorithme <strong>de</strong> réduction90


simultanée sur les colonnes <strong>de</strong>s C j . On observe ensuite que le nombre <strong>de</strong> cycles <strong>de</strong>Jordan <strong>de</strong> Q(A) <strong>de</strong> longueur donnée est un multiple <strong>de</strong> d, en effet il suffit <strong>de</strong> multiplierun cycle par A, ..., A d−1 pour créer un autre cycle, <strong>de</strong> plus ces cycles forment<strong>de</strong>s familles libres car on a supposé Q irréductible. On peut donc choisir pour uncycle <strong>de</strong> longueur k <strong>de</strong>s bases <strong>de</strong> la forme (v k−1 , Av k−1 ..., A d−1 v k−1 ) → ... →(v 0 , Av 0 ..., A d−1 v 0 ) → (0, ...,0) où la flèche → désigne l’image par Q(A). Si onécrit la matrice <strong>de</strong> A dans la base v 0 , Av 0 ..., A d−1 v 0 , ..., v k−1 , Av k−1 ..., A d−1 v k−1on obtient un “quasi-bloc <strong>de</strong> Jordan rationnel” <strong>de</strong> taille kd multiple <strong>de</strong> d :ExempleSoit la matrice⎛⎞0 0 ... −q 0 0 0 ... 1 ...1 0 ... −q 1 0 0 ... 0 ...0 1 ... −q 2 0 0 ... 0 .... . ... . . . ... . ...0 0 ... −q d−1 0 0 ... 0 ...0 0 ... 0 0 0 ... −q 0 ...⎜⎝ 0 0 ... 0 1 0 ... −q 1 ... ⎟⎠.. ....1−32.. ...−1 321212. ...⎛⎞1 −2 4 −2 5 −45 −7 −50 12 22 2−5 −1 5A =1222 2−39 −7 −7⎜ 0 −12 23 2 ⎟⎝ 0 0 2 −2 3 −1 ⎠Son polynôme caractéristique est (x−2) 2 (x 2 −2) 2 et on va déterminer la partie bloc<strong>de</strong> Jordan rationnel correspondant au facteur irréductible sur les entiers Q(x) =(x 2 − 2) <strong>de</strong> multiplicité q = 2. On <strong>calcul</strong>e B(x) et l’écriture <strong>de</strong> B comme somme<strong>de</strong> puissances <strong>de</strong> Q (ici avec xcas en mo<strong>de</strong> xcas) :A:=[[1,-2,4,-2,5,-4],[0,1,5/2,(-7)/2,2,(-5)/2],[1,(-5)/2,2,1/(-2),5/2,-3][0,-1,9/2,(-7)/2,3,(-7)/2],[0,0,2,-2,3,-1],[1,(-3)/2,1/(-2),1,3/2,1/2P:=<strong>de</strong>t(A-x*idn(6));B:=normal(P*inv(A-x*idn(6))); // preferer un appel a fad<strong>de</strong>ev bien sur!ecriture(B,Q,q):={local j,k,l,n,C,D,E;C:=B;D:=B;E:=NULL;n:=coldim(B);for (j:=0;j


}E:=E,D;}return E;};E:=ecriture(B,x^2-2,2);QA:=A*A-2*idn(6);On vérifie bien que normal(QA*E(0)) et normal(QA*E(1))-E(0)) sontnuls. On sait qu’on a un bloc <strong>de</strong> taille 2 <strong>de</strong> cycles <strong>de</strong> Jordan <strong>de</strong> longueur 2, doncil n’est pas nécessaire <strong>de</strong> faire <strong>de</strong>s réductions ici, il suffit <strong>de</strong> prendre une colonnenon nulle <strong>de</strong> E(0), par exemple la première colonne en x = 0 et la colonne correspondante<strong>de</strong> E(1) et leurs images par A, ici cela donne (4, 24, 12, 32, 8, −4)correspondant à (0, 4, −4, 8, 4, −4), on <strong>calcul</strong>e les images par A, la matrice <strong>de</strong>l’endomorphisme restreint à ce sous-espace est alors le bloc <strong>de</strong> taille 4 :⎛⎜⎝0 2 0 11 0 0 00 0 0 20 0 1 0Cette forme normale minimise le nombre <strong>de</strong> coefficients non nuls, mais présenteun inconvénient, la partie nilpotente ne commute pas avec la partie blocdiagonale,contrairement à la forme normale rationnelle <strong>de</strong> Jordan qui contient <strong>de</strong>sblocs i<strong>de</strong>ntités au-<strong>de</strong>ssus <strong>de</strong> la diagonale <strong>de</strong> blocs. Pour⎛créer la forme⎞normale... 0 1rationnelle <strong>de</strong> Jordan, on doit donc remplacer les blocs ⎝ ... 0 0 ⎠ par <strong>de</strong>s...matrices i<strong>de</strong>ntités. Supposons constitués les j premiers blocs <strong>de</strong> taille d numérotés<strong>de</strong> 0 à j − 1 avec comme base <strong>de</strong> vecteurs (v 0,0 , ..., v 0,d−1 , ..., v j−1,d−1 ). Il s’agit<strong>de</strong> trouver un vecteur v j,0 pour commencer le bloc suivant. On définit alors v j,l enfonction <strong>de</strong> v j,l−1 en appliquant la relation Av j,l−1 = v j,l + v j−1,l−1 . Il faut doncchercher v j,0 tel que⎞⎟⎠Av j,d−1 = −q 0 v j,0 − ... − q d−1 v j,d−1 + v j−1,d−1 (30)En utilisant les relations <strong>de</strong> récurrence précé<strong>de</strong>ntes, on voit que cela revient à fixerQ(A)v j,0 en fonction <strong>de</strong>s v j ′ ,l avec j ′ < j (l quelconque). Ce qui est toujourspossible en utilisant la colonne <strong>de</strong> matrices C j ′ qui s’obtiennent en fonction <strong>de</strong>sC j ′ +1 en appliquant Q(A).Plus précisément, <strong>calcul</strong>ons les v j,l en fonction <strong>de</strong> v j,0 et <strong>de</strong>s v j ′ ,l ′ (j′ < j). Onutilise les coefficients binomiaux ( )lm <strong>calcul</strong>és par la règle du triangle <strong>de</strong> Pascal eton montre par récurrence que :On remplace dans (30) d’où :A d v j,0 −inf(d,j)∑m=1v j,l = A l v j,0 −(dm)v j−m,l−m +inf(l,j)∑m=1(lm)v j−m,l−m (31)d∑q l (A l v j,0 −l=092inf(l,j)∑m=1(lm)v j−m,l−m ) = 0


finalement :Q(A)v j,0 =d∑l=1inf(l,j)∑q lm=1(lm)v j−m,l−m (32)Application à l’exemple :Ici v 0,0 = (4, 24, 12, 32, 8, −4) et v 0,1 = Av j,0 dont une préimage par Q(A) estw 1,0 = (0, 4, −4, 8, 4, −4) et w 1,1 = Aw 1,0 . On applique (32), comme q 1 = 0 etq 2 = 1 on doit avoir :Q(A)v 1,0 =2∑l=1inf(l,1)∑q lm=1(lm)v 1−m,l−m = 2v 0,1donc :v 1,0 = 2A(0, 4, −4, 8, 4, −4) = (−8, −32, 0, −48, −16, 16)v 1,1 = Av 1,0 − v 0,0 = (4, 40, −4, 64, 24, −20)On vérifie bien que Av 1,1 = 2v 1,0 + v 0,1 .10.2.11 Fonctions analytiquesSoit f une fonction analytique et M une matrice. Pour <strong>calcul</strong>er f(M), on <strong>calcul</strong>ela forme normale <strong>de</strong> Jordan <strong>de</strong> M = P(D + N)P −1 où D =diag(d 1 , ..., d m )est diagonale et N nilpotente d’ordre n. On <strong>calcul</strong>e aussi le développement <strong>de</strong>Taylor <strong>formel</strong> <strong>de</strong> f en x à l’ordre n − 1, on a alors :⎛⎞n−1∑f(N) = P ⎝diag(f (j) (d 1 ), ..., f (j) (d m ))N j ⎠P −1j!j=010.3 Quelques autres algorithmes utilesPour <strong>calcul</strong>er le produit <strong>de</strong> matrices, on peut utiliser l’algorithme <strong>de</strong> Strassen,on présente ici la variante <strong>de</strong> Winograd. Soit à <strong>calcul</strong>er :( )( ) ( )a1,1 a 1,2 b1,1 b 1,2 c1,1 c= 1,2a 2,1 a 2,2 b 2,1 b 2,2 c 2,1 c 2,2On <strong>calcul</strong>e :s 1 = a 2,1 + a 2,2 , s 2 = s 1 − a 1,1 , s 3 = a 1,1 − a 2,1 , s 4 = a 1,2 − s 2puis :t 1 = b 1,2 − b 1,1 , t 2 = b 2,2 − t 1 , t 3 = b 2,2 − b 1,2 , t 4 = b 2,1 − t 2p 1 = a 1,1 b 1,1 , p 2 = a 1,2 b 2,1 , p 3 = s 1 t 1 , p 4 = s 2 t 2p 5 = s 3 t 3 , p 6 = s 4 b 2,2 , p 7 = a 2,2 t 4u 1 = p 1 + p 2 u 2 = p 1 + p 4 , u 3 = u 2 + p 5 , u 4 = u 3 + p 7u 5 = u 3 + p 3 , u 6 = u 2 + p 3 , u 7 = u 6 + p 693


Alors c 1,1 = u 1 , c 1,2 = u 7 , c 2,1 = u 4 , c 2,2 = u 5 .Cet algorithme utilise 7 multiplications et 15 additions ce qui économise 1 multiplicationet permet en appliquant récursivement cet algorithme pour <strong>de</strong>s matricesblocs <strong>de</strong> réduire la complexité d’un produit <strong>de</strong> gran<strong>de</strong>s matrices normalement enO(n 3 ) à O(n ln(7) ) (la preuve est analogue à celle <strong>de</strong> la multiplication <strong>de</strong>s polynômespar l’algorithme <strong>de</strong> Karatsuba).La plupart <strong>de</strong>s algorithmes d’algèbre linéaire “numérique” ont une utilité en<strong>calcul</strong> exact : par exemple la factorisation LU (avec les variations décrites dansla section réduction <strong>de</strong> Gauß), la factorisation QR (et donc la métho<strong>de</strong> <strong>de</strong> Gram-Schmidt, ici pour <strong>de</strong>s raisons d’efficacité on orthogonalise d’abord la base <strong>de</strong> départet on la normalise à la fin seulement), Cholesky,.... On peut aussi facilement programmerla recherche <strong>de</strong> la décomposition t PDP d’une matrice symétrique et endéduire la signature d’une forme quadratique. Citons enfin l’algorithme LLL (cf.Cohen) qui est utile dans <strong>de</strong> nombreux domaines (il permet <strong>de</strong> trouver <strong>de</strong>s vecteursassez courts dans un réseau, ce ne sont pas les plus courts, mais en contrepartie onles trouve très vite).10.4 Quelques références– Comme toujours on renvoie à l’excellent livre <strong>de</strong> Henri Cohen : A Course inComputational Algebraic Number Theory– Gantmacher : Théorie <strong>de</strong>s matrices– Pour une implémentation <strong>de</strong>s algorithmes <strong>de</strong> forme normale <strong>de</strong> Smith ou <strong>de</strong>Frobenius, cf. le source <strong>de</strong> MuPAD ouhttp://www.mapleapps.com/maplelinks/share/normform.html– Ferrard, Lemberg : Mathématiques Concrètes, Illustrées par la TI 92 et la TI89Présente aussi <strong>de</strong>s algorithmes plus numériques, et le lien avec la diagonalisationnumérique <strong>de</strong> matrices.– Press et al. : Numerical recipies in Fortran/C/Pascal.Pour <strong>de</strong>s algorithmes numériques (sur les matrices et autres).10.5 Bézout et les p-adiques.Soit n et a/b une fraction irréductible d’entiers tels que b est premier avec net |a| < √ n/2 et 0 ≤ b ≤ √ n/2. Il s’agit <strong>de</strong> reconstruire a et b connaissantx = a × (b −1 ) (mod n) avec x ∈ [0, n[.UnicitéS’il existe une solution (a, b) vérifiant |a| < √ n/2 et 0 ≤ b ≤ √ n/2, soit (a ′ , b ′ )une solution <strong>de</strong> x = a × (b −1 ) (mod n) et vérifiant |a ′ | < √ n et 0 ≤ b ′ ≤ √ n,alors :ab ′ = a ′ b (mod n)Comme |ab ′ | < n/2, |a ′ b| < n/2, on en déduit que ab ′ = a ′ b. Donc a/b = a ′ /b ′donc a = a ′ et b = b ′ car a/b et a ′ /b ′ sont supposées irréductibles.Reconstruction lorsqu’on sait qu’il y a une solutionOn suit l’algorithme <strong>de</strong> <strong>calcul</strong> <strong>de</strong>s coefficients <strong>de</strong> Bézout pour les entiers n et x.On pose :α k n + β k x = r k94


où les r k sont les restes successifs <strong>de</strong> l’algorithme d’Eucli<strong>de</strong>, avec la conditioninitiale :α 0 = 1, β 0 = 0, α 1 = 0, β 1 = 1, r 0 = n, r 1 = xet la relation <strong>de</strong> récurrence :β k+2 = β k − q k+2 β k+1 , q k+2 = r k − r k+2r k+1On a β k x = r k (mod n) pour tout rang mais il faut vérifier les conditions <strong>de</strong>taille sur β k et r k pour trouver le couple (a, b). Montrons par récurrence que :β k+1 r k − r k+1 β k = (−1) k n (33)Au rang k = 0, on vérifie l’égalité, on l’admet au rang k, alors au rang k + 1, ona :β k+2 r k+1 − r k+2 β k+1 = β k r k+1 − q k+2 r k+1 β k+1 − r k+2 β k+1= β k r k+1 − (r k − r k+2 )β k+1 − r k+2 β k+1= β k r k+1 − r k β k+1= −(−1) k nOn vérifie aussi que le signe <strong>de</strong> β k est positif si k est impair et négatif si k est pair,on déduit donc <strong>de</strong> (33) :|β k+1 |r k < n(avec égalité si r k+1 = 0)Considérons la taille <strong>de</strong>s restes successifs, il existe un rang k tel que r k ≥ √ net r k+1 < √ n. On a alors |β k+1 | < n/r k ≤ √ n.Donc l’algorithme <strong>de</strong> Bézout permet <strong>de</strong> reconstruire l’unique couple solutions’il existe.ExempleOn prend n = 101, a = 2, b = 3, a/b = 68 (mod 101). Puis on effectue Bézoutpour 68 et 101 en affichant les étapes intermédiaires (par exemple avec IEGCD surune HP49 ou exercice avec votre système <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>) := alpha*101+beta*68101 1 068 0 1 L1 - 1*L233 1 -1 L2 - 2*L32 -2 3 ...On s’arrête à la première ligne telle que le coefficient <strong>de</strong> la 1ère colonne est inférieurà √ 101, on retrouve bien 2 et 3. Quand on programme l’algorithme <strong>de</strong> reconstruction,on ne <strong>calcul</strong>e bien sûr pas la colonne <strong>de</strong>s α, ce qui donne par exemplele programme xcas ou mupad suivant :// Renvoie a/b tel que a/b=x mod n et |a|,|b|


eta0:=0;r1:=x;beta1:=1;sqrtn:=float(sqrt(n));while r1>sqrtn dor2:= irem(r0,r1);q2:=(r0-r2)/r1;beta2:=beta0-q2*beta1;beta0:=beta1; r0:=r1; beta1:=beta2; r1:=r2;end_while;return(r1/beta1);end_proc;96


10.6 Exercices (algèbre linéaire)10.6.1 Instructions– Les comman<strong>de</strong>s d’algèbre linéaire <strong>de</strong> Xcas sont regroupées dans le menuMath->Alglin. En maple et mupad, la comman<strong>de</strong> ?linalg affiche laliste <strong>de</strong>s comman<strong>de</strong>s d’algèbre linéaire.– En maple il est conseillé d’exécuter with(linalg) ;, en mupad export(linalg) ;,sinon il faut précé<strong>de</strong>r chaque comman<strong>de</strong> <strong>de</strong> linalg : :.– En maple, attention il faut utiliser le caractère & avant la multiplication et ilfaut souvent utiliser evalm dans les programmes utilisant <strong>de</strong>s matrices etvecteurs.– Pour travailler avec <strong>de</strong>s coefficients modulaires, en Xcas on fait suivre les coefficientsou matrices <strong>de</strong> % n, en maple on utilise les noms <strong>de</strong> comman<strong>de</strong>savec une majuscule (forme inerte) suivi <strong>de</strong> mod n, en mupad on définit lescoefficients dans l’anneau, par exempleZ19:=Dom::IntegerMod(19): MatZ19 := Dom::Matrix(Z19):A:=MatZ19([[1, 2], [2]]); Z19(5)*A;10.6.2 Exercices1. En utilisant un logiciel <strong>de</strong> <strong>calcul</strong> <strong>formel</strong>, comparez le temps <strong>de</strong> <strong>calcul</strong> d’undéterminant <strong>de</strong> matrice aléatoire à coefficients entiers <strong>de</strong> tailles 50 et 100,d’une matrice <strong>de</strong> taille 6 et 12 avec comme coefficients symboliques lignej colonne k, x j+k lorsque j + k est pair et 0 sinon. Peut-on en déduire uneindication sur l’algorithme utilisé ?2. Écrire un programme <strong>calcul</strong>ant la borne <strong>de</strong> Hadamard d’un déterminant àcoefficients réels (rappel : c’est la borne obtenue en faisant le produit <strong>de</strong>snormes euclidiennes <strong>de</strong>s vecteurs colonnes).3. Créez une matrice 4x4 aléatoire avec <strong>de</strong>s coefficients entiers compris entre-100 et 100, <strong>calcul</strong>er la borne <strong>de</strong> Hadamard <strong>de</strong> son déterminant avec le programmeprécé<strong>de</strong>nt, <strong>calcul</strong>er ce déterminant modulo quelques nombres premierschoisis en fonction <strong>de</strong> la borne <strong>de</strong> Hadamard et vérifiez le résultat <strong>de</strong>la reconstruction modulaire du déterminant.4. Créez une matrice 100x100 aléatoire à coefficients entiers et <strong>calcul</strong>ez sondéterminant modulo quelques nombres premiers. Dans quels cas peut-onconclure que la matrice est inversible dans R ? dans Z ?5. Écrire un programme <strong>calcul</strong>ant par interpolation <strong>de</strong> Lagrange le polynômecaractéristique d’une matrice (en donnant à λ <strong>de</strong> <strong>de</strong>t(λI −A), n+1 valeursdistinctes).6. (Long) Écrire un programme qui <strong>calcul</strong>e un déterminant <strong>de</strong> matrice en <strong>calcul</strong>antles mineurs 2x2 puis 3x3 etc. (métho<strong>de</strong> <strong>de</strong> Laplace)7. Recherche du polynôme minimal. On prend un vecteur aléatoire à coefficientsentiers et on <strong>calcul</strong>e v, Av, ..., A n v puis on cherche une relation linéaireminimale entre ces vecteurs, en <strong>calcul</strong>ant le noyau <strong>de</strong> la matrice ayantces vecteurs colonnes. Si le noyau est <strong>de</strong> dimension 1, alors le polynômeminimal est égal au polynome caractéristique et correspond à un vecteur <strong>de</strong>la base du noyau. Sinon, il faut choisir un vecteur du noyau correspondant97


au <strong>de</strong>gré le plus petit possible puis faire le PPCM avec les polynomes obtenursavec d’autres vecteurs pour obtenir le polynôme minimal avec unegran<strong>de</strong> probabilité. Essayez avec la matrice A <strong>de</strong> taille 3 ayant <strong>de</strong>s 0 sur ladiagonale et <strong>de</strong>s 1 ailleurs. Écrire un programme mettant en oeuvre cetterecherche, testez-le avec une matrice aléatoire <strong>de</strong> taille 30.8. Testez l’algorithme métho<strong>de</strong> <strong>de</strong> Fa<strong>de</strong>ev pour la matrice A ci-<strong>de</strong>ssus. Mêmequestion pour⎛A = ⎝3 −1 12 0 11 −1 2⎞⎛⎠ , A = ⎝3 2 −2−1 0 11 1 0⎞⎠9. Écrire un programme <strong>calcul</strong>ant par une métho<strong>de</strong> itérative la valeur propre <strong>de</strong>module maximal d’une matrice à coefficients complexes. Dans le cas réel,modifier le programme pour pouvoir traiter le cas d’un couple <strong>de</strong> complexesconjugués <strong>de</strong> module maximal. Dans le cas hermitien ou réel symétrique, éliminerle couple valeur propre/vecteur propre et continuer la diagonalisationnumérique.10. Soient |a|, |b| < √ n/2 Écrire une fonction ayant comme arguments a/b(mod n) qui <strong>calcul</strong>e a et b.Utiliser ce programme pour résoudre un système 4,4 à coefficients entierspar une métho<strong>de</strong> p-adique.98


10.7 L’algorithme du simplexe11 InterpolationÉtant donné la facilité <strong>de</strong> manipulation qu’apportent les polynomes, on peutchercher à approcher une fonction par un polynôme. De plus l’interpolation est unoutil très utilisé pour <strong>calcul</strong>er <strong>de</strong>s polynômes en <strong>calcul</strong> <strong>formel</strong>.11.1 LagrangeLa métho<strong>de</strong> la plus naturelle consiste à chercher un polynôme <strong>de</strong> <strong>de</strong>gré le pluspetit possible égal à la fonction en certains points x 0 , ..., x n et à trouver une majoration<strong>de</strong> la différence entre la fonction et le polynôme. Le polynome interpolateur<strong>de</strong> Lagrange répond à cette question.Soit donc x 0 , ..., x n <strong>de</strong>s réels distincts et y 0 , ..., y n les valeurs <strong>de</strong> la fonction àapprocher en ces points (on posera y j = f(x j ) pour approcher la fonction f). Oncherche donc P tel que P(x j ) = y i pour j ∈ [0, n].Commencons par voir s’il y a beaucoup <strong>de</strong> solutions. Soit P et Q <strong>de</strong>ux solutionsdistinctes du problème, alors P − Q est non nul et va s’annuler en x 0 , ..., x ndonc possè<strong>de</strong> n + 1 racines donc est <strong>de</strong> <strong>de</strong>gré n + 1 au moins. Réciproquement,si on ajoute à P un multiple du polynome A = ∏ nj=0 (X − x j), on obtient uneautre solution. Toutes les solutions se déduisent donc d’une solution particulière eny ajoutant un polynome <strong>de</strong> <strong>de</strong>gré au moins n + 1 multiple <strong>de</strong> A.Nous allons maintenant construire une solution particulière <strong>de</strong> <strong>de</strong>gré au plusn. Si n = 0, on prend P = x 0 constant. On procè<strong>de</strong> ensuite par récurrence. Pourconstruire le polynôme correspondant à x 0 , ..., x n+1 on part du polynoôme P n correspondantà x 0 , ..., x n et on lui ajoute un multiple réel <strong>de</strong> AP n+1 = P n + an∏(X − x j )Ainsi on a toujours P n+1 (x j ) = y j pour j = 0, ..n, on <strong>calcul</strong>e maintenant a pourque P n+1 (x n+1 ) = y n+1 . En remplacant avec l’expression <strong>de</strong> P n+1 ci-<strong>de</strong>ssus, onobtientn∏P n (x n+1 ) + a (x n+1 − x j ) = y n+1j=0j=0Comme tous les x j sont distincts, il existe une solution unique a :a = y n+1 − P n (x n+1 )∏ nj=0 (x n+1 − x j )On a donc prouvé le :Théorème 10 Soit n + 1 réels distincts x 0 , ..., x n et n + 1 réels quelconquesy 0 , ..., y n . Il existe un unique polynôme P <strong>de</strong> <strong>de</strong>gré inférieur ou égal à n, appelépolynome <strong>de</strong> Lagrange, tel que :P(x i ) = y i99


Exemple : déterminons le polynome <strong>de</strong> <strong>de</strong>gré inférieur ou égal à 2 tel queP(0) = 1, P(1) = 2, P(2) = 1. On commence par P 0 = 1. Puis on pose P 1 =P 0 +aX = 1+aX. Comme P(1) = 2 = 1+a on en tire a = 1 donc P 1 = 1+X.Puis on pose P 2 = P 1 + aX(X − 1), on a P 2 (2) = 3 + 2a = 1 donc a = −1,finalement P 2 = 1 + X − X(X − 1).On peut <strong>calcul</strong>er le polynome <strong>de</strong> Lagrange comme indiqué ci-<strong>de</strong>ssus, la métho<strong>de</strong>dite <strong>de</strong>s différences divisées permettant <strong>de</strong> le faire <strong>de</strong> la manière la plusefficace possible (cf. par exemple Demailly).Reste à estimer l’écart entre une fonction et son polynome interpolateur, on ale :Théorème 11 Soit f une fonction n + 1 fois dérivable sur un intervalle I = [a, b]<strong>de</strong> R, x 0 , ..., x n <strong>de</strong>s réels distincts <strong>de</strong> I. Soit P le polynome <strong>de</strong> Lagrange donné parles x j et y j = f(x j ). Pour tout réel x ∈ I, il existe un réel ξ x ∈ [a, b] (qui dépend<strong>de</strong> x) tel que :f(x) − P(x) = f[n+1] (ξ x )n∏(x − x j ) (34)(n + 1)!Ainsi l’erreur commise dépend d’une majoration <strong>de</strong> la taille <strong>de</strong> la dérivée n + 1-ième sur l’intervalle, mais aussi <strong>de</strong> la disposition <strong>de</strong>s points x j par rapport à x. Parexemple si les points x j sont équidistribués, le terme | ∏ nj=0 (x − x j)| sera plusgrand près du bord <strong>de</strong> I qu’au centre <strong>de</strong> I.Preuve du théorème : Si x est l’un <strong>de</strong>s x j l’égalité est vraie. SoitC = (f(x) − P(x))/on considère maintenant la fonction :g(t) = f(t) − P(t) − Cj=0n∏(x − x j )j=0n∏(t − x j )elle s’annule en x j pour j variant <strong>de</strong> 0 à n ainsi qu’en x suite au choix <strong>de</strong> laconstante C, donc g s’annule au moins n + 2 fois sur l’intervalle contenant lesx j et x, donc g ′ s’annule au moins n + 1 fois sur ce même intervalle, donc g ′′s’annule au moins n fois, etc. et finalement g [n+1] s’annule une fois au moins surcet intervalle. Org [n+1] = f [n+1] − C(n + 1)!car P est <strong>de</strong> <strong>de</strong>gré inférieur ou égal à n et ∏ nj=0 (x − x j) − x n+1 est <strong>de</strong> <strong>de</strong>gréinférieur ou égal à n. Donc il existe bien un réel ξ x dans l’intervalle contenant lesx j et x tel queC = f[n+1] (ξ x )(n + 1)!11.2 Différences diviséesLe <strong>calcul</strong> pratique du polynôme <strong>de</strong> Lagrange se fait efficacement dans la base{1, x − x 0 , ...,(x − x 0 )...(x − x n−1 )} par la métho<strong>de</strong> <strong>de</strong>s différences divisées. Onj=0100


définit <strong>de</strong> manière récursive les coefficients[Y ] = Y, [Y 0 , ..., Y n ] = [Y 1, ..., Y n ] − [Y 0 , ..., Y n−1 ]Y n − Y 0Le polynome d’interpolation est alors donné par :P(x) = [y 0 ]+[y 0 , y 1 ](x−x 0 )+[y 0 , y 1 , y 2 ](x−x 0 )(x−x 1 )+...+[y 0 , ..., y n ](x−x 0 )..(x−x n−1 )Pour la preuve, cf. par exemple Demailly.11.3 Les splinesIl s’agit <strong>de</strong> fonctions définies par <strong>de</strong>s polynomes <strong>de</strong> <strong>de</strong>gré borné sur <strong>de</strong>s intervalles,dont on fixe la valeur aux extrémités <strong>de</strong>s intervalles (comme pour le polynome<strong>de</strong> Lagrange) ce qui rend la fonction continue, <strong>de</strong> plus on exige un <strong>de</strong>gré<strong>de</strong> régularité plus grand, par exemple etre <strong>de</strong> classe C 2 . Enfin, on fixe <strong>de</strong>s conditionsaux bornes <strong>de</strong> la réunion <strong>de</strong>s intervalles, par exemple avoir certaines dérivéesnulles.Par exemple supposons qu’on se donne n intervalles, donc n+1 points x 0 , ..., x n ,on se fixe une régularité C d−1 . Ceci entraine (n − 1)d conditions <strong>de</strong> recollement,on y ajoute n + 1 conditions <strong>de</strong> valeur en x 0 , ..., x n , on a donc nd + 1 conditions,la borne sur le <strong>de</strong>gré <strong>de</strong>s polynomes doit donc etre d (ou plus, mais d suffit) cequi donne n(d + 1) <strong>de</strong>grés <strong>de</strong> liberté, on peut donc ajouter d − 1 conditions, parexemple pour les splines naturelles, on impose que les dérivées d’ordre d/2 à d −1soient nulles en x 0 et x n (si d est pair, on commence à la dérivée d/2 + 1-ièmenulle en x n ).Pour trouver les polynomes, on doit donc résoudre un grand système linéaire.Une métho<strong>de</strong> permettant <strong>de</strong> diminuer la taille du système linéaire à résoudre dans lecas <strong>de</strong>s splines naturelles consiste à se fixer n inconnues z 0 , .., z n−1 représentant lesdérivées d-ième <strong>de</strong> la spline f en x 0 sur [x 0 , x 1 ] à x n−1 sur [x n−1 , x n ], et (d−1)/2inconnues f j , représentant la valeur <strong>de</strong> la dérivée <strong>de</strong> f en x 0 pour j variant <strong>de</strong> 1 à(d − 1)/2. On peut alors écrire le polynome sur l’intervalle [x 0 , x 1 ] car on connaitson développement <strong>de</strong> Taylor en x 0 . On effectue un changement d’origine (parapplication répétée <strong>de</strong> Horner) en x 1 . On obtient alors le polynome sur [x 1 , x 2 ] enremplaçant uniquement la dérivée d-ième par z 1 . On continue ainsi jusqu’en x n−1 .Le système s’obtient en <strong>calcul</strong>ant la valeur du polynome en x 0 , ..., x n et la nullité<strong>de</strong>s dérivées d’ordre (d − 1)/2 à d/2 en x n . On résoud le système et on remplacepour avoir les valeurs numériques <strong>de</strong>s coefficients du polynome.101

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!