Anda di halaman 1dari 472

Jean Berstel Jean-Eric Pin Michel Pocchiola

MATHEMATIQUES ET INFORMATIQUE
Probl`mes rsolus e e ` ALGEBRE, COMBINATOIRE, ARITHMETIQUE

c 2005 Jean Berstel, Jean-Eric Pin et Michel Pocchiola Ce livre a t publi par McGraw-Hill France en 1991 ee e

Version 15 janvier 2005

Avant-propos
Depuis quelques annes, lintroduction dune preuve dinformatique aux concours dene e tre dans les grandes coles scientiques a cr un intrt accru pour des exemples e e ee e e dalgorithmes et de programmes qui sinspirent du programme des classes prparatoires. e Ce livre sinscrit dans ce cadre. Partant de sujets poss aux concours dentre a lENS e e ` dUlm (mais les th`mes abords se retrouvent, dans une forme voisine, dans dautres e e concours), nous proposons a la fois des solutions aux questions mathmatiques et des ` e programmes types pour les questions algorithmiques. Les rponses sont, la plupart du e temps, accompagnes de dveloppements qui permettent de replacer le probl`me dans e e e son cadre mathmatique et le programme dans un contexte informatique. Dans cette e forme largie, le livre intresse galement les tudiants des premier et deuxi`me cycles e e e e e universitaires en mathmatiques et en informatique; il est aussi un complment pour la e e prparation de loption dinformatique de lagrgation. e e Les th`mes e Lapparition de linformatique et de la programmation dans les classes prparatoires e fait dcouvrir a un grand nombre dtudiants leurs nombreuses applications possibles e ` e aux autres sciences. Cette utilisation ne se limite pas au seul calcul numrique car e linformatique permet aussi de formuler en termes algorithmiques et programmables des thories mathmatiques, des phnom`nes physiques, chimiques ou biologiques dont e e e e ltudiant navait nagu`re quune connaissance thorique. Le prsent livre permettra e e e e daborder cette dcouverte, en ce qui concerne lemploi de la programmation pour ltude e e de probl`mes mathmatiques. e e Les th`mes abords concernent principalement lalg`bre, la gomtrie, larithmtique e e e e e e et la combinatoire. On traite des sujets traditionnels dalg`bre linaire, mais aussi des e th`mes moins habituels comme les pseudo-inverses de matrices rectangulaires, les cone ditions de trigonalisation simultane dun ensemble de matrices, les matrices unimodue laires et les matrices irrductibles. Une section est consacre aux polynmes : recherche e e o des zros par les suites de Sturm, polynmes symtriques et factorisation des polynmes e o e o a coecients dans le corps a deux lments. Nous avons choisi daccorder une place im` ` ee portante aux probl`mes combinatoires parce quils fournissent, dune part, dexcellents e exemples de programmation et, dautre part, soul`vent des questions mathmatiques e e intressantes et parfois ardues. Parmi les probl`mes combinatoires classiques, nous traie e tons les nombres de Bernoulli et les partitions dentiers. Un long chapitre est consacr e a la combinatoire des mots, qui a dtroits rapports avec la logique mathmatique, la ` e e

VI

Avant-propos

thorie combinatoire des groupes, larithmtique et linformatique. La gomtrie algoe e e e rithmique est une discipline en plein essor. Nous abordons deux probl`mes typiques de e cette nouvelle thorie : la triangulation de Delaunay et le probl`me de la galerie dart . e e Tout particuli`rement dans ce chapitre, les algorithmes dcrits ne sont pas les meilleurs e e connus. La mise en uvre des algorithmes optimaux dpasse tr`s largement le cadre de e e ce livre. La derni`re partie traite de probl`mes arithmtiques. Il sagit, dune part, de la e e e factorisation des entiers de Gauss et, dautre part, de la manipulation de grands entiers ou de grands rels. Larithmtique modulaire est une premi`re technique mais elle ne e e e permet pas la division. Le dernier chapitre est consacr a larithmtique positionnelle. e` e On y dtaille le calcul sur les grands entiers et les grands rels et on prsente plusieurs e e e algorithmes de calcul des dcimales de . e Les solutions Les th`mes sont organiss sous forme de triptyques. La premi`re partie prsente un e e e e nonc, proche de la forme o` il a t donn au concours dentre a lENS (mais les e e u ee e e ` th`mes abords se retrouvent, comme nous lavons dj` dit, dans une forme voisine e e ea dans dautres concours). Lnonc comporte a la fois des questions mathmatiques et e e ` e des questions de programmation. La deuxi`me partie du triptyque donne une solue tion aux questions mathmatiques. Plutt que de reprendre une a une les questions de e o ` lnonc, cette partie est loccasion de prsenter des rsultats gnraux sur le th`me; e e e e e e e les solutions aux questions y gurent soit explicitement, soit en ligrane. En gnral, e e les questions mathmatiques prparent aux questions informatiques, dans la mesure o` e e u elles permettent dlaborer ou de justier le dveloppement des algorithmes. e e Les programmes La troisi`me partie dun triptyque contient les procdures ou fonctions qui rpondent aux e e e questions de programmation. L` aussi, on conoit la rponse dans un cadre plus large : a c e la plupart du temps, on sappuie sur des biblioth`ques de procdures dont lintrt peut e e e e dpasser le sujet et qui constituent le pendant des digressions mathmatiques. Lide qui e e e nous conduit dans cette approche est que la solution aux questions informatiques est en gnral facile a concevoir si lon dispose dun outillage appropri. Si, dans quelques e e ` e annes, des syst`mes de calcul formel remplaaient Pascal comme support informatique, e e c bon nombre des biblioth`ques dispara e traient, mais lessentiel des programmes resterait. Chaque th`me est complt par de br`ves notes bibliographiques dont le but est daider e ee e le lecteur intress a approfondir le sujet. e e` Les dialectes de Pascal Bien que le langage de programmation Pascal soit codi par une norme internationale, e de petites variations subsistent dun compilateur a lautre, dune machine a lautre. Les ` ` programmes prsents dans ce livre sont prvus pour fonctionner en Turbo Pascal sur e e e Version 15 janvier 2005

Avant-propos

VII

des ordinateurs compatibles PC et en Think Pascal sur des ordinateurs Macintosh. Nous avons retenu la version 4 pour Turbo Pascal et la version 2 pour Think Pascal; dans les deux cas, il sagit dun compromis entre ce qui est disponible sur le march et e ce qui est disponible dans les salles de travaux pratiques. Les dirences entre les deux e compilateurs sont faibles et sont reportes, dans la mesure o` elles sont pertinentes pour e u nos programmes, dans lannexe A. Le langage de programmation Lenseignement de la programmation dans les classes prparatoires constitue une ine troduction a lutilisation des ordinateurs pour la rsolution de probl`mes scientiques. ` e e Dans cette optique, lapprentissage de linformatique est limit a un petit nombre de e ` concepts, et la pratique de la programmation sappuie sur un sous-ensemble assez limit e du langage Pascal. Ce sous-ensemble comprend les types de base boolen, entier, rel e e et, comme type compos, les tableaux. Sont en particulier exclus les pointeurs et les ene registrements, les procdures et fonctions rcursives. Les dclarations de procdures et e e e e fonctions se limitent au niveau du programme principal (pas de dclaration a lintrieur e ` e dune procdure). Dans la mesure o` il ne sagit pas denseigner linformatique, mais e u seulement de familiariser les l`ves avec lusage des ordinateurs, les considrations sur ee e les structures de donnes ainsi que sur la complexit ou la validit des algorithmes mis e e e en uvre ne gurent pas au programme. Nous nous eorons, dans ce livre, de respecter ces contraintes. Dans certaines situations, c nous donnons, en plus des programmes itratifs, des procdures ou fonctions rcursives, e e e pour montrer combien cette criture peut tre confortable. Parfois, nous dclarons aussi e e e des procdures locales a dautres procdures ou fonctions, dans le but den diminuer le e ` e nombre de param`tres. En revanche, nous avons systmatiquement respect les limitae e e tions sur les donnes structures. e e Les restrictions sur Pascal dans le programme des classes prparatoires sont par ailleurs e fort intressantes du point de vue pdagogique, puisquelles mettent a jour les contorsions e e ` auxquelles on doit se livrer pour reprsenter des donnes structures. Par exemple, un e e e polynme a coecients rels est naturellement reprsent par un couple form dun entier o ` e e e e qui est le degr du polynme et dun tableau de rels. La notion de couple (record) ne e o e gurant pas au programme, le degr doit tre intgr dans le tableau des rels. Ce genre e e e e e de phnom`nes a dailleurs contribu au dveloppement de langages de programmation e e e e plus volus. Le lecteur averti pourra sans peine introduire, a de nombreux endroits, des e e ` structures de donnes plus appropries. e e Lecacit e Quant a la complexit des programmes, on peut faire plusieurs remarques. Les pro` e grammes que nous donnons ne sont pas les plus rapides possibles, loin sen faut. Notre souci principal tant la clart et la structuration, nos programmes comportent de nome e breux appels de procdures ou de fonctions l` o` une aectation simple aurait fait gagner e a u Version 15 janvier 2005

VIII

Avant-propos

beaucoup de temps, au dtriment de la clart. De mme, nous navons pas essay de e e e e faire des conomies de place et nous navons pas crit de programmes qui, au prix dune e e complication supplmentaire, permettent a plusieurs donnes de se partager une mme e ` e e place. Un programmeur astucieux peut, dans la plupart de nos programmes, diviser le temps dexcution par trois, voire plus, et la place requise par deux. Si nous gaspillons e aussi gnreusement les deux ressources principales, le temps et la place, cest quavec e e les matriels modernes, elles ne nous sont pas comptes, aussi longtemps que lon ralise e e e des exercices de programmation. Lexprience montre que le programme le plus inefe cace a un temps dexcution imperceptible, par rapport au temps pris par exemple e par la frappe des coecients dune matrice dordre 4 et par limpression des rsultats. e Tr`s rares sont les cas (les programmes de gomtrie algorithmique, ceux calculant les e e e dcimales de ou encore celui qui calcule la base de lalg`bre de Lie en sont) o` on e e u attend vraiment le rsultat et o` on cherche donc a amliorer lecacit. On saperoit e u ` e e c alors que llaboration de programmes ecaces passe par la conception dalgorithmes e ecaces qui, eux, ne sont faciles ni a trouver ni a prouver. ` ` Mode demploi Le livre est divis en deux volumes. Le premier volume regroupe les sujets dalg`bre e e et le second volume ceux de combinatoire, gomtrie et arithmtique. La numrotation e e e e des noncs indique dans lordre le numro de chapitre, le numro de section et le e e e e numro dnonc. Par exemple le thor`me 5.1.3 est le troisi`me nonc de la section 1 e e e e e e e e du chapitre 5. Nous conseillons au lecteur de chercher a rsoudre le probl`me par ses ` e e propres moyens avant de consulter la solution. An dviter les duplications inutiles, e la plupart des programmes gurant dans ce livre font appel a des biblioth`ques qui ` e sont fournies en annexe. Bien entendu, pour faire tourner les programmes gurant dans le livre, il sut de recopier les parties de la biblioth`que rellement utilises par le e e e programme. Remerciements Nous avons bnci de laide, de conseils, de discussions et de remarques de beaue e e coup de personnes, a des titres divers. Nous tenons a remercier Jean-Paul Allouche, ` ` Marie-Pierre Bal, Dani`le Beauquier, Bruno, Luc Boasson, Pierre Cartier, Maxime e e Crochemore, Marie-Thr`se Da Silva, Dominique Perrin, Christophe Reutenauer, Jeane e Jacques Risler, Mariette Yvinec. Nous remercions Claude Puech et Jean-Marie Riet pour leur intrt constant, et Yves Tremblay et Claire-Marie La Sade pour laccueil e e quils nous ont rserv et leur soutien logistique comptent. e e e

Version 15 janvier 2005

Table des mati`res e

IX

Table des mati`res e


I Alg`bre linaire e e 1
3 3 9 9 15 18 23 23 23 24 27 32 32 34 40 45 51 51 57 59 59 60 61 65 68

1 Calcul matriciel 1.1 1.2 Une biblioth`que . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Rsolution de syst`mes linaires . . . . . . . . . . . . . . . . . . . . . . . e e e 1.2.1 1.2.2 1.3 Mthode de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . e Mthode de Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . e

Rang dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Manipulation de matrices 2.1 Pseudo-inverses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.2.2 2.2.3 2.2.4 Enonc : pseudo-inverses . . . . . . . . . . . . . . . . . . . . . . . e Solution : pseudo-inverses . . . . . . . . . . . . . . . . . . . . . . Programme : pseudo-inverses . . . . . . . . . . . . . . . . . . . . Enonc : matrices trigonalisables . . . . . . . . . . . . . . . . . . e Solution : matrices trigonalisables . . . . . . . . . . . . . . . . . Une biblioth`que de manipulation des matrices complexes . . . . e Programme : matrices trigonalisables . . . . . . . . . . . . . . . .

Matrices trigonalisables . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Dcompositions e 3.1 3.2 3.3 Dcomposition LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e Dcomposition de Choleski . . . . . . . . . . . . . . . . . . . . . . . . . e Dcomposition QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 3.3.1 3.3.2 3.3.3 3.3.4 Enonc : dcomposition QR (mthode de Givens) . . . . . . . . . e e e Solution : dcomposition QR (mthode de Givens) . . . . . . . . e e Programme : dcomposition QR (mthode de Givens) . . . . . . e e Dcomposition QR (mthode de Householder) . . . . . . . . . . e e

Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Version 15 janvier 2005

X 4 Matrices tridiagonales 4.1

Table des mati`res e 69 69 69 71 72 72 73 74 75 78 79 80 81 85 85 85 87 90 96

Oprations sur les matrices tridiagonales . . . . . . . . . . . . . . . . . . e 4.1.1 4.1.2 4.1.3 Syst`me tridiagonal dquations . . . . . . . . . . . . . . . . . . . e e Dcomposition LU . . . . . . . . . . . . . . . . . . . . . . . . . . e Dcomposition de Choleski . . . . . . . . . . . . . . . . . . . . . e Enonc : tridiagonalisation (mthode de Givens) . . . . . . . . . e e Solution : tridiagonalisation (mthode de Givens) . . . . . . . . . e Programme : tridiagonalisation (mthode de Givens) . . . . . . . e Enonc : tridiagonalisation (mthode de Householder) . . . . . . e e Solution : tridiagonalisation (mthode de Householder) . . . . . . e Programme : tridiagonalisation (mthode de Householder) . . . . e

4.2

Tridiagonalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 4.2.2 4.2.3

4.3

Tridiagonalisation (mthode de Householder) . . . . . . . . . . . . . . . e 4.3.1 4.3.2 4.3.3

5 Valeurs et vecteurs propres 5.1 Mthode de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 5.1.1 5.1.2 5.1.3 5.2 5.3 Enonc : mthode de Jacobi . . . . . . . . . . . . . . . . . . . . . e e Solution : mthode de Jacobi . . . . . . . . . . . . . . . . . . . . e Programme : mthode de Jacobi . . . . . . . . . . . . . . . . . . e

Mthode QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e 5.3.1 5.3.2 5.3.3 5.3.4

Valeurs propres de matrices tridiagonales . . . . . . . . . . . . . . . . . 100 Enonc : valeurs propres de matrices tridiagonales . . . . . . . . 100 e Solution : valeurs propres de matrices tridiagonales . . . . . . . . 101 Programme : calcul par dichotomie . . . . . . . . . . . . . . . . . 102 Programme : calcul par suites de Sturm . . . . . . . . . . . . . . 107

5.4

Mthode LR de Rutishauser . . . . . . . . . . . . . . . . . . . . . . . . . 110 e 117

6 Matrices en combinatoire 6.1 6.1.1 6.1.2 6.1.3 6.2 6.2.1 6.2.2 6.2.3

Matrices unimodulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Enonc : matrices unimodulaires . . . . . . . . . . . . . . . . . . 117 e Solution : matrices unimodulaires . . . . . . . . . . . . . . . . . . 119 Programme : Matrices unimodulaires . . . . . . . . . . . . . . . . 124 Enonc : matrices irrductibles . . . . . . . . . . . . . . . . . . . 130 e e Solution : matrices irrductibles . . . . . . . . . . . . . . . . . . . 132 e Programme : matrices irrductibles . . . . . . . . . . . . . . . . . 136 e

Matrices irrductibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 e

Version 15 janvier 2005

Table des mati`res e

XI

II

Polynmes o
7.1

143
145

7 Polynmes o

Suites de Sturm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 7.1.1 Enonc : suites de Sturm . . . . . . . . . . . . . . . . . . . . . . 145 e 7.1.2 Solution : suites de Sturm . . . . . . . . . . . . . . . . . . . . . . 146 7.1.3 Programme : suites de Sturm . . . . . . . . . . . . . . . . . . . . 151 Polynmes symtriques . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 o e 7.2.1 7.2.2 7.2.3 Enonc : polynmes symtriques . . . . . . . . . . . . . . . . . . 158 e o e Solution : polynmes symtriques . . . . . . . . . . . . . . . . . . 160 o e Programme : polynmes symtriques . . . . . . . . . . . . . . . . 167 o e Enonc : factorisation de polynmes . . . . . . . . . . . . . . . . 178 e o Solution : Factorisation de polynmes . . . . . . . . . . . . . . . 180 o Programme : factorisation de polynmes . . . . . . . . . . . . . . 187 o

7.2

7.3

Factorisation de polynmes . . . . . . . . . . . . . . . . . . . . . . . . . 178 o 7.3.1 7.3.2 7.3.3

Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

III
8.1

Combinatoire

201
203

8 Exemples combinatoires

Gnration dobjets combinatoires . . . . . . . . . . . . . . . . . . . . . 203 e e 8.1.1 Sous-ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 8.1.2 Sous-ensembles a k lments . . . . . . . . . . . . . . . . . . . . 205 ` ee 8.1.3 Permutations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Nombres de Bernoulli . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 8.2.1 8.2.2 8.2.3 Enonc : nombres de Bernoulli . . . . . . . . . . . . . . . . . . . 211 e Solution : nombres de Bernoulli . . . . . . . . . . . . . . . . . . . 211 Programme : nombres de Bernoulli . . . . . . . . . . . . . . . . . 213

8.2

8.3

Partitions dentiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 8.3.1 Enonc : partitions dentiers . . . . . . . . . . . . . . . . . . . . . 216 e 8.3.2 8.3.3 Solution : partitions dentiers . . . . . . . . . . . . . . . . . . . . 218 Programme : partitions dentiers . . . . . . . . . . . . . . . . . . 226

9 Combinatoire des mots 235 9.1 Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 9.2 Mots de Lukasiewicz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Version 15 janvier 2005

XII 9.2.1 9.2.2 9.2.3 Mots 9.3.1 9.3.2 9.3.3 Suite 9.4.1 9.4.2 9.4.3 Enonc : mots de Lukasiewicz . . . e Solution : mots de Lukasiewicz . . Programme : mots de Lukasiewicz de Lyndon . . . . . . . . . . . . . . Enonc : mots de Lyndon . . . . . e Solution : mots de Lyndon . . . . . Programme : mots de Lyndon . . . de Thue-Morse . . . . . . . . . . . . Enonc : suite de Thue-Morse . . . e Solution : suite de Thue-Morse . . Programme : suite de Thue-Morse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Table des mati`res e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 240 243 248 248 249 251 261 261 263 266

9.3

9.4

IV

Gomtrie e e
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

273
275 276 286 294 294 295 302 309 309 311 315

10 Gomtrie algorithmique e e 10.1 Poly`dres et enveloppes convexes . . . . . . . . e 10.2 Quelques primitives gomtriques . . . . . . . . e e 10.3 Triangulation de Delaunay . . . . . . . . . . . . 10.3.1 Enonc : triangulation de Delaunay . . e 10.3.2 Solution : triangulation de Delaunay . . 10.3.3 Programme : triangulation de Delaunay 10.4 Galerie dart . . . . . . . . . . . . . . . . . . . 10.4.1 Enonc : galerie dart . . . . . . . . . . e 10.4.2 Solution : galerie dart . . . . . . . . . . 10.4.3 Programme : galerie dart . . . . . . . .

Arithmtique e
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

323
325 325 325 326 331 340 340 341 344

11 Probl`mes arithmtiques e e 11.1 Entiers de Gauss . . . . . . . . . . . . . . . . 11.1.1 Enonc : entiers de Gauss . . . . . . . e 11.1.2 Solution : entiers de Gauss . . . . . . 11.1.3 Programme : entiers de Gauss . . . . . 11.2 Arithmtique modulaire . . . . . . . . . . . . e 11.2.1 Enonc : arithmtique modulaire . . . e e 11.2.2 Solution : arithmtique modulaire . . e 11.2.3 Programme : arithmtique modulaire . e Version 15 janvier 2005

Table des mati`res e 12 Grands nombres 12.1 Entiers en multiprcision . . . . . . . . . . . . . . e 12.1.1 Enonc : entiers en multiprcision . . . . e e 12.1.2 Solution : entiers en multiprcision . . . . e 12.1.3 Programme : entiers en multiprcision . . e 12.2 Arithmtique ottante . . . . . . . . . . . . . . . e 12.2.1 Enonc : arithmtique ottante . . . . . . e e 12.2.2 Solution : arithmtique ottante . . . . . e 12.2.3 Programme : arithmtique ottante . . . e 12.3 Calcul de par arctangente . . . . . . . . . . . . 12.3.1 Enonc : calcul de par arctangente . . . e 12.3.2 Solution : calcul de par arctangente . . 12.3.3 Programme : calcul de par arctangente 12.4 La formule de Brent-Salamin . . . . . . . . . . . 12.4.1 Enonc : la formule de Brent-Salamin . . e 12.4.2 Solution : la formule de Brent-Salamin . . 12.4.3 Programme : la formule de Brent-Salamin A Un A.1 A.2 A.3 environnement Conseils de programmation Variations en Pascal . . . . Biblioth`ques . . . . . . . . e A.3.1 Gnralits . . . . . e e e A.3.2 Polynmes . . . . . o A.3.3 Les complexes . . . . A.3.4 Les rationnels . . . . A.4 Menus . . . . . . . . . . . . biblioth`ques e Gnralits . . . . . . . . e e e Calcul matriciel . . . . . . Polynmes . . . . . . . . . o Nombres complexes . . . . Nombres rationnels . . . . Mots . . . . . . . . . . . . Entiers en multiprcision . e Arithmtique ottante . . e Gomtrie . . . . . . . . . e e

XIII 351 351 351 352 355 370 370 371 372 383 383 385 390 394 394 396 403 411 411 417 418 420 424 430 437 440 447 447 448 449 450 451 452 452 453 454

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

B Les B.1 B.2 B.3 B.4 B.5 B.6 B.7 B.8 B.9

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

Version 15 janvier 2005

XIV

Table des mati`res e

Version 15 janvier 2005

Partie I

Alg`bre linaire e e

Chapitre 1

Calcul matriciel
Ce chapitre prsente les algorithmes de base pour le calcul matriciel, en particulier les e mthodes de Gauss et de Jordan pour la rsolution de syst`mes dquations linaires. e e e e e Le calcul dun dterminant et de linverse dune matrice sont traits. La dtermination e e e du rang dune matrice est expose en dtail; en eet, ce calcul est important puisquil e e quivaut a la dtermination de la dimension de lespace vectoriel engendr par un ene ` e e semble donn de vecteurs. e Le premier paragraphe dcrit un certain nombre de procdures de base qui constituent, e e avec les procdures des sections suivantes, une biblioth`que utile de manipulation de e e matrices. Sur la faon demployer une biblioth`que de procdures, voir lannexe A. c e e

1.1

Une biblioth`que e

Nous commenons par la prsentation dune biblioth`que de manipulation de matrices. c e e Quelques-unes de ces procdures sont faciles, dautres seront prsentes plus en dtail e e e e dans la suite de ce chapitre. Nous dclarons, sans surprise, le type des vecteurs et matrices par : e
CONST OrdreMax = 12; Lordre maximal des matrices et vecteurs. TYPE vec = ARRAY[1..OrdreMax] OF real; mat = ARRAY[1..OrdreMax] OF vec; vecE = ARRAY[1..OrdreMax] OF integer; VAR MatriceUnite: mat; Matrice prdnie. e e MatriceNulle: mat; Matrice prdnie. e e

En vue dallger les notations, on utilisera des procdures distinctes pour les matrie e ces carres et pour les matrices rectangulaires. En eet, considrons par exemple une e e Version 15 janvier 2005

Chapitre 1. Calcul matriciel

procdure de multiplication de matrices. Si les matrices sont carres, il sut de passer e e en param`tre lordre commun des matrices, alors quil faut trois param`tres dans le cas e e de matrices rectangulaires. Voici les en-ttes des procdures ou fonctions qui constituent la biblioth`que. Il y a trois e e e familles de procdures : les procdures dentres-sorties, un groupe de procdures ancile e e e laires, comme des copies de lignes et colonnes et des procdures ralisant des oprations e e e simples (multiplication, transposition, etc.) ou plus labores, comme la rsolution dun e e e syst`me dquations linaires et le calcul de linverse. e e e Dans certaines procdures, un param`tre appel titre permet dacher un texte avant e e e la lecture ou limpression; ceci facilite grandement linterprtation des rsultats. Le type e e texte doit tre dni au pralable, sa dnition dpend de la syntaxe du compilateur. e e e e e En Turbo Pascal comme en Think Pascal, cela peut tre string[80]. Linitialisation e des deux matrices prdnies se fait dans la procdure : e e e
PROCEDURE InitMatrices; Dnition de la matrice unit et de la matrice nulle. e e

Un certain nombre de procdures sont employes pour les entres et sorties de matrices e e e et de vecteurs :
PROCEDURE EntrerMatrice (n: integer; VAR a: mat; titre: texte); Achage du titre, puis lecture de la matrice a carre dordre n. e PROCEDURE EntrerMatriceRect (m, n: integer; VAR a: mat; titre: texte); Achage du titre, puis lecture de la matrice a dordre (m, n). PROCEDURE EntrerVecteur (n: integer; VAR a: vec; titre: texte); Achage du titre, puis lecture du vecteur a dordre n. PROCEDURE EntrerVecteurE (n: integer; VAR a: vecE; titre: texte); Achage du titre, puis lecture du vecteur entier a dordre n. PROCEDURE EntrerMatriceSymetrique (n: integer; VAR a: mat; titre: texte); Achage du titre, puis lecture de la partie triangulaire infrieure de la matrice syme e trique a dordre n. La partie suprieure de a est complte a la lecture. e e e ` PROCEDURE EcrireMatrice (n: integer; VAR a: mat; titre: texte); Achage du titre, puis de la matrice a dordre n. PROCEDURE EcrireMatriceRect (m, n: integer; VAR a: mat; titre: texte); Achage du titre, puis de la matrice a dordre (m, n). PROCEDURE EcrireVecteur (n: integer; VAR a: vec; titre: texte); Achage du titre, puis du vecteur a dordre n. PROCEDURE EcrireVecteurE (n: integer; VAR a: vecE; titre: texte); Achage du titre, puis du vecteur entier a dordre n.

Les oprations simples se font a laide de procdures dont voici les en-ttes : e ` e e
PROCEDURE MatricePlusMatrice (n: integer; a, b: mat; VAR ab: mat); Somme des deux matrices a et b dordre n. Rsultat dans la matrice ab. e PROCEDURE MatriceMoinsMatrice (n: integer; a, b: mat; VAR ab: mat); Dirence des deux matrices a et b dordre n. Rsultat dans la matrice ab. e e

Version 15 janvier 2005

1.1. Une biblioth`que e

PROCEDURE MatriceParMatrice (n: integer; a, b: mat; VAR ab: mat); Produit des deux matrices a et b dordre n. Rsultat dans la matrice ab. e PROCEDURE MatriceParMatriceRect (m, n, p: integer; a, b: mat; VAR ab: mat); Produit de la matrice a dordre (m, n) par la matrice b dordre (n, p). Rsultat dans la e matrice ab, dordre (m, p). PROCEDURE MatriceParVecteur (n: integer; a: mat; x: vec; VAR ax: vec); Produit de la matrice a dordre n par le vecteur x. Rsultat dans le vecteur ax. e PROCEDURE MatriceRectParVecteur (m, n: integer; a: mat; x: vec; VAR ax: vec); Produit de la matrice a dordre (m, n) par le vecteur x. Rsultat dans le vecteur ax. e PROCEDURE VecteurParMatrice (n: integer; x: vec; a: mat; VAR xa: vec); Produit du vecteur ligne x par la matrice a dordre n. Rsultat dans le vecteur xa. e PROCEDURE VecteurPlusVecteur (n: integer; a, b: vec; VAR ab: vec); Somme des deux vecteurs a et b dordre n. Rsultat dans le vecteur ab. e PROCEDURE VecteurMoinsVecteur (n: integer; a, b: vec; VAR ab: vec); Dirence des deux vecteurs a et b dordre n. Rsultat dans le vecteur ab. e e PROCEDURE VecteurParScalaire (n: integer; x: vec; s: real; VAR sx: vec); Produit du vecteur x dordre n par le rel s. Rsultat dans le vecteur sx. e e

Dautres oprations lmentaires sont dcrites dans les procdures : e ee e e


PROCEDURE Transposer (n: integer; a: mat; VAR ta: mat); La matrice ta contient la transpose de la matrice a dordre n. e PROCEDURE TransposerRect (m, n: integer; a: mat; VAR ta: mat); La matrice ta dordre (n, m) contient la transpose de la matrice a dordre (m, n). e FUNCTION ProduitScalaire (n: integer; VAR a, b: vec): real; Donne le produit scalaire des deux vecteurs a et b dordre n. FUNCTION Norme (n: integer; VAR a: vec): real; Il sagit de la norme euclidienne. FUNCTION NormeInfinie (n: integer; VAR a: vec): real; Cest le maximum des valeurs absolues.

Les procdures que voici sont plus diciles a raliser (sauf la premi`re); leur criture e ` e e e sera dtaille dans les sections suivantes : e e
PROCEDURE SystemeTriangulaireSuperieur (n: integer; a: mat; b: vec; VAR x: vec); Solution dun syst`me dquations triangulaire suprieur. La matrice est suppose ine e e e versible. PROCEDURE SystemeParGauss (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); Solution dun syst`me dquations par la mthode de Gauss. e e e PROCEDURE InverseParGauss (n: integer; a: mat; VAR ia: mat; VAR inversible: boolean); Calcule la matrice inverse ia de a par la mthode de Gauss, si linverse existe. e PROCEDURE SystemeParJordan (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); Solution dun syst`me dquations par la mthode de Jordan. e e e

Version 15 janvier 2005

Chapitre 1. Calcul matriciel


PROCEDURE InverseParJordan (n: integer; a: mat; VAR ia: mat; VAR inversible: boolean); Calcule la matrice inverse ia de a par la mthode de Jordan, si linverse existe. e FUNCTION Determinant (n: integer; a: mat): real; Calcule le dterminant par la mthode de Gauss. e e

Nous donnons maintenant la ralisation de certaines procdures. e e


PROCEDURE InitMatrices; Dnition de la matrice unit et de la matrice nulle. e e VAR i, j: integer; BEGIN FOR i := 1 TO OrdreMax DO Dnition de la matrice nulle. e FOR j := 1 TO OrdreMax DO MatriceNulle[i, j] := 0; MatriceUnite := MatriceNulle; Dnition de la matrice unit. e e FOR i := 1 TO OrdreMax DO MatriceUnite[i, i] := 1; END; { de "InitMatrices" } PROCEDURE EntrerMatrice (n: integer; VAR a: mat; titre: texte); Achage du titre, puis lecture de la matrice a carre dordre n. e VAR i, j: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO BEGIN write(Ligne , i : 1, : ); FOR j := 1 TO n DO read(a[i, j]); END; readln END; { de "EntrerMatrice" }

Voici une variante de la procdure prcdente : e e e


PROCEDURE EntrerMatriceSymetrique (n: integer; VAR a: mat; titre: texte); Achage du titre, puis lecture de la partie triangulaire infrieure de la matrice syme e trique a dordre n. La partie suprieure de a est complte a la lecture. e e e ` VAR i, j: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO BEGIN write(Ligne , i : 1, : );

Version 15 janvier 2005

1.1. Une biblioth`que e


FOR j := 1 TO i DO BEGIN read(a[i, j]); a[j, i] := a[i, j] END; END; readln END; { de "EntrerMatriceSymetrique" }

La lecture dun vecteur se fait sur le mme mod`le : e e


PROCEDURE EntrerVecteur (n: integer; VAR a: vec; titre: texte); Achage du titre, puis lecture du vecteur a dordre n. VAR i: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO read(a[i]); readln END; { de "EntrerVecteur" }

Dans les procdures dachage, nous faisons appel a une variable globale precision, e ` qui indique le nombre de chires a imprimer apr`s le point dcimal. Ce paramtrage est ` e e e utile quand on veut se rendre compte de la prcision des calculs numriques. e e
PROCEDURE EcrireMatrice (n: integer; VAR a: mat; titre: texte); Achage du titre, puis de la matrice a dordre n. VAR i, j: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO BEGIN FOR j := 1 TO n DO write(a[i, j] : (precision + 5) : precision); writeln END END; { de "EcrireMatrice" }

Voici une variante de cette procdure. e


PROCEDURE EcrireVecteurE (n: integer; VAR a: vecE; titre: texte); Achage du titre, puis du vecteur entier a dordre n. VAR i: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO

Version 15 janvier 2005

8
write(a[i] : precision); writeln END; { de "EcrireVecteurE" }

Chapitre 1. Calcul matriciel

A titre dexemple de procdures simples de manipulation de matrices, donnons le produit e de deux matrices rectangulaires et la transpose dune matrice carre. e e
PROCEDURE MatriceParMatriceRect (m, n, p: integer; a, b: mat; VAR ab: mat); Produit de la matrice a dordre (m, n) par la matrice b dordre (n, p). Rsultat dans la e matrice ab, dordre (m, p). VAR i, j, k: integer; somme: real; BEGIN FOR i := 1 TO m DO FOR j := 1 TO p DO BEGIN somme := 0; FOR k := 1 TO n DO somme := somme + a[i, k] * b[k, j]; ab[i, j] := somme END END; {de "MatriceParMatriceR" } PROCEDURE Transposer (n: integer; a: mat; VAR ta: mat); La matrice ta contient la transpose de la matrice a dordre n. e VAR i, j: integer; BEGIN FOR i := 1 TO n DO FOR j := 1 TO n DO ta[i, j] := a[j, i] END; { de "Transposer" }

Enn, les procdures de calcul du produit scalaire et des deux normes. e


FUNCTION ProduitScalaire (n: integer; VAR a, b: vec): real; VAR i: integer; somme: real; BEGIN somme := 0; FOR i := 1 TO n DO somme := somme + a[i] * b[i]; ProduitScalaire := somme END; { de "ProduitScalaire" } FUNCTION Norme (n: integer; VAR a: vec): real; BEGIN norme := sqrt(ProduitScalaire(n, a, a)) END; { de "Norme" }

Version 15 janvier 2005

1.2. Rsolution de syst`mes linaires e e e


FUNCTION NormeInfinie (n: integer; VAR a: vec): real; VAR i: integer; r: real; BEGIN r := 0; FOR i := 1 TO n DO r := rmax(r, abs(a[i])); NormeInfinie := r END; { de "NormeInfinie" }

1.2

Rsolution de syst`mes linaires e e e


Ax = b

Soit a rsoudre un syst`me dquations linaires : ` e e e e

o` A = (ai,j ) est une matrice relle dordre n, et x et b sont des vecteurs colonnes. On u e suppose que A est de rang n. Le cas des syst`mes triangulaires est susamment simple e pour tre trait immdiatement. e e e
PROCEDURE SystemeTriangulaireSuperieur (n: integer; a: mat; b: vec; VAR x: vec); VAR k, j: integer; s: real; BEGIN FOR k := n DOWNTO 1 DO BEGIN s := b[k]; FOR j := k + 1 TO n DO s := s - a[k, j] * x[j]; x[k] := s / a[k, k] END; END; { de "SystemeTriangulaireSuperieur" }

Pour le cas gnral, on consid`re ici deux mthodes voisines, la mthode dite de Gauss e e e e e et la mthode de Jordan. Une variante de ces mthodes, fonde sur la dcomposition e e e e LU , sera prsente plus loin. e e

1.2.1

Mthode de Gauss e

La mthode de Gauss ou mthode du pivot partiel est compose de deux phases : une e e e phase dlimination qui transforme le syst`me dquations en un syst`me triangulaire e e e e quivalent et une phase de substitution dans laquelle on rsout ce syst`me triangulaire. e e e Soit A(1) x = b(1) le syst`me original. Apr`s une ventuelle permutation de lignes, on e e e (1) peut supposer que le coecient a1,1 (le pivot ) nest pas nul, sinon A ne serait pas Version 15 janvier 2005

10

Chapitre 1. Calcul matriciel

de rang n. On rsout alors la premi`re quation par rapport a x1 et on limine cette e e e ` e variable des autres quations, ce qui donne le syst`me quivalent suivant : e e e a1,1 x1 + a1,2 x2 + + a1,n xn = b1
(2) (2) (1) (1) (1) (1) (2)

a2,2 x2 + + a2,n xn = b2 . . . . . . . . . (2) (2) (2) an,2 x2 + + an,n xn = bn

Apr`s une ventuelle permutation de la deuxi`me ligne avec une ligne dindice suprieur, e e e e (2) on peut supposer le pivot a2,2 non nul et recommencer avec ce syst`me. Apr`s k e e (k+1) itrations, la matrice A e a la forme : = a1,1 0 . . . 0 0 . . . 0
(k) (k) (k) (1)

a1,2 a2,2
(2)

(1)

a1,k a2,k . . . (k) ak,k 0 . . . 0


(k) (2)

(1)

A(k+1)

ak+1,k+1 . . . (k+1) an,k+1

(k+1)

Les quations de pivotage pour passer de A(k) a A(k+1) sont e ` ai,j et par ailleurs ai,j bi
(k+1) (k+1) (k+1) bi

(k+1) ak+1,n . . . a2,n . . . (k) ak,n


(2)

a1,n

(1)

an,n

(k+1)

= ai,j ai,k ak,j /ak,k =


(k) bi

(k) (k) (k) ai,k bk /ak,k

pour k + 1 i, j n pour k + 1 i n

(2.1)

= = bi

0 (k) ai,j
(k)

pour k + 1 i n et j = k sinon pour 1 i k 1

(k+1)

Notons que le passage de lquation A(k) x = b(k) a lquation A(k+1) x = b(k+1) revient e ` e a multiplier les deux membres de la premi`re quation par la matrice de Frobenius G k ` e e (une matrice de Frobenius est une matrice qui ne di`re de la matrice unit que par une e e ligne ou colonne) donne par e 1 0 0 .. . 0 1 0 Gk = (k) (k) ak+1,k /ak,k 1 0 . .. . . . (k) (k) 0 an,k /ak,k 0 1 Version 15 janvier 2005

1.2. Rsolution de syst`mes linaires e e e

11

qui est de dterminant 1, ce qui prouve en particulier que A(k+1) est inversible si et e seulement si A(k) lest. Dans le cas o` il y a change de lignes, il convient de multiplier u e au pralable la matrice A(k) par la matrice de permutation correspondante, ce qui change e le signe du dterminant. e On obtient donc, apr`s la derni`re opration de pivotage, un syst`me dquations triane e e e e gulaire A(n) x = b(n) qui scrit e a1,1 x1 + a1,2 x2 + + a1,n xn = b1
(2) (2) (1) (1) (1) (1) (2)

a2,2 x2 + + a2,n xn = b2 . . .. . . . . . (n) (n) an,n xn = bn

que lon rsout en utilisant la mthode dcrite plus haut. Lopration de pivotage, cene e e e trale dans cet algorithme, se programme par :
PROCEDURE PivoterGauss (k: integer); VAR i, j: integer; g: real; BEGIN FOR i := k + 1 TO n DO BEGIN g := a[i, k] / a[k, k]; b[i] := b[i] - g * b[k]; FOR j := k + 1 TO n DO a[i, j] := a[i, j] - g * a[k, j] END; END; { de "PivoterGauss" }

Seuls les coecients qui interviennent dans la suite sont modis. La recherche du pivot e peut se faire selon deux stratgies. La premi`re est la recherche dun pivot non nul et e e simplmente par : e
FUNCTION ChercherPivot (k: integer): integer; Cherche un indice i entre k et n tel que ai,k = 0 ; si un tel indice nexiste pas, le rsultat e est n + 1. VAR i: integer; BEGIN i := k; WHILE (i <= n) AND EstNul(a[i, k]) DO { AND squentiel } e i := i + 1; ChercherPivot := i END; { de "ChercherPivot" }

Une autre faon de procder est la recherche systmatique du pivot de plus grand moc e e dule, ce qui peut avoir un eet bnque sur les erreurs darrondi : e e Version 15 janvier 2005

12

Chapitre 1. Calcul matriciel


FUNCTION PivotMax (k: integer): integer; Dtermine un indice p entre k et n tel que |ap,k | est maximal. e VAR i, p: integer; BEGIN p := k; FOR i := k + 1 TO n DO IF abs(a[i, k]) > abs(a[p, k]) THEN p := i; PivotMax := p END; { de "PivotMax" }

La fonction EstNul teste si son argument est nul a pr`s. Elle est dnie comme suit : ` e e
FUNCTION EstNul (r: real): boolean; Vrai si r est nul a pr`s. ` e BEGIN EstNul := abs(r) < epsilon END; { de "EstNul" }

Bien entendu, le nombre est petit . Le choix dune valeur convenable pour ne peut pas tre fait a priori. Prendre = 108 na pas de sens lorsque les lments de la e ee matrice sont tous de lordre de 1010 ! Il faut choisir petit par rapport a une norme ` de la matrice. Dans la mesure o` les exemples que nous utilisons sont des matrices dont u les coecients sont de lordre de lunit, on peut choisir par exemple = 105 . e Pour changer des parties de lignes de matrices, on utilise la procdure : e e
PROCEDURE EchangerFinLignes (i, j: integer); VAR m: integer; BEGIN FOR m := i TO n DO Echanger(a[i, m], a[j, m]); END; { de "EchangerFinLignes" }

qui fait appel a une procdure qui change deux nombres rels, soit : ` e e e
PROCEDURE Echanger (VAR u, v: real); VAR w: real; BEGIN w := u; u := v; v := w END; { de "Echanger" }

Avec ces procdures, la mthode de Gauss scrit : e e e


PROCEDURE SystemeParGauss (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); Solution dun syst`me dquations Ax = b par la mthode de Gauss. Si A est inversible, e e e le boolen est vrai et x contient la solution. Sinon, le boolen est faux. e e

Version 15 janvier 2005

1.2. Rsolution de syst`mes linaires e e e


VAR k, q: integer; FUNCTION PivotMax (k: integer): integer; PROCEDURE PivoterGauss (k: integer); PROCEDURE EchangerFinLignes (i, j: integer); BEGIN { de "SystemeParGauss" } k := 1; inversible := true; WHILE (k <= n) AND inversible DO BEGIN q := PivotMax(k); inversible := NOT EstNul(a[q, k]); IF inversible THEN BEGIN IF q > k THEN BEGIN EchangerFinLignes(k, q); Echanger(b[k], b[q]); END; PivoterGauss(k); END; k := k + 1 END; { du while sur k } IF inversible THEN SystemeTriangulaireSuperieur(n, a, b, x) END; { de "SystemeParGauss" } Dnie plus haut. e Dnie plus haut. e Dnie plus haut. e Triangulation.

13

Rsolution. e

Le dterminant de la matrice A est, au signe pr`s, le produit des lments diagonaux de e e ee la matrice A(n) : (1) (2) dt A = (1)m a1,1 a2,2 a(n) e n,n o` m est le nombre dchanges de lignes faits. On en dduit immdiatement la procdure u e e e e suivante de calcul du dterminant par la mthode de Gauss : e e
FUNCTION Determinant (n: integer; a: mat): real; Calcule le dterminant de a par la mthode de Gauss. e e VAR d: real; k, q: integer; inversible: boolean; FUNCTION ChercherPivot (k: integer): integer; PROCEDURE EchangerFinLignes (i, j: integer); PROCEDURE pivoter (k: integer); VAR i, j: integer; g: real; BEGIN FOR i := k + 1 TO n DO BEGIN g := a[i, k] / a[k, k]; FOR j := k + 1 TO n DO a[i, j] := a[i, j] - g * a[k, j]

Variante de PivoterGauss.

Version 15 janvier 2005

14
END; END; { de "pivoter" } BEGIN { de "Determinant" } d := 1; k := 1; inversible := true; WHILE (k <= n) AND inversible DO BEGIN q := ChercherPivot(k); inversible := q <> n + 1; IF inversible THEN BEGIN IF q > k THEN BEGIN EchangerFinLignes(k, q); d := -d END; pivoter(k); END; k := k + 1 END; { sur k } IF inversible THEN BEGIN FOR k := 1 TO n DO d := d * a[k, k]; Determinant := d END ELSE Determinant := 0; END; { de "Determinant" }

Chapitre 1. Calcul matriciel

Une autre faon de calculer le dterminant sinspire directement du dveloppement par c e e rapport a une ligne ou une colonne. Ceci conduit naturellement a une fonction rcursive. ` ` e Dans la ralisation qui suit, on dveloppe par rapport a la derni`re colonne. e e ` e
FUNCTION DeterminantRecursif (n: integer; a: mat): real; VAR b: mat; signe, i, k: integer; d: real; BEGIN IF n = 1 THEN DeterminantRecursif := a[1, 1] ELSE BEGIN d := a[n, n] * DeterminantRecursif(n - 1, a); signe := 1; FOR i := n - 1 DOWNTO 1 DO BEGIN signe := -signe; b := a; FOR k := i TO n - 1 DO b[k] := b[k + 1]; d := d + signe * a[i, n] * DeterminantRecursif(n - 1, b); END; DeterminantRecursif := d END END; { de "DeterminantRecursif" }

Version 15 janvier 2005

1.2. Rsolution de syst`mes linaires e e e

15

Cette procdure engendre, de faon implicite, les n! permutations de {1, . . . , n} et est e c donc tr`s coteuse en temps d`s que n dpasse 6 ou 7, a comparer aux n 3 oprations e u e e ` e de la mthode de Gauss. Mais pour n 5, on a n! < n3 et malgr les recopies et e e ajustements de tableaux, le calcul est instantan dans ce cas. e

1.2.2

Mthode de Jordan e

La mthode de Jordan, aussi appele mthode de Gauss-Jordan ou mthode du pivot e e e e total, di`re de la mthode du pivot partiel en deux points : dune part, a chaque tape, e e ` e la ligne du pivot est divise par le pivot et, dautre part, lexpression de la variable x k de e la k-i`me quation est reporte dans toutes les autres quations et pas seulement dans e e e e les quations subsquentes. e e Le nombre doprations de substitution est plus important. En change, on fait lcoe e e nomie de la rsolution dun syst`me dquations triangulaire. Plus prcisment, si, avant e e e e e la k-i`me tape, on a le syst`me dquations e e e e 0 1 . . . 0 0 . . . 0 1 0 0 .. . 0 . . . 0 a1,k
(k) (k)

a2,k . . .
(k) (k)

1 ak1,k ak,k ak+1,k . . . (k) an,k


(k)

(k) b2 . . . (k) (k) ak1,n x = bk1 (k) (k) ak,n bk (k) (k) b ak+1,n k+1 . . . . . . (k) (k) bn an,n a2,n . . .
(k)

a1,n

(k)

b1

(k)

on peut supposer, quitte a changer la ligne k avec une ligne dindice suprieur, que ` e e (k) ak,k nest pas nul, sinon le syst`me ne serait pas de rang n. En tirant xk de la k-i`me e e quation et en le remplaant dans toutes les autres, on obtient e c 0 1 . . . 0 . . . 0 1 0 0 .. . a1,k+1
(k+1) (k+1)

a2,k+1 . . . (k+1) 1 ak,k+1 . . . . . . (k+1) 0 an,k+1 = ak,j /ak,k


(k) (k)

a1,n

(k+1)

avec

(k+1) (k+1) b2 a2,n . . . . . . x = (k+1) (k+1) b ak,n k . r. . . . . (k) (k+1) bn an,n

b1

(k+1)

ak,j

(k+1)

(k+1) bk

(k) (k) bk /ak,k

pour k + 1 j n

Version 15 janvier 2005

16 et pour i = 1, . . . , n et i = k ai,j
(k+1)

Chapitre 1. Calcul matriciel

(k+1) bi

= ai,j ai,k ak,j /ak,k =


(k) bi

(k)

(k) (k)

(k)

(k) (k) (k) ai,k bk /ak,k

pour k + 1 j n

Apr`s la n-i`me tape, le syst`me scrit e e e e e 1 1 . . . 0 .. . . x = . . (n) 1 bn b1 (n) b2 . . .


(n)

ce qui donne directement la solution. La dirence principale avec la mthode du pivot e e partiel rside dans lopration de pivotage, dont voici lcriture : e e e
PROCEDURE PivoterJordan (k: integer); VAR i, j: integer; BEGIN b[k] := b[k] / a[k, k]; Division de la ligne k. FOR j := k + 1 TO n DO a[k, j] := a[k, j] / a[k, k]; FOR i := 1 TO n DO Substitution dans les autres lignes. IF i <> k THEN BEGIN b[i] := b[i] - a[i, k] * b[k]; FOR j := k + 1 TO n DO a[i, j] := a[i, j] - a[i, k] * a[k, j] END; END; { de "PivoterJordan" }

Voici une procdure qui ralise lalgorithme complet : e e


PROCEDURE SystemeParJordan (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); Solution du syst`me dquations Ax = b par la mthode de Jordan. e e e VAR k, q: integer; FUNCTION PivotMax (k: integer): integer; PROCEDURE EchangerFinLignes (i, j: integer); PROCEDURE PivoterJordan (k: integer); BEGIN { de "SystemeParJordan" } k := 1; inversible := true; WHILE (k <= n) AND inversible DO BEGIN q := PivotMax(k); inversible := NOT EstNul(a[q, k]); IF inversible THEN BEGIN IF q > k THEN BEGIN

Version 15 janvier 2005

1.2. Rsolution de syst`mes linaires e e e


EchangerFinLignes(k, q); Echanger(b[k],b[q]) END; PivoterJordan(k); END; k := k + 1 END; { du while sur k } END; { de "SystemeParJordan" }

17

Le calcul de linverse dune matrice A inversible dordre n revient a rsoudre les n ` e syst`mes linaires e e Ax = ei , i = 1, . . . , n o` ei est le vecteur colonne dont toutes les coordonnes sont nulles sauf la i-`me qui u e e est gale a 1. On proc`de bien entendu par rsolution simultane plutt que successive e ` e e e o de ces syst`mes. Si, a une tape, un pivot nul ne peut pas tre limin par change de e ` e e e e e lignes, la matrice nest pas inversible. Voici une ralisation. e
PROCEDURE InverseParJordan (n: integer; a: mat; VAR ia: mat; VAR inversible: boolean); Calcule la matrice inverse ia de a par Jordan, si a est inversible. VAR k, q, j, m: integer; s: real; FUNCTION PivotMax (k: integer): integer; PROCEDURE EchangerLignes (i, j: integer); VAR m: integer; BEGIN FOR m := i TO n DO Echanger(a[i, m], a[j, m]); FOR m := 1 TO n DO Echanger(ia[i, m], ia[j, m]); END; { de "EchangerLignes" } PROCEDURE PivoterJordan (k: integer); Variante de PivoterJordan, VAR dnie plus haut. e i, j: integer; BEGIN FOR j := k + 1 TO n DO a[k, j] := a[k, j] / a[k, k]; FOR j := 1 TO n DO ia[k, j] := ia[k, j] / a[k, k]; FOR i := 1 TO n DO IF i <> k THEN BEGIN FOR j := k + 1 TO n DO a[i, j] := a[i, j] - a[i, k] * a[k, j]; FOR j := 1 TO n DO ia[i, j] := ia[i, j] - a[i, k] * ia[k, j] END; END; { de "PivoterJordan" } BEGIN { de "InverseParJordan" }

Version 15 janvier 2005

18
ia := MatriceUnite; k := 1; inversible := true; WHILE (k <= n) AND inversible DO BEGIN q := PivotMax(k); inversible := NOT EstNul(a[q, k]); IF inversible THEN BEGIN IF q > k THEN EchangerLignes(k, q); PivoterJordan(k); END; k := k + 1 END; { du while sur k } END; { de "InverseParJordan" }

Chapitre 1. Calcul matriciel

Rappelons que MatriceUnite dsigne la matrice unit, que lon suppose dnie dans e e e le programme entourant, par exemple par la procdure InitMatrices. La procdure e e prcdente peut tre rane; en particulier, il est possible de stocker linverse de a dans e e e e le tableau rserv a a. e e`

1.3

Rang dune matrice

Soit A une matrice relle dordre (m, n). On peut dterminer le rang r de A en calculant e e le nombre de colonnes linairement indpendantes de A. Le mme procd donne la e e e e e dimension de lespace vectoriel engendr par un ensemble ni de vecteurs; un petit e ranement permet dextraire, de cet ensemble, une famille libre maximale. Pour le calcul du rang, on applique la mthode de Gauss a la matrice A. Soit A(k) la e ` (1) (k1) matrice obtenue avant la k-i`me tape. Les pivots a1,1 , . . . , ak1,k1 tant non nuls, la e e e matrice est de rang au moins k 1. Si les coecients ai,k , pour i = k + 1, . . . , n, sont tous nuls, la k-i`me colonne de A(k) est combinaison linaire des prcdentes; on la e e e e supprime alors de A(k) et on proc`de avec la suivante. Sil ne reste plus de colonne a e ` (k) examiner, le calcul du rang est termin. Si, en revanche, lun des coecients ai,k , pour e i = k + 1, . . . , n, est non nul, on eectue le pivotage. Dans la ralisation qui suit, la suppression dune colonne linairement dpendante des e e e prcdentes se fait en changeant cette colonne avec la derni`re colonne. Un compteur e e e e de colonnes est alors dcrment. Lorsquil ne reste plus de colonnes, ce compteur est e e e gal au rang. e
FUNCTION Rang (m, n: integer; a: mat): integer; Calcule le rang de la matrice a dordre (m, n). Les procdures de la mthode de Gauss e e sont lg`rement modies, pour tenir compte du fait que a nest pas ncessairement e e e e carre. e VAR k, q: integer; r: integer; independant: boolean;
(k)

Version 15 janvier 2005

1.3. Rang dune matrice


FUNCTION ChercherPivot (k: integer): integer; Variante. VAR i: integer; BEGIN i := k; WHILE (i <= m) AND EstNul(a[i, k]) DO { AND squentiel } e i := i + 1; ChercherPivot := i END; { de "ChercherPivot" } PROCEDURE EchangerFinLignes (i, j: integer); Variante. VAR h: integer; BEGIN FOR h := i TO n DO Echanger(a[i, h], a[j, h]) END; { de "EchangerFinLignes" } PROCEDURE EchangerColonnes (i, j: integer); VAR h: integer; BEGIN FOR h := 1 TO m DO Echanger(a[h, i], a[h, j]) END; { de "EchangerColonnes" } PROCEDURE PivoterGauss (k: integer); Variante. VAR i, j: integer; g: real; BEGIN FOR i := k + 1 TO m DO BEGIN g := a[i, k] / a[k, k]; FOR j := k + 1 TO n DO a[i, j] := a[i, j] - g * a[k, j] END; END; { de "PivoterGauss" } BEGIN { de "Rang" } r := n; k := 1; WHILE k <= r DO BEGIN q := ChercherPivot(k); independant := q <> m + 1; IF independant THEN BEGIN IF q > k THEN EchangerFinLignes(k, q); PivoterGauss(k); k := k + 1; END ELSE BEGIN EchangerColonnes(k, r); r := r - 1

19

Version 15 janvier 2005

20
END; END; { de k } Rang := r END; { de "Rang" }

Chapitre 1. Calcul matriciel

Voici un exemple dexcution de la procdure, avec quelques impressions intermdiaires. e e e


Entrer la matrice Ligne 1 : 1 0 2 Ligne 2 : 2 0 4 Ligne 3 : 3 1 6 Ligne 4 : 1 0 2 Ligne 5 : 0 0 0 Matrice lue : 1.000 0.000 2.000 0.000 3.000 1.000 1.000 0.000 0.000 0.000 k=2 r=3 1.000 0.000 2.000 0.000 3.000 1.000 1.000 0.000 0.000 0.000 k=3 r=3 1.000 0.000 2.000 1.000 3.000 0.000 1.000 0.000 0.000 0.000 k=3 r=2 1.000 0.000 2.000 1.000 3.000 0.000 1.000 0.000 0.000 0.000 Rang = 2

2.000 4.000 6.000 2.000 0.000 2.000 0.000 0.000 0.000 0.000 2.000 0.000 0.000 0.000 0.000 2.000 0.000 0.000 0.000 0.000

Si lon conserve les indices des colonnes qui ont donn lieu a un pivotage, on obtient e ` une base des colonnes de la matrice A. Il sut de quelques changements mineurs pour adapter la procdure prcdente en ce sens. e e e
PROCEDURE BaseDesColonnes (m, n: integer; a: mat; VAR r: integer; VAR p: vecE); Calcule le rang r de la matrice a, et un vecteur p tel que les colonnes dindices dans p[1], . . . , p[r] forment une base des colonnes de a. VAR k, q: integer;

Version 15 janvier 2005

1.3. Rang dune matrice


independant: boolean; FUNCTION ChercherPivot (k: integer): integer; PROCEDURE EchangerFinLignes (i, j: integer); PROCEDURE EchangerColonnes (i, j: integer); PROCEDURE PivoterGauss (k: integer); BEGIN { de "BaseDesColonnes" } r := n; FOR k := 1 TO n DO p[k] := k; k := 1; WHILE k <= r DO BEGIN q := ChercherPivot(k); independant := q <> m + 1; IF independant THEN BEGIN IF q > k THEN EchangerFinLignes(k, q); PivoterGauss(k); k := k + 1; END ELSE BEGIN EchangerColonnes(k, r); p[k] := r; r := r - 1 END; END; { de k } END; { de "BaseDesColonnes" }

21

Voir Voir Voir Voir

Rang. Rang. Rang. Rang.

Initialisation de p.

Remplacement de colonne.

Voici un exemple, avec quelques rsultats intermdiaires : e e


Entrer la matrice Ligne 1 : 0 1 1 0 Ligne 2 : 0 0 0 0 Ligne 3 : 0 1 1 1 Matrice lue : 0.000 1.000 0.000 0.000 0.000 1.000 k=1 r=4 1.000 1.000 0.000 0.000 1.000 1.000 k=2 r=4 1.000 1.000 0.000 0.000 1.000 0.000 k=2 r=3 1.000 0.000 0.000 0.000 1.000 1.000 k=3 r=3 1 0 1 1.000 0.000 1.000 1.000 0.000 1.000 1.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 0.000 1.000 1.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000

Version 15 janvier 2005

22
1.000 0.000 1.000 k=3 r=2 1.000 0.000 1.000 Rang = 2 Indices des colonnes de la base 5 4 0.000 1.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000

Chapitre 1. Calcul matriciel

Bien entendu, il y a dautres bases de colonnes; la solution fournie par le programme est due au sens de parcours de la matrice.

Notes bibliographiques
Tous les livres danalyse numrique exposent les diverses mthodes dites directes de e e rsolution de syst`mes dquations linaires; les mthodes itratives sont employes pour e e e e e e e des syst`mes tr`s volumineux, tels quils se prsentent dans la rsolution dquations aux e e e e e drives partielles. Pour plus de dtails, on pourra consulter : e e e P.G. Ciarlet, Introduction a lanalyse numrique matricielle et a loptimisation, Paris, ` e ` Masson, 1988. Les erreurs darrondi sont un probl`me majeur de toutes les mthodes de rsolution e e e numrique. Un classique est : e J.H. Wilkinson, Rounding errors in algebraic processes, Englewood Clis, Prentice-Hall, 1963.

Version 15 janvier 2005

23

Chapitre 2

Manipulation de matrices
2.1
2.1.1

Pseudo-inverses
Enonc : pseudo-inverses e

Soient m, n 1 deux entiers. On note Mm,n lensemble des matrices relles a m lignes e ` et n colonnes. On note tA la transpose dune matrice A et Ik la matrice carre unit e e e dordre k. On appelle pseudo-inverse dune matrice A Mm,n toute matrice G Mn,m vriant e AGA = A GAG = G t(AG) = AG t(GA) = GA 1. Dmontrer quune matrice A poss`de au plus une pseudo-inverse. e e On admettra pour linstant (voir ci-dessous) que toute matrice A poss`de une pseudoe inverse, qui est donc unique et qui est note Ag . e 2. Soit A Mm,n de rang n. Dmontrer que Ag = (tAA)1tA. e 3. Soit U Mn,n une matrice symtrique dnie positive. Dmontrer quil existe une e e e matrice triangulaire infrieure L a lments diagonaux strictement positifs et une seule e `ee telle que U = LtL. 4. a) Ecrire une procdure qui prend en argument une matrice carre symtrique e e e dnie positive U et qui calcule la matrice L de la question prcdente. e e e 5 15 55 Exemple numrique : U = 15 55 225 e 55 225 979 b) Ecrire une procdure qui prend en argument une matrice carre symtrique dnie e e e e positive U et qui calcule son inverse. Mme exemple numrique. e e 5. Ecrire une procdure qui prend en argument une matrice A Mm,n de rang n et e qui calcule sa pseudo-inverse. Version 15 janvier 2005

24 1 1 Exemple numrique : A = 1 e 1 1 1 1 2 4 3 9 4 16 5 25

Chapitre 2. Manipulation de matrices

6. Soit A Mm,n de rang r et supposons que A se mette sous la forme A = (U, U K), o` U Mm,r est de rang r et K Mr,nr . u a) Dmontrer que e W Ug Ag = t KW U g o` W = (Ir + K tK)1 . u b) Ecrire une procdure qui prend en argument une matrice U Mm,r de rang r et une e matrice K Mr,nr et qui calcule la pseudo-inverse de la matrice (U, U K). 1 2 0 0 1 0 0 Exemple numrique : U = e K= 0 0 0 0 0 2 1

8. Prouver quune matrice poss`de une pseudo-inverse. e Soient m, n 1, avec m n. On consid`re une matrice A Mm,n et un vecteur colonne e b R m . Le probl`me des moindres carrs est la dtermination dun vecteur x R n tel e e e que Ax b = min Ay b () n
yR

7. Ecrire une procdure qui prend en argument une matrice A Mm,n et qui calcule e sa pseudo-inverse. 0 1 2 1 0 0 0 0 0 0 Exemple numrique : A = e 0 0 0 0 0 0 2 1 2 0

o` u

9. Dmontrer que x est solution de () si et seulement si e


t

dsigne la norme euclidienne. e AAx = tAb

En dduire que Ag b est solution de (). Dmontrer que si A est de rang n, alors () a e e une solution unique.

2.1.2

Solution : pseudo-inverses

On appelle pseudo-inverse ou galement inverse gnralise ou inverse de Penrose-Moore e e e e dune matrice A Mm,n toute matrice G Mn,m vriant e AGA = A GAG = G Version 15 janvier 2005
t

(AG) = AG

(GA) = GA

(1.1)

2.1. Pseudo-inverses

25

Dans le cas dune matrice A carre inversible, linverse A1 est lunique pseudo-inverse. e Proposition 2.1.1. Une matrice poss`de au plus une pseudo-inverse. e Preuve. Soient G et G deux pseudo-inverses dune matrice A. On a alors AG = AGAG = t(AG)t(AG ) = t(AG AG) = t(AG) = AG et de mme GA = G A. On en dduit que G = GAG = GAG = G AG = G . e e Quant a lexistence, on a la proposition suivante. ` Proposition 2.1.2. Toute matrice poss`de une pseudo-inverse. e Il y a plusieurs dmonstrations de cette proposition. Nous en donnons deux : la premi`re e e est br`ve, la deuxi`me conduit a un algorithme. e e ` Preuve. Munissons R n et R m du produit scalaire usuel, not . Soit A Mm,n et soit e a lapplication linaire de R n dans R m dont A est la matrice dans les bases canoniques. e Notons p la projection orthogonale de R m dimage Im(A) et q la projection orthogonale de R n de noyau Ker(A). La restriction a de a a Ker(A) est un isomorphisme de ` Ker(A) sur Im(A). Posons g = a1 q : R m R n Alors g a = p, a g = q, donc g a g = g et a g a = a. De plus, lendomorphisme p est symtrique, cest-`-dire px y = x py pour tout x, y dans R m , car px y = px (py + e a (I p)y) = px py et de mme x py = px py, do` lgalit. Il en rsulte que la matrice e u e e e P de p dans la base canonique est symtrique et, par le mme raisonnement, la matrice e e Q de q est symtrique. Si lon note G la matrice de g, on a donc t(GA) = tP = P = GA e et de mme t(AG) = AG. Ceci prouve que G est une pseudo-inverse de A. e Nous notons dsormais Ag la pseudo-inverse dune matrice A. Voici une deuxi`me e e dmonstration, en trois parties. e Lemme 2.1.3. Si A Mm,n est de rang n, alors (tAA)1tA est la pseudo-inverse de A.

Preuve. Posons Ag = (tAA)1tA. La matrice tAA est carre dordre n et de rang n, donc e inversible. Comme Ag A = In , la matrice unit dordre n, et que AAg est symtrique, e e les quations (1.1) sont manifestement vries. e e e Lemme 2.1.4. Soit A Mm,n de rang r et supposons que A se mette sous la forme A = (U, U K), o` U Mm,r est de rang r et K Mr,nr . Alors la pseudo-inverse de u A est W Ug t KW U g o` W = (Ir + K tK)1 . u Version 15 janvier 2005

26

Chapitre 2. Manipulation de matrices

Preuve. Montrons dabord que la matrice S = Ir + K tK est inversible. Elle est en eet dnie positive parce que txSx = txx + txK tKx = x 2 + tKx 2 = 0 si et seulement e si x = 0. Notons B la matrice dont on veut prouver quelle est la pseudo-inverse de A. On a AB = U W U g + U K tKW U g = U (I + K tK)W U g = U U g Donc ABA = (U U g U, U U g U K) = A Par ailleurs B(AB) = W Ug KW U g
t

(AB) = t(U U g ) = U U g = AB W U gU U g KW U g U U g =B

UUg =

Enn, notons quen vertu du lemme prcdent, U g U = (tU U )1tU U = Ir . Donc e e BA =


t

W Ug KW U g

(U, U K) =

W KW

WK KW

Comme S est symtrique, W lest galement, ce qui montre que t(BA) = BA et ach`ve e e e la preuve. La deuxi`me preuve de la proposition 2.1.2 se fait alors comme suit : Si A = 0, alors e A est sa propre pseudo-inverse. Sinon, soit r le rang de A. Il existe une matrice de permutation P telle que AP = (U, U K), avec U Mm,r de rang r et K Mr,nr . Dapr`s le lemme 2.1.4, la matrice H = AP a donc une pseudo-inverse H g . Montrons que e G = P H g est la pseudo-inverse de A. On a en eet A = HP 1 , AG = AP H g = HH g et GA = P H g HP 1 . Donc on a
t

AGA = HH g HP 1 = HP 1 = A (AG) = t(HH g ) = AG

GAG = P H g HH g = P H g = G t (GA) = t(P H g HP 1 ) = GA

la derni`re quation tant vraie parce que tP = P 1 . e e e Lalgorithme pour calculer la pseudo-inverse dune matrice A est le suivant : dans une premi`re tape, on cherche une matrice de permutation P telle que e e AP = (U, U K) avec U Mm,r de rang r et K Mr,nr . On dtermine alors la pseudo-inverse de AP e par les formules du lemme 2.1.4 et on revient a la pseudo-inverse de A en prmultipliant ` e par P . Lalgorithme est mis en uvre dans la section suivante. Notons que (AB)g est en gnral dirent de B g Ag , lun des exemples les plus simples e e e est probablement 1 A = (1 0) B= 1 Il nest pas dicile de vrier que (AB)g = 1 et B g Ag = 1/2. e Parmi les applications des pseudo-inverses gure une prsentation lgante de la solution e ee au probl`me dit des moindres carrs. Soient m, n 1, avec m n. On consid`re une e e e Version 15 janvier 2005

2.1. Pseudo-inverses

27

matrice A Mm,n et un vecteur colonne b R m . Le probl`me des moindres carrs est e e la dtermination dun vecteur x R n tel que e Ax b = min Ay b n
yR

(1.2)

o` u

dsigne la norme euclidienne. e

Proposition 2.1.5. Le vecteur x R n est solution de (1.2) si et seulement si tAAx = Ab. Le vecteur Ag b est solution de (1.2) et si A est de rang n, alors cest la seule solution. Preuve. Soit x R n . Pour t rel et w dans R n , considrons e e w (t) = A(x + tw) b
2

Ax b

(1.3) (1.4)

On a w (t) = t2 Aw
2

+ 2t(Ax b Aw)

Pour vrier que Ag b est solution de (1.2), il sut de calculer : e


t

En vertu de (1.3), x est solution de (1.2) si et seulement si w (t) 0 pour tout t et pour tout w et, par (1.4), ceci se ralise si et seulement si (Ax b Aw) = 0 pour tout e w, donc si et seulement si tA(Ax b) = 0. Ceci prouve lquivalence. e AAAg b = tAt(AAg )b = t(AAg A)b = tAb

Lunicit de la solution provient de ce que lquation tAAx = tAb a une solution unique e e si A est de rang n, puisqualors tAA est inversible.

2.1.3

Programme : pseudo-inverses

Commenons le calcul de la pseudo-inverse par le cas le plus simple, a savoir le cas o` c ` u la matrice A dordre (m, n) est de rang n. Il sut alors de calculer (tAA)1tA. Or, la matrice tAA est symtrique et dnie positive, puisque txtAAx = Ax 2 = 0 seulement e e si Ax = 0 et, comme A est de rang n, cela nest possible que si x = 0. On peut donc utiliser, pour inverser tAA, la mthode de Choleski expose au chapitre suivant. On e e obtient alors la procdure suivante : e
PROCEDURE PseudoInverseRangMaximal (m, n: integer; a: mat; VAR g: mat); La matrice a dordre (m, n) est suppose de rang n. Calcul de sa pseudo-inverse g par e la formule g = (taa)1ta. VAR ta, u, v: mat; BEGIN TransposerRect(m, n, a, ta); Calcul de ta. MatriceParMatriceRect(n, m, n, ta, a, u); u = taa. InverseDefPositiveSymetrique(n, u, v); v = u 1 = (taa)1 . MatriceParMatriceRect(n, n, m, v, ta, g); g = v ta.

Version 15 janvier 2005

28
END; { de "PseudoInverseRangMaximal" }

Chapitre 2. Manipulation de matrices

La procdure TransposerRect a t dcrite au chapitre 1. Dans une deuxi`me tape, e ee e e e on suppose la matrice A donne sous la forme (U, U K), o` U est dordre (m, r) et de e u rang r et o` K est dordre (r, n r). On utilise alors la formule du lemme 2.1.4, ce qui u donne la procdure que voici : e
PROCEDURE PseudoInverseDecomposee (m, r, n: integer; u, k: mat; VAR b: mat); Calcule la pseudo-inverse b dune matrice a = (u, uk), donne par la matrice u dordre e (m, r) de rang r et la matrice k dordre (r, n r). VAR tk, h, w, ligne1, ligne2: mat; BEGIN TransposerRect(r, n - r, k, tk); tk = tk. MatriceParMatriceRect(r, n - r, r, k, tk, h); h = k tk. MatricePlusMatrice(r, h, MatriceUnite, h); h := I + h. InverseDefPositiveSymetrique(r, h, w); w = (I + tkk)1 . PseudoInverseRangMaximal(m, r, u, b); b = ug . MatriceParMatriceRect(r, r, m, w, b, ligne1); ligne1 = wb. MatriceParMatriceRect(n - r, r, m, tk, ligne1, ligne2); ComposerLignes(r, n - r, m, ligne1, ligne2, b) END; { de "PseudoInverseDecomposee" }

Cette procdure utilise une procdure qui compose deux matrices en une seule. La voici, e e avec quelques autres procdures utiles : e
PROCEDURE CopierColonne (m, k: integer; VAR a: mat; j: integer; VAR b: mat); VAR i: integer; BEGIN FOR i := 1 TO m DO b[i, j] := a[i, k] END; { de "CopierColonne" } PROCEDURE CopierLigne (m, k: integer; VAR a: mat; j: integer; VAR b: mat); VAR i: integer; BEGIN FOR i := 1 TO m DO b[j, i] := a[k, i] END; { de "CopierLigne" } PROCEDURE ComposerColonnes (m, r, s: integer; VAR u, v, u v: mat); u est une matrice dordre (m, r), v est dordre (m, s), u v = (u, v) est dordre (m, r + s). VAR j: integer; BEGIN u v := u; FOR j := 1 TO s DO CopierColonne(m, j, v, r + j, u v); END; { de "ComposerColonnes" } PROCEDURE ComposerLignes (r, s, n: integer; VAR u, v, u v: mat);

Version 15 janvier 2005

2.1. Pseudo-inverses
` u est une matrice dordre (r, n), v est dordre (s, n), u v = u est dordre (r + s, n). v VAR i: integer; BEGIN u v := u; FOR i := 1 TO s DO CopierLigne(n, i, v, r + i, u v); END; { de "ComposerLignes" }

29

La dcomposition dune matrice A en un produit (U, U K) est toujours possible a une e ` permutation des lignes pr`s. Pour cela, on prend pour U une famille libre des colonnes de e A et pour matrice K la matrice qui donne explicitement les coecients de dpendance e linaire des autres colonnes de A dans la famille U . Or, ces coecients sobtiennent e comme solution dquations linaires et on voit, apr`s un peu de rexion, que ces e e e e coecients sont fournis, dans la mthode de Gauss, chaque fois que lon rencontre une e colonne qui na pas de pivot non nul. Il sut donc dadapter lg`rement la procdure e e e BaseDesColonnes du chapitre 1.
PROCEDURE DecompositionSurBaseDesColonnes (m, n: integer; a: mat; VAR rang: integer; VAR u, h: mat; VAR p: vecE); Calcule deux matrices u et h telles que a = (u, uh). Le rang de u est rang et p est le vecteur des indices des colonnes de u et de h. VAR k, q: integer; independant: boolean; FUNCTION ChercherPivot (k: integer): integer; PROCEDURE EchangerFinlignes (i, j: integer); PROCEDURE EchangerColonnes (i, j: integer); PROCEDURE PivoterGauss (k: integer); BEGIN { de "DecompositionSurBaseDesColonnes" } u := a; FOR k := 1 TO n DO p[k] := k; k := 1; rang := n; WHILE k <= rang DO BEGIN q := ChercherPivot(k); independant := q <> m + 1; IF independant THEN BEGIN IF q > k THEN EchangerFinlignes(k, q); PivoterGauss(k); k := k + 1; END ELSE BEGIN EchangerColonnes(k, rang); EchangerE(p[k], p[rang]); rang := rang - 1 END; END; { de k } Les mmes que e dans : BaseDesColonnes.

Initialisation de p.

Rpercussion sur p. e

Version 15 janvier 2005

30

Chapitre 2. Manipulation de matrices


FOR k := 1 TO rang DO CopierColonne(m, p[k], u, k, u); h := MatriceNulle; FOR k := 1 TO n - rang DO CopierColonne(rang, rang + k, a, k, h); END; { de "DecompositionSurBaseDesColonnes" }

Apr`s ces prliminaires, la procdure de calcul de la pseudo-inverse scrit : e e e e


PROCEDURE PseudoInverse (m, n: integer; a: mat; VAR g: mat); Calcule la pseudo-inverse g de la matrice a dordre (m, n). VAR u, h, bg: mat; p: vecE; i, r: integer; BEGIN DecompositionSurBaseDesColonnes(m, n, a, r, u, h, p); PseudoInverseDecomposee(m, r, n, u, h, bg); FOR i := 1 TO n DO CopierLigne(m, i, bg, p[i], g); END; { de "PseudoInverse" }

Voici quelques rsultats numriques. Considrons dabord le cas dune matrice de rang e e e maximal. On obtient :
Matrice de 1.000 1.000 1.000 1.000 1.000 dpart e 1.000 1.000 2.000 4.000 3.000 9.000 4.000 16.000 5.000 25.000 -0.600 0.529 -0.071 0.600 -0.657 0.143

Sa pseudo-inverse 1.800 0.000 -0.800 -1.057 0.329 0.857 0.143 -0.071 -0.143

Si la matrice est donne sous forme dcompose : e e e


Entrer la matrice U Ligne 1 : 1 2 Ligne 2 : 0 0 Ligne 3 : 0 0 Ligne 4 : 2 1 Entrer la matrice K Ligne 1 : 0 0 1 Ligne 2 : 0 0 0 Matrice de dpart e 1.000 2.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000

Version 15 janvier 2005

2.1. Pseudo-inverses
0.000 2.000 Matrice W 0.500 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.333 -0.333 0.000 0.000 0.333 0.000 0.000 0.000 0.000 0.000 2.000

31

La pseudo-inverse -0.167 0.000 0.667 0.000 0.000 0.000 0.000 0.000 -0.167 0.000

Enn, une matrice a dcomposer dabord : ` e


Entrer la matrice A Ligne 1 : 0 1 2 1 0 Ligne 2 : 0 0 0 0 0 Ligne 3 : 0 0 0 0 0 Ligne 4 : 0 2 1 2 0 Matrice U 1.000 0.000 0.000 2.000 Matrice H 1.000 0.000 2.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000

Vecteur permutation 4 3 2 5 1 Matrice W 0.500 0.000 0.000 1.000

Pseudo-inverse avant permutation -0.167 0.000 0.000 0.333 0.667 0.000 0.000 -0.333 -0.167 0.000 0.000 0.333 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 La pseudo-inverse de A 0.000 0.000 0.000 -0.167 0.000 0.000 0.667 0.000 0.000 -0.167 0.000 0.000 0.000 0.000 0.000 0.000 0.333 -0.333 0.333 0.000

Version 15 janvier 2005

32

Chapitre 2. Manipulation de matrices

2.2
2.2.1

Matrices trigonalisables
Enonc : matrices trigonalisables e

Les matrices considres dans ce probl`me sont lments de Kn , lanneau des matrices e e e ee carres dordre n a coecients complexes. Une matrice A = (ai,j ) de Kn est triangulaire e ` si ai,j = 0 pour i < j. On dit quun ensemble E de matrices de Kn est trigonalisable sil existe une matrice inversible P telle que, pour toute matrice A de E, la matrice P 1 AP soit triangulaire. Le but de ce probl`me est de donner un crit`re pour quun ensemble e e de matrices soit trigonalisable. 1. Ecrire une procdure qui prend en argument deux matrices carres A et B et calcule e e AB BA. (On pourra se limiter aux matrices dordre infrieur ou gal a 3.) e e ` Exemple numrique. On prend e i 0 2 2i 0 2i A1 = 0 1 0 A2 = i 1 1 i i 0 2+i 1 0 i 1 1 i 1 i A3 = 0 1 i 1 0 1 1+i

Acher A1 A2 A2 A1 et A1 A3 A3 A1 .

2. Ecrire une procdure qui prend en argument un ensemble ni E = {A1 , . . . , Ak } e de matrices de Kn et qui ache la dimension de lespace vectoriel (E) engendr par e E, ainsi quune base de (E) extraite de E. (On pourra supposer que k 15 et que les matrices sont dordre infrieur ou gal a 3.) e e ` Exemple numrique : E = {A1 , A2 , A3 }. e Un ensemble F de matrices de Kn est appel une alg`bre de Lie si F est un espace e e vectoriel et si, quels que soient A, B F , on a AB BA F Soit E un ensemble de matrices et soit Ek la suite despaces vectoriels dnie ainsi : e E0 est lespace vectoriel engendr par E et Ek+1 est lespace vectoriel engendr par e e lensemble Ek {AB BA | A, B Ek }. 3. a) Dmontrer quil existe un plus petit entier s tel que Es = Es+1 . Dmontrer e e que Es est la plus petite alg`bre de Lie contenant E (on dit que cest lalg`bre de Lie e e engendre par E). e b) Ecrire une procdure qui calcule la dimension de lalg`bre de Lie engendre par un e e e ensemble ni de matrices. Exemple numrique : E = {A1 , A2 , A3 }. e On dit quune suite croissante de sous-espaces vectoriels de F {0} = F0 F1 . . . Fp = F Version 15 janvier 2005 ()

2.2. Matrices trigonalisables

33

est une suite de rsolution de longueur p de F , si, pour 1 i p et quels que soient e A, B Fi , on a AB BA Fi1 Une alg`bre de Lie F est dite rsoluble (resp. rsoluble de classe p) si elle poss`de une e e e e suite de rsolution (resp. de longueur p). e 4. a) Si F est une alg`bre de Lie, on note L(F ) lalg`bre de Lie engendre par les e e e matrices AB BA telles que A, B F . On pose ensuite L0 (F ) = F et, pour tout k 0, Lk+1 (F ) = L(Lk (F )). Dmontrer que F est une alg`bre de Lie rsoluble de classe p si e e e et seulement si Lp (F ) = {0}. b) Ecrire une procdure qui prend en argument un ensemble ni E = {A1 , . . . , Ak } de e matrices de Kn et qui teste si lalg`bre de Lie engendre par E est rsoluble. e e e Exemple numrique : E = {A1 , A2 , A3 }. e 5. Dmontrer que toute alg`bre de Lie trigonalisable est rsoluble. e e e Rciproquement, on se propose de dmontrer, par rcurrence sur p, que toute alg`bre e e e e de Lie rsoluble de classe p est trigonalisable. e 6. a) Dmontrer quun ensemble de matrices de Kn qui commutent deux a deux ont e ` un vecteur propre (non nul) commun. b) En dduire que toute alg`bre de Lie de classe 1 est trigonalisable. e e On suppose p > 1 et on suppose (hypoth`se de rcurrence) que toute alg`bre de Lie e e e rsoluble de classe infrieure a p est trigonalisable. e e ` 7. Soit F une alg`bre de Lie rsoluble de classe p. Dmontrer quil existe un vecteur e e e propre x0 (non nul) commun a tous les lments de Fp1 . Pour toute matrice A de Fp1 , ` ee on dsignera par (A) C la valeur propre de A telle que e Ax0 = (A)x0 Soit B Fp . On pose, pour tout k > 0, xk = B k x0 et on note VB lespace vectoriel engendr par la famille (xk )k0 . e 8. a) Dmontrer que VB est lespace vectoriel engendr par la famille (xk )0kr , e e o` r est le plus grand entier tel que les vecteurs x0 , x1 , . . . , xr soient linairement u e indpendants. e b) Dmontrer que VB est stable par B (i.e. pour tout x VB , Bx VB ). e 9. a) Dmontrer que pour toute matrice A de Fp1 , il existe des nombres complexes e i,j (A) (0 j < i r) tels que, pour 0 i r, Axi = (A)xi + i,i1 (A)xi1 + + i,0 (A)x0 b) Dmontrer que pour toute matrice A de Fp1 , (AB BA) = 0. e c) En dduire que, pour tout x VB , Ax = (A)x. e Version 15 janvier 2005 ()

34 10. On pose

Chapitre 2. Manipulation de matrices

V = {x C n | pour tout A Fp1 , Ax = (A)x} a) Dmontrer que V est un espace vectoriel non nul stable par toute matrice de F p . e b) Dmontrer que, quels que soient x V et B, C Fp , on a e BCx = CBx c) En dduire que les matrices de Fp ont au moins un vecteur propre commun dans V . e 11. Conclure la dmonstration. e

2.2.2

Solution : matrices trigonalisables

Soit Kn lanneau des matrices carres dordre n a coecients complexes. On notera C n e ` lespace vectoriel des vecteurs colonnes dordre n a coecients complexes. Une matrice ` A = (ai,j ) de Kn est triangulaire si ai,j = 0 pour i < j. On dit quun ensemble E de matrices de Kn est trigonalisable sil existe une matrice inversible P telle que, pour toute matrice A de E, la matrice P 1 AP soit triangulaire. On se propose de donner une condition ncessaire et susante pour quun ensemble de matrices soit trigonalisable. e Nous prsentons dabord une condition susante simple. e Proposition 2.2.1. Un ensemble de matrices de Kn qui commutent deux a deux est ` trigonalisable. Preuve. La dmonstration repose sur le lemme suivant. e Lemme 2.2.2. Un ensemble dendomorphismes de C n qui commutent deux a deux ont ` un vecteur propre (non nul) commun. Preuve. On raisonne par rcurrence sur n, le rsultat tant trivial pour n = 1. Soit F un e e e ensemble dendomorphismes commutant deux a deux. Choisissons, parmi les lments ` ee de F , un endomorphisme u possdant un sous-espace propre V de dimension minimale, e et soit la valeur propre associe a V . On a donc V = {x C n | ux = x}. Maintenant, e ` si v F et si x V , on a, puisque u et v commutent, uvx = vux = v(x) = (vx) et donc vx V . Par consquent, V est stable par F . Si dim(V ) = n, le choix de V impose e que V soit un sous-espace propre de tous les endomorphismes de F . Si dim(V ) < n, on applique lhypoth`se de rcurrence a la restriction a V des endomorphismes de F pour e e ` ` conclure. Revenons a la preuve de la proposition 2.2.1. On raisonne encore par rcurrence sur n, ` e le cas n = 1 tant trivial. Soit F lensemble des endomorphismes reprsents par les e e e matrices commutant deux a deux de lnonc. Dapr`s le lemme 2.2.2, on peut trouver ` e e e Version 15 janvier 2005

2.2. Matrices trigonalisables

35

un vecteur propre commun aux lments de F . Soit x ce vecteur et considrons une base ee e contenant x comme premier vecteur. Dans cette base chaque endomorphisme u a une matrice de la forme (u) 0 A (u) A(u) avec (u) C. Maintenant, les matrices A(u), pour u F , commutent deux a deux. ` Par rcurrence, il existe donc une matrice inversible P telle que toutes les matrices e P 1 A(u)P soient triangulaires, pour tout u F . Par consquent, les matrices e 1 0 0 P 1 sont triangulaires, pour tout u F . Pour noncer le thor`me principal, qui donne une caractrisation dun ensemble de mae e e e trices trigonalisables, nous aurons besoin de quelques dnitions auxiliaires. Le crochet e de Lie de deux matrices A et B de Kn est la matrice [A, B] = AB BA On appelle alg`bre de Lie tout sous-espace vectoriel de Kn ferm par crochet de Lie. e e Lalg`bre de Lie engendre par une partie E de Kn est la plus petite alg`bre de Lie e e e contenant E. Lexistence dune telle alg`bre est facile a tablir : dune part, Kn est e ` e une alg`bre de Lie contenant E, et dautre part, lintersection dune famille quelconque e dalg`bres de Lie contenant E est encore une alg`bre de Lie contenant E. Pour obtenir e e un procd constructif, on calcule la suite des Ek ainsi dnie : E0 est lespace vectoriel e e e engendr par E et Ek+1 est lespace vectoriel engendr par lensemble e e Ek {[A, B] | A, B Ek } Par construction, toute alg`bre de Lie contenant E doit contenir tous les Ek . Puisque e dim(Ek ) dim(Ek+1 ) n, il existe un plus petit entier s tel que Es = Es+1 . Lespace vectoriel Es est alors ferm par crochet de Lie et cest donc une alg`bre de Lie. Par e e consquent, Es est la plus petite alg`bre de Lie contenant E. e e On dit quune suite croissante de sous-espaces vectoriels de F {0} = F0 F1 . . . Fp = F est une suite de rsolution de longueur p de F si, pour 1 i p, on a e A, B Fi [A, B] Fi1 Une alg`bre de Lie est dite rsoluble (de classe p) si elle admet une suite de rsolution e e e (de longueur p). On notera que ces notions sont invariantes par automorphisme. Autrement dit, si est un automorphisme de Kn , une alg`bre de Lie F est rsoluble (resp. e e rsoluble de classe p) si et seulement si (F ) est rsoluble (resp. rsoluble de classe p). e e e La proposition qui suit donne un premier exemple dalg`bre de Lie rsoluble. e e Version 15 janvier 2005 (u) 0 A (u) A(u) 1 0 0 P

36

Chapitre 2. Manipulation de matrices

Proposition 2.2.3. Toute alg`bre de Lie forme de matrices triangulaires de Kn est e e rsoluble. e Preuve. Soit F une alg`bre de Lie forme de matrices triangulaires de Kn . Posons, pour e e 1 k n, Tk = {A = (ai,j ) F | ai,j = 0 pour i < j + k} Les matrices de Tk sont donc de la forme 0 a k+1,1 a k+2,1 . . . an,1 0 . . . 0 . . . 0 0 ak+2,2 . . . an,2 .. . .. . 0 . . . 0 0 0 . . . 0 . .. . . . 0 0 0 . .. . . . 0 . . . 0 0 0 . . . 0 0

an,nk

On montre facilement que, si A, B Tk1 , alors [A, B] Tk . Il en rsulte que la suite e Fk = F Tk est une suite de rsolution de F . e Il nest pas immdiat, au vu de la dnition dune alg`bre de Lie rsoluble, de trouver e e e e un algorithme pour tester si une alg`bre de Lie est rsoluble. Il existe heureusement une e e dnition quivalente beaucoup plus constructive. Si F est une alg`bre de Lie, on note e e e L(F ) lalg`bre de Lie engendre par les matrices [A, B] telles que A, B F . On pose e e ensuite L0 (F ) = F et, pour tout k 0, Lk+1 (F ) = L(Lk (F )). Proposition 2.2.4. Une alg`bre de Lie F est rsoluble de classe p si et seulement si e e Lp (F ) = {0}. Preuve. Si F est une alg`bre de Lie, on a L(F ) F et donc e Lp (F ) Lp1 (F ) . . . L(F ) F Donc si Lp (F ) = {0}, F est rsoluble de classe p. Rciproquement, soit F une alg`bre e e e de Lie rsoluble de classe p et soit e {0} = F0 F1 . . . Fp = F une suite de rsolution de F . On obtient par rcurrence Li (F ) Fpi et donc en e e particulier Lp (F ) = {0}. Nous en arrivons au thor`me principal. e e Thor`me 2.2.5. Un ensemble E de matrices de Kn est trigonalisable si et seulement e e si lalg`bre de Lie engendre par E est rsoluble. e e e Version 15 janvier 2005

2.2. Matrices trigonalisables

37

Preuve. Soit E un ensemble trigonalisable de matrices et soit P une matrice telle que lensemble E P = {P 1 AP | A E} soit form de matrices triangulaires. Or e lapplication A P 1 AP est un automorphisme de lalg`bre de Lie Kn . Comme e lalg`bre de Lie engendre par E P est rsoluble dapr`s la proposition 2.2.3, lalg`bre de e e e e e Lie engendre par E lest galement. e e Rciproquement, supposons que lalg`bre de Lie F engendre par E soit rsoluble de e e e e classe p et soit {0} = F0 F1 . . . Fp = F une suite de rsolution de F . On dmontre par rcurrence sur p que F est trigonae e e lisable (ce qui entra a fortiori que E est trigonalisable). Si p = 1, les matrices de F ne commutent deux a deux et on est ramen a la proposition 2.2.1. ` e` Supposons a prsent p > 1. La dmonstration repose sur plusieurs lemmes intermdiaires ` e e e (qui reprennent a peu pr`s les questions de lnonc). ` e e e Lemme 2.2.6. Toutes les matrices de Fp1 ont un vecteur propre x0 commun. Preuve. Comme Fp1 est une alg`bre de Lie rsoluble de classe p 1, lhypoth`se de e e e rcurrence montre que Fp1 est trigonalisable. Soit P une matrice inversible telle que, e pour tout A Fp1 , P 1 AP soit triangulaire. Notons (A) le coecient de P 1 AP situ en premi`re ligne et premi`re colonne et posons e1 = t (1, 0, . . . , 0) et x0 = P e1 . e e e On a alors, pour toute matrice A Fp1 , Ax0 = AP e1 = P (P 1 AP )e1 = P (A)e1 = (A)P e1 = (A)x0 ce qui dmontre le lemme. e Soit B Fp . On pose, pour tout k > 0, xk = B k x0 et on note VB lespace vectoriel engendr par la famille (xk )k0 . Soit r le plus grand entier tel que les vecteurs x0 , x1 , . . . , xr e soient linairement indpendants. e e Lemme 2.2.7. Lespace vectoriel VB est engendr par la famille (xi )0ir . e Preuve. Soit E le sous-espace vectoriel de VB engendr par les vecteurs x0 , x1 , . . . , xr . e On a xr+1 E par dnition de r. Par rcurrence, supposons que xr+n soit lment e e ee de E. Alors xr+n+1 est combinaison linaire des vecteurs Bx0 = x1 , Bx1 = x2 , . . . , e Bxr = xr+1 . Donc xr+n+1 E, ce qui conclut la rcurrence. e Ltape suivante consiste a dmontrer que la restriction a VB de toutes les matrices de e ` e ` Fp1 est une homothtie. e Proposition 2.2.8. Pour tout A Fp1 et pour tout x VB , on a Ax = (A)x. Preuve. La dmonstration se fait en deux tapes. On commence par dmontrer que e e e chaque matrice de Fp1 dnit un endomorphisme de VB dont la matrice dans la base e (xi )0ir est triangulaire. Version 15 janvier 2005

38

Chapitre 2. Manipulation de matrices

Lemme 2.2.9. Pour tout A Fp1 et pour tout entier i, il existe des nombres complexes i,j (A) (0 j < i) tels que Axi = (A)xi + i,i1 (A)xi1 + + i,0 (A)x0 Preuve. Le rsultat est vrai si i = 0, puisque Ax0 = (A)x0 par hypoth`se. Supposons e e le rsultat acquis jusquau rang k et valuons Axk+1 . Il vient e e Axk+1 = ABxk = BAxk + [A, B]xk et comme [A, B] Fp1 , on obtient Axk+1 = B((A)xk + k,k1 (A)xk1 + + k,0 (A)x0 ) = (A)xk+1 + (k,k1 (A) + ([A, B]))xk1 + do` le rsultat, en posant u e k+1,i (A) = k,i1 (A) + k,i ([A, B]) k,0 (A) si i = 0 si i = 0 (2.1) +([A, B])xk + k,k1 ([A, B])xk1 + + k,0 ([A, B])x0 +(k,0 (A) + k,1 ([A, B]))x1 + k,0 ([A, B])x0

Le lemme qui suit permet de simplier considrablement ces formules. e Lemme 2.2.10. Pour tout A Fp1 , on a ([A, B]) = 0. Preuve. Le lemme 2.2.9 montre que VB est stable par toutes les matrices de Fp1 et VB est galement stable par B par construction. Compltons la base {x0 , x1 , . . . , xr } de e e VB en une base {x0 , x1 , . . . , xn1 } de C n et posons X = (x0 , . . . , xn1 ). Quel que soit A Fp1 , la matrice X 1 AX peut scrire sous la forme e A A 0 A (A) 1,0 (A) avec A = . . . r,0 (A) 0 (A) . . . r,1 (A) ... ... .. . 0 0 0 . . . (A)

B De mme, la matrice X 1 BX scrit sous la forme B B0 o` B est une matrice carre e e u e de taille r + 1. Rappelons que la trace dune matrice M (note tr(M )) est la somme de e ses coecients diagonaux. On a ici tr(A ) = (r + 1)(A) et, puisque [A, B] Fp1 quel que soit A Fp1 , tr([A , B ]) = (r + 1)([A, B]). Or, si A et B sont deux matrices quelconques de Kn , on a tr([A, B]) = 0 (car tr([A, B]) = tr(AB) tr(BA) = 0). Par consquent, ([A, B]) = 0. e

Version 15 janvier 2005

2.2. Matrices trigonalisables

39

Preuve de la proposition 2.2.8. Il sut, en utilisant les formules 2.1, de prouver par rcurrence sur k que, pour tout A Fp1 , k,i (A) = 0 pour 0 i < k et, pour cela, de e dmontrer que 1,0 (A) = 0. Or e [A, B]x0 = ([A, B])x0 = 1,0 (A)x0 = 0 par le lemme 2.2.10, donc 1,0 = 0 puisque x0 = 0. Le lemme 2.2.9 donne alors simplement Axk = (A)(xk ) pour 0 k r et donc Ax = (A)x pour tout x VB . Posons V = {x C n | Ax = (A)x pour tout A Fp1 }

Proposition 2.2.11. Lensemble V est un espace vectoriel non nul stable par toutes les matrices de Fp . Preuve. Par construction, V est un espace vectoriel contenant x0 . Dautre part, si x V et B Fp , on a, dapr`s le lemme 2.2.10, e A(Bx) = BAx + [A, B]x = B(A)x + ([A, B])x = B(A)x = (A)(Bx) Fin de la preuve du thor`me 2.2.5. Soient maintenant B et C deux matrices quelconques e e de Fp . Dapr`s la proposition 2.2.11, V est stable par B et C. Soit v1 , . . . , vk une base e de V , que lon compl`te en une base v1 , . . . , vn de C n et posons P = (v1 , . . . , vn ). On a e alors B 0 C 0 P 1 BP = et P 1 CP = B B C C o` B et C sont des matrices carres de taille k. Puisque [B, C] Fp1 , on a, par u e dnition de V , [B, C]v = ([B, C])v pour tout v V . Il en rsulte en particulier que e e [B , C ] = ([B, C])Ik , ce qui montre que ([B, C]) = 0 (cf. largument sur les traces utilis plus haut). Il en rsulte que B et C commutent. Dapr`s la proposition 2.2.2, e e e les matrices de Fp ont un vecteur propre commun. La n de la dmonstration est identique a celle de la proposition 2.2.1 : on raisonne e ` par rcurrence sur n, le cas n = 1 tant trivial. Soit x un vecteur propre commun aux e e matrices de Fp et soit X une matrice inversible ayant x comme premi`re colonne. Les e matrices X 1 AX (pour A Fp ) sont donc de la forme (A) A 0 A ce qui montre que Bx V .

avec (A) C et A Kn1 . Maintenant lensemble des matrices A , pour A F , est une alg`bre de Lie de Kn1 rsoluble de classe p, qui, par hypoth`se de rcurrence, e e e e est trigonalisable. Il existe donc une matrice inversible P Kn1 telle que toutes les matrices P 1 A P soient triangulaires. Il en rsulte que les matrices e 1 0 0 P 1 (A) A 0 A 1 0 0 P

sont triangulaires et donc F est trigonalisable. Version 15 janvier 2005

40

Chapitre 2. Manipulation de matrices

2.2.3

Une biblioth`que de manipulation des matrices complexes e

Comme nous manipulons ici des matrices a coecients complexes, nous allons dcrire ` e une biblioth`que de manipulation de matrices a coecients complexes qui sinspire bien e ` entendu de la biblioth`que de manipulation des matrices relles. Elle fait appel a la e e ` biblioth`que de manipulation des complexes et a la biblioth`que gnrale pour les inie ` e e e tialisations. Nous suivons le mme ordre de prsentation que pour la biblioth`que relative aux mae e e trices relles, sans reprendre le dtail des commentaires. Commenons par les types : e e c
CONST OrdreMax = 10; Lordre maximal des matrices et vecteurs. TYPE vecC = ARRAY[1..OrdreMax] OF complexe; matC = ARRAY[1..OrdreMax] OF vecC; VAR MatriceUnite: matC; Matrice prdnie. e e MatriceNulle: matC; Matrice prdnie. e e

Voici les en-ttes des procdures ou fonctions qui constituent la biblioth`que : e e e


PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE InitMatricesC; EntrerMatriceC (n: integer; VAR a: matC; titre: texte); EntrerMatriceCRect (m, n: integer; VAR a: matC; titre: texte); EntrerVecteurC (n: integer; VAR a: vecC; titre: texte); EntrerMatriceHermitienne (n: integer; VAR a: matC; titre: texte); EcrireMatriceC (n: integer; a: matC; titre: texte); EcrireMatriceCRect (m, n: integer; a: matC; titre: texte); EcrireVecteurC (n: integer; a: vecC; titre: texte); EcrireMatriceHermitienne (n: integer; a: matC; titre: texte);

PROCEDURE MatriceCPlusMatriceC (n: integer; a, b: matC; VAR ab: matC); PROCEDURE MatriceCMoinsMatriceC (n: integer; a, b: matC; VAR ab: matC); PROCEDURE MatriceCParMatriceC (n: integer; a, b: matC; VAR ab: matC); PROCEDURE MatriceCParMatriceCRect (m, n, p: integer; a, b: matC; VAR ab: matC); PROCEDURE MatriceCParVecteurC (n: integer; a: matC; x: vecC; VAR ax: vecC); PROCEDURE MatriceCRectParVecteurC (m, n: integer; a: matC; x: vecC; VAR ax: vecC); PROCEDURE VecteurCParMatriceC (n: integer; x: vecC; a: matC; VAR xa: vecC); PROCEDURE VecteurCPlusVecteurC (n: integer; a, b: vecC; VAR ab: vecC); PROCEDURE VecteurCMoinsVecteurC (n: integer; a, b: vecC; VAR ab: vecC); PROCEDURE VecteurCParScalaire (n: integer; x: vecC; s: real; VAR sx: vecC); PROCEDURE TransposerC (n: integer; a: matC; VAR ta: matC); PROCEDURE TransposerCRect (m, n: integer; a: matC; VAR ta: matC);

Version 15 janvier 2005

2.2. Matrices trigonalisables


PROCEDURE Adjointe (n: integer; a: matC; VAR aEtoile: matC); La matrice aEtoile contient la matrice adjointe de la matrice a dordre n. FUNCTION NormeC (n: integer; VAR a: vecC): real; FUNCTION NormeCInfinie (n: integer; VAR a: vecC): real; PROCEDURE SystemeCTriangulaireSuperieur (n: integer; a: matC; b: vecC; VAR x: vecC); PROCEDURE SystemeCParGauss (n: integer; a: matC; b: vecC; VAR x: vecC; VAR inversible: boolean); PROCEDURE InverseCParGauss (n: integer; a: matC; VAR Inva: matC; VAR inversible: boolean); PROCEDURE SystemeCParJordan (n: integer; a: matC; b: vecC; VAR x: vecC; VAR inversible: boolean); PROCEDURE InverseCParJordan (n: integer; a: matC; VAR Inva: matC; VAR inversible: boolean);

41

Voici maintenant le dtail de quelques-unes de ces procdures. Elles ne di`rent que fort e e e peu des procdures utilises pour les matrices relles, cest pourquoi nous nen prsentons e e e e quun chantillon. e
PROCEDURE InitMatricesC; Dnition de la matrice unit et de la matrice nulle. e e VAR i, j: integer; BEGIN InitComplexes; FOR i := 1 TO OrdreMax DO Dnition de la matrice nulle. e FOR j := 1 TO OrdreMax DO MatriceNulle[i, j] := ComplexeZero; MatriceUnite := MatriceNulle; Dnition de la matrice unit. e e FOR i := 1 TO OrdreMax DO MatriceUnite[i, i] := ComplexeUn; END; { de "InitMatricesC" } PROCEDURE EntrerMatriceC (n: integer; VAR a: matC; titre: texte); Achage du titre, puis lecture de la matrice a carre dordre n. e VAR i, j: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO BEGIN write(Ligne , i : 1, : ); FOR j := 1 TO n DO EntrerComplexe(a[i, j], ); END; readln END; { de "EntrerMatriceC" } PROCEDURE EntrerMatriceCHermitienne (n: integer; VAR a: matC;

Version 15 janvier 2005

42

Chapitre 2. Manipulation de matrices


titre: texte); Achage du titre, puis lecture de la partie triangulaire infrieure de la matrice hermie tienne a dordre n. La partie suprieure de a est complte a la lecture. e e e ` VAR i, j: integer; r: real; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO BEGIN write(Ligne , i : 1, : ); FOR j := 1 TO i - 1 DO BEGIN write(Coef., i : 2, j : 2, : ); EntrerComplexe(a[i, j], ); Conjugue(a[i, j], a[j, i]) END; write(Coef., i : 2, i : 2, (reel) : ); read(r); ReelEnComplexe(a[i, i], r); END; readln END; { de "EntrerMatriceCHermitienne" } PROCEDURE EcrireMatriceC (n: integer; a: matC; titre: texte); Achage du titre, puis de la matrice a dordre n. VAR i, j: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO n DO BEGIN FOR j := 1 TO n DO FormaterComplexe(a[i, j], AligneADroite); writeln END END; { de "EcrireMatriceC" } PROCEDURE MatriceCPlusMatriceC (n: integer; a, b: matC; VAR ab: matC); Somme des deux matrices a et b dordre n. Rsultat dans la matrice ab. e VAR i, j: integer; BEGIN FOR i := 1 TO n DO FOR j := 1 TO n DO ComplexePlusComplexe(a[i, j], b[i, j], ab[i, j]); END; {de "MatriceCPlusMatriceC" } PROCEDURE MatriceCParMatriceC (n: integer; a, b: matC; VAR ab: matC); Produit des deux matrices a et b dordre n. Rsultat dans la matrice ab. e

Version 15 janvier 2005

2.2. Matrices trigonalisables


VAR i, j, k: integer; somme, produit: complexe; BEGIN FOR i := 1 TO n DO FOR j := 1 TO n DO BEGIN somme := ComplexeZero; FOR k := 1 TO n DO BEGIN ComplexeParComplexe(a[i, k], b[k, j], produit); ComplexePlusComplexe(somme, produit, somme); END; ab[i, j] := somme END END; {de "MatriceCParMatriceC" } PROCEDURE Adjointe (n: integer; a: matC; VAR aEtoile: matC); La matrice aEtoile contient la matrice adjointe de la matrice a dordre n. VAR i, j: integer; BEGIN FOR i := 1 TO n DO FOR j := 1 TO n DO Conjugue(a[j, i], aEtoile[i, j]) END; { de "Adjointe" }

43

PROCEDURE SystemeCTriangulaireSuperieur (n: integer; a: matC; b: vecC; VAR x: vecC); Solution dun syst`me triangulaire dquations ax = b o` a est une matrice triangulaire e e u suprieure. e VAR k, j: integer; s, p: complexe; BEGIN FOR k := n DOWNTO 1 DO BEGIN s := b[k]; FOR j := k + 1 TO n DO BEGIN ComplexeParComplexe(a[k, j], x[j], p); ComplexeMoinsComplexe(s, p, s); END; ComplexeSurComplexe(s, a[k, k], x[k]) END; END; { de "SystemeCTriangulaireSuperieur" } PROCEDURE SystemeCParGauss (n: integer; a: matC; b: vecC; VAR x: vecC; VAR inversible: boolean); Solution dun syst`me dquations linaires a coecients complexes par la mthode de e e e ` e Gauss. VAR k, q: integer; FUNCTION PivotMax (k: integer): integer;

Version 15 janvier 2005

44

Chapitre 2. Manipulation de matrices


Cherche le pivot maximal entre k et n. VAR i, p: integer; BEGIN p := k; FOR i := k + 1 TO n DO IF Module(a[i, k]) > Module(a[p, k]) THEN p := i; PivotMax := p END; { de "PivotMax" } PROCEDURE EchangerFinLignes (i, j: integer); VAR m: integer; BEGIN FOR m := i TO n DO echangerC(a[i, m], a[j, m]); echangerC(b[i], b[j]); END; { de "EchangerFinLignes" } PROCEDURE PivoterGauss (k: integer); VAR i, j: integer; g, z: complexe; BEGIN FOR i := k + 1 TO n DO BEGIN ComplexeSurComplexe(a[i, k], a[k, k], g); ComplexeParComplexe(g, b[k], z); ComplexeMoinsComplexe(b[i], z, b[i]); FOR j := k + 1 TO n DO BEGIN ComplexeParComplexe(g, a[k, j], z); ComplexeMoinsComplexe(a[i, j], z, a[i, j]); END; END; END; { de "PivoterGauss" } BEGIN { de "SystemeCParGauss" } k := 1; inversible := true; WHILE (k <= n) AND inversible DO BEGIN q := PivotMax(k); inversible := NOT EstCNul(a[q, k]); IF inversible THEN BEGIN IF q > k THEN EchangerFinLignes(k, q); PivoterGauss(k); END; k := k + 1 END; { du while sur k } IF inversible THEN

g := a ik /akk b i := bi gbk a ij := aij gakj

Triangulation.

Rsolution. e

Version 15 janvier 2005

2.2. Matrices trigonalisables


SystemeCTriangulaireSuperieur(n, a, b, x); END; { de "SystemeCParGauss" }

45

2.2.4

Programme : matrices trigonalisables

Le calcul du crochet de Lie ne pose pas de probl`me particulier. e


PROCEDURE CrochetDeLie (n: integer; A, B: matC; VAR ALieB: matC); ALieB = AB BA VAR AB, BA: matC; BEGIN MatriceCParMatriceC(n, A, B, AB); MatriceCParMatriceC(n, B, A, BA); MatriceCMoinsMatriceC(n, AB, BA, ALieB); END; { de "CrochetDeLie" }

Avec les exemples de la question 1, on 1 2i A1 A2 = i 1 + i

trouve 0 2 2i 1 1 i 0 1 + 2i A1 A2 A 2 A1 = 0

En ralit, on a A1 = P 1 B1 P , A2 = P 1 B2 P et A3 = P 1 B3 P avec e e 1 1 i 1 i 1 0 1 i P 1 = i 1 P = 0 0 i 1 i 1+i i 1 1+i i 2 1 0 0 B1 = 1 1 0 0 0 1 1 0 0 B2 = 0 1 0 1 0 1 1 0 0 B3 = 0 1 0 0 1 1

1 + i 0 2i 0 1 + i A1 A3 A 3 A1 = i 1 0 1i

ce qui explique les rsultats. e

Pour calculer la dimension de lespace vectoriel (E) engendr par un ensemble ni E = e {A1 , . . . , Ak } de matrices de Kn et pour dterminer une base de (E), on transforme e chaque matrice Ai en un vecteur vi de dimension n2 , puis on calcule le rang de la matrice rectangulaire V de taille k n2 forme par les vi . On extrait simultanment e e de V une famille maximale de lignes linairement indpendantes, qui fournit donc une e e base de E. La premi`re opration est ralise par la procdure suivante : e e e e e Version 15 janvier 2005

46

Chapitre 2. Manipulation de matrices


PROCEDURE Linearise (n: integer; A: matC; VAR vA: vecC); Transforme une matrice carre dordre n en un vecteur a n2 composantes. e ` VAR i, j: integer; BEGIN FOR i := 0 TO n - 1 DO FOR j := 1 TO n DO vA[i * n + j] := A[i + 1, j]; END; { de "Linearise" }

Pour le calcul du rang et dun syst`me maximal de lignes indpendantes, le principe est e e assez simple. On examine les lignes de la matrice dans leur ordre naturel. Si la ligne k est nulle, on lui substitue la derni`re ligne courante et on diminue le nombre de lignes e dune unit. Sinon on utilise la mthode du pivot : on slectionne le premier lment e e e ee ak,q non nul de la ligne k. On permute ventuellement les colonnes k et q si q > k, puis e on pivote. On fait donc subir a la matrice un certain nombre de permutations des lignes et des ` colonnes et des oprations de pivot sur les lignes. Comme on veut galement obtenir un e e ensemble maximal de lignes indpendantes, on mmorise les permutations des lignes. En e e revanche, il est inutile de mmoriser les permutations des colonnes et les oprations de e e pivot, puisque deux matrices dduites lune de lautre par permutation des colonnes ou e par opration de pivot sur les lignes ont les mmes ensembles de lignes indpendantes. e e e
PROCEDURE BaseDesLignes (m, n: integer; B: matC; VAR rang: integer; VAR LignesIndependantes: vecE); Calcule le rang dune matrice B dordre (m, n) et en extrait un ensemble maximal de lignes indpendantes. e VAR inversible: boolean; A: matC; Obtenue par permutation des lignes de B. Lignes: vecE; Dcrit la permutation des lignes dnissant A. e e v: vecC; i, j, k, pivot, q: integer; FUNCTION ChercherPivot (k: integer): integer; Cherche un pivot non nul entre k et n ; si le rsultat est n + 1, il ny a pas de pivot non e nul. VAR i: integer; BEGIN i := k; WHILE (i <= n) AND EstCNul(a[k, i]) DO { "and" squentiel } e i := i + 1; ChercherPivot := i END; { de "ChercherPivot" } PROCEDURE EchangerFinColonnes (i, j: integer); VAR m: integer;

Version 15 janvier 2005

2.2. Matrices trigonalisables


BEGIN FOR m := i TO n DO EchangerC(a[m, i], a[m, j]); END; { de "EchangerColonnes" }

47

La procdure qui permet lchange de deux lignes est presque identique a la prcdente, e e ` e e mais on prend la prcaution de mmoriser la permutation. e e
PROCEDURE EchangerLignes (i, j: integer); VAR m: integer; BEGIN FOR m := i TO n DO EchangerC(a[i, m], a[j, m]); EchangerE(Lignes[i], Lignes[j]); END; { de "EchangerLignes" } PROCEDURE PivoterGauss (k: integer); VAR i, j: integer; g, z: complexe; BEGIN FOR j := k + 1 TO n DO BEGIN ComplexeSurComplexe(a[k, j], a[k, k], g); FOR i := k + 1 TO n DO BEGIN ComplexeParComplexe(g, a[i, k], z); ComplexeMoinsComplexe(a[i, j], z, a[i, j]); END END END; { de "PivoterGauss" } BEGIN { de "BaseDesLignes" } A := B; rang := 0; FOR i := 1 TO m DO Lignes[i] := i; Au dpart, les lignes sont dans lordre. e inversible := true; k := 1; WHILE (k <= m) DO BEGIN q := ChercherPivot(k); inversible := q <> n + 1; IF inversible THEN BEGIN IF q > k THEN EchangerFinColonnes(k, q); PivoterGauss(k); rang := rang + 1; LignesIndependantes[rang] := Lignes[k]; k := k + 1 END ELSE BEGIN

Version 15 janvier 2005

48
EchangerLignes(k, m); m := m - 1 END END; { sur k } END; { de "BaseDesLignes" }

Chapitre 2. Manipulation de matrices

Enn, la procdure ci-dessous donne la dimension de lespace vectoriel engendr par un e e ensemble ni de matrices.
FUNCTION dim (CardE, n: integer; E: EnsembleDeMatrices; VAR BaseE: EnsembleDeMatrices): integer; Calcule la dimension de lespace vectoriel engendr par un ensemble E de CardE mae trices et extrait de E une base de cet espace vectoriel. VAR i, r: integer; L: vecE; ELinearise: matC; BEGIN FOR i := 1 TO CardE DO Linearise(n, E[i], ELinearise[i]); BaseDesLignes(CardE, n * n, ELinearise, r, L); FOR i := 1 TO r DO BaseE[i] := E[L[i]]; dim := r; END; {de "dim"}

Pour calculer la dimension de lalg`bre de Lie engendre par un ensemble ni de matrices e e E, on calcule, pour chaque entier k, une base Bk de lespace vectoriel Ek dni dans e lnonc. Pour obtenir B0 , il sut dextraire une base de E. Pour passer de Bk a Bk+1 , e e ` on calcule lensemble de tous les crochets de Lie des matrices de Bk , puis on extrait une base de cet ensemble. Lorsque les dimensions de Bk et de Bk+1 sont gales, le calcul est e termin. e
PROCEDURE LesCrochetsDeLie (VAR CardB: integer; n: integer; VAR B: EnsembleDeMatrices); VAR i, j, k: integer; BEGIN k := CardB; FOR i := 1 TO CardB DO FOR j := i + 1 TO CardB DO BEGIN k := k + 1; On ajoute tous les crochets de Lie. CrochetDeLie(n, B[i], B[j], B[k]) END; CardB := k END; { de "LesCrochetsDeLie" } PROCEDURE AlgebreDeLie (CardE, n: integer; E: EnsembleDeMatrices); Calcule la dimension de lalg`bre de Lie engendre par un ensemble E de CardE matrices e e dordre n.

Version 15 janvier 2005

2.2. Matrices trigonalisables


VAR i, CardB, dimE: integer; B: EnsembleDeMatrices; BEGIN CardB := dim(CardE, n, E, B); REPEAT dimE := CardB; LesCrochetsDeLie(CardB, n, B); CardB := dim(CardB, n, B, B); UNTIL dimE = CardB; Si le rang na pas augment, on a lalg`bre de Lie engendre par E. e e e writeln(Dimension de lalg`bre de Lie comme espace vectoriel = , e CardB : 1); writeln(Base de lalg`bre de Lie comme espace vectoriel : ); e FOR i := 1 TO CardB DO EcrireMatriceC(n, B[i], ); END; { de "AlgebreDeLie" }

49

Pour terminer, voici quelques exemples dexcution : e


Voici A1 : - i 0 i rang(A 1) = 3 Voici A2 : 2.0 - i - i - 1.0 rang(A 2) = 3 Voici A3 : 1.0 0 0 rang(A 3) = 3 Voici A1A2 : 1.0 - 2.0 i - i - 1.0 + i rang (A1A2) = 3 Voici [A1,A2] : 0 0 0 rang ([A1,A2]) = 0 Voici [A1,A3] : - 1.0 + i 0 2.0 i 0 0 0 0 0 0 0 1.0 0 - 2.0 - 2.0 i - 1.0 - i 1.0 + 2.0 i 1.0 - i 1.0 - i - 1.0 - 1.0 - i - 1.0 1.0 + i 0 1.0 0 - 2.0 i - 1.0 - i i 0 1.0 0 - 2.0 0 2.0 + i

Version 15 janvier 2005

50
i 1.0 rang(A 1A 3) = 1

Chapitre 2. Manipulation de matrices


0 0 1.0 + i 1.0 - i

Dimension de lespace engendr par E = 3 e Dimension de lalg`bre de Lie comme espace vectoriel = 4 e Base de lalg`bre de Lie comme espace vectoriel : e - i 0 i 2.0 - i - i - 1.0 1.0 0 0 - 1.0 + i i 1.0 0 1.0 0 0 1.0 0 1.0 - i 1.0 - i - 1.0 0 0 0 - 2.0 0 2.0 + i - 2.0 i - 1.0 - i i - 1.0 - i - 1.0 1.0 + i 2.0 i 1.0 + i 1.0 - i

Notes bibliographiques
Les pseudo-inverses sont frquemment dnies pour les matrices complexes, la transe e pose tant remplace par ladjointe. Parmi les monographies consacres aux pseudoe e e e inverses, citons : R. M. Pringle, A. A. Rayner, Generalized Inverse Matrices, London, Grin, 1971. Une prsentation br`ve est donne par : e e e J. Stoer, Numerische Mathematik 1, Berlin, Springer-Verlag, 1989.

Version 15 janvier 2005

51

Chapitre 3

Dcompositions e
Une dcomposition dune matrice carre A est un couple (B, C) de deux matrices carres e e e B et C telles que A = BC. Lorsque ces matrices ont une forme particuli`re, certaines e oprations, comme la rsolution de syst`mes linaires, sen trouvent simplies. Dans ce e e e e e chapitre, nous considrons trois dcompositions : la dcomposition LU , la dcomposition e e e e de Choleski et la dcomposition QR. On utilisera aussi ces dcompositions pour le calcul e e des valeurs propres.

3.1

Dcomposition LU e

Une dcomposition LU dune matrice carre A dordre n est un couple (L, U ) de matrices e e carres dordre n, avec L unitriangulaire infrieure, cest-`-dire ayant des 1 sur la e e a diagonale, et U triangulaire suprieure, telles que e A = LU Lintrt de disposer dune telle dcomposition est clair. La rsolution dun syst`me e e e e e dquations linaires e e Ax = b se ram`ne alors a la rsolution des deux syst`mes triangulaires e ` e e Ly = b Ux = y

ce qui est particuli`rement simple. De la mme mani`re, si A est inversible, linverse e e e A1 = U 1 L1 sobtient en inversant deux matrices triangulaires, ce qui est facile. En fait, une matrice quelconque nadmet pas ncessairement une dcomposition LU . e e Proposition 3.1.1. Une matrice inversible A admet une dcomposition LU si et e seulement si tous ses mineurs principaux sont inversibles; de plus, la dcomposition e LU est alors unique. Version 15 janvier 2005

52

Chapitre 3. Dcompositions e

Preuve. Supposons que A ait deux dcompositions A = LU = L U . Comme A est e inversible, L et L le sont. Alors L1 L = U U 1 . La matrice L1 L est triangulaire infrieure et U U 1 est triangulaire suprieure. Lgalit implique quelles sont toutes e e e e deux diagonales et la premi`re, donc aussi la deuxi`me, est en fait la matrice unit, e e e montrant que L = L et U = U . Ceci prouve lunicit, qui dailleurs dcoule aussi de la e e preuve dexistence qui suit. Lexistence se montre par rcurrence sur lordre n de A, le cas n = 1 tant vident. e e e Considrons alors la dcomposition par blocs e e A= A b b a

o` A est dordre n 1. Par rcurrence, A poss`de une dcomposition LU , soit (L , U ). u e e e Cherchons alors deux matrices dordre n L= L v 0 1 U= U 0 u r

avec LU = A. On obtient les quations e Lu=b vU = b vu + r = a

Les deux premi`res permettent de dterminer u et v de faon unique parce que L et U e e c sont inversibles et la troisi`me donne r de faon unique. Do` lexistence. e c u Rciproquement, si A = LU , alors U est inversible et en particulier le produit de ses e lments diagonaux est non nul. Soit 1 k n et soit A le mineur principal de A ee dordre k. Considrons la dcomposition par blocs e e L= L X 0 L U= U 0 Y U

o` L et U sont dordre k. Alors L U = A a un dterminant non nul. u e Il nest pas dicile de vrier que, si A poss`de deux dcompositions (L, U ) et (L , U ), e e e alors on a toujours U = U . En revanche, lgalit entre L et L ne peut tre assure; e e e e considrer par exemple le cas U = 0. e Toute matrice inversible A peut tre, par une permutation de ses lignes, transforme e e en une matrice dont les mineurs principaux sont inversibles. Toute matrice inversible poss`de donc, a une permutation de ses lignes pr`s, une dcomposition LU . La mthode e ` e e e appele mthode de Crout ou mthode de Gauss modernise est un algorithme pour e e e e obtenir cette dcomposition. Elle consiste en fait en une organisation judicieuse des e calculs faits lors de la mthode de Gauss. e Dans la mthode de Gauss, une opration de pivotage peut tre interprte comme la e e e ee multiplication a gauche par une matrice de Frobenius Gk qui, dans ce cas, est unitri` angulaire infrieure. Sil ny a pas dchange de lignes, une matrice A dordre n est e e transforme en e Gn1 G2 G1 A = U Version 15 janvier 2005

3.1. Dcomposition LU e

53

la matrice U est triangulaire suprieure et G = Gn1 G2 G1 est unitriangulaire e infrieure. On a donc e A = LU avec L = G1 . En dautres termes, la mthode de Gauss contient de faon cache une e c e mthode de dcomposition LU . e e Sil y a change de lignes dans la mthode de Gauss, on a en fait e e Gn1 Pn1 G2 P2 G1 P1 A = U o` les Pk sont des matrices de permutations. Or u Gn1 Pn1 G2 P2 G1 P1 = P Hn1 H2 H1 avec P = Pn1 P2 P1 et Hk = (Pk P1 )1 Gk Pk P1 1k<n

de sorte que la matrice H = P Hn1 H2 H1 P 1 est unitriangulaire infrieure et e HP A = U ; avec L = H 1 , on a A = LU Pour la ralisation, nous partons de lquation A = LU , avec A = (ai,j ), L = ( i,j ), e e U = (ui,j ). On suppose i,j = 0 pour j > i et i,i = 1 et de mme ui,j = 0 pour i > j. e On a alors, en identiant
min(i,k)

ai,k =
j=1

i,j uj,k

do` lon tire u


k1 i,k

= (ai,k

i,j uj,k )/uk,k

i>k ik

j=1 i1 i,j uj,k

ui,k = ai,k

j=1

Il y a plusieurs stratgies pour rsoudre ces quations : on peut procder ligne par e e e e ligne, colonne par colonne, en diagonale, etc. On peut galement remarquer que chaque e coecient ai,k nest utilis quune fois; on peut donc stocker, a la place de ai,k , le e ` coecient i,k , si i > k, et ui,k quand i k (les lments diagonaux de L nont pas ee besoin dtre conservs). e e Pour pouvoir liminer un pivot uk,k nul, on constate que les formules donnant uk,k et e les i,k sont, a la division pr`s, formellement les mmes. Ceci montre que tout i,k pour ` e e i > k peut jouer le rle de uk,k . On adopte donc la dmarche suivante : on calcule, pour o e Version 15 janvier 2005

54 chaque colonne k, dabord des lments ee ui,k = ai,k


i,k i,k i1 i,j uj,k j=1 k1 i,j uj,k j=1

Chapitre 3. Dcompositions e et ui,k par les formules ik i>k par le pivot. Voici une

= ai,k

puis lon cherche un pivot non nul et on fait la division des ralisation : e

i,k

PROCEDURE DecompositionLU (n: integer; VAR a: mat; VAR p: vecE; VAR inversible: boolean); Calcule, dans a, la dcomposition LU de a, a une permutation des lignes pr`s. Cette e ` e permutation est dans le vecteur p. Si a nest pas inversible, le boolen est mis a faux, e ` mais une partie de a peut tre dtruite. e e VAR k, q: integer; FUNCTION PivotMax (k: integer): integer; Cherche le pivot maximal entre k et n. VAR i, p: integer; BEGIN p := k; FOR i := k + 1 TO n DO IF abs(a[i, k]) > abs(a[p, k]) THEN p := i; PivotMax := p END; { de "PivotMax" } PROCEDURE EchangerLignes (i, j: integer); VAR m: integer; BEGIN FOR m := 1 TO n DO echanger(a[i, m], a[j, m]); END; { de "EchangerLignes" } PROCEDURE Decomposer (k: integer); VAR i, j: integer; somme: real; BEGIN FOR i := 1 TO n DO BEGIN somme := a[i, k]; FOR j := 1 TO min(i, k) - 1 DO somme := somme - a[i, j] * a[j, k]; a[i, k] := somme END

Version 15 janvier 2005

3.1. Dcomposition LU e
END; { de "Decomposer" } PROCEDURE Diviser (k: integer); VAR i: integer; BEGIN FOR i := k + 1 TO n DO a[i, k] := a[i, k] / a[k, k] END; { de "Diviser" } BEGIN { de "DecompositionLU" } FOR k := 1 TO n DO p[k] := k; k := 1; inversible := true; WHILE (k <= n) AND inversible DO BEGIN Decomposer(k); q := PivotMax(k); inversible := NOT EstNul(a[q, k]); IF inversible THEN BEGIN IF q > k THEN BEGIN EchangerLignes(k, q); echangerE(p[q], p[k]) END; Diviser(k) END; k := k + 1 END; { du while sur k } END; { de "DecompositionLU" }

55

Voici un exemple de dcomposition : e


Voici la matrice lue 4.000 2.000 1.000 2.000 5.000 3.000 1.000 1.000 1.000 2.000 1.000 4.000 Matrice L 1.000 0.500 0.500 0.250 Matrice U 4.000 0.000 0.000 0.000 0.000 1.000 0.000 0.125 2.000 4.000 0.000 0.000 0.000 0.000 1.000 0.125 1.000 2.500 3.500 0.000 0.000 5.000 1.000 1.000 0.000 0.000 0.000 1.000 0.000 5.000 1.000 0.250

Vecteur de permutation des lignes 1 2 4 3

Version 15 janvier 2005

56

Chapitre 3. Dcompositions e

Matrice LU 4.000 2.000 2.000 1.000

2.000 5.000 1.000 1.000

1.000 3.000 4.000 1.000

0.000 5.000 1.000 1.000

Les lignes 3 et 4 sont en eet permutes. Comme il est dj` dit plus haut, la dcompoe ea e sition LU facilite la rsolution dun syst`me linaire. Voici une ralisation : e e e e
PROCEDURE SystemeParCrout (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); Rsolution du syst`me dquations linaire Ax = b par la mthode de Crout. Si A est e e e e e inversible, x contient la solution, sinon le boolen est faux. e VAR p: vecE; PROCEDURE Permuter (b: vec; p: vecE; VAR bp: vec); VAR k: integer; BEGIN FOR k := 1 TO n DO bp[k] := b[p[k]]; END; { de "Permuter" } BEGIN DecompositionLU(n, a, p, inversible); IF inversible THEN BEGIN Permuter(b, p, b); SystemeUniTriangulaireInferieur(n, a, b, x); SystemeTriangulaireSuperieur(n, a, x, x); END END; { de "SystemeParCrout" }

La procdure SystemeTriangulaireSuperieur a dj` t prsente au chapitre 1; la e ea e e e e procdure SystemeUniTriangulaireInferieur ci-dessous tient en plus compte du fait e que les lments diagonaux valent 1 pour ne pas faire de division : ee
PROCEDURE SystemeUniTriangulaireInferieur (n: integer; a: mat; b: vec; VAR x: vec); Rsolution dun syst`me unitriangulaire infrieur. e e e VAR k, j: integer; s: real; BEGIN FOR k := 1 TO n DO BEGIN s := b[k]; FOR j := 1 TO k - 1 DO s := s - a[k, j] * x[j]; x[k] := s Pas de division : le coecient diagonal est 1. END; END; { de "SystemeUniTriangulaireInferieur" }

Version 15 janvier 2005

3.2. Dcomposition de Choleski e

57

3.2

Dcomposition de Choleski e

La dcomposition de Choleski ne sapplique qu` des matrices particuli`res, a savoir e a e ` des matrices symtriques dnies positives (resp. hermitiennes dnies positives). Elle e e e repose sur le rsultat de la proposition suivante. e Proposition 3.2.1. Soit A une matrice symtrique dnie positive dordre n. Il existe e e une matrice triangulaire infrieure L a coecients diagonaux strictement positifs et une e ` seule telle que A = L tL. Preuve. Par rcurrence sur n. Si n = la matrice est rduite a une entre positive e 1, e ` e et L a comme seul lment le nombre . Si n > 1, posons ee A= avec B = Ln1 tLn1 et Ln1 = (
i,j ), i,i

B t b

b a
i,j

> 0 et Ln1 t c

= 0 pour j > i, et soit

L= De L tL = A, on tire

Ln1 c = b qui a la solution unique c = L1 b, parce que les lments diagonaux de Ln1 sont ee n1 strictement positifs, donc Ln1 est inversible. Or A est dnie positive, donc dt(A) > 0. e e Comme dt(A) = dt(Ln1 )2 2 > 0 e e on a 2 > 0 et il y a une solution > 0 unique. De lquation A = L tL on tire, par identication, des formules qui permettent dobtenir e la matrice L. Ces formules sont
i1 2 i,i

= ai,i =

2 i,k k=1 j1 i,k k,j k=1

i,j

ai,j

i,i

i>j

Voici une ralisation : e


PROCEDURE Choleski (n: integer; a: mat; VAR l: mat); a est une matrice symtrique dnie positive. Calcul de tel que a = e e VAR i, j, k: integer; s: real; BEGIN
t

Version 15 janvier 2005

58

Chapitre 3. Dcompositions e
FOR i := 1 TO n DO BEGIN FOR j := 1 TO i - 1 DO BEGIN Calcul des lments non diagonaux. ee s := a[i, j]; FOR k := 1 TO j - 1 DO s := s - l[i, k] * l[j, k]; l[i, j] := s / l[j, j] END; s := a[i, i]; Calcul de llment diagonal. ee FOR k := 1 TO i - 1 DO s := s - sqr(l[i, k]); l[i, i] := sqrt(s) END { de la ligne i } END; { de "Choleski" }

Linverse dune matrice ainsi dcompose est particuli`rement facile a calculer, puisquil e e e ` sut de calculer linverse de la matrice triangulaire L, par exemple comme suit :
PROCEDURE InverseTriangulaireInferieure (n: integer; a: mat; VAR b: mat); a est une matrice triangulaire infrieure inversible. On calcule son inverse dans b, par e rsolution des syst`mes triangulaires. e e VAR i, j, k: integer; s: real; BEGIN b := MatriceNulle; FOR i := 1 TO n DO Elments diagonaux. e b[i, i] := 1 / a[i, i]; FOR i := 2 TO n DO Elments hors diagonaux. e FOR j := 1 TO i - 1 DO BEGIN s := 0; FOR k := j TO i - 1 DO s := s + a[i, k] * b[k, j]; b[i, j] := -s * b[i, i] END END; { de "InverseTriangulaireInferieure" }

Ensuite, on fait le produit de cette matrice par sa transpose. Ainsi on obtient la e procdure suivante : e
PROCEDURE InverseDefPositiveSymetrique (n: integer; a: mat; VAR ia: mat); Calcule linverse ia dune matrice symtrique dnie positive a. e e VAR k, tk, l: mat; BEGIN Choleski(n, a, l); a= t InverseTriangulaireInferieure(n, l, k); k = 1 Transposer(n, k, tk); MatriceParMatrice(n, tk, k, ia) a1 = ( t )1 = tkk END;{ de "InverseDefPositiveSymetrique" }

Version 15 janvier 2005

3.3. Dcomposition QR e

59

3.3

Dcomposition QR e

Toute matrice carre relle A est, comme nous le verrons, produit dune matrice orthogoe e nale Q par une matrice triangulaire suprieure R. Une telle factorisation est appele une e e dcomposition QR. Il existe plusieurs mthodes pour obtenir une telle dcomposition. e e e La plus connue est le procd dorthogonalisation de Gram-Schmidt. Nous exposons ici e e deux autres mthodes qui sont numriquement plus stables : la mthode de Givens et e e e la mthode de Householder. On verra, dans le chapitre suivant, comment les mmes e e procds permettent de mettre une matrice sous forme tridiagonale. e e

3.3.1

Enonc : dcomposition QR (mthode de Givens) e e e

Soit n 1 un entier. Les matrices considres sont relles, carres dordre n. Pour p, q e e e e dans {1, . . . , n}, p = q, on note G(q, p) = (gi,j ) toute matrice de rotation de la forme G(q, p) = 1 .. . c s 0 .. s . c .. . 0

avec c2 + s2 = 1, qui ne di`re de la matrice unit que par les lments dindice (p, p), e e ee (p, q), (q, p), (q, q). Plus prcisment, e e gi,i = 1 i = p et i = q gi,j = 0 i = j, (i, j) = (p, q) et (i, j) = (q, p) gp,p = gq,q = c gp,q = gq,p = s 1. Etant donns une matrice A et p < q, montrer quil existe c et s tels que llment e ee bq,p de la matrice B = (bi,j ) = G(q, p)A soit nul. 2. On dnit une suite de matrices B (q,p) = (bi,j ) pour 1 p q n par e B (1,1) = A B (q,p) = G(q, p)B (q1,p) B (p,p) = B (n,p1)
(q,p) (q,p)

(1 p < q n) (2 p n)

o` G(q, p) est construit de mani`re telle que bq,p = 0. On pose R = B (n,n1) . Montrer u e que R est une matrice triangulaire et quelle scrit sous la forme R = U A o` U est une e u matrice orthogonale. Version 15 janvier 2005

60

Chapitre 3. Dcompositions e

3. Ecrire un programme qui prend en argument une matrice A et qui calcule U et R comme dnis ci-dessus. Ajouter une procdure qui calcule le dterminant de A. e e e 4. Complter ce programme pour quensuite, il lise un vecteur b et donne la solution e du syst`me Ax = b, la matrice A tant suppose inversible. e e e Exemple numrique : e 4 1 0 0 0 5 1 4 1 0 0 6 A = 0 1 4 1 0 b = 6 0 0 1 4 1 6 0 0 0 1 4 5 5. On appelle dcomposition QR dune matrice A un couple form dune matrice e e orthogonale Q et dune matrice triangulaire suprieure R telles que A = QR. Montrer e que si A est inversible, alors la dcomposition QR de A est unique si les signes des e lments diagonaux de R sont xs. ee e

3.3.2

Solution : dcomposition QR (mthode de Givens) e e

La mthode de Givens de calcul dune dcomposition QR dune matrice A consiste a e e ` prmultiplier A par une suite de matrices de rotation qui annulent successivement les e coecients en dessous de la diagonale de A. La matrice obtenue est donc triangulaire suprieure et le produit des matrices de rotation est linverse de la matrice orthogonale e cherche. e Soit donc A une matrice carre. Pour p, q dans {1, . . . , n}, p = q, on note G(q, p) = (g i,j ) e toute matrice de rotation dnie par e gi,i = 1 i = p et i = q gi,j = 0 i = j, (i, j) = (p, q) et (i, j) = (q, p) gp,p = gq,q = c gp,q = gq,p = s avec c2 + s2 = 1. Soit p < q. Pour que llment ee bq,p = sap,p + caq,p de la matrice B = (bi,j ) = G(q, p)A soit nul, il sut de dnir (c, s) par e c=1 c = ap,p /r s=0 s = aq,p /r si a2 + a2 = 0 p,p q,p si a2 + a2 = r2 = 0 p,p q,p
(q,p)

On dnit une suite de matrices B (q,p) = (bi,j ) pour 1 p q n par e B (1,1) = A B (q,p) = G(q, p)B (q1,p) B (p,p) = B (n,p1) Version 15 janvier 2005 (1 p < q n) (2 p n)

3.3. Dcomposition QR e o` G(q, p) est construit de mani`re telle que bq,p = 0. u e Lemme 3.3.1. On a bi,j et p < i q).
(q,p) (q,p)

61

= 0 pour tout i > j tels que (j < p et 1 i n) ou (j = p

Preuve. Soient p, q avec 1 p < q n. La matrice B (q,p) ne di`re de B (q1,p) que par e les lments des lignes dindice p et q et on a, pour j = 1, . . . , n : ee bp,j bq,j
(q,p) (q,p)

= gp,p bp,j = gq,p bp,j


(q,p)

(q1,p)

+ gp,q bq,j + gq,q bq,j

(q1,p)

(q1,p)

(q1,p)

En raisonnant par rcurrence, on a bi,j e p < i < q. Mais par construction,


(q,p) bq,p

= 0 si bi,j

(q1,p)

= 0 et si j < p, ou si j = p et

= 0, do` le lemme. u

Corollaire 3.3.2. La matrice R = B (n,n1) est triangulaire suprieure. e Proposition 3.3.3. Toute matrice carre A admet une dcomposition A = QR, o` e e u Q est une matrice orthogonale et R est une matrice triangulaire suprieure. e Preuve. On a, avec les notations prcdentes, e e R = G(n, n 1)G(n, n 2)G(n 1, n 2) G(n, 1)G(n 1, 1) G(2, 1)A Notons U le produit des matrices de rotation. Alors U est orthogonale et A = tU R. Proposition 3.3.4. Soit A une matrice inversible. Alors la dcomposition QR de A e est unique si les signes des lments diagonaux de R sont xs. ee e Preuve. Supposons que A admette deux dcompositions : e A = QR = Q R Comme A est inversible, R et R le sont et on a donc Q1 Q = RR 1 . La matrice Q1 Q est orthogonale et triangulaire suprieure, donc cest une matrice diagonale. De plus, e les lments diagonaux de Q1 Q sont de valeur absolue gale a 1. Posons R = (ri,j ) et ee e ` R = (ri,j ). Alors ri,i /ri,i = 1. Par hypoth`se, les signes des lments diagonaux de e ee R et de R sont les mmes, donc les quotients valent 1. Il en rsulte que Q1 Q est la e e matrice identit, donc que RR 1 lest galement, et R = R . e e

3.3.3

Programme : dcomposition QR (mthode de Givens) e e

La dtermination des coecients des matrices de rotation G(q, p) se traduit par la e procdure que voici : e Version 15 janvier 2005

62

Chapitre 3. Dcompositions e
PROCEDURE CoefficientsGivens (p, q: integer; VAR c, s: real; VAR a: mat); Calcul des rels c et s tels que b(q, p) = 0. e VAR norme: real; BEGIN norme := sqrt(sqr(a[p, p]) + sqr(a[q, p])); IF EstNul(norme) THEN BEGIN c := 1; s := 0 END ELSE BEGIN c := a[p, p] / norme; s := a[q, p] / norme END END; { de "CoefficientsGivens" }

On peut construire les matrices G(q, p) explicitement puis faire le produit des matrices. Mais comme cette matrice ne modie que peu de coecients, il est plus conomique de e faire ces quelques oprations directement. On a alors : e
PROCEDURE Premultiplier (n, p, q: integer; c, s: real; VAR a: mat); Prmultiplication de la matrice a par la matrice de rotation G(q, p). e VAR j: integer; v, w: real; BEGIN FOR j := 1 TO n DO BEGIN v := a[p, j]; w := a[q, j]; a[p, j] := c * v + s * w; a[q, j] := -s * v + c * w; END END; { de "Premultiplier" }

La mthode de Givens consiste a itrer cette opration pour les couples (p, q), avec e ` e e 1 p < q n. La matrice obtenue, si lon part de A, est la matrice R. Si lon fait le produit des matrices de transformation orthogonales, on obtient une matrice U telle que R = U A et la matrice cherche Q est gale a U 1 = tU . Les deux procdures suivantes e e ` e ralisent ces calculs. e
PROCEDURE IterationGivens (n: integer; VAR a, u: mat); On annule successivement les coecients dindice (p, q), pour 1 p < q n. Le produit des matrices de rotation est linverse de la matrice orthogonale cherche. e VAR p, q: integer; c, s: real; BEGIN FOR p := 1 TO n - 1 DO FOR q := p + 1 TO n DO BEGIN CoefficientsGivens(p, q, c, s, a);

Version 15 janvier 2005

3.3. Dcomposition QR e
Premultiplier(n, p, q, c, s, u); Premultiplier(n, p, q, c, s, a); END END; { de "IterationGivens" } PROCEDURE DecompositionQRparGivens (n: integer; a: mat; VAR q, r: mat); Dcomposition QR de la matrice a par la mthode de Givens. e e BEGIN r := a; q := MatriceUnite; Le couple de matrices (A, I) est transform e IterationGivens(n, r, q); en un couple (R, Q), puis Q est transpose e Transposer(n, q, q) pour donner la matrice cherche. e END; {de "DecompositionQRparGivens" }

63

Voici un exemple dexcution. Les impressions intermdiaires montrent comment la mae e trice de dpart est progressivement transforme en matrice triangulaire suprieure. e e e
Voici la matrice a 4.000 2.000 1.000 2.000 5.000 3.000 1.000 1.000 1.000 2.000 1.000 4.000 Matrice a 4.472 0.000 1.000 2.000 Matrice a 4.583 0.000 0.000 2.000 Matrice a 5.000 0.000 0.000 -0.000 Matrice a 5.000 0.000 0.000 -0.000 Matrice a 5.000 0.000 0.000 -0.000 0.000 5.000 1.000 1.000

pour p = 1, q = 2 4.025 2.236 2.236 3.578 2.236 4.472 1.000 1.000 1.000 1.000 4.000 1.000 pour p = 1, q = 3 4.146 2.400 2.400 3.578 2.236 4.472 0.098 0.488 0.488 1.000 4.000 1.000 pour p = 1, q = 4 4.200 3.800 2.600 3.578 2.236 4.472 0.098 0.488 0.488 -0.742 2.706 -0.044 pour p = 2, q = 3 4.200 3.800 2.600 3.579 2.249 4.484 -0.000 0.427 0.366 -0.742 2.706 -0.044 pour p = 2, q = 4 4.200 3.800 2.600 3.655 1.652 4.399 -0.000 0.427 0.366 -0.000 3.106 0.867

Version 15 janvier 2005

64

Chapitre 3. Dcompositions e

Matrice a pour p = 3, q = 5.000 4.200 3.800 0.000 3.655 1.652 -0.000 -0.000 3.135 -0.000 0.000 -0.000 Dcomposition QR de a : e Voici la matrice q 0.800 -0.372 -0.455 0.400 0.908 -0.007 0.200 0.044 0.053 0.400 -0.186 0.889 Voici la matrice r 5.000 4.200 3.800 0.000 3.655 1.652 -0.000 -0.000 3.135 -0.000 0.000 -0.000 Vrification: produit q*r e 4.000 2.000 1.000 2.000 5.000 3.000 1.000 1.000 1.000 2.000 1.000 4.000

4 2.600 4.399 0.909 -0.244

0.122 0.122 -0.977 0.122 2.600 4.399 0.909 -0.244 0.000 5.000 1.000 1.000

Voici un deuxi`me exemple : e


Voici la matrice 4.000 1.000 1.000 4.000 0.000 1.000 0.000 0.000 0.000 0.000 Dcomposition QR e Voici la matrice 0.970 -0.234 0.243 0.935 0.000 0.265 0.000 0.000 0.000 0.000 Voici la matrice 4.123 1.940 0.000 3.773 0.000 0.000 0.000 -0.000 0.000 0.000 a 0.000 1.000 4.000 1.000 0.000 de a q 0.062 -0.248 0.929 0.268 0.000 r 0.243 1.996 3.736 0.000 -0.000 0.000 0.000 1.000 4.000 1.000 0.000 0.000 0.000 1.000 4.000

-0.017 0.066 -0.249 0.928 0.268 0.000 0.265 2.000 3.732 -0.000

0.005 -0.018 0.069 -0.258 0.963 0.000 0.000 0.268 2.000 3.596

Comme A = QR et que Q est orthogonale, on a dt(A) = dt(R) et en particulier A e e est inversible si et seulement si R lest. De plus, le syst`me dquations Ax = b quivaut e e e Version 15 janvier 2005

3.3. Dcomposition QR e aux syst`mes e Qy = b Rx = y

65

Le premier se rsout immdiatement parce que y = tQb et le deuxi`me est un syst`me e e e e triangulaire. Do` : u
PROCEDURE SystemeParQR (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); Calcul de la solution du syst`me linaire Ax = b par la dcomposition A = QR. Si R est e e e inversible, on rsout dabord le syst`me Qy = b par y = tQb, puis le syst`me triangulaire e e e Rx = y. VAR i: integer; q, r: mat; y: vec; BEGIN DecompositionQR(n, a, q, r); inversible := true; i := 1; WHILE (i <= n) AND inversible DO BEGIN inversible := NOT EstNul(r[i, i]); i := i + 1 END; IF inversible THEN BEGIN VecteurParMatrice(n, b, q, y); SystemeTriangulaireSuperieur(n, r, y, x); END END; { de "SystemeParQR" }

3.3.4

Dcomposition QR (mthode de Householder) e e

Nous prsentons maintenant une autre mthode de calcul dune dcomposition QR. e e e On pourra aussi consulter lnonc correspondant de mise sous forme tridiagonale. Les e e matrices considres sont relles, carres dordre n. On note I la matrice unit dordre n. e e e e e Lemme 3.3.5. Soit w R n un vecteur colonne de norme euclidienne 1 et soit P = I 2w tw. Alors tP = P 1 = P . En eet, on a tP = I 2t(w tw) = P et P 2 = (I 2w tw)(I 2w tw) car tw w = w = 1. Pour k {1, . . . , n} et pour x R n , on note v = v(k, x) R n le vecteur dni par e vi = 0 xk + signe(xk ) xi si 1 i < k si i = k si k < i n Version 15 janvier 2005 = I 4w tw + 4w tww tw = I

66 o` = u

Chapitre 3. Dcompositions e x2 + + x2 et signe(s) = 1, 0, 1 selon que s > 0, s = 0, s < 0. On dnit e n k


2

P = P (k, x) = I v tv

avec = 2/ v

si v = 0, = 2 sinon. Posons y = P (k, x)x.


2

Lemme 3.3.6. On a v Preuve. On a


t

= 2tvx et y = x v.
n

vx = (xk + signe(xk ))xk +


i=k+1 n

x2 = signe(xk )xk + 2 i

et v
2

= (xk + signe(xk ))2 +


i=k+1

x2 = 22 + 2signe(xk )xk i

do` la premi`re galit. Par ailleurs, si v = 0, u e e e v 2 tvx = v v tvx = v 2 donc y = x v tvx = x v. En dautres termes, xi si 1 i < k signe(xk ) si i = k 0 si k < i n et en particulier les coecients de y dindices plus grands que k sont nuls. Notons A(j) la j-i`me colonne de la matrice A. e yi = Proposition 3.3.7. Soit A une matrice dordre n, soit A0 = A et posons Ph = P (h, Ah1 )
(h)

Ah = Ph Ah1

h = 1, . . . , n 1

Alors Pn1 P1 A = An1 ; de plus, la matrice An1 est triangulaire suprieure et la e matrice Pn1 P1 est orthogonale. On a donc A = QR avec Q = (Pn1 P1 ) et R = An1 .
t

Preuve. Dapr`s ce qui prc`de, si lon prend pour x la j-i`me colonne A(j) de A, alors e e e e la j-i`me colonne de P (k, A(j) )A a ses coecients nuls dans les lignes dindices plus e grands que k. De plus, on a, avec v = v(k, A(j) ), P (k, A(j) )A = A v tp avec p = tAv (3.1)

ce qui montre que les colonnes dindices infrieurs a k de A ne sont pas modies par la e ` e prmultiplication par P . La proposition en rsulte. e e Pour la ralisation de cette mthode de dcomposition, il convient dabord de calculer e e e le vecteur v(k, A(j) ), ce qui se fait par la procdure que voici : e Version 15 janvier 2005

3.3. Dcomposition QR e
PROCEDURE VecteurHouseholder (n: integer; VAR a: mat; k, j: integer; VAR v: vec); Calcule le vecteur v(k, a(j) ), o` a(j) est la j-i`me colonne de a. u e VAR i: integer; BEGIN FOR i := 1 TO k - 1 DO v[i] := 0; FOR i := k TO n DO v[i] := a[i, j]; v[k] := v[k] + signe(v[k]) * norme(n, v); END; { de "VecteurHouseholder" }

67

Lapplication de la formule (3.1) conduit a la procdure que voici, qui calcule dans Q le ` e produit de P par Q :
PROCEDURE TransformationHouseholder (n, h: integer; VAR q, a: mat); VAR i, j: integer; beta, normeV2: real; v, z, p: vec; BEGIN { de "TransformationHouseholder" } VecteurHouseholder(n, a, h, h, v); normeV2 := ProduitScalaire(n, v, v); IF EstNul(normeV2) THEN beta := 2 ELSE beta := 2 / normeV2; VecteurParMatrice(n, v, a, p); VecteurParScalaire(n, p, beta, p); p = vA VecteurParMatrice(n, v, q, z); VecteurParScalaire(n, z, beta, z); z = vQ FOR i := 1 TO n DO FOR j := 1 TO n DO BEGIN a[i, j] := a[i, j] - v[i] * p[j]; q[i, j] := q[i, j] - v[i] * z[j]; END END; { de "TransformationHouseholder" }

La dcomposition QR de A sobtient enn par : e


PROCEDURE DecompositionQRparHouseholder (n: integer; a: mat; VAR q, r: mat); VAR h: integer; BEGIN q := MatriceUnite; r := a; FOR h := 1 TO n - 1 DO TransformationHouseholder(n, h, q, r); Transposer(n, q, q) END; { de "DecompositionQRparHouseholder" }

Version 15 janvier 2005

68

Chapitre 3. Dcompositions e

Voici un exemple dexcution, avec des impressions intermdiaires : e e


Voici la matrice lue 4.000 2.000 1.000 2.000 5.000 3.000 1.000 1.000 1.000 2.000 1.000 4.000 0.000 5.000 1.000 1.000

Matrice apr`s transformation de la colonne 1 e -5.000 -4.200 -3.800 -2.600 0.000 3.622 1.933 4.422 0.000 0.311 0.467 0.711 0.000 -0.378 2.933 0.422 Matrice apr`s transformation de la colonne 2 e -5.000 -4.200 -3.800 -2.600 0.000 -3.655 -1.652 -4.399 0.000 0.000 0.313 0.334 0.000 0.000 3.119 0.880 Matrice apr`s transformation de la colonne 3 e -5.000 -4.200 -3.800 -2.600 0.000 -3.655 -1.652 -4.399 0.000 0.000 -3.135 -0.909 0.000 0.000 -0.000 -0.244 Matrice r -5.000 -4.200 0.000 -3.655 0.000 0.000 0.000 0.000 Matrice q -0.800 0.372 -0.400 -0.908 -0.200 -0.044 -0.400 0.186 -3.800 -1.652 -3.135 -0.000 0.455 0.007 -0.053 -0.889 -2.600 -4.399 -0.909 -0.244 0.122 0.122 -0.977 0.122

On pourra comparer la dcomposition a celle obtenue par la mthode de Givens : les e ` e matrices R nont pas les mmes diagonales. e

Notes bibliographiques
Les dcompositions prsentes ici sont des plus classiques. Il en existe bien dautres, e e e en particulier la singular value decomposition qui est dune grande utilit. On pourra e consulter : G. H. Golub, C. F. van Loan, Matrix computations, Baltimore, John Hopkins University Press, 1985.

Version 15 janvier 2005

69

Chapitre 4

Matrices tridiagonales
Une matrice carre A = (ai,j ) est tridiagonale si ai,j = 0 pour |ij| > 1. Les procdures e e des chapitres prcdents prennent des formes particuli`res pour les matrices tridiagonales e e e et elles peuvent surtout tre ralises de mani`re beaucoup plus ecace. Les matrices e e e e tridiagonales se rencontrent dans le calcul des valeurs et vecteurs propres de matrices. Dans ce cas, une premi`re tape consiste a mettre la matrice donne sous forme tridiage e ` e onale. Les matrices tridiagonales interviennent aussi dans le calcul des splines cubiques et surtout dans la discrtisation dquations aux drives partielles. e e e e

4.1
4.1.1

Oprations sur les matrices tridiagonales e


Syst`me tridiagonal dquations e e
a1 c2 0 A= . . . 0 b1 a2 .. . 0 b2 .. . cn2 ... 0 .. . an2 cn1 0 bn2 an1 cn 0 . . .

Une matrice tridiagonale

est dtermine par trois vecteurs a, b et c qui contiennent respectivement la diagonale, e e la sur-diagonale et la sous-diagonale de A. Le syst`me dquations linaires e e e Ax = d scrit e a 1 x1 + b 1 x2 = d1 ci xi1 + ai xi + bi xi+1 = di cn xn1 + an xn = dn

0 bn1 an

i = 2, . . . , n 1 Version 15 janvier 2005

70 Par limination, on le met sous la forme e a 1 x1 + b 1 x2 = d 1 ai xi + bi xi+1 = di a n xn = d n avec a1 = a 1 ai = ai ci bi1 /ai1

Chapitre 4. Matrices tridiagonales

i = 2, . . . , n 1

d1 = d 1 di = di ci di1 /ai1

i = 2, . . . , n

Le syst`me obtenu est triangulaire et se rsout donc simplement. La seule dicult e e e provient dun coecient ai nul. Ceci est d a un mineur principal ayant un dterminant u` e nul. Dans ce cas, le syst`me nest pas rsoluble de cette mani`re, et il faut donc revenir e e e a une mthode plus coteuse et employer par exemple la mthode de Gauss gnrale. ` e u e e e En eet, un pivotage perturbe le caract`re tridiagonal du syst`me. e e Voici une ralisation de lalgorithme : e

PROCEDURE SystemeTridiagonal (n: integer; a, b, c, d: vec; VAR x: vec; VAR soluble: boolean); a est la diagonale, b la sur-diagonale, c la sous-diagonale et d le second membre. On rsout le syst`me sans pivotage ; ce nest possible que si les mineurs principaux sont e e inversibles. Le boolen indique succ`s ou chec. e e e VAR i: integer; BEGIN soluble := NOT EstNul(a[1]); i := 2; WHILE (i <= n) AND soluble DO BEGIN a[i] := a[i] - c[i] / a[i - 1] * b[i - 1]; d[i] := d[i] - c[i] / a[i - 1] * d[i - 1]; soluble := NOT EstNul(a[i]); i := i + 1 END; IF soluble THEN BEGIN x[n] := d[n] / a[n]; FOR i := n - 1 DOWNTO 1 DO x[i] := (d[i] - b[i] * x[i + 1]) / a[i] END END; { de "SystemeTridiagonal" }

Version 15 janvier 2005

4.1. Oprations sur les matrices tridiagonales e

71

4.1.2

Dcomposition LU e
dailleurs la dcomposition QR) peut tre ralise sur e e e e b1 a2 .. . 0 b2 .. . cn2 ... 0 .. . an2 cn1 0 bn2 an1 cn 0 . . .

Il est intressant de constater que les matrices L et U sont aussi tridiagonales; plus e prcisment, posons e e 1 0 u1 v 1 0 u2 v 2 2 1 .. .. 1 3 A = LU = . . .. .. . . vn1 0 1 0 un n Lidentication donne v = b et u1 = a1 , et
i = ci /ui1 ui = ai i bi1

La dcomposition LU (comme e une matrice tridiagonale a1 c2 0 A= . . . 0

0 bn1 an

pour i = 2, . . . , n, ce qui permet dcrire la procdure suivante : e e


PROCEDURE DecompositionLUtridiagonal (n: integer; a, b, c: vec; VAR u, l: vec); Calcule la dcomposition LU dune matrice tridiagonale. e VAR i: integer; BEGIN u[1] := a[1]; FOR i := 2 TO n DO BEGIN l[i] := c[i] / u[i - 1]; u[i] := a[i] - l[i] * b[i - 1] END END; { de "DecompositionLUtridiagonal" }

Dans le cas particulier o` la matrice de dpart est une matrice de Lanczos (cest-`-dire u e a lorsque le vecteur b a tous ses coecients gaux a 1), la procdure se simplie encore et e ` e devient
PROCEDURE LanczosLU (n: integer; a, c: vec; VAR u, l: vec); VAR

Version 15 janvier 2005

72
i: integer; BEGIN u[1] := a[1]; FOR i := 2 TO n DO BEGIN l[i] := c[i] / u[i - 1]; u[i] := a[i] - l[i] END END; { de "LanczosLU" }

Chapitre 4. Matrices tridiagonales

On utilisera ces procdures dans la mthode de Rutishauser de calcul des valeurs propres. e e Dans les deux cas, la matrice U L est a nouveau tridiagonale. `

4.1.3

Dcomposition de Choleski e

La dcomposition de Choleski dune matrice A symtrique dnie positive est, elle aussi, e e e tr`s simple si A est tridiagonale. Posons en eet e a1 b1 a2 0 b2 .. . .. . bn1 an
t

Lquation A = L L donne, par identication, e d1 = a1 i = bi1 /di1 i = 2, . . . , n di = a i 2 i Ce qui se traduit dans la procdure que voici : e
PROCEDURE CholeskiTridiagonal (n: integer; a, b: vec; VAR d, l: vec); VAR i: integer; BEGIN d[1] := sqrt(a[1]); FOR i := 2 TO n DO BEGIN l[i] := b[i - 1] / d[i - 1]; d[i] := sqrt(a[i] - sqr(l[i])) END END; { de "CholeskiTridiagonal" }

A=

et

L=

d1
2

0 d2
3

d3 .. .

..

. dn

4.2

Tridiagonalisation

La simplicit de manipulation des matrices tridiagonales est manifeste. Il est donc e souhaitable de se ramener a des matrices de cette forme avant de procder a des calculs ` e ` Version 15 janvier 2005

4.2. Tridiagonalisation

73

pousss comme ceux des valeurs et des vecteurs propres. Deux mthodes de transfore e mation orthogonale dune matrice en une matrice tridiagonale sont exposes ici : la e mthode de Givens et la mthode de Householder. e e

4.2.1

Enonc : tridiagonalisation (mthode de Givens) e e

Soit n 2 un entier. Les matrices considres sont relles, dordre n. On note tP la e e e transpose dune matrice P . e Pour p, q dans {1, . . . , n}, p = q, on note G(q, p) = (gi,j ) toute matrice de rotation de la forme 1 0 .. . c s .. G(q, p) = . s c .. . 0 1 avec c2 + s2 = 1, qui ne di`re de la matrice unit que par les lments dindice (p, p), e e ee (p, q), (q, p), (q, q). Plus prcisment, e e gi,i = 1 i = p et i = q gi,j = 0 i = j, (i, j) = (p, q) et (i, j) = (q, p) gp,p = gq,q = c gp,q = gq,p = s 1. Etant donns une matrice A et deux indices p et q avec 2 p < q, dmontrer quil e e existe c et s tels que llment bq,p1 de la matrice B = (bi,j ) = tG(q, p)AG(q, p) soit ee nul. 2. Soit A une matrice symtrique. On dnit une suite de matrices B (q,p) = (bi,j ) e e pour 2 p q n par B (2,2) = A B (q,p) = tG(q, p)B (q1,p) G(q, p) B (p,p) = B (n,p1) (3 p n)
(q,p) (q,p)

(2 p < q n)

o` G(q, p) est construit de mani`re telle que bq,p1 = 0. On pose R = (ri,j ) = B (n,n1) . u e Dmontrer que R est tridiagonale, cest-`-dire que ri,j = 0 pour |i j| > 1. e a 3. Ecrire une procdure qui prend en donne une matrice symtrique A dordre n e e e et qui ache comme rsultat la matrice R sous la forme de deux vecteurs d R n et e h R n1 contenant respectivement ses lments diagonaux et hors-diagonaux. ee Version 15 janvier 2005

74 Exemple numrique : e

Chapitre 4. Matrices tridiagonales 1 2 3 4 4 1 5 1 1 10 1 7 5 1 14 6 1 7 6 14

4 1 A = 2 3 4

4. On suppose que la matrice A est de plus dnie positive. Dmontrer quil existe e e alors une matrice triangulaire infrieure L = (li,j ) telle que R = L tL. Dmontrer que L e e vrie li,j = 0 pour ij > 1. Ecrire une procdure qui prend comme donne une matrice e e e tridiagonale dnie positive, sous la forme de deux vecteurs comme dcrit a la question e e ` prcdente, et qui dtermine la matrice L sous forme de deux vecteurs galement. e e e e

4.2.2

Solution : tridiagonalisation (mthode de Givens) e

Soit n 2 un entier. Les matrices considres sont relles, dordre n. On note tP la e e e transpose dune matrice P . Pour p, q dans {1, . . . , n}, p = q, on note G(q, p) = (g i,j ) e toute matrice de rotation dnie par e gi,i = 1 i = p et i = q gi,j = 0 i = j, (i, j) = (p, q) et (i, j) = (q, p) gp,p = gq,q = c gp,q = gq,p = s avec c2 + s2 = 1. Etant donns une matrice A et deux indices p et q avec 2 p < q, il est facile de e dterminer deux nombres rels c et s tels que llment bq,p1 de la matrice B = (bi,j ) = e e ee t G(q, p)AG(q, p) soit nul. Il sut en eet dvaluer le coecient correspondant. Comme e bq,p1 = sap,p1 + caq,p1 on pose c=1 c = ap,p1 /r s=0 s = aq,p1 /r
2 si a2 p,p1 + aq,p1 = 0 2 2 si ap,p1 + aq,p1 = r2 = 0

Soit maintenant A une matrice symtrique et considrons la suite de matrices B (q,p) = e e (q,p) (bi,j ) pour 2 p q n dnie par e B (2,2) = A B (q,p) = tG(q, p)B (q1,p) G(q, p) B (p,p) = B (n,p1) (3 p n)
(q,p)

(2 p < q n)

o` G(q, p) est construit de mani`re telle que bq,p1 = 0. On pose R = (ri,j ) = B (n,n1) . u e Proposition 4.2.1. La matrice R est tridiagonale. Version 15 janvier 2005

4.2. Tridiagonalisation

75

Preuve. Soit A une matrice symtrique et soient p, q avec 2 p < q. Soit G(q, p) telle e que llment bq,p1 de la matrice B = (bi,j ) = tG(q, p)AG(q, p) soit nul. On a bi,j = ai,j ee si i = p, q et pour j < p : bp,j = cap,j saq,j bq,j = sap,j + caq,j Il en rsulte que si ai,j = 0 pour 1 j < p, j + 2 i n, il en est de mme pour bi,j . e e Il en rsulte par rcurrence que R est tridiagonale. e e

4.2.3

Programme : tridiagonalisation (mthode de Givens) e

Par identication, on obtient des expressions pour c et s qui conduisent a la procdure ` e que voici, tr`s proche de la procdure CoefficientsGivens du chapitre 3. e e
PROCEDURE CoefficientsGivensE (p, q: integer; VAR c, s: real; VAR a: mat); Calcul des rels c et s tels que b(q, p 1) = 0. e VAR norme: real; BEGIN norme := sqrt(sqr(a[p, p - 1]) + sqr(a[q, p - 1])); IF EstNul(norme) THEN BEGIN c := 1; s := 0 END ELSE BEGIN c := a[p, p - 1] / norme; s := -a[q, p - 1] / norme END END; { de "CoefficientsGivensE" }

Le calcul de la matrice tG(q, p)AG(q, p) se fait simplement et de faon conomique, c e en valuant les quelques coecients modis de la matrice A. Voici une procdure qui e e e ralise cette transformation : e
PROCEDURE TransformationGivens (n, p, q: integer; c, s: real; VAR a: mat); Multiplication tgag o` g est la matrice de rotation dont les coecients sont dtermins u e e par c et s. VAR j: integer; u, v, w: real; BEGIN FOR j := 1 TO n DO IF (j <> p) AND (j <> q) THEN BEGIN v := a[p, j]; w := a[q, j]; a[p, j] := c * v - s * w; a[j, p] := a[p, j]; a[q, j] := s * v + c * w; a[j, q] := a[q, j]

Version 15 janvier 2005

76
END; v := a[p, p]; u := a[p, q]; w := a[p, p] := c * c * v - 2 * c * s a[q, q] := s * s * v + 2 * c * s a[p, q] := (c * c - s * s) * u + a[q, p] := a[p, q] END; { de "TransformationGivens" }

Chapitre 4. Matrices tridiagonales

a[q, q]; * u + s * s * w; * u + c * c * w; c * s * (v - w);

Notons quil ny a que 2n coecients modis, donc O(n) oprations arithmtiques, alors e e e que le calcul de tG(q, p)AG(q, p) par les procdures gnrales dvaluation de matrices e e e e aurait cot O(n3 ) oprations. La dirence est apprciable. ue e e e Il ny a plus qu` utiliser cette procdure pour 2 p < q n : a e
PROCEDURE TridiagonalParGivens (n: integer; VAR a: mat); On annule successivement les coecients dindices (p, q), 2 p < q n. Le produit des matrices de rotation est linverse de la matrice orthogonale cherche. e VAR p, q: integer; c, s: real; BEGIN FOR p := 2 TO n - 1 DO FOR q := p + 1 TO n DO BEGIN CoefficientsGivensE(p, q, c, s, a); TransformationGivens(n, p, q, c, s, a); END END; { de "TridiagonalParGivens" }

Une variante de cette procdure permet dobtenir aussi la matrice orthogonale qui est le e produit des matrices de rotations. Pour cela, on accumule les matrices de rotations dans une matrice qui, initialement, est la matrice unit et qui est postmultiplie, au fur et a e e ` mesure, avec les matrices de rotations. La procdure de postmultiplication, cest-`-dire e a du calcul du produit BG(q, p), est la suivante :
PROCEDURE Postmultiplier (n, p, q: integer; c, s: real; VAR a: mat); Postmultiplication de la matrice a par la matrice de rotation G(q, p). VAR i: integer; v, w: real; BEGIN FOR i := 1 TO n DO BEGIN v := a[i, p]; w := a[i, q]; a[i, p] := c * v - s * w; a[i, q] := s * v + c * w; END END; { de "Postmultiplier" }

La procdure suivante calcule donc, dans B, le produit G(3, 2) G(n, n 1). e


PROCEDURE TridiagonalParGivens2 (n: integer; VAR a, g: mat);

Version 15 janvier 2005

4.2. Tridiagonalisation

77

On annule successivement les coecients dindices (p, q), pour 2 p < q n. Le produit des matrices de rotation est linverse de la matrice orthogonale cherche. e VAR p, q: integer; c, s: real; BEGIN g := MatriceUnite; FOR p := 2 TO n - 1 DO FOR q := p + 1 TO n DO BEGIN CoefficientsGivensE(p, q, c, s, a); Postmultiplier(n, p, q, c, s, g); TransformationGivens(n, p, q, c, s, a) END END; { de "TridiagonalParGivens2" }

Voici un exemple dexcution de cette procdure, avec quelques impressions interme e e diaires :
Donner lordre n : 5 Entrer la matrice (partie infrieure) e Ligne 1 : 4 Ligne 2 : 1 4 Ligne 3 : 2 1 10 Ligne 4 : 3 5 1 14 Ligne 5 : 4 1 7 6 14 Voici la matrice lue 4.000 1.000 2.000 1.000 4.000 1.000 2.000 1.000 10.000 3.000 5.000 1.000 4.000 1.000 7.000 3.000 5.000 1.000 14.000 6.000 4.000 1.000 7.000 6.000 14.000 4.000 6.708 2.236 6.000 14.000 4.000 8.820 2.236 -1.793 14.000 0.000 -1.301 3.099

Matrice A pour p = 2, q = 3 4.000 2.236 0.000 3.000 2.236 9.600 1.800 3.130 0.000 1.800 4.400 -4.025 3.000 3.130 -4.025 14.000 4.000 6.708 2.236 6.000 Matrice A pour p = 2, q = 4 4.000 3.742 0.000 0.000 3.742 15.429 -2.151 1.214 0.000 -2.151 4.400 -3.849 0.000 1.214 -3.849 8.171 4.000 8.820 2.236 -1.793 Matrice A pour p = 2, q = 5 4.000 5.477 0.000 0.000 5.477 23.467 0.163 -0.480 0.000 0.163 4.400 -3.849

Version 15 janvier 2005

78
0.000 0.000 -0.480 -1.301 -3.849 3.099 8.171 -2.111 -2.111 5.962 0.000 -1.301 2.997 2.254 5.962 -0.000 -0.000 -0.796 2.589 11.606 0.000 0.000 -0.000 5.260 7.171 0.000 -0.453 -0.449 0.739 -0.216 0.000 0.000 -0.000 5.260 7.171 4.000 1.000 7.000 6.000 14.000

Chapitre 4. Matrices tridiagonales

Matrice A pour p = 3, q = 4 4.000 5.477 -0.000 0.000 5.477 23.467 0.507 0.000 -0.000 0.507 10.127 1.901 0.000 0.000 1.901 2.444 0.000 -1.301 2.997 2.254 Matrice A pour p = 3, q = 5 4.000 5.477 -0.000 0.000 5.477 23.467 1.396 0.000 -0.000 1.396 4.483 -1.409 0.000 0.000 -1.409 2.444 -0.000 -0.000 -0.796 2.589 Matrice A pour p = 4, q = 5 4.000 5.477 -0.000 -0.000 5.477 23.467 1.396 0.000 -0.000 1.396 4.483 1.619 -0.000 0.000 1.619 6.879 0.000 0.000 -0.000 5.260 Matrice G 1.000 0.000 0.000 0.000 0.000 0.000 0.183 0.365 0.548 0.730 0.000 0.201 0.663 0.340 -0.636 -0.000 0.849 -0.475 0.196 -0.122

Matrice A tridiagonalise (A) e 4.000 5.477 -0.000 -0.000 5.477 23.467 1.396 0.000 -0.000 1.396 4.483 1.619 -0.000 0.000 1.619 6.879 0.000 0.000 -0.000 5.260 Matrice GAtG 4.000 1.000 1.000 4.000 2.000 1.000 3.000 5.000 4.000 1.000 2.000 1.000 10.000 1.000 7.000 3.000 5.000 1.000 14.000 6.000

4.3

Tridiagonalisation (mthode de Householder) e

On pourra se reporter galement a la dcomposition QR par la mthode de Householder, e ` e e dcrite au chapitre 3. e Version 15 janvier 2005

4.3. Tridiagonalisation (mthode de Householder) e

79

4.3.1

Enonc : tridiagonalisation (mthode de Householder) e e

On note tP la transpose dune matrice P . Soit n 1 un entier. Les matrices considres e e e sont relles. Un vecteur v de R n est considr comme une matrice a une colonne et on e e e ` note v sa norme euclidienne. On note I la matrice unit dordre n. On se propose de e construire, pour toute matrice A dordre n symtrique, une matrice semblable B = (b i,j ) e qui soit tridiagonale, cest-`-dire telle que bi,j = 0 pour |i j| > 1. a 1. Soient w R n un vecteur de norme euclidienne 1 et P la matrice I 2w tw. Dmontrer que tP = P 1 = P . e

2. Pour k {2, . . . , n} et pour x R n , on note v = v(k, x) R n le vecteur dni par e vi = o` = u 0 xk + signe(xk ) xi si 1 i < k si i = k si k < i n ()

x2 + + x2 et signe(s) = 1, 0, 1 selon que s > 0, s = 0, s < 0. On pose n k P = P (k, x) = I v tv


2

avec = 2/ v

si v = 0, = 2 sinon. Dmontrer que y = P (k, x)x vrie e e yi = xi si 1 i < k signe(xk ) si i = k 0 si k < i n

Soit A une matrice symtrique dordre n. e 3. Dmontrer que P AP = A q tv v tq, o` P et v sont comme dans (), et o` e u u p = Av, 2K = tvp et q = p Kv. 4. Soient A1 , . . . , An2 , P1 , . . . , Pn2 les matrices dnies par e P1 = P (2, A(1) ) Pr = P (r + A1 (r) 1, Ar1 ) = P1 AP1 Ar = Pr Ar1 Pr r = 2, . . . , n 2

o` pour une matrice M , on note M (j) la j-i`me colonne de M . Dmontrer que la matrice u e e An2 est symtrique et tridiagonale. e 5. Ecrire un programme qui prend en argument une matrice symtrique A dordre n e et qui ache comme rsultat la matrice An2 sous la forme de deux vecteurs d R n et e e R n1 contenant respectivement ses lments diagonaux et hors-diagonaux. ee Exemple numrique : e 4 1 2 3 4 1 4 1 5 1 A = 2 1 0 1 7 3 5 1 4 6 4 1 7 6 4 Version 15 janvier 2005

80

Chapitre 4. Matrices tridiagonales

6. Soit B une matrice carre inversible, symtrique, tridiagonale dordre n donne e e e par deux vecteurs d et e comme a la question prcdente. Ecrire une procdure pour ` e e e rsoudre le syst`me linaire Bx = b et lappliquer a la matrice tridiagonale obtenue sur e e e ` lexemple numrique, avec e 1 2 b = 3 4 5

4.3.2

Solution : tridiagonalisation (mthode de Householder) e

Les matrices considres sont relles, carres dordre n. On note I la matrice unit e e e e e dordre n. Rappelons les notations de la section 3.3.4 : Pour k {1, . . . , n} et pour x R n , le vecteur v = v(k, x) R n est dni par e vi = 0 xk + signe(xk ) xi si 1 i < k si i = k si k < i n

o` = x2 + + x2 et signe(s) = 1, 0, 1 selon que s > 0, s = 0, s < 0. Avec u n k P = P (k, x) = I v tv et = 2/ v 2 si v = 0, = 2 sinon, le vecteur y = P (k, x)x vrie alors y = x v parce que 2 tvx = v 2 ; en fait, on a e yi = xi si 1 i < k signe(xk ) si i = k 0 si k < i n

et en particulier les coecients de y dindices plus grands que k sont nuls. Le procd e e de tridiagonalisation est tr`s voisin de celui qui m`ne a la dcomposition QR. Dans la e e ` e tridiagonalisation, on annule successivement les colonnes et les lignes, a lexception des ` coecients en dehors de la diagonale et des sous- et sur-diagonales, alors que pour la dcomposition QR, on nannule que la partie triangulaire strictement infrieure, mais e e toute cette partie. La mthode repose sur la proposition qui suit. e Proposition 4.3.1. Soit A une matrice symtrique dordre n et soient A1 , . . . , An2 , e P1 , . . . , Pn2 les matrices dnies par e P1 = P (2, A(1) ) Pr = P (r + A1 (r) 1, Ar1 ) = P1 AP1 Ar = Pr Ar1 Pr r = 2, . . . , n 2

Alors la matrice An2 est symtrique et tridiagonale. e Preuve. Chaque matrice Ar est videmment symtrique. Montrons que les matrices e e Ar sont tridiagonales sur leurs r premi`res lignes et colonnes , cest-`-dire que les e a Version 15 janvier 2005

4.3. Tridiagonalisation (mthode de Householder) e


(r)

81

coecients ai,j de Ar sont nuls si |i j| 2 et si i < r ou j < r. Ceci est bien entendu vrai pour r = 0, en posant A = A0 . Nous avons dj` remarqu que la matrice Pr Ar1 est ea e tridiagonale sur les r1 premi`res colonnes parce que Ar1 lest. De plus, les coecients e dindice i, r sont nuls pour i = r + 2, . . . , n. Par symtrie, Ar1 Pr est symtrique sur les e e r 1 premi`res lignes. Or, la matrice Pr scrit par bloc sous la forme e e Pr = Ir 0 0 Pr

o` Ir est la matrice unit dordre r. Par consquent, Ar = Pr Ar1 Pr a les mmes r u e e e premi`res colonnes que Pr Ar1 et les mmes r premi`res lignes que Ar1 Pr . e e e Pour le calcul, il est judicieux de grouper les expressions. La formule a utiliser est donne ` e dans la proposition suivante. Proposition 4.3.2. Soit A une matrice symtrique, soit v un vecteur et soit P = e I v tv avec = 2/ v 2 si v = 0, = 2 sinon. Alors P AP = A q tv v tq o` p = Av, 2K = tvp et q = p Kv. u Preuve. Posons = /2. On a P AP = (I v tv)A(I v tv) = A v tvA Av tv + 2 v tvAv tv = A v tp p tv + v tvp tv = A v tp p tv + 2Kv tv

do` lgalit annonce. u e e e

4.3.3

Programme : tridiagonalisation (mthode de Householder) e

Rappelons la procdure : e
PROCEDURE VecteurHouseholder (n: integer; VAR a: mat; k, j: integer; VAR v: vec);

du chapitre 3, qui calcule le vecteur v = v(k, A(j) ), o` A(j) est la j-i`me colonne de A u e utilise pour la transformation de Househoulder. Cette transformation elle-mme est ici e e un peu dirente, puisquon applique la matrice de Householder a la matrice et a sa e ` ` transpose. Voici la procdure; on a not w le vecteur not q dans lnonc, pour ne pas e e e e e e confondre ce vecteur avec la matrice Q produit des transformations orthogonales.
PROCEDURE TransformationHouseholder (n, r: integer; VAR a: mat); VAR beta, K, normeV2: real;

Version 15 janvier 2005

82

Chapitre 4. Matrices tridiagonales


i, j: integer; v, p, w: vec; BEGIN { de "TransformationHouseholder" } (r) VecteurHouseholder(n, a, r + 1, r, v); v = v(r + 1, A r1 ) normeV2 := ProduitScalaire(n, v, v); IF EstNul(normeV2) THEN beta := 2 ELSE beta := 2 / normeV2; MatriceParVecteur(n, a, v, p); VecteurParScalaire(n, p, beta, p); p = Av K := beta / 2 * ProduitScalaire(n, v, p); K = 1 tvp 2 VecteurParScalaire(n, v, -K, w); VecteurPlusVecteur(n, p, w, w); q = p Kv FOR i := 1 TO n DO FOR j := 1 TO n DO a[i, j] := a[i, j] - v[i] * w[j] - w[i] * v[j]; END; { de "TransformationHouseholder" }

et voici la procdure qui ralise la tridiagonalisation : e e


PROCEDURE TridiagonalParHouseholder (n: integer; VAR a: mat); VAR r: integer; BEGIN FOR r := 1 TO n - 2 DO TransformationHouseholder(n, r, a); END; { de "TridiagonalParHouseholder" }

La variante ci-dessous des deux derni`res procdures permet de calculer en mme temps e e e le produit des matrices de transformation. Plus prcisment, a la n de la procdure e e ` e TridiagonalParHouseholder2, la matrice Q est gale a e ` Q = Pn2 P1 de sorte que lon peut retrouver la matrice de dpart a partir de la matrice A obtenue e ` en faisant le produit tQA Q.
PROCEDURE TransformationHouseholder2 (n, r: integer; VAR a, q: mat); VAR beta, K, normeV2: real; i, j: integer; v, p, w, z: vec; BEGIN { de "TransformationHouseholder2" } (r) VecteurHouseholder(n, a, r + 1, r, v); v = v(r + 1, A r1 ) normeV2 := ProduitScalaire(n, v, v); IF EstNul(normeV2) THEN beta := 2 ELSE beta := 2 / normeV2; MatriceParVecteur(n, a, v, p);

Version 15 janvier 2005

4.3. Tridiagonalisation (mthode de Householder) e


VecteurParScalaire(n, p, beta, p); p = Av 1 K := beta / 2 * ProduitScalaire(n, v, p); K = 2 tvp VecteurParScalaire(n, v, -K, w); VecteurPlusVecteur(n, p, w, w); q = p Kv VecteurParMatrice(n, v, q, z); VecteurParScalaire(n, z, beta, z); z = vQ FOR i := 1 TO n DO FOR j := 1 TO n DO BEGIN a[i, j] := a[i, j] - v[i] * w[j] - w[i] * v[j]; q[i, j] := q[i, j] - v[i] * z[j]; END; END; { de "TransformationHouseholder2" }

83

Bien entendu, on sen sert dans une variante approprie : e


PROCEDURE TridiagonalParHouseholder2 (n: integer; VAR a, q: mat); VAR r: integer; BEGIN q := MatriceUnite; FOR r := 1 TO n - 2 DO TransformationHouseholder2(n, r, a, q); END; { de "TridiagonalParHouseholder2" }

Voici un exemple dutilisation de ces procdures : e


Donner lordre n : 5

Entrer la matrice (partie infrieure) e Ligne 1 : 4 Ligne 2 : 1 4 Ligne 3 : 2 1 10 Ligne 4 : 3 5 1 14 Ligne 5 : 4 1 7 6 14 Voici la matrice lue 4.000 1.000 2.000 1.000 4.000 1.000 2.000 1.000 10.000 3.000 5.000 1.000 4.000 1.000 7.000 Vecteur v 0.000 Vecteur w 1.000 Matrice A 4.000 -5.477 0.000 0.000 6.477 2.000 3.000 5.000 1.000 14.000 6.000 3.000 1.521 0.000 -0.345 -4.286 4.873 4.000 1.000 7.000 6.000 14.000 4.000 0.919 0.000 1.061 2.172 -2.840

-1.503 0.748 pour r = 1 -5.477 0.000 23.467 -0.839 -0.839 7.009 -0.345 -4.286

Version 15 janvier 2005

84
0.000 Vecteur v 0.000 Vecteur w 0.000 Matrice A 4.000 -5.477 0.000 0.000 0.000 Vecteur v 0.000 Vecteur w 0.000 Matrice A 4.000 -5.477 0.000 0.000 0.000 Matrice A 4.000 -5.477 0.000 0.000 0.000 1.061 0.000 2.172 -2.235 -2.840 -0.345 2.065 0.000 0.000 0.135 6.298 -5.211 1.753 -0.166 0.000 0.000 -1.619 6.879 -5.260 6.652 1.061 -0.518 0.000 -0.000 1.613 -5.211 7.752 1.613 0.180 0.000 -0.000 0.000 -5.260 7.171 0.000 -0.000 0.000 -5.260 7.171 0.000 -0.730 0.636 -0.122 0.216 4.000 1.000 7.000 6.000 14.000

Chapitre 4. Matrices tridiagonales

1.000 -0.565 pour r = 2 -5.477 0.000 23.467 1.396 1.396 4.483 0.000 0.135 -0.000 1.613 0.000 0.000

-0.000 1.000 pour r = 3 -5.477 0.000 23.467 1.396 1.396 4.483 0.000 -1.619 -0.000 0.000

tridiagonalise (A) e -5.477 0.000 0.000 23.467 1.396 0.000 1.396 4.483 -1.619 0.000 -1.619 6.879 -0.000 0.000 -5.260

Matrice Q de transformation 1.000 0.000 0.000 0.000 0.000 -0.183 -0.365 -0.548 0.000 -0.201 -0.663 -0.340 0.000 0.849 -0.475 0.196 0.000 0.453 0.449 -0.739 Matrice tQAQ 4.000 1.000 1.000 4.000 2.000 1.000 3.000 5.000 4.000 1.000 2.000 1.000 10.000 1.000 7.000 3.000 5.000 1.000 14.000 6.000

Version 15 janvier 2005

85

Chapitre 5

Valeurs et vecteurs propres


Le calcul des valeurs propres dune matrice A peut se faire en calculant dabord son polynme caractristique, puis en dterminant les zros de ce polynme. Une autre o e e e o famille de mthodes travaille directement sur la matrice : on transforme A progressivee ment en une matrice semblable a la matrice dorigine et qui a une forme particuli`re, sur ` e laquelle les valeurs propres se lisent directement, comme une matrice diagonale ou triangulaire. Laccumulation des matrices de transformation permet dobtenir galement e les vecteurs propres.

5.1

Mthode de Jacobi e

La mthode de Jacobi est un procd simple a mettre en uvre pour le calcul des valeurs e e e ` et vecteurs propres dune matrice relle symtrique. e e

5.1.1

Enonc : mthode de Jacobi e e

Soit n 2 un entier. Les matrices considres sont relles, carres dordre n. Pour p, q e e e e dans {1, . . . , n}, p = q, on note G(q, p) = (gi,j ) toute matrice de rotation de la forme G(q, p) = 1 .. . c s 0 .. s . c .. . 0 Version 15 janvier 2005

86

Chapitre 5. Valeurs et vecteurs propres

avec c2 + s2 = 1, qui ne di`re de la matrice unit que par les lments dindice (p, p), e e ee (p, q), (q, p), (q, q). Plus prcisment, e e gi,i = 1 i = p et i = q gi,j = 0 i = j (i, j) = (p, q) et (i, j) = (q, p) gp,p = gq,q = c gp,q = gq,p = s
t

7. Soit A = (ai,j ) une matrice symtrique et soit p = q. Dmontrer que B = (bi,j ) = e e G(q, p)AG(q, p) vrie e S(B) = S(A) 2a2 + 2b2 p,q p,q o` u
n

S(A) =
i,j=1 i=j

a2 i,j

(On note tM la transpose dune matrice M .) e 8. Dmontrer que lon peut choisir c 2/2 et s tels que e bp,q = bq,p = 0 Dmontrer que si de plus on choisit p, q tels que e |ap,q | = alors S(B) 1
1i<jn

()

max |ai,j | S(A)

()

2 n(n 1)

9. En itrant le procd de construction dune matrice B a partir de A avec les choix e e e ` () et (), on obtient une suite de matrices A(1) = A, A(2) , . . . , A(k) , . . .. Dmontrer que e (k) A(k) = (ai,j ) tend vers une matrice diagonale dont les valeurs propres sont les valeurs propres de la matrice A. (On pourra montrer que pour i = 1, . . . , n, |ai,i
(k) (k+1)

ai,i |

(k)

S(A(k) )

et que la suite (ai,i )k1 est de Cauchy.) 10. Ecrire un programme qui prend en argument la partie triangulaire infrieure dune e matrice symtrique et qui met en uvre cet algorithme. On pourra arrter les itrations e e e lorsque S(B) < , pour = 103 . Exemple numrique : e 4 1 0 0 0 1 4 1 0 0 A = 0 1 4 1 0 0 0 1 4 1 0 0 0 1 4 Version 15 janvier 2005

5.1. Mthode de Jacobi e

87

11. On suppose de plus que les valeurs propres de la matrice A sont distinctes. Soient G1 , G2 , . . . les matrices de rotations employes dans lalgorithme. Dmontrer que la suite e e G1 G2 Gk (k 1)

converge vers une limite G lorsque k tend vers linni. Dmontrer que les colonnes de e G sont des vecteurs propres associs aux valeurs propres de la matrice A. Donner une e procdure qui calcule ces vecteurs propres pour la matrice donne en exemple. e e

5.1.2

Solution : mthode de Jacobi e

Soit n 2 un entier. Les matrices considres sont relles, carres dordre n. Pour p, q e e e e dans {1, . . . , n}, p = q, on note G(q, p) = (gi,j ) toute matrice de rotation dnie par e gi,i = 1 i = p et i = q gi,j = 0 i = j (i, j) = (p, q) et (i, j) = (q, p) gp,p = gq,q = c gp,q = gq,p = s avec c2 + s2 = 1. Soit A = (ai,j ) une matrice symtrique et soient p et q deux indices tels que p = q. Soit e B = (bi,j ) = tG(q, p)AG(q, p). Alors les coecients de B sont : bi,j = ai,j i = p, i = q j = p, j = q bp,j = cap,j saq,j j = p, j = q bq,j = caq,j + sap,j j = p, j = q bp,p = c2 ap,p + s2 aq,q 2scap,q bq,q = s2 ap,p + c2 aq,q + 2scap,q bp,q = (c2 s2 )ap,q + sc(ap,p aq,q ) Proposition 5.1.1. Si ap,q = 0, il existe un rel ] /4, /4], = 0 unique tel e quen posant c = cos et s = sin , on ait bp,q = 0. Preuve. Soit tel que = cotan 2 = aq,q ap,p 2ap,q

et soit t la racine de plus petit module du trinme o t2 + 2 t 1 = 0 (avec t = 1 si = 0). Alors t = tan et, en posant c = cos et s = sin , on a b p,q = 0. Un calcul rapide montre que t sexprime simplement : t= ( ) | | + 1 + 2 Version 15 janvier 2005

88

Chapitre 5. Valeurs et vecteurs propres

o` (u) = 1 si u < 0 et (u) = 1 si u 0. Comme u c= 1 1 + t2 s = tc

aucun calcul de fonction trigonomtrique nest ncessaire pour valuer c et s. e e e Lintroduction de est utile pour prouver la convergence. Le param`tre convenable est e le carr de la norme euclidienne. Pour toute matrice symtrique A, soit e e
n n

S(A) =
i,j=1 i=j

a2 i,j

= tr(A )

a2 i,i
i=1

o` tr(M ) est la trace de la matrice M . u Lemme 5.1.2. Soit A une matrice symtrique et soit B = tG(q, p)AG(q, p). Alors e S(B) = S(A) 2a2 + 2b2 . p,q p,q Preuve. On a B 2 = tG(q, p)A2 G(q, p), donc tr(B 2 ) = tr(G(q, p)tG(q, p)A2 ) = tr(A2 ), soit
n n

S(B) +
i=1

b2 = S(A) + i,i
i=1

a2 i,i

Par ailleurs, lexpression des coecients de B en fonction des coecients de A montre que lon a c s c s ap,p ap,q bp,p bp,q = s c s c aq,p aq,q bq,p bq,q A nouveau, les traces des carrs de ces matrices sont gales et celles-ci scrivent : e e e b2 + b2 + 2b2 = a2 + a2 + 2a2 p,p q,q p,q p,p q,q p,q Comme bi,i = ai,i pour i = p, q, on obtient la relation. Thor`me 5.1.3. Soit A une matrice symtrique et soit (A(k) ) la suite de matrice e e e obtenue par A(1) = A et A(k+1) = tG(qk , pk )A(k) G(qk , pk ), o` le couple (qk , pk ) est u choisi a chaque tape tel que ` e a(k) k = pk ,q
1i<jn

max

ai,j

(k)

Alors la suite A(k) tend vers une matrice diagonale dont les lments diagonaux sont les ee valeurs propres de A. Rappelons que la convergence dune suite de matrices dordre n ni est indpendante e de la norme choisie. Elle quivaut a la convergence des n2 suites de scalaires formes e ` e par les lments des matrices. ee Version 15 janvier 2005

5.1. Mthode de Jacobi e

89

Preuve. Soit A une matrice symtrique et soit B = tG(q, p)AG(q, p), o` (q, p) sont e u choisis tels que |ap,q | = max |ai,j |
1i<jn

Alors on a, en sommant, n(n montre que

1)a2 p,q

S(A) et, comme bp,q = 0, le lemme ci-dessus 1 2 n(n 1) S(A)

S(B) = S(A) 2a2 p,q

Par ailleurs et avec les mmes notations que pour la preuve de la proposition 5.1.1 e aq,q bq,q = (aq,q ap,p )s2 2ap,q sc = 2ap,q ( s2 sc) = ap,q t Comme |t| 1 en vertu du choix de , on a |aq,q bq,q | |ap,q | et de mme |ap,p bp,p | e |ap,q |. En particulier |ai,i bi,i | S(A) pour tout i = 1, . . . , n. (1.1)

Considrons maintenant la suite (A(k) ). On a e S(A(k) ) r2 S(A(k1) ) avec r = 1 2 <1 n(n 1)


(k)

donc S(A(k) ) tend vers 0; en consquence, pour tout i, j avec i = j, la suite |ai,j | tend e vers 0. Restent les lments diagonaux. Or dapr`s (1.1), ee e |ai,i
(k) (k+1)

ai,i |

(k)

S(A(k) ) rk

S(A)

et la suite (ai,i )k0 converge donc pour tout i. Comme les matrices A(k) sont toutes semblables, elles ont toutes les mmes valeurs propres, qui sont aussi les valeurs propres e de la matrice limite. Sa diagonale est donc forme des valeurs propres de A. Ceci ach`ve e e la preuve. Posons = lim A(k)
k

Proposition 5.1.4. Supposons les valeurs propres de A distinctes et, avec les notations du thor`me, posons e e k = G(q1 , p1 )G(q2 , p2 ) G(qk , pk ) Alors G = limk k existe et ses colonnes sont des vecteurs propres associs aux e valeurs propres de A; plus prcisment, e e AG = G Version 15 janvier 2005

90

Chapitre 5. Valeurs et vecteurs propres

Preuve. Soient i (1 i n) les valeurs propres de A. Comme elles sont distinctes, le nombre 1 min |i j | m= 2 1i<jn est non nul et, comme les suites (ai,i )k0 convergent, on a, pour k assez grand et i = j, a(k) k a(k) k m qk ,q qk ,q Par ailleurs, a(k) k a(k) k tan 2k = 2a(k) k qk ,q qk ,q pk ,q ce qui montre que tan 2k tend vers 0 et donc k tend vers 0. On peut mme tre plus e e prcis : e m| tan 2k | 2 a(k) k r2k S(A) pk ,q donc k tend vers zro gomtriquement. e e e Considrons maintenant la norme euclidienne G(qk , pk ) I e G(qk , pk ) I donc k k1
E E E. (k)

On a

= 4(1 cos k ) 2k
E

G(qk , pk ) I

2k

(parce que k est unitaire). Comme la suite (k ) tend vers 0 gomtriquement, cela e e prouve la convergence de la suite (k ). En passant a la limite dans lexpression ` A(k+1) = tk Ak on obtient tGAG = , do` la relation cherche. u e

5.1.3

Programme : mthode de Jacobi e

Pour programmer la mthode de Jacobi, mettons dabord en place le calcul des matrices e de rotations. On nen calcule que les coecients non nuls, cest-`-dire les nombres c et a s. Ceci se fait comme suit, en utilisant les formules de la section prcdente : e e
PROCEDURE CoefficientsJacobi (p, q: integer; VAR c, s: real; VAR a: mat); Calcule les nombres c et s tels que bp,q = 0. On suppose que ap,q = 0. VAR tau, t: real; BEGIN tau := (a[q, q] - a[p, p]) / (2 * a[p, q]); IF EstNul(tau) THEN t := 1 ELSE

Version 15 janvier 2005

5.1. Mthode de Jacobi e


t := signe(tau) / (abs(tau) + sqrt(1 + sqr(tau))); c := 1 / sqrt(1 + sqr(t)); s := t * c END; { de "CoefficientsJacobi" }

91

La stratgie a employer pour le choix des indices p, q scrit comme suit : e ` e


PROCEDURE IndicesMax (n: integer; VAR a: mat; VAR p, q: integer); Calcule un couple (p, q), avec p < q, tel que |ap,q | = maxi=j |ai,j |. VAR i, j: integer; maxlocal: real; BEGIN p := 1; q := 2; maxlocal := 0; FOR i := 1 TO n - 1 DO FOR j := i + 1 TO n DO IF abs(a[i, j]) > maxlocal THEN BEGIN maxlocal := abs(a[i, j]); p := i; q := j END; END; { de "IndicesMax" }

On peut alors transformer la matrice par la matrice de rotation.


PROCEDURE TransformationJacobi (n, p, q: integer; c, s: real; VAR a: mat); On applique la matrice de rotation G(p, q) a la matrice A. ` VAR j: integer; u, v, w: real; BEGIN FOR j := 1 TO n DO IF (j <> p) AND (j <> q) THEN BEGIN v := a[p, j]; w := a[q, j]; a[p, j] := c * v - s * w; a[j, p] := a[p, j]; a[q, j] := s * v + c * w; a[j, q] := a[q, j] END; v := a[p, p]; u := a[p, q]; w := a[q, q]; La bande des quatre. a[p, p] := c * c * v - 2 * c * s * u + s * s * w; a[q, q] := s * s * v + 2 * c * s * u + c * c * w; a[p, q] := 0; a[q, p] := 0 END; { de "TransformationJacobi" }

Comme les matrices sont symtriques, la moiti des coecients sont inutiles et il aue e rait sut de travailler uniquement sur la partie triangulaire suprieure par exemple. e En fait, la programmation est plus simple avec la matrice enti`re et les oprations e e supplmentaires sont simplement des aectations. e Une tape de la mthode de Jacobi est ralise en groupant les oprations prcdentes. e e e e e e e Dans la procdure qui suit, on met a jour galement le nombre S(A) (not sigma) : e ` e e
PROCEDURE Jacobi (n: integer; VAR a: mat; VAR sigma: real);

Version 15 janvier 2005

92

Chapitre 5. Valeurs et vecteurs propres


Ralise une itration de la mthode de Jacobi : choix des indices p, q, calcul de la matrice e e e de transformation et application de la transformation. La somme des carrs des lments e ee non diagonaux est mise a jour dans sigma. ` VAR p, q: integer; c, s: real; BEGIN IndicesMax(n, a, p, q); CoefficientsJacobi(p, q, c, s, a); sigma := sigma - 2 * sqr(a[p, q]); TransformationJacobi(n, p, q, c, s, a) END; { de "Jacobi" }

Quand arrter les itrations? Une bonne indication est donne par le fait que S(A) ne e e e change plus beaucoup. Cest ce crit`re que nous appliquons, avec en plus un test qui e permet de sortir lorsque le nombre ditrations dpasse une quantit xe. La variable e e e e MaxIteration est a dnir dans le programme entourant. ` e
PROCEDURE ValeursPropresParJacobi (n: integer; VAR a: mat; VAR NIteration: integer); Remplace a par une matrice diagonale contenant les valeurs propres de a. Le nombre ditrations est galement rapport. e e e VAR sigma, sigmaN: real; BEGIN sigmaN := SommeDesCarres(n, a); NIteration := 0; REPEAT sigma := sigmaN; NIteration := NIteration + 1; Jacobi(n, a, sigmaN); UNTIL EstNul(sigmaN - sigma) OR (NIteration > MaxIteration); END; { de "ValeursPropresParJacobi" }

On initialise donc le processus en calculant le nombre S(A) par :


FUNCTION SommeDesCarres (n: integer; VAR a: mat): real; Calcule la somme des carrs des coecients non diagonaux dune matrice symtrique a. e e VAR s: real; i, j: integer; BEGIN s := 0; FOR i := 1 TO n - 1 DO FOR j := i + 1 TO n DO s := s + sqr(a[i, j]); SommeDesCarres := 2 * s END; { de "SommeDesCarres" }

Voici un exemple dexcution, avec quelques impressions intermdiaires : e e Version 15 janvier 2005

5.1. Mthode de Jacobi e


Entrer la matrice Ligne Ligne Ligne Ligne 1 2 3 4 : : : : 1 1 4 0 1 4 0 0 1 4 0.000 0.000 1.000 4.000

93

Voici la matrice lue 1.000 1.000 0.000 1.000 4.000 1.000 0.000 1.000 4.000 0.000 0.000 1.000 S = 6.00000000

Matrice a pour p = 1, q = 2 0.697 -0.000 -0.290 0.000 -0.000 4.303 0.957 0.000 -0.290 0.957 4.000 1.000 0.000 0.000 1.000 4.000 S = 4.00000000 Matrice a pour p = 3, q = 4 0.697 -0.000 -0.205 -0.205 -0.000 4.303 0.677 0.677 -0.205 0.677 3.000 0.000 -0.205 0.677 0.000 5.000 S = 2.00000000 Matrice a pour p = 2, q = 3 0.697 -0.080 -0.189 -0.205 -0.080 4.591 0.000 0.623 -0.189 0.000 2.712 -0.265 -0.205 0.623 -0.265 5.000 S = 1.08397484 Matrice a pour p = 2, q = 0.697 0.055 -0.189 0.055 4.140 0.155 -0.189 0.155 2.712 -0.213 -0.000 -0.215 S = 0.30834481 Matrice a pour p = 3, q = 0.697 0.055 -0.205 0.055 4.140 0.155 -0.205 0.155 2.695 -0.198 -0.012 -0.000 ... S = 0.00000005 Apr`s 13 itrations, e e voici la matrice "diagonale" 0.667 0.000 -0.000 0.000 4 -0.213 -0.000 -0.215 5.451 4 -0.198 -0.012 -0.000 5.468

Version 15 janvier 2005

94
0.000 -0.000 0.000 4.156 -0.000 0.000 -0.000 2.701 -0.000 0.000 -0.000 5.476

Chapitre 5. Valeurs et vecteurs propres

Voici un deuxi`me exemple : e


Voici la matrice lue 1.000 1.000 0.000 1.000 4.000 1.000 0.000 1.000 4.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 4.000 1.000 0.000 0.000 0.000 1.000 4.000

Apr`s 23 itrations, e e voici la matrice "diagonale" 0.667 -0.000 -0.000 0.000 -0.000 3.512 0.000 -0.000 -0.000 0.000 2.449 -0.000 0.000 -0.000 -0.000 5.652 -0.000 -0.000 -0.000 -0.000

-0.000 -0.000 -0.000 -0.000 4.720

Dans les deux cas, = 105 . Venons-en au calcul des vecteurs propres. Il se fait simplement en accumulant les matrices de rotation. On emploie donc la procdure e PostMultiplier du chapitre 4. La procdure principale prend alors la forme que voici : e
PROCEDURE Jacobi2 (n: integer; VAR a, g: mat; VAR sigma: real); Ralise une itration de la mthode de Jacobi et accumule la matrice de transformation. e e e VAR p, q: integer; c, s: real; BEGIN IndicesMax(n, a, p, q); CoefficientsJacobi(p, q, c, s, a); sigma := sigma - 2 * sqr(a[p, q]); TransformationJacobi(n, p, q, c, s, a); PostMultiplier(n, p, q, c, s, g); END; { de "Jacobi2" }

Finalement, on obtient la procdure que voici : e


PROCEDURE ElementsPropresParJacobi (n: integer; VAR a, g: mat; VAR NIteration: integer); Remplace a par une matrice diagonale contenant les valeurs propres de a. La matrice g contient les vecteurs propres correspondants. Le nombre ditrations est galement e e rapport. e VAR sigma, sigmaN: real; BEGIN sigmaN := SommedesCarres(n, a); NIteration := 0;

Version 15 janvier 2005

5.1. Mthode de Jacobi e


g := MatriceUnite; REPEAT sigma := sigmaN; NIteration := NIteration + 1; Jacobi2(n, a, g, sigmaN); UNTIL EstNul(sigmaN - sigma) OR (NIteration > MaxIteration); END; { de "ElementsPropresParJacobi" }

95

Voici deux exemples :


Voici la matrice lue 1.000 1.000 1.000 1.000 2.000 2.000 1.000 2.000 3.000 Apr`s 6 itrations, e e voici la matrice "diagonale" D 0.643 0.000 0.000 0.000 0.308 -0.000 0.000 -0.000 5.049 Matrice G des vecteurs propres 0.737 -0.591 0.328 0.328 0.737 0.591 -0.591 -0.328 0.737 AG 0.474 -0.182 1.656 0.211 0.227 2.984 -0.380 -0.101 3.721 GD 0.474 -0.182 1.656 0.211 0.227 2.984 -0.380 -0.101 3.721 Voici la matrice lue 1.000 1.000 0.000 1.000 4.000 1.000 0.000 1.000 4.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 4.000 1.000 0.000 0.000 0.000 1.000 4.000

Apr`s 23 itrations, e e voici la matrice "diagonale" D 0.667 -0.000 0.000 0.000 -0.000 3.512 0.000 -0.000 0.000 0.000 2.449 -0.000 0.000 -0.000 -0.000 5.652 -0.000 0.000 -0.000 -0.000 Matrice G des vecteurs propres 0.943 0.209 -0.177 0.090 -0.314 0.526 -0.257 0.419 0.105 -0.466 0.575 0.603

-0.000 0.000 -0.000 -0.000 4.720 -0.166 -0.619 -0.279

Version 15 janvier 2005

96
-0.034 0.010 AG 0.629 -0.210 0.070 -0.023 0.007 GD 0.629 -0.210 0.070 -0.023 0.007 0.735 1.846 -1.636 -1.048 2.147 -0.434 -0.629 1.409 -1.557 1.003 0.509 2.370 3.405 3.254 1.970 -0.785 -2.922 -1.318 1.972 2.739 0.735 1.846 -1.636 -1.048 2.147 -0.434 -0.629 1.409 -1.557 1.003 0.509 2.370 3.405 3.254 1.970 -0.785 -2.922 -1.318 1.972 2.739 -0.298 0.611 -0.635 0.410 0.576 0.349 0.418 0.580

Chapitre 5. Valeurs et vecteurs propres

5.2

Mthode QR e

La mthode QR de calcul des valeurs propres dune matrice est une mthode itrative e e e fonde sur la dcomposition QR (voir chapitre 3). Cest une mthode couramment eme e e ploye. e Soit A une matrice carre dordre n. On forme la suite (Ak ) de matrices par A1 = A et e Ak+1 = Rk Qk = Qk+1 Rk+1 k1

o` Ak = Qk Rk est une dcomposition QR de la matrice Ak . u e Posons Qk = Q1 Q2 Qk et Rk = Rk R2 R1 . Alors on a Ak+1 = tQk AQk de sorte que les matrices Ak sont toutes semblables a A. Nous allons montrer (sous des ` conditions assez restrictives) que les matrices Ak deviennent triangulaires suprieures e en ce sens que les lments au-dessous de la diagonale tendent vers zro et que la ee e diagonale converge (vers les valeurs propres de la matrice A). Thor`me 5.2.1. Soit A une matrice carre inversible dont les valeurs propres sont e e e toutes de module dirent. Soit P une matrice inversible telle que A = P P 1 , avec e = diag (1 , . . . , n ) et |1 | > > |n | > 0. On suppose de plus que la matrice P 1 poss`de une dcomposition LU . Alors e e
k k

lim (Ak )i,i = i

lim (Ak )i,j = 0

1j<in

1in

Avant de passer a la preuve, remarquons que les conclusions du thor`me demeurent ` e e valables dans des cas plus gnraux. Toutefois, les dmonstrations sont plus compliques e e e e que celle du thor`me, qui est dj` assez longue. e e ea Version 15 janvier 2005

5.2. Mthode QR e Preuve. Considrons la puissance k-i`me de la matrice A. On a e e A k = Q k Rk

97

car Ak = (Q1 R1 )k = Q1 (R1 Q1 )k1 R1 = Q1 (Q2 R2 )k1 R1 et plus gnralement Aj = e e 1 Qj Aj+1 Rj . Appelons P = QR P 1 = LU les factorisations QR et LU des matrices P et P 1 . Comme la matrice A est inversible, on a Ak = P k P 1 = QR(k Lk )k U Or, la matrice L tant unitriangulaire infrieure, la matrice k Lk est de mme nature e e e et de plus k i Li,j i>j (k Lk )i,j = j et en vertu des hypoth`ses sur les valeurs propres de A, on a e
k

lim k Lk = I

Posons k Lk = I + Fk Alors R(k Lk ) = (I + RFk R1 )R Pour des valeurs susamment grandes de k, les matrices I + RFk R1 sont inversibles, puisque RFk R1 < 1, quelle que soit la norme. Elles admettent donc une factorisation QR I + RFk R1 = Qk Rk qui est unique si lon impose par exemple que (Rk )i,i > 0, pour 1 i n. e Montrons que les suites Qk et Rk tendent vers la matrice unit. Les matrices Qk tant e unitaires, la suite (Qk ) est borne (parce que Qk 2 = 1). On peut donc en extraire une e e suite (Qk ) qui converge vers une matrice Q, galement unitaire. Comme Rk = tQk (I + RFk R1 ) e e la suite (Rk ) converge galement, vers une matrice R triangulaire suprieure, et telle que (R)i,i 0 pour 1 i n. En passant a la limite sur la suite extraite, on a ` I = QR Ceci impose (R)i,i > 0 pour 1 i n et lunicit de la factorisation QR montre que e = R = I. Le mme raisonnement vaut pour toute suite extraite. Lunicit des limites Q e e montre que les suites de dpart convergent et que e
k

avec lim Fk = 0
k

lim Qk = I

lim Rk = I Version 15 janvier 2005

98 En conclusion, on a

Chapitre 5. Valeurs et vecteurs propres

Ak = (QQk )(Rk Rk U ) = Qk Rk et comme la matrice QQk est unitaire et Rk Rk U est triangulaire suprieure, nous e voici en prsence de deux dcompositions QR de Ak . Il sut de dterminer une matrice e e e diagonale Dk dont les lments diagonaux valent 1 et telle que Dk Rk Rk U ait ses ee lments diagonaux positifs, pour pouvoir conclure a lgalit des deux factorisations. ee ` e e On a donc Qk = Q Q k D k Revenons aux matrices Ak . Comme A = QRR1 Q1 , on a Ak+1 = tQk AQk = Dk Bk Dk avec Bk = tQk RR1 Qk et comme limk Qk = I, on en conclut que
k

lim Bk = RR1

De plus, cette matrice est triangulaire suprieure et a sur sa diagonale les valeurs propres e 1 , . . . , n dans cet ordre. Maintenant (Ak+1 )i,j = (Dk )i,i (Dk )j,j (Bk )i,j de sorte que (Ak+1 )i,i = (Bk )i,i pour 1 i n et limk (Ak+1 )i,j = 0 pour i > j. Ceci ach`ve la vrication. e e La mthode est simple a programmer. Une itration consiste a dcomposer la matrice e ` e ` e et a faire le produit des facteurs dans lordre inverse. Voici une ralisation : ` e
PROCEDURE IterationQR (n: integer; VAR a: mat); VAR q, r: mat; BEGIN DecompositionQR(n, a, q, r); MatriceParMatrice(n, r, q, a) END; { de "IterationQR" }

Dans cette procdure, DecompositionQR est lune des procdures de dcomposition qui e e e ont t prsentes au chapitre 3. Voici quelques exemples numriques, o` les matrices ee e e e u imprimes sont les Ak , pour diverses valeurs de k. e
Voici la matrice lue 4.000 1.000 0.000 1.000 4.000 1.000 0.000 1.000 4.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 4.000 1.000 0.000 0.000 0.000 1.000 4.000 0.000

Matrice apr`s 5 itrations : e e 5.326 0.497 0.000 -0.000

Version 15 janvier 2005

5.2. Mthode QR e
0.497 0.000 -0.000 0.000 4.732 0.718 0.000 -0.000 0.718 4.228 0.667 -0.000 0.000 0.667 3.312 0.326 -0.000 -0.000 0.326 2.402 -0.000 -0.000 -0.000 0.077 2.276 -0.000 -0.000 -0.000 0.000 2.268 -0.000 -0.000 -0.000 0.000 2.268

99

Matrice apr`s 10 itrations : e e 5.608 0.282 -0.000 0.000 0.282 5.035 0.298 0.000 0.000 0.298 4.064 0.158 -0.000 0.000 0.158 3.016 0.000 -0.000 -0.000 0.077 Matrice apr`s 30 itrations : e e 5.731 0.021 -0.000 0.000 0.021 5.001 0.003 0.000 0.000 0.003 4.000 0.000 -0.000 0.000 0.000 3.000 0.000 -0.000 -0.000 0.000 Matrice apr`s 40 itrations : e e 5.732 0.005 -0.000 0.000 0.005 5.000 0.000 0.000 0.000 0.000 4.000 0.000 -0.000 -0.000 0.000 3.000 0.000 0.000 -0.000 0.000

La mthode QR a fait lobjet de beaucoup dtudes et il existe des techniques varies e e e dacclration de la convergence. Elle ne converge pas toujours. En voici un exemple : ee
Voici la matrice lue 0.000 7.000 -6.000 -1.000 4.000 0.000 0.000 2.000 -2.000 Matrice apr`s 5 itrations : e e 2.080 9.004 3.937 -0.016 -0.156 -2.993 -0.000 -0.322 0.076 ... Matrice apr`s 40 itrations : e e 2.000 -6.261 7.612 -0.000 -0.800 0.131 0.000 2.750 0.800 Matrice apr`s 45 itrations : e e 2.000 9.058 3.885 -0.000 -0.098 -2.954 -0.000 -0.335 0.098 Matrice apr`s 50 itrations : e e 2.000 -6.261 7.612 -0.000 -0.800 0.131

Version 15 janvier 2005

100
0.000 2.750 0.800

Chapitre 5. Valeurs et vecteurs propres

Matrice apr`s 55 itrations : e e 2.000 9.058 3.885 -0.000 -0.098 -2.954 -0.000 -0.335 0.098

Notons que cette matrice a deux valeurs propres de mme module, donc ne vrie pas e e les hypoth`ses du thor`me! e e e

5.3
5.3.1

Valeurs propres de matrices tridiagonales


Enonc : valeurs propres de matrices tridiagonales e
matrice carre symtrique tridiagonale e e b2 0 0 . . a 2 b3 . .. . 0 b 3 a3 .. .. . . b
n

telle que bi = 0 pour i = 2, . . . , n. On note pr (x) = dt (Ar xIr ), o` Ir est la matrice e u unit dordre r, le polynme caractristique de la matrice e o e a 1 b2 0 .. . b2 Ar = .. .. . . br 0 b r ar et on pose p0 (x) = 1. 1. Vrier que p1 (x) = a1 x et e pr (x) = (ar x)pr1 (x) b2 pr2 (x) r 2rn

Soit n 1 un entier. On consid`re une e a1 b2 A= 0 . . . 0

bn

an

2. Dmontrer que pour 2 r n, les zros des pr (x) sont rels, simples et que e e e x1 < y1 < x2 < y2 < < yr1 < xr o` x1 , . . . , xr sont les zros de pr (x) et y1 , . . . , yr1 sont les zros de pr1 (x), et donner u e e une majoration des valeurs absolues des zros de pr (x) en fonction des lments de Ar . e ee 3. Ecrire une procdure qui calcule les valeurs propres de la matrice A en calculant e successivement des valeurs approches des zros des polynmes pr (x), pour r = 1, . . . , n. e e o Version 15 janvier 2005

5.3. Valeurs propres de matrices tridiagonales Exemple numrique : e 0 0 0 1 4

101

4 1 A = 0 0 0

1 5 2 0 0

0 2 3 1 0

0 0 1 1 1

4. Quelles sont les modications a apporter dans le cas o` lun des coecients bi dans ` u la matrice A serait nul? 5. On suppose que la matrice tridiagonale A est de plus dnie positive. Dmontrer e e quil existe alors une matrice triangulaire infrieure L telle que A = L tL (On note tM e la transpose dune matrice M ). e 6. On suppose de plus que les valeurs propres de A sont distinctes. On dnit une e suite Ar de matrices par A1 = A et Ar+1 = tLr Lr o` Lr est une matrice triangulaire u infrieure telle que Ar = Lr tLr . Dmontrer que Ar est tridiagonale symtrique. On e e e montre que Ar tend vers une matrice diagonale lorsque r tend vers linni. Ecrire une procdure qui calcule la suite Ar de matrices pour une matrice A tridiagonale symtrique e e dnie positive et comparer la diagonale aux valeurs propres obtenues dans lexemple e numrique ci-dessus. e

5.3.2
Soient

Solution : valeurs propres de matrices tridiagonales


a1 b2 a2 b3 0 b3 a3 .. . 0 .. .. . . 0 . . . 0 b
n

pour 1 r n. On note pr (x) = dt (Ar xIr ), o` Ir est la matrice unit dordre r, e u e le polynme caractristique de la matrice et on pose p0 (x) = 1. On suppose que les br o e sont non nuls. Proposition 5.3.1. On a p1 (x) = a1 x et pr (x) = (ar x)pr1 (x) b2 pr2 (x) r 2rn

b2 A= 0 . . . 0

bn

an

b Ar = 2 0

a1

b2 .. .

0 .. .. . .

br

br ar

De plus, les zros des pr (x) sont rels, simples et pour 2 r n, e e x1 < y1 < x2 < y2 < < yr1 < xr o` x1 , . . . , xr sont les zros de pr (x) et y1 , . . . , yr1 sont les zros de pr1 (x). u e e Version 15 janvier 2005

102

Chapitre 5. Valeurs et vecteurs propres

Preuve. La formule de rcurrence sur les polynmes pr sobtient en dveloppant le e o e dterminant par rapport a sa derni`re ligne. Quant a la proprit dentrelacement des e ` e ` ee zros, elle est un cas particulier de la proposition 7.1.5. e Pour majorer les zros, on peut utiliser par exemple lingalit de Hadamard qui arme, e e e rappelons-le, que, pour toute matrice A = (ai,j ) dordre n et toute valeur propre , on a
n

|| max

1jn

i=1

|ai,j |

Lorsquun des lments br de la matrice est nul, la matrice se dcompose par blocs et ee e on est ramen a deux sous-probl`mes de taille plus petite. e` e

5.3.3

Programme : calcul par dichotomie

Une premi`re faon de calculer les valeurs propres de A, consiste a calculer les zros de e c ` e pn . Pour cela, on doit dabord en calculer les coecients, puis en localiser les zros. Nous e allons voir deux mthodes pour ce faire : une premi`re, par dichotomie et une deuxi`me, e e e fonde sur les suites de Sturm. Nous avons vu et nous verrons dautres mthodes pour e e calculer les valeurs propres sans passer par le polynme caractristique. o e Les relations de rcurrence de la proposition 5.3.1 permettent de calculer immdiatement e e les coecients des polynmes pr . Nous utilisons librement la biblioth`que de manipulao e tion de polynmes dcrite dans lannexe A. Voici une ralisation : o e e
PROCEDURE PolynomeCaracteristique (r: integer; a, b: real; p1, p2: pol; VAR p: pol); Calcule p(x) = (a x)p1 (x) b2 p2 (x). Les degrs de p, p1 , p2 sont respectivement r, e r 1 et r 2. VAR i: integer; BEGIN p := PolynomeNul; p[0] := a * p1[0] - sqr(b) * p2[0]; FOR i := 1 TO r DO p[i] := a * p1[i] - p1[i - 1] - sqr(b) * p2[i] END; { de "PolynomeCaracteristique" }

Les polynmes sont rangs dans une table de type : o e


TYPE SuitePol = ARRAY[0..OrdreMax] OF pol;

Ceci est fait par la procdure : e


PROCEDURE LesPolynomesCaracteristiques (n: integer; a, b: vec; VAR p: SuitePol);

Version 15 janvier 2005

5.3. Valeurs propres de matrices tridiagonales

103

Calcule la suite des polynmes pr , pour r = 0, . . . , n. Le dernier est le polynme cao o ractristique de la matrice. e VAR r: integer; BEGIN p[0] := PolynomeUnite; p[0] = 1. p[1] := PolynomeNul; p[1] = a[1] X. p[1][0] := a[1]; p[1][1] := -1; FOR r := 2 TO n DO PolynomeCaracteristique(r, a[r], b[r], p[r - 1], p[r - 2], p[r]); END; { de "LesPolynomesCaracteristiques" }

Pour calculer les zros de ces polynmes, et en particulier ceux de pn , on suppose que e o bi = 0 pour i = 2, . . . , n et on utilise la dmarche suivante : si lon conna les zros de e t e pr1 , soit z1 , . . . , zr1 et si, de plus, on conna un minorant strict z0 et un majorant t strict zr des zros de pr , on sait que le polynme pr a un et un seul zro dans chacun des e o e intervalles ouverts ]zk1 , zk [, pour k = 1, . . . , r. En particulier, les signes de pr (zk1 ) et de pr (zk ) sont opposs et on peut donc appliquer la mthode de recherche dichotomique e e du zro de pr dans cet intervalle. On utilise pour cela la procdure ci-dessous. Elle fait e e appel a la procdure Valeurd(d, p, x) qui value le polynme p de degr d au point ` e e o e x et qui permet dacclrer les calculs (voir la discussion dans lannexe A). ee
FUNCTION ZeroParDichotomie (a, b: real; p: pol): real; On sait que p(a)p(b) < 0 et quil ny a quun seul zro de p dans lintervalle [a, b]. On le e calcule par dichotomie et on sarrte lorsque |a b| < . e VAR Va, Vb, Vm, m: real; d: integer; BEGIN d := degre(p); Va := Valeurd(d, p, a); Vb := Valeurd(d, p, b); WHILE NOT EstNul(a - b) DO BEGIN m := (a + b) / 2; Vm := Valeur(d, p, m); IF Va * Vm < 0 THEN BEGIN b := m; Vb := Vm END ELSE BEGIN a := m; Va := Vm END END; ZeroParDichotomie := a END; { de "ZeroParDichotomie" }

Par commodit, nous dnissons le nouveau type vec0 qui a une coordonne supple e e e mentaire, dindice 0, par rapport au type vec. Version 15 janvier 2005

104
TYPE vec0 = ARRAY[0..OrdreMax] OF real;

Chapitre 5. Valeurs et vecteurs propres

La procdure suivante calcule les zros de p (supposs tous rels), en connaissant pour e e e e chaque zro un encadrement. e
PROCEDURE LesZerosParDichotomie (r: integer; I: vec0; p: pol; VAR z: vec0); Calcule les zros du polynme p de degr r. On suppose que p a exactement un zro e o e e dans lintervalle ]Ik1 , Ik [, pour 1 k r et que p prend des valeurs de signes opposs e aux bornes de cet intervalle. On calcule ce zro et on le range dans zk . e VAR k: integer; BEGIN FOR k := 1 TO r DO z[k] := ZeroParDichotomie(I[k - 1], I[k], p) END; { de "LesZerosParDichotomie" }

Il ne reste donc plus qu` calculer des majorants. Pour cela, on utilise lingalit de a e e Hadamard qui arme que le rayon spectral (cest-`-dire le module maximal des valeurs a propres) dune matrice A = (ai,j ) est major par e
n 1in

max

j=1

|ai,j |

On calcule lexpression pour chaque matrice Ar . Notons-la dr ; on sait alors que les zros de pr sont compris entre dr et dr . La procdure que voici calcule les majorants. e e n Le nombre s est, a tout moment, le maximum des ` j=1 |ai,j | pour 1 i r 1. Evidemment, rmax calcule le maximum de deux rels. e
PROCEDURE MajorantsParHadamard (n: integer; a, b: vec; VAR d: vec); VAR k: integer; s: real; BEGIN d[1] := abs(a[1]); d[2] := abs(b[2]) + rMax(abs(a[1]), abs(a[2])); s := abs(a[1]) + abs(b[2]); FOR k := 3 TO n DO BEGIN s := rmax(s, abs(b[k - 1]) + abs(a[k - 1]) + abs(b[k])); d[k] := rmax(s, abs(b[k]) + abs(a[k])) END; END; { de "MajorantsParHadamard" }

Ces procdures, mises ensemble, donnent nalement la procdure recherche, qui calcule e e e directement les valeurs propres par valuation du polynme caractristique et recherche e o e de ses zros : e
PROCEDURE ValeursPropresParDichotomie (n: integer; a, b: vec; VAR vp: vec); Calcule les valeurs propres dune matrice tridiagonale symtrique dordre n. La diagonale e est dans le vecteur a, la sous-diagonale dans b. On suppose quaucun coecient de b nest nul. Les valeurs propres sont ranges dans vp. e

Version 15 janvier 2005

5.3. Valeurs propres de matrices tridiagonales


VAR r: integer; tp: SuitePol; z: vec0; d: vec; BEGIN LesPolynomesCaracteristiques(n, a, b, tp); MajorantsParHadamard(n, a, b, d); z[1] := a[1]; FOR r := 2 TO n DO BEGIN z[0] := -d[r]; z[r] := d[r]; LesZerosParDichotomie(r, z, tp[r], z); END; FOR r := 1 TO n DO vp[r] := z[r] END; { de "ValeursPropresParDichotomie" }

105

Les polynmes p r . o Calcul des majorants. Le seul zro de p1 . e Mise en place des majorants. Calcul des zros de p r . e

Recopie des rsultats. e

Voici un exemple de droulement, avec quelques impressions intermdiaires : e e


Donner lordre n : Donner la diagonale 4 5 3 1 4 Donner la sous-diagonale 1 2 1 1 Voici la matrice lue 4.000 1.000 0.000 1.000 5.000 2.000 0.000 2.000 3.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 1.000 1.000 0.000 0.000 0.000 1.000 4.000 5

Pour r = 2 Le polyn^me est : o X^2 - 9.000 X + 19.000 Les intervalles de localisation sont : -6.000 4.000 6.000 et les zros du polyn^me sont : e o 3.382 5.617 Pour r = 3 Le polyn^me est : o - X^3 + 12.000 X^2 - 42.000 X + 41.000 Les intervalles de localisation sont : -8.000 3.382 5.617 8.000 et les zros du polyn^me sont : e o 1.638 3.833 6.529 Pour r = 4 Le polyn^me est : o X^4 - 13.000 X^3 + 53.000 X^2 - 74.000 X + 22.000

Version 15 janvier 2005

106
Les intervalles de localisation sont : -8.000 1.638 3.833 6.529 8.000 et les zros du polyn^me sont : e o 0.402 2.145 3.883 6.569

Chapitre 5. Valeurs et vecteurs propres

Pour r = 5 Le polyn^me est : o - X^5 + 17.000 X^4 - 104.000 X^3 + 274.000 X^2 - 276.000 X + 47.000 Les intervalles de localisation sont : -8.000 0.402 2.145 3.883 6.569 8.000 et les zros du polyn^me sont : e o 0.211 2.028 3.847 4.340 6.572 Les valeurs propres sont 0.211 2.028 3.847 4.340 6.572 Le polyn^me caractristique est o e - X^5 + 17.000 X^4 - 104.000 X^3 + 274.000 X^2 - 276.000 X + 47.000 On p( p( p( p( p( a 0.21077 2.02791 3.84672 4.34024 6.57180 ) ) ) ) ) = 0.05816 = -0.01254 = 0.00564 = -0.00692 = 0.10053

Notons la grande taille des coecients du polynme caractristique. Ce phnom`ne est o e e e encore plus frappant dans lexemple suivant :
Donner lordre n : Donner la diagonale 4 4 4 4 4 Donner la sous-diagonale 1 1 1 1 Voici la matrice lue 4.000 1.000 0.000 1.000 4.000 1.000 0.000 1.000 4.000 0.000 0.000 1.000 0.000 0.000 0.000 Les valeurs propres sont 2.268 3.000 4.000 0.000 0.000 1.000 4.000 1.000 5.000 0.000 0.000 0.000 1.000 4.000 5.731 5

Le polyn^me caractristique est o e - X^5 + 20.000 X^4 - 156.000 X^3 + 592.000 X^2 - 1091.000 X + 780.000 On p( p( p( p( p( a 2.268 3.000 4.000 5.000 5.731 ) ) ) ) ) = 0.00411 = -0.00099 = 0.00082 = -0.00106 = 0.00889

Version 15 janvier 2005

5.3. Valeurs propres de matrices tridiagonales

107

5.3.4

Programme : calcul par suites de Sturm

La suite de polynmes dnie par o e p0 (X) = 1 p1 (X) = a1 X pr (X) = (ar X)pr1 b2 pr2 (X) r

2r

vrie les hypoth`ses de la proposition 7.1.5. Il en rsulte directement que chaque p n (X) e e e a n zros rels simples. La suite est aussi une suite de Sturm par la proposition 7.1.6. e e Avec les notations de la section 7.1, le nombre de zros de pn dans lintervalle ] , ] e est gal a e ` V (pn , . . . , p0 ; ) V (pn , . . . , p0 ; ) Notons W () ce nombre. La fonction W () cro de 0 a n lorsque varie de t ` a . Pour dterminer les zros de pn et donc les valeurs propres cherches, on est donc ` e e e ramen au calcul des points de discontinuit de W . e e Soient x1 < . . . < xn les zros de pn . Au voisinage de xi , on a W () = i 1, si xi e et W () = i, si > xi . Lalgorithme sera donc le suivant : partant dun intervalle [, ] tel que W () = i 1 et W () = i, on proc`de par dichotomie en coupant lintervalle e en deux intervalles [, ] et [, ] jusqu` obtenir un intervalle de longueur susamment a petite. Selon que W () = i 1 ou non, cest le premier ou le second des deux intervalles qui est conserv. e La valeur initiale de est fournie par une majoration du rayon spectral de la matrice. Comme valeur initiale de on prendra lextrmit suprieure de lintervalle de litration e e e e prcdente et au dpart loppos de la majoration du rayon spectral. e e e e La procdure suivante est proche de celle de mme nom de la section 7.1. Le calcul de e e la variation de la suite de Sturm en un point est fait frquemment. Cest pourquoi les e carrs b2 ne sont valus quune seule fois et rangs dans un tableau b2. On obtient : e r e e e
FUNCTION Variation (n: integer; VAR a, b2: vec; x: real): integer; Calcule la variation V (x) au point x. VAR i, s, changements: integer; p, q, r: real; BEGIN changements := 0; Compteur de changements de signe. p := 1; Initialisation p = a0 . s := 1; Signe de p = a0 . r := 0; FOR i := 1 TO n DO BEGIN q := (a[i] - x) * p - b2[i] * r; q = pi (x). r := p; p := q; IF signe(q) = -s THEN BEGIN Ainsi, on saute les termes nuls. s := -s;

Version 15 janvier 2005

108

Chapitre 5. Valeurs et vecteurs propres


changements := changements + 1 END; END; Variation := changements END; { de "Variation" }

Lalgorithme dichotomique scrit alors comme suit : e


PROCEDURE ZeroParVariation (i, n, VMoinsInfini: integer; VAR a, b2: vec; VAR alpha, beta: real); Calcul de la i-i`me valeur propre. e VAR gamma: real; BEGIN WHILE NOT EstNul(alpha - beta) DO BEGIN gamma := (alpha + beta) / 2; IF Variation(n, a, b2, gamma) - VMoinsInfini = i - 1 THEN alpha := gamma ELSE beta := gamma END; END; { de "ZeroParVariation" }

Le calcul important est celui du nombre W () = V () V (). Selon la valeur de ce nombre, on rduit lextrmit gauche ou lextrmit droite de lintervalle. La procdure e e e e e e prcdente est mise en uvre par : e e
PROCEDURE ValeursPropresParVariation (n: integer; a, b: vec; VAR vp: vec); VAR i, r: integer; b2: vec; infini, alpha, beta: real; VMoinsInfini: integer; BEGIN b2[1] := 0; FOR i := 2 TO n DO b2[i] := sqr(b[i]); infini := MajorantRayonSpectral(n, a, b); VMoinsInfini := Variation(n, a, b2, -infini); beta := -infini; FOR r := 1 TO n DO BEGIN alpha := beta; beta := infini; ZeroParVariation(r, n, VMoinsInfini, a, b2, alpha, beta); vp[r] := (alpha + beta) / 2; END; END; { de "ValeursPropresParVariation" }

La majoration du rayon spectral sobtient en utilisant lingalit de Hadamard : e e Version 15 janvier 2005

5.3. Valeurs propres de matrices tridiagonales


FUNCTION MajorantRayonSpectral (n: integer; a, b: vec): real; VAR k: integer; s: real; BEGIN s := abs(a[1]) + abs(b[2]); FOR k := 2 TO n - 1 DO s := rMax(s, abs(b[k]) + abs(a[k]) + abs(b[k + 1])); MajorantRayonSpectral := rMax(s, abs(b[n]) + abs(a[n])); END; { de "MajorantRayonSpectral" }

109

Voici un exemple de lexcution de cette procdure, avec des impressions intermdiaires : e e e


Voici la matrice lue 4.000 1.000 0.000 1.000 5.000 2.000 0.000 2.000 3.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 1.000 1.000 0.000 0.000 0.000 1.000 4.000 gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= gamma= 0.000 4.000 2.000 1.000 0.500 0.250 0.125 0.188 0.219 0.203 0.211 0.215 0.213 0.212 W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= W(gamma)= 0 3 1 1 1 1 0 0 1 0 0 1 1 1

r=1 alpha= -8.000 beta= 8.000 alpha= 0.000 beta= 8.000 alpha= 0.000 beta= 4.000 alpha= 0.000 beta= 2.000 alpha= 0.000 beta= 1.000 alpha= 0.000 beta= 0.500 alpha= 0.000 beta= 0.250 alpha= 0.125 beta= 0.250 alpha= 0.188 beta= 0.250 alpha= 0.188 beta= 0.219 alpha= 0.203 beta= 0.219 alpha= 0.211 beta= 0.219 alpha= 0.211 beta= 0.215 alpha= 0.211 beta= 0.213 Intervalle : 0.21094 0.21191 r=2 alpha= alpha= ... alpha= alpha= Intervalle r=3 alpha= alpha= ... alpha= alpha= 0.212 0.212 beta= beta= 8.000 4.106

gamma= gamma= gamma= gamma=

4.106 2.159 2.028 2.029

W(gamma)= W(gamma)= W(gamma)= W(gamma)=

3 2 1 2

2.026 beta= 2.030 2.028 beta= 2.030 : 2.02774 2.02869 2.029 2.029 3.845 3.847 beta= beta= beta= beta= 8.000 5.014 3.848 3.848

gamma= gamma= gamma= gamma=

5.014 3.522 3.847 3.847

W(gamma)= W(gamma)= W(gamma)= W(gamma)=

4 2 2 2

Version 15 janvier 2005

110
Intervalle : 3.84735 3.84807 r=4 alpha= alpha= ... alpha= alpha= Intervalle r=5 alpha= alpha= ... alpha= alpha= Intervalle 3.848 3.848 beta= beta= 8.000 5.924 gamma= gamma= gamma= gamma=

Chapitre 5. Valeurs et vecteurs propres

5.924 4.886 4.342 4.341

W(gamma)= W(gamma)= W(gamma)= W(gamma)=

4 4 4 4

4.341 beta= 4.343 4.341 beta= 4.342 : 4.34071 4.34122 4.341 6.171 beta= beta= 8.000 8.000

gamma= gamma= gamma= gamma=

6.171 7.085 6.573 6.572

W(gamma)= W(gamma)= W(gamma)= W(gamma)=

4 5 5 4

6.571 beta= 6.574 6.571 beta= 6.573 : 6.57168 6.57257 4.341

Voici les valeurs propres 0.211 2.028 3.848

6.572

5.4

Mthode LR de Rutishauser e

Dans cette section, nous prsentons une mthode, tr`s simple a mettre en uvre, pour e e e ` calculer les valeurs propres dune matrice, lorsquelles sont toutes relles. Les preuves e de convergence sont dlicates et nous renvoyons a la littrature pour tous les aspects e ` e thoriques. e Soit n 1 un entier, et soit A une matrice carre relle dordre n dont les valeurs propres e e sont relles. La mthode de Rutishauser est fonde sur la dcomposition LU , que nous e e e e avons dcrite au chapitre 3 (et que Rutishauser appelle LR, do` le nom). On supposera e u en particulier que toutes les matrices considres poss`dent une dcomposition LU . On e e e e dnit alors une suite de matrices (Ak ) par A1 = A et e Ak+1 = Uk Lk (Ak = Lk Uk )

o` le couple (Lk , Uk ) est la dcomposition LU de Ak , cest-`-dire que Lk est unitrianguu e a laire infrieure, et Uk est triangulaire suprieure. On peut montrer que, sous certaines e e hypoth`ses, les suites (Lk ) et (Uk ) convergent et que Lk tend vers la matrice unit dordre e e n; alors Uk tend vers une matrice U dont la diagonale contient les valeurs propres de A. La mise en uvre de cet algorithme est particuli`rement simple et cest le cas que nous e considrons lorsque la matrice A est, d`s le dpart, tridiagonale. En eet, comme nous e e e lavons vu au chapitre 4, la dcomposition LU est alors tr`s facile a crire et lopration e e `e e complmentaire, qui a partir dune dcomposition A = LU calcule A = U L, lest encore e ` e plus; comme la matrice A est a nouveau tridiagonale, le processus peut continuer. ` Version 15 janvier 2005

5.4. Mthode LR de Rutishauser e Une matrice tridiagonale A scrit sous la forme e a 1 b1 0 c2 a 2 b2 0 .. .. .. . . . 0 A= . . cn2 an2 . c
n1

111

...

0 . . .

bn2 an1 cn

Lidentication donne v = b et u1 = a1 , et

donc est reprsente conomiquement par les trois vecteurs a, b, c. Si A = LU , les e e e matrices L et U sont aussi tridiagonales; plus prcisment, posons e e 1 0 u1 v 1 0 u2 v 2 2 1 .. .. 1 3 A = LU = . . .. .. . . vn1 0 1 0 un n
i = ci /ui1 ui = ai i bi1

0 bn1 an

pour i = 2, . . . , n. Ainsi, la dcomposition LU est reprsente de faon compacte par les e e e c trois vecteurs , u et v. De plus, v = b. Rappelons la procdure suivante : e
PROCEDURE DecompositionLUtridiagonal (n: integer; a, b, c: vec; VAR u, l: vec);

du chapitre 4 qui calcule la dcomposition LU dune matrice tridiagonale. La recompoe sition, qui calcule la matrice tridiagonale U L, est ralise par e e
PROCEDURE ULTridiagonal (n: integer; u, l: vec; VAR a, b, c: vec); VAR i: integer; BEGIN FOR i := 1 TO n - 1 DO a[i] := u[i] + b[i] * l[i + 1]; a[n] := u[n]; FOR i := 2 TO n DO c[i] := u[i] * l[i]; END; { de "ULTridiagonal" }

Ainsi, ltape qui consiste a passer de Ak a Ak+1 scrit simplement : e ` ` e


PROCEDURE IterationLUTridiagonal (n: integer; VAR a, b, c: vec); VAR u, l: vec; BEGIN DecompositionLUTridiagonal(n, a, b, c, u, l);

Version 15 janvier 2005

112
ULTridiagonal(n, u, l, a, b, c); END; { de "IterationLUTridiagonal" }

Chapitre 5. Valeurs et vecteurs propres

Un bon crit`re pour larrt des itrations porte sur la norme innie de la sous-diagonale, e e e cest-`-dire du vecteur c, puisquil doit tendre vers 0. a Mentionnons deux cas particuliers. Le premier concerne les matrices (tridiagonales) sous forme de Lanczos (cest-`-dire telles que la sur-diagonale a tous ses coecients gaux a e a 1). Dans ce cas, la dcomposition et la recomposition sont encore plus simples. La ` e procdure de dcomposition a t donne au chapitre 4. Voici son en-tte : e e ee e e
PROCEDURE LanczosLU (n: integer; a, c: vec; VAR u, l: vec);

La recomposition se fait par :


PROCEDURE LanczosUL (n: integer; u, l: vec; VAR a, c: vec); VAR i: integer; BEGIN FOR i := 1 TO n - 1 DO a[i] := u[i] + l[i + 1]; a[n] := u[n]; FOR i := 2 TO n DO c[i] := u[i] * l[i]; END; { de "LanczosUL" }

Comme ci-dessus, une itration de la mthode de Rutishauser pour ces matrices combine e e les deux procdures. e
PROCEDURE IterationLULanczos (n: integer; VAR a, c: vec); VAR u, l: vec; BEGIN LanczosLU(n, a, c, u, l); LanczosUL(n, u, l, a, c); END; { de "IterationLULanczos" }

Le deuxi`me cas est plutt une variante. Si A est une matrice dnie positive, on peut, e o e au lieu de faire une dcomposition LU , faire la dcomposition de Choleski A = L tL (qui e e nest pas LU puisque la matrice L na pas ncessairement des 1 sur la diagonale). On e peut alors itrer lapplication e A = L tL A = tL L L` encore, la nouvelle matrice est tridiagonale si A lest et elle est bien sr dnie a u e positive. Sil y a convergence, L tend vers une matrice diagonale et on obtient donc dans L tL une matrice diagonale forme des valeurs propres de A. Plus prcisment, si e e e Version 15 janvier 2005

5.4. Mthode LR de Rutishauser e lon pose a1 b1 A= 0 b1 a2 b2 0 b2 .. . .. . .. . bn1 an d1


2

113

0 d2
3

et

bn1

L=

d3 .. .

..

. dn

on obtient, par identication, d1 = a1 i = bi1 /di1 di = a i 2 i Maintenant, soit A = tLL. Alors

i = 2, . . . , n

et on obtient

a1 b1 A = 0 ai = d 2 + i bi = di+1 an = d 2 n

b1 a2 b2

0 b2 .. . .. . bn1 .. . bn1 an

2 i+1 i+1

i = 1, . . . , n 1

Sur le mme schma que ci-dessus, on a donc les trois procdures suivantes : e e e
PROCEDURE CholeskiTridiagonal (n: integer; a, b: vec; VAR d, l: vec);

Cette procdure a dj` t donne au chapitre 4. e eae e e


PROCEDURE TridiagonalCholeski (n: integer; d, l: vec; VAR a, b: vec); VAR i: integer; BEGIN FOR i := 1 TO n - 1 DO BEGIN a[i] := sqr(l[i + 1]) + sqr(d[i]); b[i] := d[i + 1] * l[i + 1]; END; a[n] := sqr(d[n]); END; { de "TridiagonalCholeski" }

Ces deux procdures sont combines en e e Version 15 janvier 2005

114

Chapitre 5. Valeurs et vecteurs propres

PROCEDURE IterationCholeski (n: integer; VAR a, b: vec); VAR d, l: vec; BEGIN CholeskiTridiagonal(n, a, b, d, l); TridiagonalCholeski(n, d, l, a, b); END; { de "IterationCholeski" }

Voici quelques rsultats numriques : e e


Donner lordre n : 5 Donner la diagonale 4 4 4 4 4 Donner la sous-diagonale 1 1 1 1 Voici la matrice lue 4.000 1.000 0.000 1.000 4.000 1.000 0.000 1.000 4.000 0.000 0.000 1.000 0.000 0.000 0.000

0.000 0.000 1.000 4.000 1.000

0.000 0.000 0.000 1.000 4.000

Nous appliquons a cette matrice tridiagonale, qui est a la fois une matrice de Lanczos ` ` et une matrice dnie positive, les deux mthodes correspondantes. e e
Lanczos Itrations e 10 20 30 40 50 60 70 80 Choleski Itrations e 10 20 30 40 50 60 70 80 Diagonale 4.732 4.228 5.035 4.064 5.025 4.008 5.008 4.001 5.002 4.000 5.001 4.000 5.000 4.000 5.000 4.000 Diagonale 4.732 4.228 5.035 4.064 5.025 4.008 5.008 4.001 5.002 4.000 5.001 4.000 5.000 4.000 5.000 4.000 Norme sous-diagonale 0.51508206 0.08852942 0.02442379 0.00663863 0.00172361 0.00044166 0.00011277 0.00002877 Norme sous-diagonale 0.71769243 0.29753917 0.15628137 0.08147795 0.04151653 0.02101571 0.01061958 0.00536382

5.326 5.608 5.697 5.723 5.730 5.731 5.732 5.732

3.312 3.016 3.001 3.000 3.000 3.000 3.000 3.000

2.402 2.276 2.268 2.268 2.268 2.268 2.268 2.268

5.326 5.608 5.697 5.723 5.730 5.731 5.732 5.732

3.312 3.016 3.001 3.000 3.000 3.000 3.000 3.000

2.402 2.276 2.268 2.268 2.268 2.268 2.268 2.268

On obtient les mmes rsultats en sensiblement le mme nombre ditrations. Ce nombre e e e e est considrable, mais chaque itration demande tr`s peu de calculs. Voici une autre e e e matrice symtrique : e Version 15 janvier 2005

5.4. Mthode LR de Rutishauser e


Donner lordre n : Donner la diagonale 4 5 3 1 4 Donner la sous-diagonale 1 2 1 1 Voici la matrice lue 4.000 1.000 0.000 1.000 5.000 2.000 0.000 2.000 3.000 0.000 0.000 1.000 0.000 0.000 0.000 Tridiagonale Itrations e 10 20 30 40 50 60 70 80 90 100 110 Choleski Itrations e 10 20 40 60 80 100 120 160 200 6.461 6.572 6.572 6.572 6.572 6.572 6.572 6.572 6.572 Diagonale 4.012 4.170 3.992 4.197 4.253 3.935 4.332 3.857 4.340 3.848 4.341 3.847 4.341 3.847 4.341 3.847 4.341 3.847 2.146 2.028 2.028 2.028 2.028 2.028 2.028 2.028 2.028 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.211 6.461 6.572 6.572 6.572 6.572 6.572 6.572 6.572 6.572 6.572 6.572 Diagonale 4.012 4.170 3.992 4.197 4.134 4.055 4.253 3.935 4.311 3.877 4.332 3.857 4.338 3.850 4.340 3.848 4.341 3.848 4.341 3.847 4.341 3.847 2.146 2.028 2.028 2.028 2.028 2.028 2.028 2.028 2.028 2.028 2.028 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.211 0.000 0.000 1.000 1.000 1.000 0.000 0.000 0.000 1.000 4.000 5

115

Norme sous-diagonale 0.28426918 0.02520046 0.02966949 0.01782500 0.00696057 0.00227160 0.00069793 0.00021045 0.00006310 0.00001889 0.00000565 Norme sous-diagonale 0.53316951 0.22450070 0.18881191 0.06740393 0.02051641 0.00614636 0.00183871 0.00016451 0.00001472

Notes bibliographiques
Louvrage de rfrence sur les mthodes de calcul des valeurs propres est : ee e J. H. Wilkinson, The Algebraic Eigenvalue Problem, Oxford, Clarendon Press, 1965. De nombreux complments se trouvent dans : e G. H. Golub, C. F. van Loan, Matrix Computations, Baltimore, John Hopkins University Press, 1985. Version 15 janvier 2005

116 Voir galement : e

Chapitre 5. Valeurs et vecteurs propres

P. G. Ciarlet, Introduction a lanalyse numrique matricielle et a loptimisation, Paris,Masson, ` e ` 1988, et le volume dexercices correspondant, de : P. G. Ciarlet, B. Miara et J.-M. Thomas, Paris, Masson, 1987. Un expos orient vers la programmation, avec de nombreux programmes, est : e e W. H. Press, B. P. Flannery, S. A. Teukolsky, W. T. Vetterling, Numerical Recipes, Cambridge, Cambridge University Press, 1988.

Version 15 janvier 2005

117

Chapitre 6

Matrices en combinatoire
6.1
6.1.1

Matrices unimodulaires
Enonc : matrices unimodulaires e

Soient p et q des entiers positifs. Dans tout le probl`me, A = (aij )1ip,1jq dsigne e e une matrice relle dordre (p, q) a coecients 0, 1 ou 1. Une sous-matrice de A est une e ` matrice de la forme A = (aij )iI,jJ , o` I {1, , p} et J {1, , q}. u On dit que A est unimodulaire si et seulement si A est de rang p et si toutes les sousmatrices carres dordre (p, p) ont un dterminant gal a 0, 1 ou 1. On dit que A est e e e ` totalement unimodulaire si et seulement si le dterminant de toutes les sous-matrices e carres de A vaut 0, 1 ou 1. e 1. Ecrire une procdure qui prend en argument une matrice carre a coecients 0, 1 e e ` ou 1, et qui calcule la valeur absolue de son dterminant (on pourra supposer p, q 5). e Exemple numrique : e 1 1 1 1 1 1 1 1 1 1 1 A = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2. Ecrire une procdure qui teste si une matrice A a coecients 0, 1 ou 1 est e ` unimodulaire (on pourra supposer p 5 et q 10). Exemples numriques : tester si les matrices suivantes sont unimodulaires. e 1 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 A1 = et A2 = 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 1 Version 15 janvier 2005

118

Chapitre 6. Matrices en combinatoire

3. Dmontrer que si chaque ligne de A contient exactement un +1 et un 1 (les autres e coecients tant nuls), alors A est totalement unimodulaire. Ceci fournit des exemples e de matrices totalement unimodulaires. 4. Dmontrer que A est totalement unimodulaire si et seulement si la matrice e a21 (A, Ip ) = . . . ap1 a
11

a12 a22 . . . ap2

. . . a1q . . . a2q . .. . . . . . . apq

1 0 . . . 0

0 ... 1 ... . .. . . . 0 ...

est unimodulaire.

0 0 . . . 1

5. Ecrire une procdure qui teste si A est totalement unimodulaire (on pourra supposer e p, q 5). Exemples numriques : tester si les matrices A1 et A2 ci-dessus sont totalement e unimodulaires. Pour 1 j q, on note Cj la j-i`me colonne de A. Une partie K de {1, . . . , q} est dite e quilibre dans A sil existe des sous-ensembles disjoints K1 et K2 de K, dunion K et e e tels que les coecients du vecteur colonne Ck Ck
kK2

kK1

soient gaux a 0, 1 ou 1. On dit quune matrice A est quilibre si toute partie K de e ` e e {1, . . . , q} est quilibre dans A. e e 6. On se propose de dmontrer que toute matrice quilibre est totalement unimodue e e laire. Soit A une matrice quilibre. e e a) Dmontrer que les coecients de A sont gaux a 0, 1 ou 1. e e ` b) Soit k un entier tel que 1 k min(p, q) 1. On suppose que les sous-matrices carres dordre k de A ont un dterminant gal a 0, 1 ou 1. Soit B = (b ij )iI,jJ une e e e ` sous-matrice carre dordre k + 1, de dterminant d non nul. Dmontrer que la matrice e e e B = dB 1 est a coecients 0, 1 ou 1. ` c) Soit b = (b1,j )jJ la premi`re colonne de B . Dmontrer quil existe un vecteur e e x = (xj )jJ a coecients 0, 1 ou 1 tel que xj bj mod 2 pour tout j et tel que ` e Bx = t ( 1, 0, . . . , 0 ). En dduire que |d| = 1.
k fois

d) Dmontrer que A est totalement unimodulaire. e 7. Soient I1 , . . . , Ip des intervalles de R et soient x1 , . . . , xq des nombres rels distincts. e Dmontrer que la matrice A dnie par e e aij = est quilibre. e e Version 15 janvier 2005 1 si xj Ii 0 si xj Ii /

6.1. Matrices unimodulaires

119

8. On dit quune matrice A a coecients gaux a 0, 1 ou 1 est lmentaire si, pour ` e ` ee 1 i p, la i-i`me ligne de A a exactement deux coecients non nuls, ai,f (i) et ai,g(i) . e a) Dmontrer quune matrice lmentaire A est quilibre si et seulement si lensemble e ee e e {1, . . . , q} peut tre partag en deux classes J1 et J2 telles que e e Cj =
jJ1 jJ2

Cj

b) En dduire quune matrice lmentaire A est quilibre si et seulement si lensemble e ee e e {1, . . . , q} peut tre partag en deux classes de faon que, pour tout i, les colonnes e e c dindice f (i) et g(i) soient dans la mme classe si et seulement si ai,f (i) et ai,g(i) sont e de signes distincts. 9. Dcrire un algorithme qui utilise le crit`re donn en (8b) pour tester si une matrice e e e lmentaire est quilibre. Ecrire la procdure correspondante. (La procdure devra ee e e e e pouvoir tester des matrices dordre (p, q) lorsque p, q < 10). Remarque (hors nonc). On peut en fait dmontrer la rciproque de la question 6 : e e e e toute matrice totalement unimodulaire est quilibre. e e

6.1.2

Solution : matrices unimodulaires

Soient p et q des entiers positifs. Dans toute la suite, A = (aij )1ip,1jq dsigne une e matrice relle dordre (p, q) a coecients 0, 1 ou 1. Une sous-matrice de A est une e ` matrice de la forme A = (aij )iI,jJ o` I {1, , p} et J {1, , q}. u On dit que A est unimodulaire si et seulement si A est de rang p et si toutes les sousmatrices carres dordre (p, p) ont un dterminant gal a 0, 1 ou 1. On dit que A est e e e ` totalement unimodulaire si et seulement si le dterminant de toutes les sous-matrices e carres de A vaut 0, 1 ou 1. e

Les matrices unimodulaires et totalement unimodulaires, outre leur intrt combinae e toire, sont tr`s utilises en programmation linaire en nombres entiers (recherche des e e e solutions en nombres entiers de syst`mes dinquations linaires a coecients entiers). e e e ` Ces matrices admettent de tr`s nombreuses caractrisations dont nous donnons deux e e exemples ci-dessous. Dun point de vue algorithmique, tester si une matrice est totalement unimodulaire semble requrir a priori un temps exponentiel en fonction de la taille e de la matrice (lalgorithme suggr dans le probl`me, qui constitue une amlioration e e e e par rapport a lalgorithme le plus na est nanmoins exponentiel). Il existe cependant ` f, e un algorithme polynomial pour ce probl`me, dcouvert par Seymour. Il sagit l` dun e e a rsultat tr`s dicile, fond sur un thor`me de dcomposition qui permet de dcrire e e e e e e e toutes les matrices totalement unimodulaires a laide doprations lmentaires en par` e ee tant de matrices particuli`res. e Pour nous familiariser avec les matrices totalement unimodulaires, le mieux est den donner tout de suite quelques exemples. Version 15 janvier 2005

120

Chapitre 6. Matrices en combinatoire

Proposition 6.1.1. Si chaque ligne de A contient exactement un +1 et un 1 (les autres coecients tant nuls), alors A est totalement unimodulaire. e Preuve. Dmontrons par rcurrence sur n que toute sous-matrice carre dordre n de e e e A a un dterminant gal a 0, 1 ou 1. Cest clair si n = 1. Prenons une sous-matrice e e ` carre dordre n. Si lune des lignes est nulle, le dterminant vaut 0. Si lune des lignes e e contient un seul coecient non nul, on peut dvelopper le dterminant par rapport a e e ` cette ligne et on conclut par rcurrence. Reste le cas o` toutes les lignes contiennent au e u moins (et donc exactement) deux coecients non nuls, qui sont ncessairement 1 et 1. e Dans ce cas la somme des colonnes est nulle et le dterminant est nul. e Le calcul (cf. la partie programme) dmontre que les deux matrices e talement unimodulaires : 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 B1 = 0 1 1 1 0 et B2 = 1 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 suivantes sont to1 0 1 1 0 1 0 0 1 1

Ces deux matrices jouent un rle tr`s important dans le thor`me de dcomposition de o e e e e Seymour voqu plus haut. Le lien entre matrices unimodulaires et totalement unimoe e dulaires est prcis ci-dessous : e e Proposition 6.1.2. Une matrice A est totalement unimodulaire si et seulement si la matrice a a12 . . . a1q 1 0 . . . 0 11 a21 a22 . . . a2q 0 1 . . . 0 (A, Ip ) = . . . . .. . . .. . . . . . . . . . . . . . . ap1 ap2 . . . apq 0 0 . . . 1 est unimodulaire. Preuve. Supposons A totalement unimodulaire et soit B = (A, Ip ). Il est clair que B est de rang p. Dautre part, si C est une sous-matrice carre de taille (p, p) de B, son e dterminant est celui dune sous-matrice de A : pour le voir, il sut de dvelopper le e e dterminant suivant les colonnes de C dindice suprieur ou gal a p. Comme A est e e e ` totalement unimodulaire, ce dterminant est gal a 0, 1 ou 1. e e ` Rciproquement, supposons B unimodulaire et soit e ai1 ,j1 . . . ai1 ,jr . . .. . A = . . . . air ,j1 . . . air ,jr une sous-matrice carre de A dordre (r, r). Considrons la matrice carre dordre (p, p) e e e a1,j1 . . . a1,jr 1 0 . . . 0 . . .. . B = . . . . ap,j1 . . . ap,jr 0 0 ... 1 Version 15 janvier 2005

6.1. Matrices unimodulaires

121

o`, pour i = 1, . . . , p r, la r + i-i`me colonne de B contient un 1 en position r + i, j u e o` j est le i-i`me lment de lensemble (ordonn) {1, . . . , p} \ {i1 , . . . , ir }, et des zros u e ee e e ailleurs. Par exemple, si {i1 , i2 , i3 } = {2, 4, 7} et si p = 7, on a a1,j1 a1,j2 a1,j3 1 0 0 0 a2,j1 a2,j2 a2,j3 0 0 0 0 a3,j1 a3,j2 a3,j3 0 1 0 0 B = a4,j1 a4,j2 a4,j3 0 0 0 0 a5,j1 a5,j2 a5,j3 0 0 1 0 a6,j1 a6,j2 a6,j3 0 0 0 1 a7,j1 a7,j2 a7,j3 0 0 0 0 La matrice B a mme dterminant que A et comme B est unimodulaire, ce dterminant e e e vaut 0, 1 ou 1.

Nous en venons aux caractrisations les plus intressantes des matrices totalement unie e modulaires, dont nous ne donnerons quune dmonstration tr`s partielle. Commenons e e c par une dnition commode. Pour 1 j q, on note Cj la j-i`me colonne de A. Une e e partie K de {1, . . . , q} est dite quilibre dans A sil existe des sous-ensembles disjoints e e K1 et K2 de K, dunion K, et tels que les coecients du vecteur colonne
kK1

Ck

Ck
kK2

soient gaux a 0, 1 ou 1. On dit quune matrice A est quilibresi toute partie K de e ` e e {1, . . . , q} est quilibre dans A. e e Proposition 6.1.3. Soit A une matrice. Les conditions suivantes sont quivalentes : e (1) A est totalement unimodulaire, (2) A est quilibre, e e (3) A est a coecients 0, 1 ou 1 et ne contient aucune sous-matrice carre de ` e dterminant 2 ou 2. e Nous dmontrerons seulement que toute matrice quilibre est totalement unimodulaire. e e e Preuve. Soit A une matrice quilibre. Montrons par rcurrence sur k que les souse e e matrices carres dordre k de A ont un dterminant gal a 0, 1 ou 1. e e e ` Si on prend J = {j}, on a ncessairement {J1 , J2 } = {J, } et donc les coecients de la e colonne Cj sont gaux a 0, 1 ou 1. Supposons le rsultat acquis pour les sous-matrices e ` e de taille infrieure ou gale a k, avec 1 k min(p, q) 1, et soit B = (b ij )iI,jJ une e e ` sous-matrice carre dordre k + 1, de dterminant d non nul. Posons B = dB 1 . Cette e e matrice est la transpose de la matrice des cofacteurs de B. Comme les dterminants e e de tous les mineurs dordre k sont gaux a 0, 1 ou 1, les coecients de B sont e ` gaux a 0, 1 ou 1. Soit b = (bj )jJ la premi`re colonne de B . On a donc Bb = de1 e ` e o` e1 = t ( 1, 0, . . . , 0 ). On pose u
k fois

K = {k J | bk = 0} Version 15 janvier 2005

122

Chapitre 6. Matrices en combinatoire

Puisque A est quilibre, il existe des sous-ensembles disjoints K1 et K2 de K, dunion e e K, et tels que les coecients du vecteur colonne Ck Ck
kK2

kK1

soient gaux a 0, 1 ou 1. Soit x = (xk )kJ le vecteur dni par e ` e xk = 1 si k K1 , 1 si k K2 , 0 si k K /

Par construction, on a, quel que soit k J, xk bk mod 2 et donc aussi (Bx)k (Bb)k mod 2. Dautre part Bx =
kK

C k xk =
kK1

Ck

Ck
kK2

est a coecients 0, 1 ou 1. Il en rsulte que les k derniers coecients de Bx sont ` e ncessairement nuls. De plus, comme B est inversible, b nest pas nul, x nest pas nul e et donc Bx nest pas nul. Par consquent, Bx est gal soit a e1 , soit a e1 et on a e e ` ` B Bx = dx = B e1 . Comme les vecteurs x et B e1 sont a coecients 0, 1 ou 1, on ` a ncessairement |d| = 1, ce qui conclut la dmonstration par rcurrence. e e e La proposition 6.1.3 permet de donner dautres exemples de matrices totalement unimodulaires. Proposition 6.1.4. Soient I1 , . . . , Ip des intervalles de R et soient x1 , . . . , xq des nombres rels distincts. Alors la matrice A dnie par e e aij = est quilibre. e e Preuve. Soit K une partie de {1, . . . , q}. On numrote les rels xk pour k K dapr`s e e e leur position sur la droite et on pose K1 = {k | xk est de rang pair} et K2 = {k | xk est de rang impair}. Quel que soit k {1, . . . , q}, le vecteur b=
kK1

1 si xj Ii 0 si xj Ii /

Ck

Ck
kK2

est a coecients 0, 1 ou 1. En eet bk reprsente le nombre de points de rang pair ` e contenus dans le segment Ik , moins le nombre de points de rang impair contenus dans Ik . Ce nombre est donc toujours gal a 0, 1 ou 1. e ` Version 15 janvier 2005

6.1. Matrices unimodulaires

123

On se propose maintenant de dcrire toutes les matrices totalement unimodulaires cone tenant exactement deux coecients non nuls dans chaque ligne (la proposition 6.1.1 fournit des exemples de telles matrices). On dira quune matrice A a coecients 0, 1 ou ` 1 est lmentaire si, pour 1 i p, la i-i`me ligne de A a exactement deux coecients ee e non nuls, que lon notera ai,f (i) et ai,g(i) . Proposition 6.1.5. Une matrice lmentaire A est quilibre si et seulement si lenee e e semble {1, . . . , q} peut tre partag en deux classes J1 et J2 telles que e e Cj =
jJ1 jJ2

Cj

(1.1)

Preuve. Dmontrons dabord quune matrice lmentaire quilibre A vrie (1.1). Puise ee e e e que A est quilibre, lensemble {1, . . . , q} peut tre partag en deux classes J 1 et J2 e e e e telles que Cj Cj
jJ1 jJ2

soit a coecients 0, 1 ou 1. Mais puisque A est lmentaire, la somme des coecients ` ee de chaque ligne est congrue a 0 modulo 2. Donc ` Cj =
jJ1 jJ2

Cj

Rciproquement, si une matrice lmentaire vrie (1.1), lensemble {1, . . . , q} peut tre e ee e e partag en deux classes J1 et J2 telles que (1.1) soit vri. Soit J une partie de {1, . . . , q} e e e et posons J1 = J J1 et J2 = J J2 . Alors le vecteur V =
jJ1

Cj

Cj
jJ2

est a coecients 0, 1 ou 1. En eet, xons un indice i. Si Card(J {f (i), g(i)}) 2, ` alors |Vi | 1. Supposons maintenant que J contient f (i) et g(i). Si f (i) et g(i) sont de signe contraire, alors ils sont ncessairement dans la mme classe (J1 ou J2 ), car sinon, e e |Vi | = 2. Donc Ci = 0 dans ce cas. Si f (i) et g(i) sont de mme signe, ils sont, par le e mme argument, dans deux classes direntes et l` encore, Vi = 0. e e a Corollaire 6.1.6. Une matrice lmentaire A est quilibre si et seulement si lenee e e semble {1, . . . , q} peut tre partag en deux classes de faon que, pour tout i, les colonnes e e c dindice f (i) et g(i) soient dans la mme classe si et seulement si ai,f (i) et ai,g(i) sont e de signes distincts. Preuve. On vient de voir que f (i) et g(i) sont de signe contraire si et seulement si ils sont dans la mme classe. e On peut dmontrer directement quune matrice vriant (1.1) est totalement unimoe e dulaire. Soient J1 et J2 les deux classes de {1, . . . , q}. Multiplions toutes les colonnes Version 15 janvier 2005

124

Chapitre 6. Matrices en combinatoire

dindice dans J1 par 1. La matrice B obtenue est totalement unimodulaire si et seulement si A est totalement unimodulaire. Dmontrons que B contient exactement un +1 e et un 1 par ligne. En eet, soit i un indice de colonne. Si ai,f (i) et ai,g(i) ont mme e signe, ils sont dans deux classes distinctes et donc bi,f (i) et bi,g(i) auront des signes dirents. Si maintenant ai,f (i) et ai,g(i) ont des signes dirents, f (i) et g(i) sont dans e e la mme classe et donc ou bien ai,f (i) et ai,g(i) ne changent pas de signe, ou bien ils e changent de signe simultanment. Dans les deux cas, bi,f (i) et bi,g(i) auront des signes e dirents. Dapr`s la proposition 6.1.1, B, et donc A, est totalement unimodulaire. e e Le corollaire 6.1.6 permet de donner un algorithme ecace pour tester si une matrice lmentaire est quilibre. Cet algorithme sera dcrit dans la section suivante. ee e e e

6.1.3

Programme : Matrices unimodulaires

Le programme fait appel aux biblioth`ques General et Matrices. En particulier, on e utilisera le type vecE = ARRAY[1..OrdreMax] OF integer dj` dclar dans General. ea e e On dnit de faon analogue un type spcial pour les matrices a coecients entiers : e c e `
TYPE matE = ARRAY[1..OrdreMax] OF vecE;

On adapte les procdures dentre-sortie de la biblioth`que Matrices a ce nouveau type : e e e `


PROCEDURE EcrireMatE (m, n: integer; VAR a: matE; titre: texte); Achage du titre, puis de la matrice a dordre (m, n). VAR i, j: integer; BEGIN writeln; writeln(titre); FOR i := 1 TO m DO BEGIN FOR j := 1 TO n DO write(A[i, j] : 3); writeln END END; { de "EcrireMatE" }

Comme nous naurons a utiliser que des matrices a coecients 0, 1 ou 1, la procdure ` ` e dentre se simplie ainsi : e
PROCEDURE EntrerMatE (VAR m, n: integer; VAR a: matE; titre: texte); Achage du titre, puis lecture de la matrice A dordre (m, n) a coecients 0, 1 ou 1. ` Les entres sont codes par 0, + et e e VAR ch: char; i, j: integer; BEGIN writeln;

Version 15 janvier 2005

6.1. Matrices unimodulaires


writeln(titre); write(Nombre de lignes : ); readln(m); write(Nombre de colonnes : ); readln(n); FOR i := 1 TO m DO BEGIN writeln(ligne, i : 2, : ); FOR j := 1 TO n DO BEGIN readln(ch); CASE ch OF +: a[i, j] := 1; -: a[i, j] := -1; OTHERWISE a[i, j] := 0; END; END; writeln; END END; { de "EntrerMatE" }

125

Pour le calcul du dterminant, on se contente de convertir la matrice de type matE e au type mat et on utilise la procdure determinant de la biblioth`que. On pourrait e e ventuellement utiliser une autre procdure pour ne pas avoir a passer en rels (en e e ` e adaptant par exemple la procdure rcursive de calcul du dteminant, qui est ecace e e e pour des matrices carres dordre infrieur ou gal a 5). e e e `
FUNCTION det (VAR A: matE; p: integer): integer; Calcule le dterminant de A. e VAR i, j: integer; R: mat; BEGIN FOR i := 1 TO p DO FOR j := 1 TO p DO R[i, j] := A[i, j]; det := round(determinant(p, R)); END; { de "det" }

Pour tester si une matrice dordre (p, q) est unimodulaire, on calcule le dterminant de e toutes ses sous-matrices carres dordre p. Pour cela, on engendre toutes les parties a p e ` lments de lensemble {1, . . . , q}. Ces procdures sont dtailles au chapitre 8. ee e e e
CONST LongueurSuite = 12; TYPE suite = ARRAY[0..LongueurSuite] OF integer; PROCEDURE PremierePartieRestreinte (VAR x: suite; n, k: integer); PROCEDURE PartieSuivanteRestreinte (VAR x: suite; n, k: integer;

Version 15 janvier 2005

126
VAR derniere:boolean);

Chapitre 6. Matrices en combinatoire

Un sous-ensemble de p colonnes tant retenu, on extrait la sous-matrice de A correspone dante a laide de la procdure suivante : ` e
PROCEDURE ExtraitSousMatrice (SousEnsemble: suite; p, q: integer; A: matE; VAR C: matE); Extrait de A la matrice carre C dordre p obtenue en slectionnant les colonnes dindice e e i tel que SousEnsemble[i] = 1. VAR i, j, k: integer; BEGIN k := 0; FOR j := 1 TO q DO IF SousEnsemble[j] = 1 THEN BEGIN k := k + 1; FOR i := 1 TO p DO C[i, k] := A[i, j] END END; { de "ExtraitSousMatrice" }

Pour viter de faire des calculs de dterminant inutiles, on utilise une procdure qui e e e teste si une matrice ne contient pas de colonne nulle.
FUNCTION UneColonneEstNulle (A: matE; p, q: integer): boolean; Teste si A contient une colonne nulle. VAR i, j: integer; DebutColonneNul, PasDeColonneNulle: boolean; BEGIN j := 0; PasDeColonneNulle := true; WHILE (j < q) AND PasDeColonneNulle DO BEGIN j := j + 1; i := 0; DebutColonneNul := true; WHILE (i < p) AND DebutColonneNul DO BEGIN i := i + 1; DebutColonneNul := A[i, j] = 0 END; PasDeColonneNulle := NOT DebutColonneNul; END; UneColonneEstNulle := NOT PasDeColonneNulle END; { de "UneColonneEstNulle" }

Tout est en place et on teste maintenant facilement si une matrice est unimodulaire a ` laide de la procdure suivante : e
FUNCTION EstUnimodulaire (A: matE; p, q: integer): boolean;

Version 15 janvier 2005

6.1. Matrices unimodulaires


Teste si A est unimodulaire. VAR d, i: integer; LeRangEstp, CetaitLaDerniere: boolean; C: matE; SousEnsemble: suite; BEGIN IF UneColonneEstNulle(A, p, q) OR (q < p) THEN Si q < p, la matrice ne peut tre unimodulaire. e EstUnimodulaire := false ELSE BEGIN PremierePartieRestreinte(SousEnsemble, q, p); LeRangEstp := false; REPEAT ExtraitSousMatrice(SousEnsemble, p, q, A, C); d := Det(C, p); Si on trouve une sous-matrice de rang p, le rang vaut p. LeRangEstp := d <> 0; PartieSuivanteRestreinte(SousEnsemble, q, p, CetaitLaDerniere) UNTIL (abs(d) > 1) OR CetaitLaDerniere; EstUnimodulaire := LeRangEstp AND (abs(d) <= 1) END END; { de "EstUnimodulaire" }

127

Le test pour les matrices totalement unimodulaires est encore plus simple a programmer ` et repose sur la proposition 6.1.2.
FUNCTION EstTotalementUnimodulaire (A: matE; p, q: integer): boolean; Teste si A est totalement unimodulaire. On se contente de tester si la matrice [A, I] est unimodulaire VAR i, j: integer; BEGIN FOR i := 1 TO p DO FOR j := q + 1 TO q + p DO A[i, j] := 0; FOR i := 1 TO p DO A[i, q + i] := 1; EstTotalementUnimodulaire := EstUnimodulaire(A, p, p + q); END; { de "EstTotalementUnimodulaire" }

Dans le cas des matrices lmentaires, le corollaire 6.1.6 permet de donner un algorithme ee ecace pour tester si une matrice est totalement unimodulaire. On commence par coder la i`me ligne dune matrice lmentaire par le triplet (f (i), g(i), ), o` vaut 1 si a i,f (i) e ee u et ai,g(i) ont mme signe et vaut 1 sinon. On construit ensuite le graphe tiquet sur e e e lensemble {1, . . . , q} dont les artes sont les triplets (f (i), , g(i)). Chaque ligne de la e matrice dnit une arte, chaque colonne un sommet. Par exemple, si on part de la e e Version 15 janvier 2005

128 matrice

Chapitre 6. Matrices en combinatoire 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1


1 5 4 + 2 + + 3

on obtient le graphe de la gure 6.1.1.

0 1 A= 0 0 0

Figure 6.1.1: Le graphe associ a la matrice A. e` La procdure qui suit permet de raliser ce codage : e e
PROCEDURE Conversion (A: matE; p, q: VAR i, j: integer; BEGIN FOR i := 1 TO p DO BEGIN j := 1; WHILE A[i, j] = 0 DO j := j + 1; M[i, 1] := j; j := j + 1; WHILE A[i, j] = 0 DO j := j + 1; M[i, 2] := j; M[i, 3] := -A[i, M[i, 1]] * END; END; { de "Conversion" } integer; VAR M: MatElementaire);

j = f (i).

j = g(i). A[i, M[i, 2]];

Il sagit de savoir si lon peut attacher a chaque sommet du graphe une tiquette +1 ou ` e 1 compatible avec ltiquetage des artes. De faon plus prcise, il faut que pour toute e e c e arte (i, , j) du graphe, on ait la relation e tiquette(i) = tiquette(j) e e A cet eet, on part de ltiquetage qui attribue ltiquette +1 a chaque sommet et on e e ` modie cet tiquetage en examinant lune apr`s lautre les artes du graphe (cest-`-dire e e e a Version 15 janvier 2005

6.1. Matrices unimodulaires

129

les lignes de la matrice). On tient simultanment a jour une fonction Pere de lensemble e ` des sommets dans lui-mme, dont le rle intuitif est de mmoriser la suite des dductions. e o e e
TYPE Chaque ligne dune matrice lmentaire est dtermine, au signe pr`s, par le triplet ee e e e (f (i), g(i), ). LigneElementaire = ARRAY[1..3] OF integer; Une matrice lmentaire est reprsente par un vecteur de LigneElementaire. ee e e MatElementaire = ARRAY[1..OrdreMax] OF LigneElementaire; FUNCTION ElementaireEstTU (VAR M: MatElementaire; p, q: integer): boolean; Teste si une matrice lmentaire est totalement unimodulaire. ee VAR Pere, Signe: vecE; i1, i2, j, s: integer; b: boolean; Il sagit de tester si on peut dcomposer les colonnes en deux classes. On utilise un e algorithme Union-Find modi. e BEGIN b := true; FOR j := 1 TO q DO Initialisation des fonctions P`re et Signe. e BEGIN Pere[j] := 0; Signe[j] := 1; END; j := 0; WHILE (j < p) AND b DO BEGIN j := j + 1; i1 := M[j, 1]; i2 := M[j, 2]; s := M[j, 3]; Signe. WHILE pere[i1] > 0 DO BEGIN s := s * Signe[i1]; i1 := pere[i1]; END; WHILE pere[i2] > 0 DO BEGIN s := s * Signe[i2]; i2 := pere[i2]; END; IF i1 <> i2 THEN BEGIN Signe[i2] := s; pere[i2] := i1 END ELSE b := s = 1; END; Elementaire := b; END; { de "ElementaireEstTU" }

Version 15 janvier 2005

130

Chapitre 6. Matrices en combinatoire

Sur lexemple prcdent, le droulement pas a pas du programme donne le rsultat e e e ` e suivant (on note Ancetre la fonction obtenue par itration de la fonction Pere) : e
j = 1 i1 = 2 Ancetre(i1) = 2 j = 2 i1 = 1 Ancetre(i1) = 1 j = 3 i1 = 4 Ancetre(i1) = 2 j = 4 i1 = 3 Ancetre(i1) = 3 j = 5 i1 = 3 Ancetre(i1) = 3 i2 = 4 Ancetre(i2) = 4 i2 = 5 Ancetre(i2) = 5 i2 = 5 Ancetre(i2) = 1 i2 = 4 Ancetre(i2) = 2 i2 = 5 Ancetre(i2) = 3 s = 1 s = -1 s = 1 s = 1 s = -1

La matrice nest pas totalement unimodulaire

Voici quelques rsultats numriques. Le dterminant de la matrice A de lnonc est gal e e e e e e a 16. Les deux matrices A1 et A2 de lnonc sont totalement unimodulaires. ` e e

6.2
6.2.1

Matrices irrductibles e
Enonc : matrices irrductibles e e

Soit n 1 un entier, et S = {1, . . . , n}. On note M lensemble des matrices carres, e dordre n, a coecients dans {0, 1}. Soit A = (ai,j ) M et soient i, j S. Un chemin ` de i vers j de longueur m 0 (dans A) est une suite (i0 , . . . , im ) dlments de S telle ee que i0 = i, im = j et aik1 ,ik = 1 pour k = 1, . . . , m. Un cycle autour de i est un chemin de i vers i de longueur non nulle. Un lment i S est cyclique sil existe un cycle ee autour de i. Sur lensemble M, on dnit une addition note et une multiplication note , comme e e e suit : soient A, B, C, D M. Alors C = (ci,j ) = A B est dnie par e ci,j = et D = (di,j ) = A B est dnie par e di,j = 0 si ai,k bk,j = 0 pour tout k S 1 sinon 0 si ai,j = bi,j = 0 1 sinon

On dnit la puissance Ak par A0 = I (I est la matrice unit) et Ak+1 = A Ak e e (k) pour k 0. On note ai,j llment dindice (i, j) de Ak . ee 1. Ecrire deux procdures qui, tant donnes deux matrices A et B dans M, calculent e e e respectivement AB et AB. Ecrire une procdure qui prend en argument une matrice e A et qui calcule (I A)n1 . Version 15 janvier 2005

6.2. Matrices irrductibles e 1 0 Exemple numrique : n = 5 et A = 0 e 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0

131

On dit que j est accessible de i sil existe un chemin de i vers j.

2. Montrer quil existe un chemin de i vers j si et seulement si llment dindice (i, j) ee de la matrice (I A)n1 est gal a 1. e `

3. Ecrire une procdure qui prend en argument un entier i S et qui calcule, pour e chaque lment j qui est accessible de i, un chemin de i vers j. ee Mme exemple numrique, avec i = 1. e e 4. Ecrire une procdure qui calcule les lments cycliques de S et qui ache un cycle e ee pour chacun de ces lments. Exemple numrique de la question 1. ee e Une matrice A M est dite acyclique si lensemble de ses lments cycliques est vide. ee 5. Montrer que A est acyclique si et seulement si An = 0. 6. On suppose dans cette question que A est acyclique. On appelle rang de i S lentier r(i) = max{m | il existe un chemin vers i de longueur m} Ecrire une procdure qui calcule le rang e 0 0 0 Exemple numrique : n = 6 et A = e 0 1 0 des 1 0 1 0 1 0 lments ee 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 de S. 0 0 1 0 0 0

7. On appelle priode dun lment cyclique i S de A et on note d(i), le pgcd des e ee (k) entiers k > 0 tels que ai,i = 1. Montrer que si i est accessible de j et j est accessible de i, alors d(i) = d(j). On note U la matrice de M dont tous les coecients sont gaux a 1. Une matrice A M e ` est irrductible si (I A)n1 = U , elle est primitive sil existe un entier k 0 tel que e Ak = U . Si A est primitive, le plus petit entier k tel que Ak = U est not (A). e 8. a) Montrer quune matrice primitive est irrductible. e b) Une matrice est apriodique si elle poss`de un lment cyclique de priode 1. Montrer e e ee e quune matrice irrductible et apriodique est primitive. e e 9. Montrer que si A est primitive et symtrique, alors (A) 2(n 1). e 10. Montrer quune matrice de permutation nest pas primitive si n > 1. Caractriser e les matrices de permutation qui sont irrductibles. e Version 15 janvier 2005

132

Chapitre 6. Matrices en combinatoire

11. On suppose n > 1. Soit A une matrice primitive. Pour i S, on pose hi = min{k N | ai,j = 1 pour tout j S} a) Montrer que (A) = max{h1 , . . . , hn }. b) Soit s la longueur du plus court cycle de A. Montrer que (A) n + s(n 2). c) Montrer que (A) n2 2n + 2. d) Donner, pour chaque valeur de n, un exemple dune matrice A telle que (A) = n2 2n + 2.
(k)

6.2.2

Solution : matrices irrductibles e

Soit n 1 un entier, et S = {1, . . . , n}. On note M lensemble des matrices carres, e dordre n, a coecients dans {0, 1}. Soit A = (ai,j ) M et soient i, j S. Un chemin ` de i vers j de longueur m 0 (dans A) est une suite (i0 , . . . , im ) dlments de S telle ee que i0 = i, im = j et aik1 ,ik = 1 pour k = 1, . . . , m. Un cycle autour de i est un chemin de i vers lui-mme de longueur non nulle. Un lment i S est cyclique sil existe un e ee cycle autour de i. Cette terminologie est inspire de la thorie des graphes : un graphe est un couple e e (S, U ), o` S est un ensemble de sommets et U S S un ensemble darcs. La matrice u A = (ai,j ) M dnie par ai,j = 1 si et seulement si (i, j) U est appele la matrice e e dadjacence du graphe. Rciproquement, toute matrice A M dnit un graphe. e e Sur lensemble M, on dnit une addition note et une multiplication note , comme e e e suit : soient A, B, C, D M. Alors C = (ci,j ) = A B est dnie par e ci,j = et D = (di,j ) = A B est dnie par e di,j = 0 si ai,k bk,j = 0 pour tout k S 1 sinon 0 si ai,j = bi,j = 0 1 sinon

(On peut considrer les matrices de M a coecients boolens; laddition est alors le e ` e ou boolen et la multiplication le et ; les formules ci-dessus reviennent a tendre e `e ces oprations aux matrices.) Il rsulte immdiatement de la dnition que laddition e e e e est idempotente : A A = A, que la matrice identit est neutre pour la multiplication e et que la multiplication est distributive par rapport a laddition. Lensemble M, muni ` de ces deux oprations, est un semi-anneau. e On dnit la puissance Ak par A0 = I (I est la matrice unit) et Ak+1 = A Ak e e (k) k pour k 0. On note ai,j llment dindice (i, j) de A . Lidempotence de laddition ee entra que ne (I A)k = I A A2 Ak (2.1) Lemme 6.2.1. Soient i, j dans S ; il existe un chemin de i vers j de longueur k si et (k) seulement si ai,j = 1. Version 15 janvier 2005

6.2. Matrices irrductibles e


(k)

133

existe S tel que ai, = a ,j = 1, donc par rcurrence si et seulement sil existe un e , un chemin de i a de longueur k 1 et un arc de a j. ` ` Corollaire 6.2.2. Il existe un chemin de i vers j si et seulement si le coecient dindice (i, j) de la matrice (I A)n1 est gal a 1. e `

Preuve. Le lemme est vident pour k = 0. Soit k 1. Alors ai,j = 1 si et seulement sil e
(k1)

Preuve. La condition est videmment susante, en vertu de (2.1). Rciproquement, e e sil existe un chemin de i vers j, il en existe aussi un de longueur au plus n 1, en supprimant les cycles ventuels. e On dit que j est accessible de i sil existe un chemin de i vers j. Pour dterminer les e lments accessibles, il sut donc de calculer la matrice (I A)n1 ; les lments ee ee accessibles a partir de i sont les indices de colonnes des coecients non nuls sur la ligne ` dindice i. Une matrice A M est dite acyclique si lensemble de ses lments cycliques est vide. ee Proposition 6.2.3. Une matrice A est acyclique si et seulement si An = 0. Preuve. Si A est acyclique, tous les chemins ne contiennent que des lments distincts ee et sont donc de longueur au plus n 1 et par consquent An = 0. Rciproquement, e e si A contient un cycle, elle contient un cycle de longueur k n, donc des chemins de toute longueur suprieure ou gale a k et par consquent An = 0. e e ` e Soit i un lment cyclique de S et soit K(i) = {k > 0 | ai,i = 1} lensemble des ee longueurs des cycles de i a i. On appelle priode dun lment cyclique i S de A et on ` e ee note d(i), le pgcd des lments de K(i). Ce pgcd d(i) est en fait le pgcd dun nombre ee ni dlments de K(i) : considrons en eet la suite des pgcds dune numration des ee e e e lments de K(i); cette suite est dcroissante, donc est stationnaire a partir dun certain ee e ` rang. La priode est indpendante de llment choisi sur le cycle. e e ee Proposition 6.2.4. Si i est accessible de j et j est accessible de i, alors d(i) = d(j). Preuve. Soit K(i) = {k > 0 | ai,i = 1} lensemble des longueurs des cycles de i a i. ` Montrons que d(j) divise tout k K(i) (do` il dcoule que d(j) divise d(i)). u e Soit en eet k K(i) et soient p et q les longueurs de chemins de j a i et de i a j ` ` respectivement. Alors p + q et p + k + q appartiennent a K(j), donc sont divisibles par ` d(i); la dirence de ces deux nombres, soit k, est aussi divisible par d(j). e On note U la matrice de M dont tous les coecients sont gaux a 1. e ` Une matrice A carre dordre n (` coecients complexes) est rductible sil existe une e a e partition {1, . . . , n} = I J telle que ai,j = 0 pour i I et j J. Elle est irrductible e dans le cas contraire. Cette condition se vrie simplement lorsque A est dans M. e Proposition 6.2.5. Une matrice A de M est irrductible si et seulement si elle vrie e e (I A)n1 = U . Version 15 janvier 2005
(k) (k)

134

Chapitre 6. Matrices en combinatoire

Preuve. Si A est rductible, il existe un couple (i, j) dlments de S tels quil ny e ee ait pas de chemin de i vers j, donc la matrice B = (I A)n1 nest pas gale a U . e ` Rciproquement, si B = (bi,j ) = U , soient i, j tels que bi,j = 0. On a i = j. Soient alors e J = {k S | bk,j = 1} et I = S \ J. Supposons quil existe i I et j J tels que bi ,j = 1, donc quil existe un chemin de i vers j ; comme il existe un chemin de j vers j, il existe donc un chemin de i vers j, donc i J, ce qui est impossible. Une matrice A est primitive sil existe un entier k 0 tel que Ak = U . Bien entendu, une matrice primitive est a fortiori irrductible et la rciproque nest pas vraie, comme e e le montre la matrice 0 1 1 0 Plus gnralement, une matrice de permutation nest jamais primitive d`s que n > e e e 1, puisque toute puissance na quun seul 1 par ligne. En revanche, une matrice de permutation est irrductible si et seulement si la permutation est forme dun seul cycle. e e Considrons un autre exemple. Une matrice est apriodique si elle poss`de un lment e e e ee cyclique i de priode d(i) = 1. Notons que cela nimplique pas lexistence dun cycle de e longueur 1. Proposition 6.2.6. Une matrice irrductible et apriodique est primitive. e e Preuve. On montre dabord quil existe un entier N tel que pour tout i, lensemble K(i) contienne tous les entiers suprieurs ou gaux a N . e e ` Soit i S de priode 1. Nous montrons dabord que, pour tout entier assez grand, il e existe un cycle de longueur de i a i. Soit K(i) lensemble des longueurs des cycles de ` i a i. La priode d(i) est le pgcd dun nombre ni dlments de K(i). Par lidentit de ` e ee e Bezout, il existe k1 , . . . , kr K(i) et 1 , . . . , r Z tels que
r

1=
t=1

r k r

Posons a=
r >0

r k r

b=

r k r
r <0

Alors a b = 1. On pose N = b2 . Tout entier m N scrit, par division euclidienne e par b, sous la forme m = ub + v, avec 0 v < b et b u, do` u m = ua + v = ub + v(a b) = (u v)b + va Or a, b K(i), donc m K(i). Ainsi, K(i) contient tous les entiers suprieurs ou gaux e e a N. ` Soient maintenant p, q dans S. Soit Np la longueur dun chemin de p vers i et soit M (q) la longueur dun chemin de i vers q. Ces chemins existent parce que A est irrductible. e Il existe donc un chemin de p vers q de longueur L(p, q) = N (p) + N + M (q) et en fait de Version 15 janvier 2005

6.2. Matrices irrductibles e

135

toute longueur suprieure ou gale a L(p, q). Posons L = max L(p, q). Alors pour tout e e ` p, q, il existe un chemin de p vers q de longueur L, donc AL = U . Si A est primitive, le plus petit entier k tel que Ak = U est not (A). Nous allons e tudier ce nombre. Considrons dabord un cas simple. e e Proposition 6.2.7. Si A est primitive et symtrique, alors (A) 2(n 1). e

Preuve. Si A est symtrique, alors B = A2 a ses coecients diagonaux non nuls, donc e B = I B et, comme B est irrductible, B n1 = U . e Thor`me 6.2.8. Pour toute matrice primitive A dordre n > 1, on a (A) n2 e e 2n + 2. Preuve. Pour i S, on pose hi = min{k N | ai,j = 1 pour tout j S} Comme A est irrductible, on a ai,j = 1 pour tout j S et tout h hi . Par consquent e e (A) = max{h1 , . . . , hn }. Soit s la longueur du plus court cycle de A. Nous allons montrer que (A) n+s(n2). Pour cela, montrons dabord que, pour tout i S, il existe un entier pi n s tel que, pour tout j, il y a un chemin de i vers j de longueur exactement pi + s(n 1). Dans A, il existe un chemin de longueur au plus n s de i a un des lments du cycle minimal. ` ee En eet, tout chemin sans lment rpt, partant de i et de longueur n s, contient ee e ee n s + 1 lments. Il ne peut donc viter les s lments du cycle. Notons p i la longueur ee e ee de ce chemin. Dans As , les lments du cycle ont des boucles (i. e. des cycles de longueur 1). Comme ee As est encore irrductible, il existe dans As un chemin de chacun des lments du cycle e ee a tout lment j S et, comme chacun des lments du cycle comporte une boucle, ` ee ee il existe un chemin de longueur n 1 exactement de chacun des lments du cycle a ee ` chaque lment de S. Revenons a A. Il existe donc un chemin de longueur s(n 1) de ee ` chaque lment du cycle minimal a chaque lment de S. Ceci prouve lexistence pour ee ` ee tout j, dun chemin de longueur exactement pi + s(n 1) de i vers j. Par consquent e hi pi + s(n 1) n s + s(n 1) = n + s(n 2). Il reste a prouver que s n 1. Si lon avait s = n, la matrice A serait une matrice de ` permutation, ce qui est exclu puisquune telle matrice nest pas primitive. Il nest pas dicile de voir que la matrice 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0
(h) (k)

ralise lgalit. A une permutation pr`s, cest la seule matrice qui ralise lgalit. e e e e e e e Version 15 janvier 2005

136

Chapitre 6. Matrices en combinatoire

6.2.3

Programme : matrices irrductibles e

Les matrices considres sont a coecients 0 ou 1. On peut donc choisir de les reprsenter e e ` e comme matrices a coecients entiers ou a coecients boolens. Nous choisissons la ` ` e premi`re solution, car elle va nous permettre de coder diverses informations supplmene e taires dans les lments des matrices. On dnit donc ee e
TYPE vecE = ARRAY[1..OrdreMax] OF integer; matE = ARRAY[1..OrdreMax] OF vecE;

o` OrdreMax est une constante convenable. Nous avons besoin de la matrice unit : u e
VAR MatriceEUnite: matE; Matrice prdnie. e e

Les procdures de lecture, dcriture et dinitialisation de la matrice unit sont en tout e e e point analogues a celles dj` vues pour les matrices relles. Nous ne donnons que les ` ea e en-ttes : e
PROCEDURE InitMatricesE; PROCEDURE EntrerMatriceE (n: integer; VAR a: matE; titre: texte); PROCEDURE EcrireMatriceE (n: integer; VAR a: matE; titre: texte);

Les deux oprations, notes et , se ralisent comme suit : e e e


PROCEDURE MatriceOPlusMatrice (n: integer; a, b: matE; VAR c: matE); Calcule la somme a b de deux matrices a et b dordre n. Rsultat dans la matrice c. e VAR i, j: integer; BEGIN FOR i := 1 TO n DO FOR j := 1 TO n DO c[i, j] := max(a[i, j], b[i, j]); END; {de "MatriceOPlusMatrice" } PROCEDURE MatriceOParMatrice (n: integer; a, b: matE; VAR ab: matE); Calcule le produit a b de deux matrices a et b dordre n. Rsultat dans la matrice e ab. VAR i, j, k: integer; s: integer; BEGIN FOR i := 1 TO n DO FOR j := 1 TO n DO BEGIN s := 0; FOR k := 1 TO n DO s := max(s, a[i, k] * b[k, j]); ab[i, j] := s END END; {de "MatriceOParMatrice" }

Avec ces oprations, il est facile de calculer la matrice (I A)n1 : e Version 15 janvier 2005

6.2. Matrices irrductibles e


PROCEDURE Acces (n: integer; a: matE; VAR c: matE); VAR UnPlusA: matE; i: integer; BEGIN MatriceOPlusMatrice(n, MatriceEUnite, a, UnPlusA); c := UnPlusA; FOR i := 2 TO n - 1 DO MatriceOParMatrice(n, c, UnPlusA, c); END; { de "Acces" }

137

C = I A.

Voici un exemple :
Voici la matrice a : 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 Voici la matrice dacc`s : e 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1

On voit que tous les sommets sont accessibles a partir de 1, 3 ou 4. Maintenant, con` sidrons le probl`me de calculer non seulement les lments accessibles, mais aussi un e e ee chemin pour les lments accessibles a partir dun lment i donn. Nous allons faire un ee ` ee e peu plus et calculer un chemin de longueur positive dans le cas o` i est cyclique. Pour u cela, nous calculons A A2 An et au lieu de calculer seulement cette matrice, nous allons conserver des informations supplmentaires : si i et j sont relis par un chemin de longueur p, il existe un k tel que e e (p1) ai,k = 1 et ak,j = 1. Nous conservons lentier k et savons ainsi quil existe un chemin de i vers j commenant par larc (i, k). Le codage demande une lg`re modication c e e de la matrice au dpart, pour ne pas confondre le sommet 1 avec lexistence dun arc. e Lalgorithme est ralis comme suit : e e
PROCEDURE Chemins (n: integer; a: matE; VAR c: matE); Calcule une matrice c contenant, de faon compacte, les chemins entre lments accesc ee sibles. Si ci,j = k > 0, il existe un chemin de i vers j qui commence par (i, k). Si k = 0, le chemin est rduit au couple (i, j), si k < 0, il ny a pas de chemin. e VAR i, j, k: integer; BEGIN FOR i := 1 TO n DO Diminution de tous les coecients de a.

Version 15 janvier 2005

138

Chapitre 6. Matrices en combinatoire


FOR j := 1 TO n DO a[i, j] := a[i, j] - 1; c := a; FOR k := 2 TO n DO Calcul des puissances de a. MatriceXMatriceE(n, a, c) END; { de "Chemins" }

Il utilise la procdure : e
PROCEDURE MatriceXMatriceE (n: integer; a: matE; VAR c: matE); Produit cumul de deux matrices a et c dordre n. Labsence darc est repre par un e e e nombre ngatif. Le rsultat est dans la matrice c. Si lon note c la valeur de la matrice e e a la sortie de la procdure, on a ci,j = k si ci,j < 0, ai,k 0 et ck,j 0. ` e VAR i, j, k: integer; b : matE; BEGIN b := c; FOR i := 1 TO n DO FOR j := 1 TO n DO FOR k := 1 TO n DO IF (a[i, k] >= 0) AND (b[k, j] >= 0) AND (c[i, j] < 0) THEN c[i, j] := k END; {de "MatriceXMatriceE" }

Voici un exemple de calcul :


Voici la matrice a : 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 Voici la matrice des chemins : 0 3 0 3 3 -1 5 -1 -1 0 4 0 4 0 2 0 1 1 1 1 -1 0 -1 -1 2

Notons c cette matrice des chemins. La valeur c4,2 = 1 dit quun chemin de 4 a 2 dbute ` e par (4, 1). La valeur c1,2 = 3 permet de continuer ce chemin; on obtient (4, 1, 3). Enn, c3,2 = 0, donc le chemin complet est (4, 1, 3, 2). La procdure suivante ralise ce calcul : e e
PROCEDURE CalculerChemin (i, j, n: integer; VAR c: matE; VAR longueur: integer; VAR chemin: vecE); Extrait un chemin de i vers j de la matrice c. La longueur du chemin et les sommets qui le composent sont calculs. e VAR

Version 15 janvier 2005

6.2. Matrices irrductibles e


k: integer; BEGIN IF c[i, j] < 0 THEN longueur := -1 ELSE BEGIN k := 1; chemin[k] := i; WHILE c[i, j] > 0 DO BEGIN i := c[i, j]; k := k + 1; chemin[k] := i; END; chemin[k + 1] := j; longueur := k END; END; { de "CalculerChemin" }

139

Il ny a pas de chemin.

Premier lment : i. ee Elment suivant. e

Dernier lment. ee Longueur k, et k + 1 lments. ee

Voici les rsultats obtenus avec la matrice prcdente : e e e


Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin Chemin de de de de de de de de de de de de de de de de de de de de de de de de de 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` a ` 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 1 1 1 1 2 1 3 3 3 3 5 2 4 2 2

2 3 3 3 3 3 4 4 4 4 4 5

5 4 2 4 4 2 1 1 1 1 1 2

1 1 5 3 3 3 3 2 4 2 3

Les lments cycliques et les cycles se calculent facilement sur la matrice. Il convient ee de noter que lalgorithme prsent ici, sil est simple, nest pas tr`s ecace en temps. e e e Lemploi de structures de donnes plus labores permet de calculer tous ces chemins e e e en un temps proportionnel a leur longueur. ` Version 15 janvier 2005

140

Chapitre 6. Matrices en combinatoire

Tester quune matrice est acyclique est facile. On peut calculer les rangs des lments de ee diverses mani`res : la plus simple est demployer une mthode rcursive, en observant e e e que le rang dun lment i est 1 plus le maximum des rangs des lments j tels que ee ee ai,j = 1. Voici comment on crit cette procdure : e e
FUNCTION rang (i, n: integer; VAR a: matE): integer; VAR m, j: integer; BEGIN m := 0; m est le maximum partiel. FOR j := 1 TO n DO IF a[j, i] = 1 THEN m := max(m, 1 + rang(j, n, a)); Ici calcul rcursif. e rang := m END; { de "rang" }

Comme souvent quand on a aaire a des procdures rcursives, lcriture est simple. On ` e e e peut aussi calculer les rangs en observant que le rang de i est m si m est le plus petit entier tel que Am+1 a sa i-i`me colonne nulle. On obtient la procdure suivante : e e
PROCEDURE LesRangs (n: integer; a: matE; VAR rang: vecE); VAR i, j, m, h: integer; b: matE; BEGIN FOR i := 1 TO n DO rang[i] := -1; Initialisation du tableau. b := a; B = Am+1 . FOR m := 0 TO n - 1 DO BEGIN FOR i := 1 TO n DO IF rang[i] < 0 THEN BEGIN Si le rang de i est au moins m et. . . h := 0; FOR j := 1 TO n DO h := max(h, b[j, i]); IF h = 0 THEN si la colonne dindice i est nulle, rang[i] := m alors le rang est m. END; MatriceOParMatrice(n, b, a, b) Calcul de la puissance suivante de a. END; END; { de "LesRangs" }

La procdure prsente est tr`s lente, en O(n4 ), a cause du calcul des puissances. Pour e e e e ` acclrer la dtermination des rangs, nous allons calculer, pour chaque i, le nombre d i ee e de coecients aj,i gaux a 1, pour j = 1, . . . , n. Si di = 0, le rang de i est nul. On e ` supprime alors i et on recommence. Au lieu de supprimer physiquement llment i, ee on met a jour le tableau d. Comme plusieurs lments peuvent avoir un coecient d i ` ee nul, on doit grer convenablement cet ensemble. On range ces lments dans une le ou e ee queue, reprsente par un intervalle dans un tableau. La procdure scrit comme suit : e e e e
PROCEDURE LesRangsRapides (n: integer; a: matE; VAR rang: vecE);

Version 15 janvier 2005

6.2. Matrices irrductibles e


VAR

141

SommetsEnAttente: vecE; La queue. DebutQueue, FinQueue: integer; Le dbut et la n de la queue. e i, j, s: integer; d: vecE; Le vecteur d. PROCEDURE Prendre (VAR i: integer); Prend le premier lment ee BEGIN dans la queue. i := SommetsEnAttente[DebutQueue]; DebutQueue := 1 + DebutQueue END; { de "Prendre" } PROCEDURE Inserer (i: integer); Ajoute un lment a la queue. ee ` BEGIN SommetsEnAttente[FinQueue] := i; FinQueue := 1 + FinQueue END; { de "Inserer" } FUNCTION EnAttente: boolean; Teste si la queue est vide. BEGIN EnAttente := FinQueue > DebutQueue END; { de "EnAttente" } BEGIN DebutQueue := 1; FinQueue := 1; Initialise la queue. FOR i := 1 TO n DO rang[i] := -1; Initialise le tableau des rangs. FOR i := 1 TO n DO BEGIN Calcul du tableau d. s := 0; FOR j := 1 TO n DO s := s + a[j, i]; d[i] := s; IF s = 0 THEN BEGIN inserer(i); rang[i] := 0 Des lments de rang 0. ee END; END; WHILE EnAttente DO BEGIN Sil reste des lments, ee Prendre(i); on en prend un, FOR j := 1 TO n DO IF a[i, j] = 1 THEN BEGIN on supprime les arcs, d[j] := d[j] - 1; IF d[j] = 0 THEN et si plus aucun arc narrive a j, ` inserer(j); on ajoute j a la queue. ` rang[j] := max(rang[j], 1 + rang[i]) On met a jour le rang. ` END END; END; { de "LesRangsRapides" }

Cette procdure a un temps dexcution en O(n2 ). En eet, la boucle WHILE est parcoue e rue une fois pour chaque sommet. Voici un exemple de rsultat obtenu : e
Voici la matrice 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 : 0 0 1

Version 15 janvier 2005

142
0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 :

Chapitre 6. Matrices en combinatoire

Voici les rangs rang(1) = 1 rang(2) = 2 rang(3) = 0 rang(4) = 3 rang(5) = 0 rang(6) = 1

Dans le cas o` la matrice nest pas acyclique, les deux procdures itratives se terminent, u e e alors que la procdure rcursive boucle. Dans le tableau des rangs, les lments cycliques e e ee conservent leur valeur 1 et on peut donc ainsi les trouver dune autre mani`re. e

Notes bibliographiques
Il existe une abondante littrature sur les matrices totalement unimodulaires. On pourra e consulter les chapitres 19, 20 et 21 et la bibliographie (tr`s compl`te) du livre suivant : e e A. Schrijver, Theory of Linear and Integer Programming, New-York, John Wiley and Sons, 1986 Lalgorithme utilis dans la procdure ElementaireEstTU est du type Union-Find . e e On trouvera une discussion dtaille de ce type dalgorithme dans le livre : e e R. Sedgewick, Algorithms, Reading, Addison-Wesley, 1983. Le thor`me 6.2.8 est d a Wielandt. Pour les liens entre matrices a coecients 0 et 1 e e u` ` et les graphes, on pourra consulter par exemple : C. Froidevaux, M. C. Gaudel, M. Soria, Types de donnes et algorithmes, Paris, e McGraw-Hill, 1990.

Version 15 janvier 2005

Partie II

Polynmes o

143

145

Chapitre 7

Polynmes o
7.1 Suites de Sturm

Les suites de Sturm constituent un moyen ecace pour dterminer les zros rels dun e e e polynme a coecients rels. Cette mthode est un peu lente, mais sre et est partio ` e e u culi`rement intressante lorsque lon sait par ailleurs que tous les zros sont rels. e e e e

7.1.1

Enonc : suites de Sturm e

Soit p(X) = an X n + + a0 un polynme de degr n, a coecients rels, sans zros o e ` e e multiples. On cherche a localiser les zros rels de p(X), cest-`-dire a calculer des ` e e a ` intervalles deux a deux disjoints contenant chacun un et un seul zro rel de p(X). ` e e Dans cet nonc, on appelle suite de Sturm associe a p(X) la suite de polynmes dnie e e e ` o e par p0 (X) = p(X), p1 (X) = p (X) et pi2 (X) = pi1 (X)qi1 (X) pi (X) (2 i N )

le polynme pi (X) tant le reste de la division euclidienne de pi2 (X) par pi1 (X). o e Lentier N est dtermin par pN = 0, pN +1 = 0. On pose qN (X) = pN 1 (X)/pN (X). e e Soit y un nombre rel qui nest pas un zro de p(X). La variation de p(X) en y, note e e e V (y), est le nombre de changements de signe dans la suite p0 (y), p1 (y), . . . , pN (y). Les termes nuls de cette suite sont ignors dans le dcompte. Par exemple, pour la suite 1, e e 2, 1, 0, 2, la variation est 2. On rappelle le thor`me de Sturm : e e Si a et b sont deux nombres rels tels que a < b et si p(X) ne sannule ni en a ni en b, e alors le nombre de zros rels de p(X) dans lintervalle [a, b] est V (a) V (b). e e

1. Montrer que la connaissance des quotients q1 (y), . . . , qN (y) et de pN sut pour calculer la variation V (y) de p(X) en y. Version 15 janvier 2005

146

Chapitre 7. Polynmes o

2. Ecrire une procdure qui prend en argument un polynme p et qui calcule les e o quotients q1 (X), . . . , qN (X) et pN . Ecrire une procdure qui calcule V (y) en fonction de e y. On admet que si est un zro de p, on a e || 2 max an1 an2 , an an
1/2

an3 an

1/3

,...,

a0 an

1/n

()

3. Dduire de la formule () une minoration du module des zros dun polynme q(X) e e o tel que q(0) = 0. En dduire une procdure qui, pour un zro rel x0 du polynme p(X), e e e e o calcule un rel > 0 tel que p(X) nait pas dautre zro dans lintervalle ]x0 , x0 + [. e e (On pourra faire un changement de variable dans p(X).) 4. Ecrire un programme de localisation des zros rels de p(X). Pour cela, partant e e dun intervalle [c, d], on calcule V (c) V (d); si V (c) V (d) > 1 alors on calcule V (e) pour e = (c + d)/2 et on consid`re sparment le cas o` p(e) = 0 et le cas o` p(e) = 0. e e e u u 3 2 Exemple numrique : p(X) = X 6X + 11X 6. e 5. Complter ce programme pour quil accepte des polynmes ayant des zros multie o e ples. 6. On suppose que p(X) est sans zros multiples. Dmontrer que si pi (x) = 0 pour e e un i > 0 et un rel x, alors pi1 (x)pi+1 (x) < 0. e 7. Soient a et b deux nombres rels tels que a < b et p(a)p(b) = 0. Soit x0 ]a, b[ un zro e e de p(X). Dmontrer que si > 0 est susamment petit, alors V (x0 ) V (x0 + ) = 1 e et en dduire le thor`me de Sturm. e e e

7.1.2

Solution : suites de Sturm

Donnons dabord la dnition gnrale des suites de Sturm, plus gnrale que celle de e e e e e lnonc. Soit p(X) un polynme (` coecients rels) et soient a et b deux nombres rels e e o a e e avec a < b. Une suite de polynmes o p0 , p1 , . . . , pm avec p0 = p est une suite de Sturm pour p sur [a, b] lorsque les conditions suivantes sont vries : e e (i) p(a)p(b) = 0; (ii) la fonction polynme pm ne sannule pas sur [a, b]; o (iii) si pj (c) = 0 pour un c ]a, b[ et pour un indice j tel que 0 < j < m, alors pj1 (c)pj+1 (c) < 0 On considrera le plus souvent des suites qui vrient la condition supplmentaire : e e e (iv) si p(c) = 0 pour un c ]a, b[, alors p(x)p1 (x)(x c) > 0 au voisinage de c, Version 15 janvier 2005

7.1. Suites de Sturm

147

ou la condition oppose : e (iv) si p(c) = 0 pour un c ]a, b[, alors p(x)p1 (x)(c x) > 0 au voisinage de c. A une suite de Sturm et a un point y de lintervalle ]a, b[, on associe la variation de la ` suite en y, nombre not V (p0 , . . . , pm ; y) ou plus simplement V (y), qui est le nombre e de changements de signes dans la suite de nombres p0 (y), . . . , pm (y). Les termes nuls de cette suite sont ignors dans le dcompte. Soit (a0 , . . . , am ) une suite de nombres rels; e e e on dnit e C(a0 , . . . , am ) = Card{(i, j) | 0 i < j m, ai aj < 0 et ak = 0 si i < k < j} Par exemple, C(1, 2, 1, 0, 2) = 2. Avec cette notation, V (p0 , . . . , pm ; y) = V (y) = C(p0 (y), . . . , pm (y))

Thor`me 7.1.1. Soit p un polynme a coecients rels et soient a et b deux nombres e e o ` e rels tels que a < b. Soit p0 , . . . , pm une suite de Sturm pour p sur [a, b] et posons e r+ = Card{c [a, b] | p(c) = 0 et p(x)p1 (x)(x c) > 0 au voisinage de c} r = Card{c [a, b] | p(c) = 0 et p(x)p1 (x)(c x) > 0 au voisinage de c} Alors V (a) V (b) = r+ r . Preuve. Remarquons dabord que V (y) est constant sur tout intervalle contenu dans [a, b] et sur lequel aucune fonction pi ne sannule. Comme les pi nont quun nombre ni de zros, il sut dexaminer la modication de V (y) en ces points. e Supposons dabord que c ]a, b[ soit un zro de p et montrons que p1 (c) = 0. En eet, e sinon on aurait m > 1 par la condition (ii) et alors, par (iii) avec j = 1, on aurait p(c) = 0, contrairement a lhypoth`se. Donc p1 (c) = 0 et, au voisinage de c, la fonction ` e p1 (x) ne change pas de signe. Si p(x)p1 (x)(x c) > 0 au voisinage de c, alors, pour > 0 assez petit, les nombres p1 (c ) et p(c ) sont de signe oppos, alors que p1 (c + ) et p(c + ) sont de mme e e signe. Donc C(p(c ), p1 (c )) = 1 et C(p(c + ), p1 (c + )) = 0. Si p(x)p1 (x)(c x) > 0 au voisinage de c, alors le mme argument montre que C(p(c e ), p1 (c )) = 0 et C(p(c + ), p1 (c + )) = 1. Supposons maintenant que pi (c) = 0 pour un c ]a, b[ avec i > 0 (ce cas peut se produire simultanment avec le cas prcdent). Alors i < m en vertu de (ii), et par (iii), on a e e e pi1 (c)pi+1 (c) < 0. Il en rsulte que e C(pi1 (c ), pi (c ), pi+1 (c )) = C(pi1 (c + ), pi (c + ), pi+1 (c + )) = 1 Par consquent, V (c)V (c+) = 1, si p(x)p1 (x)(xc) > 0 et V (c)V (c+) = 1, e si p(x)p1 (x)(c x) > 0. En sommant sur les zros de lintervalle [a, b], on obtient e V (a) V (b) = r+ r . Version 15 janvier 2005

148

Chapitre 7. Polynmes o

Corollaire 7.1.2. Soit p un polynme a coecients rels et soient a et b deux nomo ` e bres rels tels que a < b. Si p0 , . . . , pm est une suite de Sturm pour p sur [a, b], vriant e e la condition (iv) (resp. (iv)), alors le nombre de zros distincts de p dans lintervalle e [a, b] est V (a) V (b) (resp. V (b) V (a)). Preuve. Si la condition (iv) est vrie, alors r = 0. De plus, la condition (iv) montre e e que r+ compte le nombre de zros distincts de p dans lintervalle. e Nous considrons maintenant lexistence de suites de Sturm. e Proposition 7.1.3. Soit p un polynme a coecients rels et soient a et b deux nomo ` e bres rels tels que a < b. Considrons la suite p0 , . . . , pm de polynmes dnie par p0 = p, e e o e p1 = p , o` le polynme pi est le reste de la division euclidienne de pi2 par pi1 pour u o 2 i m et o` m est le plus grand entier tel que pm = 0. Alors pm divise chacun des u pi et si p(a)p(b) = 0, la suite gi = pi /pm i = 0, . . . , m

est une suite de Sturm pour g0 sur [a, b] vriant la condition (iv). e Preuve. Vrions les proprits (i) a (iv) ci-dessus pour la suite gi . Notons que pm est le e ee ` pgcd de p et de p , au signe pr`s, donc en particulier g0 et g1 nont pas de zro commun. e e Puisque p(a)p(b) = 0, on a g0 (a)g0 (b) = 0, ce qui prouve (i). La condition (ii) provient du fait que gm = 1. Pour (iii), considrons les divisions euclidiennes e pi1 (X) = qi (X)pi (X) pi+1 (X) 0<i<m

Alors gi1 (X) = qi (X)gi (X) gi+1 (X), pour 0 < i < m. Deux polynmes gi dindices o conscutifs nont pas de zro commun dans [a, b], sinon de proche en proche, pm aurait e e un zro dans [a, b]. Donc gi1 (c)gi+1 (c) < 0 quand gi (c) = 0. Enn, si g0 (c) = 0, alors e g1 (c) = 0 et on obtient (iv) grce au thor`me de Rolle. a e e Corollaire 7.1.4. Soit p un polynme a coecients rels et soient a et b deux nomo ` e bres rels tels que a < b. Considrons la suite p0 , . . . , pm de polynmes dnie par p0 = p, e e o e p1 = p , o` le polynme pi est le reste de la division euclidienne de pi2 par pi1 pour u o 2 i m et o` m est le plus grand entier tel que pm = 0. Si p(a)p(b) = 0, alors le u nombre de zros distincts de p dans lintervalle [a, b] est gal a V (a) V (b). e e ` Preuve. Avec les notations de la proposition prcdente, on a pi = pm gi , pour i = e e 0, . . . , m. Il en rsulte que e V (p0 , . . . , pm ; y) = V (g0 , . . . , gm ; y) pour tout y tel que pm (y) = 0. Or tout zro de pm est un zro de p, donc pm (a)pm (b) = 0. e e Le rsultat dcoule alors directement de la proposition prcdente. e e e e On consid`re maintenant trois suites de nombres rels (an )n0 , (bn )n1 et (cn )n2 sue e jettes aux deux conditions suivantes : Version 15 janvier 2005

7.1. Suites de Sturm (i) a0 = 0, b1 = 0, (ii) bn bn1 cn > 0 pour tout n 2, et on dnit une suite pn de polynmes a coecients rels par e o ` e p0 (X) = a0 p1 (X) = a1 + b1 X pn (X) = (an + bn X)pn1 (X) cn pn2

149

n2

Comme bn = 0 pour tout n > 0, chaque polynme pn est de degr n. o e Proposition 7.1.5. Les zros de pn sont tous rels, simples et, pour n 2, on a e e x1 < y1 < x2 < < yn1 < xn o` x1 , . . . , xn sont les zros de pn et y1 , . . . , yn1 sont les zros de pn1 . u e e Preuve. Observons dabord que deux polynmes dindices conscutifs nont pas de o e zro commun ou, de mani`re quivalente, sont premiers entre eux. En eet, si p n (x) = e e e pn1 (x) = 0, alors par la dnition de pn , on a pn2 (x) = 0 et, de proche en proche, on e obtient p0 (x) = 0. Comme a0 = 0, ceci est impossible. Raisonnons par rcurrence sur n et supposons la proprit tablie pour n 1. Si y est e eee un zro de pn1 , on a pn (y)pn2 (y) = cn (pn2 )2 , donc les nombres e pn (y1 )pn2 (y1 ), . . . , pn (yn1 )pn2 (yn1 ) sont tous du signe de cn . Les nombres pn2 (y1 ), . . . , pn2 (yn1 ) sont de signes alterns. En eet, si pn2 (yi ) et e pn2 (yi+1 ) taient de mme signe, le nombre de zros de pn2 (X) dans lintervalle e e e ]yi , yi+1 [ serait pair. Or, pn2 a un seul zro simple dans cet invervalle par rcurrence. e e Il rsulte des deux remarques prcdentes que les nombres pn (y1 ), . . . , pn (yn1 ) sont de e e e signes alterns et donc que pn a un nombre impair de zros dans chacun des intervalles e e ]yi , yi+1 [ pour i = 1, . . . , n 2. Comme pn (yi ) = cn pn2 (yi ), le polynme q(X) = o pn (X)pn2 (X) est du signe de cn en tout point yi . Or, pour x , on a q(x) x2 bn bn1 , donc q(x) est du mme signe que cn . Ceci montre que q(x), et donc aussi e pn (x), change de signe dans lintervalle ] , y1 [ et dans lintervalle ]yn1 , [, et donc que pn a un zro dans chacun de ces intervalles, en plus des n 2 zros dj` mis en e e ea vidence. e Proposition 7.1.6. Si cn > 0 pour tout n 2, alors pour tout m > 0, la suite (pm , pm1 , . . . , p0 ) est une suite de Sturm pour pm dans lintervalle [a, b] pour des nombres rels a < b qui e ne sont pas des zros de pm ; de plus, le nombre de zros de pm dans lintervalle [a, b] e e est V (a) V (b) si b1 > 0 et V (b) V (a) sinon. Version 15 janvier 2005

150

Chapitre 7. Polynmes o

Preuve. Notons dabord que la condition sur les polynmes pn implique que, si cn > 0, o tous les bn sont du mme signe, celui de b1 . e Comme p0 est un polynme constant et comme pn+1 (c) = cn+1 pn1 (c) pour tout n > 0 o et tout zro c de pn , la condition que cn est positif entra que la suite (pm , pm1 , . . . , p0 ) e ne est une suite de Sturm. Pour montrer la deuxi`me partie de lnonc, nous allons prouver que la suite vrie la e e e e condition (iv) respectivement (iv) des suites de Sturm et appliquer le thor`me. Soient e e x1 < < xm les zros de pm . Comme ces zros sont simples, la fonction polynme e e o pm est alternativement croissante et dcroissante au voisinage de ces zros. Par ailleurs, e e pm1 ayant ses zros entre deux zros de pm , la fonction pm1 est alternativement e e positive et ngative au voisinage des zros de pm . Il en rsulte que les fonctions e e e pm (x)pm1 (x)(x xi ) i = 1, . . . , m

sont soit toutes positives, soit toutes ngatives aux voisinages de xi . Il sut donc de e dterminer le signe de lune dentre elles. Or, pour x > xm , les fonctions ne changent e plus de signe et lorsque x , le signe de pm (x)pm1 (x) est celui de bm . Il existe de nombreuses ingalits permettant de localiser les zros dun polynme en e e e o fonction de param`tres divers. Nous considrons quelques ingalits bien classiques, e e e e portant sur les polynmes a coecients complexes. Il sut de considrer des polynmes o ` e o unitaires, cest-`-dire dont le coecient du terme de plus haut degr est 1. a e Thor`me 7.1.7. Soit p(X) = X n + + a0 un polynme unitaire a coecients e e o ` complexes de degr n et soit un zro de p. Alors e e n1 (i) || max 1, i=0 |ai | (ii) (iii) (iv) || 1 +
0in1

max |ai |

||

0in1

max |nai |1/i

|| 2 max |ai |1/i


0in1

Pour la preuve, nous tablissons dabord le lemme suivant : e Lemme 7.1.8. Soit p(X) = X n + an1 X n1 + + a0 un polynme unitaire a coefo ` cients complexes. Soient c0 , . . . , cn1 des nombres rels strictement positifs vriant e e n1 i=0 ci 1. Soit enn 1/ni |ai | M = max 0in1 ci Preuve. Soit z C tel que |z| > M . Alors pour 0 i n 1, on a |z|ni > Version 15 janvier 2005 |ai | ci Alors tout zro de p vrie || M . e e

7.1. Suites de Sturm donc |z|n ci > |ai ||z|i . Il en rsulte que e
n1 n1 n1 n1

151

|f (z)| |z|n

i=0

|ai ||z|i |z|n

i=0

ci

i=0

|ai ||z|i =

i=0

|z|n ci |ai ||z|i > 0

Preuve du thor`me. e e n1 (i) Soit r = i=0 |ai |. Si r 1, on pose ci = |ai | dans le lemme et on a M = 1. Sinon, on pose ci = |ai |/r et comme r > 1, on a M = r. (ii) Soit A = max |ai | et posons
0in1

ci = dans le lemme. Comme


n1

|ai | (1 + A)ni

ci =
i=0

1 (1 + A)n

n1 i=0

|ai |(1 + A)i 1

les hypoth`ses du lemme sont vries et on obtient M = 1 + A. e e e (iii) Posons ci = 1/n dans le lemme. Alors M = max |nai |1/ni .
0in1

(iv) Posons ci = 2in dans le lemme. On trouve |ai | ci do` le rsultat. u e


1/ni

= 2|ai |1/ni

7.1.3

Programme : suites de Sturm

Le calcul de la suite de Sturm dun polynme p ne pose pas de probl`me, lorsque lon o e dispose des procdures de base de manipulation des polynmes (consulter a ce propos e o ` lannexe A). Le rsultat tant une suite de polynmes, il convient dintroduire un type e e o appropri, a savoir e `
TYPE SuitePol = ARRAY[0..LongueurSuite] OF pol;

La procdure est alors : e


PROCEDURE SuiteDeSturm (p: pol; VAR sp: SuitePol; VAR m: integer); Calcule la suite de Sturm p0 , . . . , pm du polynme p, dans les lments sp[0], . . . , sp[m]. o ee Le polynme p est suppos navoir que des zros simples. o e e VAR q, r: pol;

Version 15 janvier 2005

152
BEGIN m := 0; sp[0] := p; PolynomeDerive(p, q); WHILE NOT (EstPolNul(q)) DO BEGIN m := m + 1; sp[m] := q; PolynomeModPolynome(p, q, r); PolynomeOppose(r, r); p := q; q := r END; END; { de "SuiteDeSturm" }

Chapitre 7. Polynmes o

Voici un exemple de calcul :


Voici le polyn^me p : o X^4 - 10.000 X^3 + 35.000 X^2 - 50.000 X + 24.000 Voici la suite de Sturm : p0 X^4 - 10.000 X^3 + 35.000 X^2 - 50.000 X + 24.000 p1 4.000 X^3 - 30.000 X^2 + 70.000 X - 50.000 p2 1.250 X^2 - 6.250 X + 7.250 p3 3.200 X - 8.000 p4 0.562

Si le polynme p a examiner a des zros multiples, il faut les liminer auparavant. Pour o ` e e cela, il sut de diviser p par le polynme pgcd de p et du polynme driv p . Ceci est o o e e fait dans la procdure que voici : e
PROCEDURE EliminationZerosMultiples (p: pol; VAR q: pol); BEGIN PolynomeDerive(p, q); PolynomePgcd(p, q, q); PolynomeDivPolynome(p, q, q) END; { de "EliminationZerosMultiples" }

Le calcul de la variation dune suite de Sturm p0 , . . . , pm en y se fait en valuant les e polynmes en y et en notant les changements de signe. Comme on suppose p0 sans o zro multiple, pm est une constante non nulle, donc de signe non nul. Les changements e de signe se rep`rent par le fait que le signe est loppos du signe prcdent. Voici une e e e e ralisation : e
FUNCTION Variation (m: integer; VAR sp: SuitePol; y: real) : integer; Calcule la variation V (y) au point y. VAR i, s, changements: integer;

Version 15 janvier 2005

7.1. Suites de Sturm


r: real; BEGIN changements := 0; Compte les changements de signe. s := signe(sp[m][0]); Signe de pm , non nul. FOR i := m - 1 DOWNTO 0 DO BEGIN r := Valeur(sp[i], y); r = pi (y). IF signe(r) = -s THEN BEGIN Ainsi, on saute les termes nuls. s := -s; changements := changements + 1 END; END; Variation := changements END; { de "Variation" }

153

La majoration des modules des zros dun polynme p(X) = an X n + + a0 se fait en e o appliquant lune des formules du thor`me. Pour la minoration, il sut de considrer le e e e polynme rciproque X n p(1/X) = a0 X n + + an et den majorer les zros. Voici une o e e ralisation : e
FUNCTION MajorationDesZeros (p: pol): real; VAR r: real; i, n: integer; BEGIN n := Degre(p); r := 0; FOR i := 1 TO n DO r := rmax(r, rPuiss(abs(p[n - i] / p[n]), 1 / i)); MajorationDesZeros := 2 * r END; { de "MajorationDesZeros" } FUNCTION MinorationDesZeros (p: pol): real; VAR r: real; i, n: integer; BEGIN n := Degre(p); r := 0; FOR i := 1 TO n DO r := rmax(r, rPuiss(abs(p[i] / p[0]), 1 / i)); MinorationDesZeros := 1 / (2 * r) END; { de "MinorationDesZeros" }

En fait, on est intress par la minoration des zros dans la situation suivante : lorsque e e e lon a dcouvert un zro rel c de p, on veut dterminer un intervalle autour de c qui ne e e e e contient aucun autre zro de p. Pour cela, on consid`re le polynme q(X) = p(X +c)/X. e e o Une minoration du module des zros de q donne un intervalle ]c , c + [ dans lequel e il ny a aucun zro de p a lexception de c. Le changement de variable indiqu se ralise e ` e e par : Version 15 janvier 2005

154

Chapitre 7. Polynmes o

PROCEDURE ChangementVariable (p: pol; c: real; VAR q: pol); Calcule le polynme q(X) = p(X + c)/X. o VAR j, k, n: integer; s: real; BEGIN q := PolynomeNul; n := Degre(p); FOR k := 1 TO n DO BEGIN s := 0; FOR j := k TO n DO s := s + p[j] * Binomial(j, k) * Puiss(c, j - k); q[k - 1] := s END END; { de "ChangementVariable" }

Les calculs des coecients binomiaux et des puissances se font au moyen de procdures e simples, expliques dans lannexe A. Le nombre (que nous appelons cart) se calcule e e simplement par :
FUNCTION Ecart (p: pol; c: real): real; VAR q: pol; BEGIN ChangementVariable(p, c, q); Ecart := MinorationDesZeros(q) END; { de "Ecart" }

Lalgorithme de localisation des zros op`re par dichotomie. On dtermine dabord un e e e intervalle ouvert dans lequel se trouvent tous les zros rels du polynme p. Etant donn e e o e un intervalle ouvert contenant au moins un zro, on le coupe en deux au milieu, puis e on travaille sparment sur chaque intervalle. On dtermine le nombre de zros quil e e e e contient. Si ce nombre est nul, on limine lintervalle, sil est gal a 1, on le range parmi e e ` les intervalles trouvs, sil est plus grand que 1, on it`re le procd sur cet intervalle. e e e e Il se peut que le milieu de lintervalle soit un zro; dans ce cas, on continue non pas e avec chacun des deux intervalles moiti, mais avec les intervalles diminus de lcart qui e e e spare ncessairement le zro trouv dun autre zro. Le rsultat de lalgorithme est une e e e e e e suite dintervalles (ventuellement rduits a un point) contenant chacun un et un seul e e ` zro du polynme de dpart. e o e Pour mettre en pratique cet algorithme, on doit grer des intervalles et, en particulier, e mettre de ct lun des deux intervalles rsultant dune dichotomie pour le traiter oe e ultrieurement. Ceci se fait en conservant ces intervalles dans une suite que nous ralisons e e sous forme de pile, mais toute autre structure convient. Il sav`re conomique de grer, e e e en mme temps que les intervalles, les variations a leurs extrmits, pour ne pas les e ` e e recalculer. On proc`de comme suit : e Version 15 janvier 2005

7.1. Suites de Sturm


TYPE Intervalle = ARRAY[0..1] OF real; SuiteIntervalles = ARRAY[1..NombreIntervalles] OF Intervalle; CoupleEntier = ARRAY[0..1] OF integer; SuiteCouplesEntier = ARRAY[1..NombreCouples] OF CoupleEntier;

155

Ces types permettent de grer dune part les intervalles par leurs extrmits et dautre e e e part les couples de variations aux extrmits. On utilise alors trois variables : e e
VAR EnAttente: integer; IntervalleEnAttente: SuiteIntervalles; VariationsEnAttente: SuiteCouplesEntier;

pour les intervalles en attente et leurs variations, lentier EnAttente tant le nombre e dintervalles en attente. Deux oprations doivent tre ralises. Dune part, mettre en e e e e attente un intervalle et les variations correspondantes, dautre part la rcupration dun e e tel objet mis en attente. Cest le propos des deux procdures que voici : e
PROCEDURE MettreEnAttente (u, v: real; Vu, BEGIN EnAttente := EnAttente + 1; IntervalleEnAttente[EnAttente][0] := IntervalleEnAttente[EnAttente][1] := VariationsEnAttente[EnAttente][0] := VariationsEnAttente[EnAttente][1] := END; { de "MettreEnAttente" } Vv: integer);

u; v; Vu; Vv;

PROCEDURE Retirer (VAR u, v: real; VAR Vu, Vv: integer); BEGIN u := IntervalleEnAttente[EnAttente][0]; v := IntervalleEnAttente[EnAttente][1]; Vu := VariationsEnAttente[EnAttente][0]; Vv := VariationsEnAttente[EnAttente][1]; EnAttente := EnAttente - 1; END; { de "Retirer" }

Lalgorithme lui-mme produit une suite dintervalles. Chaque intervalle contient exace tement un zro rel du polynme. Lorsque lon a trouv un tel intervalle, on le range e e o e dans une suite appelons-la Localise par la procdure : e
PROCEDURE RangerIntervalleTrouve (u, v: real); BEGIN n := n + 1; Localise[n][0] := u; Localise[n][1] := v; END; { de "RangerIntervalleTrouve" }

o` n est le compteur du nombre dintervalles trouv. u e Version 15 janvier 2005

156

Chapitre 7. Polynmes o

Pour dterminer le sort dun intervalle, on utilise une procdure qui soit le met en e e attente, soit le range dans les intervalles trouvs, soit lignore, et ceci en fonction du e nombre de zros que cet intervalle contient. e
PROCEDURE Repartir (a, b: real; Va, Vb: integer); BEGIN IF Va = Vb + 1 THEN Un zro dans ]a, b[. e RangerIntervalleTrouve(a, b) ELSE IF Va > Vb + 1 THEN Au moins deux zros dans ]a, b[. e MettreEnAttente(a, b, Va, Vb) END; { de "Repartir" }

Voici donc la procdure qui met en uvre ces oprations : e e


PROCEDURE LocalisationIntervalles (p: pol; VAR Localise: SuiteIntervalles; VAR n: integer); p est un polynme nayant que des zros simples. Localise contient une suite de n intero e valles. Chaque intervalle contient exactement un zro rel de p. e e VAR sp: SuitePol; Pour ranger la suite de Sturm. m: integer; Indice du dernier lment de la suite de Sturm. ee EnAttente: integer; IntervalleEnAttente: SuiteIntervalles; VariationsEnAttente: SuiteCouplesEntier; E: real; a, b, c: real; Des extrmits dintervalles e e Va, Vb, Vc: integer; et les variations correspondantes. PROCEDURE PROCEDURE PROCEDURE PROCEDURE MettreEnAttente (u, v: real; Vu, Vv: integer); Retirer (VAR u, v: real; VAR Vu, Vv: integer); RangerIntervalleTrouve (u, v: real); Repartir (a, b: real; Va, Vb: integer);

BEGIN SuiteDeSturm(p, sp, m); b := (1 + epsilon) * MajorationDesZeros(p); a := -b; Intervalle initial. Va := Variation(m, sp, a); Vb := Variation(m, sp, b); n := 0; Au dbut, aucun intervalle e EnAttente := 0; trouv et aucun en attente. e IF Va - Vb > 0 THEN BEGIN Sil y a au moins un zro e Repartir(a, b, Va, Vb); dans [a, b], on le traite. WHILE EnAttente > 0 DO BEGIN Tant quil reste un intervalle Retirer(a, b, Va, Vb); en attente, on en prend un, c := (a + b) / 2; on le coupe au milieu. IF EstNul(Valeur(p, c)) THEN BEGIN Si cest un zro, e RangerIntervalleTrouve(c, c); on le range soigneusement, E := Ecart(p, c); puis on calcule la distance qui le spare des zros les plus proches, et on recommence e e

Version 15 janvier 2005

7.1. Suites de Sturm


Repartir(a, c - E, Va, Variation(m, sp, c - E)); Repartir(c + E, b, Variation(m, sp, c + E), Vb); END ELSE BEGIN Vc := Variation(m, sp, c); Repartir(a, c, Va, Vc); Repartir(c, b, Vc, Vb); END END { du while } END END; { de "LocalisationIntervalles" }

157
sur [a, c E] et [c + E, b].

Si ce nest pas un zro, e on calcule sa variation et on recommence des deux cts. o e

Il reste a expliquer la prsence du facteur 1 + dans le calcul des extrmits du premier ` e e e intervalle. Les ingalits dans les majorations des modules des zros tant larges, les e e e e bornes peuvent tre atteintes; or, pour pouvoir interprter correctement les variations e e calcules, elles doivent ltre en des points qui ne sont pas des zros. Cest pourquoi on e e e largit lintervalle. e Voici quelques exemples de droulement de cette procdure, avec quelques impressions e e intermdiaires : e
Voici le polyn^me lu o X^3 - X Intervalle de dpart [a,b]= [ e Nombre de zros rels : 3 e e Mis en attente : [ -2.002 Retir dattente : [ -2.002 e Trouv : [ e 0.000 0.000] Trouv : [ -2.002 -0.500] e Trouv : [ e 0.500 2.002] -2.002, 2.002] 2.002] 2.002] Variations :3 0 0

Variations :3

Un zro trouv : e e 0.000 Un zro dans lintervalle ]-2.002,-0.500[ e Un zro dans lintervalle ] 0.500, 2.002[ e Voici le polyn^me lu o X^4 - 10.000 X^3 + 35.000 X^2 - 50.000 X + 24.000 Intervalle de dpart [a,b]= [ -20.020, e Nombre de zros rels : 4 e e Mis en attente : [ -20.020 20.020] Retir dattente : [ -20.020 20.020] e Mis en attente : [ 0.000 20.020] Retir dattente : [ e 0.000 20.020] Mis en attente : [ 0.000 10.010] Retir dattente : [ e 0.000 10.010] Mis en attente : [ 0.000 5.005] Retir dattente : [ e 0.000 5.005] Mis en attente : [ 0.000 2.503] Mis en attente : [ 2.503 5.005] 20.020] Variations :4 0 0 0 0 2 0 0

Variations :4 Variations :4 Variations :4 Variations :4 Variations :4 Variations :2

Version 15 janvier 2005

158
Retir e Trouv e Trouv e Retir e Trouv e Trouv e Un Un Un Un zro e zro e zro e zro e dattente : [ 2.503 : [ 2.503 3.754] : [ 3.754 5.005] dattente : [ 0.000 : [ 0.000 1.251] : [ 1.251 2.503] dans dans dans dans lintervalle lintervalle lintervalle lintervalle ] ] ] ] 5.005]

Chapitre 7. Polynmes o

2.503]

2.503, 3.754, 0.000, 1.251,

3.754[ 5.005[ 1.251[ 2.503[

Bien entendu, il est facile, a partir des intervalles ainsi obtenus, de calculer les zros ` e rels, au moyen par exemple dune recherche dichotomique. e

7.2
7.2.1

Polynmes symtriques o e
Enonc : polynmes symtriques e o e

On rappelle que tout polynme f Z[X1 , . . . , Xn ] peut scrire de faon unique sous la o e c forme r r r f= ar1 ,r2 ,...,rn X1 1 X2 2 Xnn
(r1 ,r2 ,...,rn )N n

o` les ar1 ,r2 ,...,rn sont des entiers relatifs tels que lensemble {(r1 , r2 , . . . , rn ) N n | u ar1 ,r2 ,...,rn = 0} soit ni. Le degr de f , not deg(f ), est le plus grand entier d tel quil e e existe des entiers r1 , . . . , rn vriant ar1 ,...,rn = 0 et r1 + + rn = d. Par convention, e le degr du polynme nul est . e o On dit quun polynme f Z[X1 , . . . , Xn ] est symtrique si lon a o e f (X(1) , . . . , X(n) ) = f (X1 , . . . , Xn )
r r On pourra reprsenter un monme aX1 1 . . . Xnn , avec a = 0, par un tableau contenant e o les valeurs a, r1 , . . . , rn , et un polynme par un tableau de ses monmes. On supposera o o que n 4 et que tout polynme est somme dau plus 100 monmes. o o

pour toute permutation de lensemble {1, . . . , n}.

1. Ecrire des procdures daddition, de multiplication par une constante et de test e dgalit des polynmes de Z[X1 , . . . , Xn ]. Exemple numrique : on prend n = 3, p1 = e e o e 2 2 2 2 3 2 2 2 2 3 X1 X2 X1 X3 + X2 X3 et p2 = 2X1 X3 + X2 X3 X2 X3 . Acher p1 , p2 , p1 + p2 et 5p1 . 2. Ecrire une procdure qui prend en argument un polynme f Z[X1 , . . . , Xn ] et e o qui teste si f est symtrique (on admettra sans dmonstration que si n 2, le groupe e e des permutations de lensemble {1, . . . , n} est engendr par une permutation circulaire e et par une transposition). Version 15 janvier 2005

7.2. Polynmes symtriques o e Exemple numrique : tester si p1 , p2 et p1 + p2 sont symtriques. e e On appelle fonctions symtriques lmentairesde X1 , . . . , Xn les polynmes e ee o sk (X1 , . . . , Xn ) =
1i1 <i2 <ik n

159

Xi 1 Xi 2 X i k

o` 1 k n. On se propose de dmontrer que pour tout polynme symtrique u e o e f (X1 , . . . , Xn ) il existe un polynme pf et un seul tel que o f (X1 , . . . , Xn ) = pf (s1 (X1 , . . . , Xn ), . . . , sn (X1 , . . . , Xn )) ()

3. On dmontre dabord lexistence de pf par rcurrence sur lentier c(f ) = n+ deg(f ). e e On pose, pour tout polynme f (X1 , . . . , Xn ), o f 0 (X1 , . . . , Xn1 ) = f (X1 , . . . , Xn1 , 0) On suppose le rsultat dmontr pour les polynmes symtriques f (X1 , . . . , Xn ) tels e e e o e que c(f ) < c(f ). a) On suppose n 2. Dmontrer lexistence du polynme pf 0 , puis dmontrer que le e o e polynme o g(X1 , . . . , Xn ) = f (X1 , . . . , Xn ) pf 0 (s1 (X1 , . . . , Xn ), . . . , sn1 (X1 , . . . , Xn )) peut scrire sous la forme e g(X1 , . . . , Xn ) = X1 Xn h(X1 , . . . , Xn ) o` h est un polynme symtrique. u o e b) Complter la dmonstration de lexistence de pf . e e 4. Dmontrer que pour tout polynme symtrique f (X1 , . . . , Xn ) il existe un unique e o e polynme pf vriant (). o e 5. On suppose, dans cette question uniquement, que n = 2. a) Dmontrer, en utilisant les questions prcdentes, que si f (X1 , X2 ) est un polynme e e e o symtrique, on a e 0 pf (Y1 , Y2 ) = Y2k fk (Y1 ) ()
k0

o` les polynmes fk sont dnis par les relations de rcurrence u o e e f0 = f et fk+1 =


0 fk fk (X1 + X2 ) X1 X2

b) Ecrire une procdure qui prend pour argument un polynme symtrique f (X1 , X2 ) e o e et qui calcule le polynme pf donn par la formule (). o e Version 15 janvier 2005

160
10 10 Exemple numrique : Calculer pf lorsque f = X1 + X2 . e

Chapitre 7. Polynmes o

k k 6. On pose 0 (X1 , . . . , Xn ) = n et, pour k > 0, k (X1 , . . . , Xn ) = X1 + + Xn .

a) Dmontrer que les polynmes k vrient les relations suivantes : e o e

k s1 k1 + s2 k2 + + (1)k1 sk1 1 + (1)k ksk = 0 pour 0 < k n k s1 k1 + + (1)n sn kn = 0 pour 0 < n k b) Dmontrer que e k =
r1 +2r2 ++nrn =k

ar1 ,r2 ,...,rn sr1 sr2 srn n 1 2

()

o` u ar1 ,r2 ,...,rn = (1)r2 +r4 ++r2[n/2] (r1 + 2r2 + + nrn )(r1 + + rn 1)! r1 ! rn !

c) Ecrire une procdure qui prend en argument des entiers k et n et qui calcule le e polynme pk a laide de la formule (). Application numrique : n = 3, k = 10. o ` e 7. Dmontrer que si 2n nombres entiers x1 , . . . , xn , y1 , . . . , yn vrient e e xk = i
1in 1in k yi pour 1 k n

alors il existe une permutation de {1, . . . , n} telle que x(i) = yi pour 1 k n.

7.2.2

Solution : polynmes symtriques o e

Soient X1 , X2 ,. . . , Xn des indtermines sur un anneau commutatif unitaire K. Un e e polynme f K[X1 , . . . , Xn ] peut scrire de faon unique sous la forme o e c f=
(r1 ,r2 ,...,rn )K n r r r ar1 ,r2 ,...,rn X1 1 X2 2 Xnn

ee o o` les ar1 ,r2 ,...,rn sont des lments de K presque tous nuls. Les monmes de f sont les u r r r monmes ar1 ,r2 ,...,rn X1 1 X2 2 Xnn tels que ar1 ,r2 ,...,rn = 0. o On dit quun polynme f K[X1 , . . . , Xn ] est symtrique si lon a o e f (X(1) , . . . , X(n) ) = f (X1 , . . . , Xn ) pour toute permutation de lensemble {1, . . . , n}. sk (X1 , . . . , Xn ) =
1i1 <i2 <<ik n

On appelle fonctions symtriques lmentaires de X1 , . . . , Xn les polynmes e ee o Xi 1 Xi 2 X i k

Version 15 janvier 2005

7.2. Polynmes symtriques o e o` 1 k n. En particulier, u s1 = X 1 + X 2 + . . . + X n s2 = X1 X2 + X2 X3 + . . . + Xn1 Xn . . . s n = X 1 X2 . . . X n

161

r r r Soit m = aX1 1 X2 2 . . . Xnn un monme non nul de K[X1 , . . . , Xn ]. On appelle respeco tivement degr et poids de m les entiers e

deg(m) = r1 + r2 + + rn

et

poids(m) = r1 + 2r2 + + nrn

Le degr (resp. le poids) dun polynme non nul est gal au maximum des degrs (resp. e o e e poids) de ses monmes. Par convention, le degr et le poids du polynme nul sont gaux o e o e a . ` Notre premier objectif est de dmontrer le rsultat suivant. e e Thor`me 7.2.1. Pour tout polynme symtrique f de lanneau K[X1 , . . . , Xn ], il e e o e existe un polynme pf de lanneau K[X1 , . . . , Xn ] et un seul tel que o f (X1 , . . . , Xn ) = pf (s1 (X1 , . . . , Xn ), . . . , sn (X1 , . . . , Xn )) De plus, le poids de pf est gal au degr de f . e e Preuve. Commenons par dmontrer lunicit de pf . Si pf et qf sont deux solutions du c e e probl`me, leur dirence u = pf qf vrie la formule e e e u(s1 , . . . , sn ) = 0 Le rsultat dcoule donc de lnonc suivant. e e e e Proposition 7.2.2. Les fonctions symtriques lmentaires sont algbriquement inde ee e e pendantes sur K ; autrement dit, un polynme u de lanneau K[X1 , . . . , Xn ] est nul si o et seulement si u(s1 , . . . , sn ) = 0. Preuve. Supposons quil existe un entier n et un polynme non nul u vriant o e u(s1 , . . . , sn ) = 0. Choisissons u avec deg(u) + n minimal et posons
d u = u 0 + u 1 Xn + + u d Xn

avec, pour 1 i d, ui K[X1 , . . . , Xn1 ]. On a ncessairement n 2. Si u0 = 0, u e peut scrire sous la forme u = Xn g(X1 , . . . , Xn ), do`, en substituant, e u u(s1 , . . . , sn ) = sn g(s1 , . . . , sn ) = 0 et donc g(s1 . . . sn ) = 0, ce qui contredit la minimalit de deg(u) + n. e Version 15 janvier 2005

162 Donc u0 = 0. Maintenant, on a par hypoth`se e

Chapitre 7. Polynmes o

u(s1 (X1 , . . . , Xn ), . . . , sn (X1 , . . . , Xn )) = 0 Il en rsulte, en prenant Xn = 0 e u0 (s1 (X1 , . . . , Xn1 , 0), . . . , sn1 (X1 , . . . , Xn1 , 0)) = 0 et donc u0 (1 , . . . , sn1 ) = 0 s o` les si sont les fonctions lmentaires de X1 , . . . Xn1 , ce qui contredit la minimalit u ee e de deg(u) + n. Par consquent, la condition u(s1 , . . . , sn ) = 0 entra u = 0. e ne Dmontrons a prsent lexistence dun polynme pf de poids gal a deg(f ) vriant e ` e o e ` e lgalit de lnonc. On raisonne par rcurrence sur lentier c(f ) = n + deg(f ), en e e e e e observant que, si n = 1, il sut de prendre pf = f . Supposons donc n > 1 et associons a tout polynme symtrique f de K[X1 , . . . , Xn ] le polynme f 0 K[X1 , . . . , Xn1 ] ` o e o dni par e f 0 (X1 , . . . , Xn1 ) = f (X1 , . . . , Xn1 , 0) Ce polynme est symtrique par construction et vrie c(f 0 ) c(f ) 1. En lui applio e e quant lhypoth`se de rcurrence, on obtient un polynme pf 0 de poids gal a deg(f 0 ). e e o e ` Posons g(X1 , . . . , Xn ) = f (X1 , . . . , Xn ) pf 0 (s1 (X1 , . . . , Xn ), . . . , sn1 (X1 , . . . , Xn )) Le polynme g est symtrique et sannule pour Xn = 0. Donc, si o e g=
(r1 ,r2 ,...,rn )K n r r r ar1 ,r2 ,...,rn X1 1 X2 2 Xnn

on a ar1 ,r2 ,...,rn = 0 si rn = 0 et, par symtrie, si r1 = 0, r2 = 0 . . . ou rn1 = 0. Par e consquent g scrit sous la forme e e g(X1 , . . . , Xn ) = X1 Xn h(X1 , . . . , Xn ) o` h est un polynme symtrique. Puisque deg(g) deg(f ) et deg(h) = deg(g) n, u o e lhypoth`se de rcurrence sapplique a h. Donc e e ` h(X1 , . . . , Xn ) = ph (s1 (X1 , . . . , Xn ), . . . , sn (X1 , . . . , Xn )) et f = sn ph (s1 , . . . , sn ) + pf 0 (s1 , . . . , sn1 ) do` nalement u pf = Xn ph + p f 0 Version 15 janvier 2005

7.2. Polynmes symtriques o e On a de plus poids(pf ) max(poids(Xn ph ), poids(pf 0 )) max(n + poids(ph ), poids(pf 0 )) max(n + deg(h), deg(f 0 )) max(deg(g), deg(f 0 )) deg(f ) Mais dautre part, la formule f (X1 , . . . , Xn ) = pf (s1 (X1 , . . . , Xn ), . . . , sn (X1 , . . . , Xn ))

163

entra deg(f ) poids(pf ) et donc nalement deg(f ) = poids(pf ), ce qui conclut la ne rcurrence et la dmonstration du thor`me. e e e e Dans le cas de deux indtermines, il est facile de calculer pf a partir de f . La dmonse e ` e tration ci-dessus montre que si f est un polynme symtrique de K[X1 , X2 ], il existe un o e polynme symtrique h de K[X1 , X2 ] tel que X1 X2 h = f pf 0 (X1 + X2 ). Mais puisque o e o ` e e e pf 0 est un polynme a une indtermine, il est symtriqueet pf 0 = f 0 . On a donc X1 X2 h = f f 0 (X1 + X2 ) et on peut dnir une suite de polynmes symtriques (fk )k0 de K[X1 , X2 ] en posant e o e f0 = f On en dduit e
0 fk = s2 fk+1 + fk (s1 ) 0 fk fk (X1 + X2 ) X1 X2

et fk+1 =

et donc, par rcurrence e


0 f0 (X1 , X2 ) = s2 f1 + f0 (s1 ) 0 0 0 0 = s2 (s2 f2 + f1 (s1 )) + f0 (s1 ) = s2 f2 + s2 f1 (s1 ) + f0 (s1 ) 2 . . .

= sr+1 fr+1 + 2
0kr

0 sk fk (s1 ) 2

Or comme le degr des fn est dcroissant, on a fr+1 = 0 pour un r assez grand. Par e e consquent, pf est donn par la formule e e pf (X1 , X2 ) =
k0 k 0 X2 fk (X1 )

On appelle sommes de Newton les polynmes de K[X1 , . . . , Xn ] dnis par les formules o e
k k k 0 (X1 , . . . , Xn ) = n et, pour k > 0, k (X1 , . . . , Xn ) = X1 + X2 + + Xn

Comme ces polynmes sont symtriques, on peut les exprimer a laide des fonctions o e ` symtriques lmentaires. Cette expression peut tre obtenue a laide de formules de e ee e ` rcurrence. e Version 15 janvier 2005

164

Chapitre 7. Polynmes o

Proposition 7.2.3. Les sommes de Newton vrient les relations suivantes : e k s1 k1 + s2 k2 + + (1)k1 sk1 1 + (1)k ksk = 0 pour 0 < k n k s1 k1 + + (1)n sn kn = 0 pour 0 < n k Preuve. Nous donnerons deux dmonstrations de ce rsultat. e e Premi`re dmonstration. Soit A = K[X1 , . . . , Xn ] et soit T une nouvelle indtermine. e e e e On travaille dans lanneau A[[T ]] des sries a coecients dans A. Considrons la srie e ` e e s=
1in

(1 + Xi T ) = 1 + s1 T + + sn T n

Puisque le terme constant de s est gal a 1, s est inversible dans A[[T ]] (une srie a e ` e ` coecients dans un anneau A est inversible si et seulement si son terme constant est inversible dans A). Pour la mme raison, chaque srie 1 + Xi T est inversible. On en e e dduit la suite dgalits : e e e s = s = = = Xi = 1 + Xi T

Xi
1in

k=0

(Xi T )k

1in

(1)k Xik+1 T k

1in k=0 k k=0 k=1

(1) k+1 T k (1)k1 k T k1

On obtient nalement, puisque s = s1 + 2s2 T + + nsn T n1 , s1 + 2s2 T + + nsn T n1 = (1 + s1 T + + sn T n )


k=1

(1)k1 k T k1

do` les formules cherches par identication des deux membres. u e Deuxi`me dmonstration. Partons de lidentit e e e sq r1 sq r1 qsq Xir1 Xi2 Xiq+1 1 si q < n et r > 1 si q = n et r 1 si r = 1

i2 <i3 <<iq i1 {i2 ,...,iq }

Xir1 Xi2 Xiq =

i2 <i3 <<iq+1 i1 {i2 ,...,iq+1 }

Version 15 janvier 2005

7.2. Polynmes symtriques o e On a successivement k = s1 k1


i1 =i2

165

Xik1 Xi2 1
i1 =i2

(q = 1, r = k) (q = 2, r = k 1)

Xik1 Xi2 = s2 k2 1

Xik2 Xi2 Xi3 1


i2 <i3 i1 {i2 ,i3 }

i2 <i3 i1 {i2 ,i3 }

Xik2 Xi2 Xi3 = s3 k3 1 . . .

i2 <i3 <i4 i1 {i2 ,i3 ,i4 }

Xik2 Xi2 Xi3 Xi4 (q = 3, r = k 2) 1

Si k < n, la derni`re galit est obtenue pour q = k et r = 1. Elle scrit e e e e Xi1 Xi2 Xik = ksk

i2 <i3 <<ik i1 {i2 ,...,ik }

Si k > n, la derni`re galit est obtenue pour q = n et r = k n + 1. Elle scrit e e e e


i2 <i3 <<ik i1 {i2 ,...,ik }

Xikn+1 Xi2 Xin = sn kn 1

Les formules cherches sen dduisent facilement. e e On peut prciser la proposition 7.2.3 en donnant explicitement lexpression des sommes e de Newton. Proposition 7.2.4. On a les formules : k =
r1 +2r2 ++nrn =k

ar1 ,r2 ,...,rn sr1 sr2 srn n 1 2

o` u ar1 ,r2 ,...,rn = (1)r2 +r4 ++r2[n/2] (r1 + 2r2 + + nrn )(r1 + + rn 1)! r1 ! rn !

Comme nous navons fait aucune hypoth`se sur la caractristique de lanneau K, il peut e e sembler curieux de voir appara des divisions dans lnonc ci-dessus. En ralit les tre e e e e ee e coecients ar1 ,r2 ,...,rn sont des entiers relatifs et non des lments de K. La premi`re ligne de lnonc utilise donc la convention habituelle qui consiste a noter, pour tout e e ` entier naturel n, nx la somme de n lments gaux a x et nx la somme de n lments ee e ` ee gaux a x. e ` Preuve. Posons k =
(r1 ,...,rn )N n

ck (r1 , , . . . , rn )sr1 sr2 srn n 1 2 Version 15 janvier 2005

166 Il sagit de prouver la formule

Chapitre 7. Polynmes o

ar1 ,...,rn si r1 + 2r2 + + nrn = k 0 sinon par rcurrence sur k. Cest vident pour k = 1. Supposons la formule vraie jusqu` k 1. e e a Les formules de la proposition 7.2.3 montrent immdiatement que ck (r1 , . . . , rn ) est nul e si r1 + 2r2 + + nrn = k. On suppose donc dsormais r1 + 2r2 + + nrn = k. Pour e faciliter lcriture des rcurrences, il est commode de poser, pour tout n-uplet dentiers e e r1 , . . . , rn tel que lun des ri soit ngatif, ar1 ,...,rn = 0. Si k < n, la proposition 7.2.3 e donne k = s1 k1 s2 k2 + + (1)k sk1 1 + (1)k+1 ksk (2.1) ck (r1 , . . . , rn ) = ce qui permet de calculer cr1 ,...,rn . Tout dabord, si r1 = 0, r2 = 0, . . . , rk1 = 0, rk = 1, rk+1 = 0, . . . , rn = 0, on a ck (r1 , . . . , rn ) = (1)k+1 k ce qui dmontre le rsultat dans ce cas, puisque e e (1)r2 +r4 ++r2[n/2] = 1 si k est pair 1 si k est impair

Dans les autres cas (toujours pour k < n), les quations (2.1) donnent e ck (r1 , . . . , rn ) = ar1 1,r2 ,...,rn ar1 ,r2 1,...,rn + + (1)k ar1 ,r2 ,...,rk1 1,rk ,...,rn = (r1 + + rn 2)! (r1 (k 1) + r2 (k 2) + + rk1 ) r1 ! rn !

et, en observant que les conditions r1 + 2r2 + + nrn = k et k n imposent rk = rk+1 = . . . = rn = 0, on trouve (r1 (k 1) + r2 (k 2) + + rk1 (k (k 1)) = k(r1 + + rn ) (r1 + 2r2 + + nrn ) = k(r1 + + rn 1) ce qui donne bien ck (r1 , . . . , rn ) = ar1 ,...,rn . Dans le cas o` k n, les quations (2.1) donnent u e =

ck (r1 , . . . , rn ) = ar1 1,r2 ,...,rn ar1 ,r2 1,...,rn + + (1)n+1 ar1 ,r2 ,...,rn 1

(r1 + + rn 2)! (r1 (k 1) + r2 (k 2) + + rn (k n) r1 ! rn ! (r1 + + rn 2)! (k(r1 + + rn ) (r1 + 2r2 + + nrn )) = r1 ! rn ! (r1 + + rn 2)! = k(r1 + + rn 1) r1 ! rn ! = ar1 ,r2 ,...,rn

Voici une application classique des formules de Newton. Version 15 janvier 2005

7.2. Polynmes symtriques o e

167

Proposition 7.2.5. Soit K un anneau int`gre de caractristique 0 et soient (xi )1in e e et (yi )1in deux familles de n lments de K tels que ee xk = i
1in 1in k yi pour 1 k n

Preuve. On a par hypoth`se k (x1 , . . . , xn ) = k (y1 , . . . , yn ) pour 1 k n. Montrons e par rcurrence sur k que sk (x1 , . . . , xn ) = sk (y1 , . . . , yn ) pour tout k n. Le rsultat e e est clair pour k = 1, puisque 1 = s1 . Si le rsultat est vrai jusquau rang k 1 < n, les e quations 2.1 donnent e ksk (x1 , . . . , xn ) = ksk (y1 , . . . , yn ) Comme lanneau K est int`gre et de caractristique nulle, cela conclut la rcurrence. Il e e e en rsulte que x1 , . . . , xn , (respectivement y1 , . . . , yn ) sont les n racines de lquation e e X n s1 X n1 + s2 X n2 + + (1)n sn = 0 Par consquent, il existe une permutation de {1, . . . , n} telle que x(i) = yi . e Notons que les deux hypoth`ses faites sur K sont ncessaires. En eet, dans Z/2Z on a e e 1 (0, 0) = 1 (1, 1) = 0 et 2 (0, 0) = 2 (1, 1) = 0 et dans lanneau produit Z Z, on a k ((1, 1), (0, 0)) = (1, 1) = k ((1, 0), (0, 1)) pour tout k > 0.

Il existe alors une permutation de {1, . . . , n} telle que x(i) = yi pour 1 k n.

7.2.3

Programme : polynmes symtriques o e

r r Appelons multidegr dun monme aX1 1 . . . Xnn le n-uplet dentiers r1 , . . . , rn . Comme e o r r le sugg`re lnonc du probl`me, on peut reprsenter un monme aX1 1 . . . Xnn , avec a = e e e e e o 0, par un tableau contenant les valeurs a, r1 , . . . , rn , et un polynme comme un tableau o de monmes. Nous appelerons taille du polynme le nombre de monmes gurant dans la o o o table. On ordonnera les monmes suivant lordre lexicographique de leurs multidegrs : o e rn r1 r1 rn le monme aX1 . . . Xn prc`de le monme a X1 . . . Xn sil existe un indice k tel que o e e o r1 = r1 , r2 = r2 , . . . , rk1 = rk1 et rk < rk .

CONST DegreMax = 20; NbreMaxMonomes = 100; NbreMaxIndeterminees = 8; Un monme aX i Y j Z k est reprsent par le vecteur (a, i, j, k). Un polynme p est repro e e o e sent par un tableau de monmes. La taille du polynme est donne par p[0, 0] et les e o o e monmes sont ordonns suivant lordre lexicographique de leurs multidegrs. o e e TYPE monome = ARRAY[0..NbreMaxIndeterminees] OF integer; polynome = ARRAY[0..NbreMaxMonomes] OF monome;

Pour manipuler facilement la taille dun polynme, on utilise les deux procdures suio e vantes : Version 15 janvier 2005

168
FUNCTION Taille (p: polynome): integer; Donne le nombre de monmes composant le polynme. o o BEGIN Taille := p[0, 0] END; { de "Taille" } PROCEDURE FixerTaille (VAR p: polynome; t: integer); BEGIN p[0, 0] := t END; { de "FixerTaille" }

Chapitre 7. Polynmes o

On dnit ensuite les polynmes 0 et 1. e o


VAR PolynomeNul, PolynomeUnite: polynome; PROCEDURE InitPolynomes; Dnition du polynme nul et du polynme unit. e o o e VAR i: integer; BEGIN FixerTaille(PolynomeNul, 0); FixerTaille(PolynomeUnite, 1); PolynomeUnite[1, 0] := 1; FOR i := 1 TO NbreMaxIndeterminees DO PolynomeUnite[1, i] := 0; END; { de "InitPolynomes" }

Comme les monmes sont rangs suivant leur multidegr, il est utile de pouvoir comparer o e e le multidegr de deux monmes. e o
FUNCTION CompareDegreMonome (n: integer; m1, m2: monome): integer; Cette fonction compare les deux monmes m1 et m2 dans lordre lexicographique des o multidegrs. Le rsultat est 1 si m2 < m1 , 1 si m1 < m2 , et 0 si m1 et m2 ont le mme e e e multidegr. e VAR i: integer; BEGIN i := 1; WHILE (i <= n) AND (m1[i] = m2[i]) DO { "and" squentiel } e i := i + 1; IF i = n + 1 THEN CompareDegreMonome := 0 ELSE CompareDegreMonome := Signe(m1[i] - m2[i]) END; { de "CompareDegreMonome"}

Le test dgalit de deux polynmes peut tre ralis ainsi : e e o e e e


FUNCTION SontEgauxPolynomes (n: integer; p1, p2: polynome): boolean; Teste si p1 = p2 .

Version 15 janvier 2005

7.2. Polynmes symtriques o e


VAR i, t: integer; SontEgaux: boolean; BEGIN IF Taille(p1) <> Taille(p2) THEN SontEgauxPolynomes := false ELSE BEGIN t := Taille(p1); i := 0; SontEgaux := true; WHILE (i <= t) AND SontEgaux DO BEGIN SontEgaux := (CompareDegreMonome(n, p1[i], p2[i]) = 0); i := i + 1 END; SontEgauxPolynomes := SontEgaux; END END; { de "SontEgauxPolynomes" }

169

La procdure qui suit permet dajouter un monme m a un tableau de monmes dj` e o ` o ea ordonn. Si aucun monme du tableau ne poss`de le mme multidegr que m, m est e o e e e insr a la place voulue. Si, au contraire, m a le mme multidegr quun monme m e e` e e o du tableau, on substitue a m le monme m + m si celui-ci est non nul. Sinon m est ` o supprim du tableau. e
PROCEDURE MonomePlusPolynome (n: integer; m: monome; VAR q: polynome); Ajoute le monme m au polynme ordonn q. o o e VAR i, j, t: integer; BEGIN t := Taille(q); i := 1; WHILE (i <= t) AND (CompareDegreMonome(n, q[i], m) < 0) DO i := i + 1; IF (i <= t) AND (CompareDegreMonome(n, q[i], m) = 0) THEN BEGIN Le monme qi a mme degr que m. o e e IF q[i, 0] = -m[0] THEN BEGIN Le monme qi est m. o t := t - 1; Un monme de moins . . . o FOR j := i TO t DO On limine 0 dans les monmes de q. e o q[j] := q[j + 1]; END ELSE q[i, 0] := q[i, 0] + m[0] END ELSE BEGIN m nappara pas dans q. t FOR j := t DOWNTO i DO On intercale m dans les monmes de q. o q[j + 1] := q[j]; t := t + 1; Un monme de plus . . . o q[i] := m;

Version 15 janvier 2005

170
END; FixerTaille(q, t); END; { de "MonomePlusPolynome"}

Chapitre 7. Polynmes o

Pour les entres-sorties, on utilise les procdures suivantes : e e


PROCEDURE EntrerPolynome (n: integer; VAR p: polynome; titre: texte); Achage du titre, puis lecture du polynme p a n indtermines. o ` e e i, t: integer; m: monome; PROCEDURE LireMonome (n: integer; VAR m: monome); VAR j: integer; BEGIN write(Coefficient du monome : ); readln(m[0]); FOR j := 1 TO n DO BEGIN write(Degr de X, j : 1, : ); readln(m[j]); END END; BEGIN { de "EntrerPolynome" } writeln(titre); p := PolynomeNul; write(Combien de monomes ? ); readln(t); writeln(Donner la suite des monomes.); FOR i := 1 TO t DO BEGIN LireMonome(n, m); MonomePlusPolynome(n, m, p) END END; { de "EntrerPolynome" } PROCEDURE EcrireMonome (n: integer; m: monome; indeterminee: char); Achage du monme m(x), o` x est lindtermine. o u e e VAR j: integer; EstUnOuMoinsUn: boolean; BEGIN EstUnOuMoinsUn := abs(m[0]) = 1; IF NOT EstUnOuMoinsUn THEN write(abs(m[0]) : 1); FOR j := 1 TO n DO BEGIN IF m[j] > 0 THEN BEGIN write(indeterminee, , j : 1); EstUnOuMoinsUn := false; IF m[j] > 1 THEN write(^, m[j] : 1); END

Version 15 janvier 2005

7.2. Polynmes symtriques o e


END; IF EstUnOuMoinsUn THEN write(1) END; { de "EcrireMonome" } PROCEDURE EcrirePolynome (n: integer; p: polynome; indeterminee: char; titre: texte); Achage du titre, puis du polynme p(x), o` x est lindtermine. o u e e VAR i, NbreMonomesParLigne: integer; BEGIN write(titre); CASE n OF 1: NbreMonomesParLigne := 8; 2: NbreMonomesParLigne := 5; 3, 4, 5: NbreMonomesParLigne := 4; OTHERWISE NbreMonomesParLigne := 3; END; IF Taille(p) = 0 THEN writeln(Polynome nul) ELSE BEGIN IF p[1, 0] < 0 THEN write(- ); EcrireMonome(n, p[1], indeterminee); END; FOR i := 2 TO Taille(p) DO BEGIN IF p[i, 0] > 0 THEN write( + ) ELSE write( - ); IF (i MOD NbreMonomesParLigne) = 1 THEN writeln; EcrireMonome(n, p[i], indeterminee); END; writeln; END; { de "EcrirePolynome"}

171

Laddition de deux polynmes est maintenant facile a raliser. Il sut de mettre bout o ` e a bout les tableaux reprsentant les polynmes et de rduire le tableau ainsi obtenu. ` e o e
PROCEDURE PolynomePlusPolynome (n: integer; p1, p2: polynome; VAR p: polynome); p = p 1 + p2 . VAR i: integer;

Version 15 janvier 2005

172
BEGIN p := p1; FOR i := 1 TO Taille(p2) DO MonomePlusPolynome(n, p2[i], p); END; { de "PolynomePlusPolynome"}

Chapitre 7. Polynmes o

Sur lexemple numrique de lnonc, on trouve bien sr e e e u


p1 = X 2^3X 3 - X 1^2X 3^2 + X 1^2X 2^2 p2 = X 2^2X 3^2 - X 2^3X 3 + 2X 1^2X 3^2 p1 + p2 = X 2^2X 3^2 + X 1^2X 3^2 + X 1^2X 2^2

La multiplication par un entier est encore plus simple.


PROCEDURE PolynomeParEntier (VAR p: polynome; entier: integer); VAR i: integer; BEGIN IF entier = 0 THEN p := PolynomeNul ELSE FOR i := 1 TO Taille(p) DO p[i, 0] := entier * p[i, 0]; END; { de "PolynomeParEntier"}

La dirence de deux polynmes sobtient en combinant les deux procdures prcdentes. e o e e e


PROCEDURE PolynomeMoinsPolynome (n: integer; p1, p2: polynome; VAR p: polynome); Calcule la dirence p1 p2 dans p. e BEGIN PolynomeParEntier(p2, -1); PolynomePlusPolynome(n, p1, p2, p) END; { de "PolynomeMoinsPolynome"}

Soit G un ensemble de gnrateurs du groupe des permutations de lensemble {1, . . . , n}. e e Pour tester si un polynme f Z[X1 , . . . , Xn ] est symtrique, il sut de vrier que o e e f (X(1) , . . . , X(n) ) = f (X1 , . . . , Xn ) pour toute permutation G. Si n > 1, on peut prendre G = {, }, o` est la u permutation circulaire (1, 2, . . . , n) et la transposition (1, 2).
FUNCTION EstSymetrique (n: integer; p: polynome): boolean; Teste si p est symtrique. e VAR q: polynome; m: monome; i, j: integer; b: boolean;

Version 15 janvier 2005

7.2. Polynmes symtriques o e

173

BEGIN IF n <= 1 THEN b := true ELSE BEGIN q := PolynomeNul; FOR i := 1 TO Taille(p) DO BEGIN On permute les indtermines X 1 et X2 . e e m := p[i]; m[1] := p[i, 2]; m[2] := p[i, 1]; MonomePlusPolynome(n, m, q); END; b := SontEgauxPolynomes(n, p, q); IF b THEN BEGIN On fait une permutation circulaire des indtermines X1 , X2 , . . . , Xn . e e q := PolynomeNul; FOR i := 1 TO Taille(p) DO BEGIN FOR j := 1 TO n DO m[j] := p[i, (j MOD n) + 1]; MonomePlusPolynome(n, m, q) END; b := SontEgauxPolynomes(n, p, q); END; END; EstSymetrique := b; END; { de "EstSymetrique"}

Sur les exemples de lnonc, seul le polynme p1 + p2 est symtrique. e e o e Dans le cas n = 2, le calcul du polynme pf associ a chaque polynme symtrique f o e` o e est simpli et on a e k 0 pf = X2 f k
k0

o` les polynmes fk sont dnis par la rcurrence u o e e f0 = f et fk+1 =


0 fk fk (X1 + X2 ) X1 X2

Une premi`re procdure permet de passer du polynme f Z[X1 , X2 ] au polynme e e o o f 0 Z[X1 ] dni par f 0 (X1 ) = p(X1 , 0). e
PROCEDURE pZero (p: polynome; VAR p0: polynome); Passe de p(X1, X2) a p0 (X1) = p(X1, 0). ` VAR i: integer; m: monome; BEGIN p0 := PolynomeNul; FOR i := 1 TO Taille(p) DO IF p[i, 2] = 0 THEN BEGIN

Version 15 janvier 2005

174
m[0] := p[i, 0]; m[1] := p[i, 1]; m[2] := 0; MonomePlusPolynome(n, m, p0); END; { de "pZero"}

Chapitre 7. Polynmes o

END;

La formule de rcurrence peut tre implmente comme suit : e e e e


PROCEDURE XplusYpuissanceK (k: integer; VAR p: polynome); VAR i: integer; BEGIN FixerTaille(p, k + 1); FOR i := 0 TO k DO BEGIN p[i + 1, 0] := Binomial(k, i); p[i + 1, 1] := i; p[i + 1, 2] := k - i; END END; { de "XplusYpuissanceK"} PROCEDURE Transforme (p: polynome; VAR q: polynome); Passe de p(X1, X2) a p(X1 + X2, 0). ` VAR i: integer; r: polynome; BEGIN q := PolynomeNul; FOR i := 1 TO Taille(p) DO IF p[i, 2] = 0 THEN BEGIN XplusYpuissanceK(p[i, 1], r); PolynomeParEntier(r, p[i, 0]); PolynomePlusPolynome(2, q, r, q); END; END; { de "Transforme"} PROCEDURE Recurrence (p: polynome; VAR q: polynome); Passe de p(X1 , X2 ) a (p(X1 , X2 ) p(X1 + X2 , 0))/X1 X2 . ` VAR i: integer; r: polynome; BEGIN Transforme(p, r); PolynomeMoinsPolynome(2, p, r, q); FOR i := 1 TO Taille(q) DO BEGIN q[i, 1] := q[i, 1] - 1; q[i, 2] := q[i, 2] - 1; END; END; { de "Recurrence"} p = (X + Y ) k

Le calcul de pf sobtient maintenant facilement. Version 15 janvier 2005

7.2. Polynmes symtriques o e


PROCEDURE pParX2PuissanceK (K: integer; VAR p: polynome); VAR i: integer; BEGIN FOR i := 1 TO Taille(p) DO p[i, 2] := p[i, 2] + k; END; { de "pParX2PuissanceK"} PROCEDURE Calcul pf (f: polynome; VAR pf: polynome); VAR i: integer; p, p0: polynome; BEGIN pf := PolynomeNul; p := f; i := 0; WHILE Taille(p) <> 0 DO BEGIN pZero(p, p0); pParX2PuissanceK(i, p0); PolynomePlusPolynome(2, pf, p0, pf); Recurrence(p, p); i := i + 1; END; END; { de "Calcul pf"}

175

Exemple numrique. On trouve e


10 10 X1 + X2 = 2s5 + 25s2 s4 50s4 s3 + 35s6 s2 10s8 s2 + s10 2 1 2 1 2 1 2 1 1

Les formules de Newton reposent sur le calcul des coecients ar1 ,r2 ,...,rn = (1)r2 +r4 ++r2[n/2] (r1 + 2r2 + + nrn )(r1 + + rn 1)! r1 ! rn ! (r1 + + rn )! r1 !r2 ! rn !

On commence par calculer le coecient multinomial r1 + r 2 + + r n r1 , r2 , . . . , rn en observant que r1 + r 2 + + r n r1 , r2 , . . . , rn = r1 + r 2 r2 r1 + r 2 + r 3 r1 + r 2 + + r n r3 rn =

La procdure correspondante fait appel a la procdure Binomial dnie dans la biblioe ` e e th`que gnrale. e e e
FUNCTION Multinomial (r: monome): integer; `1 2 Donne la valeur du Multinomial rr1+r2 ,++rn . ,r ... ,rn

Version 15 janvier 2005

176
VAR i, SommePartielle, M: integer; BEGIN M := 1; IF n > 1 THEN BEGIN SommePartielle := r[1]; FOR i := 2 TO n DO BEGIN SommePartielle := SommePartielle + r[i]; M := M * Binomial(SommePartielle, r[i]); END; END; Multinomial := M; END; { de "Multinomial"}

Chapitre 7. Polynmes o

Le calcul de ar1 ,r2 ,...,rn nore plus de dicult. e


FUNCTION Coefficient (r: monome): integer; VAR i, SommeRangPair, Somme, Poids, C: integer; BEGIN Somme := 0; Poids := 0; SommeRangPair := 0; FOR i := 1 TO n DO BEGIN Poids := Poids + i * r[i]; Somme := Somme + r[i] END; FOR i := 1 TO n DIV 2 DO SommeRangPair := SommeRangPair + r[2 * i]; C := Multinomial(r) * poids; C := C DIV Somme; IF odd(SommeRangPair) THEN C := -C; Coefficient := C; END; { de "Coefficient"}

Il reste a engendrer, pour chaque couple dentiers (k, n), la suite des n-uplets (r1 , . . . , rn ) ` tels que r1 + 2r2 + + nrn = k. Ce type de probl`me est trait en dtail au chapitre e e e 8. Nous donnerons donc les procdures sans commentaires supplmentaires. e e
PROCEDURE PremierePartition (VAR a: monome; n, k: integer); Calcule dans r la premi`re suite r1 , . . . , rn telle que r1 + 2r2 + + nrn = k. e VAR i, s: integer; BEGIN FOR i := 1 TO n DO a[i] := 0; a[n] := k DIV n; s := k MOD n; IF s > 0 THEN

Version 15 janvier 2005

7.2. Polynmes symtriques o e


a[s] := 1; END; { de "PremierePartition"} PROCEDURE PartitionSuivante (VAR a: monome; k: integer; VAR derniere: boolean); Calcule dans r la suite suivante r1 , . . . rn telle que r1 + 2r2 + + nrn = k. VAR i, s: integer; BEGIN i := 2; WHILE a[i] = 0 DO i := i + 1; s := i + a[1]; Reste a rpartir. ` e a[1] := 0; a[i] := a[i] - 1; i := i - 1; a[i] := s DIV i; IF i > 1 THEN BEGIN s := s MOD i; IF s > 0 THEN a[s] := 1 END; derniere := a[1] = k; END;

177

Enn, les formules de Newton sont calcules a laide de la procdure suivante : e ` e


PROCEDURE Newton (n, k: integer; VAR p: polynome); VAR i: integer; derniere: boolean; a: monome; BEGIN PremierePartition(a, n, k); p[1] := a; p[1, 0] := Coefficient(a); i := 1; IF k > 1 THEN REPEAT i := i + 1; PartitionSuivante(a, k, derniere); p[i] := a; p[i, 0] := Coefficient(a); UNTIL derniere; p[0, 0] := i; END; { de "Newton"}

Voici quelques exemples dexcution. On trouve, pour k = 10 et n = 3, e


p = 10s 1s 3^3 + 15s 2^2s 3^2 - 60s 1^2s 2s 3^2 + 25s 1^4s 3^2 40s 1s 2^3s 3 + 100s 1^3s 2^2s 3 - 60s 1^5s 2s 3 + 10s 1^7s 3 2s 2^5 + 25s 1^2s 2^4 - 50s 1^4s 2^3 + 35s 1^6s 2^2 -

Version 15 janvier 2005

178
10s 1^8s 2 + s 1^10

Chapitre 7. Polynmes o

Pour n = 7 et k = 9,
p = - 9s 2s 7 + 9s 1^2s 7 - 9s 3s 6 + 18s 1s 2s 6 - 9s 1^3s 6 - 9s 4s 5 + 18s 1s 3s 5 + 9s 2^2s 5 - 27s 1^2s 2s 5 + 9s 1^4s 5 + 9s 1s 4^2 + 18s 2s 3s 4 27s 1^2s 3s 4 - 27s 1s 2^2s 4 + 36s 1^3s 2s 4 9s 1^5s 4 + 3s 3^3 - 27s 1s 2s 3^2 + 18s 1^3s 3^2 - 9s 2^3s 3 + 54s 1^2s 2^2s 3 45s 1^4s 2s 3 + 9s 1^6s 3 + 9s 1s 2^4 30s 1^3s 2^3 + 27s 1^5s 2^2 - 9s 1^7s 2 + s 1^9

Pour n = 4 et k = 15,
p = - 15s 3s 4^3 + 60s 1s 2s 4^3 - 50s 1^3s 4^3 + 90s 1s 3^2s 4^2 + 90s 2^2s 3s 4^2 - 450s 1^2s 2s 3s 4^2 + 225s 1^4s 3s 4^2 - 150s 1s 2^3s 4^2 + 450s 1^3s 2^2s 4^2 - 315s 1^5s 2s 4^2 + 60s 1^7s 4^2 + 60s 2s 3^3s 4 150s 1^2s 3^3s 4 - 450s 1s 2^2s 3^2s 4 + 900s 1^3s 2s 3^2s 4 - 315s 1^5s 3^2s 4 75s 2^4s 3s 4 + 900s 1^2s 2^3s 3s 4 - 1575s 1^4s 2^2s 3s 4 + 840s 1^6s 2s 3s 4 135s 1^8s 3s 4 + 90s 1s 2^5s 4 - 525s 1^3s 2^4s 4 + 840s 1^5s 2^3s 4 540s 1^7s 2^2s 4 + 150s 1^9s 2s 4 - 15s 1^11s 4 + 3s 3^5 75s 1s 2s 3^4 + 75s 1^3s 3^4 - 50s 2^3s 3^3 + 450s 1^2s 2^2s 3^3 525s 1^4s 2s 3^3 + 140s 1^6s 3^3 + 225s 1s 2^4s 3^2 - 1050s 1^3s 2^3s 3^2 + 1260s 1^5s 2^2s 3^2 - 540s 1^7s 2s 3^2 + 75s 1^9s 3^2 + 15s 2^6s 3 315s 1^2s 2^5s 3 + 1050s 1^4s 2^4s 3 - 1260s 1^6s 2^3s 3 + 675s 1^8s 2^2s 3 165s 1^10s 2s 3 + 15s 1^12s 3 - 15s 1s 2^7 + 140s 1^3s 2^6 378s 1^5s 2^5 + 450s 1^7s 2^4 - 275s 1^9s 2^3 + 90s 1^11s 2^2 15s 1^13s 2 + s 1^15

7.3
7.3.1

Factorisation de polynmes o
Enonc : factorisation de polynmes e o

Soit K = Z/2Z. Les polynmes considrs dans ce probl`me appartiennent a K[X], o e e e ` lanneau des polynmes a coecients dans K. On note 0 (respectivement 1) le polyo ` nme nul (respectivement le polynme de degr 0 et de terme constant gal a 1). Le o o e e ` degr dun polynme est not deg(f ). Soient f et h deux polynmes. On dit que f e o e o divise (ou est un diviseur de) h sil existe un polynme g tel que f g = h. Un polyo nme f est irrductible si ses seuls diviseurs sont 1 et f et il est rductible sinon. On o e e appelle factorisation dun polynme f une suite nie de polynmes (fi )1in telle que o o f = f1 f2 fn . Une telle factorisation est non triviale si lun des fi est dirent de f et e de 1. On rappelle que tout polynme non nul f se factorise comme produit de polynmes o o irrductibles et que cette dcomposition est unique a lordre des facteurs pr`s. Si f est e e ` e Version 15 janvier 2005

7.3. Factorisation de polynmes o

179

un polynme, on note f son polynme driv. Un polynme f est un carr sil existe o o e e o e un polynme g tel que f = g 2 . On dit que f est sans carr sil nest pas divisible par o e un carr de degr strictement positif. Enn, si f , g et h sont des polynmes, on crit e e o e f g mod h lorsque h divise f g. 1. a) Ecrire une procdure qui eectue la division euclidienne de deux polynmes. e o b) Ecrire une procdure qui calcule le pgcd de deux polynmes, par lalgorithme dEue o clide. Exemple numrique : calculer le pgcd des polynmes X 105 + 1 et X 72 + X + 1. e o 2. a) Dmontrer que f est un carr si et seulement si f = 0. e e b) Dmontrer que tout polynme non nul f se factorise de faon unique en f = g 2 h, o` e o c u h est sans carr. e c) Dmontrer que cette unique factorisation est donne par la formule g 2 = pgcd(f, f ). e e 3. Ecrire une procdure qui calcule g et h a partir de f . e ` 17 14 13 Exemple numrique : f = X + X + X + X 12 + X 11 + X 10 + X 9 + X 8 + X 7 + X 5 + e X 4 + X + 1. On suppose dsormais que f est sans carr et que f (0) = 1. Soit f = f 1 f2 fs la e e factorisation de f en produit de polynmes irrductibles. o e 4. Dmontrer que pour toute famille (gi )1is de polynmes, il existe exactement un e o polynme g tel que o deg(g) < deg(f ) et, pour 1 i s, 5. On note H(f ) lensemble des polynmes h tels que o deg(h) < deg(f ) et h2 h mod f a) Dmontrer que H(f ) est un sous-espace vectoriel de dimension s de K[X] et, que e pour tout h H(f ), on a f = pgcd(f, h)pgcd(f, h 1). b) On dit quun polynme h H(f ) spare deux facteurs fi et fj de f si ces deux o e facteurs ne divisent pas simultanment lun des polynmes pgcd(f, h) ou pgcd(f, h 1). e o Dmontrer que deux facteurs distincts de la dcomposition de f en produit de facteurs e e irrductibles peuvent toujours tre spars par un lment de H(f ). e e e e ee 6. Soit p0 un polynme. On consid`re la suite de polynmes pn dnie par pn+1 = p2 . o e o e n a) Dmontrer quil existe un plus petit entier n0 > 0 tel que f divise pn0 p0 . Dmontrer e e que si f divise pn p0 , alors n0 divise n. b) En dduire quil existe un plus petit entier strictement positif (f ) tel que f divise e X (f ) 1. Dmontrer que (f ) est impair. e Version 15 janvier 2005 g gi mod fi

180

Chapitre 7. Polynmes o

7. a) Dmontrer que si f est irrductible de degr d, lensemble des polynmes de e e e o degr infrieur a d, muni de laddition et de la multiplication modulo f , est un corps a e e ` ` 2d lments. ee d b) En dduire que f est irrductible si et seulement si X 2 X mod f et, pour tout e e d/p diviseur premier p de d, pgcd(X 2 X, f ) = 1. 8. Ecrire une procdure qui prend en argument un polynme f et qui dtermine si f e o e est irrductible. e 9. a) Dmontrer que, pour tout i 1, il existe un plus petit entier naturel i (f ) tel e que i (f ) X i2 X i 0 mod f On pose r0 (f ) = 1 et, pour i > 0, on note ri (f ) le reste de la division euclidienne du j X i2 par f . On pose galement g = X (f ) 1. e polynme o
0j<i (f )

b) Dmontrer que la famille ri (g) e

1i<(f )

engendre lespace vectoriel H(g).

10. a) Dmontrer que deux facteurs distincts de la dcomposition de g en produit de e e facteurs irrductibles peuvent toujours tre spars par lun des polynmes r i (g). e e e e o b) En dduire que deux facteurs distincts de la dcomposition de f en produit de facteurs e e irrductibles peuvent toujours tre spars par lun des polynmes ri (f ). e e e e o 11. Ecrire une procdure qui prend en argument un polynme f et qui ache le e o message polynme irrductible si f est irrductible, et qui ache une factorisation o e e non triviale de f sinon. Exemples numriques : f = X 7 + X + 1, f = X 8 + X + 1, e f= X i.
0i16

7.3.2

Solution : Factorisation de polynmes o

Le probl`me dcrit une mthode de factorisation des polynmes a coecients dans e e e o ` Z/2Z. Cette mthode se gnralise en fait aux polynmes a coecients dans Z/pZ e e e o ` (pour p premier), ou mme dans un corps ni. Dans le cas de Z/2Z, on peut toutefois e tirer parti de larithmtique tr`s particuli`re des anneaux commutatifs de caractristique e e e e 2, rsume dans lnonc suivant. e e e e Proposition 7.3.1. Dans un anneau commutatif K de caractristique 2, tout lment e ee est gal a son oppos et, pour toute famille (ai )1in dlments de K, on a e ` e ee ai
1in 2

=
1in

a2 i

Preuve. Pour tout x K, on a 2x = x + x = 0, puisque K est de caractristique 2, et e donc x = x. La seconde partie de lnonc rsulte de la formule du binme gnralise, e e e o e e e puisque les termes de la forme 2ai aj sont nuls. Version 15 janvier 2005

7.3. Factorisation de polynmes o

181

Revenons a lanneau K = Z/2Z. Pour factoriser les polynmes de K[X], une premi`re ` o e rduction consiste a se ramener a des polynmes sans carr. Elle est fonde sur les deux e ` ` o e e rsultats suivants. e Proposition 7.3.2. Un polynme f est un carr si et seulement si f = 0. o e Preuve. Si f = g 2 , alors f = 2gg = 0. Rciproquement, soit f = e
0in

ai X i tel que

f = 0. On a alors f =
0in

iai X i1 =
i impair 0in

ai X i1 = 0

Par consquent les coecients ai sont nuls pour i impair et donc, dapr`s la proposition e e 7.3.1, a2i X i )2 a2i X 2i = ( f=
0in/2 0in/2

Proposition 7.3.3. Tout polynme f non nul se factorise de faon unique sous la o c forme f = g 2 h, o` h est sans carr. Cette factorisation unique est donne par la formule u e e g 2 = pgcd(f, f ). Preuve. Puisque K[X] est principal, tout polynme non nul admet une dcomposition o e unique comme produit de polynmes irrductibles. En regroupant entre eux les facteurs o e gaux, on obtient une factorisation de la forme suivante, o` I dsigne lensemble des e u e polynmes irrductibles, et les np sont des entiers presque tous nuls (cest-`-dire nuls o e a sauf pour un nombre ni de p) : f= p np
pI

On obtient alors une dcomposition de la forme voulue en posant e g=


pI

np /2

et

h=
pI

p rp

o` rp = 1 si np est impair et rp = 0 sinon. Lunicit dcoule de ce qui suit : si f = g 2 h u e e avec h sans carr, on a f = g 2 h et donc pgcd(f, f ) = g 2 pgcd(h, h ). Soit p un facteur e irrductible de pgcd(h, h ) et posons h = pq. Il vient h = pq + p q et, puisque p divise e h , p divise p q. Si p = 0, p est un carr dapr`s la proposition 7.3.2, ce qui contredit le e e fait que p est irrductible. Donc p = 0 et, comme p est de degr infrieur a p, p ne peut e e e ` diviser p et divise donc q dapr`s le lemme de Gauss. Il en rsulte que p2 divise h, ce e e qui contredit lhypoth`se que h est sans carr. Donc pgcd(h, h ) = 1 et pgcd(f, f ) = g 2 . e e Comme f nest pas nul, g est non nul et la factorisation est unique. On consid`re dsormais un polynme f sans carr. On peut galement supposer que e e o e e f (0) = 1, sinon le polynme X est un diviseur trivial de f . Soit f = f1 f2 fs la o factorisation de f en produit de polynmes irrductibles. Comme f est sans carr, o e e Version 15 janvier 2005

182

Chapitre 7. Polynmes o

les fi sont deux a deux distincts (et donc aussi premiers entre eux). Lalgorithme de ` factorisation repose sur un rsultat connu sous le nom de thor`me des restes chinois . e e e Nous donnons ici la version relative aux polynmes. (Lnonc gnral est le suivant : o e e e e soient I1 , . . . , In des idaux dun anneau commutatif unitaire A tels que Ii + Ij = A e pour i = j. Quels que soient les lments a1 , . . . , an de A, il existe a A tel que ee a ai mod Ii pour tout i.) Thor`me 7.3.4 (Thor`me des restes chinois). Pour toute famille (gi )1in de polye e e e nmes, il existe un unique polynme g tel que deg(g) < deg(f ) et g gi mod fi pour o o 1 i n. Preuve. Dmontrons dabord lunicit. Si g et h sont deux solutions du probl`me, leur e e e dirence g h vrie g h 0 mod fi pour 1 i n. Comme les fi sont irrductibles e e e et distincts, il en dcoule g h 0 mod f et, comme deg(g h) < deg(f ), on a g = h. e Il reste a trouver une solution. Posons, pour 1 i n, ` fi =
j=i

fj

Comme les polynmes fj sont deux a deux distincts, les polynmes fi et fi sont premiers o ` o entre eux. Dapr`s le thor`me de Bezout, il existe des polynmes pi et qi tels que e e e o pi fi + qi fi = 1. Posons g = gj qj fj . Il vient
1jn

1jn

gj qj fj gi qi fi gi (1 pi fi ) gi

mod fi

et donc le reste de la division euclidienne de g par f est solution du probl`me cherch. e e Notons H(f ) lensemble des polynmes h tels que o deg(h) < deg(f ) et h2 h mod f Lalgorithme est fond sur la proprit suivante, qui fournit dans certains cas une face ee torisation de f . Proposition 7.3.5. Lensemble H(f ) est un sous-espace vectoriel de K[X] de dimension s et, pour tout h H(f ), on a f = pgcd(f, h)pgcd(f, h 1).

Preuve. Les conditions h1 h2 mod f et h2 h2 mod f entra nent, dapr`s la propoe 1 2 sition 7.3.1, h1 + h2 h2 + h2 = (h1 + h2 )2 mod f . En outre, h1 + h2 = h1 h2 et 1 2 0 H(f ). Donc H(f ) est un sous-espace vectoriel de K[X]. De plus, comme les fi sont distincts, donc premiers entre eux, on a h2 h mod f si et seulement si h2 h mod fi pour 1 i s. Cette derni`re condition quivaut a dire que fi divise lun des polynmes e e ` o Version 15 janvier 2005

7.3. Factorisation de polynmes o

183

h ou (h 1) (puisque chaque fi est irrductible et que h2 h = h(h 1)). En rsum, e e e un polynme h appartient a H(f ) si deg(h) < deg(f ) et sil existe, pour 1 i s, un o ` lment ai de K tel que h ai mod fi . Or le thor`me chinois montre que, pour une ee e e famille (ai )1is donne, les conditions prcdentes sont vries par un polynme et e e e e e o un seul. Il en rsulte que H(f ) contient 2s lments et sa dimension est donc s. e ee Soit h H(f ). Puisque f divise h2 h, on a f = pgcd(f, h(h1)). Puisque h et h1 sont premiers entre eux (dapr`s le thor`me de Bezout), on a f = pgcd(f, h)pgcd(f, h 1). e e e On dduit de la proposition 7.3.5 un premier crit`re dirrductibilit. e e e e Corollaire 7.3.6. Le polynme f est irrductible si et seulement si H(f ) = {0}. o e La proposition 7.3.5 ne fournit pas ncessairement une factorisation non triviale de f . e Cependant, si le polynme f est rductible, il est possible de retrouver tous ses facteurs o e irrductibles a laide de la proposition 7.3.5. On dit quun polynme h H(f ) spare e ` o e deux facteurs fi et fj si ces deux facteurs ne divisent pas simultanment lun des polye nmes pgcd(f, h) ou pgcd(f, h 1). o Proposition 7.3.7. Deux facteurs distincts de la dcomposition de f en produit de e facteurs irrductibles peuvent toujours tre spars par un lment de H(f ). e e e e ee Preuve. Soient fi et fj deux facteurs distincts de la dcomposition de f en produit de e facteurs irrductibles. Dapr`s le thor`me chinois, il existe un polynme h (unique) tel e e e e o que deg(h) < deg(f ), h 1 mod fi et h 0 mod fk pour k = i. Ce polynme spare fi o e et fj par construction, et appartient a H(f ), puisque h2 h mod fk pour 1 k s. ` La suite de lalgorithme consiste a rechercher un lment de H(f ). Elle repose sur le ` ee rsultat suivant. e Proposition 7.3.8. Soit p0 un polynmeet soit (pn )n0 la suite de polynmes dnie o o e par pn+1 = p2 . Il existe alors un plus petit entier n0 > 0 tel que f divise pn0 p0 . De n plus, si f divise pn p0 , alors n0 divise n. Preuve. Puisquil ny a quun nombre ni de restes modulo f , il existe deux entiers n > m tels que pn pm mod f On observe alors, en utilisant la proposition 7.3.1, que
2 pn pm p2 p2 (p0 0 0
n m nm

p 0 )2

(pnm p0 )2

0 mod f

et par consquent, e pnm p0 0 mod f Version 15 janvier 2005

184

Chapitre 7. Polynmes o

puisque f est sans carr. Ceci dmontre lexistence de n0 . Supposons pn p0 et soit e e n = qn0 + r la division euclidienne de n par n0 . Il vient, comme ci-dessus pn pqn0 p2 p2 0 0
n qn0

(p2 p0 )2 0

qn0

0 mod f

et par consquent pr p0 mod f puisque f est sans carr. Comme r < n0 , ceci entra e e ne r = 0 et donc n0 divise n. Corollaire 7.3.9. Il existe un plus petit entier strictement positif (f ) tel que f divise X (f ) 1. Cet entier est impair. Preuve. En choisissant p0 = X dans la proposition 7.3.8, on constate que f divise un polynme de la forme X m+1 X = X(X m 1). Comme f ne divise pas X (car f (0) = 1 o et f nest pas constant), f divise X m 1. Il existe donc un plus petit entier (f ) tel que f divise X (f ) 1. Cet entier est impair, sinon f = (X (f )/2 1)2 dapr`s la proposition e 7.3.1. On dduit de ce qui prc`de un crit`re simple pour tester si f est irrductible. Cest ce e e e e e test qui est ralis dans le programme de la section suivante. Notons d le degr de f . e e e Proposition 7.3.10. Le polynme f est irrductible si et seulement si X 2 X mod o e d/p f et pgcd(X 2 X, f ) = 1, pour tout diviseur premier p de d. Preuve. Supposons dabord f irrductible. Soit (f ) lidal de K[X] engendr par f . e e e Lanneau quotient k = K[X]/(f ) est un corps : en eet, si g (f ), pgcd(f, g) = 1 / (puisque f est irrductible) et, dapr`s le thor`me de Bezout, il existe des polynmes e e e e o q et r tels que qf + rg = 1, ce qui montre que r est linverse de g modulo f . Puisquil y a exactement 2d restes modulo f , le corps k contient 2d lments. En particulier, le ee groupe multiplicatif k est dordre 2d 1. Il en rsulte en particulier, puisque X est non e nul modulo f , d d X 2 1 1 mod f et donc X 2 X mod f
m m d

Ensuite, si X 2 X mod f , on a aussi X i2 X i mod f pour tout i > 0 et, dapr`s e m la proposition 7.3.1, g 2 g mod f pour tout polynme g. Il en dcoule que lquation o e e m Y 2 Y = 0 poss`de au moins 2d racines distinctes dans le corps k et, par consquent, e e 2d/p m d. En particulier, si p est un diviseur premier de d, on a X X 0 mod f et d/p donc pgcd(X 2 X, f ) = 1, puisque f est irrductible. e Supposons maintenant que X 2 X mod f et pgcd(X 2 X, f ) = 1, pour tout diviseur premier p de d. Supposons f rductible et soit f1 un diviseur irrductible de f . e e Ce qui prc`de montre que e e deg(f1 ) X2 X mod f1
d d d/p

Comme dautre part, X 2 X 0 mod f1 , la proposition 7.3.8 montre que deg(f1 ) divise d. En particulier, il existe un nombre premier p tel que deg(f1 ) divise d/p. On a d/p d/p alors X 2 X mod f1 et donc pgcd(X 2 , f ) = 1, ce qui contredit lhypoth`se. Donc e f est irrductible. e Version 15 janvier 2005

7.3. Factorisation de polynmes o

185

Si le test dcrit dans la proposition 7.3.10 montre que f est rductible, il convient e e den chercher les facteurs irrductibles. Ceci sera fait au moyen dune famille ri (f ) de e polynmes que nous introduisons maintenant. En appliquant la proposition 7.3.8 avec o i (f ) p0 = X i , on dtermine un plus petit entier strictement positif i (f ) tel que X i2 e X i mod f . On pose alors r0 (f ) = 1 et, pour i > 0, on note ri (f ) le reste de la division j euclidienne du polynme o X i2 par f .
0j<i (f )

Proposition 7.3.11. Les polynmes ri (f ) appartiennent a H(f ). o ` Preuve. On a, dapr`s la dnition de i (f ) et la proposition 7.3.1 : e e
2 ri (f ) = X i2 +X i2 + +X i2
1 2 i (f )

X i2 +X i2 + +X i2

i (f )1

+X i ri (f ) mod f.

On va dmontrer que les ri (f ) permettent de sparer deux a deux les diviseurs irrduce e ` e tibles de f . On commence par tablir ce rsultat pour le polynme g = X (f ) 1. Pour e e o pouvoir appliquer les propositions 7.3.5, 7.3.7 et 7.3.11 a g, il faut dabord sassurer que ` g est sans carr. Or on a g = (f )X (f )1 et ce polynme nest pas nul, puisque (f ) e o est impair. Il en rsulte pgcd(g, g ) = 1 (puisque 0 nest pas racine de g) et donc g est e sans carr dapr`s la proposition 7.3.3. e e Proposition 7.3.12. Soit g = X (f ) 1. La famille ri (g) Preuve. Posons, pour simplier, = (f ) et soit h=
0k< 0i<(f )

engendre H(g).

hk X k

un lment de H(g). Il vient ee h2 =


0k<

hk X 2k

hk X 2k +
0k 1 2
1 2 <k<

hk X 2k mod g

Comme est impair et puisque h2 h mod g, il vient, en notant < i > le reste de la division de i par , hk = h<2k> (0 k < ) On partitionne alors lensemble {0, . . . , 1} suivant la relation dquivalence dnie e e par k k sil existe i tel que k = < k 2i > Si S est un syst`me de reprsentants de cette quivalence, on a e e e h
kS

hk (X k + X k2 + + X k2

k (g)1

hk rk (g) mod g
kS

Comme le degr des polynmes h et rk (g) est infrieur a deg(g), on a en fait h = e o e ` hk rk (g).
kS

Version 15 janvier 2005

186

Chapitre 7. Polynmes o

Proposition 7.3.13. Deux facteurs distincts dune dcomposition de g en produit e de facteurs irrductibles peuvent toujours tre spars par lun des polynmes r i (g) e e e e o (1 i < (f )). Preuve. Soit g = g1 g2 gs la dcomposition de g en produit de polynmes irrductibles. e o e Quitte a changer lordre des facteurs, il sut dtablir que lun des ri = ri (g) spare g1 ` e e et g2 . Supposons que ce soit faux. Alors les polynmes g1 et g2 divisent simultanment o e lun des polynmes ri ou ri 1. Autrement dit, il existe ari K tel que o ri ari mod g1 et ri ari mod g2

Comme les ri engendrent H(g) dapr`s la proposition 7.3.12, la proprit prcdente e ee e e stend par linarit : pour tout h H(g), il existe ah K tel que e e e h ah mod g1 et h ah mod g2 ()

Or dapr`s la proposition 7.3.7, il existe un polynme h H(g) qui spare g1 et g2 , et e o e ce polynme ne peut vrier les relations () ci-dessus, ce qui conclut la dmonstration o e e par labsurde. La proposition 7.3.13 permet de dterminer les facteurs irrductibles de g. Pour trouver e e ceux de f , il faut dabord prciser le lien entre les polynmes ri (f ) et ri (g). e o Proposition 7.3.14. Pour tout i 0, il existe ci K tel que ri (g) ci ri (f ) mod f .

Preuve. Reprenons les notations de la proposition 7.3.8 et prenons p0 = X i . Par dnition, i (f ) est le plus petit entier strictement positif tel que pi (f ) p0 mod f . e Puisque pi (g) p0 mod g, on a aussi pi (g) p0 mod f . Or on a vu dans la preuve de la proposition 7.3.8 que si pn pm mod f , avec n > m, alors pnm p0 mod f . Il en rsulte que i (g) est multiple de i (f ) (car sinon, le reste r de la division de i (g) e par i (f ) vrierait pr p0 mod f , en contradiction avec la dnition de i (f )). Il en e e dcoule e ri (g) p0 + p1 + + pi (g)1 On en dduit le rsultat suivant. e e Proposition 7.3.15. Deux facteurs distincts dune dcomposition de f en produit e de facteurs irrductibles peuvent toujours tre spars par lun des polynmes r i (f ) e e e e o (1 i < (f )). Preuve. Soient f1 et f2 deux facteurs irrductibles distincts de f et donc de g. Dapr`s la e e proposition 7.3.13, lun des ri (g) spare f1 et f2 dans la dcomposition de g. Donc, quitte e e a changer f1 et f2 , on peut supposer que f1 divise pgcd(g, ri (g)) mais pas pgcd(g, ri (g) `e 1) et que f2 divise pgcd(g, ri (g) 1) mais pas pgcd(g, ri (g)). On en dduit, en rduisant e e modulo f et en utilisant la proposition 7.3.14, que f1 divise pgcd(f, ci ri (f )) mais pas Version 15 janvier 2005 i (g) i (g) (p0 + p1 + + pi (f )1 ) ri (f ) mod f i (f ) i (f )

7.3. Factorisation de polynmes o

187

pgcd(f, ci ri (f ) 1) et que f2 divise pgcd(f, ci ri (f ) 1) mais pas pgcd(f, ci ri (f )). Ceci entra en particulier ci = 1 (car sinon ci = 0 et pgcd(f, ci ri (f ) 1) = 1) et donc ri (f ) ne spare f1 et f2 . e Les rsultats qui prc`dent fournissent un algorithme de factorisation dun polynme en e e e o trois tapes : e 1. On se ram`ne a un polynme sans carr a laide de la proposition 7.3.3. e ` o e` 2. Si f est sans carr, on utilise la proposition 7.3.10 pour dterminer si f est irre e e ductible. 3. Si f est rductible, on calcule la suite des polynmes ri (f ) pour sparer les polye o e nmes irrductibles de f . o e Lalgorithme prcdent est en fait une variante de lalgorithme de Berlekamp, qui repose e e sur les mmes principes. Dans cet algorithme, on dtermine lespace vectoriel H(f ) de e e la mani`re suivante. On pose d = deg(f ) et, pour tout k 0, on note e ck,0 + ck,1 X + + ck,d1 X d1 le reste de la division de X 2 par f . On pose enn C = (ci,j )1i,jd1 . Le polynme o h = h0 + h1 X + + hd1 X d1 appartient a H(f ) si et seulement si ` (h0 , h1 , . . . , hd1 )C = (h0 , h1 , . . . , hd1 ) Autrement dit, H(f ) sidentie a lensemble des vecteurs h = (h0 , h1 , . . . , hd1 ) de K d ` tels que h(C Id ) = 0 Pour rsoudre ce probl`me dalg`bre linaire, on peut par exemple trianguler la matrice e e e e C Id par une des mthodes exposes par ailleurs dans ce livre. Dapr`s la proposition e e e 7.3.5, la dimension de H(f ) est gale au nombre de facteurs irrductibles de f . e e
k

7.3.3

Programme : factorisation de polynmes o

Il est commode de reprsenter les polynmes a coecients dans K par des tableaux e o ` dentiers. Comme K poss`de deux lments, on pourrait galement songer a des tableaux e ee e ` de boolens, mais la mise au point serait plus dlicate. Le degr du polynme est e e e o mmoris dans la composante dindice 1 du tableau. Par convention, le degr du polye e e nme nul est 1. o Version 15 janvier 2005

188
CONST DegreMax = 127; DegrePolNul = -1;

Chapitre 7. Polynmes o

Le degr maximal des polynmes. e o Le degr du polynme nul. e o

TYPE pol01 = ARRAY[-1..DegreMax] OF integer; Le degr du polynme p est p[1]. e o

Les polynmes 0, 1 et X sont prdnis dans une procdure dinitialisation. o e e e


VAR Pol01Nul, Pol01Unite, X: pol01; PROCEDURE InitPol01; Dnition des polynmes 0, 1 et X. e o VAR n: integer; BEGIN FOR n := 0 TO DegreMax DO Pol01Nul[n] := 0; Pol01Unite := Pol01Nul; Pol01Unite[0] := 1; X := Pol01Nul; X[1] := 1; Pol01Nul[-1] := -1; Pol01Unite[-1] := 0; X[-1] := 1; END; { de "InitPol01" }

Pour conna ou pour xer le degr dun polynme, on utilise les procdures suivantes : tre e o e
FUNCTION Degre (VAR p: pol01): integer; Donne le degr du polynme p. e o VAR n: integer; BEGIN Degre := p[-1] END; { de "Degre" } PROCEDURE FixerDegre (VAR p: pol01; d: integer); BEGIN p[-1] := d; END; { de "Degre" }

Nous utiliserons deux fonctions commodes pour les tests dgalit. La premi`re teste si e e e un polynme est nul et la seconde si deux polynmes sont gaux. o o e
FUNCTION EstPol01Nul (VAR p: pol01): boolean; BEGIN EstPol01Nul := Degre(p) = DegreNul END; { de "EstPol01Nul" } FUNCTION SontEgaux (f, g: pol01): boolean; Teste si p = 0.

Version 15 janvier 2005

7.3. Factorisation de polynmes o


VAR EncoreEgaux: boolean; deg, i: integer; BEGIN deg := Degre(f); EncoreEgaux := deg = Degre(g); i := -1; WHILE EncoreEgaux AND (i < deg) DO BEGIN i := i + 1; EncoreEgaux := f[i] = g[i]; END; SontEgaux := EncoreEgaux; END; { de "SontEgaux" }

189

Pour dnir un polynme a coecients dans K, il sut de savoir quels sont les coee o ` cients gaux a 1 : les autres coecients sont ncessairement tous nuls. Les procdures e ` e e dentre et dachage tirent parti de cette particularit. e e
PROCEDURE EntrerPol01 (VAR f: pol01; titre: texte); VAR i, degre: integer; BEGIN writeln(titre); f := Pol01Nul; write(Degr du polyn^me (-1 pour le polyn^me nul): ); e o o readln(degre); FixerDegre(f, degre); IF degre > 0 THEN BEGIN writeln(Donner les coefficients egaux a 1, en terminant par ` le degr); e REPEAT readln(i); f[i] := 1; UNTIL i = degre; END ELSE f[0] := degre + 1; f [0] = 0 si deg(f ) = 1 et f [0] = 1 sinon. END; { de "EntrerPol01" } PROCEDURE EcrireMonome (n: integer); BEGIN IF n > 1 THEN write(X^, n : 1) ELSE IF n = 1 THEN write(X) ELSE write(1) END; { de "EcrireMonome" } PROCEDURE EcrirePol01 (f: pol01; titre: texte);

Version 15 janvier 2005

190

Chapitre 7. Polynmes o
Achage du polynme f . Le commentaire est ach avant le polynme. o e o VAR i, deg, c: integer; BEGIN write(titre); IF EstPol01Nul(f) THEN write(0) ELSE BEGIN deg := Degre(f); i := 0; c:= 0; WHILE (i <= deg) and (f[i] = 0) DO { "and" squentiel } e i := i + 1; EcrireMonome(i); i := i + 1; WHILE (i <= deg) DO BEGIN IF f[i] <> 0 THEN BEGIN write( + ); EcrireMonome(i); c := c + 1; IF c MOD 10 = 0 THEN writeln; END; i := i + 1 END END END; { de "EcrirePol01" }

Les deux procdures arithmtiques de base sont laddition et la multiplication par le e e polynme X n . Notons quil est inutile de dnir la soustraction, qui se confond avec o e laddition.
IF Degre(f) = Degre(g) THEN FixerDegre(h, deg) ELSE FixerDegre(h, Max(Degre(f), Degre(g))) END; { de "Pol01PlusPol01" } PROCEDURE Pol01PlusPol01 (f, g: pol01; VAR h: pol01); h=f +g VAR i, deg: integer; BEGIN IF Degre(f) >= Degre(g) THEN On travaille sur le polynme de plus grand degr. o e h := f ELSE h := g; deg := -1; FOR i := 0 TO Min(Degre(f), Degre(g)) DO BEGIN h[i] := (f[i] + g[i]) MOD 2; IF h[i] > 0 THEN deg := i;

Version 15 janvier 2005

7.3. Factorisation de polynmes o


END; IF Degre(f) = Degre(g) THEN FixerDegre(h, deg) ELSE FixerDegre(h, Max(Degre(f), Degre(g))) END; { de "Pol01PlusPol01" } PROCEDURE ProduitParXn (f: pol01; n: integer; VAR g: pol01); VAR i, deg: integer; BEGIN deg := Degre(f); IF deg >= 0 THEN BEGIN FixerDegre(g, deg + n); FOR i := 0 TO n - 1 DO g[i] := 0; FOR i := 0 TO deg DO g[i + n] := f[i] END ELSE g := Pol01Nul; END; { de "ProduitParXn" } g = f.X n

191

La procdure de division euclidienne peut tre ralise ainsi : e e e e


PROCEDURE Pol01DivEuclidPol01 (f, g: pol01; VAR q, r: On suppose g = 0. On obtient f = gq + r avec d(r) < d(g). VAR h: pol01; n: integer; BEGIN q := Pol01Nul; r := f; FixerDegre(q, Max(Degre(f) - Degre(g), -1)); WHILE Degre(r) >= Degre(g) DO BEGIN n := Degre(r) - Degre(g); q[n] := 1; ProduitParXn(g, n, h); Pol01PlusPol01(r, h, r); END; END; { de "Pol01DivEuclidPol01" } pol01);

Calcul du degr de q. e

h = gX n r := r + gX n

Par commodit, on introduit deux procdures tr`s voisines, similaires aux procdures e e e e mod et div sur les entiers.
PROCEDURE Pol01ModPol01 (f, g: pol01; VAR r: pol01); On suppose g = 0. Calcule le reste r de f mod g. VAR q: pol01; BEGIN

Version 15 janvier 2005

192
Pol01DivEuclidPol01(f, g, q, r) END; { de "Pol01ModPol01" } PROCEDURE Pol01DivPol01 (f, g: pol01; VAR q: pol01); On suppose g = 0. Calcule le quotient q de f par g. VAR r: pol01; BEGIN Pol01DivEuclidPol01(f, g, q, r) END; { de "Pol01ModPol01" }

Chapitre 7. Polynmes o

Le calcul du pgcd de deux polynmes est similaire au calcul du pgcd de deux entiers. Il o sut donc dadapter la procdure du pgcd pour les entiers au cas des polynmes. e o
PROCEDURE PGCDPol01 (f, g: pol01; VAR pgcd: pol01); VAR r: pol01; BEGIN WHILE NOT EstPol01Nul(g) DO BEGIN Pol01ModPol01(f, g, r); f := g; g := r; END; pgcd := f; END; { de "PGCDPol01" }

Sur lexemple numrique, on trouve e


f = 1 + X^105 g = 1 + X + X^72 PGCD(f, g) = 1 + X^3 + X^4

Le calcul de la dcomposition f = g 2 h ncessite trois procdures auxiliaires, permettant e e e le calcul du polynme driv, le calcul du carr dun polynmeet le calcul de la racine o e e e o carre dun polynme carr. Le calcul du polynme driv sobtient facilement a partir e o e o e e ` des formules X n1 si n est impair (X n ) = 0 si n est pair Pour le calcul du carr et de la racine carre, on utilise la formule e e fi
1in 2

=
1in

fi2

PROCEDURE Derive (f: pol01; VAR Df: pol01); VAR i, deg: integer; BEGIN Df := Pol01Nul; deg := -1;

Version 15 janvier 2005

7.3. Factorisation de polynmes o


FOR i := 1 TO Degre(f) DO IF odd(i) THEN BEGIN Df[i - 1] := f[i]; IF f[i] <> 0 THEN deg := i - 1 END ELSE Df[i - 1] := 0; FixerDegre(Df, deg) END; { de "Derive" } PROCEDURE Carre (f: pol01; VAR g: pol01); VAR i: integer; BEGIN IF EstPolNul THEN g := Pol01Nul ELSE FixerDegre(g, 2 * Degre(f)); FOR i := 0 TO Degre(f) DO BEGIN g[2 * i] := f[i]; g[2 * i + 1] := 0 END END; { de "Carre" } PROCEDURE RacineCarree (f: pol01; VAR g: pol01); VAR i, deg: integer; BEGIN IF EstPol01Nul(f) THEN g := Pol01Nul ELSE BEGIN deg := Degre(f) DIV 2; FixerDegre(g, deg); FOR i := 0 TO deg DO g[i] := f[i * 2] END END; { de "RacineCarree" }

193

Le calcul de la dcomposition f = g 2 h ne comporte plus de dicult, puisque g 2 = e e pgcd(f, f ).


PROCEDURE FacteursCarres (f: pol01; VAR g, h: pol01); VAR Df: pol01; BEGIN g := f; Derive(f, Df); IF EstPol01Nul(Df) THEN BEGIN RacineCarree(f, g); h := Pol01Unite; END

Version 15 janvier 2005

194
ELSE BEGIN PGCDPol01(f, Df, g); Pol01DivPol01(f, g, h); RacineCarree(g, g); END; END; { "FacteursCarres" }

Chapitre 7. Polynmes o

Pour lexemple numrique, on trouve e


f = 1 + + X^14 g = 1 + h = 1 + X + X^4 + X^5 + X^7 + X^8 + X^9 + X^10 + X^11 + X^12 + X^13 + X^17 X^4 + X^5 X + X^4 + X^5 + X^7

Nous en arrivons au test dirrductibilit, qui est fond sur la proposition 7.3.10. Cette e e e procdure utilise un test de primalit (EstPremier) : on pourra utiliser par exemple le e e test de primalit lmentaire dcrit dans le chapitre 11 ou le remplacer par un test plus eee e ecace.
FUNCTION EstIrreductible (f: pol01): boolean; On suppose f sans carr et f (0) = 1. Teste si f est irrductible. e e VAR p, q: pol01; d, i: integer; ToujoursIrreductible: boolean; BEGIN d := Degre(f); p := X; i := 0; ToujoursIrreductible := true; WHILE ToujoursIrreductible AND (i < d) DO BEGIN i := i + 1; Carre(p, p); Pol01ModPol01(p, f, p); i Si i est un diviseur de d et si d/i est premier, on teste si pgcd(X 2 X, f ) = 1. IF (d MOD i = 0) AND EstPremier(d DIV i) THEN BEGIN Pol01PlusPol01(p, X, q); i PGCDPol01(q, f, q); q = pgcd(X 2 X, f ) ToujoursIrreductible := SontEgaux(q, Pol01Unite) END; END; d Il reste a vrier que X 2 X 0 mod f . ` e IF ToujoursIrreductible THEN BEGIN Pol01PlusPol01(p, X, q); Pol01ModPol01(q, f, q); ToujoursIrreductible := SontEgaux(q, Pol01Nul); END; EstIrreductible := ToujoursIrreductible; END;

Version 15 janvier 2005

7.3. Factorisation de polynmes o

195

Si f est rductible, la proposition 7.3.15 montre que lon peut sparer ses facteurs irre e e ductibles a laide des polynmes ri . Le calcul de ces polynmes nore pas de dicult ` o o e particuli`re. e
PROCEDURE CalculRi (i: integer; f: pol01; VAR r: pol01); VAR Xi, XiModf, p: pol01; BEGIN Xi := Pol01Nul; Xi[-1] := i; Xi[i] := 1; Pol01ModPol01(Xi, f, XiModf); p := XiModf; r := Pol01Nul; REPEAT Pol01PlusPol01(r, p, r); Pol01ModPol01(r, f, r); Carre(p, p); Pol01ModPol01(p, f, p); UNTIL SontEgaux(XiModf, p); END; { de "CalculRi" }

La procdure ci-dessous prend en argument un polynme f , ache le message polynome e o irreductible si f est irrductible et donne une dcomposition non triviale de f sinon. e e
PROCEDURE Factorisation (f: pol01); VAR DecompositionTriviale: boolean; i: integer; g, h, r: pol01; BEGIN Premi`re tape : on calcule la dcomposition f = g 2 h avec h sans carr. Si g = 1, on e e e e ache la dcomposition obtenue. e FacteursCarres(f, g, h); IF NOT SontEgaux(g, Pol01Unite) THEN BEGIN writeln(f = g^2h avec ); EcrirePol01(g, g = ); writeln; EcrirePol01(h, h = ); writeln; END Deuxi`me tape : f est certainement sans carr ; on eectue le test dirrductibilit. e e e e e ELSE IF EstIrreductible(f) THEN writeln(polyn^me irrductible) o e Troisi`me tape : f est rductible. On eectue le calcul des ri jusqu` ce que la factorie e e a sation f = pgcd(f, ri )pgcd(f, ri 1) soit non triviale. ELSE BEGIN i := 1; DecompositionTriviale := true;

Version 15 janvier 2005

196

Chapitre 7. Polynmes o
REPEAT CalculRi(i, f, r); DecompositionTriviale := Degre(r) <= 0; Teste si r i = 0 ou ri = 1. IF NOT DecompositionTriviale THEN BEGIN PGCDPol01(f, r, h); DecompositionTriviale := (Degre(h) >= Degre(f)) OR (Degre(h) <= 0) END; i := i + 1; UNTIL NOT DecompositionTriviale; Il reste a acher le rsultat obtenu. ` e EcrirePol01(h, f = (); writeln()); Pol01PlusPol01(r, Pol01Unite, r); PGCDPol01(f, r, h); EcrirePol01(h, (); writeln()); END END; { de "Factorisation" }

Les diverses options du programme sont regroupes dans le menu suivant : e


PROCEDURE Menu; VAR choix, i, k, n: integer; g, h, q, r, s: pol01; BEGIN writeln(Menu); writeln((1) Diviser 2 polyn^mes); o writeln((2) PGCD de 2 polyn^mes); o writeln((3) Dcomposition f = g^2.h); e writeln((4) Calcul des polyn^mes r i associs a f); o e ` writeln((5) Factorisation de 1 + X + X^2 + ... + X^(n -1) (pour n impair)); writeln((6) Factorisation dun polyn^me ); o write(Votre choix : ); readln(choix); CASE choix OF 1: BEGIN EntrerPol01(f, Donner le premier polyn^me : ); o EcrirePol01(f, f = ); writeln; EntrerPol01(g, Donner le deuxi`me polyn^me : ); e o EcrirePol01(g, g = ); writeln; Pol01DivEuclidPol01(f, g, q, r); writeln(f = gq + r avec); EcrirePol01(q, q = );

Version 15 janvier 2005

7.3. Factorisation de polynmes o


writeln; EcrirePol01(r, r = ); writeln; END; 2: BEGIN EntrerPol01(f, Donner le premier polyn^me : ); o EcrirePol01(f, f = ); writeln; EntrerPol01(g, Donner le deuxi`me polyn^me : ); e o EcrirePol01(g, g = ); writeln; PGCDPol01(f, g, h); EcrirePol01(h, PGCD(f, g) = ); writeln; END; 3: BEGIN EntrerPol01(f, Donner le polyn^me : ); o EcrirePol01(f, f = ); writeln; FacteursCarres(f, g, h); EcrirePol01(g, g = ); writeln; EcrirePol01(h, h = ); writeln; END; 4: BEGIN EntrerPol01(f, Donner le polyn^me : ); o EcrirePol01(f, f = ); writeln; write(Calcul des r i de i = 1 i = ); readln(k); FOR i := 1 TO k DO BEGIN CalculRi(i, f, r); write(i : 1); EcrirePol01(r, r i = (); writeln()); END END; 5: BEGIN write(n = ); readln(n); FixerDegre(f, n - 1); FOR i := 0 TO n - 1 DO f[i] := 1;

197

Version 15 janvier 2005

198
EcrirePol01(f, f = ); writeln; Factorisation(f); END; 6: BEGIN EntrerPol01(f, Donner le polyn^me : ); o EcrirePol01(f, f = ); writeln; Factorisation(f); END; OTHERWISE END; END; { de "Menu" }

Chapitre 7. Polynmes o

Pour nir, voici quelques rsultats numriques. e e


f = 1 + X + X^7 polyn^me irrductible o e f = 1 + X + X^8 f = (1 + X^2 + X^3 + X^5 + X^6) (1 + X + X^2) f = 1 + X + X^2 + X^3 + X^4 + X^5 + X^6 + X^7 + X^8 + X^9 + X^10 + X^11 + X^12 + X^13 + X^14 + X^15 + X^16 f = (1 + X^3 + X^4 + X^5 + X^8) (1 + X + X^2 + X^4 + X^6 + X^7 + X^8) f = 1 + + X^11 + X^21 + X^31 X + + + + X^2 + X^3 X^12 + X^13 X^22 + X^23 X^32 + X^33 + + + + X^4 + X^5 + X^14 + X^15 X^24 + X^25 X^34 + X^35 X^6 + X^7 + X^8 + X^16 + X^17 + + X^26 + X^27 + + X^36 + X^37 + + X^9 + X^10 X^18 + X^19 + X^20 X^28 + X^29 + X^30 X^38 + X^39 + X^40

f = (1 + X^2 + X^3 + X^4 + X^5 + X^6 + X^9 + X^10 + X^11 + X^14 + X^15 + X^16 + X^17 + X^18 + X^20) (1 + X + X^3 + X^4 + X^6 + X^9 + X^10 + X^11 + X^14 + X^16 + X^17 + X^19 + X^20)

Notes bibliographiques
Sur les suites de Sturm et les majorations des zros de polynmes, on pourra consulter : e o M. Mignotte, Mathmatiques pour le calcul formel, Paris, Presses Universitaires de e France, 1989. Lalgorithme de localisation se trouve dans : J. Davenport, Y. Siret, E. Tournier, Calcul formel, Paris, Masson, 1987. Les polynmes symtriques sont traits dans la plupart des livres dalg`bre. On pourra o e e e consulter en particulier : Version 15 janvier 2005

7.3. Factorisation de polynmes o

199

N. Bourbaki, Elments de mathmatique, Alg`bre, Chapitre 5, Appendice 1, Paris, Mase e e son, 1981. (Contrairement a son habitude, Bourbaki ne se place pas dans le cadre ` le plus gnral et ne traite que le cas des polynmes a coecients dans un corps.) e e o ` R. Godement, Cours dalg`bre, Paris, Hermann, 1966. (Le probl`me sur les polynmes e e o symtriques est en partie inspir par lexercice 13 du chapitre 33.) e e B.L. Van der Waerden, Moderne Algebra, 2 volumes, Berlin, Springer, 1955 ou Modern Algebra, 2 volumes, New York, F. Ungar, 1950. Lalgorithme utilis pour factoriser les polynmes est adapt de larticle suivant : e o e R.J. McEliece, Factorization of polynomials over nite elds, Mathematics of Computation 23 (1969), 861867. Lalgorithme de Berlekamp est expos en dtail dans le livre de Knuth : e e D.E. Knuth, The Art of Computer Programming, Reading, Addison Wesley, 1981, Vol. 2, Seminumerical Algorithms, 420430. On pourra galement consulter larticle original de Berlekamp : e E.R. Berlekamp, Factoring polynomials over nite elds, Bell System Technical J. 46 (1967), 18531859.

Version 15 janvier 2005

200

Chapitre 7. Polynmes o

Version 15 janvier 2005

Partie III

Combinatoire

201

203

Chapitre 8

Exemples combinatoires
8.1 Gnration dobjets combinatoires e e

Les objets que nous considrons ici sont : les sous-ensembles dun ensemble, les pere mutations, les partitions. Ils sont reprsents comme suites nies dentiers. Les suites e e dentiers sont naturellement ordonnes par lordre lexicographique : si s = (s 1 , . . . , sn ) e et t = (t1 , . . . , tm ) sont deux suites dentiers, alors s < t dans lordre lexicographique si n < m et sj = tj pour j = 1, . . . , n, ou il existe i tel que si < ti et sj = tj pour j = 1, . . . , i 1. On cherche des algorithmes pour constituer des listes dobjets de taille donne. Le rang e dun objet est le nombre dobjets qui le prc`dent dans la liste. Le premier lment e e ee dune liste a donc rang 0. Le rang sera calcul sans numrer les objets qui le prc`dent, e e e e e et rciproquement, la construction de lobjet de rang donn sera faite directement. e e Engendrer les objets consiste a en dterminer le premier, puis a construire le suivant ` e ` jusqu` lobtention du dernier. Lobjet considr est le dernier si la tentative de calcul a e e de lobjet suivant choue. e

8.1.1

Sous-ensembles

Soient a engendrer toutes les parties dun ensemble E a n lments. Lensemble E est ` ` ee identi a {1, . . . , n}, un sous-ensemble X de E est reprsent par le vecteur x associ e` e e e a sa fonction caractristique et dni par ` e e xi = 1 si i X 0 sinon

Les parties sont ordonnes par lordre lexicographique sur les vecteurs associs, et le e e n rang dun ensemble X, de vecteur x, est lentier i=1 xi 2i1 . La premi`re partie est la e partie vide. Version 15 janvier 2005

204

Chapitre 8. Exemples combinatoires

Pour reprsenter les suites dentiers, on utilise le type suivant : e


TYPE suite = ARRAY[1..LongueurSuite] OF integer;

o` LongueurSuite est une constante convenable (dans le cas des parties dun ensemble, u un tableau de boolens est bien entendu susant). Le calcul du premier sous-ensemble e de E (la partie vide) se fait au moyen de la procdure que voici : e
PROCEDURE PremierePartie (VAR x: suite; n: integer); VAR i: integer; BEGIN FOR i := 1 TO n DO x[i] := 0 END; { de "PremierePartie" }

La partie qui suit une partie donne sobtient en changeant le dernier chire gal a 0 en e e ` 1 et en remplaant par 0 tous les chires qui le suivent : c
PROCEDURE PartieSuivante (VAR x: suite; n: integer; VAR derniere: boolean); VAR i: integer; BEGIN i := n; WHILE (i > 0) AND (x[i] = 1) DO BEGIN { AND squentiel } e x[i] := 0; i := i - 1 END; derniere := i = 0; IF NOT derniere THEN x[i] := 1 END; { de "PartieSuivante" }

Finalement, pour lister les parties, on peut utiliser la procdure que voici : e
PROCEDURE ListerParties (n: integer); VAR x: Suite; derniere: boolean; BEGIN PremierePartie(x, n); REPEAT EcrireSuite(x, n, ); PartieSuivante(x, n, derniere) UNTIL derniere END; { de "ListerParties" }

Version 15 janvier 2005

8.1. Gnration dobjets combinatoires e e Bien entendu, EcrireSuite est une procdure dachage. Pour n = 3, on obtient : e
0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1

205

On reconna lcriture en binaire des nombres de 0 a 7, ce qui sugg`re une autre t e ` e procdure qui calcule directement lcriture binaire des entiers de 0 a 2n 1. e e `

8.1.2

Sous-ensembles ` k lments a ee

Soient a engendrer les parties a k lments dun ensemble E a n lments, a nouveau ` ` ee ` ee ` identi a {1, . . . , n}. On utilise la mme reprsentation, mais il appara plus simple e` e e t demployer une variante de lordre lexicographique : on pose x < y sil existe i tel que xi < yi et xj = yj pour j = i + 1, . . . , n. Ainsi, les parties a 3 lments dun ensemble a ` ee ` 5 lments scrivent, dans cet ordre, comme suit : ee e
0 1 2 3 4 5 6 7 8 9 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1

La recherche de la partie suivante se dcompose en deux phases : on cherche, en proe gressant par indices croissants, le premier intervalle constitu de chires 1 (disons de e longueur p). Le chire qui suit (sil existe) est transform en 1; tous les chires prcdents e e e sont remplacs par un groupe de p 1 chires 1, suivis de zros. Voici les procdures : e e e
PROCEDURE PremierePartieRestreinte (VAR x: suite; n, k: integer); VAR i: integer; BEGIN FOR i := 1 TO k DO x[i] := 1; FOR i := k + 1 TO n DO x[i] := 0 END; { de "PremierePartieRestreinte" } PROCEDURE PartieSuivanteRestreinte (VAR x: suite; n, k: integer; VAR derniere: boolean);

Version 15 janvier 2005

206
VAR

Chapitre 8. Exemples combinatoires

i, j, m: integer; BEGIN j := 1; WHILE (j <= n) AND (x[j] = 0) DO j := j + 1; Recherche du premier coecient non nul. i := j; Calcul de lintervalle des coecients non nuls. WHILE (i <= n) AND (x[i] = 1) DO BEGIN x[i] := 0; i := i + 1 END; derniere := i = n + 1; IF NOT derniere THEN BEGIN x[i] := 1; Modication du coecient. FOR m := 1 TO i - j - 1 DO x[m] := 1 Rpartition des chires restants. e END END; { de "PartieSuivanteRestreinte" }

Le rang dune partie X a k lments de E est le nombre ` ee r(X) = n1 1 + + nk k

o` les entiers 0 n1 < . . . nk < n sont dnis par u e X = {n1 + 1, . . . , nk + 1} La proposition suivante montre que la fonction r est une bijection des parties a k ` lments sur les premiers entiers. ee Proposition 8.1.1. Soient n, k 0 des entiers. Tout entier m, avec 0 m < scrit de mani`re unique sous la forme e e m= n1 1 ++ nk k 0 n1 < < nk < n
n k

Preuve. Lexistence se prouve par rcurrence sur m, en considrant le plus petit entier e e +1 n n n tel que m n . Alors m < n k = n + k1 , donc m = m n < k1 . k k k Lentier m scrit par consquent sous la forme e e m = n1 1 ++ nk1 k1

avec 0 n1 < < nk < n , do` lon tire lcriture pour m. u e Pour montrer lunicit, on observe lingalit e e e nk 1 Version 15 janvier 2005 ++ n1 k < n k

8.1. Gnration dobjets combinatoires e e qui se prouve par rcurrence sur n en utilisant lgalit n = n1 + e e e k k que si n1 nk n1 nk ++ = ++ 1 k 1 k avec par exemple nk > nk , alors nk k n1 1 ++ nk k nk nk 1 nk k 1 + + + k1 k 1 <
n1 k1

207 . Il en rsulte e

nk + 1 k

donc nk nk , do` une contradiction. u Il reste a vrier que si la partie X prc`de Y dans lordre dni ci-dessus, alors r(X) < ` e e e e r(Y ). Pour cela, posons r(X) = n1 1 ++ nk k r(Y ) = n1 1 ++ nk k

Comme X prc`de Y , il existe i k tel que ni < ni , et nj = nj pour j = i + 1, . . . , k. e e Il en rsulte quavec s = ni+1 + + nk , on a e i+1 k r(X) s = n1 1 ++ ni i < ni i r(Y ) s

do` la proprit. u ee On obtient facilement la procdure de calcul du rang : e


FUNCTION RangRestreint (VAR x: Suite; n, k: integer): integer; VAR r: integer; BEGIN r := 0; WHILE k > 0 DO BEGIN IF x[n] = 1 THEN BEGIN r := r + binomial(n - 1, k); k := k - 1 END; n := n - 1 END; RangRestreint := r END; { de "RangRestreint" }

et de la mme mani`re, la procdure inverse qui, pour un entier donn, construit le e e e e sous-ensemble correspondant.

8.1.3

Permutations

Une permutation de lensemble {1, . . . , n} est reprsente par la suite ((1), . . . , (n)). e e On consid`re a nouveau la gnration des permutations dans lordre lexicographique. e ` e e Version 15 janvier 2005

208

Chapitre 8. Exemples combinatoires

La premi`re permutation est la permutation identique, et la derni`re la suite (n, . . . , 1). e e Soit une permutation. Pour calculer la permutation suivante, on consid`re la derni`re e e monte de , cest-`-dire le plus grand entier i < n tel que (i) < (i + 1). Si na pas e a de monte, cest la derni`re permutation, sinon, soit la suivante; elle vrie e e e (j) = (j) j<i (i) = min {(j) | (j) > (i)}
i+1jn

et ( (i + 1), . . . , (n)) est la suite croissante des nombres {(i), . . . , (n)} { (i)}. Par exemple, si = (8, 6, 3, 4, 7, 5, 2, 1), la derni`re monte est 4, et la permutation qui suit e e est (8, 6, 3, 5, 1, 2, 4, 7). Comme la suite ((i + 1), . . . , (n)) est dcroissante, on obtient e la suite ( (i + 1), . . . , (n)) en renversant ((i + 1), . . . , (n)) apr`s y avoir substitu e e (i). Les procdures suivantes ralisent lnumration des permutations : e e e e
PROCEDURE PremierePermutation (VAR s: suite; n: integer); VAR i: integer; BEGIN FOR i := 1 TO n DO s[i] := i END; { de "PremierePermutation" } PROCEDURE PermutationSuivante (VAR s: suite; n: integer; VAR derniere: boolean); VAR i, j, k: integer; BEGIN i := n - 1; WHILE (i > 0) AND (s[i] > s[i + 1]) DO i := i - 1; i est la derni`re monte. e e derniere := i = 0; IF NOT derniere THEN BEGIN j := n; WHILE s[i] > s[j] DO j := j - 1; EchangerE(s[j], s[i]); Nouvelle valeur de (i). k := 1 + ((n + i + 1) DIV 2); FOR j := k TO n DO EchangerE(s[j], s[n + i + 1 - j]) END END; { de "PermutationSuivante" }

Pour obtenir une liste des permutations, on utilise, comme prcdemment, une procdure e e e de la forme :
PROCEDURE ListerPermutations (n: integer); VAR s: Suite; derniere: boolean;

Version 15 janvier 2005

8.1. Gnration dobjets combinatoires e e


BEGIN PremierePermutation(s, n); REPEAT EcrireSuite(s, n, ); PermutationSuivante(s, n, derniere) UNTIL derniere END; { de "ListerPermutations" }

209

Une suite factorielle dordre n est une suite nie (a1 , . . . , an1 ) dentiers tels que 0 ai i pour i = 1, . . . , n 1. Il y a n! suites factorielles dordre n. Lapplication
n1

: (a1 , . . . , an1 )

ai i!
i=1

est une bijection des suites factorielles dordre n sur les entiers 0, . . . , n!1. De plus, si a et b sont deux suites factorielles, et a < b dans lordre lexicographique, alors (a) < (b). Il nous reste a associer une suite factorielle a une permutation. Pour cela, nous con` ` sidrons lapplication qui a une permutation sur {1, . . . , n} associe une permutation e ` sur {1, . . . , n 1} par ()(i) = (i + 1) si (i + 1) < (1) (i + 1) 1 sinon

Clairement, lapplication ((1), ()) est une bijection. La suite factorielle associe e a est la suite ( n2 ()(1) 1, n3 ()(1) 1, . . . , ()(1) 1, (1) 1). Par exemple, ` voici les images successives par de la permutation (2, 8, 6, 4, 5, 1, 3, 7) : 2 8 7 6 5 5 4 3 3 3 5 4 4 4 3 1 1 1 1 1 1 3 2 2 2 2 2 1 7 6 6 5 4 3 1 1

La suite factorielle associe est (0, 0, 2, 2, 4, 6, 1), et le rang est 9900. Le rang dune e permutation sobtient aussi directement par la formule
n1

r() =
i=1

(n i)! i1 ()(1) 1

Cest cette formule qui est value, en utilisant le schma de Horner, dans la procdure e e e e ci-dessous. La fonction est mise en place par : Version 15 janvier 2005

210

Chapitre 8. Exemples combinatoires

PROCEDURE DiminuerPermutation (VAR s: Suite; i, n: integer); VAR j, k: integer; BEGIN k := s[i]; FOR j := i TO n DO IF s[j] >= k THEN s[j] := s[j] - 1 END; { de "DiminuerPermutation" }

La permutation () est calcule dans le tableau contenant . e


FUNCTION RangPermutation (s: Suite; n: integer): integer; VAR rang, i: integer; BEGIN rang := 0; FOR i := 1 TO n - 1 DO BEGIN DiminuerPermutation(s, i, n); rang := (rang + s[i]) * (n - i) END; RangPermutation := rang END; { de "RangPermutation" }

Pour utiliser cette fonction sur des exemples de taille raisonnable, on aura intrt a la e e ` dclarer de type longint (il faut alors faire le mme changement pour la variable rang). e e Les oprations inverses, donnant la permutation a partir du rang, sont les suivantes : e `
PROCEDURE AugmenterPermutation (VAR s: Suite; i, n: integer); VAR j, k: integer; BEGIN k := s[i]; FOR j := i + 1 TO n DO IF s[j] >= k THEN s[j] := s[j] + 1 END; { de "AugmenterPermutation" } PROCEDURE PermutationDeRang (VAR VAR i: integer; BEGIN s[n] := 1; FOR i := n - 1 DOWNTO 1 DO s[i] := 1 + (r MOD (n + AugmenterPermutation(s, r := r DIV (n + 1 - i) END; END; { de "PermutationDeRang" s: Suite; n, r: integer);

BEGIN 1 - i)); i, n);

Version 15 janvier 2005

8.2. Nombres de Bernoulli

211

8.2
8.2.1

Nombres de Bernoulli
Enonc : nombres de Bernoulli e

Les polynmes de Bernoulli Bn (x) sont dnis par leur srie gnratrice o e e e e text tn = Bn (x) et 1 n=0 n!

(x R, t C, |t| < 2)

et les nombres de Bernoulli sont par dnition les nombres Bn = Bn (0), pour n 0. e 1. Dmontrer que lon a B0 = 1, B1 = 1/2 et que B2n+1 = 0 pour n 1. Dmontrer e e que n n Bk (n 2) Bn = k
k=0

(On note

p m

p! m!(pm)! .)

2. Dmontrer que, pour n 0, e


n

Bn (x) =
k=0

n Bk xnk k

Les nombres de Bernoulli sont rationnels et seront reprsents comme quotients dentiers e e premiers entre eux, le dnominateur tant positif. e e 3. Ecrire des procdures daddition, soustraction, multiplication, division de rationnels e ainsi reprsents. Ecrire une procdure qui calcule et imprime les nombres de Bernoulli e e e et les coecients des polynmes de Bernoulli pour n 12. o 4. Dmontrer que Bn (1 + x) = nxn1 + Bn (x) et en dduire que, pour n 1, e e
m

kn =
k=1

Bn+1 (m + 1) Bn+1 n+1

5. Ecrire une procdure qui ache un formulaire pour les sommes des puissances e n-i`mes dentiers, pour 2 n 6. e

8.2.2

Solution : nombres de Bernoulli

Les polynmes de Bernoulli Bn (x) sont dnis par leur srie gnratrice o e e e e tn text = Bn (x) et 1 n=0 n!

(x R, t C, |t| < 2) Version 15 janvier 2005

212

Chapitre 8. Exemples combinatoires

et les nombres de Bernoulli sont, par dnition, les nombres Bn = Bn (0), pour n 0. e Bien entendu, t tn = (|t| < 2) Bn t1 e n! n=0 Voici les premi`res proprits des nombres de Bernoulli. e ee Proposition 8.2.1. On a
n

Bn =
k=0

n Bk k

(n 2)

(2.1)

B0 = 1 B2n+1 = 0 Preuve. On a t = (et 1)


n=0

B1 = 1/2 (n 1)
n k=0

(2.2)

Bn

tn n!

n=0

n Bk B n k

tn n!

Par identication, on obtient B0 = 1, 0 = 2B1 + B0 et les relations (2.1). Par ailleurs, la fonction t/(et 1) B0 B1 t est paire, ce qui prouve (2.2). Proposition 8.2.2. On a, pour n 0,
n

Bn (x) =
k=0

n Bk xnk k

(2.3)

Bn (1 x) = (1)n Bn (x) et pour n 1, Bn (x) = nBn1 (x) Bn (1 + x) Bn (x) = nxn1 La formule (2.3) montre que les polynmes de Bernoulli sont bien des polynmes. o o Preuve. Posons (x, t) = On a
n=0

(2.4)

text et 1

Bn (x)

tn tn = (x, t) = ext (0, t) = ext Bn n! n! n=0 =


n=0 n

k=0

n Bk xnk k

tn n!

Version 15 janvier 2005

8.2. Nombres de Bernoulli

213

ce qui prouve (2.3). Ensuite, on a (1 x, t) = (x, t), do` la deuxi`me relation. La u e troisi`me dcoule par identication de /x = t. Enn, on a e e (1 + x, t) (x, t) = text = ce qui prouve (2.4). Corollaire 8.2.3. Pour m 1 et n 1, on a
m n=1

nxn1

tn n!

kn =
k=1

Bn+1 (m + 1) Bn+1 n+1

Preuve. Sommons la relation (2.4), pour x = 0, . . . , m. Les termes des membres gauches successifs se compensent, et on obtient
m

Bn (1 + m) Bn = n ce qui donne la formule cherche. e

k n1
k=0

8.2.3

Programme : nombres de Bernoulli

Les programmes de cette section utilisent la biblioth`que de manipulation des nombres e rationnels donne en annexe. e Pour le calcul des nombres de Bernoulli, on utilise la formule
n

Bn =
k=0

n Bk k
n2

(n 2)

sous la forme Bn1 = 1 n

k=0

n Bk k

Il sut dvaluer cette expression, pour n 3 et n 1 pair, puisque les nombres de e Bernoulli dindice impair sont nuls. On range la suite des nombres de Bernoulli ainsi calcule dans un tableau de type e SuiteRat dclar comme suit : e e
TYPE SuiteRat = ARRAY[0..LongueurMax] OF rat;

o` LongueurMax est une constante de taille approprie. Voici la procdure cherche : u e e e Version 15 janvier 2005

214

Chapitre 8. Exemples combinatoires

PROCEDURE NombresDeBernoulli (nn: integer; VAR B: SuiteRat); Calcule les nombres de Bernoulli B[n] = Bn pour 0 n nn. VAR k, n: integer; q, s: rat; BEGIN FOR n := 2 TO nn DO Initialisation : B[n] := RatZero; Bn = 0 pour n 2 ; B[0] := RatUn; B0 = 1 ; FaireRat(-1, 2, B[1]); B1 = 1/2. FOR n := 3 TO nn + 1 DO IF odd(n) THEN BEGIN Calcul de Bn1 pour n 1 pair : s := RatZero; s := 0 FOR k := 0 TO n - 2 DO BEGIN RatParEntier(B[k], binomial(n, k), q); ` RatPlusRat(s, q, s) s := s + n Bk k END; RatSurEntier(s, n, s); RatOppose(s, B[n - 1]) Bn1 := s/n END; END; { "NombresDeBernoulli" }

Le calcul donne les rsultats suivants : e


Nombres de Bernoulli : B B B B B B B B B B B B B B 0 = 1 1 = -1/2 2 = 1/6 3 = 0 4 = -1/30 5 = 0 6 = 1/42 7 = 0 8 = -1/30 9 = 0 10 = 5/66 11 = 0 12 = -691/2730 13 = 0

Les polynmes de Bernoulli se calculent en utilisant la formule qui les dnit. On a o e besoin de polynmes a coecients rationnels. Leur type est dclar par : o ` e e
TYPE PolRat = ARRAY[0..DegreMax] OF rat; SuitePolRat = ARRAY[0..LongueurMax] OF PolRat;

o` DegreMax est une constante de taille approprie. La procdure cherche scrit alors u e e e e comme suit : Version 15 janvier 2005

8.2. Nombres de Bernoulli


PROCEDURE PolynomesDeBernoulli (nn: integer; VAR B: SuiteRat; VAR PolB: SuitePolRat); Calcule dans PolB une table des polynmes de Bernoulli. o VAR k, n: integer; BEGIN PolB[0][0]:=B[0]; B0 = 1 PolB[1][0]:=B[1]; PolB[1][1]:=B[0]; B1 = 1/2 + X FOR n := 2 TO nn DO BEGIN `n FOR k := 0 TO n DO Bk k RatParEntier(B[k], binomial(n, k), PolB[n][n - k]); END END; { de "PolynomesDeBernoulli" }

215

On obtient, en adaptant la procdure dimpression des polynmes a coecients rels e o ` e donne dans lannexe A, les rsultats suivants : e e
B B B B B B B B B B B B B 0(X) = 1 1(X) = X - 1/2 2(X) = X^2 - X + 1/6 3(X) = X^3 - 3/2 X^2 + 1/2 X 4(X) = X^4 - 2 X^3 + X^2 - 1/30 5(X) = X^5 - 5/2 X^4 + 5/3 X^3 - 1/6 X 6(X) = X^6 - 3 X^5 + 5/2 X^4 - 1/2 X^2 + 1/42 7(X) = X^7 - 7/2 X^6 + 7/2 X^5 - 7/6 X^3 + 1/6 X 8(X) = X^8 - 4 X^7 + 14/3 X^6 - 7/3 X^4 + 2/3 X^2 - 1/30 9(X) = X^9 - 9/2 X^8 + 6 X^7 - 21/5 X^5 + 2 X^3 - 3/10 X 10(X) = X^10 - 5 X^9 + 15/2 X^8 - 7 X^6 + 5 X^4 - 3/2 X^2 + 5/66 11(X) = X^11 - 11/2 X^10 + 55/6 X^9 - 11 X^7 + 11 X^5 - 11/2 X^3 + 5/6 X 12(X) = X^12 - 6 X^11 + 11 X^10 - 33/2 X^8 + 22 X^6 - 33/2 X^4 + 5 X^2 - 691/2730 B 13(X) = X^13 - 13/2 X^12 + 13 X^11 - 143/6 X^9 + 286/7 X^7 - 429/10 X^5 + 65/3 X^3 - 691/210 X

Pour tablir le formulaire , on utilise lexpression Bn+1 (1 + x) = (n + 1)xn + Bn+1 (x) e pour crire e m Bn+1 (m) Bn+1 k n = mn + n+1
k=1

Il sut donc dannuler le terme constant de Bn+1 (X), de diviser les autres coecients par n + 1 et dincrmenter de 1 le coecient de X n . Ceci est ralis dans la procdure e e e e suivante :
PROCEDURE SommePuissancesNiemes (n: integer; VAR p, q: PolRat); VAR k: integer; BEGIN

Version 15 janvier 2005

216
q := p; q[0] := RatZero; FOR k := 1 TO n + 1 DO BEGIN RatSurEntier(q[k], n + 1, q[k]); END; RatPlusRat(RatUn, q[n], q[n]) END; { de "SommePuissancesNiemes" }

Chapitre 8. Exemples combinatoires


Partant de p, de degr n + 1, e on annule le terme constant, on divise par n + 1, et on ajoute 1 au coecient de X n .

Cette procdure est mise en uvre par une procdure qui calcule le tableau cherch : e e e
PROCEDURE SommeDesPuissances (nn: integer; VAR PolB, SommePuissances: SuitePolRat); VAR n: integer; BEGIN FOR n := 1 TO nn DO SommePuissancesNiemes(n, PolB[n + 1], SommePuissances[n]); END; { de "SommeDesPuissances" }

Voici le rsultat. Chaque formule donne lexpression de la somme des puissances n-i`mes e e jusqu` X. a
Somme Ordre Ordre Ordre Ordre Ordre Ordre Ordre Ordre Ordre X^2 des 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : puissances 1/2 X^2 + 1/2 X 1/3 X^3 + 1/2 X^2 + 1/4 X^4 + 1/2 X^3 + 1/5 X^5 + 1/2 X^4 + 1/6 X^6 + 1/2 X^5 + 1/7 X^7 + 1/2 X^6 + 1/8 X^8 + 1/2 X^7 + 1/9 X^9 + 1/2 X^8 + 1/10 X^10 + 1/2 X^9

1/6 X 1/4 X^2 1/3 X^3 - 1/30 X 5/12 X^4 - 1/12 X^2 1/2 X^5 - 1/6 X^3 + 1/42 X 7/12 X^6 - 7/24 X^4 + 1/12 X^2 2/3 X^7 - 7/15 X^5 + 2/9 X^3 - 1/30 X + 3/4 X^8 - 7/10 X^6 + 1/2 X^4 - 3/20

8.3
8.3.1

Partitions dentiers
Enonc : partitions dentiers e

Une partition dun entier positif n est une suite a = (n1 , . . . , ns ) dentiers tels que n1 . . . ns > 0 et n1 + + ns = n. Chaque ni (1 i s) est une part de a, et s est le nombre de parts de la partition. Les partitions dun entier n sont ordonnes comme suit : si a = (n1 , . . . , ns ) et a = e (n1 , . . . , ns ) sont deux partitions de n, on pose a < a si et seulement sil existe un entier i s, s tel que nj = nj pour j = 1 . . . i 1 et ni < ni . 1. a) Ecrire une procdure qui prend en argument deux entiers positifs n et m et e qui ache en ordre dcroissant toutes les partitions de n dont toutes les parts sont e infrieures ou gales a m (on pourra supposer que n 20). e e ` Version 15 janvier 2005

8.3. Partitions dentiers

217

Exemple numrique : n = 9, m = 4. e b) Ecrire une procdure qui prend en argument un entier positif n et qui ache toutes e les partitions de n. Exemple numrique : n = 9. e On note p(n) le nombre de partitions de n > 0 et on pose p(0) = 1. Pour m > 0 et n > 0, on note pm (n) le nombre de partitions de n en parts toutes infrieures ou gales e e a m, et on pose pm (0) = 1. ` 2. a) Dmontrer que e pm (n) = pm1 (n) si m > n pm1 (n) + pm (n m) si n m > 1

b) Ecrire une procdure qui prend en argument n et qui calcule p(n). Ecrire cette e procdure sans utiliser de tableau a double indice. Comme les entiers p(n) croissent e ` assez vite avec n, on reprsentera un entier p(n) sous la forme dun couple (u(n), v(n)) e avec p(n) = u(n)104 + v(n) o` u(n) et v(n) sont des entiers naturels infrieurs a 104 (ce qui permet de calculer p(n) u e ` pour tout entier n tel que p(n) < 108 ). Exemple numrique : n = 60. e 3. Dmontrer que pour 0 x < 1 et pour m > 0, on a e
n=0 m

pm (n)xn =
k=1

1 1 xk

4. a) Dmontrer que pour tout 0 x < 1, la suite e


m

Fm (x) =
k=1

1 1 xk

est convergente. On note b) Dmontrer que e

1 k=1 1xk n=0

sa limite.
k=1

p(n)xn =

1 1 xk

5. Ecrire une procdure qui ache toutes les partitions de n en parts distinctes. e Exemple numrique : n = 11. e 6. Ecrire une procdure qui ache toutes les partitions de n en parts distinctes et e toutes impaires. Exemple numrique : n = 30. e Version 15 janvier 2005

218

Chapitre 8. Exemples combinatoires

7. Dmontrer que pm (n) est gal au nombre de partitions de n en au plus m parts. e e 8. Dmontrer que le nombre de partitions de n en parts toutes distinctes est gal au e e nombre de partitions de n en parts toutes impaires. 9. On dnit, pour 0 x < 1 et pour y = 0 rel, e e P (x, y) = On admet que P (x, y) = 1 + a) Dmontrer que e
n=1 n=1 n=1

(1 x2n )(1 + x2n1 y)(1 + x2n1 y 1 )

xn (y n + y n )

(1 xn ) = 1 +

n=1

(1)n x 2 n(3n+1) + x 2 n(3n1)

b) On note E(n) le nombre de partitions de n en un nombre pair de parts toutes distinctes, et U (n) le nombre de partitions de n en un nombre impair de parts toutes 1 distinctes. Dmontrer que E(n) = U (n) sauf si n est un entier de la forme n = 2 k(3k1), e k auquel cas E(n) U (n) = (1) .

8.3.2

Solution : partitions dentiers

Une partition dun entier positif n est une suite a = (n1 , . . . , ns ) dentiers tels que n1 . . . ns > 0 et n1 + + ns = n. Chaque ni (1 i s) est une part de a, et s est le nombre de parts de la partition. On note p(n) le nombre de partitions de n > 0 et on pose p(0) = 1. Pour m > 0 et n > 0, on note pm (n) le nombre de partitions de n en parts toutes infrieures ou gales e e a m, et on pose pm (0) = 1. ` On pose
m

Fm (x) =
k=1

1 1 xk

F (x) =

k=1

1 = lim Fm (x) m 1 xk

Lexistence de cette limite sera justie ultrieurement. e e Proposition 8.3.1. Pour n 0 et m 1, on a pm (n) = Version 15 janvier 2005 pm1 (n) si m > n pm1 (n) + pm (n m) si n m > 1

8.3. Partitions dentiers

219

Preuve. Si m > n, alors une partition dont les parts sont m, est une partition dont les parts sont m 1, ce qui donne la premi`re alternative; si m n, une partition e peut soit commencer avec une part gale a m, puis continuer avec une partition de ce e ` qui reste, a savoir de n m, soit ntre constitue que de parts toutes m 1. ` e e Proposition 8.3.2. Pour 0 x < 1 et pour m > 0, on a
n=0 m

pm (n)xn =
k=1

1 1 xk

Preuve. Le membre de droite est le produit dun nombre ni de sries absolument e convergentes, donc converge absolument. Il scrit e
m

xkn =
n1 ,...,nm 0

xn1 +2n2 ++mnm

k=1 n=0

En regroupant les termes, le coecient de xn est Card{(n1 , . . . , nm ) | n1 + 2n2 + + mnm = n} et ce cardinal est pm (n). Notons que la proposition 8.3.1 en est une consquence immdiate, puisque e e Fm (x) = Fm1 (x) + xm Fm (x) Proposition 8.3.3. Pour 0 x < 1, on a
n=0

p(n)xn =

k=1

1 1 xk

Preuve. Le produit inni converge absolument car, en passant au logarithme, on a la srie de terme gnral log(1 xk ) qui est quivalente a xk . De plus, pour chaque x, e e e e ` 0 x < 1, la suite (Fm (x))m1 est croissante, et Fm (x) F (x) pour tout x x et pour e tout m. Comme pm (n) = p(n) pour n m, on a, pour 0 x < 1,
m

p(n)xn < Fm (x) < F (x)


n=0

donc la srie e

p(n)xn converge. De plus, comme pm (n) p(n), on a


n=0

pm (n)x

n=0

p(n)xn F (x) Version 15 janvier 2005

220

Chapitre 8. Exemples combinatoires

fonction gnratrice e e 1 1 x2m1 m=1 1 1 x2m m=1 1 1 x m2 m=1


p

nombre de partitions de n dont les parts sont impaires paires des carrs e des nombres premiers distinctes distinctes et impaires distinctes et paires des carrs distincts e des nombres premiers distincts

1 1 xp 1 + xm 1 + x2m1 1 + x2m 1 + xm
2

m=1 m=1 m=1 m=1

1 + xp
p

montrant que, pour chaque x x, la srie e e Lorsque m , on obtient F (x) = lim Fm (x) = lim
m n=0 m

pm (x)xn converge uniformment en m. e


n=0 n=0

pm (n)xn =

lim pm (n)xn =

p(n)xn

ce qui prouve lidentit. e Par des mthodes en tout point similaires, on peut obtenir les sries gnratrices de e e e e nombreuses familles de partitions. Quelques exemples sont regroups dans le tableau e ci-dessus (o` lindice de sommation p signie une sommation sur les nombres premiers). u Proposition 8.3.4. Le nombre de partitions de n en exactement m parts est gal au e nombre de partitions de n dont la plus grande part est m. Version 15 janvier 2005

8.3. Partitions dentiers

221

Cette proposition sillustre par les diagrammes de Ferrer. Le diagramme de Ferrer dune partition a = (n1 , . . . , ns ) est lensemble des points {(i, j) | 1 i s, 1 j ni } Ce diagramme se prte a une reprsentation graphique. Ainsi, la partition (6, 3, 3, 2, 1) e ` e de 15 est reprsente par le diagramme de Ferrer compos des cinq lignes : e e e

Si on lit ce diagramme verticalement, on obtient une autre partition de 15, (appele e la partition conjugue) a savoir (5, 4, 3, 1, 1, 1) dont la plus grande part est 5. Cette e ` observation conduit a la preuve formelle. ` Preuve. Soit a = (n1 , . . . , nm ) une partition de n en m parts. Posons mj = Card{i | j ni } Alors mj 1 pour j = 1, . . . , n1 . La suite a = (m1 , . . . , mn1 ) est une partition de n car m1 + + mn1 = n. De plus, on a i mj si et seulement si j nj , ce qui montre que lapplication a a est bijective. La plus grande part de a est m1 = m. Nous prouvons maintenant le rsultat suivant, connu sous le nom de thor`me des nome e e bres pentagonaux dEuler. Thor`me 8.3.5 (Euler). Pour 0 x < 1, on a e e
n=1

(1 xn ) = 1 +

n=1

(1)n x 2 n(3n+1) + x 2 n(3n1)

Nous donnons dabord une preuve directe du thor`me; nous le driverons plus loin dun e e e rsultat plus gnral. Posons P0 = G0 = 1 et, pour n 1, e e e
n n

Pn =

r=1

(1 xr )

Gn =
r=0

(1)r

Pn rn+g(r) x Pr

o` g(r) = r(r + 1)/2. Posons aussi, pour plus de commodit, u e (n) = n(3n 1)/2 Lemme 8.3.6. Pour n 1, on a Gn Gn1 = (1)n (x(n) + x(n) ). Version 15 janvier 2005

222

Chapitre 8. Exemples combinatoires

Preuve. Par rcurrence sur n. On a G1 G0 = x x2 , ce qui amorce la rcurrence. e e Ensuite, Gn Gn1 = (1)n xn
n1
2

n1 +g(n)

+ (1 xn )

(1)r
r=0

Pn1 rn+g(r) x Pr

(1)r
r=0
2

Pn1 r(n1)+g(r) x Pr
n1

= (1)n xn
n1

+g(n)

+
r=0

(1)r

Pn1 r (x 1)xr(n1)+g(r) Pr

xn

(1)r
r=0

Pn1 rn+g(r) x Pr

Le deuxi`me terme de cette somme scrit e e


n1

(1)r
r=1

Pn1 r(n1)+g(r) x = Pr1

n1

(1)r1
r=1

Pn1 rn+g(r1) x Pr1

parce que r(n 1) + g(r) = rn + g(r 1). Le troisi`me terme scrit e e


n1

(1)r
r=0

Pn1 n(r+1)+g(r) x = Pr

(1)r1
r=1

Pn1 rn+g(r1) x Pr1

Ces deux sommes se compensent donc au terme extrme pr`s, et par consquent e e e Gn Gn1 = (1)n xn
2

+g(n)

+ (1)n xn

+g(n1)

Or n2 + g(n) = (n) et n2 + g(n 1) = (n), do` le lemme. u Preuve du thor`me 8.3.5. Le produit inni m=1 (1 xm ) converge pour 0 x < 1, e e donc limn Pn = (1 xm ). Posons S0 = 1 et m=1
n

Sn = 1 +
r=1

(1)r (x(r) + x(r) )

On a S0 = G0 et, en vertu du lemme, Gn Gn1 = Sn Sn1 donc Sn = Gn pour tout n 0. On a


n

Gn = P n +
r=1

(1)r

Pn rn+g(r) x Pr

Version 15 janvier 2005

8.3. Partitions dentiers

223

Par ailleurs, 0 < Pn /Pr 1 parce que 0 x < 1. Comme xrn+g(r) xn+1 pour 1 r n, on a Gn Pn + nxn+1 . Il en rsulte e |Pn Sn | = |Pn Gn | nxn+1 ce qui prouve lidentit dEuler. e Corollaire 8.3.7. Soient E(n) le nombre de partitions de n en un nombre pair de parts toutes distinctes et U (n) le nombre de partitions de n en un nombre impair de parts 1 toutes distinctes. Alors E(n) = U (n) sauf si n est un entier de la forme n = 2 k(3k 1), k auquel cas E(n) U (n) = (1) . Preuve. Le coecient de xn dans la srie e
n=1

(1 xn )

est (1) , o` la somme porte sur les partitions en parts distinctes et o` est le u u nombre de parts de la partition. Mais (1) = E(n) U (n) do` le rsultat par lidentit dEuler. u e e Proposition 8.3.8. Le nombre de partitions de n en parts toutes distinctes est gal e au nombre de partitions de n en parts toutes impaires. Preuve. Il sagit de prouver que pour 0 x < 1,
n=1

(1 + x ) =

1 1 x2n+1 n=0

Les produits sont absolument convergents. Posons P (x) = Alors P (x)Q(x) = =


n=1 n=1 n=1

(1 + xn )

Q(x) =

n=0

(1 x2n+1 )

(1 + x2n )

(1 + x2n+1 )

n=0

(1 + (x ) )
2 2

n=0 2 n n=0

(1 x2n+1 )

(1 (x2 )2n+1 )

= P (x )Q(x ) Version 15 janvier 2005

224
k k

Chapitre 8. Exemples combinatoires

Par consquent, P (x)Q(x) = P (x2 )Q(x2 ) pour tout k 0. Lorsque k tend vers linni, e ce produit tend vers 1, do` le rsultat. u e Lidentit dEuler est une consquence dun thor`me remarquable connu sous le nom e e e e didentit du triple produit de Jacobi : e Thor`me 8.3.9. Soient x et z des nombres complexes avec |x| < 1 et z = 0; alors e e on a
n=1

(1 x2n )(1 + x2n1 z)(1 + x2n1 z 1 ) = 1 +

xn (z n + z n )

(3.1)

n=1

Preuve. La condition |x| < 1 assure la convergence absolue de chacun des trois produits (1 x2n ), (1 + x2n1 z), (1 + x2n1 z 1 ) et de la srie du membre droit de (3.1). De e plus, pour chaque x x avec |x| < 1, la srie et les produits convergent uniformment e e e sur des parties compactes de C ne contenant pas 0, de sorte que chaque membre de lquation (3.1) est une fonction analytique de z pour z = 0. Pour un z = 0 x, la srie e e e et les produits convergent aussi uniformment pour |x| r < 1 et reprsentent donc e e des fonctions analytiques de x dans le disque |x| < 1. Pour dmontrer (3.1), nous xons x et dnissons F (z) pour z = 0 par e e F (z) =
n=1

(1 + x2n1 z)(1 + x2n1 z 1 )

(3.2)

Nous vrions dabord lquation fonctionnelle e e xzF (x2 z) = F (z) En eet, de (3.2), on a F (x z) = =
2 n=1 m=2 1 1

(1 + x2n+1 z)(1 + x2n3 z 1 ) (1 + x2m1 z)

(1 + x2r1 z 1 )

r=0

Comme xz = (1 + xz)/(1 + x z ), la multiplication de la derni`re quation par xz e e donne lquation fonctionnelle. e Soit maintenant G(z) le membre gauche de (3.1), de sorte que G(z) = F (z)
n=1

(1 x2n )

Alors G(z) vrie la mme quation fonctionnelle. De plus, G(z) est analytique pour e e e z = 0 et admet le dveloppement en srie de Laurent e e G(z) = Version 15 janvier 2005
m=

am z m

(3.3)

8.3. Partitions dentiers

225

o` am = am parce que G(z) = G(z 1 ). Bien entendu, les coecients am dpendent u e de x. En reportant lquation (3.3) dans lquation fonctionnelle, on obtient pour les e e coecients am la formule de rcurrence e am+1 = x2m+1 am qui, en itrant, donne e a m = a 0 xm
2
2

parce que 1 + 3 + + (m 1) = m . Notons que cette galit vaut aussi pour m < 0. e e Ainsi, lquation (3.3) devient e Gx (z) = a0 (x)
m=

(m 0)

xm z m

(3.4)

o` nous avons indiqu explicitement la dpendance de x. Il rsulte de cette quation u e e e e que a0 (x) tend vers 1 lorsque x tend vers 0, et il reste a prouver que a0 (x) = 1 pour ` tout x. Nous allons montrer que a0 (x) = a0 (x4 )
k

(3.5)
k

Le rsultat sensuit, parce que lon obtient a0 (x) = a0 (x4 ) pour tout k 0 et que x4 e tend vers 0 lorsque k tend vers linni. Pour z = i, lquation (3.4) donne e
2 2 Gx (i) = xm i m = (1)m x(2m) a0 (x) m= m=

car im = im pour m impair, et par consquent e

Gx4 (1) Gx (i) = a0 (x) a0 (x4 )


n=1

Nous vrions que Gx (i) = Gx4 (1). Pour cela, observons dabord que e F (i) = (1 + x4n2 )

Comme tout nombre pair est de la forme 4n ou 4n 2, on a


n=1

(1 x2n ) =

n=1

(1 x4n )(1 x4n2 )

de sorte que Gx (i) = =


n=1 n=1

(1 x4n )(1 x8n4 ) (1 x8n )(1 x8n4 )(1 x8n4 ) = Gx4 (1) Version 15 janvier 2005

226 ce qui ach`ve la dmonstration. e e

Chapitre 8. Exemples combinatoires

Comme annonc, lidentit dEuler (Thor`me 8.3.5) sobtient comme un simple corole e e e laire de lidentit de Jacobi, en faisant la substitution de x par x3/2 et de z par x1/2 e dans lquation (3.1). Il vient : e
n=1

(1 x3n )(1 x 2 (2n1) 2 )(1 x 2 (2n1)+ 2 ) =


n=1

(1 x3n )(1 x3n2 )(1 x3n1 ) =

n=1

(1 xn )

et par ailleurs, le terme gnral du membre droit de lidentit dEuler scrit e e e e (x3/2 )n
2

(x1/2 )n + (x1/2 )n = (1)n x 2 n (xn/2 + xn/2 ) = (1)(x 2 n(3n+1) + x 2 n(3n1) )


1 1

Lidentit de Jacobi a de nombreuses autres consquences intressantes que nous nvoe e e e querons pas ici.

8.3.3

Programme : partitions dentiers

Une partition est une suite nie dentiers. On utilisera, pour la reprsenter, le type e mot dni dans le chapitre suivant. Ici, nous navons besoin que de la dnition et de e e quelques procdures : e
TYPE mot = ARRAY[0..LongueurMax] OF integer; PROCEDURE EntrerMot (VAR u: mot; titre: texte); PROCEDURE EcrireMot (VAR u: mot; titre: texte); FUNCTION Longueur (VAR u: mot): integer; PROCEDURE FixerLongueur (VAR u: mot; n: integer);

La constante LongueurMax est xe a une taille approprie. La rdaction des procdures e ` e e e est explique au chapitre suivant. e Pour engendrer les partitions de n (ou des partitions restreintes de n), il faut conna tre la premi`re partition, reconna la derni`re et savoir calculer la partition suivante dans e tre e lordre lexicographique inverse. La premi`re partition de n est bien sr la partition (n), e u et la derni`re est (1, 1, . . . , 1). Cest la seule partition dont la longueur est gale a n, e e ` donc elle est facile a reconna ` tre. Pour calculer la partition suivante dune partition a = (a1 , . . . , as ), on cherche la suite b = (aj , . . . , as ), avec aj > aj+1 = = as , et en posant t = aj + + as = aj + s j + 1, on dtermine la premi`re partition de t dont e e la plus grande part est aj 1. Cette partition vient se substituer a b. ` Dans le cas o` lon cherche les partitions de n en parts majores par m, seule la premi`re u e e partition change. Voici une ralisation : e Version 15 janvier 2005

8.3. Partitions dentiers

227

PROCEDURE PremierePartition (VAR a: Mot; m, n: integer); Calcule dans a la premi`re partition de n dont toutes les parts sont majores par m. e e VAR k, s: integer; BEGIN s := n DIV m; FOR k := 1 TO s DO a[k] := m; Des parts de taille m. IF (n MOD m) > 0 THEN BEGIN Une derni`re part, plus petite. e s := s + 1; a[s] := n MOD m END; FixerLongueur(a, s) La longueur de la premi`re partition. e END; { de "PremierePartition" }

Voici la procdure de calcul de la partition suivante : e


PROCEDURE PartitionSuivante (VAR a: Mot; n: integer; VAR derniere: boolean); Calcule dans le tableau a la partition suivante de n, si elle existe. Dans la ngative, la e variable boolenne devient vraie. e VAR m, t, j: integer; BEGIN derniere := Longueur(a) = n; Caractrisation simple. e IF NOT derniere THEN BEGIN j := Longueur(a); Calcul du nombre de parts gales a 1. e ` WHILE a[j] = 1 DO j := j - 1; t := Longueur(a) - j + a[j]; Cest le total a redistribuer. ` m := a[j] - 1; En parts majores par m. e WHILE t >= m DO BEGIN Tant que possible, des parts de taille m. a[j] := m; t := t - m; j := j + 1 END; IF t > 0 THEN Une derni`re part plus petite. e a[j] := t ELSE j := j - 1; END; FixerLongueur(a, j) La longueur de la nouvelle partition. END; { de "PartitionSuivante" }

Ces deux procdures sont employes pour lister toutes les partitions, ou les partitions e e en parts majores par m, dans les deux procdures que voici : e e
PROCEDURE ListerPartitions (n: integer); Les partitions de n. VAR a: Mot; derniere: boolean; BEGIN

Version 15 janvier 2005

228
PremierePartition(a, n, n); REPEAT EcrireMot(a, ); PartitionSuivante(a, n, derniere) UNTIL derniere END; { de "ListerPartitions" }

Chapitre 8. Exemples combinatoires

PROCEDURE ListerPartitionsPartsMajorees (n, m: integer); Les partitions de n en parts majores par m. e VAR a: Mot; derniere: boolean; BEGIN PremierePartition(a, m, n); REPEAT EcrireMot(a, ); PartitionSuivante(a, n, derniere) UNTIL derniere END; { de "ListerPartitionsPartsMajorees" }

Les partitions de 9 en parts majores par 4 sont : e


4 4 4 4 4 4 3 3 3 3 3 3 3 2 2 2 2 1 4 3 3 2 2 1 3 3 3 2 2 2 1 2 2 2 1 1 1 2 1 2 1 1 3 2 1 2 2 1 1 2 2 1 1 1

1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1

1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1

Le calcul des partitions de n en part distinctes se fait sur le mme schma. La premi`re e e e partition est (n). Lors du calcul de la partition suivante, on cherche a dterminer la ` e premi`re partition en parts distinctes commenant par un entier donn. Une telle pare c e tition nexiste pas toujours. Plus prcisment, on a le lemme suivant. e e Lemme 8.3.10. Il existe une partition de n en parts distinctes et de plus grande part m si et seulement si m n m(m + 1)/2. Preuve. La condition est ncessaire, car si a = (a1 , . . . , as ), avec a1 = m, est une e Version 15 janvier 2005

8.3. Partitions dentiers

229

partition de n, alors n = a1 + + as m + (m 1) + (m s + 1) m(m + 1)/2. La rciproque se montre de la mme mani`re. e e e Nous traduisons ce lemme en une petite procdure qui teste la deuxi`me condition : e e
FUNCTION CompatiblePartsDistinctes (n, m: integer): boolean; Vraie sil existe une partition de n en parts distinctes dont la plus grande part est m. BEGIN CompatiblePartsDistinctes := m * (1 + m) DIV 2 >= n END; { de "CompatiblePartsDistinctes" }

Cette procdure est ensuite utilise pour calculer la partition suivante : e e


PROCEDURE PartitionSuivantePartsDistinctes (VAR a: Mot; n: integer; VAR derniere: boolean); Calcule dans le tableau a la partition suivante de n, si elle existe. Dans la ngative, la e variable boolenne devient vraie. e VAR m, t, j: integer; possible: boolean; BEGIN j := Longueur(a); Le nombre de parts de a. t := 0; Calcul du total a redistribuer. ` possible := false; Pour linstant ... WHILE (j >= 1) AND (NOT possible) DO BEGIN t := t + a[j]; Total a redistribuer ` en parts majores par a[j] 1. e possible := CompatiblePartsDistinctes(t, a[j] - 1); Est-ce possible ? IF NOT possible THEN j := j - 1 END;{ "while" possible } derniere := NOT possible; IF possible THEN BEGIN m := a[j] - 1; Part maximale. WHILE (t >= m) AND (m > 0) DO BEGIN a[j] := m; On fait des parts. t := t - m; Ce qui reste. m := m - 1; La taille des parts dcro e t. j := j + 1 Le nombre de parts cro t. END; IF t > 0 THEN Une derni`re part, plus petite. e a[j] := t else j := j - 1; FixerLongueur(a, j) Longueur de la nouvelle partition. END { cest possible } END; { de "PartitionSuivantePartsDistinctes" }

A nouveau, une procdure dnumration g`re ces procdures : e e e e e


PROCEDURE ListerPartitionsPartsDistinctes (n: integer);

Version 15 janvier 2005

230
VAR

Chapitre 8. Exemples combinatoires

a: Mot; derniere: boolean; BEGIN PremierePartition(a, n, n); REPEAT EcrireMot(a, ); PartitionSuivantePartsDistinctes(a, n, derniere) UNTIL derniere END; { de "ListerPartitionsPartsDistinctes" }

Voici les rsultats pour n = 11 : e


11 10 9 8 8 7 7 6 6 6 5 5 1 2 3 2 4 3 5 4 3 4 3

1 1 1 2 2 2 1

La gnration des partitions distinctes et impaires, sur le mme mod`le, est plus come e e e plique, essentiellement parce que lentier 2 na pas de telle partition. Par consquent, e e certains dbuts de partition ne peuvent pas tre complts. Par exemple, parmi les pare e ee titions de 30, la suite (15, 13) ne peut pas tre complte. De mme, un entier impair n e ee e nadmet pas de partition dont la plus grande part est n 2. La situation est dcrite par e le lemme suivant. Lemme 8.3.11. Soient n m 1 des entiers, avec m impair. Il existe une partition de n en parts distinctes et impaires de plus grande part m si et seulement si mn m+1 2
2

et

m+1 2

= n + 2 et m + 2 = n

Preuve. Posons m = 2k 1. Soit (a1 , . . . , as ) une partition de n en parts distinctes et impaires et a1 = m. Posons m = 2k 1 et bi = as+1i pour 1 i s. On a videmment e n = m + 2. Par ailleurs, pour i = 1, . . . , s, 2i 1 bi 2(k s) + 2i 1 do`, en sommant sur i, u
s i=1 s

2i 1 = s

i=1

bi = n 2s(k s) + s2 = 2sk s2 k 2

Version 15 janvier 2005

8.3. Partitions dentiers

231

Supposons que k 2 = n + 2. Alors k 2 2 2sk s2 , soit (k s)2 2, ou encore k = s ou k = s + 1. Or s2 n = k 2 2, donc k = s. Comme chaque bi est impair, on a
s

n=
i=1

bi s (mod 2)

et dautre part n = k 2 2 k s + 1 mod 2, une contradiction. Rciproquement, supposons les conditions vries et posons n = n m, m = m 2. e e e Si m > n , alors (m, n ) ou (m, n 1, 1) est une partition de n en parts impaires, selon que n est impair ou pair. Les parts sont distinctes parce que n = 2. On peut donc supposer m n . On a alors n ((m + 1)/2)2 , n + 2 = ((m + 1)/2)2 , et on a galement m + 2 = n sauf si n = 2m. On peut donc conclure par rcurrence e e pour n = 2m. Si n = 2m, il existe une partition de m en parts impaires distinctes commenant par un c entier strictement plus petit que m, a savoir (m4, 3, 1), do` la partition (m, m4, 3, 1) ` u de n, sauf si m4 3, cest-`-dire pour m = 3, 5, 7. Or ces cas ne peuvent pas se produire a 2 2 car, pour m = 3, 5, on a n > m+1 et, pour m = 7, on a n + 2 = m+1 . 2 2 Voici une procdure qui teste une partie des conditions du lemme : e
FUNCTION CompatiblePartsDistinctesImpaires (n, m: integer): boolean; Partie de la condition dexistence dune partition de n en parts distinctes impaires dont la plus grande part est m. On suppose m n. VAR c: integer; BEGIN c := sqr((1 + m) DIV 2); CompatiblePartsDistinctesImpaires := (c >= n) AND (c <> n + 2) END; { de "CompatiblePartsDistinctesImpaires" }

Elle est utilise dans la procdure suivante; le calcul de la partition suivante, lorsque e e lon sait quelle existe, doit tre men avec soin. e e
PROCEDURE PartitionSuivantePartsDistinctesImpaires (VAR a: Mot; n: integer; VAR derniere: boolean); Calcule dans le tableau a la partition suivante de n, si elle existe. Dans la ngative, la e variable boolenne devient vraie. e VAR m, t, j: integer; possible: boolean; BEGIN j := Longueur(a); Le nombre de parts de a. t := 0; Calcul du total a redistribuer. ` possible := false; Pour linstant ... WHILE (j >= 1) AND (NOT possible) DO BEGIN t := t + a[j]; Total a redistribuer en parts ` majores par a[j] 2. e

Version 15 janvier 2005

232

Chapitre 8. Exemples combinatoires


possible := CompatiblePartsDistinctesImpaires(t, a[j] - 2); IF NOT possible THEN j := j - 1 END;{ "while" possible } derniere := NOT possible; IF possible THEN BEGIN m := a[j] - 2; Part maximale. WHILE t > 0 DO BEGIN Rpartition. e WHILE t < m DO m := m - 2; Ajustement. IF (t = m + 2) AND (m > 1) THEN Pour quil ne reste pas la part 2. m := m - 2; a[j] := m; On fait des parts. t := t - m; Ce qui reste. m := m - 2; La taille des parts dcro e t. j := j + 1 Le nombre de parts cro t. END; { "while" } Fin de la rpartition. e FixerLongueur(a, j - 1) Longueur de la nouvelle partition. END { cest possible } END; { de "PartitionSuivantePartsDistinctesImpaires" }

Voici le rsultat de cette procdure, utilise pour lister les partitions de 30 en parts e e e impaires et distinctes.
29 27 25 23 21 21 19 19 17 17 17 15 15 15 13 13 13 11 1 3 5 7 9 5 11 7 13 9 7 11 9 7 11 9 9 9

3 3 3 5 3 5 5 5 7 5 7

1 1 1 1 1 1 3 1 1 3 3

Evidemment, on peut spargner la peine de programmer tout cela : il sut dengendrer e toutes les partitions de n et de ne conserver que celles qui conviennent. Mais ceci nest pas tr`s ecace : pour n = 30, on a p(30) = 5604, alors quil ny a que 18 partitions en e parts distinctes et impaires. Pour des valeurs de n plus grandes, les calculs deviennent prohibitifs. Lemploi des procdures rcursives est tr`s avantageux, puisque les partitions se de e e e nissent de mani`re rcurrente. e e Version 15 janvier 2005

8.3. Partitions dentiers

233

PROCEDURE LesPartitionsDistinctesImpaires (n: integer); Procdure calculant ces partitions de mani`re rcursive. e e e VAR a: mot; PROCEDURE Parts (p, n, m: integer); p est la premi`re position libre dans le tableau a ; e n est lentier dont on calcule les partitions ; m est la plus grande part dune partition de n. BEGIN IF n = 0 THEN BEGIN Construction termine. e FixerLongueur(a, p - 1); EcrireMot(a, ) END ELSE IF (n = 2) OR (m < 0) THEN Pas de partition ! ELSE BEGIN IF n >= m THEN On prolonge la partition courante. BEGIN a[p] := m; Parts(p + 1, n - m, m - 2); Tentative pour la terminer. END; IF sqr((m - 1) DIV 2) >= n THEN Mais dans certains cas, Parts(p, n, m - 2) il y en a peut-tre dautres. e END END; { de "Parts" } BEGIN IF odd(n) THEN Parts(1, n, n) ELSE Parts(1, n, n + 1) END; { de "LesPartitionsDistinctesImpaires" }

Pour terminer, considrons le calcul du nombre de partitions de n. On utilise pour cela e les formules p1 (k) = 1 (1 k n) et pm (k) = pm1 (k) si k > n pm1 (k) + pm (k m) si k m > 1

et on value pm (k) pour 1 m n et m k n. Le rsultat sobtient parce que e e p(n) = pn (n). Voici une implmentation avec un seul tableau (ddoubl) contenant, e e e pour chaque m = 1, . . . , n, les nombres pm (k) pour 1 k n :
PROCEDURE NombreDePartitions (n: integer; VAR alpha, beta: integer); Calcul du nombre p(n) de partitions par la formule p(n) = pn (n). Rsultat sous la forme e p(n) = 104 + . CONST nmax = 100; Pour les p(k) avec k nmax . base = 10000; Base pour lcriture des entiers. e

Version 15 janvier 2005

234
VAR

Chapitre 8. Exemples combinatoires

a, b: ARRAY[0..nmax] OF integer; k, m, s: integer; BEGIN FOR k := 0 TO n DO BEGIN Initialisation : p(k) = p1 (k) = 1. a[k] := 0; b[k] := 1 END; FOR m := 2 TO n DO Calcul des pm (k) par la formule FOR k := m TO n DO BEGIN pm (k) = pm1 (k) + pm (k m). s := b[k] + b[k - m]; b[k] := s MOD base; Dcomposition sur la base. e a[k] := a[k] + a[k - m] + s DIV base; END; alpha := a[n]; beta := b[n] END; { de "NombreDePartitions" }

Quelques rsultats numriques : e e


p(30) = 5604 p(60) = 966467 p(90) = 56634173 p(100) = 190569292

Notes bibliographiques
Pour la gnration dobjets combinatoires, on peut consulter : e e D. Stanton, D. White, Constructive Combinatorics, New York, Springer-Verlag, 1986. (Ce livre contient de nombreux programmes.) Les livres traitant des partitions sont tr`s nombreux. Le livre de Stanton et White e contient de nombreuses preuves bijectives . Nous nous sommes inspirs de : e G.H. Hardy, E.M. Wright, An Introduction to the Theory of Numbers, London, Oxford University Press, 1965. T.M. Apostol, Introduction to Analytic Number Theory, New York, Springer-Verlag, 1976. Les nombres et polynmes de Bernoulli interviennent souvent, par exemple dans la o formule dEuler-MacLaurin. Pour dautres proprits, on peut consulter : ee L. Comtet, Analyse combinatoire, Paris, Presses Universitaires de France, 1970. D.E. Knuth, The Art of Computer Programming, Vol. I, Reading, Addison-Wesley, 1968. Des tables numriques, ainsi quun rsum des proprits principales, se trouvent dans : e e e ee M. Abramowitz, I. Stegun, Handbook of Mathematical Functions, New York, Dover, 1964. Version 15 janvier 2005

235

Chapitre 9

Combinatoire des mots


9.1 Terminologie

Soit A un ensemble. On appelle mot sur A toute suite nie u = (u1 , . . . , un ) o` n 0 et ui A pour i = 1, . . . , n. Lentier n est la longueur de u, souvent note |u|. u e Si n = 0, le mot est appel le mot vide, et est not 1 ou . Si e e v = (v1 , . . . , vm ) est un autre mot, le produit de concatnation de u et v est le mot e uv = (u1 , . . . , un , v1 , . . . , vm ) Tout mot tant le produit de concatnation de mots de longueur 1, on identie les mots e e de longueur 1 et les lments de A. On appelle alors A lalphabet, et les lments de A ee ee des lettres. Si u, v et w sont des mots et w = uv, alors u est un prxe et v est un suxe de w. Si e de plus u = w (resp. v = w), alors u est un prxe propre (resp. un suxe propre) de e w. Si u, v, v et w sont des mots tels que w = vuv , alors u est un facteur de w. Pour raccourcir lcriture, nous dirons quun prxe propre non vide dun mot est un dbut, e e e et quun suxe propre non vide est une n. Un conjugu dun mot u = (u1 , . . . , un ) est e un mot de la forme v = (ui , . . . , un , u1 , . . . , ui1 ) avec 2 i n.

Dans les noncs qui suivent, les lettres sont des entiers. Un mot de longueur n est donc e e reprsent par un tableau dentiers a n + 1 lments, llment dindice 0 contenant la e e ` ee ee longueur du mot. Voici un dbut de biblioth`que de manipulation de mots. e e

Version 15 janvier 2005

236

Chapitre 9. Combinatoire des mots

CONST LongueurMot = 30; TYPE mot = ARRAY[0..LongueurMot] OF integer; FUNCTION Longueur (VAR u: mot): integer; PROCEDURE FixerLongueur (VAR u: mot; n: integer); PROCEDURE EntrerMot (VAR u: mot; titre: texte); PROCEDURE EcrireMot (VAR u: mot; titre: texte); FUNCTION EstMotVide (VAR u: mot): boolean; PROCEDURE Concatener (u, v: mot; VAR w: mot); PROCEDURE LettreEnMot (VAR u: mot; x: integer);

Les procdures de gestion de la longueur du mot sont : e


FUNCTION Longueur (VAR u: mot): integer; BEGIN Longueur := u[0] END; { de "Longueur" } PROCEDURE FixerLongueur (VAR u: mot; n: integer); BEGIN u[0] := n END; { de "FixerLongueur" }

Les deux procdures suivantes sont crites sur le mod`le dj` rencontr plusieurs fois : e e e ea e
PROCEDURE EntrerMot (VAR u: mot; titre: texte); VAR i: integer; BEGIN write(titre); i := 0; WHILE NOT eoln DO BEGIN i := i + 1; read(u[i]) END; FixerLongueur(u,i); readln END; { de "EntrerMot" } PROCEDURE EcrireMot (VAR u: mot; titre: texte); VAR i: integer; BEGIN writeln; write(titre); IF EstMotVide(u) THEN write(-) par exemple... ELSE FOR i := 1 TO Longueur(u) DO write(u[i] : precision); END; { de "EcrireMot" }

Rappelons que precision est une variable globale de notre environnement (voir lannexe A). La procdure de concatnation de deux mots scrit : e e e Version 15 janvier 2005

9.1. Terminologie
PROCEDURE Concatener (u, v: mot; VAR w: mot); VAR i, n: integer; BEGIN w := u; n := Longueur(u); FOR i := 1 TO Longueur(v) DO w[i + n] := v[i]; FixerLongueur(w, n + Longueur(v)) END; { de "Concatener" }

237

Les deux procdures suivantes sont parfois utiles : e


FUNCTION EstMotVide (VAR u: mot): boolean; BEGIN EstMotVide := Longueur(u) = 0 END; { de "EstMotVide" } PROCEDURE LettreEnMot (VAR u: mot; x: integer); BEGIN u[1] := x; FixerLongueur(u, 1); END; { de "LettreEnMot" }

Nous allons utiliser des procdures qui permettent dextraire un prxe, un suxe, ou e e un facteur dun mot donn. Ces procdures sont : e e
PROCEDURE LePrefixe (u: mot; i: integer; VAR v: mot); Dtermine le prxe v = u1 ui de u. e e BEGIN v := u; FixerLongueur(v, i) END; { de "LePrefixe" } PROCEDURE LeSuffixe (u: mot; i: integer; VAR v: mot); Dtermine le suxe v = ui un de u. e VAR j: integer; BEGIN FOR j := i TO Longueur(u) DO v[j - i + 1] := u[j]; FixerLongueur(v, Longueur(u) - i + 1) END; { de "LeSuffixe" } PROCEDURE LeFacteur (u: mot; i, j: integer; VAR v: mot); Dtermine le facteur v = ui uj de u. e VAR k: integer; BEGIN FOR k := i TO j DO v[k - i + 1] := u[k]; FixerLongueur(v, j - i + 1) END; { de "LeFacteur" }

Version 15 janvier 2005

238

Chapitre 9. Combinatoire des mots

Bien entendu, on peut aussi bien dnir lextraction dun prxe ou dun suxe au e e moyen de lextraction dun facteur. Enn, voici une procdure qui calcule le conjugu e e dun mot :
PROCEDURE LeConjugue (u: mot; i: integer; VAR v: mot); Calcule le mot v = ui+1 un u1 ui conjugu de u. e VAR j, n: integer; BEGIN n := Longueur(u); FixerLongueur(v, n); FOR j := 1 TO n - i DO v[j] := u[i + j]; FOR j := n - i + 1 TO n DO v[j] := u[i + j - n] END; { de "LeConjugue" }

9.2
9.2.1

Mots de Lukasiewicz
Enonc : mots de Lukasiewicz e

Dans cet nonc, on appelle mot toute suite nie dentiers u = (u1 , . . . , un ), o` n 1 et e e u o` ui {1, 1} pour i = 1, . . . , n. Lentier n est la longueur de u. u Un mot de longueur n est reprsent par un tableau dentiers a n + 1 lments, llment e e ` ee ee dindice 0 contenant la longueur du mot.

Un mot u = (u1 , . . . , un ) est un mot de Lukasiewicz si


n i=1 k

ui = 1 et

i=1

ui 0 pour 1 k n 1

1. Ecrire une procdure qui teste si un mot est un mot de Lukasiewicz. e Exemples numriques : (1, 1, 1, 1, 1, 1, 1, 1) et (1, 1, 1, 1, 1, 1, 1, 1, 1). e Un pic du mot u = (u1 , . . . , un ) est un entier i (1 i n 2) tel que ui = 1 et ui+1 = ui+2 = 1. On dnit une fonction qui a un mot u = (u1 , . . . , un ) associe un e ` mot (u) de la mani`re suivante : e (u) = u, si u ne poss`de pas de pic; e (u) = (u1 , . . . , ui1 , ui+2 , . . . , un ), si u poss`de un pic et si i est le plus petit pic e de u. Soit la fonction dnie pour un mot u par (u) = m (u), o` m est le plus petit e u entier 0 tel que m (u) = m+1 (u). (On pose m+1 = m .) 2. Dmontrer que u est un mot de Lukasiewicz si et seulement si (u) = (1). e 3. Ecrire des procdures qui calculent (u) et (u) pour un mot u. e Version 15 janvier 2005

9.2. Mots de Lukasiewicz

239

4. Dmontrer que si u = (u1 , . . . , un ) et v = (v1 , . . . , vm ) sont des mots de Lukasiewicz, e alors (1, u1 , . . . , un , v1 , . . . , vm ) est un mot de Lukasiewicz. 5. Dmontrer que rciproquement, si w = (w1 , . . . , wn ) est un mot de Lukasiewicz et e e si n > 1, alors w1 = 1 et il existe un unique couple u = (u1 , . . . , um ) et v = (v1 , . . . , vk ) de mots de Lukasiewicz tels que w = (1, u1 , . . . , um , v1 , . . . , vk ) Les mots u et v sont respectivement appels le ls gauche et le ls droit de w. e 6. Ecrire une procdure qui calcule et ache tous les mots de Lukasiewicz de longueur e n, en utilisant la caractrisation des deux questions prcdentes. On pourra prendre e e e n = 9. 7. Soit u = (u1 , . . . , un ) un mot tel que e i=1 ui = 1. Dmontrer quil existe un unique i, avec 1 i n tel que (ui , ui+1 , . . . , un , u1 , . . . , ui1 ) soit un mot de Lukasiewicz. En dduire que le nombre ck de mots de Lukasiewicz de longueur 2k + 1 e est 2k 1 k+1 k (On note
p q n

p! q!(pq)! .)

8. Ecrire une procdure qui, pour un mot u = (u1 , . . . , un ), calcule lentier i de la e question prcdente. e e 9. La profondeur p(w) dun mot de Lukasiewicz est dnie par rcurrence sur la e e longueur de w comme suit : si w est de longueur 1, alors p(w) = 1; sinon, p(w) = 1 + max(p(u), p(v)), o` u et v sont les ls gauche et droit de w. Ecrire une procdure u e qui calcule la profondeur dun mot. 10. On associe a chaque mot de Lukasiewicz w une gure F (w) dans un plan ane ` euclidien muni dun rep`re orthonorm (O, i, j) de la mani`re suivante, par rcurrence e e e e sur la longueur de w : si w est de longueur 1, la gure F (w) consiste en un point unique plac en O. Si w est de longueur > 1, soient u et v les ls gauche et droit de e w ; la gure F (w) est la runion des segments de droite joignant lorigine aux points e de coordonnes (2p(w) , 0) et (0, 2p(w) ) et des gures F (u) et F (v), translates respece e tivement de (2p(w) , 0) et de (0, 2p(w) ). Ci-dessous est reprsente la gure associe a e e e ` w = (1, 1, 1, 1, 1, 1, 1, 1, 1). Ecrire une procdure qui dtermine et trace la gure e e associe a un mot de Lukasiewicz. e ` t t t t t t t t Version 15 janvier 2005

240

Chapitre 9. Combinatoire des mots

9.2.2

Solution : mots de Lukasiewicz

On appelle mot toute suite nie dentiers u = (u1 , . . . , un ), o` n 1 et o` ui {1, 1} u u pour i = 1, . . . , n. Etant donn un mot u = (u1 , . . . , un ), on pose e
k

s(u, k) =
i=1

ui

k = 1, . . . , n

de sorte que u est un mot de Lukasiewicz si et seulement si s(u, n) = 1ets(u, k) 0pourk = 1, . . . , n 1 Un pic du mot u = (u1 , . . . , un ) est un entier i (1 i n 2) tel que ui = 1 et ui+1 = ui+2 = 1. On dnit une fonction qui a un mot u = (u1 , . . . , un ) associe un e ` mot (u) de la mani`re suivante : e (u) = u, si u ne poss`de pas de pic; e (u) = (u1 , . . . , ui1 , ui+2 , . . . , un ), si u poss`de un pic et si i est le plus petit pic e de u. Lemme 9.2.1. Un mot u est un mot de Lukasiewicz si et seulement si (u) est un mot de Lukasiewicz. Preuve. Le lemme est vident si u na pas de pic. Supposons donc que u poss`de un pic e e et soit i le plus petit pic de u. Soit v = (u) = (v1 , . . . , vn2 ), avec vj = On a s(v, k) = s(u, k) si k i 1 s(u, k + 2) si k i k = 1, . . . , n 2 uj uj+2 si 1 j i 1 si i j n 2 En particulier, on a un = 1, et si n > 1, alors u1 = 1 et un1 = 1.

ce qui montre que v est un mot de Lukasiewicz si u lest. Rciproquement, on a e s(u, i) = 1 + s(u, i 1) s(u, i + 1) = s(u, i 1) ce qui montre que u est de Lukasiewicz si v lest. Soit la fonction dnie pour un mot u par (u) = m (u), o` m est le plus petit e u entier 0 tel que m (u) = m+1 (u). (On pose m+1 = m .) Proposition 9.2.2. Un mot u est un mot de Lukasiewicz si et seulement si (u) = (1). Version 15 janvier 2005

9.2. Mots de Lukasiewicz

241

Preuve. Comme (1) est un mot de Lukasiewicz, la condition est susante par le lemme ci-dessus. Rciproquement, soit u un mot de Lukasiewicz; alors par le lemme, e v = (u) = (v1 , . . . , vn ) est un mot de Lukasiewicz. Si n = 1, on a v = (1); supposons donc n > 1. On a vn = vn1 = 1 et v1 = 1. Soit k le plus grand entier tel que vk = 1. Alors k n 2 et k est un pic, donc v = (v). Proposition 9.2.3. Si u et v sont des mots de Lukasiewicz, alors le mot w = 1uv est un mot de Lukasiewicz. Preuve. Soient n = |u| et m = |v|. On a si k = 1 1 s(w, k) = 1 + s(u, k 1) si 2 k n + 1 s(v, k n 1) si n + 2 k n + m + 1 Ceci montre que w est un mot de Lukasiewicz. Proposition 9.2.4. Soit w = (w1 , . . . , wn ) un mot de Lukasiewicz de longueur n > 1; alors w1 = 1 et il existe un unique couple u = (u1 , . . . , um ) et v = (v1 , . . . , vk ) de mots de Lukasiewicz tels que w = (1, u1 , . . . , um , v1 , . . . , vk ) Preuve. On ne peut avoir w1 = 1 que si n = 1. Donc w1 = 1. Soit m le plus petit entier tel que s(w, m) = 0. Le mot u = (w2 , . . . , wm ) vrie alors s(u, i) = s(w, i + 1) 1 e pour i = 1, . . . , m 1, donc u est un mot de Lukasiewicz. Soit v = (wm+1 , . . . , wn ). Alors w = 1uv. Par ailleurs, on a s(v, i) = s(w, m + i) pour i = 1, . . . , n m, ce qui prouve que v est un mot de Lukasiewicz. Prouvons lunicit. Supposons que w = 1uv = 1u v , avec par exemple u plus court que e u. Posons n = |u |. Alors s(u , n) = 1 = s(u, n) 0, do` la contradiction. u Proposition 9.2.5. Soit u = (u1 , . . . , un ) un mot tel que s(u, n) = 1. Il existe un unique i, avec 1 i n tel que (ui , ui+1 , . . . , un , u1 , . . . , ui1 ) soit un mot de Lukasiewicz. Preuve. Soit p = min1kn s(u, k) et soit i le plus petit entier tel que s(u, i) = p. On pose v = (ui+1 , . . . , un , u1 , . . . , ui ) Vrions que v est un mot de Lukasiewicz. On a e s(v, k) = s(u, i + k) p pour 1 k n i s(u, n) p + s(u, k + i n) pour n i + 1 k n

Or s(u, i+k) p par dnition de p et, pour ni+1 k n1, on a 1 k+in i1, e donc s(u, k + i n) > p par le choix de i, ce qui montre que s(v, k) > 1 dans ces cas. Enn, s(v, n) = 1. Version 15 janvier 2005

242

Chapitre 9. Combinatoire des mots

En vue de dnombrer les mots de Lukasiewicz, nous avons besoin dun rsultat supple e e mentaire qui est intressant en lui-mme. e e Proposition 9.2.6. Soient u et v deux mots non vides. Les conditions suivantes sont quivalentes : e (1) uv = vu; (2) il existe deux entiers n, m 1 tels que un = v m ; (3) il existe un mot w non vide et deux entiers k, 1 tels que u = w k , v = w . Preuve. (1) (3). Si |u| = |v|, alors u = v et limplication est vidente. En raisonnant e par rcurrence sur |uv|, supposons |u| > |v|. Soit alors w tel que u = vw. En reportant e dans lquation uv = vu, on obtient vwv = vvw, do` en simpliant wv = vw. Par e u rcurrence, il existe un mot x et des entiers k, 1 tels que v = w k , w = x , do` e u u = xk+ . (3) (2). Si u = w k et v = w , alors u = v k . (2) (1). La conclusion est vidente si u = v. Supposons donc |u| > |v|, et soit w tel e que u = vw. Alors un v = (vw)n v = v(wv)n = v m+1 et en simpliant la derni`re galit, (wv)n = v m . Comme v m = un = (vw)n , on a e e e (wv)n = (vw)n , donc wv = vw, ou encore uv = vu. Corollaire 9.2.7. Le nombre de mots de Lukasiewicz de longueur 2n + 1 est 2n 1 n+1 n Preuve. Le nombre de mots u de longueur 2n + 1 tels que s(u, 2n + 1) = 1 est gal a e ` 2n+1 , puisquil sagit de choisir n + 1 positions pour les lettres gales a 1. Dapr`s la e ` e n+1 proposition 9.2.5, les 2n + 1 mots qui rsultent dun tel mot par permutation circulaire e donnent un unique mot de Lukasiewicz. Il reste a prouver que ces 2n + 1 mots sont deux ` a deux distincts. Supposons au contraire que ` x = (u1 , . . . , u2n+1 ) = (ui , . . . , u2n+1 , u1 , . . . , ui1 ) pour un entier i > 1; alors on a uv = vu en posant u = (u1 , . . . , ui1 ) et v = (ui , . . . , u2n+1 ). Par la proposition prcdente, on a u = w k et v = w pour un mot e e w de longueur disons h. Posons m = s(w, h). Alors 1 = s(x, 2n + 1) = (k + )m, ce qui est impossible parce que k + 2. Le nombre de mots de Lukasiewicz est donc 1 2n + 1 2n + 1 n + 1 = 1 2n n+1 n

Les entiers du corollaire 9.2.7 sont les nombres de Catalan. Version 15 janvier 2005

9.2. Mots de Lukasiewicz

243

9.2.3

Programme : mots de Lukasiewicz

Pour tester quun mot est un mot de Lukasiewicz, il sut de calculer la fonction s et de vrier les conditions. Ceci conduit a la procdure suivante : e ` e
FUNCTION EstLukasiewicz (VAR u: mot): boolean; VAR s, k, n: integer; BEGIN s := 0; k := 0; n := Longueur(u); WHILE (s >= 0) AND (k < n) DO BEGIN Lentier s doit tre positif ou nul, e k := k + 1; s := s + u[k] END; EstLukasiewicz := (k = n) AND (s = -1) et s = 1 a la n du mot. ` END; { de "EstLukasiewicz" }

On peut aussi tester quun mot est de Lukasiewicz en calculant et en vriant que le e rsultat est le mot (1). Nous nous contentons des procdures ralisant et . e e e
FUNCTION EstPic (VAR u: mot; i: integer): boolean; Teste si un entier i Longueur (u) 2 est un pic de u. BEGIN EstPic := (u[i] = 1) AND (u[i + 1] = -1) AND (u[i + 2] = -1) END; { de "EstPic" } PROCEDURE Rho (VAR u: mot); VAR i, j, n: integer; BEGIN i := 1; n := Longueur(u); WHILE (i <= n - 2) AND NOT EstPic(u, i) DO i := i + 1; IF i <= n - 2 THEN BEGIN FOR j := i TO n - 2 DO u[j] := u[j + 2]; FixerLongueur(u, n - 2) END; END; { de "Rho" } PROCEDURE RhoEtoile (VAR u: mot); VAR n: integer; BEGIN REPEAT n := Longueur(u); Rho(u) UNTIL n = Longueur(u) END; { de "RhoEtoile" }

{ AND squentiel } e Elimination du pic.

Sauvegarde de lancienne longueur. Calcul de . Comparaison a lancienne longueur. `

Version 15 janvier 2005

244

Chapitre 9. Combinatoire des mots

La dcomposition dun mot de Lukasiewicz en ses deux ls gauche et droit ainsi que la e recomposition se font par les procdures que voici : e
PROCEDURE FilsLukasiewicz (w: mot; VAR u, v: mot); Le mot w commence par 1. Les mots u et v reoivent respectivement le ls gauche et le c ls droit de w. VAR i, j, s: integer; BEGIN s := 0; i := 1; REPEAT Calcul du ls gauche. i := i + 1; s := s + w[i] UNTIL s = -1; LeFacteur(w, 2, i, u); LeSuffixe(w, i + 1, v) Le ls droit. END; { de "FilsLukasiewicz" } PROCEDURE PereLukasiewicz (u, v: mot; VAR w: mot); BEGIN LettreEnMot(w, 1); Concatener(w, u, w); Concatener(w, v, w) END; { de "PereLukasiewicz" }

Pour engendrer tous les mots de Lukasiewicz, on range, dans une suite de mots, les mots de Lukasiewicz de longueur donne. Les mots de longueur 2n + 1 sobtiennent en e concatnant des mots de longueur 2k + 1 et de longueur 2 + 1, pour k + = n 1. e Une suite de mots se dnit par : e
CONST LongueurSuiteMot = 42;

42 =

1 10 6 5

TYPE SuiteMot = ARRAY[1..LongueurSuiteMot] OF mot;

et une table de suite de mots par :


CONST LongueurTable = 5; TYPE TableSuite = ARRAY[0..LongueurTable] OF SuiteMot; TailleSuite = ARRAY[0..LongueurTable] OF integer;

o` lentier dindice n du tableau de type TailleSuite contient le nombre dlments u ee dans la n-i`me suite de mots. e Ceci conduit aux procdures suivantes : e

Version 15 janvier 2005

9.2. Mots de Lukasiewicz

245

PROCEDURE EngendrerLukasiewicz (nn: integer; VAR luk: TableSuite; VAR l: TailleSuite); VAR n, k: integer; BEGIN LettreEnMot(luk[0][1], -1); Lunique mot de longueur 1. l[0] := 1; FOR n := 1 TO nn DO BEGIN l[n] := 0; FOR k := 0 TO n - 1 DO ComposerLukasiewicz(luk[k],luk[n-k-1],luk[n],l[k],l[n-k-1],l[n]) END; END; { de "EngendrerLukasiewicz" }

avec :
PROCEDURE ComposerLukasiewicz (VAR a, b, c: SuiteMot; VAR la, lb, m: integer); Compose les mots de la suite a avec les mots de la suite b. VAR i, j: integer; BEGIN FOR i := 1 TO la DO FOR j := 1 TO lb DO BEGIN m := m + 1; PereLukasiewicz(a[i], b[j], c[m]) END END; { de "ComposerLukasiewicz" }

Voici le rsultat obtenu : e


n = -1 n = 1 n = 1 1 n = 1 1 1 1 1 n = 1 1 1 1 0 1 -1 2 -1 1 3 -1 -1 1 1 1 4 -1 -1 -1 -1 l[0] = 1 l[1] = 1 -1 l[2] = 2 1 -1 -1 -1 -1 -1 l[3] = 5 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 l[4] = 14 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1 1

-1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1

Version 15 janvier 2005

246
1 1 1 1 1 1 1 1 1 1 n = 1 1 . -1 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1 5 l[5] = 42 -1 1 -1 1 -1 -1 1 -1 1 -1 . . . . -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

Chapitre 9. Combinatoire des mots

1 -1 1 -1 -1 1 1 -1 -1 -1

Soit maintenant u = (u1 , . . . , un ) un mot tel que s(u, n) = 1. La preuve de la proposition 9.2.5 donne en fait lalgorithme pour calculer le conjugu de u qui est un mot de e Lukasiewicz : on calcule le plus petit entier i tel que s(u, i) = min 1kn s(u, k), puis on dcale le mot u a cette position. On obtient donc la procdure : e ` e
PROCEDURE ConjuguerEnLukasiewicz (u: mot; VAR i: integer; VAR v: mot); VAR j, n, s, smin: integer; BEGIN n := Longueur(u); smin := 0; Conserve min1kn s(u, k). s := 0; i := 0; Conserve lindice du minimum. FOR j := 1 TO n DO BEGIN s := s + u[j]; IF s < smin THEN BEGIN Ajustement du minimum. smin := s; i := j END; END; LeConjugue(u, i, v); Calcul du conjugu. e END; { de "ConjuguerEnLukasiewicz" }

Le calcul de la profondeur dun mot de Lukasiewicz ainsi que le trac de la gure associe e e se font plus simplement en utilisant des procdures rcursives. Ainsi, la dnition de la e e e profondeur conduit directement a lcriture rcursive suivante : ` e e
FUNCTION Profondeur (VAR w: mot): integer; VAR u, v: mot; BEGIN IF Longueur(w) = 1 THEN Profondeur := -1 ELSE BEGIN FilsLukasiewicz(w, u, v);

Version 15 janvier 2005

9.2. Mots de Lukasiewicz


Profondeur := 1 + max(Profondeur(u), Profondeur(v)) END END; { de "Profondeur" }

247

Pour le trac lui-mme, il convient de xer la distance, en nombre de pixels par exemple, e e qui doit sparer deux points voisins a coordonnes enti`res. Moyennant quoi, on peut e ` e e crire des primitives de trac dun point et dun segment de droite; sur le Macintosh e e par exemple, une ralisation est la suivante (pour une interface graphique un peu plus e consquente, voir le chapitre 10) : e
CONST ecart = 20;

Nombre de pixels sparant deux points voisins. e

PROCEDURE TracerPoint (x, y: integer); BEGIN Paintcircle(ecart * x, ecart * y, 5); END; { de "TracerPoint" } PROCEDURE TracerSegment (x, y, xx, yy: integer); BEGIN Drawline(ecart * x, ecart * y, ecart * xx, ecart * yy) END; { de "TracerSegment" }

La dnition de la gure associe a un mot de Lukasiewicz se traduit alors directement e e ` en :


PROCEDURE FigureLukasiewicz (w: mot; x, y: integer); Trace la gure associe a w, en dbutant au point de coordonnes (x, y). e ` e e VAR u, v: mot; n: integer; BEGIN IF Longueur(w) = 1 THEN TracerPoint(x, y) ELSE BEGIN FilsLukasiewicz(w, u, v); n := puissanceE(2, Profondeur(w)); n = 2 p(w) TracerSegment(x, y, x + n, y); FigureLukasiewicz(u, x + n, y); TracerSegment(x, y, x, y + n); FigureLukasiewicz(v, x, y + n); END END; { de "FigureLukasiewicz" }

On appelle cette procdure par : e


FigureLukasiewicz( w, 1, 1);

par exemple. Lexemple de lnonc est obtenu de cette mani`re, a une symtrie pr`s. e e e ` e e Version 15 janvier 2005

248

Chapitre 9. Combinatoire des mots

9.3
9.3.1

Mots de Lyndon
Enonc : mots de Lyndon e

Dans cet nonc, on appelle mot toute suite nie dentiers u = (u1 , . . . , un ), o` n 1 et e e u o` ui {0, 1} pour i = 1, . . . , n. Lentier n est la longueur de u. Si u = (u1 , . . . , un ) et u v = (v1 , . . . , vm ) sont des mots, on note uv le mot (u1 , . . . , un , v1 , . . . , vm ). Un mot de longueur n est reprsent par un tableau dentiers a n + 1 lments, llment e e ` ee ee dindice 0 contenant la longueur du mot. 1. Ecrire une procdure qui, a partir de deux mots u et v, construit le mot uv. e ` Soient u = (u1 , . . . , un ) et v = (v1 , . . . , vm ) deux mots. Alors u est un dbut de v si e n < m et ui = vi pour i = 1, . . . , n; le mot u est une n de v si n < m et si ui = vmn+i pour i = 1, . . . , n. On pose u v si u est un dbut de v ou sil existe un entier k tel que ui = vi pour e i = 1, . . . , k 1 et uk < vk . 2. Dmontrer que pour deux mots u = v, on a soit u e La relation dnie par u e lexicographique. v, soit v u. v sappelle lordre v. v si et seulement si u = v ou u

3. Ecrire une procdure qui, pour deux mots u et v, dtermine si u e e

Un conjugu dun mot u = (u1 , . . . , un ) est un mot de la forme v = (ui , . . . , un , e u1 , . . . , ui1 ) avec 2 i n. Un mot u est un mot de Lyndon si u v pour tout conjugu v de u. Clairement, un mot de longueur 1 est un mot de Lyndon. e 4. Ecrire une procdure qui teste si un mot est un mot de Lyndon. e 5. Soit u un mot. Dmontrer que sil existe un mot qui est a la fois un dbut et une e ` e n de u, alors u nest pas un mot de Lyndon. 6. Dmontrer quun mot u est un mot de Lyndon si et seulement si pour toute n h e de u, on a u h. Ecrire une procdure qui teste si u est un mot de Lyndon en utilisant e cette caractrisation. e 7. Dmontrer que si un mot u de longueur > 1 est un mot de Lyndon, il existe e deux mots de Lyndon f et g tels que u = f g et f g et, rciproquement, si f et e g sont des mots de Lyndon tels que f g, alors f g est un mot de Lyndon. Utiliser cette caractrisation pour crire une procdure qui dtermine tous les mots de Lyndon e e e e de longueur au plus n. On les achera dans lordre lexicographique. On testera pour n = 5. Soit u = (u1 , . . . , un ) un mot. Une factorisation de Lyndon du mot u est une squence e u(1) , u(2) , . . . , u(p) de mots de Lyndon telle que u = u(1) u(2) u(p) Version 15 janvier 2005 et u(1) u(2) u(p)

9.3. Mots de Lyndon

249

Par exemple, pour u = (0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0), une factorisation de Lyndon est (0, 1), (0, 1), (0, 0, 1, 1), (0, 0, 1), (0), (0) On construit une factorisation de Lyndon dun mot u = (u1 , . . . , un ) comme suit. On part de la squence u(1) , u(2) , . . . , u(n) o` u(i) = (ui ) pour i = 1, . . . , n. e u Si u(1) , u(2) , . . . , u(p) est une squence construite et sil existe un indice k (1 k < p) tel e que u(k) u(k+1) , on construit une nouvelle squence v (1) , v (2) , . . . , v (p1) par v (j) = u(j) e pour j = 1, . . . , k 1, v (k) = u(k) u(k+1) , et v (j) = u(j+1) pour j = k + 1, . . . , p 1. On it`re ce processus tant quil est possible de raccourcir la squence. La squence nale e e e est une factorisation de Lyndon. 8. Ecrire une procdure qui calcule une factorisation de Lyndon dun mot par ce e procd. e e Exemple numrique : (1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1). e 9. Dmontrer que tout mot poss`de une unique factorisation de Lyndon. e e

9.3.2

Solution : mots de Lyndon

La dnition de lordre lexicographique stend sans dicult a tout alphabet A toe e e ` talement ordonn. Lordre lexicographique nest rien dautre que lordre dans lequel on e rencontre les mots dans un dictionnaire. On lappelle aussi lordre alphabtique. e Il est commode, pour les dmonstrations, dintroduire la dnition suivante : un mot u e e est fortement infrieur a un mot v, relation note u e ` e v, sil existe un entier k tel que ui = vi pour i = 1, . . . , k 1 et uk < vk . On a donc u v si u est un dbut de v ou e si u v. Notons que si u v, alors quels que soient les mots x, y, on a ux vy. Si u v, alors wu wv pour tout mot w. Proposition 9.3.1. Lordre lexicographique est un ordre total. Preuve. Soient u et v deux mots distincts et montrons que u v ou v u. Ceci est clair si u est un dbut de v ou si v est un dbut de u. Sinon, il existe un indice k tel que e e uk = vk et ui = vi pour i = 1, . . . , k 1. Mais alors u v ou v u, selon que uk < vk ou vk < uk . Pour ltude des mots de Lyndon, le lemme suivant est tr`s utile. e e Lemme 9.3.2. Soit u un mot. Sil existe un mot qui est a la fois un dbut et une n ` e de u, alors u nest pas un mot de Lyndon. Preuve. Supposons que v soit a la fois un dbut et une n de u. Alors il existe deux ` e mots w et w , de mme longueur, tels que e u = vw = w v Version 15 janvier 2005

250

Chapitre 9. Combinatoire des mots

Si w w, alors vw vw = u et, si w w , on a w w , donc wv w v = u. Dans les deux cas, on a trouv un conjugu de u qui est infrieur ou gal a u. Donc u nest e e e e ` pas de Lyndon. On obtient alors la caractrisation suivante des mots de Lyndon. e Proposition 9.3.3. Un mot u est un mot de Lyndon si et seulement sil est strictement plus petit que toutes ses ns dans lordre lexicographique. Preuve. Soit h une n de u. Alors u = vh pour un mot v. Supposons dabord que u soit un mot de Lyndon. Alors u prcdent, h nest pas un dbut de u. Donc u h. e e e Rciproquement, si u h, alors comme h e que u est plus petit que ses conjugus. e hv, on a u hv et, par le lemme

hv par transitivit, montrant e

Proposition 9.3.4. Soit u un mot de Lyndon qui nest pas une lettre; il existe alors deux mots de Lyndon f et g, avec f g, tels que u = f g. Notons que de mani`re gnrale, si f et g sont deux mots de Lyndon tels que f g est un e e e mot de Lyndon, alors f f g g en vertu de la proposition prcdente. e e Preuve. Soit g la n de u de longueur maximale qui est un mot de Lyndon. Un tel mot existe puisque la derni`re lettre de u est un mot de Lyndon. Posons u = f g. On a e f f g g parce que f g est un mot de Lyndon. Il reste a dmontrer que f est un mot ` e de Lyndon. Soit r une n de f . Puisque rg nest pas un mot de Lyndon, il existe une n s de rg telle que s rg. Le mot r nest pas un dbut de s. Sinon, en posant s = rt, e on aurait t g. Or t est une n de g et, comme g est un mot de Lyndon, g t. Ceci montre que s r. Comme f g est un mot de Lyndon et que s est une n de rg et donc de f g, on a f g donc f fg s r ce qui montre que f est un mot de Lyndon. Observons que la factorisation de u en deux mots de Lyndon f et g nest pas unique. Par exemple, le mot u = (0, 0, 1, 0, 1, 0, 1, 1) se factorise de quatre faons : la premi`re est c e (0, 0, 1, 0, 1, 0, 1), (1), la deuxi`me (0, 0, 1, 0, 1), (0, 1, 1), la troisi`me (0, 0, 1), (0, 1, 0, 1, 1) e e et enn la quatri`me (0), (0, 1, 0, 1, 0, 1, 1). La factorisation particuli`re donne dans la e e e preuve de la proposition, qui sobtient en choisissant comme deuxi`me facteur le plus e long mot de Lyndon qui est une n, sappelle la factorisation standard. Proposition 9.3.5. Soient f et g deux mots de Lyndon tels que f un mot de Lyndon. g. Alors f g est s,

Preuve. Soit u = f g. Nous allons dmontrer que u est plus petit que toutes ses ns. e Version 15 janvier 2005

9.3. Mots de Lyndon Notons dabord que f g g. Ceci est clair si f nest pas un dbut de g, parce que f e donc f g, do` f g g. Si f est un dbut de g, alors g = f w pour un mot w et g u e parce que g est un mot de Lyndon. Mais alors f g f w = g.

251 g, w

Soit maintenant h une n de u. Si h est une n de g, alors u g h. Le cas h = g a t trait. Si h = h g, o` h est une n de f , alors f h et mme f ee e u e h parce que h est plus court que f , donc f g h h. Soit u = (u1 , . . . , un ) un mot. Une factorisation de Lyndon du mot u est une squence e u(1) , u(2) , . . . , u(p) de mots de Lyndon telle que u = u(1) u(2) u(p) et u(1) u(2) u(p)

Par exemple, pour u = (0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0), une factorisation de Lyndon est (0, 1), (0, 1), (0, 0, 1, 1), (0, 0, 1), (0), (0) On construit une factorisation de Lyndon dun mot u = (u1 , . . . , un ) comme suit. On part de la squence u(1) , u(2) , . . . , u(n) o` u(i) = (ui ) pour i = 1, . . . , n. e u Si u(1) , u(2) , . . . , u(p) est une squence construite et sil existe un indice k (1 k < p) tel e que u(k) u(k+1) , on construit une nouvelle squence v (1) , v (2) , . . . , v (p1) par v (j) = u(j) e pour j = 1, . . . , k 1, v (k) = u(k) u(k+1) , et v (j) = u(j+1) pour j = k + 1, . . . , p 1. On it`re ce processus tant quil est possible de raccourcir la squence. La squence nale e e e est une factorisation de Lyndon. Proposition 9.3.6. Tout mot poss`de une unique factorisation de Lyndon. e Preuve. Lexistence de la factorisation de Lyndon est vidente. Lunicit se prouve par e e labsurde. Soit en eet u un mot de longueur minimale ayant deux factorisations de Lyndon distinctes (u1 , . . . , un ) et (v1 , . . . , vm ) Si n = 1 et m 2, alors v1 u1 vm et v1 vm , une contradiction. Si n, m 2, supposons que u1 est plus long que v1 , sinon u2 un = v2 vm est un mot plus court que u ayant deux factorisations distinctes. Alors u1 = v 1 v k ou u1 = v1 vk w

pour un entier k et pour un dbut w de vk+1 . Dans le premier cas, on a comme ci-dessus e v1 u1 vk et, dans le deuxi`me cas, v1 u1 w vk+1 . e

9.3.3

Programme : mots de Lyndon

Nous commenons par une procdure qui compare deux mots pour lordre lexicograc e phique, en utilisant la dnition. Cette procdure scrit : e e e Version 15 janvier 2005

252

Chapitre 9. Combinatoire des mots

FUNCTION CompareMot (VAR u, v: mot): integer; Compare u et v dans lordre lexicographique. Le rsultat est 1, 0, 1, selon que lon a e u v, u = v ou u v. VAR i, n: integer; BEGIN n := min(Longueur(u), Longueur(v)); i := 1; WHILE (i <= n) AND (u[i] = v[i]) DO i := i + 1; IF i <= n THEN Fortement infrieur. e CompareMot := signe(u[i] - v[i]) ELSE Prxe. e CompareMot := signe(Longueur(u) - Longueur(v)) END; { de "CompareMot" }

On en dduit immdiatement une procdure qui teste si un mot est infrieur a un e e e e ` deuxi`me : e
FUNCTION EstInferieurMot (VAR u, v: mot): boolean; Vrai si et seulement si u v. BEGIN EstInferieurMot := CompareMot(u, v) = -1 END; { de "EstInferieurMot" }

Il y a deux faons simples de tester si un mot u est un mot de Lyndon (on verra plus c loin un algorithme plus compliqu, mais linaire en fonction de la longueur du mot, e e pour calculer la factorisation de Lyndon, donc aussi pour tester si un mot est un mot de Lyndon). On peut calculer tous les conjugus de u et vrier que u est plus petit que e e ces mots. Ce test se ralise comme suit : e
FUNCTION EstLyndonParConjugue (u: mot): boolean; Teste, en calculant les conjugus de u, si u est un mot de Lyndon. e VAR i, n: integer; v: mot; inferieur: boolean; BEGIN n := Longueur(u); i := 1; inferieur := true; WHILE (i < n) AND inferieur DO BEGIN LeConjugue(u, i, v); inferieur := EstInferieurMot(u, v); i := i + 1 END; EstLyndonParConjugue := inferieur END; { de "EstLyndonParConjugue" }

Dans cette procdure, inferieur reste vrai tant que lon na pas trouv de conjugu e e e infrieur au mot donn. Une deuxi`me mani`re de raliser le test est de comparer le mot e e e e e donn a toutes ses ns. On obtient alors la procdure suivante : e` e Version 15 janvier 2005

9.3. Mots de Lyndon


FUNCTION EstLyndonParSuffixe (u: mot): boolean; Teste si u est un mot de Lyndon en le comparant a toutes ses ns. ` VAR i, n: integer; v: mot; inferieur: boolean; BEGIN n := Longueur(u); i := 2; inferieur := true; WHILE (i <= n) AND inferieur DO BEGIN LeSuffixe(u, i, v); inferieur := EstInferieurMot(u, v); i := i + 1 END; EstLyndonParSuffixe := inferieur END; { de "EstLyndonParSuffixe" }

253

Lcriture dune procdure qui engendre tous les mots de Lyndon est un peu plus come e plique. Lide de dpart est que tout mot de Lyndon de longueur au moins 2 sobtient e e e comme produit de mots plus courts. Mais plusieurs produits peuvent donner le mme e mot de Lyndon et il faut donc vrier quun mot nest pas dj` construit avant de e ea linsrer dans la liste. La procdure suivante calcule la table des mots de Lyndon : e e
PROCEDURE EngendrerLyndon (nn: integer; VAR lyn: TableSuite; VAR l: TailleSuite); Calcul des mots de Lyndon de longueur au plus nn. VAR n, k: integer; BEGIN LettreEnMot(lyn[1][1], 0); Les deux mots de Lyndon de LettreEnMot(lyn[1][2], 1); longueur 1 : 0 et 1. l[1] := 2; FOR n := 2 TO nn DO BEGIN l[n] := 0; FOR k := 1 TO n - 1 DO ComposerLyndon(lyn[k], lyn[n - k], lyn[n], l[k], l[n - k], l[n]) END; END; { de "EngendrerLyndon" }

Rappelons dabord les dnitions de types, qui sont les mmes que pour les mots de e e Lukasiewicz :
CONST LongueurSuiteMot = 10; LongueurTable = 6; TYPE SuiteMot = ARRAY[1..LongueurSuiteMot] OF mot; TableSuite = ARRAY[0..LongueurTable] OF SuiteMot; TailleSuite = ARRAY[0..LongueurTable] OF integer;

Version 15 janvier 2005

254

Chapitre 9. Combinatoire des mots

o` lentier dindice n du tableau de type TailleSuite contient le nombre dlments u ee dans la n-i`me suite de mots. Les mots de Lyndon de longueur n sobtiennent par e concatnation de mots de longueur k et de mots de longueur n k, avec 1 k n 1. e Voici la procdure de composition : e
PROCEDURE ComposerLyndon (VAR a, b, c: SuiteMot; VAR la, lb, m: integer); VAR i, j: integer; u: mot; BEGIN FOR i := 1 TO la DO FOR j := 1 TO lb DO IF EstInferieurMot(a[i], b[j]) THEN BEGIN Concatener(a[i], b[j], u); u est un mot de Lyndon. InsererMot(u, c, m) On lajoute a la liste. ` END END; { de "ComposerLyndon" }

Notons que lon compose deux mots ai et bj seulement si ai bj . Dtaillons linsertion e du mot u obtenu dans la liste c des mots dj` construits. Les mots de la liste c sont ea rangs en ordre croissant. Pour insrer u, on parcourt la liste a la recherche du premier e e ` lment de c qui est suprieur ou gal a u. Si un tel mot nexiste pas, u est ajout en ee e e ` e n de liste. Dans le cas contraire, on vrie sil nest pas gal a u, car dans ce cas, le e e ` mot u ne doit pas tre ajout une deuxi`me fois a la liste. Sinon, u est insr a sa place, e e e ` e e` en dcalant tous les lments qui lui sont plus grands. Voici comment cet algorithme e ee dinsertion scrit : e
PROCEDURE InsererMot (VAR u: mot; VAR c: SuiteMot; VAR m: integer); Insertion dun mot u dans une suite trie c. e VAR j, k: integer; BEGIN k := 1; WHILE (k <= m) AND EstInferieurMot(c[k], u) DO { AND squentiel } e k := k + 1; On avance tant que ck u. IF k = m + 1 THEN BEGIN Si la n de c est atteinte, m := m + 1; on ins`re u a la n ; e ` c[m] := u END si ck = u, on ne fait rien ; ELSE IF EstInferieurMot(u, c[k]) THEN BEGIN FOR j := m DOWNTO k DO sinon, on dcale la n de c, e c[j + 1] := c[j]; c[k] := u; puis on ins`re u. e m := m + 1 END END; { de "InsererMot" }

En utilisant ces procdures, on obtient les rsultats numriques suivants : e e e Version 15 janvier 2005

9.3. Mots de Lyndon


Mots de Lyndon : n = 1 l[1] = 2 0 1 n = 2 l[2] = 1 01 n = 3 l[3] = 2 001 011 n = 4 l[4] = 3 0001 0011 0111 n = 5 l[5] = 6 00001 00011 00101 00111 01011 01111 n = 6 l[6] = 9 000001 000011 000101 000111 001011 001101 001111 010111 011111

255

Le calcul dune factorisation de Lyndon par lalgorithme expos dans la section prce e e dente se ralise tr`s simplement. La procdure est : e e e
PROCEDURE FactorisationLyndon (u: mot; VAR f: Suitemot; VAR m: integer); VAR n, i: integer; BEGIN m := Longueur(u); FOR i := 1 TO m DO Factorisation initiale. LettreEnMot(f[i], u[i]); REPEAT n := m; n = ancienne longueur. CompacterFactorisationLyndon(f, m); m = nouvelle longueur. UNTIL m = n; Test darrt. e END; { de "FactorisationLyndon" }

A chaque tape, on tente de compacter la factorisation obtenue. Lorsquon ne peut plus e la raccourcir, la longueur de la factorisation reste inchange. Ceci fournit le test darrt. e e Version 15 janvier 2005

256 On compacte une factorisation comme suit :

Chapitre 9. Combinatoire des mots

PROCEDURE CompacterFactorisationLyndon (VAR f: Suitemot; VAR m: integer); Partant dune factorisation (f1 , . . . , fm ), on cherche i tel que fi fi+1 et, sil existe, on rend (f1 , . . . , fi fi+1 , . . . , fm ). VAR i, j: integer; BEGIN i := 1; WHILE (i <= m - 1) AND NOT EstInferieurMot(f[i], f[i + 1]) DO i := i + 1; IF i < m THEN BEGIN Maintenant fi fi+1 . Concatener(f[i], f[i + 1], f[i]); FOR j := i + 1 TO m - 1 DO La suite est raccourcie. f[j] := f[j + 1]; m := m - 1; END; END; { de "CompacterFactorisationLyndon" }

Voici un exemple dtaill dexcution : e e e


Mot donn : e 0101001100100

Factorisation de longueur 12 01 0 1 0 0 1 1 0 0 1 0 0 Factorisation de longueur 11 01 01 0 0 1 1 0 0 1 0 0 Factorisation de longueur 10 01 01 0 01 1 0 0 1 0 0 Factorisation de longueur 9 01 01 001 1 0 0 1 0 0 Factorisation de longueur 8 01 01 0011 0 0 1 0 0 Factorisation de longueur 7 01 01 0011 0 01 0 0 Factorisation de longueur 6 01 01 0011 001 0 0 Factorisation de Lyndon 01 01 0011 001 0 0

Pour terminer cette section, nous prsentons un algorithme, d a J.-P. Duval, qui calcule e u` la factorisation de Lyndon en temps linaire en fonction de la longueur du mot donn. e e On appelle factorisation de Duval dun mot x non vide une factorisation (x) = ( 1 , . . . ,
q , v)

et un entier p = p(x) tels que x = 1 q v et 0 p < q, et vriant les deux conditions : e (1) 1 , . . . , q sont des mots de Lyndon et v est un prxe propre (ventuellement e e vide) de q ; Version 15 janvier 2005

9.3. Mots de Lyndon (2) si p 1, alors


1

257
p p+1

= ... =

et

p+1

q v.

Exemple. Si x est rduit a une seule lettre, (x) = (x, ). Pour x = 0100100100, on a e ` (x) = (01, 001, 001, 00) et p = 1. Lemme 9.3.7. Tout mot non vide admet au plus une factorisation de Duval. Preuve. Soit (x) = ( 1 , . . . ,
p , p+1 , . . . , q , v)

et p = p(x). Si v est le mot vide, la suite

( 1, . . . ,

p , p+1 , . . . , q )

est la factorisation de Lyndon de x, donc unique. Sinon, soit (v1 , . . . , vn ) la factorisation de Lyndon de v. Alors ( 1, . . . ,
p , p+1 , . . . , q , v1 , . . . , vn )

est la factorisation de Lyndon de x, parce que v1

q.

Do` lunicit. u e

Proposition 9.3.8. Tout mot non vide poss`de une factorisation de Duval. e Preuve. La preuve que voici est en fait un algorithme pour construire la factorisation de Duval dun mot. Soit x un mot non vide et a une lettre, et soit (x) = ( 1 , . . . ,
p , p+1 , . . . , q , v)

la factorisation de Duval de x, et p = p(x). Quatre cas se prsentent : e Si va est prxe propre de e


q,

alors
p , p+1 , . . . , q , va)

(xa) = ( 1 , . . . ,

et p(xa) = p. En eet, cette factorisation vrie les deux conditions ci-dessus. e Si


q

= va, alors p(xa) = p et (xa) = ( 1 , . . . ,


p , p+1 , . . . , q , va, )

Si

va, alors p(xa) = p, et (xa) = ( 1 , . . . ,


p , p+1

q va, )

est une factorisation de Duval. En eet, dapr`s le lemme dmontr plus loin, le mot e e e va est un mot de Lyndon, do` lon dduit que u e q
p+1

q va

qp va q p

est lui aussi un mot de Lyndon. Donc la condition (1) est vrie. Ensuite, on a e e qp qp va parce que p v, donc (2) est galement vrie. e e e q q

Version 15 janvier 2005

258 Reste enn le cas o` u


q

Chapitre 9. Combinatoire des mots va. Soit (va) = ( 1 , . . . ,


p

p +1 , . . . , q

,v )

la factorisation de Duval de va qui existe par rcurrence, avec p = p(va). Alors (xa) e est la concatnation des deux factorisations : e (xa) = ( 1 , . . . ,
p , p+1 , . . . , q , 1 , . . . , p

p +1 , . . . , q

,v )

et p(xa) = p . En eet, la condition (1) est vrie pour cette factorisation parce quelle e e lest pour la factorisation de va. Quant a la condition (2), le seul cas a examiner est ` ` celui o` p = 0. On doit avoir q u e 1 q v = va, ce qui est vrai par hypoth`se. Pour achever la preuve, il reste a dmontrer le lemme suivant. ` e Lemme 9.3.9. Soit u un mot de Lyndon, soit v un prxe propre de u et soit a une e lettre. Si u va, alors va est un mot de Lyndon. Preuve. Le mot u se factorise en u = vbw, avec b une lettre et b a. Soit ha une n de va et posons v = gh. Montrons que va ha. Si h est un prxe de v, alors v se factorise en v = hch pour une lettre c et un mot h . e Le mot hbwg est un conjugu de u = hch bw et, comme u est un mot de Lyndon, on a e c b. Mais alors c a, donc va = hch a ha. Si h nest pas prxe de v, il y a deux possibilits : soit v e e h, alors videmment e va ha; soit h v. Or, ce cas ne peut pas se prsenter, car en eet h e v entra ne hwg vw = u, ce qui est impossible parce que hwg est un conjugu de u. e Corollaire 9.3.10. Soit (x) = ( 1 , . . . , p , p+1 , . . . , q , v) la factorisation de Duval dun mot non vide x. Si v est le mot vide, la factorisation de Lyndon de x est ( 1 , . . . , p , p+1 , . . . , q ), sinon elle est la concatnation de cette factorisation et de la e factorisation de Lyndon de v. Cette observation conduit donc naturellement a lalgorithme suivant : calculer dabord ` une factorisation de Duval du mot donn. Si le dernier facteur est le mot vide, la face torisation, prive du dernier facteur, est une factorisation de Lyndon. Sinon, tous les e facteurs sauf le dernier font partie de la factorisation de Lyndon et on it`re le procd e e e sur le dernier facteur. Cet algorithme scrit comme suit : e
PROCEDURE FactorisationLyndonParDuval (w: mot; VAR f: Suitemot; VAR l: integer); BEGIN f[1] := w; l := 1; REPEAT FactorisationDuval(f[l], f, l) UNTIL EstMotVide(f[l]);

Version 15 janvier 2005

9.3. Mots de Lyndon


l := l - 1 Car le dernier facteur est le mot vide. END; { de "FactorisationLyndonParDuval" }

259

Les facteurs de la factorisation sont ajouts au fur et a mesure au tableau f . La longueur e ` de la factorisation est l. Lcriture de la procdure de factorisation de Duval est plus e e dlicate, car il y a plusieurs indices a grer. e ` e
PROCEDURE FactorisationDuval (w: mot; VAR f: Suitemot; VAR l: integer); Calcule, dans (f , f +1 , . . .), la factorisation de Duval du mot w. Avec les notations du texte, les variables i, j, k et d ont la signication suivante : d est la longueur de q , wi est la premi`re lettre de p+1 , e wj est la premi`re lettre de v, e k est lindice de la premi`re lettre a examiner. e ` VAR i, j, k, d, m: integer; PROCEDURE CopierFacteurs; Copie les facteurs VAR r: integer; BEGIN r := i; WHILE r + d <= j DO BEGIN LeFacteur(w, r, r + d - 1, f[l]); r := r + d; l := l + 1 END; END; { de "CopierFacteurs" }
p+1 , . . . , q

dans f .

BEGIN { de "FactorisationDuval" } m := Longueur(w); i := 1; j := 2; k := j; d := 1; Factorisation de la premi`re lettre. e WHILE (k <= m) DO BEGIN CASE signe(w[i + k - j] - w[k]) OF -1: BEGIN Nouveau facteur par concatnation. e k := k + 1; j := k; d := k - i END; 0: BEGIN Prolongation. k := k + 1; IF k - j = d THEN j := k END; 1: BEGIN Factorisation de v. CopierFacteurs; i := j; j := j + 1; k := j; d := 1 END END; { case } END; { while } CopierFacteurs; Copie des facteurs en attente. LeFacteur(w, j, m, f[l]); END; { de "FactorisationDuval" }

Version 15 janvier 2005

260

Chapitre 9. Combinatoire des mots

Voici un exemple dtaill dexcution de la procdure : e e e e


w = 0 0 1 0 2 0 0 1 0 2 0 0 0 1 0 0 1 0 0 0 0 |0: |0 0: |0 0 1: |0 0 1:0 |0 0 1 0 |0 0 1 0 |0 0 1 0 |0 0 1 0 |0 0 1 0 |0 0 1 0 |0 0 1 0 |0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0

2: 2:0 2:0 2:0 2:0 2 0 2 0 2 0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0 2;0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2: 2:0 2:0 0 2|0: 2|0 0: 2|0 0 0: 2|0 0 0 1: 2|0 0 0 1:0 2|0 0 0 1:0 2|0 0 0 1 0 2|0 0 0 1 0 2|0 0 0 1 0 2|0 0 0 1 0 2;0 0 0 1 0 2;0 0 0 1 0 2;0 0 0 1 0 2;0 0 0 1 0

0 0 0 0 0 0 0 0 0

1: 1:0 1:0 0 1:0 0 0 1|0: 1|0 0: 1|0 0 0: 1|0 0 0 0:

Les barres verticales indiquent la position de la variable i; les facteurs a gauche de ` la barre ( 1 , . . . , p dans nos notations) sont spars par des points-virgules; les autres e e facteurs ( p+1 . . . , q ) sont a droite de la barre verticale et stendent jusqu` la position ` e a de j, repre par le signe deux-points. La factorisation de Duval est : e e
0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 2 2 0

Elle co ncide ici avec la factorisation de Lyndon. Il nous reste a estimer le temps dexcution de lalgorithme, en fonction de la longueur ` e m du mot w a factoriser. Commenons par la factorisation de Duval. A tout moment, le ` c triplet dentiers (i, j, k) de la procdure vrie les ingalits i < j k. Chaque tour dans e e e e Version 15 janvier 2005

9.4. Suite de Thue-Morse la boucle WHILE remplace le triplet (i, j, k) (i, k, k + 1) (i, j, k + 1) (i , j , k ) = (i, k + 1, k + 1) (j, j + 1, j + 1)

261 par un nouveau triplet (i , j , k ), a savoir ` si si si si wi+kj wk wi+kj = wk et k + 1 j = d wi+kj = wk et k + 1 j = d wk wi+kj

De plus, lorsque la derni`re situation se produit, on a k j < d. Il en rsulte que e e i + k > i + k. En eet, cette ingalit est vidente dans les trois premiers cas et, dans le e e e dernier, on a i + k < i + d + j i + j < i + k . Comme k m, la valeur de i + k nexc`de e jamais 2m, et le nombre de tours dans lalgorithme est donc major par 2m. Mise a part e ` la recopie de facteurs, le temps dexcution de chaque tour de boucle est constant. Le e total des recopies ne dpasse pas la longueur du mot, puisque tout facteur nest recopi e e quune seule fois. Le temps dexcution dun appel de la procdure de factorisation de e e Duval est donc linaire en fonction de la longueur m du mot. Notons ce temps (m). e Si la factorisation de Lyndon nest pas acheve, la factorisation de Duval retourne un e suxe non vide v du mot w restant a factoriser. Or ce suxe est un prxe du dernier ` e facteur de la factorisation dj` obtenue, donc en particulier sa longueur est au plus m/2. ea Il en rsulte que le cot total de la factorisation de Lyndon par lalgorithme de Duval e u est major par (m) + (m/2) + (m/4) + . Si (m) cm, ce nombre est donc major e e par 2cm.

9.4
9.4.1

Suite de Thue-Morse
Enonc : suite de Thue-Morse e
sn = (1)b(n)

On consid`re la suite s = (sn )n0 dnie par e e

o`, pour tout entier n 0, u b(n) =

i=0

bi (n)

les bi (n) tant dnis par le dveloppement binaire de n : e e e n=


i=0

bi (n)2i

bi (n) {0, 1}

1. Dmontrer que s2n = sn , s2n+1 = sn et crire une procdure qui calcule sn pour e e e 0 n N (on pourra prendre N = 100). Une suite (t0 , . . . , tk1 ) est un facteur de longueur k de s sil existe n tel que ti = sn+i pour0 i k 1 () Version 15 janvier 2005

Les premiers termes de s sont : 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, . . .

262

Chapitre 9. Combinatoire des mots

On se propose de calculer les facteurs de s. Le plus petit entier n 0 tel que () soit vrie est not R(t0 , . . . , tk1 ). On pose e e e r(k) = max R(t0 , . . . , tk1 ) o` le maximum porte sur tous les facteurs (t0 , . . . , tk1 ) de longueur k de s et F (k) = u k + r(k). Par exemple, la suite s poss`de les 6 facteurs e (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1), (1, 1, 1) de longueur 3 et on a F (3) = 8. On admettra dans les questions 2 et 3 que F (1) = 2, F (2) = 7 et que F (k) 2F (1 + [k/2]) k3 ()

(On note [x] la partie enti`re de x). Soit P (k) le nombre de facteurs de longueur k de la e suite s. On a P (1) = 2, P (2) = 4, P (3) = 6. On admettra dans les questions 2 et 3 que P (2k) = P (k + 1) + P (k) P (2k + 1) = 2P (k + 1) ( )

2. Dmontrer que F (k) 8(k 2) pour k 3 et que P (k) 4(k 1) pour k 2. e 3. Le poids dune suite (t0 , . . . , tk1 ) est par dnition lentier i=0 ti 3i . Utiliser les e rsultats de la question prcdente pour crire un programme qui prend en argument e e e e un entier k, qui calcule, une fois et une seule, tous les facteurs de s de longueur k, et qui les ache par ordre de poids croissant. On testera avec k = 3, 4, 5. 4. Dmontrer () et ( ). e On se xe un entier N > 0 et on consid`re SN = (s0 , . . . , sN ). Une occurrence dune e suite nie (t0 , . . . , tk1 ) comme sous-mot dans SN est une suite dindices (n0 , . . . , nk1 ), avec 0 n0 < n1 < < nk1 N telle que ti = sni pour i = 0, . . . , k 1. 5. Ecrire une procdure qui prend en donne une suite (t0 , . . . , tk1 ) et qui calcule le e e nombre doccurrences de cette suite comme sous-mot dans SN . On testera avec N = 12, k = 4 et (t0 , . . . , tk1 ) = (1, 1, 1, 1). 6. (Question indpendante des prcdentes.) Prouver que le produit e e e
n=0 k1

2n + 1 2n + 2

sn

converge (sa limite est 1/ 2). Version 15 janvier 2005

9.4. Suite de Thue-Morse

263

9.4.2

Solution : suite de Thue-Morse

On consid`re la suite de Thue-Morse s = (sn )n0 dnie par e e sn = (1)b(n) avec b(n) =
i=0

bi (n)

les bi (n) tant dnis par le dveloppement binaire de n : e e e n=


i=0

bi (n)2i

bi (n) {0, 1}

Une suite nie t = (t0 , . . . , tk1 ) est un facteur de longueur k de s sil existe n tel que ti = sn+i pour0 i k 1 (4.1)

Tout entier n pour lequel (4.1) est vri est un dbut doccurrence de t. Nous come e e menons par quelques lemmes simples. c Lemme 9.4.1. Pour tout n 0, on a s2n = sn et s2n+1 = sn . Preuve. Clairement, b(2n) = b(n) et b(2n + 1) = 1 + b(n), do` les formules. u Il en rsulte en particulier que (s2n , s2n+2 , . . . , s2n+2k ) = (sn , sn+1 , . . . , sn+k ) et que e lapplication (sn , . . . , sn+k1 ) (s2n , . . . , s2(n+k)1 ) est une bijection de lensemble des facteurs de longueur k sur lensemble des facteurs de longueur 2k qui ont un dbut doccurrence pair. e Lemme 9.4.2. Aucun des quatre mots (1, 1, 1), (1, 1, 1), (1, 1, 1, 1, 1), (1, 1, 1, 1, 1) nest facteur de s. Preuve. Supposons, en raisonnant par labsurde, que sn = sn+1 = sn+2 pour un entier n. Si n est pair, alors par le lemme prcdent sn = sn+1 . De mme, si n est impair, e e e alors sn+1 = sn+2 . Ceci exclut les deux premiers facteurs. Considrons ensuite, en e raisonnant par labsurde, un dbut doccurrence n de (1, 1, 1, 1, 1) dans la suite de e Thue-Morse. Si n est pair, n = 2m, alors sm = sm+1 = sm+2 = 1 par le lemme prcdent; si n est impair, n = 2m + 1, alors, a nouveau par le lemme, sm = sm+1 = e e ` sm+2 = 1. Les deux cas sont impossibles. Soit t = (t0 , . . . , tk1 ) un facteur de s. Le plus petit dbut doccurrence de t dans s est e not R(t). On pose e r(k) = max R(t) Version 15 janvier 2005

264

Chapitre 9. Combinatoire des mots

o` le maximum porte sur tous les facteurs t de longueur k de s et on pose F (k) = u k + r(k). La connaissance, ou au moins une majoration de F (k) permet de calculer tous les facteurs de longueur k de s, puisque chaque facteur appara dans la suite nie t (s0 , . . . , sF (k)1 ). Le lemme suivant est utile. Lemme 9.4.3. Soit t un facteur de la suite de Thue-Morse, de longueur au moins 4. Si n et m sont deux dbuts doccurrence de t, alors n m (mod2). e

Preuve. Supposons le contraire. Alors il existe n pair et m impair tels que sn+i = sm+i pour i = 0, 1, 2, 3. On a sn = sn+1 et sn+2 = sn+3 , parce que n est pair. De mme, e sm = sm1 et sm+2 = sm1 , parce que m est impair. En combinant ces galits, on e e obtient sm1 = sm = sm+1 = sm+2 = sm+3 ce qui contredit le lemme prcdent. e e Proposition 9.4.4. Pour k 2, on a r(2k) = r(2k + 1) = 1 + 2r(k + 1).

Preuve. Clairement, la fonction r est croissante au sens large. Soit k 2 et soit u = (sm , . . . , sm+k ) un facteur de longueur k + 1, avec m = R(u) = r(k + 1). Le mot t = (s2m+1 , . . . , s2m+2k ) est un facteur de longueur 2k. On a R(t) = 2m + 1. En eet, sinon on aurait R(t) = 2n + 1 pour un entier n < m, car t na que des dbuts doccurrence impairs. Or, la e suite (sn , . . . , sn+k ) est gale a u, et donc R(u) n contrairement a lhypoth`se. Par e ` ` e consquent, r(2k + 1) r(2k) R(t) = 1 + 2r(k + 1). e Rciproquement, soit t = (sn , . . . , sn+2k ) un facteur de longueur 2k + 1 tel que n = e R(t) = r(2k + 1). Si n est pair et n = 2m, alors u = (sn , sn+2 , . . . , sn+2k ) est un facteur de s de longueur k + 1, et R(u) = m. Si n = 2m + 1 est impair, alors s2m = sn et u = (sn1 , sn+1 , . . . , sn+2k1 ) est facteur de longueur k + 1, avec R(u) = m. Dans les deux cas, n = r(2k + 1) 2m + 1 2r(k + 1) + 1.

Preuve. Les deux premi`res valeurs sobtiennent par inspection. Comme F (3) = 8, la e formule est vraie pour k = 3. Ensuite, on a r(k) = 1 + 2r(1 + [k/2]) pour k 4, donc F (k) = 1 + k + 2r(1 + [k/2]) 2(1 + [k/2] + r(1 + [k/2])) = F (1 + [k/2]). Enn, la derni`re ingalit est vraie pour k = 3 et, par rcurrence, on obtient e e e e F (k) 2F (1 + [k/2]) 2 8([k/2] 1) = 8(2[k/2] 2) 8(k 2) On peut en fait obtenir une expression close pour r(k). On vrie en eet facilement a e ` partir de la relation de rcurrence que, pour n 0, e r(k) = 3 2n+1 1 Version 15 janvier 2005 (2n + 2 k 2n+1 + 1)

Corollaire 9.4.5. On a F (1) = 2, F (2) = 7 et F (k) 2F (1 + [k/2]) pour k 3. En particulier, F (k) 8(k 2) pour k 3.

9.4. Suite de Thue-Morse

265

Soit P (k) le nombre de facteurs de longueur k de la suite s. On a P (1) = 2, P (2) = 4, et comme les mots (1, 1, 1) et (1, 1, 1) ne sont pas facteurs, on a P (3) = 6. Proposition 9.4.6. Pour tout k 2, on a P (2k) = P (k + 1) + P (k) P (2k + 1) = 2P (k + 1) Preuve. Lapplication (sn , . . . , sn+k ) (s2n , . . . , s2(n+k)1 ) est une bijection de lensemble des facteurs de longueur k + 1 sur lensemble des facteurs de longueur 2k dont le dbut doccurrence est pair, et lapplication e (sn , . . . , sn+k ) (s2n+1 , . . . , s2(n+k) ) est une bijection de lensemble des facteurs de longueur k + 1 sur lensemble des facteurs de longueur 2k dont le dbut doccurrence est impair. Ceci prouve la premi`re formule. e e De mme, lapplication e (sn , . . . , sn+k ) (s2n , . . . , s2(n+k) ) est une bijection des facteurs de longueur k + 1 sur les facteurs de longueur 2k + 1 dont le dbut doccurrence est pair, et e (sn , . . . , sn+k ) (s2n+1 , . . . , s2(n+k)1 ) est une bijection des facteurs de longueur k + 1 sur les facteurs de longueur 2k + 1 dont le dbut doccurrence est impair. Do` la deuxi`me formule. e u e Les formules de rcurrence de la proposition donnent galement une formule close pour e e P (k). Nous nous contentons de la majoration qui suit. Corollaire 9.4.7. On a P (1) = 2, et P (k) 4P (k 1) pour k 2. Preuve. Lingalit est immdiate pour k = 2, 3. Pour k 4, lingalit rsulte de la e e e e e e proposition. Proposition 9.4.8. On a
n=0

2n + 1 2n + 2

sn

1 = 2

Preuve. Posons P =
n=0

2n + 1 2n + 2

sn

Q=

n=1

2n 2n + 1

sn

R=

n=1

n n+1

sn

Version 15 janvier 2005

266

Chapitre 9. Combinatoire des mots

Prouvons que le premier produit converge (pour les autres, le raisonnement est le mme) e en appliquant la r`gle dAbel a la srie des logarithmes : la suite de terme gnral e ` e e e n | m=0 sm | ne prend que les deux valeurs 0 ou 1, et la suite des ln 2n+1 tend vers 0 de 2n+2 faon monotone. Donc la srie c e 2n + 1 sn ln 2n + 2 n=0 converge. Ensuite, on a PQ = Par ailleurs, R=
n=1 sn sn

1 2 n=1

2n + 1 2n 2n + 2 2n + 1

1 2 n=1

n n+1

= R/2

2n 2n + 1 2n 2n + 1

s2n n=0 sn n=0

2n + 1 2n + 2 2n + 1 2n + 2

s2n+1

n=1

sn

Q P

Il en rsulte que P 2 = 1/2. e

9.4.3

Programme : suite de Thue-Morse

On calcule les premiers termes de la suite de Thue-Morse par les formules du lemme 9.4.1. Dans les procdures qui suivent, on utilise la biblioth`que de manipulation des e e mots introduits au dbut de ce chapitre. Pour disposer dun dbut assez long de la suite e e de Thue-Morse, il est utile dintroduire un type spcique qui permet de ranger des e mots longs. On crira donc : e
CONST GrandeLongueur = 255; TYPE motlong = ARRAY[0..GrandeLongueur] OF integer; VAR s: motlong; Le dbut du mot de Thue-Morse. e

La procdure de calcul est : e


PROCEDURE ThueMorse (VAR s: motlong); VAR n: integer; BEGIN s[0] := 1; FOR n := 0 TO GrandeLongueur DIV 2 DO BEGIN s[2 * n] := s[n];

Version 15 janvier 2005

9.4. Suite de Thue-Morse


s[2 * n + 1] := -s[n] END END; { de "ThueMorse" }

267

Voici le rsultat. Pour plus de lisibilit, on crit le signe plus a la place de 1 et un point e e e ` a la place de 1 : `
Suite de Thue-Morse : +..+.++..++.+..+.++.+..++..+.++..++.+..++..+.++.+..+.++..++.+..+ .++.+..++..+.++.+..+.++..++.+..++..+.++..++.+..+.++.+..++..+.++. .++.+..++..+.++.+..+.++..++.+..++..+.++..++.+..+.++.+..++..+.++. +..+.++..++.+..+.++.+..++..+.++..++.+..++..+.++.+..+.++..++.+..+

Dsormais, le dbut de la suite de Thue-Morse est suppos calcul et disponible dans le e e e e tableau s. Extraire un facteur de la suite se fait tr`s simplement : e
PROCEDURE LeFacteurTM (VAR t: mot; k, n: integer); Dtermine t = (sn , . . . , sn+k1 ). e VAR i: integer; BEGIN FOR i := 1 TO k DO t[i] := s[n + i - 1]; FixerLongueur(t, k) END; { de "LeFacteurTM" }

Pour tablir une liste des facteurs de longueur k de la suite de Thue-Morse, on extrait e successivement les facteurs dont le dbut doccurrence varie entre 0 et r(k). Puis, chaque e facteur est insr, sil ny gure pas dj`, dans une liste de mots, rangs par poids e e ea e croissant. Il nest pas dicile de voir que cet ordre est loppos de lordre lexicographique e sur les images miroirs (les mots lus de la droite vers la gauche). On pourrait donc utiliser la procdure dinsertion labore pour les mots de Lyndon. Nous prfrons crire une e e e ee e procdure spcique qui utilise le poids comme crit`re de comparaison. Commenons e e e c par le calcul du poids :
FUNCTION Poids (VAR t: mot): integer; Calcul du poids dun mot t par le schma de Horner. e VAR i, p: integer; BEGIN p := 0; FOR i := Longueur(t) DOWNTO 1 DO p := 3 * p + t[i]; Poids := p END; { de "Poids" }

On peut ne pas calculer r(k) explicitement, mais utiliser une majoration, telle que nous lavons tablie prcdemment. Le calcul explicite de r(k) se fait de mani`re naturelle en e e e e traduisant les relations de rcurrence de la proposition 9.4.4 en une procdure rcursive : e e e Version 15 janvier 2005

268
FUNCTION r (k: integer): integer; BEGIN IF k = 1 THEN r := 1 ELSE IF k <= 3 THEN r := 5 ELSE r := 1 + 2 * r(1 + k DIV 2) END; { de "r" }

Chapitre 9. Combinatoire des mots

Cette procdure peut bien entendu scrire aussi de mani`re itrative, mais nous pre e e e e frons plutt donner une valuation de la formule close : e o e
FUNCTION r (k: integer): integer; VAR DeuxPuissanceN: integer; BEGIN IF k = 1 THEN r := 1 ELSE IF k <= 3 THEN r := 5 ELSE BEGIN DeuxPuissanceN := 2; WHILE DeuxPuissanceN + 2 <= k DO DeuxPuissanceN := 2 * DeuxPuissanceN; r := 3 * DeuxPuissanceN - 1 END END; { de "r" }

Voici le calcul des facteurs de longueur k :


PROCEDURE LesFacteursTM (k: integer; VAR a: SuiteMot; VAR l: integer); Calcule, dans a, les facteurs de longueur k de la suite de Thue-Morse. VAR n: integer; t: mot; pa: suite; BEGIN l := 0; FOR n := 0 TO r(k) DO BEGIN LeFacteurTM(t, k, n); InsererMotParPoids(t, poids(t), a, pa, l) END; END; { de "LesFacteursTM" }

Linsertion est ralise par la procdure ci-dessous, inspire de la procdure InsererMot. e e e e e Le poids de chaque mot nest calcul quune seule fois, pour rendre les comparaisons e plus rapides. Les poids sont rangs dans un tableau de type Suite dni au chapitre e e prcdent (nous avons ici augment la longueur maximale dune suite) : e e e
CONST LongueurSuite = 48; TYPE

Version 15 janvier 2005

9.4. Suite de Thue-Morse


suite = ARRAY[0..LongueurSuite] OF integer;

269

La majoration du nombre de facteurs dmontre plus haut dit quelle valeur choisir en e e fonction de la longueur des facteurs que lon veut calculer (ici 8).
PROCEDURE InsererMotParPoids (VAR t: mot; p: integer; VAR c: SuiteMot; VAR pc: suite; VAR m: integer); Insertion dun mot t de poids p dans une suite c de mots de poids croissants. Lentier pck contient le poids du mot ck . VAR j, k: integer; BEGIN k := 1; WHILE (k <= m) AND (p < pc[k]) DO k := k + 1; On avance tant que poids(ck ) < p. IF k = m + 1 THEN BEGIN Si la n de c est atteinte, m := m + 1; on ins`re t a la n ; e ` c[m] := t; pc[m] := p END ELSE IF p <> pc[k] THEN BEGIN si ck = t, on ne fait rien ; FOR j := m DOWNTO k DO sinon, on dcale la n de c, e BEGIN c[j + 1] := c[j]; pc[j + 1] := pc[j] END; c[k] := t; pc[k] := p; puis on ins`re u. e m := m + 1 END END; { de "InsererMotParPoids" }

On obtient les rsultats numriques suivants : e e


Facteurs de longueur 1 -1 Facteurs de longueur 1 1 -1 1 1 -1 -1 -1 Facteurs de longueur -1 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 Facteurs de longueur 1 -1 1 1 1

Version 15 janvier 2005

270
-1 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 ... Facteurs de longueur 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1

Chapitre 9. Combinatoire des mots

8 1 1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

Nous terminons par le calcul du nombre doccurrences dun mot t donn comme sous-mot e dans le prxe SN = (s0 , . . . , sN 1 ) de la suite de Thue-Morse. Si t est de longueur k, il e sagit dengendrer les parties de {0, . . . , N 1} a k lments et de vrier si les valeurs de ` ee e la suite SN pour ces indices co ncident avec les lments du mot t. Nous utilisons donc ee les procdures PremierePartieRestreinte et PartieSuivanteRestreinte du chapitre e prcdent pour engendrer les sous-ensembles a k lments. Dans la procdure suivante, e e ` ee e x reprsente une partie a k lments de {1, . . . , n}. e ` ee
FUNCTION EstSousMotTM (t: mot; n, k: integer; x: suite): boolean; Teste si t est sous-mot de (s0 , . . . , sn1 ) aux positions donnes par le sous-ensemble x e de {1, . . . , n}. VAR p, j: integer; coincide: boolean;

Version 15 janvier 2005

9.4. Suite de Thue-Morse


BEGIN p := 0; j := 1; coincide := true; WHILE (j <= k) AND coincide DO BEGIN REPEAT p := p + 1 UNTIL x[p] = 1; coincide := (s[p - 1] = t[j]); j := j + 1 END; EstSousMotTM := coincide END; { de "EstSousMotTM" }

271

On utilise cette procdure pour compter le nombre doccurrences comme suit : e


PROCEDURE OccurrencesSousMotTM (t: mot; n: integer; VAR NombreOccurrences: integer); VAR k: integer; x: Suite; derniere: boolean; BEGIN NombreOccurrences := 0; k := Longueur(t); PremierePartieRestreinte(x, n, k); REPEAT IF EstSousMotTM(t, n, k, x) THEN NombreOccurrences := NombreOccurrences + 1; PartieSuivanteRestreinte(x, n, k, derniere) UNTIL derniere END; { de "OccurrencesSousMotTM" }

Voici un exemple de rsultat : e


Mot t = 1 -1 -1 1 N = 7 Occurrences : 1111000 1110010 1100110 1010110 1110001 1100101 1010101 Le mot a 7 occurrences

Le mme mot a 37 occurrences comme sous-mot dans S12 . e Version 15 janvier 2005

272

Chapitre 9. Combinatoire des mots

Notes bibliographiques
Une rfrence gnrale pour la combinatoire des mots est : ee e e M. Lothaire, Combinatorics on Words, Reading, Addison-Wesley, 1983. Les mots de Lukasiewicz sont larchtype des notations prxes ou polonaises . Elles e e e permettent dcrire les expressions (et notamment les expressions arithmtiques) sans e e parenth`ses, tout en respectant la priorit des oprateurs. Les mots de Lyndon ont e e e t introduits par Lyndon sous le nom de standard lexicographic sequences. Les mots ee de Lyndon sur lensemble A donnent en fait une base de lalg`bre de Lie libre sur A. e Lalgorithme de Duval est dans : J.-P. Duval, Factorizing words over an ordered alphabet, J. Algorithms 4 (1983), p. 363 381. J.-P. Duval a aussi donn un algorithme ecace pour engendrer les mots de Lyndon de e longueur borne en ordre lexicographique. e La suite de Thue-Morse a t tudie en dtail par A. Thue et par M. Morse qui ont noe ee e e tamment tabli lessentiel des rsultats prsents ici. Cette suite a de nombreuses autres e e e e proprits; le fait quelle est sans cube, cest-`-dire ne contient pas trois occurrences ee a conscutives du mme facteur, a t exploit dans la preuve, par Adjan et Novikov, de e e ee e lexistence de groupes contredisant la conjecture de Burnside. Elle est lun des premiers exemples cits en thorie ergodique. Parmi ses dnitions quivalentes, mentionnons la e e e e possibilit de lengendrer par itration dun morphisme : on remplace 1 par (1, 1) et 1 e e par (1, 1), et on recommence sur chaque terme de la suite. La suite de Thue-Morse est invariante pour cette substitution. On peut galement la reconna par un automate e tre ni. Enn, elle peut tre dnie comme srie algbrique sur le corps a deux lments. e e e e ` ee Cette suite et de nombreuses autres de nature semblable sont regroupes sous le terme e de suites automatiques. Voir larticle de synth`se de : e J.-P. Allouche, Automates nis en thorie des nombres, Expo. Math. 5 (1987), p. 239 e 266.

Version 15 janvier 2005

Partie IV

Gomtrie e e

273

275

Chapitre 10

Gomtrie algorithmique e e
La gomtrie algorithmique est une branche rcente de linformatique thorique qui e e e e a pour objet la rsolution ecace des probl`mes gomtriques rencontrs, par exeme e e e e ple, en CAO (conception assiste par ordinateur), en robotique ou encore en synth`se e e dimage. Ces probl`mes se situent, en gnral, en basse dimension et portent sur les e e e objets lmentaires de la gomtrie : points, polygones, cercles, etc. ee e e Citons, a titre dexemple, le probl`me du dmnageur de piano : comment dplacer un ` e e e e objet (le piano ) dans un environnement form dobstacles, dune position a une autre e ` en vitant toute collision avec les obstacles? e

Figure 10.0.1: Le probl`me du dmnageur de piano. e e e La rsolution de ce type de probl`mes fait appel a tout un arsenal dalgorithmes varis, e e ` e pour eectuer des oprations de recherche et de tri, pour coder des arrangements e dobjets gomtriques, pour calculer des objets gomtriques associs a dautres objets e e e e e ` Version 15 janvier 2005

276

Chapitre 10. Gomtrie algorithmique e e

gomtriques, et ceci avec la contrainte deectuer les oprations de mani`re ecace. e e e e Quentend-on par ecacit ? e Considrons le probl`me suivant. Etant donns 10 points du plan, calculer les points e e e extrmes, cest-`-dire les points qui se situent sur leur enveloppe convexe. Une solution e a est de trier angulairement autour de chaque point P les autres points; si lun des angles entre deux directions conscutives est suprieur a 180 alors P est un point extrme. e e ` e Rien de plus simple! Mais que se passe-t-il sil y a 10 000 points au lieu de 10? Le tri de n nombres ncessitant de lordre de n log2 n oprations lmentaires (i.e. comparaisons de e e ee deux nombres), et ce tri devant tre eectu autour de chaque point, lensemble du calcul e e ncessite plus de 100 millions doprations pour n = 10 000 points. En fait, une analyse e e plus ne de la gomtrie du probl`me permet de trouver un algorithme, pratiquement e e e aussi simple, ne ncessitant que de lordre de n log2 n oprations. Lensemble du calcul e e peut alors tre eectu en quelques secondes sur un ordinateur. De mani`re gnrale e e e e e nous dirons quun algorithme a une complexit en O(f (n)) sil ne requiert pas plus de e cf (n) oprations lmentaires (comparaison, addition, multiplication) pour traiter des e ee donnes de taille n, pour une certaine constante c. On peut montrer que le tri de n e nombres a pour complexit O(n log2 n). e Dans ce chapitre, nous tudions trois structures de base de la gomtrie algorithe e e mique : lenveloppe convexe dune famille nie de points, la triangulation de Delaunay dune famille nie de points et la triangulation dun polygone simple. Laccent est mis sur les aspects gomtriques et combinatoires : quivalence entre poly`dres convexes e e e e borns et enveloppes convexes, dualit entre triangulation de Delaunay et diagramme e e de Vorono coloriage dune triangulation dun polygone simple. Les aspects algorith, miques, deuxi`me acte de la pi`ce gomtrie algorithmique, sont galement abords; e e e e e e en labsence, au niveau o` nous nous plaons, doutils algorithmiques adquats nous u c e nous bornons aux algorithmes les plus simples; ce ne sont pas toujours les plus rapides.

10.1

Poly`dres et enveloppes convexes e

Soit E un espace ane rel euclidien de dimension d. e Une partie C de E est dite convexe si pour tout x, y C, le segment [x, y] = {x + (1 )y | [0, 1]} est inclus dans C. La dimension dun convexe non vide est, par dnition, la dimension du sous-espace ane engendr par ce convexe. Les convexes de e e dimension 0 sont les points; ceux de dimension 1 sont les droites, les demi-droites et les segments. La dimension dun convexe caractrise la vacuit de son intrieur : un convexe e e e C E est dintrieur non vide si et seulement si sa dimension est celle de lespace E. e Rappelons enn que lintrieur relatif dune partie X de E est, par dnition, lintrieur e e e de X dans lespace ane engendr par X. e Comme exemples de convexes citons : les sous-espaces anes (en particulier les points, les droites, les hyperplans); les boules ouvertes ou fermes; les demi-espaces, cest-`-dire, e a les composantes connexes du complmentaire dun hyperplan; enn on vrie aisment e e e que la famille des convexes est stable par intersection (nie ou non). Cette derni`re e Version 15 janvier 2005

10.1. Poly`dres et enveloppes convexes e

277

proprit permet de dnir deux classes importantes et naturelles de convexes : les ee e poly`dres et les enveloppes. e On appelle poly`dre convexe toute intersection dun nombre ni de demi-espaces ferms. e e Les plus cl`bres dentre eux, en dimension trois, sont les cinq poly`dres rguliers de ee e e Platon : le cube, le ttra`dre rgulier, locta`dre, le dodca`dre et licosa`dre. e e e e e e e

Figure 10.1.1: Le cube, le ttra`dre et locta`dre. e e e On appelle enveloppe convexe dune partie X E, et on note E(X), le plus petit convexe (pour la relation dinclusion) de E contenant X ; on vrie aisment que E(X) est e e lensemble des barycentres des parties nies de points de X aects de masses positives : e E(X) = x x | x 0, x = 1, X partie nie de X
xX

(1.1)

xX

Lenveloppe convexe de k + 1 points anement indpendants est appele un simplexe e e de dimension k. Les points, les segments, les triangles, les ttra`dres sont les simplexes e e de dimensions respectives 0, 1, 2 et 3. En fait il y a identit entre les poly`dres convexes borns et les enveloppes convexes e e e des parties nies. La dmonstration de ce rsultat, qui peut para vident pour les e e tre e dimensions 2 et 3, nest pas triviale. Elle ncessite ltude de la structure des poly`dres e e e convexes (quest-ce quune face?) et lintroduction de la notion de polaire dun convexe. Nous commenons par la structure des poly`dres. c e De toute criture dun poly`dre convexe P comme intersection nie de demi-espaces e e ferms R on peut extraire, en supprimant tour a tour les demi-espaces superus, une e ` criture minimale e
n

P =
i=1

Ri

(1.2)

cest-`-dire telle que P est un sous-ensemble strict de j=i Rj pour tout i = 1, . . . , n. a Lexemple du segment dans le plan (voir la gure 10.1.2) montre que cette criture nest e en gnral pas unique; cependant cest le cas si le poly`dre P est dintrieur non vide. e e e e

Version 15 janvier 2005

278

Chapitre 10. Gomtrie algorithmique e e

() a

() b

Figure 10.1.2: Lcriture minimale nest pas toujours unique. e Thor`me 10.1.1. Soit P un poly`dre convexe de E dintrieur non vide et soit F e e e e lensemble des demi-espaces R, contenant P , dont la fronti`re intersecte P selon un e convexe de codimension 1. Alors (i) F est ni; (ii) si R F alors Fr(R) P est un poly`dre convexe dintrieur non vide dans e e Fr(P ), not FaceR P ; e e (iii) P = F R est lunique criture minimale de P ; (iv) Fr(P ) = F FaceR P. Preuve. Soit P = i=1 Ri une criture minimale de P ; on note Hi lhyperplan fronti`re e e de Ri . Nous montrons que Ri F. La seule dicult est de prouver que Hi P est e dintrieur non vide dans Hi . Soit a un point de lintrieur de P et posons P = j=i Rj . e e Lcriture tant minimale, P \ P est non vide; soit x un point de P \ P et soit {y} = e e ]a, x[ Hi ; le segment ]a, x[ tant inclus dans lintrieur de P , il en est de mme de y ; e e e donc Hi P = Hi P est dintrieur non vide dans Hi . e Inversement soit R F de fronti`re H ; par hypoth`se, H intersecte la fronti`re de P e e e selon un convexe de codimension 1; cette fronti`re tant incluse dans lunion nie des e e Hi , H co ncide avec lun des Hi et R = Ri . Pour dmontrer le dernier point on crit e e Fr(P ) = P E \ P = P =
RF n

RF

E\R (Fr(R) P )

E\RP F aceR P

=
RF

=
RF

Ceci termine la dmonstration du thor`me. e e e Les ensembles de la forme FaceR (P ) sont appels les facettes de P (cts en dimension e oe deux). Comme ces ensembles sont eux-mmes des poly`dres convexes, de dimension e e Version 15 janvier 2005

10.1. Poly`dres et enveloppes convexes e

279

(d 1), on peut parler de leurs facettes, qui sont alors des poly`dres de dimension e (d 2), et ainsi de suite. Plus gnralement, pour k = 0, . . . , d 1, les k-faces de P sont e e les facettes dune k + 1-face de P o`, au dpart de la rcurrence, les (d 1)-faces sont u e e les facettes de P . Les k-faces sont des poly`dres convexes de dimension k ; en particulier e les 0-faces sont appeles les sommets de P et les 1-faces sont appeles les artes de P . e e e Il est utile dintroduire lensemble vide comme tant la (1)-face de P . Dans la suite le e terme de face, dun poly`dre convexe P , dsigne lune quelconque de ses k-faces. Il est e e clair que les faces dun poly`dre sont en nombre ni. e Soit P = n Ri lcriture minimale de P et soit Hi lhyperplan fronti`re de Ri . Dapr`s e e e i=1 le thor`me 10.1.1, les (d k)-faces de P sont des intersections de la forme e e Hi 1 H i k P (1.3) de codimension k (plus prcisemment Hi1 Hij P est de codimension j pour e j = 1, . . . , k). Il faut prendre garde quune telle criture nest en gnral pas unique. Le e e e thor`me suivant prcise ce point. e e e e Thor`me 10.1.2. Soient P un poly`dre convexe de dimension d et F R son criture e e e minimale. Soit F une face de P et soit F1 F lensemble des demi-espaces de F dont les fronti`res sont les hyperplans supports des (d 1)-faces de P qui contiennent F . e Posons F1 = F1 Fr(R). Alors (i) F = F1 P et F1 est lespace ane engendr par F ; e (ii) (iii) pour tout point x de P , si lenveloppe convexe de {x} F et F ont mme e dimension, alors x appartient a F . ` F = F1
F \F1

R , o` F dsigne lintrieur relatif de F ; u e e

Preuve. Lassertion (i) est consquence de lcriture (1.3) pour toute face de P . Soit R e e un demi-espace de F \ F1 ; R ne contenant pas F1 , lintrieur relatif de F1 R co e ncide avec la trace sur F1 de son intrieur : e F1 R = F 1 R Il vient alors F =
RF \F1

F1 R =

RF \F1

De F = F1 P , on dduit que lappartenance de x a F est quivalente a son appartee ` e ` nance a F1 ; or les dimensions de F1 et E(F1 {x}) = E(F {x}) co ` ncident si et seulement si x appartient a F1 . ` Proposition 10.1.3. Soit P un poly`dre convexe et soient F, G deux faces de P . Alors e soit F est une face de G (ou G est une face de F ), soit F G est une face de F et de G. Version 15 janvier 2005

F1 R = F 1

RF \F1

280

Chapitre 10. Gomtrie algorithmique e e

Proposition 10.1.4. Soit P un poly`dre convexe et soit R un demi-espace contenant e P . Alors Fr(R) P est une face de P . Preuve des propositions. Nous cartons le cas trivial o` F G = . Du thor`me e u e e 10.1.2 assertion (ii) on dduit que e (1) soit F G, et dans ce cas F = F G Fr(G); (2) soit G F , et dans ce cas G = F G Fr(F ); (3) soit F G Fr(F ) Fr(G). Supposons, sans perte de gnralit, que F G Fr F ; pour x F G soit Hx la face e e e de F de dimension maximale contenant x dans son intrieur relatif; alors Hx F G e (sinon Hx serait scant a lun des hyperplans support des (d 1)-faces contenant F G) e ` et F G= Hx
x

Le nombre de faces de F tant ni, la runion ci-dessus est nie. Par suite, lun des Hx e e a la mme dimension que F G (un convexe de dimension k ne peut tre runion nie e e e de convexes de dimension strictement infrieure); mais en vertu de lassertion (iii) du e thor`me 10.1.2 tout point de F G est un point de Hx donc F G = Hx . e e

La dmonstration de la seconde proposition utilise le mme argument. Soit C = Fr(R) e e P et pour x C soit Hx la face de dimension maximale contenant x dans son intrieur e e e relatif; de P R on dduit que Hx C et C = x Hx ; la dmonstration se compl`te e alors comme prcdemment. e e

Deux faces sont dites incidentes si lune est incluse dans lautre et si leurs dimensions di`rent dune unit. Deux (k + 1)-faces sont dites adjacentes si leur intersection est une e e k-face. Proposition 10.1.5. Une (d 2)-face est incidente a exactement deux (d 1)-faces ` de P . Preuve. Si une (d 2)-face est incidente aux (d 1)-faces dnies par trois hyperplans e Hi1 , Hi2 et Hi3 alors ces hyperplans ont pour intersection commune un espace ane de dimension d 2; soit o un point de lintrieur du poly`dre et soient les vecteurs uj pour e e j = 1, 2, 3 tels que Rij = {x E | j 1} ox.u e e De Hi1 Hi2 = Hi1 Hi3 on dduit lexistence de deux rels , de somme 1 tels que u1 = u2 + u3 ; quitte a permuter les hyperplans on peut supposer que ces deux rels ` e 1 sont positifs (en eet si est ngatif alors u2 = u1 + u3 avec 1/ et / positifs), e par suite Ri2 Ri3 Ri1 ce qui condredit la minimalit de lcriture de P . e e En particulier un ct dun poly`dre convexe de dimension deux nayant quun ou deux oe e sommets incidents, selon quil est ou non born, admet un ou deux cts adjacents. La e oe fronti`re dun convexe tant connexe on obtient la caractrisation compl`te de la relation e e e e dincidence entre cts dun poly`dre convexe en dimension 2 sous la forme suivante. oe e Version 15 janvier 2005

10.1. Poly`dres et enveloppes convexes e

281

Proposition 10.1.6. Les cts E1 , . . . , En dun poly`dre convexe de dimension deux oe e forment une cha de cts adjacents cest-`-dire que, a une permutation pr`s, E i et ne oe a ` e Ei+1 sont adjacents pour i = 1, . . . , n 1 avec En et E1 adjacents si le poly`dre est e born, et En et E1 sont les deux cts innis si le poly`dre est non born. e oe e e La caractrisation de la relation dincidence entre faces pour les poly`dres de dimension e e 3 est un probl`me nettement plus dicile. Seul le cas de la dimension trois est e enti`rement rsolu. e e Nous introduisons maintenant la notion densemble polaire. Soient o E et A E ; le sous-ensemble polaire de A (par rapport a o) est ` A = {y E | 1 pour tout x A} oy.ox (1.4)

On vrie facilement que A est un ferm convexe (cest une intersection de demi-espaces e e ferms), que si A B alors B A et enn que A A . Lopration est en fait une e e bonne dualit sur lensemble des convexes compacts dintrieur contenant le point o. e e Proposition 10.1.7. Soit C un convexe ferm born contenant le point o dans son e e intrieur. Alors e (i) C est un convexe ferm born dont lintrieur contient o; e e e (ii) C = C. Preuve. La boule ouverte de centre o et de rayon r est note B(o, r). De B(o, r 1 ) C e B(o, r2 ) et de B(o, r) = B(o, 1/r) on dduit que e B(o, 1/r2 ) C B(o, 1/r1 ) Il reste a montrer que C C ; soit a C et soit H un hyperplan qui spare a et C ` e (par exemple lhyperplan mdiateur de a et du point de C le plus proche de a). Le point e o nappartenant pas a H, il existe h E tel que ` H = {x E | oh = 1} ox. De plus oh > 1 tandis que, pour tout x C, on a oh < 1; par suite h C et oa. ox. a C . Nous pouvons maintenant dmontrer lidentit des poly`dres convexes borns et des e e e e enveloppes convexes de parties nies de E. Thor`me 10.1.8. Un poly`dre convexe born est lenveloppe convexe de ses some e e e mets. Rciproquement lenveloppe convexe dun ensemble ni de points est un poly`dre e e convexe born dont les sommets sont des points de cet ensemble. e Preuve. Pour dmontrer le premier point on raisonne par rcurrence sur la dimension e e du poly`dre P ; si x Fr(P ) alors x appartient a lune des faces de P qui co e ` ncide, par hypoth`se de rcurrence, avec lenveloppe convexe de ses sommets; si x P , soit e e

Version 15 janvier 2005

282

Chapitre 10. Gomtrie algorithmique e e

une droite passant par x; intersecte P selon un segment [x1 , x2 ] o` les xi , tant des u e points de la fronti`re de P , appartiennent a lenveloppe convexe des sommets de P ; de e ` x [x1 , x2 ] on dduit alors lappartenance de x a lenveloppe convexe des sommets de e ` P. Inversement soit C = E({x1 , . . . , xn }) lenveloppe convexe dune partie nie. Il est clair que C est un convexe ferm born que nous supposons, sans perte de gnralit, de e e e e e dimension d. Dapr`s la proposition 10.1.7, C est un convexe ferm born dintrieur e e e e non vide; or par dnition C est lintersection des n demi-espaces {x E | i 1}; e ox.ox cest donc un poly`dre convexe born de E. Dapr`s la premi`re partie du thor`me, C e e e e e e est lenveloppe convexe dun ensemble ni de points do`, en appliquant le raisonnement u prcdent a C et en utilisant encore la proposition 10.1.7, C = C est un poly`dre e e ` e convexe born. e En particulier un simplexe de dimension d est un poly`dre convexe. On vrie sans peine e e d+1 que le nombre de ses k-faces est k+1 . Comment calculer eectivement lenveloppe convexe dun ensemble ni S de n points? Et quelle est la complexit en nombre doprations lmentaires dun tel calcul? Supe e ee posons, pour simplier la discussion, que les points sont en position gnrale cest-`-dire e e a que d + 1 points quelconques de S sont anement indpendants. Dans ce cas le sime plexe engendr par d points quelconques s1 , . . . , sd de S est une (d 1)-face de E(S) si e et seulement si les autres points de S se situent tous dans le mme demi-espace dont la e fronti`re est lhyperplan engendr par ce simplexe : e e dt(1 , . . . , d ) est de signe constant. e ss ss (1.5)

Une premi`re solution au calcul de lenveloppe convexe est de tester les n simplexes e d possibles. Une mesure vidente de la complexit dun tel calcul est le nombre de dtere e e minants calculs : chaque test ncessite le calcul dau plus n dterminants; le nombre e e e total de calcul est alors n n = O(nd+1 ), pour d constant. Cette mthode est-elle e d ecace? La rponse est non, car on peut montrer que le nombre de (d 1)-faces de e lenveloppe convexe de n points est, sous lhypoth`se d constant, dans O(n d/2 ). e Une seconde solution est de calculer les faces par ordre dadjacence. Pour cela nous avons besoin de dnir les angles di`dres dun poly`dre. e e e Par dnition langle (non orient) de deux demi-droites vectorielles d, d est le rel dans e e e [0, ], not d, d , dni comme la valeur commune de e e Arccos v u u v

o` u et v sont des vecteurs non nuls quelconques de d et d . On note aussi u, v = d, d . u Etant donnes trois demi-droites d, d et d , on dit que d est entre d et d si d = d = d e ou si d = d , ou si d = d et d se situe dans lintersection des demi-plans de fronti`re e respectives d d et d d contenant respectivement d et d. On a alors la relation dadditivit : e d, d = d, d + d , d (1.6) Version 15 janvier 2005

10.1. Poly`dres et enveloppes convexes e

283

Soient F et F deux (d 1)-faces adjacentes dun poly`dre P de dimension d et soit A e leur intersection. Les hyperplans de F et F dterminent deux vecteurs unitaires u, v e bien dnis par la condition que u soit orthogonal a F et du mme ct de F que F , e ` e oe et de mme pour v. Par dnition langle di`dre de P en A est langle u, v. e e e

! u

! u

F A

F0

Figure 10.1.3: Angle di`dre de deux faces. e Proposition 10.1.9. Soient F et F deux (d 1)-faces adjacentes dun poly`dre e convexe P de dimension d et soit A leur intersection. Soit x un point de P \ F et Fx = E(F {x}) le cne de sommet x et de base F . Alors langle di`dre de P en A est o e infrieur a langle di`dre de Fx en A. e ` e Preuve. Soit F la face de Fx adjacente a F en A et soit w le vecteur unitaire orthogonal ` a F et du mme ct de F que F . Le vecteur v se situe entre u et w do` le rsultat. ` e oe u e Dapr`s cette proposition le calcul dune face adjacente a une face donne F en la (d2)e ` e face A peut se faire en cherchant le point x S qui minimise langle di`dre du cne Fx e o en A. La complexit en nombre dangles di`dres calculs est alors dans O(nh) o` h est e e e u le nombre de (d 1)-faces de E(S). Le nombre de (d 1)-faces tant dans O(n d/2 ), la e complexit du calcul est dans O(n d/2 +1 ), sous rserve davoir dtermin une premi`re e e e e e face pour amorcer le calcul. Comment calculer une premi`re face? Rapportons lespace e E a un rep`re (O, 1 , . . . , d ) et appelons H lhyperplan (O, 1 , . . . , d1 ). En vertu de la ` e proposition 10.1.4, le point s1 dont la coordonne en d est minimale, est un sommet e de E(S); puis larte [s1 , s2 ] qui minimise langle du vecteur s1 s avec sa projection sur e lhyperplan H est une arte de E(S); quitte a eectuer une rotation, nous pouvons e ` maintenant supposer que larte [s1 , s2 ] se situe dans lhyperplan H ; le triangle s1 s2 s3 e qui minimise langle du plan s1 s2 s avec sa projection sur lhyperplan H est alors une 2-face de E(S); etc. Le nombre dangles calculs dans cette procdure est de lordre de e e dn. La complexit du calcul reste donc dans O(n d/2 +1 ). Par exemple en dimension 2 e et 3 cet algorithme a une complexit en O(n2 ) alors que la premi`re solution propose e e e conduit a des complexits en O(n3 ) et O(n4 ). Nous sommes cependant encore loin ` e davoir obtenu les algorithmes les plus ecaces. En fait, en dimension deux et trois, il Version 15 janvier 2005

284

Chapitre 10. Gomtrie algorithmique e e

existe des algorithmes de complexit O(n log 2 n) pour calculer lenveloppe convexe de n e points. Tel est le cas, en dimension deux, de lalgorithme de Graham que nous dcrivons e maintenant. Lenveloppe convexe de S = {s1 , . . . , sn }, ensemble ni de n points, est un polygone convexe quil est utile dcrire sous la forme e E(S) = [u1 , . . . , ul ] (1.7)

o` les ui sont les sommets de lenveloppe et o` les [ui , ui+1 ] sont les cts de lenveloppe; u u oe sans perte de gnralit nous supposons que le polygone est parcouru dans le sens positif e e e cest-`-dire que pour tout i (les indices sont calculs modulo l) a e (ui , ui+1 , ui+2 ) = +1 o` (p, q, r) est la fonction a valeur dans {1, 0, +1} dnie comme le signe du dteru ` e e u minant des vecteurs o` p, q, r E : pq, pr (p, q, r) = signe (dt( e pq, pr)) (1.8)

sj1

sj0

Figure 10.1.4: Les deux tangentes issues de s. La proposition suivante fait le lien entre lenveloppe convexe de S et celle de lensemble obtenu en adjoignant a S un point s. ` Proposition 10.1.10. Soit [u1 , . . . , ul ] lenveloppe convexe dun ensemble ni S et soit s un point nappartenant pas a E(S). Soit (j) le signe du dterminant des vecteurs ` e j et j+1 : su su (j) = (s, uj , uj+1 ) Alors il existe j0 et j1 tels que (i) (j0 ) = (j0 + 1) = = (j1 1) = +1; (ii) (j1 ) = (j1 + 1) = = (j0 1) = 1. De plus on a E(S {s}) = [uj0 , . . . , uj1 , s] Version 15 janvier 2005

10.1. Poly`dres et enveloppes convexes e

285

Preuve. Les points uj0 et uj1 sont les points dappui des deux tangentes au convexe E(S) issues du point s (voir la gure 10.1.4) Lide gnrale de lalgorithme de Graham est de calculer successivement les enveloppes e e e convexes des ensembles S1 , S2 , S3 , . . . , Sn o` S1 = {s1 } et o` Si+1 est obtenu a partir u u ` de Si en lui ajoutant le point si+1 . Pour dterminer de mani`re ecace les valeurs des e e

Figure 10.1.5: La premi`re phase. e indices j0 et j1 de la proposition prcdente, dans une premi`re phase de lalgorithme, e e e nous trions les points si de telle sorte que le point s1 soit le point dabscisse minimale et que les autres points soient tris angulairement autour du point s1 : e (s1 , si , sj ) = +1 (1.9)

pour tout 2 i < j n. La deuxi`me phase de lalgorithme consiste a calculer E(S i+1 ) e ` a partir de E(Si ) pour i variant de 3 a n. ` `

Figure 10.1.6: La deuxi`me phase. e Les observations suivantes permettent deectuer lensemble de ce calcul avec une complexit en O(n). Posons e E(Si ) = [u1 , . . . , ul ] Version 15 janvier 2005

286

Chapitre 10. Gomtrie algorithmique e e

o` u1 est le point dabscisse minimale de Si . Dans ce cas il est clair que : u (1) E(S3 ) = [s1 , s2 , s3 ]; (2) u1 = s1 , u2 = s2 et ul = si . Dautre part de (s1 , s2 , si+1 ) = +1 et (si , s1 , si+1 ) = (s1 , si , si+1 ) = 1 on dduit, e en vertu de la proposition prcdente, que e e E(Si+1 ) = [u1 , . . . , uk , si+1 ] (1.10)

o` k est dni comme le plus grand indice j tel que (si+1 , uj1 , uj ) = +1. u e Enn, et cest l` le point cl de lanalyse, le calcul de k peut se faire en valuant, a e e successivement, les (si+1 , uj1 , uj ) pour j = l, l 1, . . . , k, soit en eectuant l k + 1 = (Si ) (Si+1 ) + 2 calculs de la fonction , o` (X) est le nombre de sommets de u lenveloppe convexe de X. La complexit du calcul de la seconde phase est donc e
n1 i=3

( (Si ) (Si+1 ) + 2) = 2n 3 (Sn ) 2n

Lalgorithme de Graham montre que, modulo un tri, la complexit du calcul de lenvee loppe convexe de n points dans le plan est linaire cest-`-dire en O(n). e a

10.2

Quelques primitives gomtriques e e

Une application gomtrique ne se programme pas tout a fait comme une application e e ` numrique, et ceci pour deux raisons. La premi`re rside dans le fait que le raisonnement e e e gomtrique se place dans un espace ane rel, et donc que les coordonnes des points e e e e sont des nombres rels, alors que limage, sur lcran, est forme de pixels, qui sont e e e reprsents par des entiers. La deuxi`me raison provient de la spcicit des oprations e e e e e e de lecture et criture, qui sont ici des oprations de saisie de points et de trac de points e e e ou de lignes; ces oprations dpendent considrablement du matriel (compatible PC e e e e ou Macintosh). Il est donc naturel dorganiser un programme gomtrique en trois couches. La couche e e la plus basse, dpendante du matriel employ, ralise les oprations de saisie de points, e e e e e de suivi dachage et de trac de lignes. Dans les ralisations exposes plus bas, nous les e e e avons appeles Graphik. La deuxi`me couche, indpendante du matriel, se charge de la e e e e traduction des objets gomtriques rels en objets sur lcran, typiquement la traduction e e e e entre points et pixels. Le nom de cette unit est Geometrie. e La couche la plus externe est le programme gomtrique a proprement parler qui ne e e ` conna plus que des points, des segments, droites et autres objets gomtriques usuels, t e e et se dcharge sur le module Geometrie de toutes les oprations de communication avec e e lcran. e Nos ralisations sont tr`s rudimentaires et ne sont en aucun cas susantes pour une e e programmation plus pousse. Pour les compatibles PC, on pourra utiliser avec prot e dautres interfaces, comme Modulog. Version 15 janvier 2005

10.2. Quelques primitives gomtriques e e

287

Lunit Geometrie met a la disposition des programmes gomtriques les points dun e ` e e plan euclidien ane, muni dun rep`re orthonorm direct, et quelques oprations sur ces e e e objets. On dclare un point comme un couple de nombres rels : e e
TYPE Point = ARRAY[0..1] OF real;

Les procdures ncessaires sont : e e


PROCEDURE InitGeometrie; FUNCTION Abscisse (q: Point): real; FUNCTION Ordonnee (q: Point): real; PROCEDURE FairePoint (x, y: real; VAR q: Point); PROCEDURE SaisirPoint (VAR q: Point); PROCEDURE TracerSegment (p, q: Point); PROCEDURE TracerDemiDroite (p, d: Point); PROCEDURE MarquerPointCarre (p: Point); PROCEDURE MarquerPointRond (p: Point); PROCEDURE NumeroterPoint (p: Point; n: integer);

Les fonctions dacc`s et de construction scrivent bien sr : e e u


FUNCTION Abscisse (q: Point): real; BEGIN Abscisse := q[0] END; { de "Abscisse" } FUNCTION Ordonnee (q: Point): real; BEGIN Ordonnee := q[1] END; { de "Ordonnee" } PROCEDURE FairePoint (x, y: real; VAR q: Point); BEGIN q[0] := x; q[1] := y END; { de "FairePoint" }

La lecture dun point est remplace par une saisie, et lcriture par un dessin. Les e e procdures que voici provoquent lachage dun point : e
PROCEDURE MarquerPointCarre (p: Point); PROCEDURE MarquerPointRond (p: Point); PROCEDURE NumeroterPoint (p: Point; n: integer); Marque le point dun . Marque le point dun . Ajoute n a la marque du point. `

On trace des segments de droites ou des demi-droites qui sont donnes par une origine e et une direction. On peut voir, dans les sections suivantes, le genre de dessins que lon obtient. Ces procdures seront employes pour la saisie de points ou de polygones, et e e pour lachage des rsultats. e La ralisation des procdures de saisie et dachage fait appel a des primitives qui e e ` dpendent du matriel utilis (et disponibles a travers la biblioth`que appele Graphik). e e e ` e e Nous supposons que les objets et les primitives suivantes sont disponibles : Version 15 janvier 2005

288
TYPE Pixel = ARRAY[0..1] OF integer; VAR HauteurEcran: integer; LargeurEcran: integer;

Chapitre 10. Gomtrie algorithmique e e

La hauteur disponible de lcran, mesure en pixels. e e La largeur disponible de lcran, mesure en pixels. e e

PROCEDURE InitGraphik; PROCEDURE TracerCarre (a: Pixel; r: integer); Trace un petit carr de ct 2r centr sur le pixel a. e o e e PROCEDURE TracerDisque (a: Pixel; r: integer); Trace un disque plein de rayon r centr sur le pixel a. e PROCEDURE LireCurseur (VAR curseur: Pixel); Donne dans la variable les coordonnes du point saisi, en pixels. e PROCEDURE RelierPixels (a, b: Pixel); Trace un trait qui relie les pixels a et b. PROCEDURE EcrireGraphique (a: Pixel; n: integer); Ajoute, au dessin, lentier n au pixel a.

Avec ces primitives, les procdures de la biblioth`que Geometrie scrivent facilement. e e e Commenons par : c
PROCEDURE InitGeometrie; BEGIN InitGraphik END; { de "InitGeometrie" }

Puis, les procdures de conversion entre points et pixels : e


PROCEDURE PointEnPixel (p: Point; VAR a: Pixel); BEGIN a[0] := round(Abscisse(p)); a[1] := HauteurEcran - round(Ordonnee(p)) END; { de "PointEnPixel" } PROCEDURE PixelEnPoint (c: Pixel; VAR q: Point); VAR x, y: real; BEGIN x := c[0]; y := HauteurEcran - c[1]; FairePoint(x, y, q) END; { de "PixelEnPoint" }

Les lectures se font par :


PROCEDURE SaisirPoint (VAR q: Point); VAR curseur: Pixel; BEGIN LireCurseur(curseur); PixelEnPoint(curseur, q)

Version 15 janvier 2005

10.2. Quelques primitives gomtriques e e


END; { de "SaisirPoint" }

289

On marque un point par lune des deux procdures que voici : e


PROCEDURE MarquerPointCarre (p: Point); VAR a: Pixel; BEGIN PointEnPixel(p, a); TracerCarre(a, 4); Le choix du nombre 4 est bien sr aaire de got. u u END; { de "MarquerPointCarre" } PROCEDURE MarquerPointRond (p: Point); VAR a: Pixel; BEGIN PointEnPixel(p, a); TracerDisque(a, 4); Idem. END; { de "MarquerPointRond" } PROCEDURE NumeroterPoint (p: Point; n: integer); VAR a: Pixel; BEGIN PointEnPixel(p, a); a[0] := a[0] + 5; Petit dcalage, pour que n ncrase pas le point. e e EcrireGraphique(a, n) END; { de "NumeroterPoint" }

Venons-en au trac de droites. Pour les segments, on utilise : e


PROCEDURE TracerSegment (p, q: Point); VAR a, b: Pixel; BEGIN PointEnPixel(p, a); PointEnPixel(q, b); RelierPixels(a, b); END; { de "TracerSegment" }

Pour tracer une demi-droite dorigine et de direction donnes, on dtermine le point e e dintersection de la demi-droite avec le rectangle dlimitant la partie utilise de lcran, e e e puis on trace le segment obtenu. Ainsi :
PROCEDURE TracerDemiDroite (p, d: Point); p est lorigine, et d est la direction. VAR q: Point; BEGIN Clip(p, d, q); q est lintersection de la demi-droite avec le TracerSegment(p, q)

cadre .

Version 15 janvier 2005

290
END; { de "TracerDemiDroite" }

Chapitre 10. Gomtrie algorithmique e e

La procdure Clip fait le dcoupage. Voici une criture : e e e


PROCEDURE Clip (p, d: Point; VAR q: Point); Calcule le point dintersection q de la demi-droite dorigine p et de direction d avec le rectangle dlimit par les verticales dquations x = 0 et x = HauteurEcran, et les e e e horizontales dordonnes y = 0 et y = LargeurEcran. e VAR dx, dy, px, py, m: real; BEGIN dx := Abscisse(d); dy := Ordonnee(d); px := Abscisse(p); py := Ordonnee(p); IF EstNul(dx) THEN est verticale. FairePoint((1 + signe(dy)) * HauteurEcran / 2, px, q) ELSE BEGIN m est lordonne de lintersection de avec une verticale. e m := py + ((1 + signe(dx)) * LargeurEcran / 2 - px) / dx * dy; IF m > HauteurEcran THEN FairePoint(px + (HauteurEcran - py) / dy * dx, HauteurEcran, q) ELSE IF m < 0 THEN FairePoint(px - py / dy * dx, 0, q) ELSE FairePoint((1 + signe(dx)) * LargeurEcran / 2, m, q) END END; { de "Clip" }

Ceci dnit la biblioth`que Geometrie. Bien entendu, il reste a raliser les primitives e e ` e graphiques. Commenons par le Macintosh : c
PROCEDURE RelierPixels (a, b: Pixel); Pour tracer un trait du pixel a au pixel b. BEGIN MoveTo(a[0], a[1]); LineTo(b[0], b[1]) END; { de "RelierPixels" } PROCEDURE LireCurseur (VAR curseur: Pixel); BEGIN REPEAT UNTIL button; GetMouse(curseur[0], curseur[1]); WHILE button DO; END; { de "LireCurseur" } PROCEDURE TracerCarre (a: Pixel; r: integer); VAR rectangle: rect; Pour les coordonnes du carr. e e BEGIN SetRect(rectangle, a[0] - r, a[1] - r, a[0] + r, a[1] + r);

Version 15 janvier 2005

10.2. Quelques primitives gomtriques e e


FrameRect(rectangle); END; { de "TracerCarre" } Trace les cts du carr. o e e

291

PROCEDURE TracerDisque (a: Pixel; r: integer); VAR rectangle: rect; Pour le carr circonscrit au cercle. e BEGIN SetRect(rectangle, a[0] - r, a[1] - r, a[0] + r, a[1] + r); PaintOval(rectangle); Trace le disque. END; { de "TracerDisque" } PROCEDURE EcrireGraphique (a: Pixel; n: integer); BEGIN moveto(a[0], a[1]); WriteDraw(n : 1); Ecriture dans la fentre graphique. e END; { de "EcrireGraphique" } PROCEDURE InitGraphik; VAR cadre: rect; BEGIN showdrawing; Montre la fentre graphique. e GetDrawingRect(cadre); Rcup`re les coordonnes de cette fentre. e e e e HauteurEcran := cadre.bottom - cadre.top; LargeurEcran := cadre.right - cadre.left END; { de "InitGraphik" }

Pour un compatible PC, certaines des procdures sont un peu plus longues a crire, e ` e si lon ne dispose pas par ailleurs de fonctions sophistiques. Nous faisons le choix de e nous placer en mode graphique et dy rester. Le curseur est une petite croix (appele e rticule ) qui est active par les `ches. Le point vu sera saisi lorsque lon enfonce la e e e touche retour. Voici les procdures, avec quelques commentaires : e
CONST hRet = 4; VAR Reticule: pointer; PROCEDURE InitReticule; BEGIN MoveTo(0, 0); LineTo(2 * hRet, 2 * MoveTo(2 * hRet, 0); LineTo(0, 2 * GetMem(Reticule, ImageSize(0, 0, 2 GetImage(0, 0, 2 * hRet, 2 * vRet, ClearViewPort END; { de "InitReticule" } Un pointeur sans type. Hauteur et largeur du rticule. e

vRet = 4;

vRet); vRet); * hRet, 2 * vRet)); Reticule^); Et on eace tout.

Trac. e Rserve place. e Copie.

Le rticule doit simuler une souris. Pour cela, il se dplace en fonction des touches du e e clavier enfonces. Mais pour dplacer le rticule, il faut leacer et le redessiner. La e e e procdure suivante ralise lopration : e e e Version 15 janvier 2005

292

Chapitre 10. Gomtrie algorithmique e e

PROCEDURE BasculerReticule; Eace le rticule, sil est dessin, et le dessine, sil est absent. e e BEGIN PutImage(GetX - hRet, GetY - vRet, Reticule^, XOrPut) END; { de "BasculerReticule" }

Le rticule suit les `ches du clavier; plus prcisment, si une des quatre `ches est e e e e e enfonce, le rticule se dplace, ainsi que le pixel courant ; si la touche retour est e e e enfonce, la variable bouton ci-dessous est mise a vrai; dans les autres cas, il ne se passe e ` rien :
PROCEDURE SuivreReticule (VAR bouton: boolean); Quand on arrive, le rticule est ach ; il le restera en sortant. e e CONST FlecheGauche = K; FlecheDroite = M; Les numros des `ches. e e FlecheHaut = H; FlecheBas = P; pas = 5; BEGIN CASE Readkey OF #13: bouton := true; Touche retour-chariot . #0: BEGIN BasculerReticule; CASE Readkey OF FlecheGauche: IF GetX >= pas THEN MoveRel(-pas, 0); FlecheDroite: IF GetX <= LargeurEcran - pas THEN MoveRel(pas, 0); FlecheHaut: IF GetY >= pas THEN MoveRel(0, -pas); FlecheBas: BEGIN IF GetY <= HauteurEcran - pas THEN MoveRel(0, pas) END ELSE END; BasculerReticule END ELSE END { du CASE } END; { de "SuivreReticule" }

Voici la procdure de saisie dun pixel; elle suit le rticule jusqu` ce que la touche retour e e a soit enfonce : e
PROCEDURE LireCurseur (a: Pixel); Quand on arrive, on est en mode graphique et le rticule nest pas ach ; il ne le sera e e pas en sortant. VAR

Version 15 janvier 2005

10.2. Quelques primitives gomtriques e e


bouton: boolean; BEGIN BasculerReticule; bouton := false; REPEAT SuivreReticule(bouton) UNTIL bouton; a[0] := GetX; a[1] := GetY BasculerReticule END; { de "LireCurseur" }

293

Les autres procdures se ralisent facilement : e e


PROCEDURE TracerDisque (a: pixel; r: integer); BEGIN PieSlice(a[0], a[1], 0, 350, r) END; { de "TracerDisque" } PROCEDURE TracerCarre (a: pixel; r: integer); BEGIN Rectangle(a[0] - r, a[1] + r, a[0] + r, a[1] - r) END; { de "TracerCarre" } PROCEDURE RelierPixels (a, b: Pixel); BEGIN MoveTo(a[0], a[1]); LineTo(b[0], b[1]) END; { de "RelierPixels" } PROCEDURE EcrireGraphique (a: Pixel; n: integer); VAR c: String[6]; BEGIN Str(n, c); OutTextXY(a[0], a[1] - TextHeight(c), c) END; { de "EcrireGraphique" } PROCEDURE InitGraphik; VAR Pilote, ModeGraphique: integer; BEGIN Pilote := Detect; Incantation usuelle. InitGraph(Pilote, ModeGraphique, ); IF GraphResult <> GrOk THEN BEGIN Un probl`me ? e writeln(GraphErrorMsg(GraphResult)); halt END; LargeurEcran := GetMaxX; HauteurEcran := GetMaxY; InitReticule; Au milieu de lcran. e MoveTo(LargeurEcran DIV 2, HauteurEcran DIV 2) END; { de "InitGraphik" }

Le choix de rester en mode graphique demande bien entendu de revoir le style des menus, en rservant par exemple une ligne de lcran au texte. e e Version 15 janvier 2005

294

Chapitre 10. Gomtrie algorithmique e e

10.3
10.3.1

Triangulation de Delaunay
Enonc : triangulation de Delaunay e

Soit S un ensemble ni de points, appels sites, dun plan ane euclidien E muni dun e rep`re orthonorm (O, i, j). On suppose les points de S en position gnrale, cest-`-dire e e e e a que trois quelconques dentre eux ne sont pas aligns et quaucun cercle ne passe par e quatre sites quelconques de S. On note pq la droite passant par les points p et q, et [p, q] le segment de droite joignant p et q. Les sites de S sont donns par leurs coordonnes. e e On appelle enveloppe convexe de S, et on note E(S), la plus petite rgion convexe, au e sens de linclusion, contenant S. On admettra que E(S) est un polygone (sur lexemple de la gure, la fronti`re de lenveloppe convexe est en traits pais). e e 1. Ecrire une procdure qui dtermine et trace les artes du polygone E(S) (on pourra e e e utiliser le fait que pour s, t S, le segment [s, t] est une arte de E(S) si et seulement e si tous les autres sites se trouvent dun mme ct de la droite st). e oe Exemple numrique : S = {s1 , . . . , s7 }, s1 (0, 0), s2 (0, 6), s3 (6, 6), s4 (10, 12), s5 (8, 3), e s6 (10, 5), s7 (16, 0).

Figure 10.3.1: Un exemple. Un cercle C est un cercle de Delaunay (de S) si son intrieur ne contient aucun point e de S. Un segment [s, t], o` s, t sont deux sites distincts, est une arte de Delaunay sil u e existe un cercle de Delaunay passant par s et t. Un triangle rst (o` r, s, et t sont trois u lments distincts de S) est un triangle de Delaunay si le cercle circonscrit au triangle ee est un cercle de Delaunay. Sur lexemple de la gure, rst est un triangle de Delaunay. 2. Ecrire une procdure qui dtermine et trace les artes de tous les triangles de e e e Delaunay de S. 3. a) Dmontrer que tout site de S est extrmit dau moins une arte de Delaunay. e e e e Dmontrer que toute arte de Delaunay est un ct dun triangle de Delaunay. e e oe b) Dmontrer que si une arte de Delaunay est une arte de E(S), elle nappartient qu` e e e a un seul triangle de Delaunay; en revanche, si larte nest pas une arte de E(S), elle e e appartient a deux triangles de Delaunay. ` Version 15 janvier 2005


s t

10.3. Triangulation de Delaunay

295

4. Dmontrer que deux artes distinctes de Delaunay de S sont disjointes, sauf vene e e tuellement aux extrmits. Dmontrer que les intrieurs de deux triangles de Delaunay e e e e distincts sont disjoints. On note d(p, q) la distance (euclidienne) entre deux points p et q, et on pose d(p, S) = minqS d(p, q). Pour tout s S, on pose V (s) = {q E | d(s, q) = d(s, S)} Les rgions V (s) sappellent les rgions de Vorono de S. Sur lexemple ci-dessus, la e e rgion hachure reprsente la rgion de Vorono de s. e e e e 6. Dmontrer que pour tout s S, la rgion V (s) est un convexe dont la fronti`re est e e e une ligne polygonale. a) Dmontrer que les sommets de cette ligne polygonale sont les centres des cercles e circonscrits aux triangles de Delaunay dont s est un sommet. b) Dmontrer que les artes de cette ligne polygonale sont portes par les mdiatrices e e e e des artes de Delaunay de sommets s. e c) Dmontrer que deux sommets de cette ligne polygonale sont les extrmits de lune e e e de ces artes si et seulement si les triangles de Delaunay associs sont adjacents. e e 7. Ecrire une procdure qui trace la fronti`re de V (s), pour tout s S. e e 8. Soient f le nombre de triangles de Delaunay et a le nombre dartes de Delaunay e de S, et soit l le nombre de sommets de E(S). Trouver une relation linaire entre f , a e et l. 5. Dmontrer que la runion des triangles de Delaunay de S est gale a E(S). e e e `

10.3.2

Solution : triangulation de Delaunay

Soit S un ensemble ni de points, appels sites, dun plan ane euclidien E. e Une triangulation de S est un ensemble ni de triangles tels que : (1) lensemble des sommets des triangles co ncide avec S ; (2) les intrieurs des triangles sont disjoints deux a deux; e ` (3) la runion des triangles co e ncide avec lenveloppe convexe de S. Parmi toutes les triangulations possibles dun ensemble de points, la triangulation de Delaunay (que nous dnirons dans un instant) est la plus tudie et la plus utilise e e e e car elle poss`de de nombreuses proprits de maximalit, utiles dans les applications e ee e pratiques, et plus prosa quement il existe des algorithmes performants pour la calculer. Un cercle C est un cercle de Delaunay (de S) si son intrieur (i.e. le disque ouvert dont e C est la fronti`re) ne contient aucun point de S. Un segment [s, t], o` s, t sont deux sites e u distincts, est une arte de Delaunay sil existe un cercle de Delaunay passant par s et t. e Un triangle rst (o` r, s, t sont trois sites distincts de S) est un triangle de Delaunay si u son cercle circonscrit est un cercle de Delaunay. Version 15 janvier 2005

296

Chapitre 10. Gomtrie algorithmique e e

Figure 10.3.2: Une triangulation de Delaunay. Pour simplier la discussion nous ferons lhypoth`se restrictive que les sites sont en e position gnrale cest-`-dire que trois dentre eux ne sont jamais aligns et que quatre e e a e dentre eux ne sont jamais cocycliques. Sous cette hypoth`se nous avons le rsultat e e suivant. Thor`me 10.3.1. Lensemble des triangles de Delaunay de S forment une triangue e lation de S, appele la triangulation de Delaunay de S. e Avant de donner la preuve de ce thor`me nous rappelons la caractrisation des points e e e dun cercle connue sous le nom de la proposition de larc capable. Soit C un cercle de centre passant par les points p et q ; soit H1 le demi-plan ouvert, de fronti`re la droite e pq, contenant (ventuellement dans son adhrence si pq est un diam`tre de C) le centre e e e du cercle C et soit H2 lautre demi-plan ouvert de fronti`re la droite pq. Etant donns e e trois points distincts p, q, r langle des demi-droites dnies par les vecteurs et est e pq pr not qpr. e Proposition 10.3.2. Soit 2 = pq. Le cercle C est caractris par e e C H1 = {m H1 | pmq = } (3.1) (3.2) C H2 = {m H2 | pmq = }

Proposition 10.3.3. Le disque D de fronti`re C est caractris par e e e D H1 = {m H1 | pmq > } (3.3) (3.4) D H2 = {m H2 | pmq > }

Preuve du thor`me 10.3.1. Nous commenons par dmontrer que tout point de S est e e c e lextrmit dune arte de Delaunay et que toute arte de lenveloppe convexe de S est e e e e un ct dun unique triangle de Delaunay. oe Version 15 janvier 2005

10.3. Triangulation de Delaunay


q 2 p !

297

Figure 10.3.3: La caractrisation de larc capable. e

Figure 10.3.4: Preuve de lexistence des triangles de Delaunay. Soit p S et soit q le point de S le plus proche de p. Alors [p, q] est une arte de e Delaunay; en eet le disque de diam`tre [p, q] est inclus dans le disque de centre p et de e rayon [p, q] qui, par dnition de q, ne contient aucun autre point de S. e Soit [p, q] une arte de E(S); tous les points de S tant situs dun mme ct de la e e e e oe droite pq et les points S tant en position gnrale, il existe un unique point r de S qui e e e ralise le maximum de e {prq | r S \ {p, q}} (3.5) Dapr`s (3.3) il est clair que pqr est un triangle de Delaunay et que cest le seul triangle e de Delaunay darte [p, q]. e Nous montrons maintenant que toute arte de Delaunay, autre quun ct de lenveloppe e oe convexe de S, est le ct de deux triangles de Delaunay. Soit [p, q] une arte de Delaunay, oe e C un cercle de Delaunay passant par p et q, D son intrieur et H1 , H2 les deux demi-plans e Version 15 janvier 2005

298

Chapitre 10. Gomtrie algorithmique e e

ouverts dont la droite pq est la fronti`re. Les points m de D H1 sont caractriss par e e e pmq > c pour une certaine constante c [0, ]. On a = car [p, q] nest pas une arte de e lenveloppe convexe de S. Soit r lunique point de S H1 qui ralise le maximum de e {prq | r S H1 } Pour tout point s S \ {p, q} on a : (1) soit s H1 et alors psq prq par dnition de r ; e (2) soit s H2 et alors de s, r D on dduit que psq c et prq c do` e u psq prq. En dautres termes lintrieur du cercle passant par p, q et r ne contient aucun point de e S ce qui prouve que pqr est un (et unique!) triangle de Delaunay inclus dans H1 dont [p, q] est un ct. En permutant les rles de H1 et H2 on obtient lexistence dun unique oe o triangle de Delaunay inclus dans H2 dont [p, q] est un ct. oe Nous montrons maintenant que les intrieurs de deux triangles de Delaunay sont dise joints. Un triangle tant inclus dans son cercle circonscrit, il est clair quun triangle de e Delaunay ne peut en contenir un autre. Il sut donc de dmontrer que deux artes de e e Delaunay ne peuvent tre scantes. Raisonnons par contradiction. Soient [p, q] et [r, s] e e deux artes de Delaunay scantes. Il existe un cercle passant par p, q et ne contenant ni e e r ni s; soit a un point de ce cercle distinct de p et q ; les points r et s tant de part et e dautre de la droite pq on a, a une permutation pr`s de r et s, ` e paq > prq et paq > psq do` u prq + psq < En permutant les rles de [p, q] et [r, s] on obtient lingalit rps + rqs < , qui ajoute o e e e a la prcdente donne ` e e prq + psq + rps + rqs < 2 Or ceci est impossible car la somme des angles dun quadrilat`re convexe vaut 2. e Nous terminons la dmonstration du thor`me en montrant que la runion des triane e e e gles de Delaunay est exactement lenveloppe convexe de S. Soit x un point intrieur a e ` lenveloppe convexe de S et soit a larte de Delaunay la plus proche de x dans une die rection donne. Le triangle de Delaunay de ct a inclus dans le demi-plan, de fronti`re e oe e la droite pq, contenant x contient x. La dmonstration prcdente est constructive et sugg`re de calculer la triangulation de e e e e Delaunay par ordre dadjacence de ses triangles. Le triangle adjacent, dun ct donn, a oe e ` une arte de Delaunay est obtenu en cherchant le point de S qui voit cette arte sous un e e angle maximal. Cette procdure de calcul nest pas sans rappeler celle que nous avons e dcrite pour calculer lenveloppe convexe dun ensemble ni de points. Cette apparente e Version 15 janvier 2005

10.3. Triangulation de Delaunay

299

similarit nest pas fortuite et sexplique aisment via la transformation gomtrique e e e e que nous explicitons maintenant. Considrons le plan E comme le plan (O, , ) dun espace euclidien F = (O, , , k) de e dimension trois. A tout point p de coordonnes (x, y) du plan E, on associe le point e de coordonnes (x, y, x2 + y 2 ), not (p), du parabolo dquation z = x2 + y 2 . On e e de e appelle enveloppe convexe infrieure dune partie X de F lensemble E(X) + R + k. e

Figure 10.3.5: Le parabolo z = x2 + y 2 . de Thor`me 10.3.4. Soit S un ensemble ni de points de E. Alors pqr est un triangle e e de Delaunay de S si et seulement si (p)(q)(r) est une face de lenveloppe convexe infrieure de (S). e Preuve. En eet soit C un cercle passant par les points a, b, c et dquation x2 + y 2 + e x + y + = 0 et soit D son intrieur. Alors e p = (x, y) D x2 + y 2 + x + y + 0 z + x + y + 0 et z = x2 + y 2 (p) R[(a), (b), (c)] o` R[u, v, w] est lenveloppe convexe infrieure du plan passant par les points u, v, w. u e Par suite pqr est un triangle de Delaunay de S si et seulement si (S) est inclus dans Version 15 janvier 2005

300

Chapitre 10. Gomtrie algorithmique e e

le demi-espace R[(p), (q), (r)] ou encore si et seulement si le plan (p)(q)(r) est le support dune face de lenveloppe convexe infrieure de (S). Il reste a montrer que e ` cette face co ncide avec le triangle (p)(q)(r); or quatre points de S ntant, par e hypoth`se, jamais cocycliques, leurs images par ne sont jamais coplanaires et toute e face de lenveloppe convexe de (S) est un triangle. La triangulation de Delaunay est troitement lie a une autre structure de base de e e ` la gomtrie algorithmique. Cette structure appara naturellement dans le probl`me e e t e suivant : tant donn un point de E, quel est le point de S le plus proche? Pour tout e e point s de S on appelle rgion de Vorono de s lensemble, not V (s), des points du plan e e dont la distance a lensemble S est ralise par s ` e e V (s) = {x E | d(x, s) = d(x, S)} (3.6)

de fronti`res les mdiatrices des segments [s, s ] pour s S \ {s}; de plus V (s) est e e dintrieur non vide car, la fonction distance tant continue, V (s) contient un voisinage e e de s. Lensemble des rgions de Vorono de S, not DV (S), est appel le diagramme de e e e Vorono de S. Les artes et les sommets de DV (S) sont par dnition les sommets et les e e cts des rgions de Vorono La triangulation de Delaunay et le diagramme de Vorono oe e . de S sont troitement lis. Le thor`me qui suit prcise ce lien. e e e e e Thor`me 10.3.5. Les droites support des artes de V (s) sont les mdiatrices des e e e e artes de Delaunay de sommet s. e Les sommets de V (s) sont les centres des cercles circonscrits aux triangles de Delaunay dont lun des sommets est s. Deux sommets de V (s) sont les extrmits dune arte de V (s) si et seulement si les e e e triangles de Delaunay associs sont adjacents. e Preuve. Pour si S \ {s}, soit Ri = {x E | d(x, s) d(x, si )} le demi-plan, contenant s, de fronti`re la mdiatrice Hi du segment [s, si ]. e e Les artes de V (S) sont les Hi V (s) dintrieur relatif non vide; cest-`-dire quil existe e e a un ouvert de Hi dans lequel on a d(x, s) = d(x, si ) = d(x, S) en particulier [s, si ] est une arte de Delaunay. Inversement si [s, si ] est une arte de e e Delaunay alors il existe un x Hi tel que d(x, s) = d(x, si ) = d(x, S); mais les sites tant en position gnrale, cette relation reste vraie dans un voisinage a droite ou a e e e ` ` gauche (ou les deux) de x dans Hi et Hi V (s) est bien une arte de V (s). e Les sommets de V (s) sont les Hi Hj V (s) qui se rduisent a un point; cest-`-dire e ` a les points tels que d(, s) = d(, si ) = d(, sj ) = d(, S) Version 15 janvier 2005

Lensemble V (s) est un poly`dre convexe car il scrit comme lintersection nie des e e demi-espaces ferms e Rs = {x E | d(x, s) d(x, s )}

10.3. Triangulation de Delaunay

301

Figure 10.3.6: Le diagramme de Vorono est le dual de la triangulation de Delaunay. pour un certain i et un certain j. En dautres termes ce sont les centres des cercles circonscrits aux triangles de Delaunay de sommet s. Enn, les sites tant supposs en position gnrale, un sommet de V (s) dtermine de e e e e e mani`re unique les droites Hi et Hj dont il est lintersection; par suite V (s) Hi et e V (s) Hj sont bien des artes de V (s) dont une extrmit est . e e e Nous terminons en dnombrant les sommets, artes et rgions de Vorono e e e . Proposition 10.3.6. Soient n le nombre de sites de S et l le nombre de sites de S situs sur la fronti`re de son enveloppe convexe. Alors les nombres f, a, s de faces, e e dartes et de sommets du diagramme de Vorono sont lis par les relations e e (1) f = n (2) 3s = 2a l (3) s = 2f l 2

Preuve. La premi`re relation est vidente car une rgion de Vorono est associe bijece e e e tivement a un site. ` La seconde relation est obtenue en remarquant que chaque sommet du diagramme de Vorono est incident a trois artes et que chaque arte du diagramme de Vorono est ` e e incidente a deux sommets pour les artes bornes et un seul sommet pour les l artes ` e e e non bornes. e Version 15 janvier 2005

302

Chapitre 10. Gomtrie algorithmique e e

Pour dmontrer la troisi`me relation nous choisissons un rep`re (O, i, j) et supposons e e e sans perte de gnralit quaucune arte du DV (S) nest verticale (cest-` dire de die e e e a rection j). Un sommet de DV (S) est dit gauche (respectivement droit) sil est le point dabscisse minimale (respectivement maximale) dune rgion de DV (S). On observe e alors que tout sommet de DV (S) est le sommet gauche ou droit dune seule rgion de e DV (S), quune rgion de DV (S) borne admet un sommet droit et un sommet gauche e e tandis quune rgion non borne admet un unique point gauche ou droit sauf deux e e dentre elles qui nen admettent aucun. En vertu du thor`me 10.3.5, les nombres s , f et a de sommets, triangles et artes de e e e la triangulation de Delaunay sont respectivement gaux aux nombres f, s et a de faces, e sommets et artes du diagramme de Vorono Les relations de la proposition prcdente e . e e sont ainsi galement vries par les nombres s , f et a en lieu et place des nombres e e e f, s et a.

10.3.3

Programme : triangulation de Delaunay

Pour calculer la triangulation de Delaunay dun ensemble de sites, il faut dabord saisir les sites, dans un tableau dont le type est dni par : e
TYPE SuitePoints = ARRAY[1..LongueurSuite] OF Point;

La constante LongueurSuite est choisie de faon convenable. La lecture des sites se fait c par saisie successive des points. Il faut xer une convention pour arrter la saisie : nous e convenons de larrter lorsque deux points conscutifs sont gaux (ceci correspond a un e e e ` double-clic sur un Macintosh). On est amen aux procdures : e e
PROCEDURE SaisirSites (VAR n: integer; VAR S: SuitePoints); VAR q: Point; SaisieTerminee: boolean; BEGIN n := 1; SaisirPoint(S[1]); Saisie du premier point. MarquerPointRond(S[1]); Le point est marqu e NumeroterPoint(S[1], 1); et numrot. e e REPEAT SaisirPoint(q); Saisie dun point. SaisieTerminee := SontEgauxPoints(q, S[n]); Egal au prcdent ? e e IF NOT SaisieTerminee THEN BEGIN n := n + 1; S[n] := q; Le point est enregistr, e MarquerPointRond(S[n]); marqu et numrot. e e e NumeroterPoint(S[n], n) END UNTIL SaisieTerminee END; { de "SaisirSites" }

Version 15 janvier 2005

10.3. Triangulation de Delaunay avec, bien entendu :


FUNCTION SontEgauxPoints (VAR p, q: Point): boolean; p = q ? BEGIN SontEgauxPoints := (EstNul(Abscisse(p) - Abscisse(q))) AND (EstNul(Ordonnee(p) - Ordonnee(q))) END; { de "SontEgauxPoints" }

303

Avant de procder a la description de lalgorithme de calcul de la triangulation, nous e ` prsentons quelques procdures auxiliaires; pour la plupart, le nom dcrit enti`rement e e e e la fonction :
FUNCTION det (VAR p, q, r: Point): real; VAR pqx, pqy, qrx, qry: real; BEGIN pqx := Abscisse(q) - Abscisse(p); qrx := Abscisse(r) - Abscisse(q); det := pqx * qry - pqy * qrx END; { de "det" } Calcule dt(pq, pr). e

pqy := Ordonnee(q) - Ordonnee(p); qry := Ordonnee(r) - Ordonnee(q);

FUNCTION EstSitue (VAR p, q, r: Point): integer; Prend la valeur 1, 0, 1, selon que p est situ a gauche, sur, ou a droite de la droite e ` ` oriente qr. e BEGIN EstSitue := signe(det(p, q, r)) END; { de "EstSitue" } FUNCTION EstAGauche (VAR p, q, r: Point): boolean; BEGIN EstAGauche := EstSitue(p, q, r) = 1 END; { de "EstAGauche" } FUNCTION EstADroite (VAR p, q, r: Point): boolean; BEGIN EstADroite := EstSitue(p, q, r) = -1 END; { de "EstADroite" } FUNCTION CarreNorme (VAR p: Point): real; BEGIN CarreNorme := sqr(Abscisse(p)) + sqr(Ordonnee(p)) END; { de "CarreNorme" } FUNCTION CarreDistance (VAR p, q: Point): real; BEGIN CarreDistance := sqr(Abscisse(q) - Abscisse(p)) + sqr(Ordonnee(q) - Ordonnee(p)) END; { de "CarreDistance" } FUNCTION CosAngle (VAR p, q, r: Point): real; Calcule pq pr/ pq pr . VAR pqx, pqy, prx, pry: real;

Version 15 janvier 2005

304

Chapitre 10. Gomtrie algorithmique e e


BEGIN pqx := Abscisse(q) - Abscisse(p); pqy := Ordonnee(q) - Ordonnee(p); prx := Abscisse(r) - Abscisse(p); pry := Ordonnee(r) - Ordonnee(p); CosAngle := (pqx * prx + pqy * pry) / sqrt((sqr(pqx) + sqr(pqy)) * (sqr(prx) + sqr(pry))) END; { de "CosAngle" }

La triangulation de Delaunay de lensemble S est calcule par lalgorithme dcrit dans e e la section prcdente : pour chaque site si , on dtermine dabord son voisin le plus e e e proche sj puis, en tournant dans le sens des aiguilles dune montre autour de si , on dtermine successivement la suite des triangles de Delaunay adjacents dont s i est un e sommet. Deux cas peuvent alors se produire : si si nest pas sur lenveloppe convexe, on retombe, apr`s un tour complet, sur le sommet sj . En revanche, si la recherche du e triangle de Delaunay suivant sarrte a une tape donne, faute de site a explorer, alors e ` e e ` le sommet si est sur lenveloppe convexe de S et lexploration continue en partant de larte [si , sj ] et en tournant, cette fois-ci, autour de si dans le sens contraire. e Considrons par exemple la gure 10.3.7. Le sommet 2 a le sommet 6 comme voisin le e plus proche, donc en tournant autour de 2, on dcouvre successivement les sommets 1, e 3, 4, 5, avant de retomber sur 6 qui indique que 2 nest pas sur lenveloppe convexe. En revanche, pour le sommet 5, le plus proche voisin est 2. La recherche a droite donne ` uniquement le sommet 4, ce qui indique que 5 est sur lenveloppe convexe; puis la recherche a gauche donne le site 6. ` Cette recherche conduit a associer, a chaque site si , les informations suivantes : la suite ` ` nie des sommets qui, avec si , forment les triangles de Delaunay dont si est un des sommets, puis une marque indiquant que si est sur lenveloppe convexe de S ou non. Nous utilisons, pour conserver ces informations, des tableaux dentiers qui contiennent les indices des sites concerns. Les types utiles sont : e
TYPE SuiteIndices = ARRAY[1..LongueurSuite] OF integer; TableIndices = ARRAY[1..LongueurSuite] OF SuiteIndices;

Une table dindices contient, pour chaque i, la suite des indices des sites trouvs en e tournant autour de si . La longueur de cette suite sera range dans une table dentiers. e Lindication de prsence sur lenveloppe convexe pourra aussi tre range dans une table e e e de cette nature. Ceci conduit donc a len-tte de procdure suivant : ` e e
PROCEDURE Delaunay (n: integer; S: SuitePoints; VAR long: Suiteindices; long[i] est la longueur de la suite des voisins de i. VAR Voisins: TableIndices; V oisins[i] contient la suite des voisins de i. VAR EnvConv: Suiteindices);

Le tableau EnvConv indique les sommets qui sont sur lenveloppe convexe. Plus prcie sment, EnvConv[i] = 1 si si est sur lenveloppe convexe, 0 sinon. La procdure dbute e e e par deux constantes qui servent a orienter la recherche `
CONST

Version 15 janvier 2005

10.3. Triangulation de Delaunay

305

Figure 10.3.7: Une triangulation.


AGauche = 1; ADroite = -1;

La fonction que voici calcule le site sj le plus proche de si , en comparant les carrs des e distances de si aux autres sites :
FUNCTION LePlusProcheVoisin (i: integer): integer; VAR j, k: integer; d, dk: real; BEGIN IF i = 1 THEN j := 2 ELSE j := 1; Premier site examin. e d := CarreDistance(S[i], S[j]); Le carr de la distance. e FOR k := 1 TO n DO IF k <> i THEN BEGIN Pour les sites autres que si , dk := CarreDistance(S[i], S[k]); calcul du carr de la distance, e

Version 15 janvier 2005

306
IF dk < d THEN BEGIN d := dk; j := k END END; LePlusProcheVoisin := j END; { de "LePlusProcheVoisin" }

Chapitre 10. Gomtrie algorithmique e e


et si le site est plus proche, on mmorise son indice. e

On dtermine un triangle de Delaunay en considrant une arte de Delaunay [s i , sj ] et e e e en cherchant le site sk qui forme, avec les deux sites, un angle maximal. La fonction suivante calcule lindice k dun tel site situ a droite ou a gauche de si sj , selon la valeur e` ` du param`tre cote; sil ny en a pas, la fonction retourne 0. e
FUNCTION VoisinSuivant (i, j, cote: integer): integer; VAR a, k: integer; cosmin, cosinus: real; BEGIN a := 0; cosmin := 1; Initialisation : au dbut, le cosinus minimal vaut 1. e FOR k := 1 TO n DO Recherche parmi les sites du ct donn. o e e IF (k <> i) AND (k <> j) AND (EstSitue(S[k], S[i], S[j]) = cote) THEN BEGIN cosinus := CosAngle(S[k], S[i], S[j]); Calcul du cosinus, IF cosinus < cosmin THEN BEGIN on garde le plus petit. cosmin := cosinus; a := k END; END; VoisinSuivant := a END; { de "VoisinSuivant" }

Cette procdure est utilise dans : e e


FUNCTION VoisinDroit (i, j: integer): integer; BEGIN VoisinDroit := VoisinSuivant(i, j, ADroite) END; { de "VoisinDroit" } FUNCTION VoisinGauche (i, j: integer): integer; BEGIN VoisinGauche := VoisinSuivant(i, j, AGauche) END; { de "VoisinGauche" }

Lorsque ces fonctions rendent un indice non nul, il est insr dans la table des voisins e e soit a gauche, soit a droite. Les deux procdures suivantes se chargent de linsertion : ` ` e
PROCEDURE InsererADroite (k, i: integer); BEGIN long[i] := long[i] + 1; Voisins[i][long[i]] := k END; { de "InsererADroite" } Insertion de k a la n. `

Version 15 janvier 2005

10.3. Triangulation de Delaunay

307

PROCEDURE InsererAGauche (k, i: integer); Insertion de k au dbut. e VAR j: integer; BEGIN FOR j := long[i] DOWNTO 1 DO On dcale dabord les autres voisins, e Voisins[i][j + 1] := Voisins[i][j]; long[i] := long[i] + 1; puis on ins`re en tte. e e Voisins[i][1] := k END; { de "InsererAGauche" }

Apr`s les dclarations : e e


VAR i, j, k, m: integer;

Voici le corps de la procdure : e


BEGIN { de "Delaunay" } FOR i := 1 TO n DO BEGIN m := LePlusProcheVoisin(i); long[i] := 1; Voisins[i][1] := m; j := m; k := VoisinDroit(i, j); WHILE (k <> 0) AND (k <> m) DO BEGIN InsererADroite(k, i); j := k; k := VoisinDroit(i, j) END; IF k = m THEN EnvConv[i] := 0 ELSE BEGIN EnvConv[i] := 1; j := m; k := VoisinGauche(i, j); WHILE k <> 0 DO BEGIN InsererAGauche(k, i); j := k; k := VoisinGauche(i, j) END END END { boucle sur i } END; { de "Delaunay" } Pour chaque site si , on cherche dabord le plus proche voisin. On initialise la liste des voisins. Premier site adjacent a droite. ` Progression a droite. ` Recherche du suivant. Si la boucle est boucle : si nest pas e sur lenveloppe convexe. Sinon, si est sur lenveloppe convexe. Premier site adjacent a gauche. ` Progression a gauche. `

Voici les calculs faits pour les sites de la gure 10.3.7 :


Le Le Le Le Le Le Le plus proche voisin de 1 est 6 voisin droit de (1,6) est 0 voisin gauche de (1,6) est 2 voisin gauche de (1,2) est 3 voisin gauche de (1,3) est 0 plus proche voisin de 2 est 6 voisin droit de (2,6) est 1

Version 15 janvier 2005

308
Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le Le voisin droit de (2,1) est 3 voisin droit de (2,3) est 4 voisin droit de (2,4) est 5 voisin droit de (2,5) est 6 plus proche voisin de 3 est 2 voisin droit de (3,2) est 1 voisin droit de (3,1) est 0 voisin gauche de (3,2) est 4 voisin gauche de (3,4) est 0 plus proche voisin de 4 est 5 voisin droit de (4,5) est 2 voisin droit de (4,2) est 3 voisin droit de (4,3) est 0 voisin gauche de (4,5) est 0 plus proche voisin de 5 est 2 voisin droit de (5,2) est 4 voisin droit de (5,4) est 0 voisin gauche de (5,2) est 6 voisin gauche de (5,6) est 0 plus proche voisin de 6 est 2 voisin droit de (6,2) est 5 voisin droit de (6,5) est 0 voisin gauche de (6,2) est 1 voisin gauche de (6,1) est 0

Chapitre 10. Gomtrie algorithmique e e

Venons-en au trac du diagramme de Vorono (le trac des triangles de Delaunay est e e immdiat). Pour cela, on parcourt les triangles de Delaunay, on calcule le centre du e cercle circonscrit et on relie des centres adjacents. Voici une ralisation : e
PROCEDURE TracerVoronoi (n: integer; S: SuitePoints; long, conv: Suiteindices; Voisin: TableIndices); Trace les sommets et artes du diagramme de Vorono associ a la triangulation de e e ` Delaunay. VAR a, b, c, dir: Point; i, j: integer; PROCEDURE CentreCercleCirconscrit (i, j, k: integer; VAR m: Point); Calcule le centre m du cercle circonscrit au triangle si , sj , sk , en rsolvant directement le syst`me linaire. e e e VAR abx, aby, acx, acy, ab, ac, delta: real; a, b, c: Point; BEGIN a := S[i]; b := S[j]; c := S[k]; abx := Abscisse(b) - Abscisse(a); aby := Ordonnee(b) - Ordonnee(a); acx := Abscisse(c) - Abscisse(a); acy := Ordonnee(c) - Ordonnee(a); delta := abx * acy - aby * acx; ab := CarreNorme(b) - CarreNorme(a);

Version 15 janvier 2005

10.4. Galerie dart


ac := CarreNorme(c) - CarreNorme(a); FairePoint((ab * acy - ac * aby) / (2 * delta), (ac * abx - ab * acx) / (2 * delta), m); END; { de "CentreCercleCirconscrit" }

309

PROCEDURE FaireDirectionPerpendiculaire (p, q: point; VAR d: point); BEGIN FairePoint(Ordonnee(p) - Ordonnee(q), Abscisse(q) - Abscisse(p), d); END; { de "FaireDirectionPerpendiculaire" } BEGIN { de "TracerVoronoi" } FOR i := 1 TO n DO IF EnvConv[i] = 1 THEN BEGIN si est sur lenveloppe convexe. CentreCercleCirconscrit(i, Voisin[i][1], Voisin[i][2], c); FaireDirectionPerpendiculaire(S[i], S[Voisin[i][1]], dir); MarquerPointCarre(c, 2); TracerDemiDroite(c, dir); FOR j := 2 TO long[i] - 1 DO BEGIN b := c; CentreCercleCirconscrit(i, Voisin[i][j], Voisin[i][j + 1], c); MarquerPointCarre(c, 2); TracerSegment(b, c) END; END ELSE BEGIN CentreCercleCirconscrit(i, Voisin[i][long[i]], Voisin[i][1], c); a := c; FOR j := 1 TO long[i] - 1 DO BEGIN b := c; CentreCercleCirconscrit(i, Voisin[i][j], Voisin[i][j + 1], c); MarquerPointCarre(c); TracerSegment(b, c) Segment du centre au prcdent. e e END; TracerSegment(c, a) Segment du premier au dernier. END END; { de "TracerVoronoi" }

10.4
10.4.1

Galerie dart
Enonc : galerie dart e

Le probl`me dit de la galerie dart (ou des gardiens de prisons) est le suivant : Quel e est le nombre de gardiens ncessaires pour surveiller une galerie dart et o` faut-il les e u placer? On le modlise comme suit. e Soit E un plan euclidien ane orient muni dun rep`re orthonorm (O, i, j). On note e e e [p, q] le segment de droite ferm joignant les points p et q. e Version 15 janvier 2005

310

Chapitre 10. Gomtrie algorithmique e e

Soit n 3 et soit S = (p1 , . . . , pn ) une suite de points distincts (appels sommets) dont e trois quelconques ne sont pas aligns. Le contour polygonal ferm C = [p 1 , p2 ] . . . e e [pn , p1 ] est simple si [pi , pi+1 ] [pj , pj+1 ] = pour 1 i, j n et i = j 1, j, j + 1 (les indices sont pris modulo n). Dans ce cas, le contour C spare le plan en deux rgions; e e le polygone simple P dni par S est la runion de C et de la rgion borne, appele e e e e e lintrieur de P . De plus, on suppose que pour un observateur qui parcourt le contour e dans le sens croissant des indices, lintrieur est a gauche (voir gure a la page suivante). e ` `

p 1 p 5 p 6 p 2 p 4 p3

Figure 10.4.1: Un polygone simple. Les sommets de P sont donns par leurs coordonnes. Soit P un polygone simple. Un e e sommet pi de P est une oreille si le triangle pi1 pi pi+1 est contenu dans P (les indices sont pris modulo n). Sur la gure, p1 , p3 , p5 sont les oreilles. On admet que tout polygone simple P poss`de au moins deux oreilles. e 1. Ecrire une procdure qui teste si un sommet pi est une oreille. (On pourra se servir e du fait que pi est une oreille si et seulement si pi+1 est a gauche de la droite oriente ` e pi pi1 et le triangle pi1 pi pi+1 ne contient aucun autre sommet de P .) Une triangulation de P est un ensemble de triangles vriant les trois conditions suie vantes : (1) les sommets des triangles sont des sommets de P ; (2) la runion des triangles est P ; e (3) les intrieurs des triangles sont deux a deux disjoints. e ` 2. Ecrire une procdure qui calcule une triangulation du polygone P . Quel est le e nombre de triangles dans une triangulation? 3. Ecrire un programme qui prend en argument la suite des coordonnes des sommets e dun polygone P que lon suppose simple, et qui dessine P ainsi que la triangulation calcule. e Exemple numrique : n = 8, p1 (0, 8), p2 (0, 0), p3 (4, 0), p4 (2, 6), p5 (11, 6), p6 (10, 1), e p7 (16, 1), p8 (16, 8). Un coloriage (` 3 couleurs) dune triangulation de P est une application de lensema ble des sommets de P dans un ensemble a 3 lments (les couleurs ) telle que les 3 ` ee sommets dun triangle aient des couleurs direntes. e Version 15 janvier 2005

10.4. Galerie dart

311

4. Prouver quil existe un et un seul coloriage a une permutation pr`s des couleurs. ` e Ecrire une procdure qui en calcule un. e Revenons au probl`me de la galerie dart. On dit quun point g P couvre le point e x P si [g, x] P . Chercher un ensemble de gardiens revient donc a chercher une ` partie nie G P telle que tout point de P est couvert par un point de G. Un tel ensemble est une couverture de P . 5. Soit c lune des couleurs dun coloriage et soit G lensemble des sommets de P de couleur c. Dmontrer que G est une couverture de P . En dduire que pour surveiller e e une galerie dart a n sommets, n/3 gardiens susent. (On note x la partie enti`re ` e de x.) 6. Complter votre programme pour quil marque dun signe distinctif les sommets e dune couverture du polygone. 7. Donner un exemple dun polygone simple a n sommets pour lequel toute couverture ` a au moins n/3 sommets. 8. Dmontrer que tout polygone simple poss`de au moins deux oreilles. e e 9. Donner un exemple dun polygone simple a n sommets possdant exactement deux ` e oreilles.

10.4.2

Solution : galerie dart

Soit P un polygone simple dun plan ane euclidien. Une triangulation de P est un ensemble T de triangles vriant les trois conditions e suivantes : (1) les sommets des triangles sont des sommets de P ; (2) la runion des triangles est P ; e (3) les intrieurs des triangles sont deux a deux disjoints. e ` Observons que toute arte du polygone P est un ct dun unique triangle de la triane oe gulation de P . Il sera utile de noter [p1 , p2 , . . . , pn ] le polygone dni par le contour polygonal simple e [p1 , p2 ] [p2 , p3 ] [pn , p1 ].

On appelle diagonale de P tout segment [pi , pj ] joignant deux sommets non conscutifs e de P tel que le segment ouvert ]pi , pj [ soit inclus dans lintrieur du polygone P . Dans e ce cas en supposant i < j le polygone P est la runion des deux polygones dintrieurs e e disjoints [p1 , . . . , pi , pj , . . . , pn ] et [pi , . . . , pj ] (4.1) Dans le cas o` j = i + 2, le point pi+1 est une oreille. u Thor`me 10.4.1. Tout polygone simple a n 4 sommets admet une diagonale. e e ` Version 15 janvier 2005

312

Chapitre 10. Gomtrie algorithmique e e

p q

Figure 10.4.2: Tout polygone ayant au moins 4 sommets admet une diagonale.

p i

p j

Figure 10.4.3: Preuve du thor`me de lexistence dune diagonale. e e Preuve. Soit pi un sommet convexe du polygone P , cest-`-dire tel que langle du a polygone P en pi soit de mesure (par exemple tout sommet de lenveloppe convexe du polygone P ), et soit C lensemble des sommets de P intrieur au triangle pi1 pi pi+1 . e Si C est vide alors [pi1 , pi+1 ] est une diagonale et le thor`me est dmontr ; dans le cas e e e e contraire soit pj un point de C qui ralise le maximum des distances des points de C a e ` la droite pi1 pi+1 ; alors [pi , pj ] est une diagonale de P ; ce qui termine la dmonstration e du thor`me. e e Corollaire 10.4.2. Tout polygone simple admet une triangulation.

Corollaire 10.4.3. Tout polygone simple a n 4 sommets poss`de au moins deux ` e oreilles non conscutives. e Preuve des corollaires. Nous dmontrons ces rsultats par rcurrence sur la taille du e e e polygone. Si le polygone P = [p1 , p2 , p3 ] est un triangle alors {P } est une triangulation de P et P admet trois oreilles. Si P = [p1 , p2 , p3 , p4 ] est un quadrilat`re alors, en supposant e Version 15 janvier 2005

10.4. Galerie dart

313

Figure 10.4.4: Un polygone ayant exactement deux oreilles. sans perte de gnralit que [p1 , p3 ] est une diagonale, p2 et p4 sont deux oreilles non e e e conscutives et les triangles p1 p2 p3 et p1 p4 p3 forment une triangulation de P . e Supposons maintenant que le polygone P poss`de au moins cinq sommets et soit, en e vertu du thor`me prcdent, [pi , pj ] une diagonale de P qui scinde P en deux polygones e e e e simples P1 et P2 . La runion dune triangulation de P1 et dune triangulation de P2 forme e alors une triangulation de P . Enn les polygones P1 et P2 admettent chacun une oreille distincte de pi et pj , soit par hypoth`se de rcurrence sils ont plus de 4 sommets soit e e parce quun triangle admet trois oreilles. Ces deux oreilles sont alors des oreilles non conscutives de P . e Corollaire 10.4.4. Toute triangulation dun polygone simple a n sommets est for` me de n 2 triangles. e Preuve. Raisonnons par rcurrence sur la taille n du polygone simple P . La seule e triangulation dun triangle P tant le singleton {P } le rsultat est acquis pour n = e e 3. Supposons maintenant n 4 et soit T une triangulation de P . Les artes de la e triangulation, autres que celles de P , sont des diagonales de P . Une telle arte partage e le polygone P en deux polygones P1 et P2 de tailles n1 , n2 < n et la triangulation T est la runion disjointe dune triangulation de P1 et dune triangulation de P2 . Par hypoth`se e e de rcurrence, ces deux triangulations contiennent respectivement n1 2 et n2 2 e triangles; comme n1 +n2 = n+2, la triangulation T a pour taille (n1 2)+(n2 2) = n2. Proposition 10.4.5. Toute triangulation dun polygone simple admet un et un seul coloriage, a une permutation pr`s des couleurs. ` e Preuve. Soit T une triangulation de P ; on observe que si les couleurs des sommets dun triangle T de T sont xs, la couleur des sommets des triangles adjacents a T e ` est galement xe et par suite la couleur de tout sommet dun triangle obtenu par la e e fermeture transitive R de la relation dadjacence. Pour montrer lunicit et lexistence e Version 15 janvier 2005

314

Chapitre 10. Gomtrie algorithmique e e

Figure 10.4.5: La relation dadjacence est connexe et sans cycle. dun tel coloriage, il sut de montrer que la relation dadjacence est connexe et sans cycle, cest-`-dire que pour tout triangle T T , il existe une suite a T = T 1 , . . . , Th = T de triangles adjacents et quil nexiste pas de suite circulaire de triangles adjacents de longueur suprieure a trois. Soit e ` UT = T
T

la runion des triangles T tels que T RT . Lensemble UT est non seulement un ferm, e e comme runion nie des ferms que sont les triangles T , mais est aussi un ouvert de P e e car tout point x de UT appartient a lintrieur, dans P , de la runion des triangles T ` e e qui contiennent x. Le polygone P tant connexe, il co e ncide avec UT ; ce qui prouve que la relation dadjacence est connexe. Pour dmontrer que la relation est sans cycle on observe que si T = [pi , pj , pk ] avec e i < j < k alors les triangles obtenus par adjacence avec respectivement les cts [p i , pj ], oe [pj , pk ] et [pk , pi ] se situent respectivement dans les polygones P1 = [p1 , . . . , pi , pk , . . . , pn ] P2 = [pi , . . . , pj ] P3 = [pk , . . . , pi ] qui sont disjoints deux a deux sauf en pi , pj et pk . ` Proposition 10.4.6. Pour couvrir une galerie dart a n sommets, il sut de n/3 ` gardiens. Version 15 janvier 2005

10.4. Galerie dart

315

Figure 10.4.6: n/3 gardiens sont parfois ncessaires. e Preuve. En eet il est clair que le sommet de couleur c dun triangle couvre ce triangle et que par suite lensemble des sommets de couleur c couvrent tout le polygone. Soient g1 , g2 et g3 le nombre de sommets de couleur c1 , c2 et c3 . Quitte a permuter les indices ` nous pouvons supposer que g1 g2 g3 ; de g1 + g 2 + g 3 = n on dduit e g1 n/3 En plaant les gardiens aux sommets de la couleur la moins frquente, la galerie est c e couverte par au plus n/3 gardiens. Lexemple de la gure 10.4.6 se gnralise aisment pour montrer lexistence de galerie e e e de taille n ncessitant n/3 gardiens pour la surveiller. e

10.4.3

Programme : galerie dart

Nous allons utiliser, pour la programmation du probl`me des gardiens dune galerie dart, e les types et certaines des procdures dj` employs pour le calcul de la triangulation de e ea e Delaunay. En particulier, un polygone est une suite nie de points, donc rang dans un e tableau dni par e
TYPE SuitePoints = ARRAY[1..LongueurSuite] OF Point;

La lecture des points pourrait se faire par la procdure de saisie dj` dveloppe. Il e ea e e est bien plus agrable, a lusage, de pouvoir suivre la construction du polygone, en e ` observant le contour polygonal, au fur et a mesure de sa saisie. Nous traons donc les ` c ct du polygone, d`s que nous les connaissons : oe e
PROCEDURE SaisirPolygone (VAR n: integer; VAR P: SuitePoints); VAR q: Point;

Version 15 janvier 2005

316

Chapitre 10. Gomtrie algorithmique e e


SaisieTerminee: boolean; BEGIN n := 1; SaisirPoint(P[1]); Saisie du premier sommet. NumeroterPoint(P[1], 1); Le sommet est numrot. e e REPEAT SaisirPoint(q); SaisieTerminee := SontEgauxPoints(q, P[n]); IF NOT SaisieTerminee THEN BEGIN n := n + 1; P[n] := q; Le sommet est enregistr, e NumeroterPoint(P[n], n); numrot et e e TracerSegment(P[n - 1], P[n]) reli au sommet prcdent. e e e END UNTIL SaisieTerminee; TracerSegment(P[n], P[1]); Le trac du polygone est ferm. e e END; { de "SaisirPolygone" }

La premi`re tche est de vrier si un sommet pi dun polygone P est une oreille. Pour e a e cela, on consid`re les sommets pj et pk qui le prc`dent et le suivent sur le polygone. e e e Le triangle pj pi pk doit tre direct et ne doit contenir aucun autre sommet du polygone. e Cette condition scrit comme suit : e
FUNCTION EstOreille (i, n: integer; VAR P: SuitePoints): boolean; Rpond armativement, si pi est une oreille. e VAR oreille: boolean; j, k, m: integer; BEGIN j := prec(i, n); pj prc`de pi . e e k := suiv(i, n); pk suit pi . oreille := EstAGauche(P[j], P[i], P[k]); p j pi pk est un triangle direct. m := 1; WHILE (m <= n) AND oreille DO BEGIN IF (m <> j) AND (m <> i) AND (m <> k) THEN oreille := NOT ( EstAGauche(P[j], P[i], P[m]) AND Le triangle p j pi pk ne EstAGauche(P[i], P[k], P[m]) AND contient aucun autre sommet. EstAGauche(P[k], P[j], P[m])); m := m + 1 END; EstOreille := oreille; END; { de "EstOreille" }

Pour calculer lindice prcdent et suivant modulo n, on fait appel aux deux fonctions : e e
FUNCTION suiv (i, n: integer): integer; BEGIN IF i = n THEN suiv := 1 ELSE suiv := i + 1; END; { de "suiv" }

Version 15 janvier 2005

10.4. Galerie dart


FUNCTION prec (i, n: integer): integer; BEGIN IF i = 1 THEN prec := n ELSE prec := i - 1 END; { de "prec" }

317

La premi`re peut bien sr tre programme aussi bien par 1 + i MOD n, pour la deue u e e xi`me, il ny a pas de formule aussi simple. e Pour trianguler P , nous allons dresser la liste des triangles. Un triangle est une suite de trois indices de sommets, do` les dclarations de type : u e
TYPE Triangle = ARRAY[1..3] OF integer; Triangulation = ARRAY[1..LongueurSuite] OF Triangle; SuiteIndices = ARRAY[1..LongueurSuite] OF integer;

Le dernier type servira, comme on le verra, pour le calcul des couleurs. Revenons a la ` triangulation. Lalgorithme proc`de comme suit : on cherche une oreille, ce qui nous e donne un triangle, form de loreille et des deux sommets voisins. On enl`ve loreille e e du polygone et on recommence, tant quil reste au moins trois sommets. Pour que les triangles contiennent les bons numros, ils doivent porter les numros des sommets dans e e le polygone de dpart. Il convient donc de les conserver et de les mettre a jour, dans un e ` tableau que nous appelons num. Voici la procdure : e
PROCEDURE Trianguler (n: integer; P: SuitePoints; VAR X: triangulation); Calcule dans X une triangulation du polygone P . VAR i, m: integer; num: SuiteIndices; PROCEDURE ChercherOreille (VAR i: integer); PROCEDURE CreerTriangle (i, m: integer); PROCEDURE CouperOreille (i: integer); BEGIN { de "Trianguler" } FOR i := 1 TO n DO num[i] := i; m := 0; REPEAT ChercherOreille(i); m := m + 1; CreerTriangle(i, m); CouperOreille(i); n := n - 1 UNTIL n = 2; END; { de "Trianguler" } Voir ci-dessous. Voir ci-dessous. Voir ci-dessous. Initialisation des numros. e Compte le nombre de triangles. On On On On cherche une oreille pi . cre un m-i`me triangle. e e enl`ve le sommet pi . e met a jour la taille de P . `

Voici le dtail des trois procdures employes. La recherche dune oreille se fait par un e e e parcours du polygone :
PROCEDURE ChercherOreille (VAR i: integer); BEGIN i := 1;

Version 15 janvier 2005

318

Chapitre 10. Gomtrie algorithmique e e


WHILE (i <= n) AND NOT EstOreille(i, n, P) DO i := i + 1; END; { de "ChercherOreille" }

Dans la procdure de cration du triangle, on rel`ve les numros dorigine des sommets : e e e e
PROCEDURE CreerTriangle (i, m: integer); BEGIN X[m][1] := num[prec(i, n)]; X[m][2] := num[i]; X[m][3] := num[suiv(i, n)] END; { de "CreerTriangle" }

Pour supprimer le i-i`me sommet, on dcale les autres; mais il ne faut pas oublier leurs e e numros : e
PROCEDURE CouperOreille (i: integer); VAR j: integer; BEGIN FOR j := i TO n - 1 DO BEGIN P[j] := P[j + 1]; num[j] := num[j + 1] END END; { de "CouperOreille" }

Pour visualiser la triangulation, on trace les triangles a laide de la procdure : ` e


PROCEDURE TracerTriangle (VAR P: SuitePoints; VAR t: Triangle); BEGIN TracerSegment(P[t[1]], P[t[2]]); TracerSegment(P[t[2]], P[t[3]]); TracerSegment(P[t[3]], P[t[1]]) END; { de "TracerTriangle" }

Pour colorer les sommets, on examine successivement les triangles de la triangulation. On colore arbitrairement le premier triangle, puis les triangles adjacents. On recommence jusqu` avoir color tous les triangles. Au lieu dune structure complique, nous testons a e e ladjacence dun triangle aux triangles dj` colors par le fait que deux de ses sommets ea e sont dj` colors. Voici une ralisation : ea e e
PROCEDURE Colorer (n: integer; VAR Couleur: SuiteIndices; X: Triangulation); VAR i, k, m, SommetsNonColores: integer; FUNCTION Acolorer (t: triangle): integer; Le triangle t est a colorer sil poss`de exactement un sommet incolore. ` e VAR k, j, incolores: integer; BEGIN k := 0; incolores := 0;

Version 15 janvier 2005

10.4. Galerie dart


FOR j := 1 TO 3 DO IF Couleur[t[j]] = 0 THEN BEGIN incolores := incolores + 1; k := t[j]; END; IF incolores = 1 THEN Acolorer := k ELSE Acolorer := 0 END; { de "Acolorer" } On parcourt les sommets et on compte les sommets incolores.

319

Si un seul sommet est a colorer, ` son numro est k ; e sinon, ne rien faire.

BEGIN { de "Colorer" } FOR i := 1 TO n DO Initialisation. Couleur[i] := 0; Couleur[X[1][1]] := 1; Coloration du premier triangle. Couleur[X[1][2]] := 2; Couleur[X[1][3]] := 3; SommetsNonColores := n - 3; Restent a colorer. ` WHILE SommetsNonColores > 0 DO FOR m := 2 TO n - 2 DO BEGIN k := Acolorer(X[m]); Triangle a colorer ? ` IF k > 0 THEN BEGIN La couleur complmentaire : e Couleur[k] := 6 (Couleur[X[m][1]] + Couleur[X[m][2]] + Couleur[X[m][3]]); SommetsNonColores := SommetsNonColores - 1 END END END; { de "Colorer" }

Version 15 janvier 2005

320

Chapitre 10. Gomtrie algorithmique e e

Enn, pour choisir le meilleur emplacement des gardiens, on choisi la couleur la moins frquente : e
FUNCTION LaMeilleureCouleur (n: integer; Couleur: SuiteIndices): integer; Calcule une couleur qui appara le moins souvent dans la coloration des sommets. t VAR Card: ARRAY[1..3] OF integer; Cardmin, i, c: integer; BEGIN FOR c := 1 TO 3 DO Card[c] := 0; FOR i := 1 TO n DO BEGIN Calcul des frquences. e c := Couleur[i]; Card[c] := Card[c] + 1 END; La plus petite frquence. e Cardmin := min(Card[1], min(Card[2], Card[3])); IF Card[1] = Cardmin THEN LaMeilleureCouleur := 1 ELSE IF Card[2] = Cardmin THEN LaMeilleureCouleur := 2 ELSE LaMeilleureCouleur := 3 END; { de "LaMeilleureCouleur" }

Figure 10.4.7: Une triangulation et lemplacement des gardiens.

Notes bibliographiques
Les algorithmes gomtriques ecaces sont en gnral tr`s sophistiqus. Ils font appel e e e e e e a des structures de donnes labores; de plus, lanalyse de la performance ainsi que la ` e e e Version 15 janvier 2005

10.4. Galerie dart

321

preuve dun tel algorithme sont souvent fort complexes. Ils dpassent donc le cadre de e ce livre. Un expos de synth`se est : e e R. Graham, F. Yao, A whirlwind tour of computational geometry, American Math. Monthly 97, Octobre 1990, 687701. Pour les fondements gomtriques, on pourra consulter : e e M. Berger, Gomtrie : Convexes et Polytopes, Poly`dres Rguliers, Aires et Volumes, e e e e Paris, Cedic/Fernand Nathan, 1978, Vol.3. B. Grnbaum, Convex Polytopes, London, John Wiley & Sons, London, 1967. u Les algorithmes de calcul de lenveloppe convexe et des triangulations sont dcrits dans e les ouvrages de base suivants : K. Melhorn, Data Structures and Algorithms 3, Multi-dimensional Searching and Computational Geometry, Berlin, Springer-Verlag, 1984. F.P. Preparata et M.I. Shamos, Computational Geometry : an Introduction, New York, Springer-Verlag 1985. H. Edelsbrunner, Algorithms in Combinatorial Geometry, Berlin, Springer-Verlag, 1987. Le probl`me de la galerie dart est tir de la monographie : e e J. ORourke, Art Gallery Theorems and Algorithms, London, Oxford University Press, 1987. La gomtrie algorithmique est en pleine expansion. Le rsultat le plus spectaculaire de e e e lanne 1990 fut lannonce, par B. Chazelle de luniversit de Princeton, dun algorithme e e de complexit linaire pour trianguler un polygone simple : e e B. Chazelle, Triangulating a simple polygon in linear time, Actes du colloque Foundations of Computer Science, 1990.

Version 15 janvier 2005

322

Chapitre 10. Gomtrie algorithmique e e

Version 15 janvier 2005

Partie V

Arithmtique e

323

325

Chapitre 11

Probl`mes arithmtiques e e
11.1
11.1.1

Entiers de Gauss
Enonc : entiers de Gauss e

On note K lensemble des nombres complexes de la forme a + ib avec a, b Z. On note P lensemble des lments de K de la forme a + ib avec a > 0 et b 0. ee u = qv + r et |r| < |v|

1. a) Dmontrer que pour tout u K, v K {0}, il existe q K et r K tels que e (1) b) En dduire que K est un anneau principal. e c) Ecrire une procdure qui prend en argument un lment u de K et un lment v de e ee ee K {0}, et calcule un couple (q, r) vriant les conditions (1). e

2. On dit quun lment z de K est irrductible sil appartient a P \{1} et si tous ses diee e ` viseurs dans K sont de module 1 ou |z|. On note I lensemble des lments irrductibles. ee e a) Dmontrer que si z est irrductible et divise z1 z2 , alors z divise z1 ou z divise z2 . e e b) Dmontrer que tout lment z de K {0} admet une dcomposition unique de la e ee e forme z = ic(z) xcx (z) (2)
xI

avec c(z) {0, 1, 2, 3}, cx(z) N et o` lensemble des x I tels que cx (z) = 0 est ni. u c) Dmontrer que 2 nest pas irrductible. e e 3. Soit p un nombre premier. a) Dmontrer que (p 1)! 1 mod p. e b) Dmontrer que si p 3 mod 4, il existe un unique entier naturel dp p/2 tel que e d2 1 mod p p (3) Version 15 janvier 2005

326

Chapitre 11. Probl`mes arithmtiques e e

c) Ecrire une procdure qui prend en argument un nombre premier p et qui calcule dp . e (On pourra supposer p infrieur a 104 .) e ` Exemple numrique : calculer d7001 (on admettra que 7001 est premier). e 4. a) Dmontrer que si un entier naturel irrductible p divise a + ib, alors p divise a e e et b. b) Dmontrer que si un lment z, irrductible mais nappartenant pas a N, divise un e ee e ` entier naturel n, alors |z|2 divise n. 5. a) Dmontrer quun entier naturel p est irrductible si et seulement si p est un e e nombre premier congru a 3 modulo 4. ` b) Soit z un lment de P \N. Dmontrer que les conditions suivantes sont quivalentes : ee e e (i) z est irrductible, e (ii) |z|2 est un nombre premier, (iii) |z|2 est un nombre premier non congru a 3 modulo 4. ` c) Ecrire une procdure qui teste si un lment z de P est irrductible. (On pourra e ee e supposer que |z| < 150.) Exemple numrique : z = 6 + 11i, z = 17. e 6. a) Soit p un nombre premier non congru a 3 modulo 4. Dmontrer quil existe une ` e unique paire dentiers positifs {a, b} telle que a2 + b2 = p. b) En dduire la dcomposition de p donne par (2). e e e c) Ecrire une procdure qui prend en argument un entier naturel n < 150 et qui calcule e la dcomposition de n donne par (2). e e Exemple numrique : n = 100. e 7. Soit z = u + iv un lment de K {0} et soit p un diviseur premier de |z|2 non ee congru a 3 modulo 4. Dapr`s la question prcdente, il existe une unique paire dentiers ` e e e positifs {a, b} tels que a2 + b2 = p. a) Dmontrer que si va ub est un multiple de p, alors a + ib divise z, et que si va ub e nest pas un multiple de p, alors b + ia divise z. b) Ecrire une procdure qui prend en argument un lment z de P et qui calcule la e ee dcomposition de z donne par (2) (On pourra supposer que |z| < 150). e e Exemple numrique : Dcomposer les nombres 56 + 98i et 19 + 61i. e e

11.1.2

Solution : entiers de Gauss

On appelle entier de Gauss un nombre complexe de la forme a + ib avec a, b Z. Notre propos est dtablir que lanneau K des entiers de Gauss est principal et de fournir un e algorithme de dcomposition des entiers de Gauss en produit dlments irrductibles. e ee e On dit quun anneau int`gre K est euclidien sil existe un ensemble bien ordonn (E, ) e e (cest-`-dire un ensemble E muni dune relation dordre total telle que toute partie a non vide admet un plus petit lment) et une application : K E telle que, pour ee Version 15 janvier 2005

11.1. Entiers de Gauss

327

tout v K \{0} et pour tout u K, il existe q, r K tels que u = vq +r et (r) < (v). En pratique, on prend le plus souvent E = N {}, muni de lordre naturel sur les entiers. Proposition 11.1.1. Tout anneau euclidien est principal. Notons que la rciproque est fausse : on peut prouver que lanneau Z[x], o` x = e u est principal mais pas euclidien.
1+i 19 , 2

Preuve. Soit K un anneau euclidien. Montrons dabord que, quel que soit x K \ {0}, (0) < (x). En eet, soit v K tel que (v) soit minimal. Si v = 0, on a 0 = vq + r avec (r) < (v), do` une contradiction. u Pour dmontrer que K est principal, soit I un idal non nul de K et soit v un lment e e ee non nul de I tel que (v) soit minimal dans (K \ {0}). Pour tout u I, il existe q, r K tels que u = vq + r et (r) < (v). Or r = u vq I et donc r = 0 dapr`s le e choix de v. Donc I est lidal engendr par v et K est principal. e e En particulier, on a la proposition suivante. Proposition 11.1.2. Lanneau des entiers de Gauss est principal. Preuve. Dapr`s la proposition 11.1.1, il sut de prouver que K est euclidien. Soient e u K et v K \ {0}. Posons u/v = w = x + iy et prenons des entiers m et n tels 1 que |x m| 1 et |y n| 2 (ce qui est toujours possible). Si on pose q = m + in et 2 r = u vq, il vient u = vq + r et |w q|2 1/2, do` u 1 |r| = |u vq| = |v||w q| |v| < |v| 2 Donc en prenant (v) = |v|, on en dduit que K est euclidien. e Notons P lensemble des entiers de Gauss de la forme a + ib avec a > 0 et b 0. Soit z = a + ib un lment non nul de K. Alors lun au moins des lments z = a + ib, ee ee iz = b + ia, z = a ib, iz = b ia est lment de P . En fait, tout lment non ee ee nul z de K scrit de faon unique sous la forme z = uz avec z P et u inversible e c (cest-`-dire gal a 1, i, 1 ou i). Ceci permet de raisonner uniquement dans P pour a e ` les questions de divisibilit (` un lment inversible pr`s). En particulier, on appellera e a ee e pgcd de deux lments non nuls z1 et z2 de K lunique lment d de P tel que d divise ee ee z1 et z2 , et tel que tout diviseur commun a z1 et z2 divise d. De mme, on dira quun ` e lment z de K est irrductible sil appartient a P \ {1} et si ses seuls diviseurs sont de ee e ` la forme u ou uz avec u inversible. On peut alors noncer le lemme de Gauss sous la e forme suivante. Proposition 11.1.3. Si z est irrductible et divise le produit z1 z2 , alors z divise z1 e ou z divise z2 . Version 15 janvier 2005

328

Chapitre 11. Probl`mes arithmtiques e e

Preuve. Lidal engendr par z et z1 est principal et est engendr par le pgcd d de z et e e e de z1 . Comme z est irrductible, on a d = z ou d = 1. Dans le premier cas, z divise z1 e et, dans le second cas, il existe a, b K tels que az + bz1 = 1, do`, en multipliant par u z2 , azz2 + bz1 z2 = z2 , et donc z divise z2 . Notons I lensemble des lments irrductibles de K. Tout lment z de K {0} admet ee e ee une dcomposition unique de la forme e z = ic(z)
xI

xcx (z)

avec c(z) {0, 1, 2, 3}, cx(z) N et o` lensemble des x I tels que cx (z) = 0 est ni. u Lexistence dune telle dcomposition est immdiate en raisonnant par rcurrence sur e e e |z|. Pour lunicit, on raisonne a nouveau par rcurrence sur |z| en utilisant le lemme de e ` e Gauss. Par exemple, on a 2 = i3 (1 + i)2 . Reste a dterminer les lments irrductibles. Pour cela quelques rsultats darithm` e ee e e e tique nous serons utiles. Commenons par le thor`me de Wilson. c e e Proposition 11.1.4. Un nombre entier p est premier si et seulement si (p 1)! 1 mod p.

Preuve. Si p nest pas premier, il poss`de un diviseur non trivial, et donc (p 1)! e 0 mod p. Dmontrons maintenant que si p est premier, alors (p 1)! 1 mod p. Le e cas p = 2 est trivial. Pour p impair, on peut dmontrer le rsultat de diverses mani`res. e e e En voici deux. On pose G = (Z/pZ) . a) G est un groupe dordre p 1, et donc tout lment g de G vrie g p1 = 1. Tous ee e les lments de G sont donc racines du polynme X p1 1. On a donc dans Z/pZ[X] : ee o X p1 1 = (X 1)(X 2) (X (p 1)) En substituant 0 a X, on obtient ` (1)(p1) (p 1)! 1 mod p et puisque p est impair, (1)(p1) = 1. b) Mis a part 1 et p 1, les lments de G sont distincts de leurs inverses (puisque ` ee lquation x2 = 1 ne poss`de que 2 solutions dans Z/pZ). Dans le produit de tous les e e lments de G, on peut donc regrouper chaque lment et son inverse : il reste donc le ee ee produit 1(p 1) qui est congru a 1 modulo p. ` Proposition 11.1.5. Pour tout nombre premier p tel que p 3 mod 4, il existe un unique entier naturel dp p/2 tel que d2 1 mod p. p Preuve. Si p = 2, on peut prendre dp = 1, et cest videmment la seule solution. Sinon, e puisque p 3 mod 4, p1 est pair, et on a 2 (p 1)! 1 2 Version 15 janvier 2005 p1 p1 p1 ( ) (2)(1) ( )! 2 2 2
2

mod p

11.1. Entiers de Gauss

329

Dapr`s le thor`me de Wilson, le nombre x = ( p1 )! vrie x2 1 mod p. Soit s le e e e e 2 reste de la division de x par p et soit dp = min(s, p s). On a dp p/2 par construction et d2 s2 x2 1 mod p. p Pour prouver lunicit, remarquons que lautre solution de lquation x2 + 1 = 0 (dans e e Z/pZ) est dp = p dp . Comme p est impair, on a dp > p/2. Les deux propositions qui suivent donnent des proprits lmentaires des entiers de e e ee Gauss irrductibles. e Proposition 11.1.6. Si un entier naturel irrductible p divise a + ib, alors p divise a e et b. Preuve. Puisque p irrductible, p est videmment premier. Si p divise z = a + ib, alors e e p = p divise z = a ib. Donc p divise z + z = 2a et i(z z ) = 2b. Mais puisque 2 est rductible, p est impair, et donc p divise a et b. e Proposition 11.1.7. Si un lment z de P , irrductible mais nappartenant pas a N, ee e ` divise un entier naturel n, alors |z|2 divise n. Preuve. Si z divise n, alors z divise n = n. Puisque z et z sont irrductibles et distincts, e z z divise n. Nous pouvons a prsent caractriser les entiers naturels irrductibles. ` e e e Proposition 11.1.8. Un entier naturel p est irrductible si et seulement si p est un e nombre premier congru a 3 modulo 4. De plus, tout nombre premier rductible est ` e somme de deux carrs. e Preuve. Supposons p irrductible. Alors p est videmment premier. Si p 3 mod 4, il e e existe, dapr`s la proposition 11.1.5, un entier d p/2 tel que d2 + 1 0 mod p. Alors p e divise (d i)(d + i) et puisque p est irrductible, p divise d i ou p divise d + i. Dapr`s e e la proposition 11.1.6, on en dduit p divise 1, ce qui est impossible. e Rciproquement, soit p un entier naturel premier mais rductible et soit z un diviseur e e irrductible de p. Si z est entier, alors z divise p dans N dapr`s la proposition 11.1.6, e e et comme p est premier, on a ncessairement z = p, ce qui contredit le fait que p est e rductible. Si z nest pas entier, alors |z|2 divise p dapr`s la proposition 11.1.7. Comme e e p est premier, on a p = |z|2 et donc p est somme de deux carrs. Maintenant, un carr e e est congru a 0 ou a 1 modulo 4, et donc une somme de deux carrs ne peut tre congrue ` ` e e a 3 mod 4. ` Les entiers de Gauss irrductibles autres que les entiers naturels se caractrisent de la e e faon suivante. c Proposition 11.1.9. Soit z un lment de P de partie imaginaire non nulle. Les ee conditions suivantes sont quivalentes : e (i) z est irrductible, e Version 15 janvier 2005

330 (ii) (iii)

Chapitre 11. Probl`mes arithmtiques e e |z|2 est un nombre premier, |z|2 est un nombre premier non congru a 3 modulo 4. `

Preuve. Comme on la vu plus haut, une somme de deux carrs ne peut tre congrue a e e ` 3 modulo 4. Donc (ii) et (iii) sont quivalents. e (i) entra (ii). Soit p un diviseur premier de |z|2 = z z . Par unicit de la dcomposition, ne e e p est divis soit par z, soit par z . Dans les deux cas, |z|2 divise p dapr`s la proposition e e 11.1.7 et donc p = |z|2 . (ii) entra (i). Si z = z1 z2 est une dcomposition non triviale de z, on a, en prenant ne e les modules |z|2 = |z1 |2 |z2 |2 , ce qui montre que |z|2 nest pas premier.

Pour dcomposer un entier naturel n en produit dentiers de Gauss irrductibles, on e e peut procder comme suit. On commence par dcomposer n en facteurs premiers, ce qui e e nous ram`ne a dcomposer un nombre premier p. Si p 3 mod 4, la proposition 11.1.8 e ` e montre que p est irrductible. Si par contre p 3 mod 4, p se dcompose, comme le e e montre le rsultat suivant. e Proposition 11.1.10. Pour tout nombre premier p non congru a 3 modulo 4, il existe ` une unique paire dentiers positifs {a, b} telle que a2 + b2 = p. La dcomposition de p e est alors donne par la formule p = i3 (a + ib)(b + ia). e Preuve. Soit p un nombre premier p non congru a 3 modulo 4. Dapr`s la proposition ` e 11.1.8, p est somme de deux carrs. Rciproquement, si p = a2 + b2 , o` a et b sont des e e u entiers positifs, on a p = i3 (a+ib)(b+ai) et les lments a+ib et b+ia sont irrductibles ee e dapr`s la proposition 11.1.9. Donc p = i3 (a + ib)(b + ai) est lunique dcomposition de e e p, ce qui dtermine la paire {a, b}. e On retrouve en particulier la dcomposition de 2 donne plus haut : 2 = i3 (1 + i)2 . e e Il reste a donner un algorithme pour obtenir la dcomposition dun entier de Gauss ` e z = u + iv non nul quelconque. Posons d = pgcd(u, v). Puisque z = d((u/d) + i(v/d)), on peut commencer par dcomposer d en produit dentiers irrductibles a laide de e e ` lalgorithme dcrit ci-dessus. Autrement dit, quitte a remplacer u et v respectivement e ` par u/d et v/d, on se ram`ne au cas o` u et v sont premiers entre eux, ce qui entra e u ne, dapr`s la proposition 11.1.6, que z na aucun diviseur irrductible entier. e e Soit x est un diviseur irrductible de z. Puisque x nest pas un entier naturel, la propoe sition 11.1.9 montre que |x|2 est un nombre premier non congru a 3 modulo 4 qui divise ` |z|2 . Rciproquement, soit p un facteur premier de |z|2 . Dapr`s la proposition 11.1.10, p e e se dcompose en p = i3 (a + ib)(b + ia), avec a, b > 0. Il en rsulte que a + ib est diviseur e e de |z|2 = z z et, dapr`s le lemme de Gauss, a + ib divise soit z, soit z . Par consquent e e ou bien a + ib divise z, ou bien b + ia = i(a ib) divise z. Il reste a dterminer le bon ` e facteur. Proposition 11.1.11. Si vaub est un multiple de p, alors a+ib divise z et, si vaub nest pas un multiple de p, alors b + ia divise z. Version 15 janvier 2005

11.1. Entiers de Gauss

331

Preuve. Si p = 2, on a a = b = 1 et le rsultat est clair. Sinon, on a ncessairement a = b e e sinon p = a2 + b2 ne serait pas premier. Montrons dabord que si a + ib divise z, alors p divise va ub. Posons en eet z = u + iv = (a + ib)(c + id). Alors c + id = aib (u + iv) p et donc d = vaub , ce qui montre que p divise va ub. p

Rciproquement, si p divise vaub et si a+ib ne divise pas z, alors b+ia divise z et, par e consquent, p divise vb ua dapr`s ce qui prc`de. On en dduit que p divise dune part e e e e e (vaub)+(vbua) = (v u)(a+b) et dautre part (vaub)(vbua) = (v +u)(ab). Or p ne peut diviser a + b, puisque a + b < a2 + b2 = p (le cas a + b = a2 + b2 donnant ncessairement p = 2, ce qui est exclu). Donc p divise v u et de mme p divise v + u. e e On en dduit que p divise 2u et 2v et donc aussi u et v, puisque p est impair. Par e consquent p divise z et, comme a + ib divise p, on arrive a une contradiction. e ` En rsum, pour dterminer la dcomposition de z = u+iv, on calcule donc la dcompoe e e e e sition de d = pgcd(u, v) en facteurs premiers et on dcompose ventuellement les facteurs e e premiers obtenus a laide de la proposition 11.1.10. On dcompose ensuite |z/d| 2 en ` e facteurs premiers (les facteurs premiers qui apparaissent dans cette dcomposition tant e e ncessairement non congrus a 3 modulo 4, il est inutile de tester les nombres premiers e ` de la forme 4k + 3). Chaque facteur premier p de |z/d|2 fournit un diviseur irrductible e de z. Pour obtenir ce diviseur, on recherche dabord la dcomposition (unique) de p sous e la forme p = a2 + b2 , et on choisit ensuite entre a + ib ou b + ia a laide de la proposition ` 11.1.11.

11.1.3

Programme : entiers de Gauss

La biblioth`que de manipulation des nombres complexes doit tre modie. Le type e e e complexe est remplac par un type EntierGauss : e
TYPE EntierGauss = ARRAY[0..1] OF integer;

Les fonctions de manipulation classiques ne prsentent pas de dicult. e e


FUNCTION Re (z: EntierGauss): integer; BEGIN Re := z[0] END; { de "Re" } FUNCTION Im (z: EntierGauss): integer; BEGIN Im := z[1] END; { de "Im" } FUNCTION ModuleAuCarre (z: EntierGauss): integer; BEGIN ModuleAuCarre := Sqr(Re(z)) + Sqr(Im(z)) END; { de "ModuleAuCarre" } FUNCTION Module (z: EntierGauss): real; (z)

(z)

|z| 2

|z|

Version 15 janvier 2005

332
BEGIN Module := Sqrt(ModuleAuCarre(z)) END; { de "Module"}

Chapitre 11. Probl`mes arithmtiques e e

PROCEDURE EGaussParEGauss (u, v: EntierGauss; VAR uv: EntierGauss); VAR a, b: integer; BEGIN a := Re(u) * Re(v) - Im(u) * Im(v); b := Re(u) * Im(v) + Im(u) * Re(v); CartesienEnEntierGauss(a, b, uv); END; { de "EGaussParEGauss" }

Les entres-sorties sont ralises par trois procdures : e e e e


PROCEDURE CartesienEnEntierGauss (a, b: integer; VAR z: EntierGauss); BEGIN z[0] := a; z[1] := b END; { de "CartesienEnEntierGauss" } PROCEDURE EntrerEntierGauss (VAR z: EntierGauss; titre: texte); VAR a, b: integer; BEGIN writeln; writeln(titre); write(Partie reelle : ); readln(a); write(Partie imaginaire : ); readln(b); CartesienEnEntierGauss(a, b, z) END; { de "EntrerEntierGauss" } PROCEDURE EcrireEntierDeGauss (z: EntierGauss; titre: texte); VAR a, b: integer; BEGIN write(titre); a := Re(z); b := Im(z); IF b = 0 THEN b=0 write(a : 1) ELSE BEGIN b=0 IF a <> 0 THEN write(a : 1); IF b < 0 THEN write( - ) signe ELSE IF a <> 0 THEN write( + ); IF abs(b) <> 1 THEN write(abs(b) : 1); write(i) END END; { de "EcrireEntierDeGauss" }

Version 15 janvier 2005

11.1. Entiers de Gauss

333

Contrairement a ce qui se passe dans Z, on peut raliser une division euclidienne de ` e diverses faons. Voici une possibilit, utilisant la fonction round, qui, dapr`s Jensen et c e e Wirth (Pascal, manuel de lutilisateur) est dnie ainsi : e round(s) = +k 0 k sil existe un entier k > 0 tel que k 0,5 s < k + 0,5 si 0,5 < s < 0,5 sil existe un entier k > 0 tel que k 0,5 < s k + 0,5

PROCEDURE DivisionEuclidienne (x, y: EntierGauss; VAR q, r: EntierGauss); Pour y = 0, dtermine q et r tels que x = qy + r avec |r| < |y|. e BEGIN q[0] := round((Re(x) * Re(y) + Im(x) * Im(y)) / ModuleAuCarre(y)); q[1] := round((Im(x) * Re(y) - Re(x) * Im(y)) / ModuleAuCarre(y)); r[0] := Re(x) - (Re(y) * q[0] - Im(y) * q[1]); r[1] := Im(x) - (Im(y) * q[0] + Re(y) * q[1]); END; { de "DivisionEuclidienne" }

Notre programme de dcomposition des entiers de Gauss en facteurs irrductibles fait e e appel a une procdure de dcomposition des entiers naturels en facteurs premiers. ` e e Pour cela, le plus simple est dengendrer une table des nombres premiers par un crible lmentaire. On peut ensuite, a laide de cette table, raliser une procdure qui fournit le ee ` e e plus petit diviseur premier dun entier. Bien entendu, cette mthode ne peut sappliquer e ecacement qu` de tr`s petites valeurs. Au-del`, si on vise lecacit, il faudrait avoir a e a e recours a des tests de primalit et de factorisation plus sophistiqus. ` e e
CONST NombreMax = 160; ListePremiersMax = 35; Module maximal des entiers de Gauss a dcomposer. ` e Nombre maximal de nombres premiers dans la table.

TYPE ListeNombresPremiers = ARRAY[1..ListePremiersMax] OF integer; VAR Premiers: array[2..NombreMax] of boolean; NombresPremiers: ListeNombresPremiers; PROCEDURE Crible; Engendre une table de nombres premiers par la mthode du crible. e VAR p, i, j: integer; Premiers: ARRAY[2..NombreMax] OF boolean; BEGIN FOR i := 2 TO NombreMax DO Premiers[i] := True; p := 1; FOR i := 1 TO ListePremiersMax DO BEGIN REPEAT p := p + 1 UNTIL Premiers[p]; j := p;

Version 15 janvier 2005

334
REPEAT Premiers[j] := false; j := j + p UNTIL j > NombreMax; NombresPremiers[i] := p; END; END; { de "Crible" }

Chapitre 11. Probl`mes arithmtiques e e

Voici une faon dimplmenter la recherche du plus petit diviseur premier dun entier : c e
FUNCTION FacteurPremier (n: integer): integer; Donne le plus petit diviseur premier de n. VAR racine, i, p: integer; EstCompose: boolean; BEGIN FacteurPremier := n; EstCompose := false; racine := round(sqrt(n)); i := 1; REPEAT p := NombresPremiers[i]; EstCompose := n MOD p = 0; IF EstCompose THEN FacteurPremier := p ELSE i := i + 1; UNTIL (p > racine) OR EstCompose; END; { de "FacteurPremier" }

On peut facilement convertir la procdure prcdente en test de primalit : e e e e


FUNCTION EstPremier (n: integer): boolean; BEGIN EstPremier := FacteurPremier(n) = n END; { de "EstPremier" }

La recherche de la dcomposition dun nombre premier p 3 mod 4 comme somme de e deux carrs peut seectuer de faon exhaustive de la faon suivante : e c c
PROCEDURE DeuxCarres (p: integer; VAR a, b: integer); Fournit la dcomposition dun nombre premier p 3 mod 4 comme somme de deux e carrs : p = a2 + b2 . e BEGIN a := 0; REPEAT a := a + 1 UNTIL (sqr(a) + sqr(trunc(sqrt(p - sqr(a)))) = p); b := trunc(sqrt(p - sqr(a))); END; { de "DeuxCarres" }

Version 15 janvier 2005

11.1. Entiers de Gauss

335

Sous les mmes hypoth`ses pour p, la recherche de lunique entier dp (p 1)/2 tel e e que d2 1 mod p seectue de faon exhaustive. La seule dicult est dviter le c e e p dpassement de capacit. Pour cela, on rduit modulo p a chaque tape et le passage de e e e ` e d2 + 1 a (dp + 1)2 + 1 seectue par addition de 2dp + 1. ` p
FUNCTION RacineDeMoinsUn (p: integer): integer; Si p est premier non congru a 3 mod 4, cette fonction retourne lunique entier dp ` (p 1)/2 tel que d2 1 mod p. p VAR d, d1: integer; BEGIN d := 0; d1 := 1; d1 = d2 + 1. p REPEAT d1 := (d1 + 2 * d + 1) MOD p; Pour viter le dpassement de capacit. e e e d := d + 1; UNTIL d1 = 0; RacineDeMoinsUn := d END; { de "RacineDeMoinsUn" }

Pour savoir si un entier de Gauss z est irrductible, deux cas sont possibles. Si z est un e entier naturel, on teste si z est premier et congru a 3 modulo 4. Sinon, on teste si |z| 2 ` est premier.
FUNCTION EstIrreductible (z: EntierGauss): boolean; Teste si z est irrductible. e VAR a, b: integer; BEGIN a := Re(z); b := Im(z); IF b = 0 THEN EstIrreductible := EstPremier(a) AND ((a MOD 4) = 3) ELSE EstIrreductible := EstPremier(ModuleAuCarre(z)); END; { de "EstIrreductible" }

Pour dcomposer un entier de Gauss z en produit dentiers de Gauss irrductibles, on e e g`re une liste de ses facteurs irrductibles et une variable cz, dont la valeur reprsente e e e lexposant de i dans la dcomposition de z. On mmorise galement le nombre de facteurs e e e de la dcomposition. e
CONST ListeMax = 100; Nombre maximal de facteurs irrductibles dans les listes. e

TYPE ListeEntiersGauss = array[1..ListeMax] of EntierGauss; PROCEDURE FactoriserEntierGauss (z: EntierGauss; VAR Liste: ListeEntiersGauss; VAR cz, NbFacteurs: integer); VAR

Version 15 janvier 2005

336
a, b, d, n, p: integer; x, w, r: EntierGauss;

Chapitre 11. Probl`mes arithmtiques e e

La procdure de dcomposition dun entier de Gauss en produit de facteurs irrductibles e e e fait appel a plusieurs sous-procdures. Une premi`re procdure permet dajouter un ` e e e facteur a la liste des facteurs dj` trouvs et de mettre a jour lexposant cz. ` ea e `
PROCEDURE AjouterFacteur (cx: integer; x: EntierGauss); BEGIN cz := (cz + cx) MOD 4; NbFacteurs := NbFacteurs + 1; Liste[NbFacteurs] := x; END; { de "AjouterFacteur"}

Une autre procdure donne la factorisation compl`te dun nombre premier. Rappelons e e que si p 3 mod 4, p est irrductible. Si p 1 mod 4, on a p = i3 (a + ib)(b + ia), o` e u p = a2 + b2 est lunique dcomposition de p comme somme de deux carrs. e e
PROCEDURE FactoriserPremier (p: integer); VAR a, b: integer; x: EntierGauss; BEGIN IF (p MOD 4) = 3 THEN BEGIN CartesienEnEntierGauss(p, 0, x); AjouterFacteur(0, x) END ELSE BEGIN DeuxCarres(p, a, b); CartesienEnEntierGauss(a, b, x); AjouterFacteur(0, x); CartesienEnEntierGauss(b, a, x); AjouterFacteur(3, x) END END; { de "FactoriserPremier" }

Enn, une procdure permet de dcomposer un entier naturel n en produit dentiers de e e Gauss irrductibles. e
PROCEDURE FactoriserNaturel (n: integer); Dcomposition dun entier naturel en produit dentiers de Gauss irrductibles. e e VAR p: integer; BEGIN WHILE n <> 1 DO BEGIN p := FacteurPremier(n); FactoriserPremier(p); n := n DIV p END

Version 15 janvier 2005

11.1. Entiers de Gauss


END; { de "FactoriserNaturel" }

337

Finalement la procdure de factorisation dun entier de Gauss z = u + iv peut tre e e ralise ainsi. On commence par dcomposer le pgcd de u et de v, ce qui permet de e e e se ramener au cas o` ce pgcd est gal a 1. On recherche alors les facteurs premiers de u e ` |z|2 , qui sont ncessairement non congrus a 3 modulo 4. Si p est un tel facteur et si e ` p = a2 + b2 est lunique dcomposition de p comme somme de deux carrs, lun des e e nombres a + ib ou a ib = i(b + ia) est diviseur de z, et on applique la proposition 11.1.11 pour dterminer le bon facteur. e
BEGIN { de "FactoriserEntierGauss" } NbFacteurs := 0; cz := 0; d := PGCD(Re(z), Im(z)); FactoriserNaturel(d); CartesienEnEntierGauss(Re(z) DIV d, Im(z) DIV d, w); On se ram`ne au cas z = u + iv avec pgcd(u, v) = 1. e n := ModuleAuCarre(w); WHILE n <> 1 DO BEGIN p := FacteurPremier(n); DeuxCarres(p, a, b); Dans ce cas, a + ib ou a ib = i(b + ia) est diviseur de w. IF ((Im(w) * a - Re(w) * b) MOD p) = 0 THEN CartesienEnEntierGauss(a, b, x) ELSE CartesienEnEntierGauss(b, a, x); AjouterFacteur(0, x); DivisionEuclidienne(w, x, w, r); n := ModuleAuCarre(w); END; IF Re(w) = 0 THEN Reste un nombre w de module 1. cz := (cz + 2 - Im(w)) MOD 4 Si w = i, cz := cz + 1, et si w = i, cz := cz + 3. ELSE cz := (cz + 1 - Re(w)) MOD 4; Si w = 1, cz ne change pas, et si z = 1, cz := cz + 2. END; { de "FactoriserEntierGauss" }

Pour grer les diverses procdures, on peut utiliser le menu suivant : e e


PROCEDURE Menu; VAR u, v, q, r, z: EntierGauss; Liste: ListeEntiersGauss; p, n, NbFacteurs, cz, choix: integer; BEGIN writeln(Menu); writeln((1) Division euclidienne); writeln((2) Calcul d une racine de - 1 modulo p );

Version 15 janvier 2005

338

Chapitre 11. Probl`mes arithmtiques e e


writeln((3) Teste dirreductibilit); e writeln((4) Dcomposition dun entier de Gauss); e write(Votre choix : ); readln(choix); CASE choix OF 1: BEGIN EntrerEntierGauss(u, Donner u = a + ib :); EntrerEntierGauss(v, Donner v = a + ib :); DivisionEuclidienne(u, v, q, r); EcrireEntierDeGauss(u, ); EcrireEntierDeGauss(q, = (); EcrireEntierDeGauss(v, )(); EcrireEntierDeGauss(r, ) + (); writeln()); END; 2: BEGIN write(Donner p (nombre premier non congru a 3 mod 4) : ); ` readln(p); writeln(Racine de -1 mod p = , RacineDeMoinsUn(p) : 1) END; 3: BEGIN EntrerEntierGauss(z, Donner z = a + ib :); IF EstIrreductible(z) THEN writeln(z est irrductible) e ELSE writeln(z est rductible) e END; 4: BEGIN EntrerEntierGauss(z, Donner z = a + ib (|z| < 150) : ); IF EstIrreductible(z) THEN writeln(z est irrductible); e Factorisation(z, Liste, cz, NbFacteurs); write(i^, cz : 1); EcrireListe(Liste, NbFacteurs); writeln END; OTHERWISE END END;

Voici quelques rsultats numriques. e e Pour p = 7001, on trouve dp = 1198. Lentier de Gauss 6 + 11i est irrductible, car e 36 + 121 = 157 est premier. En revanche, 17 est rductible, car 17 3 mod 4. On a e en fait 17 = i3 (1 + 4i)(4 + i). On trouve galement 100 = (1 + i)4 (1 + 2i)2 (2 + i)2 , e Version 15 janvier 2005

11.1. Entiers de Gauss 56 + 98i = i3 (7)(1 + i)2 (2 + i)(3 + 2i) et 19 + 61i = i3 (1 + i)(2 + 3i)(6 + 11i). Pour nir, voici les dcompositions des 100 premiers entiers naturels : e
2 = i3 (1 + i)2 4 = i2 (1 + i)4 6 = i3 (1 + i)2 (3) 8 = i1 (1 + i)6 10 = i2 (1 + i)2 (1 + 2i)(2 + i) 12 = i2 (1 + i)4 (3) 14 = i3 (1 + i)2 (7) 16 = (1 + i)8 18 = i3 (1 + i)2 (32 ) 20 = i1 (1 + i)4 (1 + 2i)(2 + i) 22 = i3 (1 + i)2 (11) 24 = i1 (1 + i)6 (3) 26 = i2 (1 + i)2 (2 + 3i)(3 + 2i) 28 = i2 (1 + i)4 (7) 30 = i2 (1 + i)2 (3)(1 + 2i)(2 + i) 32 = i3 (1 + i)10 34 = i2 (1 + i)2 (1 + 4i)(4 + i) 36 = i2 (1 + i)4 (32 ) 38 = i3 (1 + i)2 (19) 40 = (1 + i)6 (1 + 2i)(2 + i) 42 = i3 (1 + i)2 (3)(7) 44 = i2 (1 + i)4 (11) 46 = i3 (1 + i)2 (23) 48 = (1 + i)8 (3) 50 = i1 (1 + i)2 (1 + 2i)2 (2 + i)2 52 = i1 (1 + i)4 (2 + 3i)(3 + 2i) 54 = i3 (1 + i)2 (33 ) 56 = i1 (1 + i)6 (7) 58 = i2 (1 + i)2 (2 + 5i)(5 + 2i) 60 = i1 (1 + i)4 (3)(1 + 2i)(2 + i) 62 = i3 (1 + i)2 (31) 64 = i2 (1 + i)12 66 = i3 (1 + i)2 (3)(11) 68 = i1 (1 + i)4 (1 + 4i)(4 + i) 70 = i2 (1 + i)2 (1 + 2i)(2 + i)(7) 72 = i1 (1 + i)6 (32 ) 74 = i2 (1 + i)2 (1 + 6i)(6 + i) 76 = i2 (1 + i)4 (19) 78 = i2 (1 + i)2 (3)(2 + 3i)(3 + 2i) 80 = i3 (1 + i)8 (1 + 2i)(2 + i) 82 = i2 (1 + i)2 (4 + 5i)(5 + 4i) 84 = i2 (1 + i)4 (3)(7) 86 = i3 (1 + i)2 (43) 88 = i1 (1 + i)6 (11) 90 = i2 (1 + i)2 (32 )(1 + 2i)(2 + i) 3 = (3) 5 = i3 (1 + 2i)(2 + i) 7 = (7) 9 = (32 ) 11 = (11) 13 = i3 (2 + 3i)(3 + 2i) 15 = i3 (3)(1 + 2i)(2 + i) 17 = i3 (1 + 4i)(4 + i) 19 = (19) 21 = (3)(7) 23 = (23) 25 = i2 (1 + 2i)2 (2 + i)2 27 = (33 ) 29 = i3 (2 + 5i)(5 + 2i) 31 = (31) 33 = (3)(11) 35 = i3 (1 + 2i)(2 + i)(7) 37 = i3 (1 + 6i)(6 + i) 39 = i3 (3)(2 + 3i)(3 + 2i) 41 = i3 (4 + 5i)(5 + 4i) 43 = (43) 45 = i3 (32 )(1 + 2i)(2 + i) 47 = (47) 49 = (72 ) 51 = i3 (3)(1 + 4i)(4 + i) 53 = i3 (2 + 7i)(7 + 2i) 55 = i3 (1 + 2i)(2 + i)(11) 57 = (3)(19) 59 = (59) 61 = i3 (5 + 6i)(6 + 5i) 63 = (32 )(7) 65 = i2 (1 + 2i)(2 + i)(2 + 3i)(3 + 2i) 67 = (67) 69 = (3)(23) 71 = (71) 73 = i3 (3 + 8i)(8 + 3i) 75 = i2 (3)(1 + 2i)2 (2 + i)2 77 = (7)(11) 79 = (79) 81 = (34 ) 83 = (83) 85 = i2 (1 + 2i)(2 + i)(1 + 4i)(4 + i) 87 = i3 (3)(2 + 5i)(5 + 2i) 89 = i3 (5 + 8i)(8 + 5i) 91 = i3 (7)(2 + 3i)(3 + 2i)

339

Version 15 janvier 2005

340
92 = i2 (1 + i)4 (23) 94 = i3 (1 + i)2 (47) 96 = i3 (1 + i)10 (3) 98 = i3 (1 + i)2 (72 ) 100 = (1 + i)4 (1 + 2i)2 (2 + i)2

Chapitre 11. Probl`mes arithmtiques e e


93 = (3)(31) 95 = i3 (1 + 2i)(2 + i)(19) 97 = i3 (4 + 9i)(9 + 4i) 99 = (32 )(11)

11.2
11.2.1

Arithmtique modulaire e
Enonc : arithmtique modulaire e e

Soient m1 , m2 , . . . , mr des entiers positifs deux a deux premiers entre eux et soit ` m = m1 m2 mr . Le thor`me des restes chinois tablit lisomorphisme entre Z/mZ e e e et Z/m1 Z Z/mr Z. Pour tout entier u {0, . . . , m 1}, le r-uplet (u1 , . . . , ur ) dentiers avec 0 ui < mi et u ui mod mi pour i = 1, . . . , r est la reprsentation e modulaire de u. La reprsentation en base b de u est un vecteur U dentiers dont chaque composante U i e est comprise entre 0 et b 1 et tel que u = i0 Ui bi .

Dans la rdaction des programmes, on pourra supposer que les mi sont choisis de sorte e que m2 soit reprsentable par un entier simple prcision de lordinateur. e e i 1. Dmontrer que pour tout couple dentiers i, j avec 0 i < j r, il existe un entier e ci,j avec 0 ci,j < mj tel que ci,j mi 1 (mod mj ) et donner un algorithme pour calculer ci,j a partir de mi et mj . Ecrire une procdure ` e qui ache la table des ci,j pour les valeurs numriques donnes plus bas. e e 2. Soit (u1 , . . . , ur ) la reprsentation modulaire de u. Pour calculer la reprsentation e e en base b de u, on dnit v1 , . . . , vr avec 0 vi < mi par e v1 = u 1 v2 (u2 v1 )c1,2 (mod m2 ) v3 ((u3 v1 )c1,3 v2 )c2,3 (mod m3 ) . . . vr (. . . ((ur v1 )c1,r v2 )c2,r . . . vr1 )cr1,r Dmontrer que e u = vr mr1 m1 + . . . + v3 m2 m1 + v2 m1 + v1 3. Ecrire une procdure qui permet de passer de la reprsentation modulaire a la e e ` reprsentation en base b (avec b = 10 ou b = 100 par exemple). Ecrire une procdure e e qui permet de passer de la reprsentation en base b a la reprsentation modulaire. e ` e Version 15 janvier 2005 (mod mr )

11.2. Arithmtique modulaire e

341

4. Ecrire des procdures qui prennent en argument deux entiers en reprsentation moe e dulaire et qui fournissent leur somme, dirence, produit modulo m en reprsentation e e modulaire. 5. Les nombres de Catalan cn sont dnis par c0 = 1 et cn = k=0 ck cn1k pour e n 0. Ecrire une procdure qui calcule une table des 20 premiers nombres de Catalan e en utilisant les procdures de la question prcdente et qui ache les rsultats en base e e e e b. Pour les exemples numriques, on pourra prendre r = 8 et m1 = 99, m2 = 97, m3 = 95, e m4 = 91, m5 = 89, m6 = 83, m7 = 79, m8 = 73. (m1 m8 = 3536632852868115) 6. Dmontrer que e cn = 2n 1 n+1 n
n1

k! e (On note k = p!(kp)! ). En dduire une estimation du plus grand nombre de Catalan p que lon peut calculer avec les valeurs des mi donnes ci-dessus et acher les nombres e de Catalan jusqu` cette valeur. a

7. Une suite de Catalan de longueur 2n + 1 est une suite (a0 , a1 , . . . , a2n ) dentiers positifs ou nuls tels que a0 = a2n = 0 et |ai+1 ai | = 1 pour i = 0, . . . , 2n1. Dmontrer e que le nombre de suites de Catalan de longueur 2n + 1 est cn .

11.2.2

Solution : arithmtique modulaire e

Soient m1 , m2 , . . . , mr des entiers positifs deux a deux premiers entre eux et soit ` m = m1 m2 mr . Le thor`me des restes chinois tablit lisomorphisme entre Z/mZ et e e e Z/m1 Z Z/mr Z : Thor`me 11.2.1 (des restes chinois). Soient m1 , m2 , . . . , mr des entiers positifs pree e miers entre eux deux a deux et soit m = m1 m2 mr . Soient u1 , . . . , ur des entiers. Alors ` il existe un entier u et un seul tel que 0 u m 1 et u uj (mod mj ) pour1 j r Preuve. Par le thor`me de Bezout, il existe pour tout i = j, avec 1 i, j r, un entier e e ci,j (unique si 0 < ci,j < mj ) tel que ci,j mi 1 (mod mj ) Posons pour 1 j r Mj =
1ir i=j

(2.1)

mi ci,j

Alors Mj 1 (mod mj ) et Mj 0 (mod mi ) pour i = j, de sorte que le reste u de u1 M1 + + ur Mr modulo m vrie les conclusions du thor`me. Lunicit est e e e e immdiate. e Version 15 janvier 2005

342 Lapplication

Chapitre 11. Probl`mes arithmtiques e e

(u1 , . . . , ur ) u1 M1 + + ur Mr est un isomorphisme danneau parce que les Mj sont orthogonaux : pour i = j, on a Mi Mj 0 (mod m) et par ailleurs Mj Mj 1 (mod m). Pour tout entier u {0, . . . , m 1}, le r-uplet (u1 , . . . , ur ) dentiers avec 0 ui < mi et u ui (mod mi ) pour 1 i r est la reprsentation modulaire de u. La reprsentation e e en base b de u est un vecteur U dentiers dont chaque composante Ui est comprise entre 0 et b 1 et tel que u = i0 Ui bi . Larithmtique dite modulaire concerne les oprations arithmtiques de lanneau Z. Ces e e e oprations sont en fait eectues modulo m, o` m est un entier choisi susamment grand e e u pour que le rsultat modulo m soit gal au rsultat dans Z. Les oprations modulo m e e e e sont, a leur tour, eectues dans la reprsentation modulaire, cest-`-dire composante par ` e e a composante. Les oprations arithmtiques sont tr`s peu coteuses; en revanche, pour que e e e u le rsultat soit lisible, il doit tre converti en une reprsentation plus commode, comme e e e la reprsentation dcimale. La programmation des oprations arithmtiques modulaires e e e e est facile. Reste a considrer la conversion entre les deux reprsentations. On utilise pour ` e e cela la proposition qui suit. Proposition 11.2.2. Soit (u1 , . . . , ur ) la reprsentation modulaire de u, et soient e v1 , . . . , vr avec 0 vi < mi dnis par e v1 = u 1 v2 (u2 v1 )c1,2 (mod m2 ) v3 ((u3 v1 )c1,3 v2 )c2,3 (mod m3 ) . . . vr (. . . ((ur v1 )c1,r v2 )c2,r . . . vr1 )cr1,r Alors u = vr mr1 m1 + . . . + v3 m2 m1 + v2 m1 + v1 Preuve. Dapr`s la dnition de la reprsentation modulaire, il sut de prouver que e e e ui vi mi1 m1 + . . . + v3 m2 m1 + v2 m1 + v1 Considrons e vi (. . . ((ui v1 )c1,i v2 )c2,i . . . vi1 )ci1,i En multipliant par mi1 , on obtient en utilisant (2.1) vi mi1 + vi1 (. . . ((ui v1 )c1,i v2 )c2,i . . . vi2 )ci2,i et plus gnralement, pour 1 k i 1, e e vi mi1 mik + + vik+1 mik + vik (. . . ((ui v1 )c1,i v2 )c2,i . . . vi(k+1) )ci(k+1),i Version 15 janvier 2005 (mod mi ) (mod mi ) (mod mi ) (mod mi ) 1ir (2.2) (mod mr )

11.2. Arithmtique modulaire e ce qui donne (2.2) pour k = i 1.

343

Lexpression donne pour u dans cette proposition en permet lvaluation par un schma e e e de Horner : lopration rpte consiste a raliser s := smi + vi . Ceci peut tre fait sans e e ee ` e e dicult sur des entiers en multiprcision, si mi et vi sont des entiers simple prcision. e e e Rciproquement, pour passer dune reprsentation en base b a la reprsentation modue e ` e laire, il sut dvaluer u = i0 Ui bi modulo mj pour chaque j, encore une fois par le e schma de Horner. e Comme exemple de calcul, considrons les nombres de Catalan. Ils sont dnis par e e cn = 1 2n n+1 n (2.3)

k! (On note k = p!(kp)! .) Les nombres de Catalan interviennent en combinatoire dans de p tr`s nombreuses situations. Nous les avons dj` rencontrs au chapitre 9, o` nous avons e ea e u prouv quils comptent les mots de Lukasiewicz. Voici un exemple similaire : appelons e suite de Catalan de longueur n + 1 une suite (a0 , a1 , . . . , an ) dentiers positifs ou nuls tels que a0 = an = 0 et |ai+1 ai | = 1 pour i = 0, . . . , n 1. En fait, lentier n est ncessairement pair. e

Proposition 11.2.3. Le nombre de suites de Catalan de longueur 2k + 1 est ck . Preuve. Soit u = (u0 , . . . , un ) une suite dentiers avec ui 0, 1. On pose
j

s(u, j) =
i=0

ui

j = 0, . . . , n

Avec la terminologie du chapitre 9, la suite u est un mot de Lukasiewicz si et seulement si s(u, n) = 1 et s(u, j) 0 pour 0 j n 1. Si u est un mot de Lukasiewicz, alors la suite (0, s(u, 0), . . . , s(0, n 1)) est une suite de Catalan. Rciproquement, si e (a0 , a1 , . . . , an ) est une suite de Catalan, alors (a1 a0 , a2 a1 , . . . , an an1 , 1) est un mot de Lukasiewicz. Il y a donc bijection entre les mots de Lukasiewicz de longueur n et les suites de Catalan de longueur n. La proposition est alors une consquence du e corollaire 9.2.7. Bien entendu, on peut aussi prouver la proposition directement. Pour le calcul en arithmtique modulaire, la formule (2.3) nest utilisable que si les dnominateurs sont e e inversibles pour tous les modules mj , ce qui nest pas le cas si lon choisit par exemple m1 = 99. Les calculs doivent donc tre organiss diremment. Pour cela, on prouve e e e que
n1

cn =
k=0

ck cnk1

(2.4)

On peut vrier cette formule directement ou encore considrer la srie e e e c(z) =


n=0

cn z n Version 15 janvier 2005

344

Chapitre 11. Probl`mes arithmtiques e e

Par la formule de Stirling (n! nn en 2n), on a cn

4n (n + 1) n

donc la srie converge pour |z| susamment petit et on a e 1 1 4z c(z) = 2z Par consquent, c(z) vrie lquation e e e c(z) = 1 + z(c(z))2 do` lon dduit par identication c0 = 1 et la formule (2.4). Cette expression est longue u e a valuer mais se prte au calcul en arithmtique modulaire. Si lon prend r = 8 et ` e e e m1 = 99, m2 = 97, m3 = 95, m4 = 91, m5 = 89, m6 = 83, m7 = 79, m8 = 73, alors m = m1 m8 = 3536632852868115, et lexpression asymptotique des nombres de Catalan montre, avec un petit calcul, que lon peut valuer cn pour n 29. e

11.2.3

Programme : arithmtique modulaire e

Soit m > 1 un entier et soit a un entier premier a m. Le thor`me de Bezout arme ` e e lexistence dentiers uniques x et y tels que 0 < x < m, 0 < y < a et ax + my = 1 (2.5)

Il en rsulte que ax 1 mod m. Le calcul de x peut tre fait en recherchant les couples e e (x, y) vriant (2.5). Pour cela, considrons la suite des divisions euclidiennes successives e e ralises pour le calcul du pgcd de a et de m : on pose r0 = a, r1 = m, et on dnit qk e e e et rk+2 , pour k 0, par rk = qk rk+1 + rk+2 avec rk+1 = 0 et 0 rk+2 < rk+1 Soient alors (x0 , x1 ) = (1, 0), (y0 , y1 ) = (0, 1) et, pour k 0, xk+2 = xk xk+1 qk yk+2 = yk yk+1 qk On vrie alors que pour tout k tel que rk est dni, on a e e rk = x k a + y k m Notamment, si k est le plus petit entier tel que rk+1 = 0, alors rk = pgcd(a, m) et les entiers xk ,yk sont des coecients pour lidentit de Bezout. Dans le cas particulier o` a e u et m sont premiers entre eux, on a 1 xk a (mod m) Version 15 janvier 2005

11.2. Arithmtique modulaire e Ceci conduit a la procdure : ` e

345

FUNCTION Inverse (x, m: integer): integer; Calcule linverse de x (mod m) par adaptation de lalgorithme dEuclide. On suppose x et m premiers entre eux. VAR r0, r1, r2, x0, x1, x2, q: integer; BEGIN x0 := 1; x1 := 0; r0 := x; r1 := m; Initialisation. WHILE r1 <> 0 DO BEGIN q := r0 DIV r1; r2 := r0 - q * r1; x2 := x0 - q * x1; Calcul. x0 := x1; x1 := x2; r0 := r1; r1 := r2 Copie. END; x0 := x0 MOD m; IF x0 < 0 THEN x0 := x0 + m; Pour rtablir le modulo. e Inverse := x0 END; { de "Inverse" }

Les reprsentations modulaires sont des tableaux dentiers. On dnit donc : e e


CONST TailleMod = 8; TYPE EntierMod = ARRAY[1..TailleMod] OF integer; VAR m: EntierMod; c: ARRAY[1..TailleMod, 1..TailleMod] OF integer;

On dclare aussi deux tableaux spciques, lun qui contient les modules mj , lautre qui e e contient les coecients ci,j ncessaires a la conversion. Nous initialisons, pour xer les e ` ides, e
PROCEDURE InitModules; BEGIN m[1] := 99; m[2] := 97; m[5] := 89; m[6] := 83; END; { de "InitModules" }

m[3] := 95; m[7] := 79;

m[4] := 91; m[8] := 73

et calculons la table des ci,j (il sut de la calculer pour 1 i < j r) par :
PROCEDURE InitInverses; VAR i, j: integer; BEGIN FOR i := 1 TO TailleMod DO FOR j := i + 1 TO TailleMod DO c[i, j] := Inverse(m[i], m[j]) END; { de "InitInverses" }

On obtient : Version 15 janvier 2005

346
La table des inverses : 49 24 57 9 26 4 59 48 76 78 6 22 70 23 15 7 5 10 45 52 33 69 14 8 32 20 22 61

Chapitre 11. Probl`mes arithmtiques e e

Considrons dabord les conversions. Des entiers en multiprcision, tels que prsents e e e e au chapitre suivant, on nutilise que le type :
TYPE chiffre = integer; entier = ARRAY[-2..TailleMax] OF chiffre;

et les procdures : e
PROCEDURE EntierPlusChiffre (u: entier; x: chiffre; VAR w: entier); PROCEDURE EntierParChiffre (u: entier; x: chiffre; VAR w: entier); PROCEDURE ChiffreEnEntier (x: chiffre; VAR u: entier); FUNCTION Taille (VAR u: entier): integer; PROCEDURE FixerSigne (VAR u: entier; s: integer); PROCEDURE EcrireEntier (VAR u: entier; titre: texte);

La conversion de la reprsentation en base b en reprsentation modulaire se fait comme e e suit :


PROCEDURE EntierEnEntierMod (a: Entier; VAR u: EntierMod); VAR k: integer; BEGIN FOR k := 1 TO TailleMod DO u[k] := EvalueMod(a, m[k]) END; { de "EntierEnEntierMod" }

La procdure EvalueMod value lentier a modulo son deuxi`me argument, par le schma e e e e de Horner :
FUNCTION EvalueMod (VAR a: Entier; m: integer): integer; VAR k, aModm: integer; BEGIN aModm := 0; FOR k := Taille(a) DOWNTO 0 DO aModm := (aModm * base + a[k]) MOD m; EvalueMod := aModm END; { de "EvalueMod" }

Rciproquement, le calcul de la reprsentation en base b a partir de la reprsentation e e ` e modulaire se fait en deux tapes. Dans une premi`re phase, on calcule les coecients v j e e donns par la proposition 11.2.2 : e Version 15 janvier 2005

11.2. Arithmtique modulaire e


PROCEDURE Conversion (u: EntierMod; VAR v: EntierMod); VAR j, k, z: integer; BEGIN FOR k := 1 TO TailleMod DO BEGIN z := u[k] MOD m[k]; FOR j := 1 TO k - 1 DO z := ((z - v[j]) * c[j, k]) MOD m[k]; IF z < 0 THEN v[k] := z + m[k] ELSE v[k] := z END; END; { de "Conversion" }

347

Ensuite, on utilise ces coecients pour valuer, essentiellement par un schma de Horner, e e la reprsentation en base b. La procdure suivante contient lappel a la procdure de e e ` e conversion :
PROCEDURE EntierModEnEntier (u: EntierMod; VAR a: Entier); VAR k: integer; v: EntierMod; BEGIN Conversion(u, v); Coecients de conversion. ChiffreEnEntier(v[TailleMod], a); a := v r . FixerSigne(a, 1); FOR k := TailleMod - 1 DOWNTO 1 DO BEGIN EntierParChiffre(a, m[k], a); a := amk + vk . EntierPlusChiffre(a, v[k], a) END; END; { de "EntierModEnEntier" }

Maintenant que nous disposons des procdures de conversion, nous pouvons considrer e e larithmtique modulaire proprement dite. Les oprations, avons-nous dit, se font coefe e cient par coecient. On crit donc : e
PROCEDURE EntierModPlusEntierMod (u, v: EntierMod; VAR w: EntierMod); VAR k: integer; BEGIN FOR k := 1 TO TailleMod DO w[k] := SommeMod(u[k], v[k], m[k]); END; { de "EntierModPlusEntierMod" } PROCEDURE EntierModMoinsEntierMod (u, v: EntierMod; VAR w: EntierMod); VAR k: integer; BEGIN FOR k := 1 TO TailleMod DO

Version 15 janvier 2005

348

Chapitre 11. Probl`mes arithmtiques e e


w[k] := DifferenceMod(u[k], v[k], m[k]); END; { de "EntierModMoinsEntierMod" }

PROCEDURE EntierModParEntierMod (u, v: EntierMod; VAR w: EntierMod); VAR k: integer; BEGIN FOR k := 1 TO TailleMod DO w[k] := ProduitMod(u[k], v[k], m[k]); END; { de "EntierModParEntierMod" }

Les oprations lmentaires sont : e ee


FUNCTION SommeMod (x, y, m: integer): integer; BEGIN IF x + y >= m THEN SommeMod := x + y - m ELSE SommeMod := x + y END; { de "SommeMod" } FUNCTION DifferenceMod (x, y, m: integer): integer; BEGIN IF x < y THEN DifferenceMod := x - y + m ELSE DifferenceMod := x - y END; { de "DifferenceMod" } FUNCTION ProduitMod (x, y, m: integer): integer; BEGIN ProduitMod := (x * y) MOD m END; { de "ProduitMod" }

Pour calculer commodment la reprsentation modulaire dun entier en simple prcision, e e e on utilise :
PROCEDURE ChiffreEnEntierMod (x: chiffre; VAR a: EntierMod); VAR k: integer; BEGIN FOR k := 1 TO TailleMod DO a[k] := x MOD m[k] END; { de "ChiffreEnEntierMod" }

Le calcul des nombres de Catalan se fait dans une table, dnie par : e
CONST TailleSuite = 30; TYPE SuiteEntierMod = ARRAY[0..TailleSuite] OF EntierMod;

La procdure scrit : e e
PROCEDURE SuiteCatalan (VAR c: SuiteEntierMod; r: integer); VAR n, k: integer; p, s: EntierMod;

Version 15 janvier 2005

11.2. Arithmtique modulaire e


BEGIN ChiffreEnEntierMod(1, c[0]); FOR n := 1 TO r DO BEGIN ChiffreEnEntierMod(0, s); FOR k := 0 TO n - 1 DO BEGIN EntierModParEntierMod(c[k], c[n - 1 - k], p); EntierModPlusEntierMod(s, p, s) END; c[n] := s END; END; { de "SuiteCatalan" }

349

c0 = 1. s := 1. p := c k cn1k . s := s + p.

On obtient
c[0] = 1 c[1] = 1 c[2] = 2 c[3] = 5 c[4] = 14 c[5] = 42 c[6] = 1 32 c[7] = 4 29 c[8] = 14 30 c[9] = 48 62 c[10] = 1 67 96 c[11] = 5 87 86 c[12] = 20 80 12 c[13] = 74 29 00 c[14] = 2 67 44 40 c[15] = 9 69 48 45 c[16] = 35 35 76 70 c[17] = 1 29 64 47 90 c[18] = 4 77 63 87 00 c[19] = 17 67 26 31 90 c[20] = 65 64 12 04 20 c[21] = 2 44 66 26 70 20 c[22] = 9 14 82 56 36 40 c[23] = 34 30 59 61 36 50 c[24] = 1 28 99 04 14 73 24 c[25] = 4 86 19 46 40 14 52 c[26] = 18 36 73 53 07 21 52 c[27] = 69 53 35 50 91 60 04 c[28] = 2 63 74 79 51 75 03 60 c[29] = 10 02 24 22 16 65 13 68 c[30] = 2 78 35 36 49 22 41 89

La derni`re valeur nest juste que modulo 3536632852868115. e Version 15 janvier 2005

350

Chapitre 11. Probl`mes arithmtiques e e

Notes bibliographiques
Les entiers de Gauss sont traits dans de tr`s nombreux ouvrages dalg`bre ou de thorie e e e e des nombres. Pour les replacer dans un contexte un peu plus gnral, on pourra consulter e e le petit livre de P. Samuel : P. Samuel, Thorie algbrique des nombres, Paris, Hermann, 1967. e e

Version 15 janvier 2005

351

Chapitre 12

Grands nombres
12.1
12.1.1

Entiers en multiprcision e
Enonc : entiers en multiprcision e e

Les oprations arithmtiques sur de grands entiers se ralisent de la faon suivante. e e e c Soient N > 0 et b 2 des entiers; tout entier positif u < bN scrit de faon unique e c
n

u=
i=0

ui b i

avec 0 n < N , 0 ui < b et un = 0. La suite (un , . . . , u0 ) est la reprsentation de u e (en base b). On crira u = (un , . . . , u0 ). La reprsentation de 0 est (0). Tout entier de e e valeur absolue < bN est dcrit par son signe et la reprsentation de sa valeur absolue. e e Les oprations arithmtiques sont a implmenter dans cette reprsentation. On pourra e e ` e e prendre b = 100 et N = 10 (ou plus). 1. Ecrire une procdure pour laddition de grands entiers. e Les nombres de Fibonacci sont dnis par F0 = 0, F1 = 1 et, pour n 0, Fn+2 = e Fn+1 + Fn . 2. Jusqu` quel indice peut-on calculer les nombres de Fibonacci lorsque b = 100 et a N = 10? Ecrire une procdure calculant ces nombres de Fibonacci. e 3. Ecrire des procdures pour la comparaison, la soustraction, la multiplication de e grands entiers. Soient u = (un+1 , . . . , u0 ) et v = (vn , . . . , v0 ) tels que q = [u/v] < b, et soit q = min(b 1, un+1 b + un ) vn Version 15 janvier 2005

352 (On note [x] la partie enti`re de x.) e 4. Dmontrer que q q. e 5. Dmontrer que si vn [b/2], alors q 2 q. e

Chapitre 12. Grands nombres

6. Soit d = [b/(1 + vn )] et v = dv. Dmontrer que v = (vn , . . . , v0 ) et que vn [b/2]. e 7. En dduire un algorithme qui calcule le quotient et le reste de la division enti`re e e de u = (um , . . . , u0 ) par v = (vn , . . . , v0 ). 8. Ecrire une procdure calculant le pgcd de deux grands entiers. Utilisez-la pour e vrier exprimentalement lgalit e e e e pgcd(Fn , Fm ) = Fpgcd(n,m) 9. Dmontrer cette formule. e

12.1.2

Solution : entiers en multiprcision e

En Pascal, les entiers reprsentables par le type integer sont de taille limite (entre 2 15 e e et 215 1 sur un micro). La manipulation de grands entiers exige donc la programmation dun certain nombre de procdures qui eectuent les oprations arithmtiques sur des e e e reprsentations appropries dentiers de grande taille. Nous considrons le cadre que e e e voici. Soient N > 0 et b 2 deux entiers; tout entier positif u < bN scrit de faon unique e c
n

u=
i=0

ui b i

avec 0 n < N , 0 ui < b et un = 0. La suite (un , . . . , u0 ) est la reprsentation e de u (en base b). On crira u = (un , . . . , u0 ). Chaque ui sera appel un chire. La e e reprsentation de 0 est (0). Tout entier de valeur absolue < bN est dcrit par son signe e e et la reprsentation de sa valeur absolue. Dans la pratique, on voudrait que la base b soit e la plus grande possible, mais pour eectuer simplement les oprations sur les chires, on e demande que b2 soit major par le plus grand entier reprsentable. De plus, pour viter e e e une conversion longue, on choisit pour b une puissance de 10. Cela ne laisse que b = 10 ou b = 100. Si lon se permet lemploi du type longint, on peut prendre b = 10 000, ce qui est plus satisfaisant. En codant les entiers par des rels, on peut aller un peu plus e loin encore au moyen de quelques acrobaties que nous ne considrons pas ici. e Les oprations daddition, de soustraction et de multiplication de grands entiers se e ralisent en transcrivant lalgorithme scolaire qui op`re sur les chires. Pour laddition e e de deux entiers naturels (un , . . . , u0 ) et (vn , . . . , v0 ) par exemple, que nous supposons pour simplier de mme taille, on value les chires e e wi = u i + v i + r i (mod b) ri+1 = (ui + vi + ri )/b Version 15 janvier 2005

12.1. Entiers en multiprcision e

353

o` r0 = 0 (on note x la partie enti`re de x). Cette opration nest pas dicile a u e e ` programmer. La division de deux entiers naturels est plus dlicate. La mthode scolaire consiste a e e ` estimer, de mani`re un peu empirique, le chire suivant du quotient, puis a vrier quil e ` e est correct. Nous allons procder de mani`re similaire. e e La premi`re mthode qui vient a lesprit est tr`s longue : pour dterminer un chire, e e ` e e disons le premier, du quotient dun entier u = (un , . . . , u0 ) par un entier v = (vm , . . . , v0 ), on peut soustraire de u le nombre vbnm tant que le rsultat de la soustraction reste e positif. Il est clair que le nombre de soustractions est considrable (b/2 pour un chire e en moyenne). Nous cherchons un procd plus rapide. e e Rduit a son essence, le probl`me est donc de dterminer, de faon conomique, le e ` e e c e quotient entier q de deux nombres u = (un+1 , . . . , u0 ) et v = (vn . . . , v0 ). Notons dabord que lentier q dpend de tous les chires de u et ne peut donc tre dtermin sans e e e e examiner u en entier. Ainsi, en base 10, le quotient de u = 100 002 par v = 50 001 est 2, alors que le quotient entier de 100 001 par v est 1. Il existe un algorithme qui, moyennant un prtraitement des nombres u et v, permet e destimer un chire du quotient avec une erreur dau plus 2. Le nombre de soustractions a faire est donc major par 3 et, surtout, est indpendant de la base. La mthode proc`de ` e e e e en deux tapes. On calcule dabord un quotient approch, par la formule e e p = (un+1 b + un )/vn (1.1)

puis on lajuste pour obtenir le quotient exact q. Si lon ny prend garde, la valeur de p peut tre tr`s loigne de celle de q. Ainsi, en base 100, pour e e e e u = (1, 80, . . .) v = (2, . . .)

on a p = 90, mais le quotient exact est q = 60 si u = 1 80 00 00 00 et v = 2 99 99 et toutes les valeurs intermdiaires entre 60 et 90 sont possibles. En revanche, et toujours e en base 100, pour u = (30, 60, . . .) v = (51, . . .) on a p = 60, et q = 58 si u = 30 60 00 et v = 51 99. Nous allons montrer que ce dernier phnom`ne, a savoir p q 2, est gnral moyennant une condition qui nest pas trop e e ` e e dicile a raliser. ` e Soient donc u = (un+1 , . . . , u0 ) v = (vn , . . . , v0 ) avec vn = 0, et supposons u/v b 1. Soit u = qv + r avec 0 r < v Version 15 janvier 2005

354

Chapitre 12. Grands nombres

la division euclidienne de u par v, avec q = u/v . Avec le quotient approch p donn e e par lquation (1.1), posons e q = min(b 1, p) Les deux propositions suivantes montrent que q approche assez bien le quotient exact q. Proposition 12.1.1. On a q q. Preuve. Comme q b 1, lingalit est vraie si p > b. Si p b 1, alors notons que e e p un+1 b + un vn 1 vn vn

do` vn p un+1 b + un vn + 1. Il en rsulte que u e u pv u pvn bn (u un+1 bn+1 un bn ) + vn bn bn < bn + vn bn bn v On a donc u pv < v, do` u pv u qv, soit q p. u Preuve. Si v = bn , alors Proposition 12.1.2. Si vn b/2 , alors q 2 q. un+1 bn+1 + un bn vn bn u =q bn

p=

et q = q. On peut donc supposer v = bn . On a alors q un+1 bn+1 + un bn u u un+1 b + un = < vn vn bn vn bn v bn

la derni`re ingalit provenant de ce que v < (vn + 1)bn . e e e Supposons alors la conclusion fausse, soit q + 3 q . Comme q b 1, il en rsulte que e q= Par ailleurs, on a q u/v 1, do` u 3qq < ou encore u u ubn u bn +1= + 1, soit 2 < , v bn v (v bn )v v v bn u b4 v (1.2)

v bn u > 2 n 2(vn 1) v b et comme vn > b/2 1, il en rsulte que u/v b 3, en contradiction avec (1.2). e Ces deux propositions montrent que lun des trois nombres q , q 1, q 2 est le quotient exact. Il reste a trouver une faon simple de satisfaire la condition de la proposition ` c 12.1.2. Version 15 janvier 2005

12.1. Entiers en multiprcision e

355

Proposition 12.1.3. Soit v = v b/(1 + vn ) . Alors v < bn et on a vn b/2 , avec v = (vn , . . . , v0 ). Preuve. Posons d = b/(1 + vn ) et eectuons la multiplication de v par d : on a v0 d = r1 b + v0 , avec 0 v0 < b et r1 < d. Plus gnralement, supposant rk < d, pour e e k 1, on a vk d + rk = rk+1 b + vk 0 vk < b, 0 rk+1 < d Comme on a rn+1 = 0 et v < bn . Par ailleurs, on a vn vn b/(1 + vn ) . Pour montrer que vn b/2 , nous vrions e que x b/(1 + x) b/2 pour tout entier x, avec 1 x < b. Ceci est vrai si x b/2 . Si 1 x < b/2 , alors x b b >x 1+x 2 b b x1 1 = 1+x 2 x+1 b x 1 1 1 2 vn d + rn < (vn + 1) b/(1 + vn ) b

puisque b/2 x + 1. On a donc x b/(1 + x) > b/2 1. Ceci prouve la deuxi`me e assertion. Disons que v est normalis si vn b/2 . La division de u = (un+1 , . . . , u0 ) par v = e (vn , . . . , v0 ), lorsque u/v b 1 et v est normalis, peut donc se faire comme suit : e dans une premi`re tape, calculer q ; ensuite, si u q v 0, alors q = q , sinon, si e e u ( 1)v 0, alors q = q 1, et sinon q = q 2. Cet algorithme est mis en uvre sur q des couples (u, v) quelconques en normalisant dabord v et en multipliant u par le mme e facteur; ensuite, les chires du quotient sont dtermins en divisant u par des dcals e e e e vbk de v. Enn, le reste de la division est obtenu en annulant leet de la normalisation.

12.1.3

Programme : entiers en multiprcision e


n

Soit b 2 la base choisie. Un entier positif u admet un dveloppement unique e u=


k=0

uk b k ,

0 uk < b

dans cette base. La reprsentation e (un , . . . , u0 ) de u est range dans un tableau. En vue dviter des calculs inutiles, on mmorise e e e galement lindice n du premier chire non nul du dveloppement de u en base b. Ape e pelons cet indice la taille de u. (Si u = 0, sa taille est xe arbitrairement a un entier e ` ngatif.) Un entier naturel est donc dcrit par un tableau de chires (relativement a la e e ` base) et par sa taille; un entier relatif comporte, en plus, son signe. Ceci conduit a la ` structure suivante : Version 15 janvier 2005

356
CONST base = 100; DecimauxParChiffre = 2; chire . TailleMax = 20; TailleEntierNul = -1; TYPE chiffre = integer; entier = ARRAY[-2..TailleMax] OF chiffre;

Chapitre 12. Grands nombres

Nombre de chires dcimaux pour crire un e e

Le choix de la base nest pas gratuit. Dabord, une base qui est une puissance de 10 permet de lire et dcrire des entiers (presque) sans conversion. Ensuite, la base b doit e tre telle que lentier b2 est infrieur au plus grand entier reprsentable dans la machine, e e e ceci pour pouvoir au moins faire le produit de deux chires (relativement a b) sans ` dbordement. Ceci conduit au choix fait. Toutefois, nous allons galement nous permee e ttre la base 10 000, en manipulant des chires dnis comme longint. Lintroduction e du type chire permet une conversion instantane a cette situation. e ` Dans lemplacement dindice 1 du tableau dun entier on range sa taille, et dans lemplacement dindice 2 son signe. Il y a videmment de larbitraire dans cette cone vention, mais de toute faon le choix est masqu par les fonctions dacc`s et de modic e e cation de taille et de signe qui sont les suivantes :
FUNCTION Taille (VAR u: entier): integer; PROCEDURE FixerTaille (VAR u: entier; p: integer); FUNCTION LeSigne (VAR u: entier): integer; PROCEDURE FixerSigne (VAR u: entier; s: integer); FUNCTION EstEntierNul (VAR u: entier): boolean;

et qui se ralisent, dans notre reprsentation, par : e e


FUNCTION Taille (VAR u: entier): integer; BEGIN Taille := u[-1] END; { de "Taille" } PROCEDURE FixerTaille (VAR u: entier; p: integer); BEGIN u[-1] := p END; { de "FixerTaille" } FUNCTION LeSigne (VAR u: entier): integer; BEGIN LeSigne := u[-2] END; { de "LeSigne" } PROCEDURE FixerSigne (VAR u: entier; s: integer); BEGIN u[-2] := s END; { de "FixerSigne" } FUNCTION EstEntierNul (VAR u: entier): boolean;

Version 15 janvier 2005

12.1. Entiers en multiprcision e


BEGIN EstEntierNul := Taille(u) = TailleEntierNul END; { de "EstEntierNul" }

357

Ainsi, pour aecter lentier nul a une variable, on utilise la procdure : ` e


PROCEDURE EntierNul (VAR u: entier); BEGIN FixerTaille(u, TailleEntierNul); FixerSigne(u, 1); END; { de "EntierNul" }

Les oprations arithmtiques sur les entiers se ralisent en transcrivant lalgorithme e e e scolaire qui, lui, op`re sur les chires. Ainsi laddition de deux chires x et y, en prsence e e dune retenue r, se fait par les formules z = x + y + r (mod b) r = (x + y + r)/b o` r est la nouvelle retenue. Cette opration lmentaire et ses trois consurs sont u e ee prises en charge par les procdures : e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE SommeChiffres (x, y: chiffre; VAR z, r: chiffre); DifferenceChiffres (x, y: chiffre; VAR z, r: chiffre); ProduitChiffres (x, y: chiffre; VAR z, r: chiffre); DivisionChiffres (x, y: chiffre; VAR z, r: chiffre);

Elles scrivent comme suit : e


PROCEDURE SommeChiffres (x, y: chiffre; VAR z, r: chiffre); BEGIN z := x + y + r; IF z >= base THEN BEGIN z := z - base; r := 1 END ELSE r := 0; END; { de "SommeChiffres" } PROCEDURE DifferenceChiffres (x, y: chiffre; VAR z, r: chiffre); BEGIN z := x - y - r; IF z < 0 THEN BEGIN z := z + base; r := 1 END ELSE r := 0; END; { de "DifferenceChiffres" } PROCEDURE ProduitChiffres (x, y: chiffre; VAR z, r: chiffre); VAR

Version 15 janvier 2005

358
s: chiffre; BEGIN s := x * y + r; z := s MOD base; r := s DIV base END; { de "ProduitChiffres" }

Chapitre 12. Grands nombres

PROCEDURE DivisionChiffres (x, y: chiffre; VAR z, r: chiffre); VAR s: chiffre; BEGIN s := x + r * base; z := s DIV y; r := s MOD y END; { de "DivisionChiffres" }

A laide de ces procdures, nous mettons en place des procdures de manipulation e e dentiers, sans considration du signe, a savoir : e `
PROCEDURE NaturelPlusNaturel (VAR u, v, w: entier); PROCEDURE NaturelMoinsNaturel (VAR u, v, w: entier); PROCEDURE NaturelParNaturel (u, v: entier; VAR w: entier); PROCEDURE NaturelDivEuclNaturel (u, v: entier; VAR q, r: entier); FUNCTION CompareNaturel (VAR u, v: entier): integer;

Ces procdures sont ensuite tendues aux entiers avec signe. Les noms correspondants e e sont :
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE EntierPlusEntier (u, v: entier; VAR w: entier); EntierMoinsEntier (u, v: entier; VAR w: entier); EntierParChiffre (u: entier; x: chiffre; VAR w: entier); EntierParEntier (u, v: entier; VAR w: entier); EntierDivEuclEntier (u, v: entier; VAR q, r: entier); EntierModEntier (u, v: entier; VAR w: entier); EntierDivEntier (u, v: entier; VAR w: entier);

Les procdures suivantes constituent des cas particuliers, parfois utiles : e


PROCEDURE PROCEDURE PROCEDURE PROCEDURE NaturelParChiffre (u: entier; x: chiffre; VAR w: entier); NaturelPlusChiffre (u: entier; x: chiffre; VAR w: entier); NaturelParMonome (u: entier; x:chiffre; n: integer; VAR w: entier); NaturelSurChiffre (u: entier; x: chiffre; VAR w: entier);

Voici une ralisation de laddition et de la soustraction : e


PROCEDURE NaturelPlusNaturel (VAR u, v, w: entier); VAR i, m: integer; retenue: chiffre; BEGIN m := min(Taille(u), Taille(v)); retenue := 0; FOR i := 0 TO m DO w =u+v

Version 15 janvier 2005

12.1. Entiers en multiprcision e


SommeChiffres(u[i], v[i], w[i], retenue); IF Taille(u) > m THEN FOR i := m + 1 TO Taille(u) DO SommeChiffres(u[i], 0, w[i], retenue) ELSE FOR i := m + 1 TO Taille(v) DO SommeChiffres(0, v[i], w[i], retenue); m := max(Taille(u), Taille(v)); IF retenue = 1 THEN BEGIN m := m + 1; w[m] := retenue END; FixerTaille(w, m) END; { de "NaturelPlusNaturel" }

359

La relative dicult de cette procdure vient du choix de la reprsentation : pour chacun e e e des deux oprandes u et v, on ne peut tre sr que les chires au-del` de la taille sont e e u a nuls, et il faut donc sparer les cas. La soustraction se ralise de la mme faon : e e e c
PROCEDURE NaturelMoinsNaturel (VAR u, v, w: entier); w =uv On suppose u v. VAR i: integer; retenue: chiffre; BEGIN retenue := 0; FOR i := 0 TO Taille(v) DO DifferenceChiffres(u[i], v[i], w[i], retenue); FOR i := Taille(v) + 1 TO Taille(u) DO DifferenceChiffres(u[i], 0, w[i], retenue); i := Taille(u); Calcul de la taille de w. WHILE (i >= 0) AND (w[i] = 0) DO Des chires annuls ? e i := i - 1; Si i = 1, alors w = 0. FixerTaille(w, i) END; { de "NaturelMoinsNaturel" }

La multiplication se fait en deux tapes : calcul du produit dun entier par un chire, e puis addition au rsultat partiel dj` obtenu. La premi`re tape scrit : e ea e e e
PROCEDURE NaturelParMonome (u: entier; x:chiffre; n: integer; VAR w: entier); Calcul de w = uxbn . VAR i: integer; retenue: chiffre; BEGIN IF x = 0 THEN EntierNul(w) ELSE BEGIN FOR i := 0 TO n - 1 DO Dcalage. e

Version 15 janvier 2005

360

Chapitre 12. Grands nombres


w[i] := 0; retenue := 0; FOR i := 0 TO Taille(u) DO ProduitChiffres(u[i], x, w[n + i], retenue); IF retenue > 0 THEN BEGIN La taille de w dpend e w[1 + Taille(u) + n] := retenue; de la derni`re retenue. e FixerTaille(w, 1 + Taille(u) + n) END ELSE FixerTaille(w, Taille(u) + n); END END; { de "NaturelParMonome" }

La deuxi`me tape simule la mthode scolaire, sauf que laddition se fait au fur et a e e e ` mesure, pour ne pas dpasser la taille des chires : e
PROCEDURE NaturelParNaturel (u, v: entier; VAR w: VAR i: integer; d: entier; BEGIN FixerTaille(w, TailleEntierNul); FOR i := 0 TO 1 + Taille(u) + Taille(v) DO w[i] := 0; FOR i := 0 TO Taille(v) DO BEGIN NaturelParMonome(u, v[i], i, d); NaturelPlusNaturel(w, d, w); END; END; { de "NaturelParNaturel" } entier); w = uv

Mise a zro de w, ` e mme ses chires. e

Multiplication par le chire, puis addition.

La comparaison de deux entiers naturels se fait en comparant dabord leur taille et, a taille gale, en cherchant le chire de plus haut indice o` ils di`rent. Sil ny en a ` e u e pas, les entiers sont gaux. La fonction suivante rend 1, 0 ou 1 selon que le premier e argument est plus petit, gal ou plus grand que le deuxi`me. e e
FUNCTION CompareNaturel (VAR u, v: entier): integer; VAR i: integer; BEGIN IF Taille(u) <> Taille(v) THEN CompareNaturel := signe(Taille(u) - Taille(v)) ELSE BEGIN u et v ont mme taille. e i := Taille(u); WHILE (i >= 0) AND (u[i] = v[i]) DO { AND squentiel } e i := i - 1; IF i = -1 THEN CompareNaturel := 0 ELSE CompareNaturel := signe(u[i] - v[i])

Version 15 janvier 2005

12.1. Entiers en multiprcision e


END END; { de "CompareNaturel"}

361

Comme nous lavons vu, la division euclidienne de deux entiers naturels se ram`ne a la e ` division normalise. La normalisation consiste a multiplier les deux oprandes par un e ` e chire particulier. Voici donc la procdure principale : e
PROCEDURE NaturelDivEuclNaturel (u, v: entier; VAR q, r: entier); u = qv+r VAR omega: chiffre; BEGIN IF CompareNaturel(u, v) = -1 THEN BEGIN Cas facile. EntierNul(q); r := u END ELSE BEGIN omega := base DIV (1 + v[Taille(v)]); Facteur de normalisation. NaturelParChiffre(u, omega, u); Normalisation des oprandes. e NaturelParChiffre(v, omega, v); DivisionNormalisee(u, v, q, r); Division euclidienne. NaturelSurChiffre(r, omega, r); Dnormalisation du reste. e END END; { de "NaturelDivEuclNaturel" }

Cette procdure utilise trois procdures auxiliaires : considrons dabord la multiplicae e e tion et la division par un chire, qui scrivent comme suit : e
PROCEDURE NaturelParChiffre (u: entier; x: chiffre; VAR w: entier); Calcule le produit de lentier u par le chire x. VAR i: integer; retenue: chiffre; BEGIN IF x = 0 THEN EntierNul(w) ELSE BEGIN retenue := 0; FOR i := 0 TO Taille(u) DO ProduitChiffres(u[i], x, w[i], retenue); IF retenue > 0 THEN BEGIN w[1 + Taille(u)] := retenue; FixerTaille(w, 1 + Taille(u)) END ELSE FixerTaille(w, Taille(u)); END END; { de "NaturelParChiffre" } PROCEDURE NaturelSurChiffre (u: entier; x: chiffre; VAR w: entier); Calcule le quotient entier de u par le chire x > 0.

Version 15 janvier 2005

362
VAR

Chapitre 12. Grands nombres

retenue: chiffre; k: integer; BEGIN IF EstEntierNul(u) THEN w := u ELSE BEGIN retenue := 0; FOR k := Taille(u) DOWNTO 0 DO DivisionChiffres(u[k], x, w[k], retenue); IF w[Taille(u)] = 0 THEN FixerTaille(w, Taille(u) - 1) ELSE FixerTaille(w, Taille(u)); END END; { de "NaturelSurChiffre" }

La division normalise suit la mthode expose dans la section prcdente : e e e e e


PROCEDURE DivisionNormalisee (u, v: entier; VAR q, r: entier); Division euclidienne de u par v. Lentier v est normalis. Le quotient entier est q et le e reste est r. VAR qEstime: chiffre; n, na, m: integer; qvprime, vprime: entier; BEGIN na := Taille(u); m := Taille(v); u[na + 1] := 0; FOR n := na DOWNTO m DO BEGIN IF u[n + 1] = v[m] THEN Estimation de q . qEstime := base - 1 ELSE qEstime := (u[n + 1] * base + u[n]) DIV v[m]; NaturelParMonome(v, 1, n - m, vprime); v = vbnm . NaturelParChiffre(vprime, qEstime, qvprime); qv . WHILE CompareNaturel(u, qvprime) = -1 DO BEGIN u < qv ? qEstime := qEstime - 1; q := q 1. NaturelMoinsNaturel(qvprime, vprime, qvprime); END; NaturelMoinsNaturel(u, qvprime, u); u := u q v . q[n - m] := qEstime Le bon quotient. END; IF q[na - m] = 0 THEN FixerTaille(q, na - m - 1) ELSE FixerTaille(q, na - m); FixerSigne(q, 1);

Version 15 janvier 2005

12.1. Entiers en multiprcision e


r := u; END; { de "DivisionNormalisee" } Le reste.

363

Il est maintenant facile de raliser les trois oprations arithmtiques sur des entiers e e e relatifs : il sut de tenir compte du signe.
PROCEDURE EntierPlusEntier (u, v: entier; VAR w: entier); BEGIN IF EstEntierNul(u) THEN w := v ELSE IF EstEntierNul(v) THEN w := u ELSE IF LeSigne(u) = LeSigne(v) THEN BEGIN NaturelPlusNaturel(u, v, w); FixerSigne(w, LeSigne(u)) END ELSE u et v de signe oppos. e CASE CompareNaturel(u, v) OF 1: BEGIN |u| > |v| NaturelMoinsNaturel(u, v, w); FixerSigne(w, LeSigne(u)) END; 0: EntierNul(w); u = v -1: BEGIN |u| < |v| NaturelMoinsNaturel(v, u, w); FixerSigne(w, LeSigne(v)) END END END; { de "EntierPlusEntier" }

La soustraction et la multiplication sont plus simples :


PROCEDURE EntierMoinsEntier (u, v: entier; VAR w: entier); BEGIN FixerSigne(v, -LeSigne(v)); EntierPlusEntier(u, v, w) END; { de "EntierMoinsEntier" } PROCEDURE EntierParEntier (u, v: entier; VAR w: entier); BEGIN FixerSigne(w, LeSigne(u) * LeSigne(v)); NaturelParNaturel(u, v, w); END; { de "EntierParEntier" }

La division euclidienne de deux entiers se ram`ne a celle de deux entiers naturels, avec e ` une petite complication si lon veut que le reste soit toujours positif ou nul, mme si le e dividende ou le diviseur sont ngatifs. On obtient : e
PROCEDURE EntierDivEuclEntier (u, v: entier; VAR q, r: entier); VAR

Version 15 janvier 2005

364

Chapitre 12. Grands nombres


su, sv: integer; BEGIN su := LeSigne(u); sv := LeSigne(v); FixerSigne(u, 1); FixerSigne(v, 1); NaturelDivEuclNaturel(u, v, q, r); IF (su = -1) AND NOT EstEntierNul(r) THEN BEGIN NaturelMoinsNaturel(v, r, r); NaturelPlusChiffre(q, 1, q); END; FixerSigne(q, su * sv) END; { de "EntierDivEuclEntier" }

La procdure NaturelPlusChiffre scrit : e e


PROCEDURE NaturelPlusChiffre (u: entier; x: chiffre; VAR w: entier); VAR i: integer; retenue: chiffre; BEGIN i := 0; retenue := x; REPEAT SommeChiffres(u[i], 0, w[i], retenue); i := i + 1 UNTIL (retenue = 0) OR (i = 1 + Taille(u)); IF retenue > 0 THEN BEGIN w[i] := retenue; FixerTaille(w, i) END ELSE FixerTaille(w, Taille(u)); END; { "NaturelPlusChiffre" }

Si seul le reste de la division euclidenne est demand, on utilise la variante suivante : e


PROCEDURE EntierModEntier (u, v: entier; VAR w: entier); VAR q: entier; BEGIN EntierDivEuclEntier(u, v, q, w) END; { de "EntierModEntier" }

Il est maintenant tr`s facile dcrire une procdure de calcul du pgcd de deux entiers : e e e
PROCEDURE pgcdEntier (u, v: entier; VAR d: entier); VAR w: entier; BEGIN

Version 15 janvier 2005

12.1. Entiers en multiprcision e


WHILE NOT EstEntierNul(v) DO BEGIN EntierModEntier(u, v, w); u := v; v := w END; d := u END; { de "pgcdEntier" }

365

Une premi`re application est le calcul dune table de nombres de Fibonacci, par simple e application de la formule de dnition. e
VAR F: ARRAY[0..110] OF entier; Pour ranger les nombres. PROCEDURE CalculerNombresFibonacci (n: integer); Calcul les nombres de Fibonacci Fi pour i = 0, . . . , n. VAR i: integer; BEGIN EntierNul(F[0]); F0 = 0. ChiffreEnEntier(1, F[1]); F1 = 1. FOR i := 2 TO n DO La formule Fi = Fi1 + Fi2 . EntierPlusEntier(F[i - 1], F[i - 2], F[i]) END; { de "CalculerNombresFibonacci" }

avec
PROCEDURE ChiffreEnEntier (x: chiffre; VAR u: entier); BEGIN FixerSigne(u, signe(x)); FixerTaille(u, 0); u[0] := abs(x); END; { de "ChiffreEnEntier" }

Notons que

1 Fn avec = (1 + 5)/2 5

Si la taille maximale est 10, on peut calculer les nombres de Fibonacci infrieurs a 100 11 , e ` soit dindice major par e 10 ln 100 + ln 5 ln ce qui donne 106. Voici ces nombres :
Nombres de Fibonacci dindices de F(80) F(81) F(82) F(83) F(84) = = = = = 2 34 16 72 83 48 46 76 85 3 78 89 06 23 73 14 39 06 6 13 05 79 07 21 61 15 91 9 91 94 85 30 94 75 54 97 16 05 00 64 38 16 36 70 88 80 a ` 106

Version 15 janvier 2005

366
F(85) = 25 96 95 49 69 11 12 25 85 F(86) = 42 01 96 14 07 27 48 96 73 F(87) = 67 98 91 63 76 38 61 22 58 F(88) = 1 10 00 87 77 83 66 10 19 31 F(89) = 1 77 99 79 41 60 04 71 41 89 F(90) = 2 88 00 67 19 43 70 81 61 20 F(91) = 4 66 00 46 61 03 75 53 03 09 F(92) = 7 54 01 13 80 47 46 34 64 29 F(93) = 12 20 01 60 41 51 21 87 67 38 F(94) = 19 74 02 74 21 98 68 22 31 67 F(95) = 31 94 04 34 63 49 90 09 99 05 F(96) = 51 68 07 08 85 48 58 32 30 72 F(97) = 83 62 11 43 48 98 48 42 29 77 F(98) = 1 35 30 18 52 34 47 06 74 60 49 F(99) = 2 18 92 29 95 83 45 55 16 90 26 F(100) = 3 54 22 48 48 17 92 61 91 50 75 F(101) = 5 73 14 78 44 01 38 17 08 41 01 F(102) = 9 27 37 26 92 19 30 78 99 91 76 F(103) = 15 00 52 05 36 20 68 96 08 32 77 F(104) = 24 27 89 32 28 39 99 75 08 24 53 F(105) = 39 28 41 37 64 60 68 71 16 57 30 F(106) = 63 56 30 69 93 00 68 46 24 81 83

Chapitre 12. Grands nombres

Lachage dun entier se fait en achant les chires, par exemple spars par un blanc, e e comme ci-dessus. On obtient donc :
PROCEDURE EcrireEntier (VAR u: entier; titre: texte); VAR i: integer; BEGIN write(titre); IF EstEntierNul(u) THEN Lentier nul. writeln( 0) ELSE BEGIN IF LeSigne(u) = -1 THEN Le signe, si ncessaire. e write(- ); write(u[Taille(u)] : 1); Le premier chire, FOR i := Taille(u) - 1 DOWNTO 0 DO EcrireChiffre(u[i]); et les suivants. writeln END END; { de "EcrireEntier" }

Pour lachage dun chire, observons que sil est nul, ou sil ne contient pas assez de chires dcimaux, il convient dacher des zros (sauf pour le premier). e e
PROCEDURE EcrireChiffre (a: chiffre); VAR i, n: integer;

Version 15 janvier 2005

12.1. Entiers en multiprcision e

367

FUNCTION LargeurChiffre (a: chiffre): integer; BEGIN IF a = 0 THEN LargeurChiffre := 1 ELSE LargeurChiffre := 1 + trunc(log10(a)) END; { de "LargeurChiffre" } BEGIN write( ); n := LargeurChiffre(a); Nombre de chires dcimaux de a. e FOR i := 1 TO DecimauxParChiffre - n DO write(0 : 1); write(a : 1) END; { "EcrireChiffre" }

La lecture dun entier au clavier est plus dicile a rdiger, si lon veut que la saisie ` e se fasse agrablement, cest-`-dire sans introduire de blanc entre les chires. On saisit e a alors les chires dcimaux (appelons-les digits ) taps comme des caract`res, puis on e e e les convertit et les regroupe en chires par rapport a la base. Voici une ralisation : ` e
PROCEDURE EntrerEntier (VAR u: entier; titre: texte); CONST LongueurMax = 80; VAR e: ARRAY[0..LongueurMax] OF integer; Pour la saisie des chires dcimaux. e c: char; t, k, i, m, n: integer; x: chiffre; BEGIN writeln; writeln(titre); read(c); Lecture du premier caract`re. e IF c = + THEN BEGIN Si cest le signe +, FixerSigne(u, 1); on en tient compte, read(c) et on lit le caract`re suivant. e END ELSE IF c = - THEN BEGIN Signe , on proc`de de mme. e e FixerSigne(u, -1); read(c) END ELSE Sinon, cest un entier positif. FixerSigne(u, 1); n := 1; e[n] := ord(c) - ord(0); Conversion du premier caract`re en digit. e WHILE NOT eoln DO BEGIN Lecture et conversion des autres. n := n + 1; read(c); e[n] := ord(c) - ord(0)

Version 15 janvier 2005

368

Chapitre 12. Grands nombres


END; readln; Au total, n digits lus. IF (n = 1) AND (e[n] = 0) THEN Lentier nul. FixerTaille(u, TailleEntierNul) ELSE BEGIN t := (n - 1) DIV DecimauxParChiffre; FixerTaille(u, t); La taille de lentier. i := n MOD DecimauxParChiffre; i := (DecimauxParChiffre - i) MOD DecimauxParChiffre; x := 0; On groupe les digits m := t; par paquet de DecimauxParChire. FOR k := 1 TO n DO BEGIN x := 10 * x + e[k]; Schma de Horner, bien sr. e u i := i + 1; IF i = DecimauxParChiffre THEN BEGIN u[m] := x; Chire suivant. x := 0; i := 0; m := m - 1 END END END; END; { de "EntrerEntier" }

Considrons une autre application. Les nombres de Catalan sont dnis par e e cn = 1 2n n+1 n (n 0)

Nous les avons dj` rencontrs au chapitre 9 et nous les avons calculs en arithmtique ea e e e modulaire au chapitre prcdent. Il nest pas dicile de vrier que les nombres de e e e Catalan satisfont la relation de rcurrence e cn = cn1 4n 2 n+1 (n 1)

On peut donc les calculer au moyen de la procdure : e


PROCEDURE CalculerNombresCatalan (nn: integer); VAR n: integer; BEGIN ChiffreEnEntier(1, Cat[0]); FOR n := 1 TO nn DO BEGIN EntierParChiffre(Cat[n - 1], 4 * n - 2, Cat[n]); EntierSurChiffre(Cat[n], n + 1, Cat[n]) END; END; { "CalculerNombresCatalan" }

o` Cat est un tableau dentiers de taille approprie. Voici une table, obtenue en choiu e sissant la base gale a 1000 (bien entendu, chiffre=longint) : e ` Version 15 janvier 2005

12.1. Entiers en multiprcision e


Nombres de Catalan dindices de 0 a ` 50

369

C(0) = 1 C(1) = 1 C(2) = 2 C(3) = 5 C(4) = 14 C(5) = 42 C(6) = 132 C(7) = 429 C(8) = 1 430 C(9) = 4 862 C(10) = 16 796 C(11) = 58 786 C(12) = 208 012 C(13) = 742 900 C(14) = 2 674 440 C(15) = 9 694 845 C(16) = 35 357 670 C(17) = 129 644 790 C(18) = 477 638 700 C(19) = 1 767 263 190 C(20) = 6 564 120 420 C(21) = 24 466 267 020 C(22) = 91 482 563 640 C(23) = 343 059 613 650 C(24) = 1 289 904 147 324 C(25) = 4 861 946 401 452 C(26) = 18 367 353 072 152 C(27) = 69 533 550 916 004 C(28) = 263 747 951 750 360 C(29) = 1 002 242 216 651 368 C(30) = 3 814 986 502 092 304 C(31) = 14 544 636 039 226 909 C(32) = 55 534 064 877 048 198 C(33) = 212 336 130 412 243 110 C(34) = 812 944 042 149 730 764 C(35) = 3 116 285 494 907 301 262 C(36) = 11 959 798 385 860 453 492 C(37) = 45 950 804 324 621 742 364 C(38) = 176 733 862 787 006 701 400 C(39) = 680 425 371 729 975 800 390 C(40) = 2 622 127 042 276 492 108 820 C(41) = 10 113 918 591 637 898 134 020 C(42) = 39 044 429 911 904 443 959 240 C(43) = 150 853 479 205 085 351 660 700 C(44) = 583 300 119 592 996 693 088 040 C(45) = 2 257 117 854 077 248 073 253 720

Version 15 janvier 2005

370
C(46) C(47) C(48) C(49) C(50) = = = = = 8 740 328 711 533 173 390 046 320 33 868 773 757 191 046 886 429 490 131 327 898 242 169 365 477 991 900 509 552 245 179 617 138 054 608 572 1 978 261 657 756 160 653 623 774 456

Chapitre 12. Grands nombres

On utilisera ces procdures aussi pour le calcul de par arctangente. e

12.2
12.2.1

Arithmtique ottante e
Enonc : arithmtique ottante e e

e On se propose de calculer certains nombres, comme 2, avec une trentaine de dcimales. Cela ne peut pas se faire avec un seul objet de type real puisque leur prcision est e limite. e On eectue les calculs dans une arithmtique ottante en base B (B = 100 pour xer e les ides). Dans ce contexte, on appelle chire tout entier compris entre 0 et B 1. Un e rel ottant est compos dun exposant e (un entier), dun signe s {+1, 1} et dune e e suite d1 , . . . , dN de chires, avec d1 = 0 sauf si le nombre est nul. Le signe de zro est e +1. La valeur du rel ottant est e
N

s Be

di B i
i=1

On xera N = 16. Un rel ottant peut donc tre dni comme un tableau dentiers e e e dont les indices vont de 1 a N . ` 1. Ecrire les procdures suivantes : e comparaison de deux rels ottants; e addition et soustraction de deux rels ottants; e multiplication de deux rels ottants; e division dun rel ottant par un chire. e Le calcul dun zro dune fonction f drivable peut se faire par la mthode de Newton, e e e cest-`-dire en calculant une suite (xn )n0 par a xn+1 = xn f (xn ) f (xn )

2. Dmontrer que, pour calculer 1/ a, on obtient le schma itratif e e e xn+1 = (3xn ax3 )/2 n Dmontrer que xn tend vers 1/ a lorsque x0 ]0, e ` e et ache 1/ 2 a 30 dcimales. Version 15 janvier 2005
3 a [.

Ecrire une procdure qui calcule e

12.2. Arithmtique ottante e

371

3. Le calcul de linverse dun rel ottant a = 0 peut se faire au moyen du schma e e itratif e xn+1 = 2xn ax2 n Dterminer les valeurs de x0 pour lesquelles xn tend vers 1/a. Ecrire une procdure qui e e calcule linverse dun rel ottant. Vriez vos procdures en calculant linverse du rel e e e e ottant de la question prcdente et en multipliant ces deux rels ottants. e e e 4. Le calcul de la racine carre dun rel ottant peut se faire au moyen du procd e e e e itratif e a 1 ) xn+1 = (xn + 2 xn Dmontrer que xn tend vers a. Comment convient-il de choisir x0 ? Ecrire une proce e dure qui calcule la racine carre dun rel ottant et calculer 2 avec 30 dcimales. e e e

12.2.2

Solution : arithmtique ottante e

La mthode de Newton pour le calcul dun zro dune fonction relle drivable revient a e e e e ` e calculer une suite (xn )n0 de nombres rels par la formule xn+1 = xn f (xn ) f (xn )

en partant dun point x0 convenablement choisi. On suppose bien entendu que f ne sannule en aucun des points xn . Rappelons linterprtation gomtrique de la fore e e mule : xn+1 est labscisse de lintersection de la tangente a la courbe y = f (x) au ` point (xn , f (xn )) avec laxe des x. Si la suite converge vers un point x et si f (x) = 0, alors f (x) = 0, comme on le voit en faisant tendre n vers linni dans lquation ci-dessus. Nous renvoyons a la littrature e ` e pour une discussion plus dtaille de la mthode de Newton (voir les notes en n de e e e chapitre). Considrons quelques cas particuliers. Soit a un nombre rel positif et soit f dnie par e e e f (x) = 1 1 ax2

Alors 1/ a est la solution de f (x) = 0 et comme f (x) = 2/ax3 , on a f (x) = (3x ax3 )/2 f (x) La fonction f tant concave, on a 0 < xn+1 < 1/ a si 0 < xn < 1/ a, et xn+1 < 1/ a e si 1/ a < xn . Il faut sassurer que 0 < xn+1 , et en fait que 0 < x1 . Or x1 = 0 si et seulement si x0 = f (x0 )/f (x0 ), donc si et seulement si x0 = 3/a. Il en rsulte que e la mthode converge si x0 est pris dans lintervalle ]0, 3/a[. En particulier, si a = 2, e on peut prendre x0 = 1. x Version 15 janvier 2005

372

Chapitre 12. Grands nombres

Cherchons a calculer linverse dun rel positif a. Pour cela, on consid`re la fonction ` e e f (x) = 1 qui admet le zro 1/a. On a ici e x f (x) = 2x ax2 f (x) 1 ax

a nouveau la fonction f est concave, et x0 = f (x0 )/f (x0 ) si et seulement si x0 = 2/a. ` Il en rsulte que la mthode converge si x0 est pris dans lintervalle ]0, 2/a[. e e Ces deux schmas itratifs ont lavantage de ne pas faire intervenir de division autre que e e par une petite constante, et sont donc intressants pour le calcul sur les ottants. e Le calcul de la racine carre dun rel positif a peut se faire en considrant la fonction e e e f (x) = ax2 1 On a alors x f (x) 1 a = (x + ) f (x) 2 x

De plus, la fonction f est convexe (cest une parabole) et la mthode de Newton converge e pour tout x0 positif. Bien sr, on a intrt a choisir le point de dpart le plus pr`s possible u e e ` e e de la racine.

12.2.3

Programme : arithmtique ottante e

On se propose de calculer certains nombres rels avec beaucoup de dcimales. Cela ne e e peut pas se faire avec un seul objet de type real puisque leur prcision est limite. On e e eectue les calculs dans une arithmtique ottante qui ressemble a celle des entiers e ` en multiprcision; et on pourra utiliser un certain nombre de procdures dveloppes e e e e dans ce cadre. On se xe une base B qui sera une puissance de 10 pour faciliter les lectures et critures. e On appelle chire tout entier compris entre 0 et B 1. Un rel ottant est compos dun e e exposant e (un entier), dun signe s {+1, 1} et dune suite d1 , . . . , dN de chires, avec d1 = 0 sauf si le nombre est nul. Le signe de zro est +1. La valeur du rel ottant e e est
N

s Be

di B i
i=1

Appelons normalise lcriture dun ottant avec d1 = 0. Les oprations arithmtiques ne e e e e fournissent pas toujours une reprsentation normalise, et il faudra donc les normaliser. e e Un rel ottant peut tre dni comme un tableau de chires dont les indices vont de e e e 1 a N . ` Les types de dpart sont : e Version 15 janvier 2005

12.2. Arithmtique ottante e

373

CONST base = 100; DecimauxParChiffre = 2; Nombre de digits pour crire un chire. e TailleMax = 20; TYPE chiffre = integer; Flottant = ARRAY[-1..TailleMax] OF chiffre; VAR FlottantNul : Flottant;

Contrairement aux choix faits pour les entiers en multiprcision, nous dnissons le e e ottant nul comme objet et non pas comme procdure. La dirence est mince, donc e e pour varier... Dans les emplacements dindice 1 et 0 sont rangs respectivement le signe e et lexposant du ottant; comme pour les grands entiers, on utilisera des procdures pour e accder ou modier ces objets : e
FUNCTION Exposant (VAR u: Flottant): integer; PROCEDURE FixerExposant (VAR u: Flottant; p: integer); FUNCTION LeSigne (VAR u: Flottant): integer; PROCEDURE FixerSigne (VAR u: Flottant; s: integer); FUNCTION EstFlottantNul (VAR u: Flottant): boolean;

On se propose dcrire, dans un premier temps, des procdures pour raliser les quatre e e e oprations arithmtiques, disons : e e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE FlottantPlusFlottant (u, v: Flottant; VAR w: Flottant); FlottantMoinsFlottant (u, v: Flottant; VAR w: Flottant); FlottantParFlottant (u, v: Flottant; VAR w: Flottant); FlottantSurFlottant (u, v: Flottant; VAR w: Flottant);

Les trois premi`res procdures sont faciles a crire, en sinspirant de la mthode scolaire; e e `e e pour la quatri`me, on calcule linverse du diviseur par la mthode de Newton, puis on e e multiplie le rsultat par le dividende. e Revenons aux procdures de base. Elles se ralisent comme suit : e e
FUNCTION Exposant (VAR u: Flottant): chiffre; BEGIN Exposant := u[0] END; { de "Exposant" } PROCEDURE FixerExposant (VAR u: Flottant; p: chiffre); BEGIN u[0] := p END; { de "FixerExposant" } FUNCTION LeSigne (VAR u: Flottant): chiffre; BEGIN LeSigne := u[-1] END; { de "LeSigne" } PROCEDURE FixerSigne (VAR u: Flottant; s: chiffre);

Version 15 janvier 2005

374
BEGIN u[-1] := s END; { de "FixerSigne" }

Chapitre 12. Grands nombres

FUNCTION EstFlottantNul (VAR u: Flottant): boolean; BEGIN EstFlottantNul := u[1] = 0 END; { de "EstFlottantNul" }

On reconna donc quun ottant est nul par le fait quil nest pas normalis. Le ottant t e nul est initialis dans une procdure : e e
PROCEDURE InitFlottants; VAR i: integer; BEGIN FOR i := 1 TO TailleMax DO FlottantNul[i] := 0; FixerSigne(FlottantNul, 1); FixerExposant(FlottantNul, -(maxint DIV 2)); END; { de "InitFlottants" }

On a choisi, comme exposant du ottant nul, un entier ngatif grand; le choix de maxint e au lieu de maxint DIV 2 peut provoquer des messages derreurs si on fait des oprations e sur les signes. Les oprations arithmtiques se font en trois parties : les oprations sur les mantisses, e e e les oprations sur les exposants et les oprations sur les signes. Les oprations sur les e e e mantisses sont cause derreurs darrondi; ces erreurs sont invitables, puisquelles sont e lies a la limitation mme de la reprsentation. On peut les attnuer, en arrondissant e ` e e e au nombre le plus proche plutt que darrondir par dfaut. Nous avons fait le deuxi`me o e e choix parce quil simplie les procdures. e Commenons par laddition. Laddition de deux ottants positifs (ou de mme signe) c e se fait en additionnant les mantisses, mais apr`s avoir procd au dcalage ncessaire e e e e e pour se ramener a des exposants gaux. On utilise des procdures de dcalage vers la ` e e e gauche et vers la droite de la mantisse; les places devenant libres sont remplies avec le chire 0 :
PROCEDURE DecalerMantisseDroite (d: integer; VAR u: Flottant); Dcale vers la droite : (u1 , . . . , uN ) (0, . . . , 0, u1 , . . . , uN d ). e VAR k: integer; BEGIN FOR k := TailleMax DOWNTO d + 1 DO u[k] := u[k - d]; FOR k := d DOWNTO 1 DO u[k] := 0; END; { de "DecalerMantisseDroite" }

Version 15 janvier 2005

12.2. Arithmtique ottante e


PROCEDURE DecalerMantisseGauche (d: integer; VAR u: Flottant); Dcale vers la gauche : (u1 , . . . , uN ) (ud+1 , . . . , uN , 0, . . . , 0). e VAR k: integer; BEGIN FOR k := 1 TO TailleMax - d DO u[k] := u[k + d]; FOR k := TailleMax - d + 1 TO TailleMax DO u[k] := 0; END; { de "DecalerMantisseGauche" }

375

Moyennant ces procdures, on peut crire laddition de deux ottants positifs. Notons e e et cest l` encore une consquence de la limitation de la taille des ottants que a e laddition na pas deet si les exposants sont trop dirents lun de lautre. e
PROCEDURE PositifPlusPositif (u, v: Flottant; VAR w: Flottant); w = u + v, on suppose u et v de mme signe. e VAR delta: integer; BEGIN delta := Exposant(u) - Exposant(v); IF delta >= TailleMax THEN Pas de calcul. w := u ELSE IF delta <= -TailleMax THEN Pas de calcul. w := v ELSE IF delta >= 0 THEN PositifEtPositif(delta, u, v, w) Une mme procdure pour les e e ELSE deux cas ; le premier argument PositifEtPositif(-delta, v, u, w); est toujours plus grand. END; { de "PositifPlusPositif" }

Pour conomiser de lcriture, on utilise une mme procdure : e e e e


PROCEDURE PositifEtPositif (delta: integer; VAR u, v, w: Flottant); w = u + v, on suppose u > v et est la dirence des exposants de u et v. e VAR k: integer; retenue: chiffre; BEGIN DecalerMantisseDroite(delta, v); Aligne lexposant de v. retenue := 0; FOR k := TailleMax DOWNTO 1 DO Calcul de la somme, SommeChiffres(u[k], v[k], w[k], retenue); chire par chire. IF retenue = 1 THEN BEGIN La derni`re retenue est e DecalerMantisseDroite(1, w); inscrite en mantisse... w[1] := retenue; FixerExposant(w, 1 + Exposant(u)) et en exposant. END ELSE

Version 15 janvier 2005

376
FixerExposant(w, Exposant(u)); END; { de "PositifEtPositif" }

Chapitre 12. Grands nombres

La procdure fait appel a la procdure SommeChires dj` vue avec les grands entiers. e ` e ea La soustraction de deux ottants de mme signe pose le probl`me inverse du dcalage, a e e e ` savoir de la normalisation : si le ottant nest pas nul, son premier chire doit tre non e nul. On obtient cette normalisation en dcalant la mantisse. Ceci introduit des zros en e e n de reprsentation. Voici comment on ralise la normalisation : e e
PROCEDURE NormaliserFlottant (VAR u: Flottant); VAR d: integer; BEGIN d := 1; WHILE (d <= TailleMax) AND (u[d] = 0) DO d := d + 1; IF d = 1 + TailleMax THEN ELSE IF d > 1 THEN BEGIN DecalerMantisseGauche(d - 1, u); FixerExposant(u, Exposant(u) - d + 1) END; END; { de "NormaliserFlottant" }

Chercher le premier chire non nul. Si u = 0, ne rien faire, sinon, dcaler de d positions e et rpercuter sur lexposant. e

La procdure suivante ralise la soustraction de deux ottants de mme signe, le premier e e e tant suppos plus grand en valeur absolue que le deuxi`me. On utilise la procdure e e e e DierenceChires.
PROCEDURE PositifDePositif (delta: integer; VAR u, v, w: Flottant); w = u v, on suppose u > v et est la dirence des exposants de u et v. e VAR k, retenue: integer; BEGIN DecalerMantisseDroite(delta, v); retenue := 0; FOR k := TailleMax DOWNTO 1 DO DifferenceChiffres(u[k], v[k], w[k], retenue); FixerExposant(w, Exposant(u)); NormaliserFlottant(w); On normalise le rsultat. e END; { de "PositifDePositif" }

La procdure de soustraction est alors, comme pour laddition, un simple aiguillage entre e les diverses possibilits : e
PROCEDURE PositifMoinsPositif (u, v: Flottant; VAR w: Flottant); VAR delta: integer; BEGIN delta := Exposant(u) - Exposant(v); IF delta >= TailleMax THEN Pas de calcul.

Version 15 janvier 2005

12.2. Arithmtique ottante e


w := u ELSE IF delta <= -TailleMax THEN w := v ELSE IF delta >= 0 THEN PositifDePositif(delta, u, v, w) ELSE PositifDePositif(-delta, v, u, w); END; { de "PositifMoinsPositif" }

377

Pas de calcul.

Comme pour les grands entiers, pour tenir compte du signe, il faut savoir comparer deux ottants; lalgorithme est le mme, la ralisation aussi, sauf que lon compare lexposant e e au lieu de la taille (mais est-ce vraiment dirent?) : e
FUNCTION ComparePositif (VAR u, v: Flottant): integer; VAR k: integer; BEGIN IF Exposant(u) <> Exposant(v) THEN ComparePositif := signe(Exposant(u) - Exposant(v)) ELSE BEGIN k := 1; WHILE (k <= TailleMax) AND (u[k] = v[k]) DO k := k + 1; IF k = TailleMax + 1 THEN ComparePositif := 0 ELSE ComparePositif := signe(u[k] - v[k]) END END; { de "ComparePositif" }

Les procdures daddition et de soustraction de deux rels ottants sont de mme nature e e e que pour les grands entiers :
PROCEDURE FlottantPlusFlottant (u, v: Flottant; VAR w: Flottant); BEGIN IF LeSigne(u) = LeSigne(v) THEN BEGIN PositifPlusPositif(u, v, w); FixerSigne(w, LeSigne(u)) END ELSE CASE ComparePositif(u, v) OF 1: BEGIN PositifMoinsPositif(u, v, w); FixerSigne(w, LeSigne(u)) END; 0: w := FlottantNul; -1: BEGIN PositifMoinsPositif(v, u, w); FixerSigne(w, LeSigne(v)) END END

Version 15 janvier 2005

378
END; { de "FlottantPlusFlottant" }

Chapitre 12. Grands nombres

PROCEDURE FlottantMoinsFlottant (u, v: Flottant; VAR w: Flottant); BEGIN FixerSigne(v, -LeSigne(v)); FlottantPlusFlottant(u, v, w) END; { de "FlottantMoinsFlottant" }

La multiplication se ralise en multipliant chaque chire de lun des facteurs par lautre e facteur et en additionnant le rsultat, dcal du nombre appropri de places, au produit e e e e partiel dj` obtenu. Ceci donne la procdure que voici : ea e
PROCEDURE FlottantParFlottant (u, v: Flottant; VAR w: Flottant); VAR k: integer; z: Flottant; BEGIN w := FlottantNul; IF NOT (EstFlottantNul(u) OR EstFlottantNul(v)) THEN BEGIN FOR k := TailleMax DOWNTO 1 DO IF u[k] <> 0 THEN BEGIN z:=v; FlottantParChiffre(z, u[k]); Multiplication. FixerExposant(z, Exposant(z) - k); Dcalage. e PositifPlusPositif(w, z, w); Addition. END; FixerExposant(w, Exposant(u) + Exposant(w)); FixerSigne(w, LeSigne(u) * LeSigne(v)) END { de uv<>0 } END; { de "FlottantParFlottant" }

Le produit dun ottant par un chire non nul se fait par :


PROCEDURE FlottantParChiffre (VAR u: Flottant; x: chiffre); Multiplie u par le chire x > 0. VAR k: integer; retenue: chiffre; BEGIN retenue := 0; FOR k := TailleMax DOWNTO 1 DO ProduitChiffres(u[k], x, u[k], retenue); IF retenue > 0 THEN BEGIN DecalerMantisseDroite(1, u); u[1] := retenue; FixerExposant(u, 1 + Exposant(u)) END END; { de "FlottantParChiffre" }

Lopration inverse est la division dun ottant par un chire : e Version 15 janvier 2005

12.2. Arithmtique ottante e


PROCEDURE FlottantSurChiffre (VAR u: Flottant; x: chiffre); Divise u par le chire x > 0. VAR k: integer; retenue: chiffre; BEGIN IF EstFlottantNul(u) THEN ELSE BEGIN retenue := 0; FOR k := 1 TO TailleMax DO DivisionChiffres(u[k], x, u[k], retenue); NormaliserFlottant(u) END END; { de "FlottantSurChiffre" }

379

Il est utile, enn, de disposer dune procdure qui dnit un ottant de valeur donne : e e e
PROCEDURE ChiffreEnFlottant (VAR u: Flottant; x: chiffre); Donne u = x, o` x > 0 est un chire. u BEGIN u := FlottantNul; FixerExposant(u, 1); u[1] := x; END; { de "ChiffreEnFlottant" }

La seule dicult est linitialisation : on doit avoir 0 < |x0 | < 2/|a|. Supposons a > 0, e donn par e
N

Le calcul de linverse dun ottant a se fait en utilisant la mthode de Newton. La e formule ditration est : e xn+1 = 2xn ax2 (n 0) n

a = Be
k=1 e

ai B i

Alors 0 < a1 < B. Soit x0 = B k, avec k = B/(a1 + 1) . Comme a < B e1 (a1 + 1), on a B x0 a < B 1 k(a1 + 1) B 1 (a1 + 1) = 1 a1 + 1 Donc cette valeur de x0 convient. La procdure suivante ralise le processus itratif : e e e
PROCEDURE InverseFlottant (a: Flottant; VAR b: Flottant); BEGIN ChiffreEnFlottant(b, base DIV (a[1] + 1)); FixerExposant(b, 1 - Exposant(a)); Valeur initiale ditration, e FixerSigne(b, LeSigne(a)); FlottantInverseIteration(a, b) puis les itrations. e END; { de "InverseFlottant" }

Elle initialise un ottant a une valeur qui assure la convergence de la mthode de Newton. ` e Litration proprement dite se fait dans la procdure que voici : e e Version 15 janvier 2005

380

Chapitre 12. Grands nombres

PROCEDURE FlottantInverseIteration (a: Flottant; VAR x: Flottant); VAR y, z: Flottant; BEGIN REPEAT y := x; FlottantParChiffre(x, 2); x := 2x FlottantParFlottant(a, y, z); FlottantParFlottant(z, y, z); z := ax2 FlottantMoinsFlottant(x, z, x); x := 2x ax 2 UNTIL FlottantProches(y, x) END; { de "FlottantInverseIteration" }

Nous avons spar les deux tapes parce quil arrive assez souvent quune valeur initiale e e e meilleure que la ntre soit connue grce a un autre calcul. On arrte les itrations lorsque o a ` e e deux valeurs conscutives sont tr`s proches. On peut choisir comme crit`re quelles e e e ne di`rent que sur le dernier chire; nous sommes plus exigeants dans la ralisation e e suivante :
FUNCTION FlottantProches (VAR u, v: Flottant): boolean; VAR w: Flottant; BEGIN FlottantMoinsFlottant(u, v, w); FlottantProches := EstFlottantNul(w) OR ((Exposant(u) - Exposant(w) = TailleMax - 1) AND (w[1] <= base / 10)) END; { de "FlottantProches" }

Le quotient de deux ottants sobtient par :


PROCEDURE FlottantSurFlottant (u, v: Flottant; VAR w: Flottant); BEGIN InverseFlottant(v, w); FlottantParFlottant(u, w, w) END; { de "FlottantSurFlottant" }

Voici deux exemples de calculs, (avec des rsultats intermdiaires indiqus par le signe e e e =); on voit bien la convergence quadratique de la mthode de Newton, qui double e pratiquement le nombre de chires exacts a chaque itration. ` e
a = = = = = = = 1/a = 0. 0. 0. 0. 0. 0. 0. 0. 30 03 03 03 03 03 03 03 00 30 33 33 33 33 33 33 00 00 30 33 33 33 33 33 00 00 00 33 33 33 33 33 00 00 00 30 33 33 33 33 00 00 00 00 33 33 33 33 00 00 00 00 33 33 33 33 00 00 00 00 33 33 33 33 00 00 00 00 30 33 33 33 00 00 00 00 00 33 33 33 00 00 00 00 00 33 33 33 00 00 00 00 00 33 33 33 00 00 00 00 00 33 33 33 00 00 00 00 00 33 33 33 00 00 00 00 00 33 33 33 00 00 00 00 00 34 34 34 E E E E E E E E 0 1 1 1 1 1 1 1

a = 0. 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 3

Version 15 janvier 2005

12.2. Arithmtique ottante e


= = = = = = = 1/a = 0. 0. 0. 0. 0. 0. 0. 0. 01 01 01 01 01 01 01 01 30 41 42 42 42 42 42 42 00 70 84 85 85 85 85 85 00 00 77 71 71 71 71 71 00 00 70 42 42 42 42 42 00 00 00 24 85 85 85 85 00 00 00 21 71 71 71 71 00 00 00 89 42 42 42 42 00 00 00 70 85 85 85 85 00 00 00 00 44 71 71 71 00 00 00 00 95 42 42 42 00 00 00 00 68 85 85 85 00 00 00 00 54 71 71 71 00 00 00 00 44 42 42 42 00 00 00 00 49 85 85 85 00 00 00 00 74 72 72 72 E E E E E E E E -2 -2 -2 -2 -2 -2 -2 -2

381

On voit linuence des erreurs darrondis sur la derni`re dcimale : on devrait avoir 71 e e au lieu de 72, puisque le dveloppement est priodique. e e e e e Pour calculer 1/ a, on proc`de de mme en traduisant la formule de rcurrence : xn+1 = (3xn ax3 )/2 n (n 0)

L` encore, il faut choisir une valeur initiale convenable. Considrons a nouveau a e ` a = B e (a1 B 1 + a2 B 2 + )

Si e est impair, alors

B (e1)/2 a1 et donc 1 a B
e1 2

B B 1 a1

et si e est pair, 1 a La procdure gnrale est : e e e


PROCEDURE UnSurRacineFlottant (a: Flottant; VAR b: Flottant); VAR e: chiffre; BEGIN b := FlottantNul; e := Exposant(a); IF odd(e) THEN BEGIN FixerExposant(b, -(e - 1) DIV 2); b[1] := min(base - 1, round(base / sqrt(a[1]))) END ELSE BEGIN FixerExposant(b, -(e - 2) DIV 2); b[1] := round(base / sqrt(a[1] * base + a[2])); END; FlottantUnSurRacineIteration(a, b) END; { de "UnSurRacineFlottant" } PROCEDURE FlottantUnSurRacineIteration (a: Flottant; VAR x: Flottant); Calcule x = 1/ a a partir dune valeur approche x donne. ` e e

e2 2

B B 1 a1 B + a 2

Version 15 janvier 2005

382
VAR y, z: Flottant; BEGIN REPEAT y := x; FlottantParChiffre(x, 3); FlottantParFlottant(a, y, z); FlottantParFlottant(z, y, z); FlottantParFlottant(z, y, z); FlottantMoinsFlottant(x, z, x); FlottantSurChiffre(x, 2) UNTIL FlottantProches(y, x); END; { de "FlottantUnSurRacineIteration" }

Chapitre 12. Grands nombres

3x z := ax3 x := 3x ax 3

et son application particuli`re donne : e


PROCEDURE FlottantInverseRacine2 (VAR b: Flottant); VAR a: Flottant; BEGIN ChiffreEnFlottant(a, 2); a := 2 UnSurRacineFlottant(a, b) END; { de "FlottantInverseRacine2" }

Voici des rsultats numriques : e e


= 0. 50 00 = 0. 62 50 = 0. 69 33 = 0. 70 67 = 0. 70 71 = 0. 70 71 = 0. 70 71 = 0. 70 71 = 0. 70 71 1/sqrt(2) = 00 00 59 08 06 06 06 06 06 0. 00 00 37 46 44 78 78 78 78 70 00 00 50 84 46 11 11 11 11 71 00 00 00 96 95 86 86 86 86 06 00 00 00 79 90 30 54 54 54 78 00 00 00 94 70 73 75 75 75 11 00 00 00 68 75 35 24 24 24 86 00 00 00 99 51 92 40 40 40 54 00 00 00 41 17 54 08 08 08 75 00 00 00 40 30 35 44 44 44 24 00 00 00 62 67 93 23 36 36 40 00 00 00 50 65 12 97 21 21 08 00 00 00 00 93 38 25 05 05 44 00 00 00 00 00 00 00 00 00 36 E 0 E 0 E 0 E 0 E 0 E 0 E 0 E 0 E 0 21 05 00 E 0

Les deux derniers chires de 1/ 2 devraient tre 04 85 au lieu de 05 00. e On peut calculer directement la racine carre dun ottant, par la suite dcrite au e e paragraphe prcdent. Cette suite fait une division a chaque itration, donc est lente. e e ` e Par consquent, on a intrt a choisir une valeur de dpart proche de la solution. Or, si e e e ` e
N

a = BN
k=1

ai B i = a1 B N 1 + a2 B N 2 +

a B (N 1)/2 si N est impair, 1 a1 B + a2 B (N 2)/2 si N est pair. On peut donc prendre cette valeur comme dpart. Ceci est fait dans : e a Version 15 janvier 2005

alors

12.3. Calcul de par arctangente


PROCEDURE RacineFlottant (a: Flottant; VAR b: Flottant); BEGIN IF odd(Exposant(a)) THEN BEGIN ChiffreEnFlottant(b, round(sqrt(a[1]))); FixerExposant(b, 1 + (Exposant(a) - 1) DIV 2) END ELSE BEGIN ChiffreEnFlottant(b, round(sqrt(a[1] * base + a[2]))); FixerExposant(b, 1 + (Exposant(a) - 2) DIV 2) END; FlottantRacineIteration(a, b); END; { de "RacineFlottant" }

383

avec
PROCEDURE FlottantRacineIteration (a: Flottant; VAR x: Flottant); VAR y: Flottant; BEGIN REPEAT y := x; FlottantSurFlottant(a, y, x); a/x FlottantPlusFlottant(x, y, x); x := x + a/x FlottantSurChiffre(x, 2) UNTIL FlottantProches(y, x) END; { de "FlottantRacineIteration" }

En fait, on a plutt intrt a calculer o e e ` nettement plus rapide.

a en faisant le produit de a par 1/ a. Cest

12.3
12.3.1

Calcul de par arctangente


Enonc : calcul de par arctangente e

Le calcul de avec beaucoup de dcimales peut se faire au moyen de formules impliquant e larctangente, comme par exemple = Arctan(1/2) + Arctan(1/3) 4 = 2Arctan(1/3) + Arctan(1/7) = 2Arctan(1/4) + Arctan(1/7) + 2Arctan(1/13) = 5Arctan(1/8) + 2Arctan(1/18) + 3Arctan(1/57) Les calculs se feront en multiprcision, dans une base b telle que b2 soit encore un entier e simple prcision (par exemple b = 100) : un nombre y avec |y| < b a p chires en base e ` Version 15 janvier 2005

384

Chapitre 12. Grands nombres

b sera reprsent par la suite (y0 , . . . , yp ) dentiers tels que e e


p

y=
i=0

yi bi

avec 0 yi < b pour i = 1, . . . , p et 0 |y0 | < b. On pose


n

Sn (u) =
k=0

(1)k u2k+1 /(2k + 1)

et Rn (u) = |Arctan(u) Sn (u)| 1. Dmontrer que pour avoir p chires (en base b) de Arctan(1/x), o` x > 1 est e u entier, il sut de calculer Sn (1/x) avec n > (p ln b/ ln x 3)/2. 2. Dmontrer que si x < b et 2n + 1 < b, Sn (1/x) peut tre valu par le schma de e e e e e Horner, et que seules des multiplications ou divisions par des entiers b sont ncessaires. e 3. Ecrire une procdure qui prend en argument un entier x > 1 et un entier p, et qui e calcule p chires (en base b) de Arctan(1/x). 4. Ecrire un programme qui lit une suite 1 , x1 , . . . , k , xk dentiers, avec 1 < xi < b, et qui calcule p chires en base b de
k

4
i=1

i Arctan(1/xi )

et lutiliser pour calculer 20 dcimales de . e ( = 3. 1415 9265 3589 7932 3846 2643 3832 . . .) 5. Apporter les modications ncessaires au programme pour pouvoir utiliser des e formules comme celle de Machin : = 4Arctan(1/5) Arctan(1/239) 4 dans lesquelles /4 est combinaison linaire dexpressions Arctan(1/x), o` lentier x est e u encore un entier simple prcision, mais o` son carr ne lest plus ncessairement. e u e e On pose R = R {}. On dnit une bijection t de R/Z sur R par e t(x) = et on pose, pour x, y R, x y = t(t1 (x) + t1 (y)) Version 15 janvier 2005 tan x si x = /2 si x = /2

12.3. Calcul de par arctangente 6. Dmontrer que (R, ) est un groupe isomorphe a (R/Z, +). e `
x+y 1xy .

385

7. Dmontrer que pour x, y R et xy = 1, on a x y = e x y dans les autres cas.

Donner la valeur de

8. Dmontrer que 1/x = 1/(x + 1) 1/(x2 + x + 1). On pose F0 = F1 = 1 et pour e n 0, Fn+2 = Fn+1 + Fn . Dmontrer que pour n > 0, on a 1/F2n1 = 1/F2n 1/F2n+1 . e 9. Dans cette question, les rationnels seront reprsents par une paire (numrateur, e e e dnominateur) dentiers premiers entre eux. Ecrire une procdure qui, pour x, y Q, e e avec xy = 1, calcule x y, et utiliser cette procdure pour vrier les 3 premi`res des e e e formules donnes au dbut du texte. e e

a) Dmontrer que si A est a coordonnes rationnelles et si AB est rationnel, alors B est e ` e a coordonnes rationnelles. ` e b) Soient a1 , . . . , ak des nombres rationnels tels que 1 = a1 ak . Dmontrer quil e existe un cercle C de centre O et des points A0 , A1 , . . . , Ak a coordonnes enti`res du ` e e cercle tels que ai = Ai1 Ai .

Soit (O, i, j) un rep`re orthonorm du plan. Soient A et B deux points dun cercle C de e e centre O. On note (M A, M B) langle orient des droites M A et M B, o` M = A, B est e u un point quelconque de C, et on note AB = tan(M A, M B).

12.3.2

Solution : calcul de par arctangente

Le calcul de avec beaucoup de dcimales peut se faire au moyen de formules impliquant e larctangente, comme par exemple = Arctan(1/2) + Arctan(1/3) 4 = 2Arctan(1/3) + Arctan(1/7) = 2Arctan(1/4) + Arctan(1/7) + 2Arctan(1/13) = 5Arctan(1/8) + 2Arctan(1/18) + 3Arctan(1/57) La plus connue de ces formules est celle de Machin : = 4Arctan(1/5) Arctan(1/239). 4 Notre but est dexpliquer comment obtenir de telles formules. On pose R = R {}. par On dnit une bijection t de R/Z sur R e t(x) = et on pose, pour x, y R, x y = t(t1 (x) + t1 (y)) (3.1) Version 15 janvier 2005 tan x si x = /2 si x = /2

386

Chapitre 12. Grands nombres

Par transfert de structure, R muni de la loi de composition interne est un groupe commutatif isomorphe a (R/Z, +), dlment neutre t(0) = 0. La table de la loi est ` ee donne dans la proposition suivante. e Proposition 12.3.1. Soient x, y deux rels tels que xy = 1. Alors e xy = De plus, pour x rel non nul, on a e x = et enn = 0 et 0 = Preuve. Le transfert, via (3.1), de la relation bien connue tan( + ) = tan + tan 1 tan tan (3.4) 1 x et x 1 = x (3.3) x+y 1 xy (3.2)

conduit a la relation (3.2). De mme les relations (3.3) sont obtenues par transfert des ` e relations 1 et t( + /2 ) = tan(/2 + ) = tan() Enn la derni`re relation est obtenue par transfert de tan(/2 + /2) = tan = 0. e De toute relation de la forme 1 = a 1 a2 ak (3.5)

o` les ai sont rationels, on dduit une expression de /4 comme combinaison linaire u e e darctangentes = Arctan a1 + + Arctan ak 4 (valable, naturellement, a pr`s), potentiellement utilisable pour le calcul de en grande ` e prcision. Commenons par donner deux exemples, purement algbriques, de gnration e c e e e de formules du type (3.5). Proposition 12.3.2. Pour x non nul on a 1 1 1 = x x + 1 x2 + x + 1 Version 15 janvier 2005

12.3. Calcul de par arctangente Preuve. En vertu de (3.2) 1 1 + 1 1 x + 1 x2 + x + 1 = 1 1 x + 1 x2 + x + 1 1 x + 1 x2 + x + 1 x2 + 2x + 2 = (x + 1)(x2 + x + 1) 1 x2 + 2x + 2 1 = 3 = 2 + 2x x + 2x x On obtient ainsi les relations 1= 1 1 2 3 1 1 1 = 2 4 13 1 1 1 1 = 2 4 14 183 = ...

387

Le second exemple est fond sur la suite de Fibonacci (Fn ), dnie par la relation de e e rcurrence e F0 = F 1 = 1 (3.6) Fn+2 = Fn+1 + Fn pour n 0 Les premiers termes de cette suite sont : 1, 1, 2, 3, 5, 8, 13, 21, . . .. Proposition 12.3.3. On pose F0 = F1 = 1 et pour n 0, Fn+2 = Fn+1 + Fn . Alors 1 F2n1 = 1 1 . F2n F2n+1

Preuve. La relation a dmontrer est quivalente, en vertu de (3.2), a la relation : ` e e ` (F2n + F2n+1 )F2n1 = F2n F2n+1 1 ou encore, en utilisant (3.6), F2n+2 F2n1 F2n F2n1 = 1 Nous dmontrons cette derni`re relation par rcurrence sur n. En utilisant la relation e e e de rcurrence (3.6), il vient : e Fn+3 Fn Fn+1 Fn+2 = (Fn+2 + Fn+1 )Fn (Fn + Fn1 )Fn+2 = Fn+1 Fn Fn1 Fn+2 = (Fn+2 Fn1 Fn Fn+1 ) Version 15 janvier 2005

388 do` par itration u e

Chapitre 12. Grands nombres

Fn+3 Fn Fn+1 Fn+2 = (1)n (F3 F0 F1 F2 ) = (1)n On obtient ainsi les relations 1= 1 1 2 3 1 1 1 = 2 5 8 1 1 1 1 = 2 5 13 21 = ... En fait la recherche de formule du type (3.5) est quivalente a la recherche des points a e ` ` coordonnes rationnelles du cercle unit. Nous expliquons maintenant cette quivalence. e e e Soit (O, , ) un rep`re orthonorm direct du plan et soit C le cercle unit de centre O. e e e Soient A et B deux points de C et soit C limage de A par la rotation de centre O et dangle +/2. On note (M A, M B) langle orient des droites M A et M B, o` M = A, B e u est un point quelconque de C. En vertu de la proposition de larc capable, cet angle est indpendant du point M et est reli a langle orient des vecteurs OA et OB, not e e` e e (OA, OB), par la relation (OA, OB) = 2(M A, M B). Soit une mesure de langle (M A, M B); les coordonnes du point B dans le rep`re e e orthonorm direct (O, OA, OC) sont alors cos 2 et sin 2 ; les relations trigonomtriques e e cos 2 = 1 tan2 , 1 + tan2 sin 2 = 2 tan 1 + tan2 et tan = 1 cos 2 sin 2 (3.7)

montrent clairement que tan est rationnel si et seulement si cos 2 et sin 2 sont rationnels; en dautres termes si et seulement si les coordonnes de B, dans le rep`re e e (O, OA, OC), sont rationnelles. Soit maintenant A1 , . . . , Ak1 une suite de k 1 points a coordonnes rationnelles du ` e cercle C et M un point de C ; soit Ak limage de A1 par la rotation de centre O et dangle +/2. En vertu de ce qui prcde les nombres Ai Ai+1 = tan(M Ai , M Ai+1 ), e e pour i = 1, . . . , k 1, sont rationnels. La relation suivante, obtenue par application de la relation de Chasles, (M A1 , M A2 ) + (M A2 , M A3 ) + + (M Ak1 , M Ak ) = (M A1 , M Ak ) conduit alors a la relation ` A1 A2 Ak1 Ak = 1 Version 15 janvier 2005

12.3. Calcul de par arctangente

389

En pratique il est prfrable de travailler avec des points a coordonnes enti`res sur ee ` e e un cercle qui nest alors plus de rayon unit ; dautre part il est bon dobserver que si e A = (x, y) et B = (x , y ) sont deux points du cercle alors AB = xx y+y

Par exemple le cercle de rayon 5 contient les points A1 = (5, 0), A2 = (4, 3), A3 = (3, 4) et A4 = (0, 5); un simple calcul donne A1 A2 = A3 A4 = 1/3 et A2 A3 = 1/7; do` la u relation 1 1 1 1= 3 3 7 Rciproquement toute relation de type (3.5) peut tre obtenue de la sorte. e e Proposition 12.3.4. Soient a1 , . . . , ak1 des nombres rationnels tels que 1 = a1 ak1 . Alors il existe des points A1 , A2 , . . . , Ak du cercle unit, a coordonnes e ` e rationnelles, tels que ai = Ai Ai+1 . Preuve. Soit A1 le point de coordonnes (1, 0) et dnissons successivement les points e e A2 , . . . , Ak du cercle unit par e A1 A2 = a1 , . . . , Ak1 Ak = ak1 En vertu des relations (3.7) la suite des points Ai est bien dnie et les Ai sont a e ` coordonnes rationnelles. e Lanalyse qui prc`de a montr lquivalence du probl`me de la recherche des formules e e e e e a la Machin et de la rsolution lquation diophantienne : ` e e a2 + b 2 = n2 Les entiers de Gauss (voir chapitre 11) permettent de rsoudre cette quation. e e Soit n = ic(n) z1 z2 zk la dcomposition de n en produit de facteurs irrductibles sur e e lanneau des entiers de Gauss et soit Z le nombre complexe Z = z 1 zk e ` ` e e o` zi est gal soit a zi , soit a son conjugu z i . Les parties relle et imaginaire a et b de u Z sont alors solutions de lquation (3.8); en eet on a e n2 = ZZ = a2 + b2 Par exemple de 65 = i2 (1 + 2i)(2 + i)(2 + 3i)(3 + 2i), que lon prfrera crire sous la ee e forme 65 = (1 + 2i)(1 2i)(2 + 3i)(2 3i) Version 15 janvier 2005 (3.8)

390

Chapitre 12. Grands nombres

qui met en vidence les facteurs conjugus, on obtient essentiellement quatre valeurs e e possibles de Z ( a conjugaison et unit pr`s) ` e e Z1 Z2 Z3 Z4 = = = = (1 + 2i)(1 2i)(2 + 3i)(2 3i) = 65 (1 + 2i)(1 + 2i)(2 + 3i)(2 3i) = 39 + 52i (1 + 2i)(1 2i)(2 + 3i)(2 + 3i) = 25 + 60i (1 + 2i)(1 + 2i)(2 + 3i)(2 + 3i) = 33 56i

do` les dcompositions u e 652 = 652 + 02 = 392 + 522 = 332 + 562 = 252 + 602 Posons A1 = (65, 0), A2 = (39, 52), A3 = (33, 56), A4 = (25, 60) et A5 = (0, 65); un simple calcul donne A1 A2 = 1/2, A2 A3 = 1/18, A3 A4 = 2/29, A4 A5 = 1/5 do` la u relation a la Machin ` 1 2 1 1 1= 2 18 29 5

12.3.3

Programme : calcul de par arctangente

On rappelle que Arctan(u) = Avec Sn (u) =


k=0 k=0 n

(1)k u2k+1 /(2k + 1)

|u| 1

(1)k u2k+1 /(2k + 1)

lerreur Rn (u) = |Arctan(u) Sn (u)| est majore par le premier terme nglig, parce e e e que la srie est alterne. On a donc e e Rn (u) < |u|2n+3 2n + 3

Pour que ce nombre soit infrieur a bp , il sut que |u|2n+3 < bp et, avec u = 1/x, e ` cela conduit a ` n (p ln b/ ln x 3)/2 Le calcul de Sn (1/x) peut se faire par le schma suivant, proche du schma de Horner : e e on pose 2n 1 1 tn = 2n + 1 x2 et 2k 1 1 (1 tk+1 ) tk = 2k + 1 x2 Version 15 janvier 2005

12.3. Calcul de par arctangente pour 1 k n 1. Alors

391

1 (1 t1 ) x La ralisation de ces calculs se fait en utilisant le type entier que nous avons dni au e e dbut de ce chapitre. Plus prcisment, tout nombre rel r, avec |r| < b, est remplac e e e e e par lentier rbN , o` N est la taille maximale choisie. Les oprations sur ces rels sont u e e approches par les oprations sur les entiers associs. Ainsi, lvaluation de S n (1/x) se e e e e ralise comme suit : e Sn (1/x) =
PROCEDURE atan (x: chiffre; n: integer; VAR a: entier); Version simple. Calcule a = Arctan(1/x) en valuant les n premiers termes du dveloppement. e e VAR k: integer; BEGIN EntierNul(a); FOR k := 0 TO TailleMax - 1 DO a[k] := 0; a[TailleMax] := 1; a := 1 bTailleMax . FixerTaille(a, TailleMax); FixerSigne(a, 1); FOR k := n DOWNTO 1 DO BEGIN NaturelParChiffre(a, 2 * k - 1, a); a := 2k1 a. 2k+1 NaturelSurChiffre(a, 2 * k + 1, a); NaturelSurChiffre(a, x, a); a := a/x2 . NaturelSurChiffre(a, x, a); ComplementerNaturel(a, a) a := 1 bTailleMax a. END; NaturelSurChiffre(a, x, a); a := a/x. END; { de "atan" }

La procdure de complmentation scrit : e e e


PROCEDURE ComplementerNaturel (a: entier; VAR ma: entier); VAR k: integer; BEGIN ma[0] := base - a[0]; FOR k := 1 TO TailleMax - 1 DO ma[k] := base - 1 - a[k]; ma[TailleMax] := 0; k := TailleMax - 1; WHILE (k >= 0) AND (ma[k] = 0) DO k := k - 1; FixerTaille(ma, k) END; { de "ComplementerNaturel" }

On peut acclrer le calcul de larctangente, en essayant de grouper des divisions par ee des chires si cest possible, en particulier si x2 < b, o` b est la base. Voici une faon de u c faire : Version 15 janvier 2005

392

Chapitre 12. Grands nombres


Version acclre. ee e

PROCEDURE atan (x: chiffre; n: integer; VAR a: entier); VAR k: integer; y: chiffre; BEGIN EntierNul(a); FOR k := 0 TO TailleMax - 1 DO a[k] := 0; a[TailleMax] := 1; FixerTaille(a, TailleMax); FixerSigne(a, 1); IF sqr(x) < base THEN BEGIN y := sqr(x); FOR k := n DOWNTO 1 DO BEGIN NaturelParChiffre(a, 2 * k - 1, a); IF y * (2 * k + 1) < base THEN NaturelSurChiffre(a, y * (2 * k + 1), a) ELSE BEGIN NaturelSurChiffre(a, 2 * k + 1, a); NaturelSurChiffre(a, y, a) END; ComplementerNaturel(a, a) END END ELSE FOR k := n DOWNTO 1 DO BEGIN NaturelParChiffre(a, 2 * k - 1, a); NaturelSurChiffre(a, 2 * k + 1, a); NaturelSurChiffre(a, x, a); NaturelSurChiffre(a, x, a); ComplementerNaturel(a, a) END; NaturelSurChiffre(a, x, a); END; { de "atan" }

Pour le calcul de comme combinaisons linaires darctangentes, on doit valuer e e


k

4
i=1

i Arctan(1/xi )

o` 1 , x1 , . . . , k , xk sont des entiers, avec 1 < xi < b. Le nombre de termes du u dveloppement de Arctan(1/xi ) a calculer pour avoir p places dpend bien entendu e ` e de xi , et est donc valu sparment : e e e e
PROCEDURE CalculPi (places, n: integer; alpha, x: Coefficients; VAR p: entier); Calcul de par lexpression 4(1 Arctan(x1 ) + + n Arctan(xn )). VAR

Version 15 janvier 2005

12.3. Calcul de par arctangente

393

k, m: integer; a: entier; BEGIN EntierNul(p); FOR k := 1 TO n DO BEGIN m := 1 + trunc(((places * ln(base)) / ln(x[k]) - 3) / 2); atan(x[k], m, a); Calcul de Arctan(xk ). EntierParChiffre(a, alpha[k], a); Multiplication par k . EntierPlusEntier(p, a, p); Sommation. END; NaturelParChiffre(p, 4, p); Multiplication nale par 4. END; { de "CalculPi" }

Voici 2 000 dcimales de , calcules sur un Macintosh IIcx, en choisissant la base b = e e 10 000 et en utilisant la formule = 12Arctan(1/18) + 8Arctan(1/57) 5Arctan(1/239) 4 formule qui a dj` t donne par Gauss : eae e e
3 1415 6939 8628 0938 8410 4428 2712 1339 4881 0113 3305 3105 8912 8602 0539 0005 7363 1050 8640 4999 5024 2619 8142 1159 1712 3809 8230 2497 9265 9375 0348 4460 2701 8109 0190 3607 5209 3053 7270 1185 2793 1394 2171 6812 7178 7922 3441 9998 4594 3118 0617 5628 2680 5257 3019 2177 3589 1058 2534 9550 9385 7566 9145 2602 2096 0548 3657 4807 8183 9463 7629 7145 7214 7968 8159 3729 5534 8171 1776 6388 6613 2010 5203 5283 7932 2097 2117 5822 2110 5933 6485 4914 2829 8204 5959 4462 0119 9522 3176 2635 6844 9258 8136 7804 6908 0100 6914 2353 0019 6548 5301 4791 3846 4944 0679 3172 5559 4461 6692 1273 2540 6652 1953 3799 4912 4737 7523 6082 0901 9235 2977 9951 3026 0313 7303 7875 2787 5863 8529 3151 2643 5923 8214 5359 6446 2847 3460 7245 9171 1384 0921 6274 9833 1907 8467 7785 2249 4201 4771 0597 4252 7838 5982 9375 6611 2788 6899 5574 3832 0781 8086 4081 2294 5648 3486 8700 5364 1469 8611 9567 6733 0217 4818 7713 5343 9956 3099 3173 2308 7528 5349 1957 1959 6593 5773 8572 7950 6406 5132 2848 8954 2337 1045 6606 3678 5194 7381 3518 6244 9860 4676 4275 0146 1121 6051 2816 2533 8658 0428 7818 0921 6153 6225 4245 2884 2862 8230 1117 9303 8678 4326 3155 9259 1511 9326 8575 0656 9437 6940 7789 5495 2902 8707 0963 4468 7533 7554 5778 6420 3818 9941 4150 1971 0899 6647 4502 8196 3165 6482 8817 0360 6094 1179 2724 6430 0277 5132 6091 8537 1960 2113 1859 5035 2083 6873 0532 1989 2796 3891 6959

Version 15 janvier 2005

394
5082 4939 8583 4676 6208 7521 3558 6782 2861 9092 0236 5425 8164 1973 4385 6948 0494 8279 2512 1965 0471 7396 9533 3192 6160 7837 0466 6205 7640 3547 8297 7210 4806 2786 7060 5685 2332 5562 6016 6797 5205 2850 2371 2413 1168 5506 3563 4494 8425 6966 2474 8163 4555 7975 6549 2551 0161 4816 3907 0992 5346 6681 1173 2221 3786 8908 6172 0400 7076 4825 9069 0240 9647 6009 7067 0930 9119 8184 4524 1361 3941 1922 6804 4541 9298 0661 9609 6583 7855 9277 6010 5379 4912 5803 3263 3417 4983 2955 8818 1757 9192 1573 4333 2184 9886 0095 4896 1863 5636 2645 8890 0167 4710 7747 9331 8150 9141 2164 8505 3211 3479 4672 1732 5255 4547 2725 2723 3883 0841 0674 4371 9958 7509 1139 1819 2684 3677 1935 9927 1219 4945 6534 7753 8909 1721 2133 7624 5025 2791 7863 2848 4278 9172 1339 8381 0098 4295 7104 0289 1125 2604 9245 8858 4987 5663 7777 4772 4757 1686 4256 7860 6095 8626 6220 8746 0478 7546 4882 5596 0475 8915 3382 2699 8631 6926 2027 6980 2793 3501 4184 2518 8876 8578 0680 9456 3919 7764 0275

Chapitre 12. Grands nombres


3746 4012 1989 3464 2104 4300 2279 5030 9956 5596 7426 8000 4144 9468 9835 7179 4383 0642 0424 4945 6575 8968

Le calcul a pris 87.717 secondes

La valeur exacte des 4 derniers chires est 9009. Le calcul de Arctan(1/18) a demand e lvaluation de 796 termes, celui de Arctan(1/57) le calcul de 569 termes et celui de e Arctan(1/239) le calcul de 419 termes.

12.4
12.4.1

La formule de Brent-Salamin
Enonc : la formule de Brent-Salamin e

Soient a, b deux nombres rels positifs tels que a > b. On dnit deux suites (an ),(bn ) e e pour n N par a0 = a, b0 = b et, pour n 1, an = (an1 + bn1 )/2 bn = an1 bn1 1. Dmontrer que les suites (an ) et (bn ) admettent une limite commune. Cette limite e est note (a, b). e 2. On pose cn = a2 b2 . Dmontrer que e n n cn+1 = (an bn )/2 an+1 cn+1 = c2 /4 n Version 15 janvier 2005 an+1 + cn+1 = an an+1 cn+1 = bn

12.4. La formule de Brent-Salamin En dduire que la vitesse de convergence de la suite (cn ) est quadratique. e 3. On pose (a, b, ) = (a2 cos2 + b2 sin2 )+1/2 , puis
/2 /2

395

I(a, b) =
0

1/(a, b, ) d

et J(a, b) =
0

(a, b, ) d

En utilisant les galits e e I(a, b) = I(a1 , b1 ) J(a, b) + abI(a, b) = 2J(a1 , b1 ) dmontrer que e I(a, b) = 4. Utiliser lgalit e e 2I(1, pour dmontrer la formule e = 2(a, b) et J(a, b) = a2 1 2 n c2 n 2 n=0

() ()

I(a, b)

2)J(1, 1/ 2) I 2 (1, 2) = /2 42 (1, 1/ 2) 1


j=1

2j+1 c2 j

5. Utiliser lapproximation n = 1 4a2 n+1


n

2j+1 c2 j
j=1

de pour crire un programme qui calcule a N dcimales. e ` e 6. On se propose maintenant de dmontrer () et (). A cette n on utilise le e changement de variable b tan(1 ) = tan a a) Dmontrer les relations e a1 cos(2 1 ) c1 cos 1 a1 cos(2 1 ) + c1 cos 1 a1 sin(2 1 ) c1 sin 1 a1 cos(2 1 ) = = = = ab/(a, b, ) (a, b, ) 0 (a1 , b1 , 1 )

b) En dduire que et 1 vrient lquation direntielle e e e e 2(a1 , b1 , 1 ) d = (a, b, ) d1 c) Dmontrer () puis (). e Version 15 janvier 2005

396

Chapitre 12. Grands nombres

12.4.2

Solution : la formule de Brent-Salamin

En 1976, Brent et Salamin ont observ, de mani`re indpendante, que lalgorithme clase e e sique de calcul des intgrales elliptiques, utilisant la moyenne arithmtico-gomtrique, e e e e peut tre combin avec lidentit de Legendre pour fournir un algorithme quadratique e e e de calcul de . La mise en uvre de cet algorithme a conduit au dbut des annes 80 e e a la dtermination de 16 millions de dcimales de . Actuellement, on en conna un ` e e t milliard de dcimales. e La dcouverte et ltude de la moyenne arithmtico-gomtrique sont associes aux noms e e e e e e de Lagrange et de Gauss. La connexion avec les intgrales elliptiques est en particulier e due au mathmaticien anglais du dix-huiti`me si`cle John Landen, au travers de la e e e transformation qui porte son nom et qui nous servira de cheval de bataille pour tablir e deux des trois formules cls conduisant a lexpression de utilise par Brent et Salamin. e ` e Nous commenons par introduire la moyenne arithmtico-gomtrique. c e e e Soient a et b deux rels positifs tels que a > b. Les suites (an ) et (bn ) des moyennes e arithmtiques et gomtriques sont dnies par la rcurrence : e e e e e a0 = a1 = . . . an+1 = . . .
1 2 1 2

a (a0 + b0 ) (an + bn )

b0 = b b 1 = a 0 b0 . . . bn+1 = an bn . . . ab <
a+b 2 ,

(4.1)

Observons, en usant en particulier de lingalit de la moyenne e e b < b1 < a1 < a et que a1 b 1 a 1 b = Do` par itration u e 1 (a b) 2

que

b < b 1 < b2 < b3 < < a 3 < a2 < a1 < a et an b n 1 2


n

(a b)

Ainsi, (bn ) est croissante majore et (an ) est dcroissante minore. Les deux suites sont e e e alors convergentes et la derni`re ingalit montre quelles admettent la mme limite. e e e e Par dnition la limite commune des suites (an ) et (bn ), note (a, b), est la moyenne e e arithmtico-gomtrique de a et b. e e e Pour valuer la rapidit de convergence des suites (an ) et (bn ) nous introduisons la suite e e (cn ), a termes positifs, dnie par ` e c2 = a 2 b 2 n n n Version 15 janvier 2005 (4.2)

12.4. La formule de Brent-Salamin Proposition 12.4.1. Les suites (an ), (bn ) et (cn ) sont lies par les relations e cn+1 = (an bn )/2 an+1 cn+1 = c2 /4 n Preuve. En eet, en utilisant (4.1), il vient c2 = a 2 b 2 = n+1 n+1 n+1 Puis an+1 + cn+1 = an+1 cn+1 et enn 1 1 (an + bn )2 an bn = (an bn )2 4 4 an+1 + cn+1 = an an+1 cn+1 = bn

397

(4.3)

1 1 (an + bn ) + (an bn ) = an 2 2 1 1 = (an + bn ) (an bn ) = bn 2 2

1 1 (an + bn )(an bn ) = c2 4 4 n Cette derni`re galit montre que la convergence de la suite (cn ) (et par suite galement e e e e la convergence des suites (an ) et (bn )) est quadratique ou encore du second ordre; en eet, en usant de la dcroissance de la suite (an ), il vient e an+1 cn+1 = cn+1 1 c2 4(a, b) n

Plus gnralement la convergence dune suite (un ) de limite l est dite dordre m 1 sil e e existe une constante C > 0 telle que |un+1 l| C|un l|m Pour C voisin de 1 une itration fait passer de la prcision 10p a la prcision 10mp . e e ` e Les suites (an ), (bn ) et (cn ) obtenues pour a = 1, b = 1/ 2 permettent de calculer en utilisant la formule de Brent-Salamin : 42 (1, 1/ 2) = 1 2n+1 c2 n
n=1

Les intgrales elliptiques du premier et du second ordre sont dnies par e e


/2 /2

I(a, b) =
0

1/(a, b, ) d

et J(a, b) =
0

(a, b, ) d

(4.4)

o` u

(a, b, ) = (a2 cos2 + b2 sin2 )+1/2

(4.5)

Les deux thor`mes suivants tablissent le lien entre la moyenne arithmtico-gomtrique e e e e e e et les intgrales elliptiques du premier et du second ordre. e Version 15 janvier 2005

398 Thor`me 12.4.2. Soient a > b > 0. Alors e e I(a, b) = I(a1 , b1 ) et

Chapitre 12. Grands nombres

(4.6) (4.7)

J(a, b) + abI(a, b) = 2J(a1 , b1 ) o` a1 et b1 sont dnis par (4.1). u e Thor`me 12.4.3. Soient a > b > 0. Alors e e I(a, b) = 2(a, b) et J(a, b) = a2 1 2 n c2 n 2 n=0

I(a, b)

o` cn est dnie par (4.2). u e Pour tablir le premier thor`me nous introduisons la transformation de Landen qui e e e associe au rel , de lintervalle [0, /2], le rel 1 dni par e e e 1 = + Arctan b tan a (4.8)

Des proprits lmentaires de la fonction tangente, nous dduisons que la transformae e ee e tion de Landen est un diomorphisme croissant de lintervalle [0, /2] sur lintervalle e [0, ]. Observons que (1 ) est largument du nombre complexe a cos + i b sin a cos + i b sin = (a, b, ) ei(1 ) La proposition suivante rassemble les proprits utiles a notre propos de la transformaee ` tion de Landen. Proposition 12.4.4. La transformation de Landen 1 vrie les quations e e a1 cos(2 1 ) c1 cos 1 a1 cos(2 1 ) + c1 cos 1 a1 sin(2 1 ) c1 sin 1 a1 cos(2 1 ) ainsi que lquation direntielle e e d1 1 d = (a, b, ) 2 (a1 , b1 , 1 ) (4.10) = = = = ab/(a, b, ) (a, b, ) 0 (a1 , b1 , 1 ) (4.9)

Preuve. Pour simplier les notations posons = (a, b, ) et 1 = (a1 , b1 , 1 ). Les deux premi`res quations se dduisent lune de lautre, sous lhypoth`se de validit e e e e e de la quatri`me quation, en remarquant que le produit de leurs membres gauches gale e e e ab; en eet 2 (c1 cos 1 )2 = (a2 c2 ) cos2 1 + b2 sin2 1 = b2 = ab 1 1 1 1 1 Version 15 janvier 2005

12.4. La formule de Brent-Salamin

399

Dautre part la quatri`me quation se dduit de la troisi`me, comme le montre le calcul e e e e suivant a2 cos2 (2 1 ) = a2 a2 sin2 (2 1 ) = a2 c2 sin2 1 = 2 1 1 1 1 1 1 et le fait que cos(2 1 ) 0 car (2 1 ) appartient a [0, /2]. Il sut donc de ` dmontrer, par exemple, la deuxi`me et la troisi`me quation. Pour cela nous observons e e e e que leurs membres gauches sont, respectivement, la partie relle et la partie imaginaire e du nombre complexe a1 ei(21 ) +c1 ei1 . Or ce nombre complexe co ncide avec ; en eet a1 ei(21 ) +c1 eii = ei(1 ) a1 ei +c1 ei = ei(1 ) {a cos + ib sin } = ei(1 ) ei(1 ) = = ei(1 ) {(a1 + c1 ) cos + i(a1 c1 ) sin }

ce qui termine la preuve de la premi`re partie de la proposition. e Pour dmontrer la seconde partie nous direntions la troisi`me quation de (4.9); il e e e e vient, apr`s regroupement des termes en d et d 1 , e 2a1 cos(2 1 ) d = (c1 cos 1 + a1 cos(2 1 )) d1 qui scrit encore, toujours en utilisant (4.9), 21 d = d1 , ce qui termine la preuve e de la proposition. Preuve du thor`me 12.4.2. En intgrant lquation direntielle (4.10) pour [0, /2] e e e e e (et par suite 1 [0, ]) nous obtenons la premi`re identit e e
/2

I(a, b) =
0

d 1 = (a, b, ) 2

d1 = (a1 , b1 , 1 )

/2 0

d1 = I(a1 , b1 ) (a1 , b1 , 1 )

La seconde identit sobtient de mani`re similaire; posons, pour simplier les notations, e e = (a, b, ) et 1 = (a1 , b1 , 1 ). Lquation direntielle 21 d = d1 scrit e e e encore, en utilisant 21 = + ab/ et = 1 + c1 cos 1 (cf. 4.9), ( + ab/) d = (1 + c1 cos 1 ) d1 que nous intgrons pour [0, /2] (et par suite 1 [0, ]) pour obtenir la seconde e identit e J(a, b) + abI(a, b) = 2J(a1 , b1 ) Preuve du thor`me 12.4.3. Par itration de la relation (4.6) nous crivons e e e e I(a, b) = I(a1 , b1 ) = = I(an , bn ) Version 15 janvier 2005

400

Chapitre 12. Grands nombres

La fonction I(a, b) tant continue par rapport a ses param`tres, il vient e ` e I(a, b) = lim I(an , bn ) = I((a, b), (a, b)) =
n

2(a, b)

Pour la seconde galit nous transformons (4.7), en utilisant a2 2a2 = 1/2c2 ab, en e e 1 0 1 J(a, b) a2 I(a, b) 2 J(a1 , b1 ) a2 I(a1 , b1 ) = c2 I(a, b) 1 2 0 La mme galit vaut si lon substitue an , bn a a, b, et an+1 , bn+1 a a1 , b1 . En combinant e e e ` ` les galits ainsi obtenues pour n variant de 0 a linni il vient e e ` J(a, b) a2 I(a, b) A = = o` u A = lim 2n J(an , bn ) a2 I(an , bn ) n
n /2

1 2n c2 I(an , bn ) n 2 n=0 1 2 n c2 n 2 n=0

I(a, b)

= lim

2n c2 sin2 n d (a2 cos2 + b2 sin2 )1/2 n n

= lim O(2n c2 ) = 0 n
n

car la convergence de cn vers 0 est quadratique. Il sut alors de rsoudre en J(a, b) e pour terminer la dmonstration. e La troisi`me et derni`re formule ncessaire pour obtenir celle de Brent-Salamin est la e e e formule de Legendre sur les intgrales elliptiques. e Thor`me 12.4.5. Pour |x| < 1, posons e e
/2

K(x) = et x =
0

(1 x2 sin2 )1/2 d

/2

et

E(x) =
0

(1 x2 sin2 )1/2 d

(4.11) 2 Preuve. Soit c = x2 et c = 1 c et posons E = E(x), K = K(x). Un simple calcul donne K(x)E(x ) + K(x )E(x) K(x)K(x ) = d d (E K) = dc dc = Version 15 janvier 2005
/2 0

x2 .

Alors

E 1 2c 2c

/2 0

c sin2 d (1 c sin2 )1/2

1 d (1 c sin2 )3/2

12.4. La formule de Brent-Salamin De

401

d d

nous dduisons que e

sin cos (1 c sin2 )1/2

1 c (1 c sin2 )1/2 (1 c sin2 )3/2 c c

/2 E E 1 d d (E K) = + dc 2c 2cc 2c 0 d E 1 E = 1 = 2c c 2c

sin cos (1 c sin2 )1/2

(4.12) (4.13)

Pour simplier les notations, posons K = K(x ) et E = E(x ). De c = 1 c, il suit que d E (E K ) = (4.14) dc 2c Enn, des calculs simples conduisent a ` dE EK = dc 2c et dE E K = dc 2c (4.15)

Si G dsigne le membre gauche de (4.11), nous pouvons crire G sous la forme e e G = EE (E K)(E K ) En usant de (4.12-4.15), nous trouvons que dG (E K)E E(E K ) E(E K ) (E K)E = + =0 dc 2c 2c 2c 2c Ainsi, G est une constante et nous dterminons sa valeur en faisant tendre c vers 0. e Premi`rement, e /2 sin2 E K = c d = O(c) (1 c sin2 )1/2 0 lorsque c tend vers 0. Puis,
/2 /2 0

K =
0

(1 c sin2 )1/2 d

(1 c )1/2 d = O(c1/2 )

lorsque c tend vers 0. Enn,


c0

lim G = lim {(E K)K + E K}


c0

= lim O(c1/2 ) + 1
c0

et la preuve est compl`te. e Nous sommes maintenant en mesure de dmontrer la formule de Brent-Salamin. e Version 15 janvier 2005

402 Thor`me 12.4.6. e e = 42 (1, 1/ 2) 1 o` (cn ) est dnie par (4.2). u e


n=1

Chapitre 12. Grands nombres

(4.16)

2n+1 c2 n

Preuve. Prenons x = x = 1/ 2 dans le thor`me 12.4.5, nous trouvons que e e 1 1 1 2K( )E( ) K 2 ( ) = (4.17) 2 2 2 2 e e Dautre part, en posant a = 1 et b = 1/ 2 dans le thor`me 12.4.3, on voit que E car I(1, 1 2 = 1 1 2 n c2 n 2 n=0

1 2

(4.18)

2) = K(1/ 2) et J(1, 1/ 2) = E(1/ 2). Enn, en usant du thor`me 12.4.3, e e (1, 1/ 2) = 2K(1/ 2) (4.19)

On compl`te la preuve en substituant (4.18) dans (4.17), en employant (4.19), en notant e que c2 = 1/2 et en rsolvant pour . e 0 Pour terminer, nous donnons sans dmonstration la majoration de lerreur commise sur e le calcul de en prenant la valeur approche suivante e n = 1 4a2 n+1
n

(4.20)

2i+1 c2 i
i=1

Thor`me 12.4.7. La suite n est croissante, converge vers et satisfait les ingalits e e e e n et n+1 2(n+1) ( n )2 2 2 2n+4 exp(2n+1 ) 2 (1, 1/ 2)

La deuxi`me ingalit montre en particulier que la convergence de n vers est quadrae e e tique. Version 15 janvier 2005

12.4. La formule de Brent-Salamin

403

12.4.3

Programme : la formule de Brent-Salamin

Pour le calcul de par la formule de Brent-Salamin, on value lapproximation e n = 1 o` a0 = 1, b0 = 1/ 2 et pour n 1 u an = (an1 + bn1 )/2 bn = an1 bn1 cn = an1 an
2 En fait, il sut de disposer de a2 t n+1 et de cn , et il appara que lon peut calculer par rcurrence ces valeurs. Si lon pose, en eet, n = a2 , n = b2 et n = c2 , on obtient e n n n 0 = 1, 0 = 1/2 et, pour n 0,

4a2 n+1
n

2j+1 c2 j
j=1

n+1 = n n 4n+1 = n + n + 2n+1 Dans la procdure ci-dessous, on calcule n+1 , n+1 et n a partir des valeurs correse ` pondantes pour n 1. Il est commode de garder aussi 2n+1 (dans une variable n ) ainsi que le dnominateur de n . Enn, pour calculer n+1 , on calcule dabord la racine de e 1/n n et, comme les valeurs changent peu, mieux vaut partir pour lvaluation de la e valeur obtenue a litration prcdente de . ` e e e
PROCEDURE IterationPi (VAR alpha, beta, gamma, delta, D, piapproche: Flottant); Calcule lapproximation suivante de . D est le dnominateur, e UnSurRBeta est linverse de la racine de . VAR N: Flottant; alphaPlusbeta, deltagamma: Flottant; BEGIN Calcul de FlottantMoinsFlottant(alpha, beta, gamma); FlottantPlusFlottant(alpha, beta, alphaPlusbeta); Calcul de FlottantParFlottant(alpha, beta, beta); FlottantUnSurRacineIteration(beta, UnSurRBeta); FlottantParFlottant(beta, UnSurRBeta, beta); Calcul du numrateur e N := beta; UnSurD, UnSurRBeta, UnSurD est son inverse,

n = n n

Numrateur de n . e

n = n n . n + n . 1/ n n . n+1 .

Version 15 janvier 2005

404

Chapitre 12. Grands nombres


FlottantparChiffre(N, 2); FlottantPlusFlottant(alphaPlusbeta, N, N); Calcul de alpha := N; FlottantSurChiffre(alpha, 4); Calcul du dnominateur e FlottantParChiffre(delta, 2); FlottantParFlottant(delta, gamma, deltagamma); FlottantMoinsFlottant(D, deltagamma, D); Calcul de FlottantInverseIteration(D, UnSurD); FlottantParFlottant(N, UnSurD, piapproche) END; { de "IterationPi" }

N n = n +n +2n+1 .

n+1 = N/4.

D n = Dn1 2n+1 n . n = Nn /Dn .

Cette procdure est employe par : e e


PROCEDURE CalculPiParSalamin (VAR piapproche: Flottant); VAR vieuxpi: Flottant; UnSurD, D: Flottant; alpha, beta, gamma, UnSurRBeta, delta: Flottant; BEGIN Initialisation pour n = 1. ChiffreEnFlottant(D, 2); D1 = 2. ChiffreEnFlottant(UnSurD, 1); ChiffreEnFlottant(alpha, 1); 0 = 1. ChiffreEnFlottant(beta, 1); FlottantSurChiffre(beta, 2); 0 = 1/2. ChiffreEnFlottant(UnSurRBeta, 1); ChiffreEnFlottant(delta, 1); 0 = 1. ChiffreEnFlottant(piapproche, O); 1 = 0, p.ex. REPEAT vieuxpi := piapproche; IterationPi(alpha, beta, gamma, delta, D, UnSurD, UnSurRBeta, piapproche); UNTIL (FlottantProches(vieuxpi, piapproche)) OR (LeSigne(gamma) = -1); END; { "CalculPiParSalamin" }

Deux remarques : pour le calcul de linverse du dnominateur, on prend comme valeur e approche de dpart la valeur prcdente de ce nombre; en eet, la suite converge et e e e e mme tr`s rapidement. e e Notons le test darrt dans la procdure. Les erreurs darrondi jouent a plein lors du e e ` calcul de n comme dirence de n et n . Comme ces suites convergent vers la mme e e valeur, la valeur approche de n ne porte que sur les derniers chires de ces nombres. e Il se peut que cette valeur devienne tr`s petite, mais ngative. On arrte dans ce cas e e e puisque les rsultats ne sont plus signicatifs. e
n = 0 gamma = 0. 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 0

Version 15 janvier 2005

12.4. La formule de Brent-Salamin


beta numer alpha denom piapp n = 1 gamma beta numer alpha denom piapp n = 2 gamma beta numer alpha denom piapp n = 3 gamma beta numer alpha denom piapp n = 4 gamma beta numer alpha denom piapp n = 5 gamma beta numer alpha denom piapp = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 70 02 72 01 02 02 71 02 71 91 03 40 71 02 71 91 03 01 71 02 71 91 03 16 71 02 71 91 03 19 71 02 71 91 03 71 91 85 00 91 14 77 87 77 42 14 04 77 87 77 38 14 39 77 87 77 38 14 98 77 87 77 38 14 00 77 87 77 38 14 06 42 53 00 42 46 49 11 90 13 05 97 70 10 70 93 15 66 70 10 70 93 15 57 70 10 70 93 15 00 70 10 70 93 15 78 13 39 00 13 60 98 60 03 56 79 56 01 80 01 16 92 72 01 80 01 16 92 07 01 80 01 16 92 00 01 80 01 16 92 11 56 05 00 56 94 63 14 61 23 25 18 09 04 11 43 64 11 10 04 10 20 65 08 10 04 10 20 65 00 10 04 10 20 65 86 23 93 00 23 06 77 45 33 73 05 65 76 44 15 23 62 09 46 41 46 88 35 21 46 41 46 88 35 00 46 41 46 88 35 54 73 27 00 73 72 53 34 72 09 22 52 29 63 96 60 13 84 12 84 12 92 89 83 12 84 12 92 89 00 12 84 12 92 89 75 09 37 00 09 62 75 89 40 50 16 55 63 85 36 26 54 13 99 51 99 72 79 99 99 51 99 72 79 00 99 51 99 72 79 24 50 62 00 50 37 38 63 90 48 82 28 92 44 03 28 22 69 97 99 97 50 32 23 97 99 97 50 32 00 97 99 97 50 32 40 48 20 00 48 79 19 62 74 80 48 47 27 13 37 37 82 08 82 91 82 80 38 73 82 91 82 74 38 00 82 91 82 74 38 08 80 04 00 80 95 49 99 77 16 31 77 45 49 29 89 14 22 03 28 20 42 27 00 11 28 11 99 46 00 11 28 11 99 46 44 16 22 00 16 77 37 11 85 88 13 04 34 17 47 06 93 73 43 81 42 87 95 00 93 47 93 33 26 00 93 47 93 33 26 36 88 18 00 88 81 73 42 50 72 31 10 23 91 92 56 44 13 93 70 50 50 12 00 22 72 22 24 43 00 22 72 22 24 43 21 72 10 00 72 89 07 00 11 42 26 95 43 70 51 09 43 26 83 03 90 77 77 00 36 89 36 50 38 00 36 89 36 50 38 04 42 52 00 42 47 56 46 67 09 89 51 16 05 39 22 19 06 11 60 19 58 48 00 65 46 65 95 32 00 65 46 65 95 32 84 09 42 00 09 57 72 70 68 69 75 76 74 57 47 05 82 20 67 79 88 35 01 00 77 63 77 36 79 00 77 63 77 36 79 90 69 45 00 69 54 64 72 16 80 82 55 13 89 26 66 69 00 02 55 86 54 86 00 94 11 94 66 50 00 94 11 94 66 50 39 80 19 00 80 80 26 64 02 78 33 48 62 07 88 66 57 00 27 45 26 49 39 00 26 77 26 73 28 00 26 77 26 73 28 28 78 64 00 78 35 34 11 90 58 11 00 48 54 55 14 74 00 03 05 27 14 73 00 65 06 65 55 83 00 65 06 65 67 82 50 57 00 00 57 50 52 61 00 00 75 00 80 21 00 16 14 00 27 09 00 96 88 00 19 60 00 60 04 00 11 60 00 76 61 E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E 0 1 0 1 1 0 0 1 0 0 1

405

-2 0 1 0 0 1 -4 0 1 0 0 1 -10 0 1 0 0 1 -19 0 1 0 0 1

=-0. = 0. = 0. = 0. = 0. = 0.

pi = 0. 03 14 15 92 65 35 89 79 32 38 46 26 43 38 32 79 50 28 82 61 E 1

La valeur exacte de se termine par les chires 84 20. Comme annonc, la valeur e approche de n devient ngative. e e Version 15 janvier 2005

406

Chapitre 12. Grands nombres

Notes bibliographiques
Les algorithmes pour larithmtique en multiprcision se trouvent notamment dans : e e D. E. Knuth, The Art of Computer Programming, Vol. II Seminumerical Algorithms, Reading, Addison-Wesley, 1968. Ce livre contient aussi une discussion dtaille de e e la faon de minimiser les erreurs darrondi. c Linterprtation combinatoire des formules darctangentes est expose dans : e e B. Grco, Papier quadrill et calcul de pi, Bulletin de lAPMEP 354 (1986), 347361. e e Pour la dtermination de formules a la Machin on peut aussi consulter : e ` J.P. Friedelmeyer, Arcs de cercle a tangente rationnelle et entiers imaginaires premiers, ` Bulletin de lAPMEP 358 (1987), 145159. J. Todd, A problem on arc tangent relations, American Mathematical Monthly 56 (1949), 517528. La formule de Brent-Salamin a t donne indpendamment par : ee e e R. P. Brent, Fast multiple-precision evaluation of elementary functions, J. Assoc. Comput. Mach. 23 (1976), 242251. E. Salamin, Computation of using arithmetic-geometric mean, Math. Computation 30 (1976), 565570. La moyenne arithmtico-gomtrique sapplique aussi au calcul numrique des fonctions e e e e lmentaires comme log x, ex , sin x et cos x. On consultera a ce sujet larticle de Brent. ee ` Un expos synthtique est : e e G. Almkvist, B. Berndt, Gauss, Landen, Ramanujan, The arithmetic-geometric mean, ellipses, , and the Ladies Diary, American Math. Monthly 95 (1988), 585608. Enn, un expos approfondi est : e J. M. Borwein, P. B. Borwein, Pi and the AGM, New York, Wiley and Sons, 1987.

Version 15 janvier 2005

Annexes

407

Annexes

409

411

Annexe A

Un environnement
A.1 Conseils de programmation

Un programme, ou un ensemble de procdures, nest pas seulement un moyen de commue nication avec lordinateur. Cest aussi une faon de prsenter un algorithme, et donc un c e support dchanges entre personnes. Dans cette optique, un programme doit tre rdig e e e e et prsent de faon lisible. Bien videmment, ceci est passablement subjectif. Dans e e c e lidal, un programme bien crit se lit a la mme vitesse quun texte mathmatique bien e e ` e e rdig. Cela va en gnral moins vite que la lecture dun roman policier, mais il ny a e e e e pas de raison que cela aille beaucoup moins vite. Pour arriver a cette facilit de lecture, ` e il y a quelques r`gles a observer. e ` Tout dabord, une procdure doit tre courte. Un programme qui stale sur plusieurs e e e pages, o` lon est constamment oblig de faire des alles et venues entre le dbut, u e e e contenant les dnitions (dclarations) et le texte lui-mme, ne facilite pas la lecture. e e e Pour arriver a des procdures courtes, il faut structurer le programme, et donc aussi ` e lalgorithme sous-jacent, en mettant en vidence des groupements organiques de calculs e lmentaires. ee On proc`de en fait comme dans une dmonstration mathmatique un peu longue : e e e on met en vidence un certain nombre de lemmes, ou de propositions intermdiaires, e e et la dmonstration du thor`me lui-mme se rduit alors a un encha e e e e e ` nement logique judicieux de proprits tablies auparavant. En ce sens, len-tte dune procdure peut ee e e e se comparer a lnonc dune proposition, et le corps de la procdure a la dmonstration. ` e e e ` e Remarquons que cette dmarche, qui en mathmatique conduit parfois a des lemmes e e ` qui ont un intrt intrins`que , conduit en programmation a des algorithmes dont la e e e ` porte dpasse le cadre initial. e e Un programme, bien plus encore quune dmonstration, doit tre accompagne de come e e mentaires. Ils paraphrasent le cheminement algorithmique, rsument les groupements e dinstructions, mettent en garde contre des oublis, justient les hypoth`ses; en dbut de e e Version 15 janvier 2005

412

Annexe A. Un environnement

procdure, le commentaire explique la nature des param`tres et rsume les restrictions e e e (variable non nulle par exemple). On entend parfois dire que les commentaires doivent avoir la mme longueur que le programme, tellement ils contribuent a la comprhension e ` e du programme. Sans aller jusque-l`, on ne peut quencourager la multiplication des a commentaires. Nommer les objets Le choix des notations, en mathmatiques, est un autre lment qui facilite la lecture. e ee En gnral, une variable relle est note x et non pas i, lindice dun vecteur est not e e e e e i et rarement z. On procdera de la mme mani`re pour la rdaction des procdures. e e e e e Voici un exemple a viter : `e
FUNCTION a (b: integer): integer; VAR c, d: integer; e: boolean; BEGIN a := b; e := false; c := 1; REPEAT d := f[i]; e := b MOD d = 0; IF e THEN a := d ELSE c := c + 1 UNTIL (d * d > b) OR e; END; { de "a" }

Voici la mme procdure, qui cherche dans une table NombresPremiers de nombres e e premiers le plus petit facteur premier de lentier n donn en argument : e
FUNCTION FacteurPremier (n: integer): integer; VAR i, p: integer; EstCompose: boolean; BEGIN FacteurPremier := n; EstCompose := false; i := 1; REPEAT p := NombresPremiers[i]; EstCompose := n MOD p = 0; IF EstCompose THEN FacteurPremier := p

Version 15 janvier 2005

A.1. Conseils de programmation


ELSE i := i + 1 UNTIL (p * p > n) OR EstCompose; END; { de "FacteurPremier" }

413

Comment choisir les noms des variables et des procdures? Ce choix est a la fois plus e ` simple et plus compliqu quen mathmatiques. Plus compliqu, parce que lon ne dise e e pose que du seul alphabet latin et daucun signe diacritique (`ches, indices, points, e accents); plus simple parce que, contrairement a lusage en mathmatiques, des noms ` e composs de plusieurs caract`res (comme Ker, dt, etc.) non seulement sont frquents, e e e e mais en fait souhaits. Il ny a pratiquement pas de limite a la longueur des noms des e ` identicateurs : bien que la norme originale de Pascal Standard prcise que seuls les e huit premiers caract`res dun identicateur sont signicatifs, la plupart des compilae teurs rcents repoussent cette limite a trente-deux ou au-del`, et il faut faire amplement e ` a usage de cette possibilit. Ainsi, PlusPetitFacteurPremier aurait t un titre bien plus e ee instructif pour la fonction ci-dessus (lisez a voix haute : PlusPetitFacteurPremier de ` n). Lemploi didenticateurs courts raccourcissait le temps de frappe et les erreurs de frappe lorsque lon disposait seulement dditeurs de textes rudimentaires (sans parler e des temps prhistoriques et des cartes perfores). Maintenant, les diteurs sont susame e e ment dvelopps pour permettre des copies instantanes. En revanche, il est inutile de e e e charger les identicateurs, lorsque lusage mathmatique ou informatique courant rend e leur signication claire : p dsigne en gnral un nombre premier et i est un indice. On e e e peut donc raisonnablement viter lexc`s contraire, consistant a crire par exemple : e e `e
iteration := 1; REPEAT PremierCourant := NombresPremiers[iteration]; EstCompose := n MOD PremierCourant = 0; IF EstCompose THEN FacteurPremier := PremierCourant ELSE iteration := iteration + 1 UNTIL (PremierCourant * PremierCourant > n) OR EstCompose;

Le plus souvent, les compteurs de boucles, qui reviennent frquemment, sont identis e e par une seule lettre : i, j, k, n, etc. En revanche, nous avons choisi des noms longs, parfois presque excessivement longs, pour les noms des procdures, pour que leet e de la procdure soit le plus compl`tement possible dcrit dans le nom mme. Ainsi e e e e MatricePlusMatrice, ou EchangerColonnes ou encore EcrireMatriceHermitienne. Cette faon de faire a lavantage de permettre la transposition instantane des foncc e tions a dautres contextes : par exemple, FlottantPlusFlottant est manifestement ` len-tte dune procdure daddition de deux ottants , quelle que soit la signication e e de ottant : il sagit en fait de transposer, dans un contexte de programmation, la convention qui veut que + dsigne laddition, dans nimporte quelle structure algbrique e e (dans un langage de programmation plus volu, ce genre de convention est dailleurs e e ralisable). Le choix du nom convenable pour une procdure devient alors presque ene e fantin : laddition de deux nombres rationnels sappelle RatPlusRat, et pour des vecteurs Version 15 janvier 2005

414

Annexe A. Un environnement

a coecients complexes VecteurCPlusVecteurC. Une autre solution, frquemment em` e ploye, consiste a sparer les constituants dun identicateur par le caract`re de soulignee ` e e ment , a dfaut du tiret - qui est plus naturel, mais interdit en Pascal. On peut ainsi ` e e e crire rat plus rat ou vecteur c plus vecteur c. On gagne peut-tre en lisibilit ; en e change, les en-ttes de procdure se rallongent encore plus. (En Fortran, o` le blanc e e e u nest pas signicatif, on peut crire tr`s commodment matrice plus matrice; en Lisp, e e e le tiret est utilisable et on dispose dautres caract`res prcieux : ainsi, on peut crire e e e Nul? au lieu de notre EstNul.) Ces r`gles ne vont pas sans exception. Ainsi, quelques types reviennent constamment e dans les programmes et, pour ne pas trop allonger le texte, nous appelons vec et mat les types vecteur et matrice, et pol le type polynme. o Organiser les structures Un autre probl`me qui se pose est lacc`s, la modication et la construction dobjets e e complexes. Considrons par exemple les nombres complexes. Un nombre complexe est e reprsent par un couple de rels, ses parties relle et imaginaire. Il faut pouvoir y e e e e accder, les modier et pouvoir construire un complexe a partir de deux rels. Ces e ` e procdures sont faciles a crire, mais dpendent videmment de la reprsentation choisie : e `e e e e nous dnissons un complexe par e
TYPE complexe = ARRAY[0..1] OF real;

mais un lecteur qui conna les enregistrements prf`re peut-tre la dnition : t ee e e


TYPE complexe = RECORD PartieReelle,PartieImaginaire : real END;

Pour rendre un programme indpendant de la reprsentation choisie, on convient dace e cder aux structures complexes seulement a travers des procdures convenues. Ainsi, e ` e la partie relle dun nombre complexe z ne sera pas appele par z[0], mais a travers e e ` une procdure Re(z). De la mme mani`re, on peut convenir de ranger le degr dun e e e e polynme dans lemplacement dindice 1 du tableau de ses coecients (ou dans celui o dindice maximal) ou ailleurs encore, mais lappel se fera uniquement par une fonction bien prcise. e Cette faon de procder a non seulement lavantage de rendre limplmentation plus c e e souple, mais aussi de rendre la lecture plus facile. En eet, avec lune des conventions cidessus pour le degr, on crit d := round(p[-1]) ou encore d := round(p[degremax]) e e l` o` d := degre(p) est bien plus parlant. a u Ces oprations se font en fait par paires : on veut rcuprer la partie relle dun come e e e plexe, et la modier, de mme, obtenir et xer le degr dun polynme. En anglais, il e e o existe une convention de notation commode, fonde sur le couple get et set (ainsi e Version 15 janvier 2005

A.1. Conseils de programmation

415

on peut crire GetDegree et SetDegree), mais en franais, on ne dispose pas de voe c cables aussi brefs et aussi parlants. Nous avons choisi le prxe Fixer chaque fois que e lon veut changer un attribut, et labsence de prxe pour lobtenir : ainsi FixerRe et e FixerDegre; ou encore FixerNumerateur et Numerateur. L` encore, le choix fait se a transpose (fonctoriellement!) a travers les divers exemples traits. ` e Passer les param`tres e Lors de lappel dune procdure ou fonction, les param`tres formels sont remplacs par e e e les param`tres dit actuels . La substitution se fait diremment selon que le passage e e du param`tre est par valeur ou par rfrence (ce mode de passage tant spci par le e ee e e e prxe VAR dans la dclaration). e e Le passage par valeur seectue comme suit : lexpression substitue au param`tre formel e e est value et le rsultat est transfr dans une variable locale a la procdure. Toute e e e e e ` e rfrence au param`tre formel interne au corps de la procdure est remplac par la ee e e e variable locale a la procdure. A la n de lexcution de la procdure, la variable locale ` e e e dispara Considrons par exemple la procdure : t. e e
PROCEDURE somme (a, b, c:integer); BEGIN c := a + b END ;

Lexcution de somme(5,x+3,z) quivaut a e e `


alocal := 5; blocal := x+3 ; clocal := z ; clocal := alocal + blocal

et en particulier, la valeur de z est inchange apr`s lexcution. e e e Le passage par rfrence seectue diremment : ce nest pas un contenu qui est transee e mis, mais ladresse dune variable (la localisation de lemplacement). Plus prcisment, e e lexpression substitue au param`tre formel est value et doit dsigner une adresse. e e e e e Lexpression est donc tr`s particuli`re : cest une variable ou une variable indice (ou e e e toute autre expression dont le rsultat est une adresse). Puis, ladresse ainsi obtenue e remplace le param`tre formel en toutes ses occurrences. Considrons par exemple : e e
PROCEDURE produit (VAR a, b, c:integer); BEGIN c := a * b END ;

Les trois param`tres sont passs par rfrence. On ne peut donc pas appeler produit(x, e e ee y+3, z) parce que le rsultat de lvaluation de y+3 nest pas une adresse. En revanche, e e produit(u[i], v[i], w[i]) est un appel licite. Si lon veut que le rsultat dun calcul soit disponible a la sortie dune procdure, le e ` e param`tre correspondant doit ncessairement tre pass par rfrence. En revanche, une e e e e ee quantit qui intervient dans un calcul sans tre modie est passe en valeur. Toutefois, e e e e Version 15 janvier 2005

416

Annexe A. Un environnement

on peut parfois gagner du temps en choisissant un passage par rfrence plutt que ee o par valeur; ainsi, si le param`tre est une matrice, le passage par rfrence ne demande e ee que lvaluation du nom, alors que le passage par valeur provoque la cration dune e e matrice locale a la procdure et la recopie de la matrice avant toute excution. Le temps ` e e supplmentaire pris par la recopie peut tre tr`s important en pourcentage, car cette e e e recopie concerne la taille maximale du tableau. Ainsi, si OrdreMax est x a 20, ce sont e` 400 lments qui sont recopis, mme si les matrices considres dans un programme ee e e e e particulier ne sont que dordre 2. Le surcot, pris par rapport a laddition de deux u ` matrices, peut aller de quelques pour cents a plus de 700 % pour les grandeurs donnes ` e ci-dessus. Or, la recopie est inutile lorsque lon est certain de ne jamais modier le contenu de la matrice, comme par exemple dans une procdure dimpression. Dans ces e cas, on pourra dclarer le param`tre en rfrence. Dans les autres cas en revanche, le e e ee passage par valeur est recommand. e Dans le mme ordre dides, on peut discuter notre choix de la reprsentation de la e e e matrice unit comme objet spar qui est employ dans une instruction daectation e e e e comme
a := MatriceUnite

On pourrait, a la place, faire appel a une procdure Unite(n,a) qui cre, dans a, la ` ` e e matrice unit dordre n. Lorsque n est nettement plus petit que lordre maximal, on e peut sattendre a un gain de temps en utilisant la deuxi`me mthode; en contrepartie, ` e e la gestion de lappel de procdure prend aussi du temps. On constate que si lordre e maximal est 20, la dure des deux mthodes squilibre autour de n = 7. En dea, lappel e e e c` de procdure est plus rapide. Notons tout de mme quavec les matriels informatiques e e e modernes, on peut faire plusieurs centaines daectations de matrices en une seconde. Ceci relativise notre discussion sur la perte de temps ventuelle due a une programmation e ` un peu laxiste.

Faciliter le dialogue Les programmes sont tous interactifs, cest-`-dire demandent a lutilisateur dintervenir. a ` Dans les programmes qui nous concernent, linteraction est rudimentaire : elle se borne a demander des donnes et a acher les rsultats correspondants. Dans dautres pro` e ` e grammes, linteraction est tr`s sophistique (jeux, diteurs, compilateurs) et la programe e e mation de cette partie constitue frquemment plus de la moiti de leort de programe e mation total. Il est utile de prendre en considration quelques principes simples, fonds sur le fait que e e linterlocuteur est un tre intelligent : viter un bavardage inutile, encombrant lcran de e e e messages multiples, surtout en cas derreur sur les donnes; souvent, un simple bip sonore e est susant. Eviter aussi les trop nombreuses demandes de conrmation, du genre : Etes-vous sr de vos donnes (o/n)? . Une indication claire sur la faon darrter le u e c e programme sut. Version 15 janvier 2005

A.2. Variations en Pascal

417

En revanche, linvite doit tre claire : ne pas commencer lexcution dun programme e e par un point dinterrogation, sans annoncer au moins quel type de donnes on attend. e Un deuxi`me principe a observer est physique : toute action provoque une raction; le e ` e programme doit ragir a lentre de donnes par un accus de rception, surtout si les e ` e e e e calculs subsquents sont longs. La meilleure faon de faire, lorsque les donnes sont un e c e peu complexes (lecture dune matrice ou dun polynme) est de racher, dans votre o e format, les donnes lues. Enn, les rsultats doivent tre prsents : il convient de dire e e e e e quels sont les rsultats achs. e e Dans un programme a dialogue simple, les options possibles se prsentent sous la forme ` e dun menu (voir ci-dessous une faon de faire); une option du menu, accessible par c exemple par ?, peut contenir un ou plusieurs crans dexplications. e

A.2

Variations en Pascal

En thorie, il ny a quun seul langage de programmation Pascal, celui dni par la norme e e ISO. En pratique, il y a autant de langages Pascal que de compilateurs et ceci pour plusieurs raisons. Dabord, le langage Pascal ociel est plutt pauvre en structures de o contrle et, de plus, ces structures sont parfois assez lourdes a utiliser. Il est donc normal o ` quun compilateur qui se veut intressant apporte des possibilits supplmentaires, e e e et cest une trop grande tentation pour ne pas en proter. Ensuite, Pascal (toujours la norme) ne xe pas de r`gles commodes pour la manipulation de cha e nes de caract`res e et est assez dicile sur les entres-sorties interactives. Enn, rien nest prvu pour e e lachage graphique et sur dautres aspects qui, sils dpendent certes du matriel utilis, e e e pourraient nanmoins tre codis dune mani`re agrable. L` aussi, chaque compilateur e e e e e a vient avec ses solutions. Enn, il ny a pas de syntaxe pour lusage des biblioth`ques. (Il e ne sagit pas ici de critiquer Pascal : ce langage a contribu a rendre la programmation e` raisonnable et, a ce titre, est tr`s important; les restrictions numres sont bien connues ` e e e e et Wirth, le p`re de Pascal, les a leves pour la plupart dans son langage suivant, e e Modula.) Les programmes prsents dans ce livre ont tous t tests soit sur Macintosh, sous e e ee e Think Pascal, soit sur compatible PC, sous Turbo Pascal, soit les deux. Les modications a apporter pour les transfrer de lun des compilateurs a lautre sont essentiellement ` e ` les deux suivantes : Dans une instruction CASE, le champ optionnel qui dcrit laction a entreprendre e ` lorsque aucun cas ne sapplique, est introduit en Turbo Pascal par ELSE (qui nest pas prcd dun point-virgule) et en Think Pascal par OTHERWISE (qui est prcd dun e e e e e e point-virgule). Nous ne nous en servons que dans les menus. Bien plus importante est lcriture des oprateurs boolens squentiels, aussi appels e e e e e oprateurs courts ou oprateurs minimaux. Considrons par exemple linstruction : e e e
WHILE (i >= 1) AND (a[i] = 0) DO i := i - 1;

Dans Pascal standard, les oprandes du test sont tous les deux valus avant den faire la e e e Version 15 janvier 2005

418

Annexe A. Un environnement

conjonction logique. Ainsi, mme si i = 0, llment a[i] est compar a 0, ce qui provoque e ee e` un message derreur si les indices du tableau commencent a 1. Lorsque loprateur AND ` e est squentiel, la premi`re condition est value dabord et la deuxi`me nest value e e e e e e e que si la premi`re est vraie (mutatis mutandis pour OR); dans notre exemple, il ny a e pas de dpassement des bornes de tableau. e Ce mode dvaluation est extrmement commode et a t utilis systmatiquement dans e e ee e e le livre. En Turbo Pascal, cest le fonctionnement par dfaut (mais il peut tre modi e e e en changeant une option du compilateur); en Think Pascal, les oprateurs AND et OR ne e sont pas squentiels, mais ce compilateur fournit deux variantes squentielles, notes & et e e e |. Nous encourageons explicitement les utilisateurs de nos programmes en Think Pascal a remplacer systmatiquement AND par & et OR par |. Les endroits o` le changement est ` e u obligatoire sont signals en commentaires dans nos programmes. e Dautres dirences entre Turbo Pascal et Think Pascal sont moins importantes et sont e plutt des dirences lies au matriel et au syst`me dexploitation. Nous en parlons lors o e e e e de la prsentation de la biblioth`que gnrale, ou dans la prsentation des programmes e e e e e gomtriques. e e Pour une description dtaille du langage Pascal et de nombreux exemples, voir : e e P. Cousot, Introduction a lalgorithmique numrique et a la programmation en Pascal, ` e ` Paris, McGraw-Hill, 1988.

A.3

Biblioth`ques e

Les biblioth`ques de procdures sont une faon commode de grouper les dclarations, e e c e procdures et initialisations relatives a un ensemble de calculs. Les compilateurs Pase ` cal (Turbo Pascal 4 ou Think Pascal par exemple) orent, sous une forme qui varie lg`rement dun compilateur a lautre, un moyen de raliser ces groupements : ce sont e e ` e les units ( unit en anglais).Une unit peut tre dnie et compile indpendamment e e e e e e de tout programme. Lemploi dune unit dans un programme particulier est indiqu e e par une instruction spcique. e En Think Pascal et en Turbo Pascal, la syntaxe dune unit est la suivante : e
UNIT nom; INTERFACE ... IMPLEMENTATION ... END.

En Turbo Pascal, une variante est possible, dont on expliquera lusage :


UNIT nom; INTERFACE

Version 15 janvier 2005

A.3. Biblioth`ques e
... IMPLEMENTATION ... BEGIN ... END.

419

Linterface contient les informations publiques, cest-`-dire utilisables par le programme a qui inclut lunit. Il peut sagir de constantes, de dclarations de types, de variables et e e den-ttes de procdures. La partie implmentation contient la ralisation des diverses e e e e procdures. Enn en Turbo Pascal, le corps de lunit (la partie initialisation) dlimit e e e e par le dernier couple BEGIN, END peut contenir des instructions qui sont excutes avant e e chaque excution du programme qui utilise lunit. e e Un programme qui utilise une unit le spcie par linstruction : e e
USES nom;

Considrons un exemple. La biblioth`que des nombres rationnels, dcrite en dtail dans e e e e le paragraphe suivant, se dclare comme unit de la mani`re que voici : e e e
UNIT rationnels; INTERFACE USES general; TYPE rat = ARRAY[0..1] OF integer; VAR RatZero, RatUn: rat; PROCEDURE InitRationnels; FUNCTION Numerateur (VAR r: rat): integer; PROCEDURE RatPlusRat (u, v: rat; VAR w: rat); IMPLEMENTATION Ralisation des procdures. e e

Utilise, a son tour, une unit. ` e Dclaration de type. e Dclaration de variables. e En-ttes de procdures. e e

PROCEDURE RatPlusRat (u, v: rat; VAR w: rat); VAR n, d: integer; BEGIN n := Numerateur(u) * Denominateur(v) + Denominateur(u) * Numerateur(v); d := Denominateur(u) * Denominateur(v); FaireRat(n, d, w); END; { de "RatPlusRat" }

Version 15 janvier 2005

420
PROCEDURE InitRationnels; BEGIN EntierEnRat(RatZero, 0); EntierEnRat(RatUn, 1) END; { de "InitRationnels" } BEGIN InitRationnels; END.

Annexe A. Un environnement

Appel (en Turbo Pascal).

En Think Pascal par exemple, la procdure InitRationnels doit tre appele au dbut e e e e du programme principal.

A.3.1

Gnralits e e e

Un certain nombre doprations arithmtiques reviennent constamment dans les proe e grammes. Il est utile de disposer dun ensemble de procdures qui les ralisent. Cest e e lobjet de cette biblioth`que. Nous en protons pour xer des valeurs par dfaut de cere e taines variables. La constante existe dj` en Turbo Pascal, donc la dnition suivante ea e nest pas utile dans ce cas.
CONST pi = 3.1415926536; Prdnie dans certains compilateurs. e e

Le type suivant sert a transmettre des titres aux procdures de lecture et dcriture : ` e e
TYPE texte = string[80];

Enn, voici trois variables utiles : la premi`re permet de paramtrer la prcision dae e e chage (non pas de calcul), la derni`re est employe dans le calcul a pr`s , enn la e e ` e variable test permet de basculer en mode test et ainsi dactiver, resp. de dsactiver, e des impressions intermdiaires. e
VAR precision: integer; test: boolean; epsilon: real;

Ces variables sont initialises dans Initialisations : e


PROCEDURE InitGeneral; BEGIN precision := 3; epsilon := 0.001; test := false END; { de "InitGeneral" }

Prcision dachage par dfaut. e e Nombre petit par dfaut. e Pas dimpression intermdiaire par dfaut. e e

Les fonctions arithmtiques sur les entiers que nous avons mentionnes sont : e e Version 15 janvier 2005

A.3. Biblioth`ques e
FUNCTION min (i, j: integer): integer; FUNCTION max (i, j: integer): integer; PROCEDURE EchangerE (VAR u, v: integer); FUNCTION PuissanceE (x: integer; n: integer): integer; FUNCTION Binomial (n, k: integer): integer; FUNCTION pgcd (a, b: integer): integer;

421

Elles se ralisent comme suit : e


FUNCTION min (i, j: integer): integer; BEGIN IF i <= j THEN min := i ELSE min := j END; { de "min" } FUNCTION max (i, j: integer): integer; BEGIN IF i >= j THEN max := i ELSE max := j END; { de "max" } PROCEDURE EchangerE (VAR u, v: integer); VAR w: integer; BEGIN w := u; u := v; v := w END; { de "EchangerE" }

Les fonctions suivantes sont plus intressantes : e


FUNCTION PuissanceE (x: integer; n: integer): integer; VAR i, p: integer; BEGIN p := 1; FOR i := 1 TO n DO Mthode lmentaire. e ee p := p * x; PuissanceE := p END; { de "PuissanceE" } Calcule x n .

On peut gagner du temps en utilisant lalgorithme dichotomique fond sur le dvelope e pement binaire de n. Le calcul du coecient binomial ne doit pas tre men par e e lvaluation des factorielles. La mthode ci-dessous est base sur la formule : e e e n k = nk+1 n1 k k1

et permet dvaluer les coecients binomiaux pour n 14. e


FUNCTION Binomial (n, k: integer): integer; VAR b, i: integer; BEGIN

Version 15 janvier 2005

422
IF n < k THEN Binomial := 0 ELSE BEGIN k := min(k, n - k); b := 1; FOR i := 1 TO k DO b := (b * (n - i + 1)) DIV i; Binomial := b END END; { de "Binomial" }

Annexe A. Un environnement

Enn, le calcul du pgcd se fait par lanctre des algorithmes : e


FUNCTION pgcd (a, b: integer): integer; VAR r: integer; BEGIN a := abs(a); b := abs(b); WHILE b <> 0 DO BEGIN r := a MOD b; a := b; b := r END; pgcd := a END; { de "pgcd" }

Le rsultat est toujours positif ou nul. Voici des fonctions sur les rels : e e
FUNCTION rmin (x, y: real): real; FUNCTION rmax (x, y: real): real; PROCEDURE Echanger (VAR u, v: real); FUNCTION log10 (x: real): real; FUNCTION PuissanceR (x, y: real): real; FUNCTION Puissance (x: real; n: integer): real; FUNCTION signe (r: real): integer; FUNCTION EstNul (r: real): boolean; FUNCTION EstPositif (r: real): boolean;

Calcule x y . Calcule x n .

Les trois premi`res sont videntes. Le logarithme en base 10 se calcule par : e e


FUNCTION log10 (x: real): real; BEGIN log10 := ln(x) / ln(10) END; { de "log10" }

Deux faons de calculer la puissance dun rel : c e


FUNCTION PuissanceR (x, y: real): real; BEGIN IF EstNul(x) THEN Calcule x y .

Version 15 janvier 2005

A.3. Biblioth`ques e
PuissanceR := 0 ELSE PuissanceR := exp(y * ln(x)) END; { de "PuissanceR" } FUNCTION Puissance (x: real; n: integer): real; VAR i, p: integer; BEGIN p := 1; FOR i := 1 TO n DO p := p * x; Puissance := p END; { de "Puissance" } Calcule x n .

423

Le test si la reprsentation dun nombre rel est nulle ne peut se faire qu` pr`s. On e e a e est donc naturellement conduit aux fonctions :
FUNCTION EstNul (r: real): boolean; BEGIN EstNul := abs(r) < epsilon END; { de "EstNul" } FUNCTION EstPositif (r: real): boolean; BEGIN EstPositif := r >= epsilon END; { de "EstPositif" } Vrai si r est nul a pr`s. ` e

Vrai si r est positif a pr`s. ` e

Voici, en premi`re application, la fonction signe : e


FUNCTION signe (r: real): integer; BEGIN IF EstNul(r) THEN signe := 0 ELSE IF r > 0 THEN signe := 1 ELSE signe := -1 END; { de "signe" }

Les trois procdures suivantes, a savoir : e `


PROCEDURE bip; PROCEDURE TopChrono; FUNCTION TempsEcoule: real;

dpendent du matriel utilis. En Think Pascal sur MacIntosh, elles scrivent : e e e e


PROCEDURE bip; BEGIN SysBeep(1) END; { de "bip" }

Version 15 janvier 2005

424
PROCEDURE TopChrono; BEGIN DebutChrono := TickCount END; { de "TopChrono" }

Annexe A. Un environnement

FUNCTION TempsEcoule: real; BEGIN TempsEcoule := (TickCount - DebutChrono) / 60 END; { de "TempsEcoule" }

La variable DebutChrono, de type longint, est locale a la biblioth`que. En Turbo ` e Pascal, sur PC, ces mmes procdures scrivent : e e e
PROCEDURE bip; BEGIN write(chr(7)) END; { de "bip" } PROCEDURE TopChrono; BEGIN DebutChrono := heure END; { de "TopChrono" } FUNCTION TempsEcoule: real; BEGIN TempsEcoule := heure - DebutChrono END; { de "TempsEcoule" }

o` heure est une fonction qui transforme la reprsentation de lheure : u e


FUNCTION heure: real; VAR h, m, s, c : word; BEGIN GetTime(h, m, s, c); heure := c / 100 + s + 60 * m + 3600 * h END; { de "heure" }

Notons que lappel a GetTime demande dinclure la biblioth`que prdnie Dos. ` e e e

A.3.2

Polynmes o

Un polynme a coecients rels est reprsent par la suite de ses coecients. Une faon o ` e e e c naturelle de reprsenter un polynme est de lui associer un RECORD qui contient, dune e o part, le degr et, dautre part, les coecients. Comme nous ne voulons pas utiliser cette e structure, nous allons reprsenter un polynme par un tableau. Il y a deux faons de e o c faire, chacune avec ses avantages et inconvnients. Fixons dabord le degr maximal des e e polynmes reprsents, disons N . Un polynme p(X) = a0 + a1 X + + an X n , avec o e e o an = 0, peut tre identi a la suite nie (a0 , . . . , aN ), avec an+1 = = aN = 0. e e ` Avec cette convention, un polynme se reprsente par un tableau de nombres rels. On o e e Version 15 janvier 2005

A.3. Biblioth`ques e

425

peut aussi identier p au couple form de son degr n, et de la suite (a0 , . . . , an ) de e e ses coecients. On range alors le degr de p dans un emplacement rserv du tableau e e e contenant ses coecients. Lavantage de la premi`re reprsentation, celle que nous adoptons ci-dessous, est sa sime e plicit : les oprations arithmtiques notamment se ralisent tr`s facilement. Lincone e e e e vnient majeur est la lenteur du calcul du degr dun polynme, puisque lon doit pare e o courir la suite des coecients; paradoxalement, le temps de calcul du degr dcro avec e e t le degr. e Lavantage de la deuxi`me reprsentation (qui est utilise par exemple dans le proe e e gramme de factorisation de polynmes a coecients dans Z/2Z) est donc la rapidit, o ` e mais la programmation est un peu plus dlicate, dans la mesure o` il faut rajuster le e u e degr a chaque opration. e` e Voici les dclarations : e
CONST DegreMax = 20; DegrePolNul = -1; TYPE pol = ARRAY[0..DegreMax] OF real; VAR PolynomeUnite: pol; PolynomeNul: pol; Polynme prdni. o e e Polynme prdni. o e e Le degr maximal des polynmes. e o Le degr du polynme nul. e o

Quelques fonctions et procdures simples : e


FUNCTION Degre (VAR p: pol): integer; Donne le degr de p. e FUNCTION EstPolNul (VAR p: pol): boolean; Teste si p = 0. PROCEDURE ReelEnMonome (s: real; n: integer; VAR p: pol); Donne p(X) = sX n .

La plus longue de ces procdures est celle qui calcule le degr : e e


FUNCTION Degre (VAR p: pol): integer; Donne le degr du polynme p. e o VAR n: integer; BEGIN n := DegreMax; WHILE (n >= 0) AND (EstNul(p[n])) DO n := n - 1; Degre := n END; { de "Degre" }

{ AND squentiel } e

On voit lavantage davoir choisi de reprsenter le degr du polynme nul par 1. Les e e o deux autres procdures scrivent comme suit : e e
FUNCTION EstPolNul (VAR p: pol): boolean; Teste si p = 0.

Version 15 janvier 2005

426
BEGIN EstPolNul := Degre(p) = DegrePolNul END; { de "EstPolNul" }

Annexe A. Un environnement

PROCEDURE ReelEnMonome (s: real; n: integer; VAR p: pol); Donne le polynme p(X) = sX n . o BEGIN p := PolynomeNul; p[n] := s END; { de "ReelEnMonome" }

La deuxi`me procdure fait appel au polynme nul prdni. Celui-ci ainsi que le e e o e e polynme unit sont initialiss dans la procdure : o e e e
PROCEDURE InitPolynomes; Dnition du polynme nul et du polynme unit. e o o e VAR n: integer; BEGIN FOR n := 0 TO DegreMax DO PolynomeNul[n] := 0; PolynomeUnite := PolynomeNul; PolynomeUnite[0] := 1; END; { de "InitPolynomes" }

Cette procdure doit tre appele avant toute manipulation. Venons-en aux procdures e e e e de lecture et dcriture. La lecture est simple : e
PROCEDURE EntrerPolynome (n: integer; VAR p: pol; titre: texte); Achage du titre, puis lecture du polynme p de degr n. o e VAR i: integer; BEGIN p := PolynomeNul; writeln; writeln(titre); FOR i := 0 TO n DO BEGIN write(i : 2, : ); readln(p[i]); END END; { de "EntrerPolynome" }

Notons que lon doit conna le degr n avant dutiliser la procdure. Lachage doit tre e e respecter les usages : ne pas acher un terme nul (sauf si le polynme est nul), ne pas o acher un coecient de valeur absolue gale a 1 (sauf si cest le terme constant). Ces e ` conventions allongent quelque peu lcriture, mais il est tr`s important de les respecter, e e pour le confort du lecteur.
PROCEDURE EcrireMonome (a: real; VAR n: integer); Est appele avec a > 0. e BEGIN IF (a <> 1) OR (n = 0) THEN

Version 15 janvier 2005

A.3. Biblioth`ques e
write(a : 1 : precision, ); IF n > 1 THEN write(X^, n : 1) ELSE IF n = 1 THEN write(X) END; { de "EcrireMonome" } PROCEDURE EcrirePolynome (VAR p: pol; titre: texte); Achage du titre, puis du polynme p. o VAR i, n: integer; BEGIN writeln; write(titre); { La suite sur la m^me ligne. } e n := Degre(p); IF n = DegrePolNul THEN Le polynme nul. o write(0 : 1) ELSE BEGIN IF p[n] < 0 THEN write(- ); EcrireMonome(abs(p[n]), n); Le premier coecient. FOR i := n - 1 DOWNTO 0 DO Les autres coecients non nuls. IF NOT EstNul(p[i]) THEN BEGIN IF p[i] > 0 THEN write( + ) ELSE write( - ); EcrireMonome(abs(p[i]), i) END END; writeln END; { de "EcrirePolynome" }

427

Les oprations arithmtiques sur les polynmes sont les suivantes : e e o


PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PolynomePlusPolynome (p, q: pol; VAR r: pol); PolynomeMoinsPolynome (p, q: pol; VAR r: pol); PolynomeOppose (p: pol; VAR mp: pol); PolynomeParPolynome (p, q: pol; VAR r: pol); PolynomeParXn (p: pol; n: integer; VAR q: pol); PolynomeParMonome (p: pol; s: real; n: integer; VAR q: pol); PolynomeParConstante (p: pol; s: real; VAR q: pol); PolynomeDivEuclPolynome (a, b: pol; VAR q, r: pol); PolynomeModPolynome (a, b: pol; VAR r: pol); PolynomeDivPolynome (a, b: pol; VAR q: pol); PolynomePgcd (a, b: pol; VAR pgcd: pol); PolynomeDerive (p: pol; VAR dp: pol);

Enn, lvaluation de la fonction polynme se fait par : e o


FUNCTION Valeur (VAR p: pol; x: real): real;

Une variante de cette procdure est utile, lorsque lon conna par ailleurs le degr de e t e p; elle permet un gain de temps considrable : e Version 15 janvier 2005

428

Annexe A. Un environnement
FUNCTION Valeurd (d: integer; VAR p: pol; x: real): real;

Voici donc une ralisation de ces procdures : e e


PROCEDURE PolynomePlusPolynome (p, q: pol; VAR r: pol); VAR i: integer; BEGIN FOR i := 0 TO DegreMax DO r[i] := p[i] + q[i]; END; { de "PolynomePlusPolynome" } PROCEDURE PolynomeMoinsPolynome (p, q: pol; VAR r: pol); VAR i: integer; BEGIN FOR i := 0 TO DegreMax DO r[i] := p[i] - q[i]; END; { de "PolynomeMoinsPolynome" } PROCEDURE PolynomeOppose (p: pol; VAR mp: pol); VAR i: integer; BEGIN FOR i := 0 TO DegreMax DO mp[i] := -p[i]; END; { de "PolynomeOppose" } PROCEDURE PolynomeParPolynome (p, q: pol; VAR r: pol); VAR i, j: integer; BEGIN r := PolynomeNul; FOR i := 0 TO Degre(p) DO FOR j := 0 TO Degre(q) DO r[i + j] := r[i + j] + p[i] * q[j] END; { de "PolynomeParPolynome" } PROCEDURE PolynomeParXn (p: pol; n: integer; VAR q: pol); VAR i: integer; BEGIN q := PolynomeNul; FOR i := n TO DegreMax DO q[i] := p[i - n] END; { de "PolynomeParXn" } r = p+q

r = pq

mp = p

r = pq

q = pX n

PROCEDURE PolynomeParMonome (p: pol; s: real; n: integer; VAR q: pol); q = psX n VAR i: integer; BEGIN q := PolynomeNul; FOR i := n TO n + Degre(p) DO q[i] := s * p[i - n] END; { de "PolynomeParMonome" } PROCEDURE PolynomeParConstante (p: pol; s: real; VAR q: pol); q = ps

Version 15 janvier 2005

A.3. Biblioth`ques e
VAR

429

i: integer; BEGIN q := PolynomeNul; FOR i := 0 TO Degre(p) DO q[i] := s * p[i] END; { de "PolynomeParConstante" } PROCEDURE PolynomeDivEuclPolynome (a, b: pol; VAR q, r: pol); a = bq + r VAR m, n: integer; s: real; p: pol; BEGIN q := PolynomeNul; r := a; n := Degre(r); m := Degre(b); WHILE n >= m DO BEGIN s := r[n] / b[m]; q[n - m] := s; PolynomeParMonome(b, s, n - m, p); p(X) = sX nm b(X). PolynomeMoinsPolynome(r, p, r); r(X) := r(X) sX nm b(X). n := Degre(r) END; END; { de "PolynomeDivEuclPolynome" } PROCEDURE PolynomeModPolynome (a, b: pol; VAR r: pol); r = a mod b VAR q: pol; BEGIN PolynomeDivEuclPolynome(a, b, q, r) END; { de "PolynomeModPolynome" } PROCEDURE PolynomeDivPolynome (a, b: pol; VAR q: pol); q = a div b VAR r: pol; BEGIN PolynomeDivEuclPolynome(a, b, q, r) END; { de "PolynomeDivPolynome" } PROCEDURE PolynomePgcd (a, b: pol; VAR pgcd: pol); pgcd(a, b) VAR r: pol; BEGIN WHILE NOT EstPolNul(b) DO BEGIN PolynomeModPolynome(a, b, r); a := b; b := r END; PolynomeParConstante(a, 1 / a[Degre(a)], a); pgcd := a END; { de "PolynomePgcd" } PROCEDURE PolynomeDerive (p: pol; VAR dp: pol); dp = d VAR

Version 15 janvier 2005

430

Annexe A. Un environnement
i: integer; BEGIN dp := PolynomeNul; FOR i := 1 TO Degre(p) DO dp[i - 1] := i * p[i] END; { de "PolynomeDerive" }

Bien entendu, lvaluation dun polynme se fait par le schma de Horner : e o e


FUNCTION Valeurd (d: integer; VAR p: pol; x: real): real; Calcule la valeur p(x) du polynme p de degr d au point x. o e VAR i: integer; r: real; BEGIN r := 0; FOR i := d DOWNTO 0 DO r := r * x + p[i]; Valeurd := r END; { de "Valeurd" } FUNCTION Valeur (VAR p: pol; x: real): real; Calcule la valeur p(x) de p au point x. BEGIN Valeur := Valeurd(Degre(p), p, x) END; { de "Valeur" }

A.3.3

Les complexes

Nous prsentons dans cette section une biblioth`que destine a la manipulation des e e e ` nombres complexes. On dclare e
TYPE complexe = ARRAY[0..1] OF real;

Pour accder aux complexes et pour les construire, on utilise les fonctions et procdures e e suivantes :
FUNCTION Re (z: complexe): real; FUNCTION Im (z: complexe): real; FUNCTION ModuleAuCarre (z: complexe): real; FUNCTION Module (z: complexe): real; FUNCTION Arg (z: complexe): real; PROCEDURE FixerRe (VAR z: complexe; r: real); PROCEDURE FixerIm (VAR z: complexe; r: real); PROCEDURE ReelEnComplexe (VAR z: complexe; r: real); PROCEDURE CartesienEnComplexe (a, b: real; VAR z: complexe); PROCEDURE PolaireEnComplexe (rho, theta: real; VAR z: complexe);

Voici une implmentation. e Version 15 janvier 2005

A.3. Biblioth`ques e
FUNCTION Re (z: complexe): real; BEGIN Re := z[0] END; { de "Re" } FUNCTION Im (z: complexe): real; BEGIN Im := z[1] END; { de "Im" } FUNCTION ModuleAuCarre (z: complexe): real; BEGIN ModuleAuCarre := Sqr(Re(z)) + Sqr(Im(z)) END; { de "ModuleAuCarre"} FUNCTION Module (z: complexe): real; BEGIN Module := Sqrt(ModuleAuCarre(z)) END; { de "Module"} FUNCTION Arg (z: complexe): real; VAR a, b, x: real; VAR a, b, x: real; BEGIN a := Re(z); b := Im(z); IF a <> 0 THEN Arg := ArcTan(b / a) ELSE IF b > 0 THEN Arg := Pi/2 ELSE IF b < 0 THEN Arg := -Pi/2 ELSE Arg := 0 END; PROCEDURE FixerRe (VAR z: complexe; r: real); BEGIN z[0] := r END; { de "FixerRe" } PROCEDURE FixerIm (VAR z: complexe; r: real); BEGIN z[1] := r END; { de "FixerIm" } PROCEDURE ReelEnComplexe (VAR z: complexe; r: real); BEGIN z[0] := r; z[1] := 0 END; { de "ReelEnComplexe" } PROCEDURE CartesienEnComplexe (a, b: real; VAR z: complexe); Donne (z).

431

Donne

(z).

Donne |z| 2 .

Donne |z|.

Donne largument de z.

(z) = r

(z) = r

z=r

z = a + ib

Version 15 janvier 2005

432
BEGIN z[0] := a; z[1] := b END;

Annexe A. Un environnement

PROCEDURE PolaireEnComplexe (rho, theta: real; VAR z: complexe); z = e i BEGIN z[0] := rho * cos(theta); z[1] := rho * sin(theta) END;

Les oprations arithmtiques de base sont les suivantes : e e


PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE ComplexePlusComplexe (u, v: complexe; VAR w: complexe); ComplexeMoinsComplexe (u, v: complexe; VAR w: complexe); ComplexeParComplexe (u, v: complexe; VAR w: complexe); ComplexeSurComplexe (u, v: complexe; VAR w: complexe); ComplexeParReel (z: complexe; r: real; VAR w: complexe); ComplexeOppose (z: complexe; VAR moinsz: complexe); Conjugue (z: complexe; VAR zbarre: complexe);

Elles sont ralises par : e e


PROCEDURE ComplexePlusComplexe (u, v: complexe; VAR w: complexe);w = u + v VAR a, b: real; BEGIN a := Re(u) + Re(v); b := Im(u) + Im(v); CartesienEnComplexe(a, b, w); END; { de "ComplexePlusComplexe" } PROCEDURE ComplexeMoinsComplexe (u, v: complexe; VAR w: complexe);w = u v VAR a, b: real; BEGIN a := Re(u) - Re(v); b := Im(u) - Im(v); CartesienEnComplexe(a, b, w); END; { de "ComplexeMoinsComplexe" } PROCEDURE ComplexeParComplexe (u, v: complexe; VAR w: complexe); w = uv VAR a, b: real; BEGIN a := Re(u) * Re(v) - Im(u) * Im(v); b := Re(u) * Im(v) + Im(u) * Re(v); CartesienEnComplexe(a, b, w); END; { de "ComplexeParComplexe" } PROCEDURE ComplexeOppose (z: complexe; VAR moinsz: complexe); BEGIN CartesienEnComplexe(-Re(z), -Im(z), moinsz); END; { de "ComplexeOppose" } PROCEDURE Conjugue (z: complexe; VAR zbarre: complexe); BEGIN Donne z

Donne z

Version 15 janvier 2005

A.3. Biblioth`ques e
zbarre := z; FixerIm(zbarre, -Im(z)); END; { de "Conjugue" } PROCEDURE ComplexeSurComplexe (u, v: complexe; VAR w: complexe); w = u/v On suppose v = 0. VAR a, b, r: real; BEGIN r := ModuleAuCarre(v); a := (Re(u) * Re(v) + Im(u) * Im(v)) / r; b := (Im(u) * Re(v) - Re(u) * Im(v)) / r; CartesienEnComplexe(a, b, w) END; { de "ComplexeSurComplexe" } PROCEDURE ComplexeParReel (z: complexe; r: real; VAR w: complexe);w = rz BEGIN CartesienEnComplexe(r * Re(z), r * Im(z), w) END; { de "ComplexeParReel" }

433

Il est commode de pouvoir disposer des complexes 0 et 1. On les dclare comme variables e
VAR ComplexeZero, ComplexeUn: complexe;

et leur valeurs sont dnies dans une procdure dinitialisation : e e


PROCEDURE InitComplexes; BEGIN ReelEnComplexe(ComplexeZero, 0); ReelEnComplexe(ComplexeUn, 1) END; { de "InitComplexes" }

Une procdure permet dchanger les valeurs de deux param`tres : e e e


PROCEDURE EchangerC (VAR u, v: complexe); VAR w: complexe; BEGIN w := u; u := v; v := w END; { de "EchangerC" }

Comme dans le cas des rels, on utilise un test de nullit a epsilon pr`s : e e ` e
FUNCTION EstCNul (z: complexe): boolean; Vrai si |z| est nul a pr`s. ` e BEGIN EstCNul := Module(z) < epsilon END; { de "EstCNul" }

Enn, la lecture et lachage des complexes se font par deux procdures : e Version 15 janvier 2005

434

Annexe A. Un environnement

PROCEDURE EntrerComplexe (VAR z: complexe; titre: texte); PROCEDURE EcrireComplexe (z: complexe; titre: texte);

La procdure de lecture ne prsente pas de dicult : e e e


PROCEDURE EntrerComplexe (VAR z: complexe; titre: texte); VAR a, b: real; BEGIN writeln; writeln(titre); write(Partie reelle : ); readln(a); write(Partie imaginaire : ); readln(b); CartesienEnComplexe(a, b, z) END; { de "EntrerComplexe" }

La procdure dachage est complique par les probl`mes de mise en page. Il faut en e e e eet viter des achages tels que 2 + 1i, 1 1i, 0 + 3i, ou 1 + 2i. Pour pouvoir utiliser e la procdure pour lachage des matrices, il faut aussi que la taille totale dun achage e soit indpendante du nombre complexe. On dnit dabord des constantes : e e
CONST AligneAGauche = -1; Centre = 0; AligneADroite = 1;

La procdure suivante permet dacher un nombre complexe en mode align a gauche , e e` align a droite ou centr . e` e
PROCEDURE FormaterComplexe (z: complexe; Mode: integer); VAR a, b, r: real; n: integer; FUNCTION LargeurReel (a: real): integer; Donne le nombre de positions requises pour lachage dun rel. Compos de trois e e parties : le signe (0 ou 2 positions), la partie enti`re, et la mantisse (1 + prcision). e e VAR LargeurPartieEntiere, LargeurSigne: integer; BEGIN LargeurPartieEntiere := 1 + max(0, trunc(log10(abs(a)))); LargeurSigne := 1 - signe(a); LargeurReel := LargeurSigne + LargeurPartieEntiere + 1 + precision END; { de "LargeurReel" } FUNCTION LargeurComplexe (a, b: real): integer; Donne le nombre de positions requises pour acher le complexe a + ib. Compos des e largeurs de a et de b, et dun ventuel groupe de liaison. e VAR Largeura, Largeurb, Liaison: integer; BEGIN Largeur de a est nulle si et seulement si a = 0.

Version 15 janvier 2005

A.3. Biblioth`ques e

435

IF EstNul(a) THEN Largeura := 0 ELSE Largeura := LargeurReel(a); Il y a un signe entre a et b si et seulement si ab = 0. Mais si b < 0, le signe de b est compris dans la largeur de b. IF EstNul(a * b) THEN Liaison := 0 ELSE Liaison := 2 + signe(b); Largeur de b est nulle si et seulement si b = 0. Si |b| = 1, on ncrit pas 1. e IF EstNul(b) THEN Largeurb := 0 ELSE IF EstNul(abs(b) - 1) THEN Largeurb := 2 - signe(b) ELSE Largeurb := 2 + LargeurReel(b); Cas trait sparment : le complexe nul. e e e IF EstNul(a) AND EstNul(b) THEN LargeurComplexe := 1 ELSE LargeurComplexe := Largeura + Liaison + Largeurb END; { de "LargeurComplexe" } PROCEDURE DebutMiseEnPage (Mode, NombreDeBlancs: integer); BEGIN IF Mode = AligneADroite THEN write( : NombreDeBlancs); IF Mode = Centre THEN write( : NombreDeBlancs DIV 2) END; { de "DebutMiseEnPage" } PROCEDURE FinMiseEnPage (Mode, NombreDeBlancs: integer); BEGIN IF Mode = AligneAGauche THEN write( : NombreDeBlancs); IF Mode = Centre THEN write( : NombreDeBlancs - NombreDeBlancs DIV 2) END; { de "FinMiseEnPage" } PROCEDURE EcrireReel (a: real); BEGIN CASE signe(a) OF 1: write(a : (precision + 2) : precision); 0: ; -1: write(- , -a : (precision + 2) : precision) END END; { de "EcrireReel" } BEGIN { de "FormaterComplexe" } a := Re(z);

Version 15 janvier 2005

436

Annexe A. Un environnement
b := Im(z); n := 3 + 2 * FormatDunComplexe - LargeurComplexe(a, b); DebutMiseEnPage(Mode, n); IF EstNul(a) AND EstNul(b) THEN write(0) ELSE BEGIN EcrireReel(a); IF NOT EstNul(a * b) THEN IF (b >= 0) AND NOT EstNul(b) THEN write( + ) ELSE write( ); IF NOT EstNul(b) THEN BEGIN IF EstNul(b - 1) THEN write(i) ELSE IF EstNul(b + 1) THEN write(- i) ELSE BEGIN EcrireReel(b); write( i) END END END; FinMiseEnPage(Mode, n); END; { de "FormaterComplexe" }

Voici quelques exemples de sortie dans les trois modes.


0 1.00 244.12 - 1.00 - 245.12 i 2.00 i - i - 51.00 i 1.00 + i - 1.00 + i 1.00 - i - 1.00 - i - 245.12 + 2.00 i - 245.12 - i - 245.12 - 51.00 i 0.09 + 0.40 i 2.00 - 153.00 i | | | | | | | | | | | | | | | | | | 0 1.00 244.12 - 1.00 - 245.12 i 2.00 i - i - 51.00 i 1.00 + i - 1.00 + i 1.00 - i - 1.00 - i - 245.12 + 2.00 i - 245.12 - i - 245.12 - 51.00 i 0.09 + 0.40 i 2.00 - 153.00 i | | | | | | | | | | | | | | | | | | 0| 1.00| 244.12| - 1.00| - 245.12| i| 2.00 i| - i| - 51.00 i| 1.00 + i| - 1.00 + i| 1.00 - i| - 1.00 - i| - 245.12 + 2.00 i| - 245.12 - i| - 245.12 - 51.00 i| 0.09 + 0.40 i| 2.00 - 153.00 i|

Le plus souvent, on utilisera la procdure suivante : e


PROCEDURE EcrireComplexe (z: complexe; titre: texte); BEGIN

Version 15 janvier 2005

A.3. Biblioth`ques e
write(titre); FormaterComplexe(z, AligneAGauche) END;

437

A.3.4

Les rationnels

Les nombres rationnels sont reprsents par des couples dentiers, normaliss de telle e e e sorte que numrateur et dnominateur soient premiers entre eux et que le dnominateur e e e soit positif. On dclare e
TYPE rat = ARRAY[0..1] OF integer;

Pour accder aux rationnels et pour les construire, on utilise les fonctions et procdures e e suivantes :
FUNCTION Numerateur (VAR r: rat): integer; FUNCTION Denominateur (VAR r: rat): integer; PROCEDURE FixerNumerateur (VAR r: rat; n: integer); PROCEDURE FixerDenominateur (VAR r: rat; d: integer); PROCEDURE EntierEnRat (VAR r: rat; e: integer); PROCEDURE FaireRat (n, d: integer; VAR r: rat);

Ces procdures font videmment appel a une procdure de calcul du pgcd. Voici une e e ` e implmentation. La procdure la plus importante cre un rationnel a partir de deux e e e ` entiers :
PROCEDURE FaireRat (n, d: integer; VAR r: rat); VAR p: integer; BEGIN n := signe(d) * n; d := abs(d); Le dnominateur est positif. e p := pgcd(n, d); r[0] := n DIV p; Numrateur et dnominateur ... e e r[1] := d DIV p; ... sont premiers entre eux. END; { de "FaireRat" }

Les autres procdures scrivent comme suit : e e


FUNCTION Numerateur (VAR r: rat): integer; BEGIN Numerateur := r[0] END; { de "Numerateur" } FUNCTION Denominateur (VAR r: rat): integer; BEGIN Denominateur := r[1]

Version 15 janvier 2005

438
END; { de "Denominateur" }

Annexe A. Un environnement

PROCEDURE FixerNumerateur (VAR r: rat; n: integer); BEGIN r[0] := n END; { de "FixerNumerateur" } PROCEDURE FixerDenominateur (VAR r: rat; d: integer); BEGIN r[1] := d END; { de "FixerDenominateur" } PROCEDURE EntierEnRat (VAR r: rat; e: integer); BEGIN FaireRat(e, 1, r) END; { de "EntierEnRat" }

Les oprations arithmtiques sont les suivantes : e e


PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE RatPlusRat (u, v: rat; VAR w: rat); RatMoinsRat (u, v: rat; VAR w: rat); RatOppose (u: rat; VAR v: rat); RatParRat (u, v: rat; VAR w: rat); RatParEntier (u: rat; x: integer; VAR w: rat); RatSurRat (u, v: rat; VAR w: rat); RatSurEntier (u: rat; x: integer; VAR w: rat);

Elles sont ralises par : e e


PROCEDURE RatPlusRat (u, v: rat; VAR w: rat); w =u+v VAR n, d: integer; BEGIN n := Numerateur(u) * Denominateur(v) + Denominateur(u) * Numerateur(v); d := Denominateur(u) * Denominateur(v); FaireRat(n, d, w); END; { de "RatPlusRat" } PROCEDURE RatMoinsRat (u, v: rat; VAR w: rat); w =uv VAR n, d: integer; BEGIN n := Numerateur(u) * Denominateur(v) - Denominateur(u) * Numerateur(v); d := Denominateur(u) * Denominateur(v); FaireRat(n, d, w); END; { de "RatMoinsRat" } PROCEDURE RatOppose (u: rat; VAR v: rat); BEGIN v := u; FixerNumerateur(v, -Numerateur(v)); v = u

Version 15 janvier 2005

A.3. Biblioth`ques e
END; { de "RatOppose" } PROCEDURE RatParRat (u, v: rat; VAR w: rat); VAR n, d: integer; BEGIN n := Numerateur(u) * Numerateur(v); d := Denominateur(u) * Denominateur(v); FaireRat(n, d, w) END; { de "RatParRat" } PROCEDURE RatParEntier (u: rat; x: integer; VAR w: rat); BEGIN FaireRat(x * Numerateur(u), Denominateur(u), w); END; { de "RatParEntier" } PROCEDURE RatSurRat (u, v: rat; VAR w: rat); VAR n, d: integer; BEGIN n := Numerateur(u) * Denominateur(v); d := Denominateur(u) * Numerateur(v); FaireRat(n, d, w) END; { de "RatSurRat" } PROCEDURE RatSurEntier (u: rat; x: integer; VAR w: rat); BEGIN FaireRat(Numerateur(u), x * Denominateur(u), w) END; { de "RatSurEntier" } w = uv

439

w = ux

w = u/v

w = u/x

Il est commode de pouvoir disposer des entiers 0 et 1 comme rationnels. On les dclare e comme variables (on pourrait aussi avoir des procdures spciques) : e e
VAR RatZero, RatUn: rat;

Les valeurs sont dnies dans une procdure dinitialisation : e e


PROCEDURE InitRationnels; BEGIN EntierEnRat(RatZero, 0); EntierEnRat(RatUn, 1) END; { de "InitRationnels" }

Enn, la lecture et lachage des rationnels se font par deux procdures sur le mod`le e e dj` rencontr plusieurs fois : ea e
PROCEDURE EntrerRat (VAR a: rat; titre: texte); VAR n, d: integer; BEGIN

Version 15 janvier 2005

440
writeln; write(titre); readln(n, d); FaireRat(n, d, a) END; { de "EntrerRat" } PROCEDURE EcrireRat (VAR a: rat; titre: texte); BEGIN write(titre); write(Numerateur(a) : 1); IF Denominateur(a) <> 1 THEN write(/, Denominateur(a) : 1) END; { de "EcrireRat" }

Annexe A. Un environnement

A.4

Menus

Comme nous lavons dj` dit, nos programmes sont tous interactifs. Ils donnent parea fois le choix entre plusieurs calculs, et demandent toujours des donnes. Il nexiste pas e de recette universelle pour organiser le dialogue. Dans nos programmes, les choix se prsentent sous la forme dun menu; une option du menu, accessible par exemple par ?, e peut contenir un ou plusieurs crans dexplications. Un programme a donc la forme e suivante :
PROGRAM Nom; USES Les biblioth`ques; e VAR Variables globales ; PROCEDURE Menu; ... END { de "Menu" }; BEGIN Initialisations ; En-tte ; e REPEAT Menu UNTIL false; END.

Les variables globales sont les variables qui doivent conserver leur valeur entre deux appels du menu. Les initialisations comprennent notamment les procdures dinitialisation e des diverses biblioth`ques utilises. Len-tte dcrit bri`vement lobjet du programme. e e e e e Le menu lit les choix, et lune des options fait arrter le programme par la commande e halt. La procdure a donc approximativement la forme suivante : e
PROCEDURE Menu; VAR choix: char;

Version 15 janvier 2005

A.4. Menus
Autres variables, contingentes BEGIN writeln; write(Donner votre choix : ); readln(choix); CASE choix OF ?: Les choix oerts. BEGIN END; Autre choix : BEGIN END; Autre choix : BEGIN END; Autre choix : BEGIN END; .: Fin. BEGIN writeln; writeln(Jarr^te.); e halt END; OTHERWISE Choix inexistant ; ELSE en Turbo Pascal. bip END { case } END; { de "Menu" }

441

Comme nous lavons dj` dit, la syntaxe est lg`rement dirente en Turbo Pascal, o` ea e e e u OTHERWISE est remplac par ELSE sans point-virgule. La procdure bip, elle aussi, scrit e e e diremment en Think Pascal (SysBeep(1)) et en Turbo Pascal (write(chr(7))). Il e nous a paru commode de paramtrer quelques donnes; le menu ore la possibilit de e e e modier les valeurs de ces param`tres. La procdure du menu contient donc les choix e e suivants :
!: Bascule test ; BEGIN IF test THEN BEGIN test := false; writeln(Maintenant hors test) END ELSE BEGIN test := true; writeln(Maintenant en test) END END; #: Modication de la prcision dachage. e

Version 15 janvier 2005

442

Annexe A. Un environnement
BEGIN writeln(Prcision daffichage actuelle : , precision : 1); e write(Donner la nouvelle valeur : ); readln(precision); END; &: Modication de . BEGIN writeln(Actuellement, epsilon vaut : , epsilon : 10 : 8); write(Donner la nouvelle valeur : ); readln(epsilon); END;

Le premier param`tre, initialis a faux, permet de basculer entre deux modes lors du e e` test dun programme. En eet, un programme ne marche parfois pas du premier coup. Il est utile de prvoir, a certains endroits que lon estime appropris, des impressions e ` e intermdiaires. Ces impressions peuvent dailleurs aussi tre utiles pour se faire une ide e e e du droulement du programme, de la vitesse de convergence, etc. On active et dsactive e e les impressions intermdiaires au moyen de la variable test, en faisant prcder chaque e e e impression intermdiaire par la condition IF test THEN. On verra un exemple plus bas. e Il existe des directives de compilation spciques aux compilateurs qui permettent de e ne pas compiler ces tests, une fois le programme au point. Les deux autres param`tres concernent la prcision dachage, cest-`-dire le nombre de e e a dcimales souhaites, et la valeur de , qui est utilis pour tester quun rel est nul . e e e e Voici un exemple complet dune procdure de menu. Il sagit du menu dun programme e qui teste les diverses oprations oertes dans la biblioth`que concernant les polynmes e e o a coecients rels. Le programme lui-mme a lallure suivante : ` e e
PROGRAM LibPolynomes; USES general, polynomes; VAR n: integer; p, q, r: pol; PROCEDURE Menu; ... END; { de "menu" } BEGIN showtext; InitGeneral; InitPolynomes; writeln; writeln(Manipulation de polyn^mes a coefficients reels.); o ` writeln(Taper ? pour informations.); REPEAT Menu UNTIL false;

Version 15 janvier 2005

A.4. Menus
END.

443

La procdure Menu est un peu longue, parce que le nombre de choix oerts est lev. e e e
PROCEDURE Menu; VAR choix: char; u: pol; x, t: real; BEGIN writeln; write(Donner votre choix : ); readln(choix); CASE choix OF ?: BEGIN writeln(p, q, r : Lecture du polyn^me p, q, r); o writeln(- : r:=p-q); writeln(+ : r:=p+q); writeln(* : r:=p*q); writeln(/ : p:=qa+r); writeln(n : p:=p*X^n); writeln(c : r:=pgcd(p,q)); writeln(d : r:=driv(p)); e e writeln(v : Valeur p(x)); writeln(x : p <-- q, q <-- r, r <-- p); writeln(. : Fin); END; p: Lecture polynme p o BEGIN write(Donner le degr de p : e ); readln(n); EntrerPolynome(n, p, Entrer les coefficients de p); write(Voici le polyn^me lu :); o EcrirePolynome(p, p(X) = ); END; q: Lecture polynme q o BEGIN write(Donner le degr de q : e ); readln(n); EntrerPolynome(n, q, Entrer les coefficients de q); write(Voici le polyn^me lu :); o EcrirePolynome(q, q(X) = ); END; r: Lecture polynme r o BEGIN write(Donner le degr de r : e ); readln(n); EntrerPolynome(n, r, Entrer les coefficients de r);

Version 15 janvier 2005

444
write(Voici le polyn^me lu :); o EcrirePolynome(r, r(X) = ); END; +: Somme BEGIN EcrirePolynome(p, p(X) = ); EcrirePolynome(q, q(X) = ); PolynomePlusPolynome(p, q, r); EcrirePolynome(r, r(X) = p(X) + END; -: Dirence e BEGIN EcrirePolynome(p, p(X) = ); EcrirePolynome(q, q(X) = ); PolynomeMoinsPolynome(p, q, r); EcrirePolynome(r, r(X) = p(X) END; *: Produit BEGIN EcrirePolynome(p, p(X) = ); EcrirePolynome(q, q(X) = ); PolynomeParPolynome(p, q, r); EcrirePolynome(r, r(X) = p(X) * END; /: Division euclidienne BEGIN EcrirePolynome(p, p(X) = ); EcrirePolynome(q, q(X) = ); TopChrono; PolynomeDivEuclPolynome(p, q, a, t := TempsEcoule; EcrirePolynome(a, p/q = ); EcrirePolynome(r, r(X) = ); END; c: Pgcd BEGIN EcrirePolynome(p, p(X) = ); EcrirePolynome(q, q(X) = ); TopChrono; PolynomePgcd(p, q, r); EcrirePolynome(r, pgcd = ); t := TempsEcoule; writeln; writeln(Le calcul a pris , t : END; d: Drive e e BEGIN EcrirePolynome(p, p(X) = );

Annexe A. Un environnement

q(X) = );

q(X) = );

q(X) = );

r);

1 : 8,

secondes);

Version 15 janvier 2005

A.4. Menus
TopChrono; PolynomeDerive(p, r); t := TempsEcoule; EcrirePolynome(r, p ( X ) = ); END; n: Somme BEGIN write(Donner le degr de X^n : e ); readln(n); EcrirePolynome(p, p(X) = ); PolynomeParXn(p, n, p); EcrirePolynome(p, p.X^n= ); END; v: Valeur BEGIN write(Donner la valeur de x : ); readln(x); EcrirePolynome(p, p(X) = ); writeln(p(, x : 1 : precision, ) = , Valeurd(Degre(p), p, x) : 1 : precision); END; x: BEGIN u := p; p := q; q := r; r := u; EcrirePolynome(p, p(X) = ); EcrirePolynome(q, q(X) = ); EcrirePolynome(r, r(X) = ) END; !: Bascule test BEGIN IF test THEN BEGIN test := false; writeln(Maintenant hors test) END ELSE BEGIN test := true; writeln(Maintenant en test) END END; #: Modication de la prcision dachage e BEGIN writeln(Prcision daffichage actuelle : , precision : 1); e write(Donner la nouvelle valeur : ); readln(precision); END;

445

Version 15 janvier 2005

446

Annexe A. Un environnement
&: Modication de BEGIN writeln(Actuellement, epsilon vaut : , epsilon : 10 : 8); write(Donner la nouvelle valeur : ); readln(epsilon); END; .: Fin BEGIN writeln; writeln(Jarr^te.); e halt END; OTHERWISE Choix inexistant bip END { case } END; { de "Menu" }

Considrons la procdure de calcul du pgcd de deux polynmes : e e o


PROCEDURE PolynomePgcd (a, b: pol; VAR pgcd: pol); VAR r: pol; BEGIN WHILE NOT EstPolNul(b) DO BEGIN PolynomeModPolynome(a, b, r); IF test THEN EcrirePolynome(r, --> ); a := b; b := r END; PolynomeParConstante(a, 1 / a[Degre(a)], a); pgcd := a END; { de "PolynomePgcd" }

La variable de test, si on lui a aect la valeur vrai, provoque limpression intermdiaire : e e


Donner votre choix : c

p(X) = X^5 + 3.0 X^4 + 3.0 X^3 + X^2 q(X) = - X^4 + X^2 --> 4.0 X^3 + 4.0 X^2 --> 0 pgcd = X^3 + X^2 Le calcul a pris 1.61666667 secondes

Les procdures TopChrono et TempsEcoule sont expliques dans la prsentation de la e e e biblioth`que gnrale. Elles dpendent du matriel utilis. e e e e e e

Version 15 janvier 2005

Annexe B

Les biblioth`ques e
Dans cette annexe sont regroupes les dclarations de types et les en-ttes de procdures e e e e des principales biblioth`ques. e

B.1

Gnralits e e e
Prdnie en Turbo Pascal. e e

CONST pi = 3.1415926536; TYPE texte = string[80]; VAR precision: integer; test: boolean; epsilon: real;

Initialisation :
PROCEDURE InitGeneral;

Gestion du temps :
PROCEDURE TopChrono; FUNCTION TempsEcoule: real;

Fonctions arithmtiques sur des entiers : e


FUNCTION min (i, j: integer): integer; FUNCTION max (i, j: integer): integer; PROCEDURE EchangerE (VAR u, v: integer); FUNCTION PuissanceE (x: integer; n: integer): integer; FUNCTION Binomial (n, k: integer): integer;

448
FUNCTION pgcd (a, b: integer): integer;

Annexe B. Les biblioth`ques e

Fonctions arithmtiques sur des rels : e e


FUNCTION rmin (x, y: real): real; FUNCTION rmax (x, y: real): real; PROCEDURE Echanger (VAR u, v: real); FUNCTION log10 (x: real): real; FUNCTION PuissanceR (x, y: real): real; FUNCTION Puissance (x: real; n: integer): real; FUNCTION signe (r: real): integer; FUNCTION EstNul (r: real): boolean; FUNCTION EstPositif (r: real): boolean;

Calcule x y . Calcule x n .

Divers :
PROCEDURE bip;

B.2

Calcul matriciel

CONST OrdreMax = 18; TYPE vec = ARRAY[1..OrdreMax] OF real; mat = ARRAY[1..OrdreMax] OF vec; vecE = ARRAY[1..OrdreMax] OF integer; VAR MatriceUnite: mat; MatriceNulle: mat;

Initialisation :
PROCEDURE InitMatrices;

Lecture-criture : e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE EntrerMatrice (n: integer; VAR a: mat; titre: texte); EntrerMatriceRect (m, n: integer; VAR a: mat; titre: texte); EntrerVecteur (n: integer; VAR a: vec; titre: texte); EntrerMatriceSymetrique (n: integer; VAR a: mat; titre: texte); EcrireMatrice (n: integer; VAR a: mat; titre: texte); EcrireMatriceRect (m, n: integer; VAR a: mat; titre: texte); EcrireVecteur (n: integer; VAR a: vec; titre: texte); EcrireVecteurE (n: integer; VAR a: vecE; titre: texte);

Version 15 janvier 2005

B.3. Polynmes o Oprations : e

449

PROCEDURE MatriceParMatrice (n: integer; a, b: mat; VAR ab: mat); PROCEDURE MatricePlusMatrice (n: integer; a, b: mat; VAR ab: mat); PROCEDURE MatriceParMatriceRect (m, n, p: integer; a, b: mat; VAR ab: mat); PROCEDURE MatriceParVecteur (n: integer; a: mat; x: vec; VAR ax: vec); PROCEDURE VecteurParMatrice (n: integer; x: vec; a: mat; VAR xa: vec); PROCEDURE VecteurPlusVecteur (n: integer; a, b: vec; VAR ab: vec); PROCEDURE VecteurParScalaire (n: integer; x: vec; s: real; VAR sx: vec); PROCEDURE MatriceRectParVecteur (m, n: integer; a: mat; x: vec; VAR ax: vec); PROCEDURE Transposer (n: integer; a: mat; VAR ta: mat); PROCEDURE TransposerRect (m, n: integer; a: mat; VAR ta: mat); FUNCTION ProduitScalaire (n: integer; VAR a, b: vec): real; FUNCTION Norme (n: integer; VAR a: vec): real; FUNCTION NormeInfinie (n: integer; VAR a: vec): real;

Syst`mes : e
PROCEDURE SystemeTriangulaireSuperieur (n: integer; a: mat; b: vec; VAR x: vec); PROCEDURE SystemeParGauss (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); PROCEDURE InverseParGauss (n: integer; a: mat; VAR ia: mat; VAR inversible: boolean); PROCEDURE SystemeParJordan (n: integer; a: mat; b: vec; VAR x: vec; VAR inversible: boolean); PROCEDURE InverseParJordan (n: integer; a: mat; VAR ia: mat; VAR inversible: boolean); FUNCTION Determinant (n: integer; a: mat): real;

B.3

Polynmes o

CONST DegreMax = 20; DegrePolNul = -1; TYPE pol = ARRAY[0..DegreMax] OF real; VAR PolynomeUnite: pol; PolynomeNul: pol;

Initialisation :
PROCEDURE InitPolynomes;

Version 15 janvier 2005

450 Lecture-criture : e

Annexe B. Les biblioth`ques e

PROCEDURE EntrerPolynome (n: integer; VAR p: pol; titre: texte); PROCEDURE EcrirePolynome (VAR p: pol; titre: texte);

Constructeurs :
FUNCTION Degre (VAR p: pol): integer; FUNCTION EstPolNul (VAR p: pol): boolean; PROCEDURE ReelEnMonome (s: real; n: integer; VAR p: pol);

Oprations arithmtiques : e e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PolynomePlusPolynome (p, q: pol; VAR r: pol); PolynomeMoinsPolynome (p, q: pol; VAR r: pol); PolynomeOppose (p: pol; VAR mp: pol); PolynomeParPolynome (p, q: pol; VAR r: pol); PolynomeParXn (p: pol; n: integer; VAR q: pol); PolynomeParMonome (p: pol; s: real; n: integer; VAR q: pol); PolynomeParConstante (p: pol; s: real; VAR q: pol); PolynomeDivEuclPolynome (a, b: pol; VAR q, r: pol); PolynomeModPolynome (a, b: pol; VAR r: pol); PolynomeDivPolynome (a, b: pol; VAR q: pol); PolynomePgcd (a, b: pol; VAR pgcd: pol); PolynomeDerive (p: pol; VAR dp: pol);

Evaluation de la fonction polynme : o


FUNCTION Valeur (VAR p: pol; x: real): real; FUNCTION Valeurd (d: integer; VAR p: pol; x: real): real;

B.4

Nombres complexes

TYPE complexe = ARRAY[0..1] OF real;

Lecture-criture : e
PROCEDURE EntrerComplexe (VAR z: complexe; titre: texte); PROCEDURE EcrireComplexe (z: complexe; titre: texte); PROCEDURE FormaterComplexe (z: complexe; Mode: integer);

Constructeurs :
FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION Re (z: complexe): real; Im (z: complexe): real; ModuleAuCarre (z: complexe): real; Module (z: complexe): real; Arg (z: complexe): real;

Version 15 janvier 2005

B.5. Nombres rationnels


PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FixerRe (VAR z: complexe; r: real); FixerIm (VAR z: complexe; r: real); ReelEnComplexe (VAR z: complexe; r: real); CartesienEnComplexe (a, b: real; VAR z: complexe); PolaireEnComplexe (rho, theta: real; VAR z: complexe);

451

Oprations : e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE ComplexePlusComplexe (u, v: complexe; VAR w: complexe); ComplexeMoinsComplexe (u, v: complexe; VAR w: complexe); ComplexeParComplexe (u, v: complexe; VAR w: complexe); ComplexeSurComplexe (u, v: complexe; VAR w: complexe); ComplexeParReel (z: complexe; r: real; VAR w: complexe); ComplexeOppose (z: complexe; VAR moinsz: complexe); Conjugue (z: complexe; VAR zbarre: complexe);

B.5

Nombres rationnels

TYPE rat = ARRAY[0..1] OF integer; VAR RatZero, RatUn: rat;

Initialisation :
PROCEDURE InitRationnels;

Lecture-criture : e
PROCEDURE EntrerRat (VAR a: rat; titre: texte); PROCEDURE EcrireRat (VAR a: rat; titre: texte);

Constructeurs :
FUNCTION Numerateur (VAR r: rat): integer; FUNCTION Denominateur (VAR r: rat): integer; PROCEDURE FixerNumerateur (VAR r: rat; n: integer); PROCEDURE FixerDenominateur (VAR r: rat; d: integer); PROCEDURE EntierEnRat (VAR r: rat; e: integer); PROCEDURE FaireRat (n, d: integer; VAR r: rat);

Oprations : e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE RatPlusRat (u, v: rat; VAR w: rat); RatMoinsRat (u, v: rat; VAR w: rat); RatParRat (u, v: rat; VAR w: rat); RatSurRat (u, v: rat; VAR w: rat); RatParEntier (u: rat; x: integer; VAR w: rat); RatSurEntier (u: rat; x: integer; VAR w: rat); RatOppose (u: rat; VAR v: rat);

Version 15 janvier 2005

452

Annexe B. Les biblioth`ques e

B.6

Mots

CONST LongueurMot = 25; TYPE mot = ARRAY[0..LongueurMot] OF integer;

Lecture-criture : e
PROCEDURE EntrerMot (VAR u: mot; titre: texte); PROCEDURE EcrireMot (VAR u: mot; titre: texte);

Constructeurs :
FUNCTION Longueur (VAR u: mot): integer; PROCEDURE FixerLongueur (VAR u: mot; n: integer); FUNCTION EstMotVide (VAR u: mot): boolean; PROCEDURE LettreEnMot (VAR u: mot; x: integer); PROCEDURE LeSuffixe (u: mot; i: integer; VAR v: mot); PROCEDURE LePrefixe (u: mot; i: integer; VAR v: mot); PROCEDURE LeFacteur (u: mot; i, j: integer; VAR v: mot); PROCEDURE LeConjugue (u: mot; i: integer; VAR v: mot);

Opration : e
PROCEDURE Concatener (u, v: mot; VAR w: mot);

B.7

Entiers en multiprcision e

CONST base = 100; digitparchiffre = 2; TailleMax = 20; TailleEntierNul = -1; TYPE chiffre = integer; entier = ARRAY[-2..TailleMax] OF chiffre;

Lecture-criture : e
PROCEDURE EntrerEntier (VAR u: entier; titre: texte); PROCEDURE EcrireEntier (VAR u: entier; titre: texte);

Version 15 janvier 2005

B.8. Arithmtique ottante e Constructeurs :


FUNCTION EstEntierNul (VAR u: entier): boolean; PROCEDURE EntierNul (VAR u: entier); FUNCTION Taille (VAR u: entier): integer; PROCEDURE FixerTaille (VAR u: entier; p: integer); FUNCTION LeSigne (VAR u: entier): integer; PROCEDURE FixerSigne (VAR u: entier; s: integer); PROCEDURE ChiffreEnEntier (x: chiffre; VAR u: entier);

453

Oprations arithmtiques : e e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE EntierPlusEntier (u, v: entier; VAR w: entier); EntierMoinsEntier (u, v: entier; VAR w: entier); EntierParChiffre (u: entier; x: chiffre; VAR w: entier); EntierSurChiffre (u: entier; x: chiffre; VAR w: entier); EntierParEntier (u, v: entier; VAR w: entier); EntierDivEuclEntier (u, v: entier; VAR q, r: entier); EntierModEntier (u, v: entier; VAR w: entier); EntierDivEntier (u, v: entier; VAR w: entier);

Oprations sur entiers naturels : e


PROCEDURE ChiffreEnNaturel (x: chiffre; VAR u: entier); PROCEDURE NaturelPlusNaturel (VAR u, v, w: entier); PROCEDURE NaturelMoinsNaturel (VAR u, v, w: entier); PROCEDURE NaturelParNaturel (u, v: entier; VAR w: entier); PROCEDURE NaturelDivEuclNaturel (u, v: entier; VAR q, r: entier); FUNCTION CompareNaturel (VAR u, v: entier): integer; PROCEDURE NaturelParMonome (u: entier; x:chiffre; n:integer; VAR w: entier); PROCEDURE NaturelParChiffre (u: entier; x: chiffre; VAR w: entier); PROCEDURE NaturelPlusChiffre (u: entier; x: chiffre; VAR w: entier); PROCEDURE NaturelSurChiffre (u: entier; x: chiffre; VAR w: entier);

B.8

Arithmtique ottante e

CONST base = 100; digitparChiffre = 2; TailleMax = 16; TYPE chiffre = integer; Flottant = ARRAY[-1..LaTailleMax] OF chiffre; VAR FlottantNul: Flottant;

Version 15 janvier 2005

454 Initialisation :
PROCEDURE InitFlottants;

Annexe B. Les biblioth`ques e

Lecture-criture : e
PROCEDURE EntrerFlottant (VAR u: Flottant; titre: texte); PROCEDURE EcrireFlottant (VAR u: Flottant; titre: texte);

Constructeurs :
FUNCTION EstFlottantNul (VAR u: Flottant): boolean; FUNCTION Exposant (VAR u: Flottant): chiffre; PROCEDURE FixerExposant (VAR u: Flottant; p: chiffre); FUNCTION LeSigne (VAR u: Flottant): chiffre; PROCEDURE FixerSigne (VAR u: Flottant; s: chiffre); PROCEDURE ChiffreEnFlottant (VAR u: Flottant; x: chiffre); FUNCTION FlottantProches (VAR u, v: Flottant): boolean;

Oprations arithmtiques : e e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FlottantPlusFlottant (u, v: Flottant; VAR w: Flottant); FlottantMoinsFlottant (u, v: Flottant; VAR w: Flottant); FlottantParFlottant (u, v: Flottant; VAR w: Flottant); FlottantSurFlottant (u, v: Flottant; VAR w: Flottant); FlottantParChiffre (VAR u: Flottant; x: chiffre); FlottantSurChiffre (VAR u: Flottant; x: chiffre); InverseFlottant (a: Flottant; VAR b: Flottant); RacineFlottant (a: Flottant; VAR b: Flottant); UnSurRacineFlottant (a: Flottant; VAR b: Flottant);

B.9
TYPE

Gomtrie e e
Point = ARRAY[0..1] OF real;

Initialisation :
PROCEDURE InitGeometrie;

Lecture-criture : e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE SaisirPoint (VAR q: Point); TracerSegment (p, q: Point); TracerDemiDroite (p, d: Point); MarquerPointCarre (p: Point; couleur: integer); MarquerPointRond (p: Point; couleur: integer); NumeroterPoint (p: Point; n: integer);

Version 15 janvier 2005

B.9. Gomtrie e e Fonctions dacc`s et constructeur : e


FUNCTION Abscisse (VAR q: Point): real; FUNCTION Ordonnee (VAR q: Point): real; PROCEDURE FairePoint (x, y: real; VAR q: Point);

455

Manipulations gomtriques de base : e e


FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION det (VAR p, q, r: Point): real; EstSitue (VAR p, q, r: Point): integer; EstAGauche (VAR p, q, r: Point): boolean; EstADroite (VAR p, q, r: Point): boolean; CarreNorme (VAR p: Point): real; CarreDistance (VAR p, q: Point): real;

Conversions :
PROCEDURE PointEnPixel (p: Point; VAR a: Pixel); PROCEDURE PixelEnPoint (c: Pixel; VAR q: Point);

Graphique
TYPE Pixel = ARRAY[0..1] OF integer; VAR HauteurEcran: integer; LargeurEcran: integer;

Initialisation :
PROCEDURE InitGraphik;

Oprations : e
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE TracerCarre (a: Pixel; r: integer); TracerDisque (a: Pixel; r: integer); LireCurseur (VAR curseur: Pixel); RelierPixels (a, b: Pixel); EcrireGraphique (a: Pixel; n: integer);

Version 15 janvier 2005

Index
moyenne arithmtico-gomtrique 396 e e e A accessible, sommet 131, 133 acyclique, matrice 131, 133 adjacentes, faces 280 alg`bre de Lie 32, 35 e engendre par une partie 32, 35 e rsoluble 33, 35 e algorithme de Berlekamp 187 de Graham 285 alphabet 235 alphabtique, ordre 249 e angle 282 di`dre 283 e anneau euclidien 326 principal 327 apriodique, matrice 131, 134 e arc 132 arte 279 e de Delaunay 294, 295 de Vorono 300 B Berlekamp, algorithme de 187 Bernoulli nombres de 211, 212 polynmes de 211 o Bezout, thor`me de 182, 341 e e binomial, coecient 421 Brent-Salamin, formule de 394, 396 C Catalan nombres de 242, 341, 343, 368 suites de 341, 343 456 cercle de Delaunay 294, 295 chemin 130, 132 longueur dun 132 Choleski, dcomposition de 57, 72, 112 e coecient binomial 421 coloriage 310 complexit dun algorithme 276 e concatnation 235 e conjugu e dun mot 235, 248 dune partition 221 convexe dimension dun 276 enveloppe 277, 284, 294 partie 276 poly`dre 277 e couverture 311 crochet de Lie 35, 45 Crout, mthode de 52 e cycle 130, 132 cyclique, lment 130, 132 ee D dbut dun mot 235, 248 e dcomposition e de Choleski 57, 72 LU 51, 71 QR 59, 96 degr 161 e Delaunay arte de 294, 295 e cercle de 294, 295 triangle de 294, 295 triangulation de 295 dterminant, calcul du 13, 14 e diagonale 311 diagramme de Ferrer 221

INDEX de Vorono 300 di`dre, angle 283 e division euclidienne de polynmes 191 o Duval, factorisation de 256 E lmentaire, matrice 119, 123 ee ELSE 417 entier de Gauss 325, 326 irrductible 325, 327 e enveloppe convexe 277, 284, 294 infrieure 299 e quilibre, matrice 118, 121 e e et squentiel 418 e euclidien, anneau 326 Euler, identit 221 e F face 279 faces adjacentes 280 incidentes 280 facette 278 facteur dun mot 235 factorielle, suite 209 factorisation de Duval 256 dun entier de Gauss 328 de Lyndon 248, 251 dun polynme 178 o standard 250 Ferrer, diagramme de 221 Fibonacci, nombres de 351 le 140 ls gauche (droit) 239 n dun mot 235, 248 fonction symtrique lmentaire 159 e ee fortement infrieur 249 e Frobenius, matrice de 10 G galerie dart 309 Gauss entier de 325, 326 mthode de 9 e modernise 52 e Givens, mthode de 59, 73 e Graham, algorithme de 285 Gram-Schmidt 59 graphe 132 H Hadamard, ingalit de 102, 104 e e Horner, schma de 343, 347, 430 e Householder, mthode de 65, 78 e I incidentes, faces 280 inverse gnralise 24 e e e de Penrose-Moore 24 irrductible e matrice 131, 133 polynme 178 o J Jacobi identit de 224 e Jacobi, mthode de 85 e Jordan, mthode de 15 e L Lanczos, matrice de 71, 112 Landen, transformation de 398 Legendre, formule de 400 lettre 235 lexicographique, ordre 203, 248, 249 Lie alg`bre de 32, 35 e crochet de 35, 45 longueur dun chemin 130, 132 dun mot 235 LU , dcomposition 51, 71 e Lukasiewicz, mot de 238, 240 Lukasiewicz, mot de 343 Lyndon factorisation de 248, 251 mot de 248

457

Version 15 janvier 2005

458 M Machin, formule de 384, 385 matrice acyclique 131, 133 dadjacence 132 apriodique 131, 134 e lmentaire 119, 123 ee quilibre 118, 121 e e de Frobenius 10 inverse gnralise 24 e e e inverse de Penrose-Moore 24 irrductible 131, 133 e de Lanczos 71, 112 de Penrose-Moore 24 primitive 131, 134 produit de 8 pseudo-inverse 23, 24 rductible 133 e totalement unimodulaire 117, 119 trace dune 38 transpose 8 e triangulaire 34 tridiagonale 69 unimodulaire 117, 119 unitriangulaire 51 matrices trigonalisables 32 mthode e de Choleski 27, 57, 72, 112 de Crout 52 de Gauss 9 modernise 52 e de Givens 59, 73 de Householder 65, 78 de Jacobi 85 de Jordan 15 LR 110 de Newton 370, 371 du pivot partiel 9 du pivot total 15 QR 96 de Rutishauser 110 modulaire, reprsentation 340, 342 e moindres carrs, probl`me des 24, 27 e e monte dune permutation 208 e Version 15 janvier 2005

INDEX mot 235 de Lukasiewicz 238, 240, 343 de Lyndon 248 vide 235 multidegr dun monme 167 e o N Newton mthode de 370, 371 e sommes de 163 nombres de Bernoulli 211, 212 de Catalan 242, 341, 343, 368 de Fibonacci 351, 365 O ordre alphabtique 249 e de convergence 397 lexicographique 203, 248, 249 oreille 310 OTHERWISE 417 ou squentiel 418 e P part dune partition 216, 218 partition conjugue 221 e dun entier 216, 218 Penrose-Moore, matrice de 24 priode 131 e pgcd 422 de deux polynmes 192 o pile 154 pivot 9 poids dun polynme 161 o polaire, ensemble 281 poly`dre e convexe 277 face dun 279 polygone simple 310 polynme o

INDEX de Bernoulli 211 caractristique 85 e degr dun 161 e division euclidienne 191 factorisation dun 178 irrductible 178 e poids dun 161 rductible 178 e symtrique 158, 160 e taille dun 167 unitaire 150 zros dun 102, 107, 145 e precision 7, 420 prxe dun mot 235 e propre 235 primitive, matrice 131, 134 principal, anneau 327 probl`me des moindres carrs 24, 27 e e profondeur dun mot de Lukasiewicz 246 propre valeur 85 vecteur 85 pseudo-inverse, matrice 23, 24 Q QR, mthode 96 e queue 140 R rang 203 dune matrice 18 dun sommet 131 rductible e matrice 133 polynme 178 o rfrence, param`tre 415 ee e rgion de Vorono 295, 300 e rsoluble, alg`bre de Lie 33, 35 e e restes chinois, thor`me des 182, 341 e e rticule 291 e Rutishauser, mthode de 110 e S semi-anneau 132 simplexe 277 sommes de Newton 163 sommet 132, 279 de Vorono 300 Stirling, formule de 344 Sturm, suite de 102, 107, 145, 146 suxe dun mot 235 propre 235 suite automatique 272 de Catalan 341, 343 factorielle 209 de rsolution 33, 35 e de Sturm 102, 107, 145, 146 de Thue-Morse 263 symtrique e fonction lmentaire 159, 160 ee polynme 158, 160 o syst`me e linaire 9 e triangulaire 9 tridiagonal 69

459

T taille dun polynme 167 o texte, type 4, 420 Thue-Morse, suite de 263 titre 4 totalement unimodulaire, matrice 117, 119 trace dune matrice 38 transformation de Landen 398 triangle de Delaunay 294, 295 triangulation 310, 311 de Delaunay 295 tridiagonale, matrice 69, 73, 79 trigonalisables,matrices 32 triple produit, identit du 224 e U unimodulaire, matrice 117, 119 unit 418 e unitaire, polynme 150 o unitriangulaire, matrice 51 Version 15 janvier 2005

460 V valeur propre 85 dune matrice tridiagonale 100 valeur, param`tre 415 e variation 145, 147 vecteur propre 85 vide, mot 235 Vorono arte de 300 e diagramme de 300 rgion de 295, 300 e sommet de 300

INDEX

Version 15 janvier 2005

Anda mungkin juga menyukai