Livre Algo Unlocked
Livre Algo Unlocked
Livre Algo Unlocked
ALGORITHMIQUES
François Bergeron
Hiver 2017
2 Ensembles et fonctions 41
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2 Ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3 Sous-ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.4 Opérations de base sur les ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5 Produit cartésien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.6 Relation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.7 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.7.1 Bijections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7.2 Injections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
i
ii TABLE DES MATIÈRES
2.7.3 Surjections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.8 Compter les éléments d’un ensemble . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.9 Ensembles, décidabilité, et complexité d’algorithmes(∗) . . . . . . . . . . . . . . . . . 56
2.10 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3 Graphes simples 63
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.2 Graphe simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3 Voisinage et degré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.4 Chemin dans un graphe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.5 Opérations sur les chemins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6 Cycles hamiltoniens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.7 Composantes connexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.8 Plus court chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.9 Cycles eulériens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.10 Multigraphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.11 Isomorphisme de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.12 Matrice d’adjacence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3.13 Contraction d’arêtes et mineurs(∗) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.14 Graphes planaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.15 Cartes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.16 Coloration de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.17 Chemins dans le graphe Z × Z(∗) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.18 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4 Structures arborescentes 93
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.2 Arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.3 Arborescences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.4 Arbres binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.5 Arbres binaires croissants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.6 Arbres ordonnés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
4.7 Fonction de stationnement(∗) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.8 Forêts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.9 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
7 Algèbre(∗) 145
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.2 Algorithme de Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.3 Algorithme d’Euclide pour polynômes . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.4 Bases de Gröbner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
7.5 Permutations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
7.6 Diagrammes de Ferrers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.7 Algorithme RSK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
7.8 Le problème du mot pour un groupe . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.9 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Appendices 158
E Notations 175
Introduction
Rapellons qu’on dit que a divise b si et seulement le reste de la division de b par a est 0. La clause
(2) assure que d est le plus grand des nombres qui divise à la fois a et b. Bien entendu, on a
h a, b i = h b, a i, puisque dans les deux cas il s’agit du même plus grand commun diviseur.
1
2 TABLE DES MATIÈRES
Par exemple, 12 est le plus grand commun diviseur de 84 et 120, et on écrit donc 1
À l’école, on enseigne habituellement l’algorithme (peu efficace) suivant pour calculer le plus
grand commun diviseur. On commence par factoriser chacun des nombres a et b en produit de
nombres premiers, ici
84 = 22 · 3 · 7, et 120 = 23 · 3 · 5,
puis on trouve le plus grand facteur commun (en prenant la plus grande puissance de chaque
nombre premier impliqué qui soit commun aux deux factorisations) :
12 = 22 · 3.
Cette méthode devient rapidement impraticable lorsque la taille des nombres a et b augmente. En
fait, cela est le cas même pour un ordinateur puissant, qui peine à factoriser un nombre de 80
chiffres comme :
25976406898076471238178176302465963001785719098499989870948037468528746663938173.
Évidemment, c’est bien pire pour un être humain. En fait, la difficulté de factoriser un grand
nombre est à la base de nombreux système de cryptographie moderne, par exemple le fameux
système RSA (voir 1.11). Le calcul du plus grand commun diviseur joue de plus un rôle de base
dans l’élaboration même de ce système de cryptographie, et il est essentiel de pouvoir le calculer
rapidement le plus grand commun diviseur pour des nombres même plus grands que celui ci-dessus.
La bonne méthode de calcul du plus grand commun diviseur est connue depuis au moins 2300
ans (sinon même avant), sous le nom d’algorithme d’Euclide. C’est l’un des plus vieux algorithmes
intéressants, tout en étant toujours d’actualité. Considérons donc des entiers positifs a et b, en
supposant que a ≤ b pour simplifier la présentation. On divise b par a, pour obtenir que
b = q · a + r, (0.1)
avec q égal au quotient, et 0 ≤ r < a égal au reste de la division. Rappelons qu’on dit que a
divise b si et seulement si le reste de la division est zéro, c.-à-d. : r = 0. Pour mettre en place
l’algorithme d’Euclide, l’observation clé est qu’on a que
h a, b i = h r, a i. (0.3)
1. Dans les textes mathématiques, on utilise la notation h a, b i plutôt que la notation Pgcd(a, b) d’inspiration plus
informatique.
TABLE DES MATIÈRES 3
C’est là l’étape de base de l’algorithme. On la répète jusqu’à ce qu’il soit facile de donner une
réponse, c’est-à-dire lorsque r = 0. Illustrons par un exemple. Pour a = 623312 et b = 3421568, on
a successivement
3421568 = 5 · 623312 + 305008, et donc h 623312 , 3421568 i = h 305008, 623312 i,
623312 = 2 · 305008 + 13296, = h 13296, 305008 i,
305008 = 22 · 13296 + 12496, = h 12496, 13296 i,
13296 = 1 · 12496 + 800, = h 800, 12496 i,
12496 = 15 · 800 + 496, = h 496, 800 i,
800 = 1 · 496 + 304, = h 304, 496 i,
496 = 1 · 304 + 192, = h 192, 304 i,
304 = 1 · 192 + 112, = h 112, 192 i,
192 = 1 · 112 + 80, = h 80, 112 i,
112 = 1 · 80 + 32, = h 32, 80 i,
80 = 2 · 32 + 16, = h 16, 32 i,
32 = 2 · 16 + 0, = h 0, 16 i.
On conclut donc que 16 est le plus grand commun diviseur de 623312 et 3421568, c.-à-d. :
h 0, a i = a, (0.4)
On peut généraliser le calcul du plus grand commun diviseur à un ensemble (fini) de n entiers :
a1 , a2 , . . . , an , de la façon suivante. Pour simplifier, on suppose que 0 ≤ a1 ≤ a2 ≤ . . . ≤ an , et
on pose
4 TABLE DES MATIÈRES
C’est ce type d’approche que nous allons développer dans ces notes, en décrivant des algo-
rithmes intéressants soit pour le calcul de fonctions, la construction d’ensembles, la solution
d’équations, ou encore la résolution de problèmes sur les graphes. L’emphase sera donc mise sur
l’aspect calculatoire des mathématiques, pour en démontrer la puissance, mais aussi les limites. On
adoptera souvent une approche récursive à la solution de problèmes considérés (ou à la définition
de nouveaux objets mathématiques). Informellement, une telle approche consiste en la description
de la façon de
a) résoudre le problème dans les cas simples,
b) ramener tous les autres cas à des cas qui se rapprochent des cas simples.
C’est aussi simple que d’apprendre à marcher : on fait un pas, et on continue à marcher .
Avant d’embarquer dans notre aventure, un avertissement d’ordre général est probablement néces-
saire en ce qui concerne la nature des définitions mathématiques. En effet, dans l’élaboration d’un
sujet mathématique il est crucial d’avoir des définitions claires et précises des objets à manipuler.
En particulier, une bonne définition doit permettre de déterminer quand deux objets sont égaux,
en plus d’indiquer comment il faut procéder pour construire de tels objets. Il faut apprendre à lire
et utiliser très attentivement les définitions proposées, en n’oubliant pas que le critère ultime d’une
bonne définition est la facilité avec laquelle elle permet le développement des notions abordées.
Cela demande une attention constante à la rigueur et la précision du discours. Cependant, afin de
conserver une présentation agréable et intelligible, il est nécessaire de nourrir la compréhension avec
des illustrations plus intuitives. Dans certains cas, ces deux objectifs sont difficiles à réconcilier, et
nous ne réussirons peut-être pas nécessairement toujours à le faire.
La théorie des ensembles sert de langage de base pour les définitions et le discours mathématiques.
Une excellente maı̂trise de celle-ci est donc essentielle pour bien progresser dans l’étude des notions
abordées.
Les sections, exercices et chapitres marqués d’une étoile(∗) sont plus avancés, ou simplement présentés
pour susciter l’intérêt chez les passionnés. Ils peuvent être omis en première lecture, ou considérés
comme facultatifs dans une introduction au sujet. Certains exercices plus difficiles sont de nature
TABLE DES MATIÈRES 5
exploratoire, et constitue une porte ouverte sur des notions qui seront abordées dans des cours plus
avancés.
Plusieurs des photographies (et informations biographiques) proviennent du site historique de l’Uni-
versité Saint-Andrews :
http://www-history.mcs.st-and.ac.uk/history/BiogIndex.html
En général, des liens hypertextes sont associés aux noms des mathématiciens apparaissant dans
le texte. On peut ainsi consulter leur biographie, mais celle-ci est en général en anglais. D’autres
images proviennent de l’encyclopédie Wikipédia.
6 TABLE DES MATIÈRES
Chapitre 1
Le premier contexte dans lequel nous allons explorer la notion d’algorithmes est celui des nombres
(surtout entiers) et des fonctions entre ensembles de nombres. Ici, la notion de récursivité joue un
rôle crucial. Nous allons donc en discuter des aspects fondamentaux plus en détail.
Une des particularités importantes de l’ensemble 1 des nombres entiers (non négatifs)
N = {0, 1, 2, 3, 4, . . .}
est qu’il sert souvent à indexer des suites de nombres, de fonctions, de formules, etc. Dans ces divers
contextes, on est amené à formuler une suite d’énoncés mathématiques
P0 , P1 , P2 , P3 , . . .
associés à ces suites d’objets mathématiques, qu’on cherche ensuite à démontrer. Dans ces circons-
tances, l’outil de démonstration privilégié est très souvent la preuve par récurrence. Son schéma
général consiste en deux étapes :
(1) On démontre d’abord que l’énoncé P0 est vrai.
(2) Puis, en supposant que Pn−1 est vrai (pour n quelconque), on montre que Pn s’ensuit.
1. Dans ce chapitre, nous allons utiliser la notion d’ensemble de façon très informelle. Un point de vue un peu
plus rigoureux sera abordé dans le prochain chapitre.
7
8 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
Le principe de récurrence assure qu’on peut alors conclure que Pn est vrai pour tout n.
Illustrons ceci par un exemple simple. Considérons la suite d’énoncés Pn (un pour chaque n dans
N) qui affirme qu’on a l’égalité
n
X n (n + 1)
k= . (1.1)
2
k=1
Ainsi,
P0 correspond à 0 = (0 · 1)/2,
P1 ” 1 = (1 · 2)/2,
P2 ” 1 + 2 = (2 · 3)/2,
P3 ” 1 + 2 + 3 = (3 · 4)/2,
P4 ” 1 + 2 + 3 + 4 = (4 · 5)/2,
..
.
Le processus récursif pour prouver
(∀n ∈ N) Pn ,
autrement dit que la formule
n+1 n (n + 1)
:=
2 2
donne bien la somme des entiers de 1 à n, quelque soit n, se déroule comme suit. On commence
par montrer (ou ici, simplement observer) que P0 est vrai, c.-à-d. :
0 = (0 · 1)/2,
puis, en supposant que Pn−1 est vrai, c’est-à-dire que
(n − 1) n
1 + 2 + . . . + (n − 1) = , (1.2)
2
on vérifie, par le calcul suivant, que Pn en découle bien :
1 + 2 + . . . + n = (1 + 2 + . . . (n − 1)) + n,
| {z }
(n − 1) n
= + n,
2
n (n + 1)
= .
2
On a donc prouvé que
n
X n (n + 1)
(∀n ∈ N) k= .
2
k=1
1.2. FONCTIONS 9
1.2 Fonctions
Avant d’aborder la notion de fonction récursive, il est utile de clarifier la notion moderne de fonction.
Cela est essentiel à la bonne compréhension de toute la suite de ce texte, et il y a abondante matière
à une réflexion approfondie.
Bien que la notion de fonction soit l’une des plus importantes
en mathématiques, ce n’est qu’à la fin du dix-neuvième siècle
qu’elle a pris la forme moderne 2 qu’on lui connaı̂t. Une rela-
tion fonctionnelle f , de l’ensemble A vers l’ensemble B, est une
relation f ⊆ A × B, qui possède la propriété que :
Autrement dit, l’élément x dans A caractérise uniquement l’élément correspondant y dans B. Il est
habituel de désigner par f (x) cet élément, et on a donc
Formellement parlant, une fonction de A vers B est un triplet (f, A, B), où f est une relation
fonctionnelle de A vers B. Il est habituel d’écrire f : A → B pour ce triple. Ainsi, on a la fonction
f : {a, b, c, d} → {1, 2, 3}, telle que
Il y a en fait un grand nombre de façons de construire ou de spécifier une fonction. Par exemple,
une fonction f peut être décrite par une formule qui calcule f (x), ou apparaı̂tre comme solution
d’une équation différentielle, ou encore être définie récursivement. L’important est que le critère
abstrait (1.3) soit satisfait. Deux fonctions f : A → B et g : A → B sont égales si et seulement si
on a f (x) = g(x), pour tout x dans A. Autrement dit, on connaı̂t une fonction si et seulement si on
connaı̂t sa valeur f (x) pour chaque élément x de A. On peut donc penser à une fonction comme
étant un processus f qui
Pour une fonction f : A → B, on dit que l’ensemble A est la source de F , et que l’ensemble B en
est le but.
2. On ne sait trop qui doit être crédité pour cela.
10 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
De plus, pour chaque ensemble A, on a une fonction appelée identité, IdA : A → A, simplement
définie en posant IdA (x) = x, pour tout x dans A. Pour toute fonction f : A → B, on a alors
f ◦ IdA = f = IdB ◦ f .
Plusieurs fonctions sur les entiers admettent une description récursive. Parmi les illustrations ty-
piques, on a la fonction factorielle dénotée n!, définie comme :
(
n · (n − 1)!, si n > 0,
n! = (1.7)
1, si n = 0,
Ces descriptions peuvent être directement utilisées pour calculer la fonction dont il est question.
Ainsi, on trouve
5! = 5 · 4!,
= 5 · 4 · 3!,
= 5 · 4 · 3 · 2!,
= 5 · 4 · 3 · 2 · 1!,
= 5 · 4 · 3 · 2 · 1 · 0!,
= 5 · 4 · 3 · 2 · 1 · 1 = 120.
1.3. DÉFINITIONS RÉCURSIVES 11
On a les valeurs
n 0 1 2 3 4 5 6 7 8 9 10
F (n) 1 1 2 3 5 8 13 21 33 55 89
Les définitions de concepts mathématiques se doivent de déterminer ces concepts de façon claire et
précise. Souvent, un théorème dit fondamental assure que les définitions d’un certain format sont
mathématiquement acceptables. C’est le cas du théorème suivant que nous allons d’abord formuler
de façon simplifiée pour augmenter la clarté de notre présentation.
Théorème 1.1 (Fondement des définitions récursives simples). Étant donnée une fonction
R : N × X −→ X,
f : N −→ X,
telle que
R(n, f (n − 1)), si n ≥ 1,
f (n) = (1.9)
x0 , si n = 0.
Preuve. L’argument qui montre l’unicité est typique. Il consiste simplement à supposer qu’il y a
deux fonctions f1 et f2 qui satisfont aux conditions du théorème, pour montrer ensuite qu’elles sont
nécessairement égales. On le prouve par récurrence, en observant d’abord que
f1 (0) = x0 = f2 (0).
12 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
Tel que formulé, le Théorème 1.1 assure qu’il y a une et une seule fonction qui satisfait (1.7). On
peut donc considérer avec pleine assurance qu’on a ainsi défini une nouvelle fonction mathématique.
Cependant, il ne s’applique pas tel quel à la définition de la fonction F de Fibonacci en (1.8), qui
fait aussi appel à la valeur de F (n − 1) et de F (n − 2). Il est facile d’y remédier en formulant (et
prouvant) une forme plus générale du théorème. Les notations sont un peu plus techniques ,
mais on y gagne à la longue, et la preuve est tout à fait semblable à celle de (1.1).
Théorème 1.2 (Fondement des définitions récursives). Pour tout k fixé, étant donnée une fonction
R : N × X k −→ X,
f : N −→ X,
telle que
R(n, f (n − 1), . . . , f (n − k)), si n ≥ k,
f (n) = (1.10)
xn , si 0 ≤ n < k.
Le problème des tours de Hanoı̈, datant de 1883, se résout de façon élégante avec une approche
récursive. Il y a n disques de grandeurs toutes différentes (Voir Figure 1.1), insérés sur une tige
verticale (tige 1) pour qu’ils soient en ordre décroissant (du bas vers le haut), avec deux autres
tiges verticales vides situées au côté (tiges 2 et 3). On veut transférer tous les disques de la tige 1
à la tige 2 de façon à ce qu’ils soient encore en ordre décroissant, avec des manipulations soumises
aux restrictions suivantes :
(a) ne déplacer qu’un disque à la fois ;
(b) toujours placer les disques sur l’une des tiges 1, 2 ou 3, et pas ailleurs ;
(c) ne jamais mettre un disque sur un disque plus petit.
Pour déplacer les n disques, on commence par (récursivement)
(i) déplacer les n − 1 premiers disques de la tiges 1 (origine) à la tige 3 (but), en se servant de
la tige 2 comme tige auxiliaire
(ii) puis déplacer le nième disque (le plus grand) de la tige 1 à la tige 2,
(iii) et finalement déplacer les n − 1 disques de la tige 3 à la tige 2, en se servant de la tige 1
comme auxiliaire.
Les parties (i) et (iii) de la solution procèdent de même façon, en échangeant au besoin les rôles
des tiges origine, but et auxiliaire. Ceci est illustré à la Figure 1.1 dans le cas n = 3. Les parties (i)
et (iii) comprennent chacune 4 étapes, permettant de déplacer les deux plus petits disques au bon
endroit. Le passage de (4) à (5) correspond à (ii).
On peut définir récursivement les opérations usuelles sur les entiers positifs (sur N), à partir de
l’addition. Ainsi, on peut définir la multiplication (presque comme à la petite école), pour des entiers
positifs a et n, (
0 si, n = 0,
a · n := (1.11)
(a · (n − 1)) + a si, n ≥ 1.
ou encore l’exponentiation : (
1 si, n = 0,
an := (1.12)
(an−1 ) · a si, n ≥ 1.
De façon tout à fait analogue, pour une fonction f : X → X, on a le n-ième itéré f n de f , défini
en posant (
n Id si, n = 0,
f (x) := n−1
(1.13)
f (f (x)) · a si, n ≥ 1.
14 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
(1) (5)
&
)
(2) (6)
PP
q
P .
(3) (7)
& &
(4) (8)
Par exemple, on a
ex
f 3 (x) = ee , si f (x) = ex . (1.14)
On montre facilement (voir exercice 1.2) par récurrence qu’on a les identités
(i) a · (k + n) = (a · k) + (a · n),
(ii) (a + b) · n = (a · n) + (b · n),
(1.15)
(iii) ak+n = ak an ,
(iv) ak·n = (ak )n .
Ces identités s’étendent aux nombres entiers quelconques Z := { . . . , −2, −1, 0, 1, 2, . . . }, en res-
pectant la règle a + (−a) = 0.
On montre par récurrence sur b la propriété de division euclidienne suivante. Quel que soit a et b
dans N, avec a 6= 0, il existe d’uniques entiers q et r tels que
1.6 Polynômes en x
Si x est une variable, on a le monôme xn défini exactement comme en (1.12). On dit d’une somme
finie
f := a0 + a1 x + . . . + an xn , (1.17)
que c’est un polynôme en la variable x, de degré au plus n. Comme tel, le degré de f est le plus
grand entier k tel que ak 6= 0. D’un point de vue récursif, un polynôme de degré au plus n s’écrit
donc comme
f = an xn + f1 , (1.18)
avec f1 un polynôme de degré au plus n − 1. Les polynômes de degré 0 sont les constantes (selon
le contexte dans Z, Q, R, etc.). En exploitant cette description, avec
qui est alors un polynôme de degré au plus n. Pour des polynômes de degré 0, la somme est la
somme usuelle des constantes.
De façon similaire, le produit de deux polynômes f = an xn + f1 et g = bk xk + g1 , respectivement
de degré n et k, se définit récursivement comme
Par exemple, on a
(3 x2 − 6 x + 1) · (x3 − 2 x + 1) = 3 x5 + 3 x2 (−2 x + 1)
+x3 (−6 x + 1)
+(−6 x + 1) · (−2 x + 1)
= 3 x − 6 x4 − 5 x3 + 15 x2 − 8 x + 1.
5
Avec les mêmes conventions pour f et g, la propriété de division euclidienne pour les polynômes
s’exprime comme suit. Quel que soit les polynômes f et g, il existe d’uniques polynômes q et r tels
que
f = q · g + r, avec 0 ≤ deg(r) < deg(g). (1.23)
16 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
On procède par récurrence sur le degré de f pour calculer q et r. Supposons donc qu’on a (1.23)
dans tous les cas où le degré de f est plus petit que n. Lorsque deg(f ) ≥ deg(g), on obtient
an n−k
q= x + q1 , (1.24)
bk
c’est-à-dire qu’on l’identité
an n−k
f= x + q1 · g + r, (1.25)
bk
où q1 et r sont obtenus récursivement comme :
an n−k
f− x g = q1 · g + r, avec 0 ≤ deg(r) < deg(g). (1.26)
bk
Par contre, si deg(f ) < deg(g), alors on a simplement q = 0 et r = f . Bref, ce calcul imite la
procédure scolaire pour diviser un entier par un autre. Voir la section C.1 pour plus de détails sur
les polynômes.
Bien entendu, un polynôme f = f (x) peut être considéré comme une fonction de la variable x. En
particulier, on peut itérer (comme en (1.13)) cette fonction. Par exemple, on a
(1) f n (x) = x + a · n, si f (x) = x + a,
(2) f n (x) = an x, si f (x) = a · x,
(1) f n (x) = an · x + an−1 + . . . + a + 1, si f (x) = a · x + 1.
L’évolution de la suite des itérés de f débutant en 27 est surprenante, mais on fini tout de même
par aboutir à 1.
f f f f f f f
27 → 82 → 41 → 124 → 62 → 31 → 94 → 47 f
y y y y y y y
x x x x x x x x x x x x x
f f f f f f f
142 → 71 → 214 → 107 → 322 → 161 → 484 → 242 f
f f f f f f f
121 → 364 → 182 → 91 → 274 → 137 → 412 → 206 f
f f f f f f f
103 → 310 → 155 → 466 → 233 → 700 → 350 → 175 f
f f f f f f f
526 → 263 → 790 → 395 → 1186 → 593 → 1780 → 890 f
f f f f f f f
445 → 1336 → 668 → 334 → 167 → 502 → 251 → 754 f
f f f f f f f
377 → 1132 → 566 → 283 → 850 → 425 → 1276 → 638 f
f f f f f f f
319 → 958 → 479 → 1438 → 719 → 2158 → 1079 → 3238 f
y y y
f f f f f f f
1619 → 4858 → 2429 → 7288 → 3644 → 1822 → 911 → 2734 f
f f f f f f f
1367 → 4102 → 2051 → 6154 → 3077 → 9232 → 4616 → 2308 f
f f f f f f f
1154 → 577 → 1732 → 866 → 433 → 1300 → 650 → 325 f
y y y
f f f f f f f
976 → 488 → 244 → 122 → 61 → 184 → 92 → 46 f
f f f f f f f
23 → 70 → 35 → 106 → 53 → 160 → 80 → 40 f
f f f f f f f
20 → 10 → 5 → 16 → 8 → 4 → 2 → 1.
Bien que le problème ait été posé dès 1937, on n’a toujours pas de réponse. Tout semble porter à
croire que la réponse est bien oui. En particulier, c’est le cas pour tous les nombres n ≤ 260 . Pour
plus de détails, voir
http://en.wikipedia.org/wiki/Collatz_conjecture
Le fait que nous ignorions toujours la solution du problème de Collatz a des conséquences infor-
matiques intéressantes. Ainsi, lorsqu’on lance un calcul sur ordinateur pour vérifier que pour n on
a bien un itéré f k (n) donnant 1, le nombre d’étapes de calcul est k = k(n). Ainsi ce nombre, qui
dépend de n, prend les valeurs k(11) = 14, k(27) = 111, et k(9780657630) = 1132. Pour l’instant,
on n’a aucune idée de quel est la valeur de ce nombre k(n) d’étapes en général. On ne sait même
pas si k(n) existe toujours, c’est-à-dire que k(n) < ∞. On ne peut donc même pas prévoir com-
bien de temps un ordinateur prendra pour répondre dans chaque cas ni même s’il ne répondra un
jour. Autrement dit, on est incapable d’analyser la complexité de l’algorithme de vérification du
problème de Collatz.
18 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
Bien que ces coefficients soient souvent liés au nom de Pascal (on
parle du triangle de Pascal 4 ), ils étaient connus longtemps avant,
même organisés en triangle. La récurrence (1.28) permet de cal-
Yang Hui, XIV-ième siècle.
culer les valeurs de la Figure 1.2 : Le terme coefficients bino-
Zn := {0, 1, 2, 3, . . . , n − 1},
dit des entiers modulo n, avec n dans N. Plus techniquement, Zn s’identifie aux classes d’équivalences
pour la relation de congruence sur Z (voir (0.1))
qui se lit a est congru à b modulo n. Tout entier a, dans Z, admet comme représentant canonique,
de sa classe de congruence, l’unique entier r dans Zn (donc 0 ≤ r ≤ n − 1) tel que
a ≡(mod n) r,
a = q · n + r,
et on écrit r = (a mod n) pour le reste de cette division de a par n. Attention ici, lorsque a < 0, il
faut faire la division de façon à avoir 0 ≤ r < n. Ainsi, la division de −23 par 5 donne un quotient
de −5 avec reste 2, puisque
−23 = (−5) · 5 + 2.
Autrement dit,
2 = (−23 mod 5).
Sur les entiers modulo n, on a les opérations usuelles de somme, de différence, de produit et
d’exponentiation qui s’obtiennent simplement en posant
Ceci est acceptable au vu de la proposition suivante (prouvé à l’exercice 1.10), qui assure que ces
définitions se tiennent.
Proposition 1.3. Pour des entiers a1 , a2 , b1 et b2 dans Z, si
a1 ≡(mod n) a2 , et b1 ≡(mod n) b2 ,
alors
a1 + b1 ≡(mod n) a2 + b2 , et a1 · b1 ≡(mod n) a2 · b2 .
20 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
Il est intéressant d’observer qu’on peut exploiter habilement les propriétés ci-haut pour calculer
récursivement une puissance ak efficacement. Le schéma de calcul est le suivant :
Ainsi on arrive à calculer rapidement (même à la main) la valeur de (2 mod 10)100 , simplement
comme suit :
Il faut bien convenir que ceci est bien plus facile, et bien plus rapide, que de calculer
2100 = 1267650600228229401496703205376,
puis de constater que le reste de la division par 10 est bien 6, puisque c’est le dernier chiffre
significatif.
L’opération de division dans Zn est plus délicate et n’est pas toujours possible. L’essentiel est de
savoir calculer l’inverse multiplicatif (a mod n)−1 dans Zn , lorsque ceci est possible. On cherche
donc à savoir dans quels cas il est possible de résoudre pour x l’équation
a · x ≡(mod n) 1, (1.36)
ainsi que comment procéder. On va voir que la clé réside dans l’algorithme d’Euclide. En effet
l’équation (1.36) correspond à dire qu’il existe x tel que
a · x = q · n + 1.
On observe d’abord que ceci équivaut au fait que le plus grand commun diviseur de a et n est égal
à 1. On dit alors que a et n sont relativement premiers. On aurait pu observer déjà que l’algorithme
1.10. LE THÉORÈME D’EULER-FERMAT(∗) 21
d’Euclide permet d’obtenir plus que la simple valeur du plus grand commun diviseur d de a et b.
En fait, il permet d’écrire d sous la forme :
d = a · x + b · y,
en procédant comme suit
Algorithme 1.5 (d’Euclide étendu). Si on a obtenu
(
h r, a i, si b = q · a + r, avec a 6= 0,
h a, b i = (1.37)
b, si a = 0.
avec h r, a i = a · x0 + r · y 0 , alors d = h a, b i s’exprime comme
d = a · x + b · y, avec x = x0 − q · y 0 , et y = y0.
On a donc une procédure récursive pour obtenir x et y, en même temps qu’on calcule le plus grand
commun diviseur d = h a, b i. En particulier, on peut inverser a modulo n si et seulement si a et n
sont relativement premiers, et alors l’algorithme ci-haut calcule cet inverse.
ϕ(p · q) = (p − 1) · (q − 1),
p, 2 p, 3 p, . . . , (q − 1) · p
q, 2 q, 3, q, . . . , (p − 1) · q Leonhard Euler
(1707–1783)
La démonstration la plus directe du théorème suivant passe par la théorie
des groupes. Elle n’est pas particulièrement difficile, mais dépasse un peu le cadre de ce cours. Nous
l’omettrons donc.
ak ≡(mod n) a`
exactement lorsque
k ≡(mod ϕ(n)) `.
Le cas particulier que nous utiliserons correspond à n = p · q (produit de deux nombres premiers
distincts), avec k = e · f , et ` = 1. On suppose donc que e est relativement premier à ϕ(n), et le
théorème affirme que
ae·f ≡(mod n) a (1.39)
exactement quand
e · f ≡(mod ϕ(n)) 1, (1.40)
f étant l’inverse multiplicatif de e modulo ϕ(n).
Nous sommes maintenant prêts à décrire le système de cryptographie à clé publique introduit par
Rivest, Shamir et Adelman (d’où RSA). Tout tourne autour du fait qu’il est très difficile (même
pour un ordinateur) de factoriser de grands nombres, mais qu’il est facile (avec l’ordinateur) de
calculer de grandes puissances de grands nombres modulo n. De plus, l’algorithme d’Euclide joue
un rôle clé dans la mise en place de clés secrètes, une pour chaque participant. En effet, dans ce
système, chaque participant se construit une clé de la façon suivante :
1.11. LA CRYPTOGRAPHIE À CLÉ PUBLIQUE(∗) 23
1) Il commence par choisir 5 en secret 2 très grands nombres premiers p et q (avec au moins
100 chiffres chacun), et il calcule n = p · q.
2) Connaissant les nombres p et q, il est à même de calculer la fonction ϕ(n) = (p − 1)(q − 1).
Il choisit 6 alors un entier e, au hasard entre 1 et ϕ(n), qui est relativement premier à ϕ(n).
3) Il peut alors calculer l’inverse multiplicatif f = e−1 , de e modulo ϕ(n), avec l’algorithme
d’Euclide.
4) Enfin, il rend publique sa clé d’encodage, (n, e), et garde secrète la clé de décodage f .
En supposant que chaque participant ait réussi à réaliser ces étapes, on publie un annuaire donnant
la clé (n, e) de chaque participant. En toute probabilité, ces clés sont forcément distinctes. Comme
tous connaissent la clé d’encodage, on dit qu’on a un système cryptographique à clé publique.
bonjour 7→ 11242319243027.
On découpe le message en morceaux pour que le nombre associé soit plus petit n. L’encodage d’un
morceau numérisé a se fait en calculant
b := (a mod n)e .
Pour décoder ce message, on cherche à récupérer a à partir de b. Comme nous allons mieux le voir
plus loin, cela est une entreprise très difficile, sauf si l’on connaı̂t f . Dans ce cas, il suffit en effet
de calculer
(b mod n)f = (a mod n)e f
= a,
5. Nous allons discuter plus loin comment réaliser cet exploit.
6. Pour trouver un nombre e relativement premier à ϕ(n), il suffit de prendre un a au hasard entre 1 et ϕ(n), de
calculer avec l’algorithme d’Euclide le plus grand commun diviseur d = (a, ϕ(n)), et de poser e := a/d.
24 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
étant donné l’équation (1.39). On dé-numérise ensuite a pour récupérer le message envoyé.
La sécurité du système de cryptographie obtenu dépend du raisonnement suivant.
(1) Pour décoder le message, on doit connaı̂tre f .
(2) Pour calculer f , on doit connaı̂tre ϕ(n).
(3) Pour calculer ϕ(n), on doit connaı̂tre la factorisation de n = p · q.
(4) Factoriser n n’est pas possible dans un temps raisonnable.
L’affirmation la plus problématique est surtout cette dernière, parce qu’on n’en a pas de preuve
mathématique. On choisit p et q assez grands pour dépasser de loin la taille des entiers qu’il soit
possible de factoriser aujourd’hui, avec les meilleurs ordinateurs et les meilleurs algorithmes.
Un exemple réaliste
Avec un petit ordinateur, et un système de calcul formel comme Maple, on se construit facilement
(et rapidement) une clé pour le système RSA. Avec un générateur aléatoire de grands nombres
premiers (voir Exercice 1.12), on construit deux nombres premiers :
p := 632382913902128079995508264334209792839330997
050865499213108496836190519861047497803309801
q := 558218333272171098430334114939430707924967254
197312990249604572758081938867755300016964127
On calcule alors
n := p · q = 3530077361882448142729008764302657633090807756
6841536554471443803162568247004783252409970439
2825688399971668487048756462309933330394616119
178578931081472702153607465462868484508727,
ainsi que
ϕ(n) = (p − 1) · (q − 1) = 3530077361882448142729008764302657633090807756
6841536554471443803162568247004783252409970320
2224441225672490061206377188669432566096364871
000089468368403107881148736660070664234800.
Nous sommes maintenant en mesure de choisir (au hasard) e, relativement premier à ϕ(n), et on
trouve que
e := 150650905007553408748182082815984929359632269
852681585809504709739738485231104248045693804
710098188302655538010818866476054310788175542
136407374106205605523687223946800025812242019
1.12. FRACTIONS CONTINUES 25
f = 272908483757626934878229217801120810210167464
543251893953694855412667939050146498517159221
610327980988946837607498956384200926964384927
721690363851123702958382331369780470855228779
Tout est en place maintenant. Notre correspondant veut nous envoyer le message bonjour , qu’il
code comme suit, en utilisant les valeurs (n, e) connues de tous. Avec a = 11242319243027, on
calcule
1
q0 + (1.41)
1
q1 +
1
q2 +
1
q3 +
1
q4 +
1
q5 +
..
.
infinie, ou qui se termine, avec les qi des entiers, qui sont positifs et non-nuls pour i > 0. Pour
simplifier la présentation, on écrit encore
[q0 , q1 , q2 , q3 , q4 , q5 , . . . ] (1.42)
7. Il faut faire attention à quelques détails concernant le mode d’utilisation du système. En particulier, il faut
envoyer des messages assez longs. Par exemple, des messages réduits à une lettre seraient faciles à identifier. Il
suffirait de coder les 26 lettres de l’alphabet, puis de comparer avec le message.
26 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
pour la fraction continue en (1.41). Tout nombre réel x ∈ R, admet un développement en fraction
continue qu’on calcule récursivement comme il est décrit ci-dessous. Adoptons d’abord la notation
bxc pour désigner le plus grand entier qui est plus petit ou égal à x. Ainsi, on a
√
b 2c = 1, b−πc = −4, be2 c = 7,
et, bien entendu, bnc = n pour tout n ∈ Z. Les qi s’obtiennent de la façon suivante
Algorithme 1.7. On commence par poser x0 = x et q0 := bx0 c, pour calculer ensuite récursivement
1
d’abord xn := , puis qn := bxn c,
xn−1 − qn−1
lorsque xn−1 − qn−1 6= 0. Sinon le calcul s’arrête, et la fraction continue est finie. Cela se produit
exactement quand x est un nombre rationnel.
1
π =3+ (1.43)
1
7+
1
15 +
1
1+
1
292 +
..
.
En effet, on amorce le calcul avec x0 = π et q0 = 3, puis on obtient successivement
x0 = 3.141592653 . . . , q0 = 3,
x1 = (3.141592653 . . . − 3)−1
= 7.062513305 . . . , q1 = 7,
x2 = (7.062513305 . . . − 7)−1
= 15.996594406 . . . , q2 = 15,
x3 = (15.996594406 . . . − 15)−1
= 1.003417231 . . . , q3 = 1,
x4 = (1.003417231 . . . − 15)−1
= 292.634591014 . . . , q4 = 292,
etc.
En tronquant le développement en fraction continue d’un réel x, on trouve une suite de très bonnes
approximations rationnelles de x. Ainsi, pour le développement décimal de π en (1.43), on trouve
1.12. FRACTIONS CONTINUES 27
les approximations
π ≈ 3,
22
π ≈ 7 = 3.1428571428571428571,
333
π ≈ 106 = 3.1415094339622641509,
355
π ≈ 113 = 3.1415929203539823009,
33102
π ≈ 10399 = 3.1415926530119026041, etc.
a 1
x− < √ . (1.44)
b 2
b 5
√
La présence de 5 est due au fait que le nombre d’or (voir section 1.13) correspond au pire cas.
Autrement dit, avec ses cousins 8 , c’est le nombre réel le plus difficile à approximer par des
nombres rationnels (voir : en.wikipedia.org/wiki/Lagrange number).
Dans le cas où x = a/b est rationnel (dans Q), on a un lien direct entre le développement en fraction
continue de x, et le calcul du plus grand commun diviseur h a, b i (voir Exercice 1.9). Ainsi, on a les
étapes suivantes pour le calcul du plus grand commun diviseur de a = 8492 et b = 1547 :
8. Les nombres dont le développement en fraction continue se terminent par une infinité de 1.
28 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
8492 1
=5+
1547 1
2+
1
22 +
1
1+
1
15 +
2
On observe donc que les qi correspondants à la suite des quotients dans l’algorithme d’Euclide.
Autrement dit, si on a
a
= [q0 , q1 , q2 , q3 , . . . , qk ] (1.45)
b
alors les étapes explicites du calcul de l’algorithme d’Euclide pour a et b sont
avec a0 = a, b0 = b, et
ai+1 = bi , et bi+1 = ri , (1.47)
Pour deux nombres de Fibonacci consécutifs F (n) et F (n + 1), le quotient F (n + 1)/F (n) admets
un développement en fraction continue particulièrement simple. Par exemple,
F (6) 13 1
= =1+
F (5) 8 1
1+
1
1+
1
1+
1
1+
1
Plus généralement, on a
F (n + 1)
= [1, 1, . . . , 1] (1.48)
F (n) | {z }
n+1 copies
1.13. NOMBRES DE FIBONACCI ET NOMBRE D’OR 29
1
φ=1+
1
1+
1
1+
1
1+
1
1+
1
1+
..
.
qui est manifestement solution de l’équation
1
ϕ=1+ .
ϕ
√
Il s’ensuit que ϕ = (1 + 5)/2, et le nombre d’or admet la suite d’approximations
√
1+ 5 F (n + 1)
≈ , (1.49)
2 F (n)
Notes historiques
Parce qu’il est solution d’une équation très simple, mais aussi parce qu’il possède des propriétés
numériques très particulières, le nombre d’or apparaı̂t dans toutes sortes contextes intéressants. Il
est fréquent qu’il soit mentionné dans des articles de vulgarisation mathématique, d’autant plus
que sa description ne nécessite pas de notions très avancées. Pour plus de détails, voir :
https://fr.wikipedia.org/wiki/Nombre d’or
30 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
Considérée de point de vue du calcul du plus grand commun diviseur, la simplicité du développement
en fraction continue du quotient F (n+1)/F (n) est équivalente au fait que la définition des nombres
de Fibonacci donne
F (n + 1) = 1 · F (n) + F (n − 1). (1.52)
Il en découle que (F (n + 1), F (n)) = (F (n), F (n − 1)), d’où on
déduit que le plus grand commun diviseur de deux nombres de
Fibonacci consécutif est toujours égal à 1. Cependant, l’intérêt n’est
pas vraiment là. Il réside plutôt que ce calcul est le pire de
tous ceux du plus grand commun diviseur de deux nombres d’une
certaine taille, c’est-à-dire celui qui demande le plus grand nombre
d’étapes. Gabriel Lamé (en 1844) a exploité ce fait pour borner le
nombre d’étapes de calcul dans l’algorithme d’Euclide. C’est l’une
des premières analyses de complexité d’algorithme au sens moderne.
On la proposition suivante.
Proposition 1.9. Le nombre d’étapes de calcul pour l’algorithme
d’Euclide appliqué à des nombres a et b, avec a ≤ b, est plus petit Gabriel Lamé
que logϕ (b). (1795–1870)
Ainsi, on sait que même pour des nombres de 200 chiffres (comme dans les calculs impliqués dans
le système RSA), le nombre total d’étapes de calcul sera plus petit que
logϕ (10201 ),
donc plus petit que 961. Pratiquement, pour un ordinateur qui fait des milliards (sinon plus)
d’opérations à la seconde, c’est presque instantané.
Isaac Newton
(1643-1727)
1.15. CALCUL APPROCHÉ DE ZÉROS (RÉELS) DE FONCTIONS 31
avec Z(f ) = ∅, si b2 − 4 a c < 0. Dans ces cas, on calcule donc facilement Z(f ). Pour des fonctions
plus compliquées, le calcul exact de Z(f ) devient difficile, sinon même impossible. Souvent, il est
difficile de trouver même un seul des zéros de f (parmi toutes les possibilités dans Z(f )), même en
sachant qu’il se trouve dans un certain intervalle.
Une façon de contourner le problème est d’approximer (de mieux en mieux) un zéro de f . Cela
consiste à construire une suite
t0 , t1 , t2 , . . . → t
de valeurs qui s’approchent de plus en plus d’un vrai zéro t de f . Le formalisme correct pour tout
ceci est développé dans un cours d’analyse, mais la méthode algorithmique due à Newton est facile
à présenter si on néglige de discuter de certains aspects techniques. Pour se placer dans un bon
contexte, supposons donc qu’on a une fonction dérivable f allant d’un intervalle [a, b] vers R, pour
laquelle on sait que f (a) < 0, et f (b) > 0. Autrement dit, le graphe de f est tel que présenté à la
Figure 1.3.
On suppose que f 0 (x) existe 9 dans tout l’intervalle [a, b], et que f 0 (x) ne s’annule jamais sur [a, b].
On a alors
Algorithme 1.10 (Newton-Raphson 10 ). À partir d’une approximation donnée tn d’un zéro de f ,
on calcule une meilleure approximation tn+1 , en posant :
f (tn )
tn+1 = tn − . (1.57)
f 0 (tn )
La Figure 1.3 montre comment on peut obtenir cette expression. On calcule l’intersection avec
l’axe des x de la droite, passant par le point (tn , f (tn )), qui est tangente à la courbe, et donc de
pente f 0 (tn ). Il en résulte que l’équation de la droite en question est
y = f 0 (tn ) (x − tn ) + f (tn ),
d’où on obtient (1.57). Pour illustrer la méthode, considérons le problème de calculer la racine
9. Dans certains cas, des aspects techniques font que la méthode ne fonctionne pas. Une discussion détaillée et
rigoureuse, du point de vue de l’analyse, ne peut donc être évitée.
10. Joseph Raphson (1648–1715).
32 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
(tn , f (tn ))
f 0 (tn )=pente de &
tn−1 tn+1 tn
- pente = f 0 (tn−1 )
(tn−1 , f (tn−1 ))
f (x) = x2 − a.
t0 , t1 , t2 , . . . , tn , . . .,
t20 − 1423
t1 = t0 − = 37.729729729729729730
2 t0
t2 − 1423
t2 = t1 − 1 = 37.722672887787500968
2 t1
t2 − 1423
t3 = t2 − 2 = 37.722672227720035100
2 t2
√
La véritable valeur de 1423 est
√
1423 = 37.722672227720029325 . . .
f (x) = exp(x − 1) − x − 1,
dont le graphe est donné à la Figure 1.4, on cherchera à approximer le zéro qui se trouve près de
2. Il n’y a pas de formule simple pour ce zéro, mais on obtient très rapidement une valeur comme
2.146193220620582585237061028521368252888662
L’ensemble de Mandelbrot est l’ensemble des nombres complexes c (dans C), pour lesquels l’ensemble
des itérés
{fcn (0) | n ∈ N}
est borné, avec fc (z) = z 2 + c. C’est donc dire qu’il existe N (dépendant de c) pour lequel on a
Les couleurs pour les points à l’extérieur de M codent la vitesse avec laquelle la suite
{fcn (0)}n∈N diverge. Pour en savoir plus sur ce dernier point, il faut suivre un cours d’analyse.
L’aspect très récursif de l’ensemble de Mandelbrot, apparais lorsqu’on en agrandit une portion.
L’ensemble de Mandelbrot a été introduit par Benoit Mandelbrot (1924-2010). Son étude est liée à
une analyse de la notion mathématique de chaos. C’est un cas particulier de la notion de fractale .
On a beaucoup d’autres fractales très jolies, par exemple, l’éponge de Menger (Karl Menger, (1902–
1985)). Pour votre culture générale, il est intéressant d’aller voir de quoi il retourne sur le site :
http://en.wikipedia.org/wiki/Mandelbrot_set
1.17. EXERCICES 35
1.17 Exercices
montrer que
ha, bi = ha, b − k ai,
quelque soit l’entier k.
1.2. Montrer les identités en (1.15), par un argument récursif (sur n) qui n’utilise que l’associativité
de + et · pour (i), (iii) et (iv), avec en plus la commutativité de + pour (ii).
1.3. Montrer que
a) la somme des n premiers entiers impairs donne n2 . En formule
n
X
(2 k − 1) = n2 . (1.58)
k=1
a) la somme des carrés des n premiers entiers est donnée par la formule
n
X n (n + 1) (2 n + 1)
k2 = . (1.59)
6
k=1
1.4. Montrer par récurrence que le plus grand commun diviseur de F (n) et F (n − 1) est 1.
1.5. Calculer le nombre de mouvements (déplacement d’un disque) nécessaire pour résoudre le
problème des tours de Hanoı̈.
1.6 (Coefficients binomiaux).
a) Montrer que l’expression suivante satisfait aussi la récurrence (1.28)
n!
. (1.60)
k!(n − k)!
1.7 (Entiers modulo p). Soit p un nombre premier. Montrer que tous les éléments non nuls de
Zp sont inversibles pour la multiplication. Calculer les inverses de tous les éléments non nuls de
Z13 .
36 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
1.8. Montrer par récurrence que les coefficients, du développement en fraction continue du quotient
F (n)/F (n − 1) de deux nombres de Fibonacci consécutifs, sont tous des 1. Que peut-on dire de
F (n)/F (n − 2) ?
1.9. Démontrer qu’on a bien le lien entre développements en fraction continue et le calcul de
l’algorithme d’Euclide spécifié en (1.45) et (1.46), avec les conditions (1.47).
a1 · b1 − a2 · b2 = (a1 − a2 ) · b1 + a2 · (b1 − b2 ),
pour la seconde.
Programmation mathématique
Exploration mathématique
1.13 (Sommes de puissances). Avec un système de calcul formel, étudier la somme des k-ième
puissances des n premiers entiers :
1k + 2k + . . . + nk , (1.63)
11. décris comment la distribution des nombres premiers est assez régulière.
1.17. EXERCICES 37
Cn 1 1 2 5 14 42 132 429
Y 1
ϕ(n) = n 1− , (1.65)
p
p|n
où le produit a lieu sur l’ensemble des nombres premiers qui divisent n. Montrer aussi que
X
ϕ(d) = n,
d|n
où la somme a lieu sur l’ensemble des nombres (entre 1 et n) qui divisent n.
Suggestion : Considérer d’abord les cas où n est de la forme pa q b , puis pa q b rc , avec des nombres
premiers distincts p, q et r. Passer ensuite au cas général.
Cette fonction a des valeurs qui croissent très très rapidement (attention avec votre pauvre ordina-
38 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
3 5 13 29 61 125 2n+3 − 3
22 .2
..
2
2 2 2 222 2 22 22
2
4 22 −3 22 −3 22 −3 22 −3 22 − 3 2| 2{z } −3
n+3
Une jolie notation, introduite par D. Knuth, permet d’écrire une formule pour les valeurs de la
fonction d’Ackermann. À ce sujet, voir
http://en.wikipedia.org/wiki/Knuth’s_up-arrow_notation
1.17. Montrer que, lorsqu’on a division euclidienne de b par a donne b = q · a + r, on a la division
euclidienne de polynômes
xb − 1 = (xb−a + xb−2 a + . . . + xr )(xa − 1) + (xr − 1) (1.67)
Suggestion : Considérer quelques exemples spécifiques de a et b, puis passer au cas général.
1.18. Examiner, pour diverses valeurs de k, la suite des plus grand commun diviseur des nombres
de Fibonacci F (n + k) et F (n), en fonction de la valeur de k et de celle de (n mod k). En déduire
une règle générale, et la démontrer.
1.19. On précise la notation (1.42) pour les fractions continues en posant récursivement
1
[q0 , q1 , q2 , . . . , qn ] := q0 + ,
[q1 , q2 , . . . , qn ]
avec [q0 ] := q0 . Les convergents d’une fraction continue, sont les uniques entiers hn et kn , relative-
ment premiers entre eux, tels que
hn
= [q0 , q1 , q2 , . . . , qn ].
kn
Montrer qu’on a les récurrences
h−2 = 0, h−1 = 1, hn = qn hn−1 + hn−2 ,
(1.68)
k−2 = 1, k−1 = 0, kn = qn kn−1 + kn−2 .
et que
hn kn−1 − hn−1 kn = (1−)n .
1.17. EXERCICES 39
xF (n+1) − 1
= [xF (n−1) , xF (n−2) , . . . , x2 , x, x, 1].
xF (n) − 1
40 CHAPITRE 1. RÉCURRENCE, NOMBRES ET FONCTIONS NUMÉRIQUES
Chapitre 2
Ensembles et fonctions
2.1 Introduction
Avant de poursuivre plus avant, nous allons maintenant mieux asseoir les fondements de notre
discours. La théorie des ensembles et des fonctions sont à la base d’une présentation moderne des
mathématiques. Immanquablement, on y fait appel pour la construction d’objets plus complexes,
ou pour donner une base solide aux arguments logiques. En plus d’être des notions fondamentales
pour les mathématiques, elles sont aussi cruciales en informatique, par exemple pour introduire la
notion de structures de données .
2.2 Ensembles
41
42 CHAPITRE 2. ENSEMBLES ET FONCTIONS
Typiquement, sans les définir très rigoureusement ici, on commence par considérer des ensembles
simples comme
N := {0, 1, 2, 3, . . . };
A := {a, b, c, d, . . . , z};
À partir de tels ensembles de base on construit des ensembles plus complexes au moyen
d’opérations entre ensembles qui seront introduites dans les sections suivantes. Une axiomatique
correcte de la théorie des ensembles explique comment procéder à des descriptions admissibles
d’ensembles de base, et comment construire ensuite des ensembles plus complexes. Ainsi, on peut
décrire l’ensemble
A = {x ∈ S | P (x)}, (2.1)
des éléments de S qui satisfont une certaine propriété P (x), formulée sous forme d’énoncé logique
(voir AppendiceA). Dans ce cas, la notion d’égalité A = B, avec B = {x ∈ S | Q(x)}, correspond
au fait que les propriétés P (x) et Q(x) sont logiquement équivalentes. On dénote ∅, l’ensemble vide,
qui ne contient aucun élément. Le nombre d’éléments (ou cardinal ) d’un ensemble fini A, est dénoté
|A|, ou parfois aussi #A.
2.3 Sous-ensembles
Si tous les éléments de B sont aussi des éléments de A, on dit que B est un sous-ensemble de A, et
on écrit
B ⊆ A.
On dit aussi que B est une partie de A. Se donner un sous-ensemble B, de k éléments d’un ensemble
A de cardinal n, correspond donc à
a) ∅ ⊆ A,
b) A ⊆ A,
(2.2)
c) si A ⊆ B et B ⊆ A, alors A = B,
d) si A ⊆ B et B ⊆ C, alors A ⊆ C.
P[S] := {A | A ⊆ S }. (2.3)
On dit aussi que P[S] est l’ensemble des parties de S. Par exemple,
P[{a, b, c}] = {∅, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}}.
P k [S] := {A | A ⊆ S, |A| = k }.
C’est donc
et ainsi de suite jusqu’à P n [S] = {S}, pour n égal au cardinal de S. Ainsi, si S = {a, b, c}, alors on
a
P 0 [S] = {∅}, P 1 [S] = {{a}, {b}, {c}}, P 2 [S] = {{a, b}, {a, c}, {b, c}}, P 3 [S] = {{a, b, c}}.
Ces ensembles contiennent donc respectivement 1, 3, 3, et 1 éléments, et leur union disjointe donne
l’ensemble à 8 éléments P[S] vus plus haut.
Attention, les ensembles
{a, b, c} et {{a}, {b}, {c}},
sont différents, puisqu’ils n’ont pas les mêmes éléments. Autrement dit, les accolades { et
} ont un ici rôle mathématique important. Ce ne sont pas que de simples séparateurs comme
en français. On dit des éléments {x, y} de P 2 [A] que ce sont des paires d’éléments de A. On a alors
forcément x 6= y.
Une première opération de base entre ensembles est celle d’intersection, A∩B, entre deux ensembles
A et B. C’est l’ensemble des éléments qui sont communs à ces deux ensembles. Plus précisément
on a
A ∩ B := {x | x ∈ A, et x ∈ B}. (2.4)
Par exemple, on a
{a, b, c, d} ∩ {1, b, 3, d} = {b, d}.
Par exemple
{a, b, c, d} ∪ {1, b, 3, d} = {a, b, c, d, 1, 3}.
On vérifie facilement que les égalités suivantes sont valables en général, quels que soient les en-
sembles A, B, et C :
(i) A ∩ ∅ = ∅, (i)0 A ∪ ∅ = A,
(ii) A ∩ B = B ∩ A, (ii)0 A ∪ B = B ∪ A,
(2.6)
(iii) A ∩ (B ∩ C) = (A ∩ B) ∩ C, (iii)0 A ∪ (B ∪ C) = (A ∪ B) ∪ C,
(iv) A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C), (iv)0 A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C).
2.4. OPÉRATIONS DE BASE SUR LES ENSEMBLES 45
Lorsque A ∩ B = ∅, on dit que A ∪ B est une union disjointe, et on écrit alors A + B pour désigner
cette union. Voir l’exercice 2.2 pour ce qui concerne les propriétés de l’union disjointe 2 .
La différence, A \ B, de deux ensembles A et B, est l’ensemble des éléments de A qui ne sont pas
dans B, c.-à-d. :
A \ B := {x ∈ A | x 6∈ B}. (2.7)
En supposant qu’on a un ensemble S fixé, on dénote A le complément de A dans S. C’est tout
simplement un autre nom pour
A := S \ A,
qu’il est pratique d’utiliser lorsque le surensemble S est clair dans le contexte. Ainsi, lorsqu’on
fixe S = {a, b, c, d, e, f } et A = {b, c, e}, on a A = {a, d, f }. Si A = {x ∈ S | P (x)}, alors on a
A = {x ∈ S | ¬P (x)}.
Quels que soit A et B des sous-ensembles de S (donc des éléments de P[S]), les identités suivantes
sont valables
(i) A = A,
(ii) A ∩ A = ∅, (ii)0 A ∪ A = S, (2.8)
(iii) A ∩ B = A ∪ B, (iii)0 A ∪ B = A ∩ B.
Pour une famille d’ensembles 3
{A1 , A2 , A3 , . . . , An },
on a les unions et intersections
n
\ n
[
Ai , et Ai .
i=1 i=1
En fait, P[S] est toujours l’union (disjointe, voir Exercice 2.2 pour la notation) des ensembles P k [S],
c.-à-d. :
X∞
P[S] = P k [S]. (2.9)
k=0
Comme P k [S] = ∅, si k est plus grand que le cardinal de S, cette sommation est en fait finie. On a
donc ici deux descriptions du même ensemble.
2. Lorsque A et B ne sont pas disjoints (A ∩ B 6= ∅), on peut tout de même considérer leur union disjointe en
forçant A et B à être disjoints. Plus précisément, on pose
On peut calculer récursivement l’ensemble des parties à k éléments d’un ensemble S = T + {x},
avec x 6∈ T , en posant
1) A = S et k = |S|,
A ∈ P k [S] ssi 2) A ∈ P k [T ], où (2.10)
3) A = B + {x}, et B ∈ P k−1 [T ].
Avant d’introduire la prochaine construction, rappelons que deux couples (a, b) et (c, d) sont égaux,
si et seulement si on a les deux égalités a = c et b = d. Le produit cartésien de A et B est l’ensemble
de tous les couples (x, y), avec x élément de A et y élément de B. Autrement formulé, on a
A × B = {(x, y) | x ∈ A et y ∈ B}.
Si l’un des ensembles A ou B est vide, alors le produit cartésien A × B est vide, c.-à-d. :
A × ∅ = ∅ × B = ∅. (2.11)
{a, b, c, d} × {1, 2, 3, 4, 5} = {(a, 1), (a, 2), (a, 3), (a, 4), (a, 5),
(b, 1), (b, 2), (b, 3), (b, 4), (b, 5),
(c, 1), (c, 2), (c, 3), (c, 4), (c, 5),
(d, 1), (d, 2), (d, 3), (d, 4), (d, 5)}.
Dans le cas des ensembles, finis [n] = {1, 2, . . . , n} et [k] = {1, 2, . . . , k}, on constate que les éléments
du produit cartésien [n] × [k] s’identifient aux cases d’un tableau (ou d’une matrice) ayant n lignes
et k colonnes :
···
1
···
2
···
···
···
···
···
···
···
···
···
···
n
···
1 2 3 4 5 k
Remarquons qu’on utilise ici des coordonnées matricielles, indexant les lignes du haut vers le bas,
plutôt que des coordonnées cartésiennes pour lesquelles on indexerait les lignes du bas vers le haut.
À strictement parler, le produit cartésien n’est pas associatif. Ainsi, les éléments de (A × B) × C
sont de la forme ((x, y), z), avec x ∈ A, y ∈ B et z ∈ C ; tandis que ceux de A × (B × C) sont
2.6. RELATION 47
de la forme (x, (y, z)). On considère cependant souvent une construction intermédiaire, dénotée
A × B × C, dont les éléments sont les triplets (x, y, z). Lorsque A, B et C sont des ensembles finis,
les éléments de A × B × C peuvent se représenter sous forme de tableau tridimensionnel (un peu
comme dans la Figure ci-contre).
Plus généralement, on a le produit cartésien multiple
A1 × A2 × · · · × An = {(x1 , x2 , . . . , xn ) | xi ∈ Ai , 1 ≤ i ≤ n}.
B n := B
| × B{z
× · × B},
n copies
de l’ensemble B, avec B 0 := {∗}. Les éléments de B n sont les n-tuplets (x1 , x2 , . . . , xn ), d’éléments
de xi ∈ B. Il arrive parfois qu’on veuille écrire plus simplement x1 x2 . . . xn , pour un tel élément.
On dit alors qu’on l’a écrit sous forme de mot.
2.6 Relation
Une relation R, entre les ensembles A et B, est simplement un sous-ensemble du produit cartésien
A × B, c.-à-d. : R ⊆ A × B. Par exemple, pour A = {a, b, c, d} et B = {1, 2, 3}, on a la relation
R = {(a, 1), (a, 2), (b, 3), (c, 2), (d, 1)}.
R := est un ancêtre de .
2.7 Fonctions
f C
:= {(x, f (x)) | x ∈ C}. (2.16)
Dans le cas où R est une relation de [n] vers [k], la fonction caractéristique R : [n] × [k] → {0, 1}
correspondante (
1 si, (i, j) ∈ R,
R(i, j) := (2.19)
0 si, (i, j) 6∈ R,
est une matrice n×k dont les coefficients sont des 1 ou des 0. On dit que R est la matrice d’incidence
de la relation R. Par exemple, avec n = 3 et k = 4, la relation
R = {(1, 1), (1, 3), (1, 4), (2, 2), (2, 3), (3, 1), (3, 4)}
Cette dernière construction est un cas spécial de fonction de la forme M := [n] × [k] → A, à valeur
dans un ensemble A quelconque. Une telle fonction s’identifie naturellement à une matrice n × k
dont les coefficients sont choisis dans l’ensemble A, simplement en prenant M (i, j) comme valeur
en position (i, j) dans la matrice. Ainsi, pour A = {a, b, c, d, e}, on a la matrice 2 × 3
a b c
c a e
2.7.1 Bijections
alors g = f −1 .
Pour montrer que f : A → B est une bijection, il faut donc montrer qu’on peut construire une
fonction qui satisfait (2.21).
On désigne par Bij[A, B] l’ensemble (fini) des relations bijectives entre A et B, c.-à-d. :
∼
Bij[A, B] := {f ∈ Fonct[A, B] | f : A −→ B}. (2.22)
2.7. FONCTIONS 51
Il découle directement du principe ci-haut qu’on a Bij[A, B] = ∅, lorsque |A| 6= |B|. Observons que
Bij[∅, ∅] = {∅} est de cardinal 1. La formule suivante permet de calculer récursivement l’ensemble
des bijections entre deux ensembles A et B de même cardinal fini :
1) f = ∅ et A = B = ∅,
f ∈ Bij[A, B] ssi 2) f = g + {(x, y)}, avec x ∈ A, y ∈ B, et (2.23)
g ∈ Bij[A \ {x}, B \ {y}].
Bij[A, B] = { {(a, 1), (b, 2), (c, 3)}, {(a, 1), (b, 3), (c, 2)},
{(a, 2), (b, 1), (c, 3)}, {(a, 2), (b, 3), (c, 1)},
{(a, 3), (b, 1), (c, 2)}, {(a, 3), (b, 2), (c, 1)} }.
2.7.2 Injections
c’est-à-dire qu’un élément ne peut-être choisi qu’une seule fois. Une formulation un peu plus tech-
nique (mais plus facile à manipuler) de cette définition prend la forme suivante. Une fonction
f : A → B est injective si et seulement si, pour tout x1 et tout x2 dans A
Il en découle (voir Exercice 2.6) que f est injective si et seulement si f admet un inverse à gauche,
c.-à-d. : il existe g : B → A tel que g ◦ f = IdA . En général, un tel inverse à gauche n’est pas unique,
et il n’est pas un inverse à droite.
On dénote souvent par le symbole ,→ le fait qu’une fonction soit injective. On écrit donc
f : A ,→ B, pour dire que f est une injective. On désigne par Inj[A, B] l’ensemble des relations
fonctionnelles f telles que f : A ,→ B soit une fonction injective de A vers B, c.-à-d. :
On calcule récursivement l’ensemble des fonctions injectives de A vers B lorsque A et B sont des
ensembles finis. On a
(1) f = ∅ et A = ∅,
f ∈ Inj[A, B] ssi (2) f = g + {(x, y)}, avec x ∈ A, y ∈ B, et (2.27)
g ∈ Inj[A \ {x}, B \ {y}].
Observons que la seule différence entre cette description et celle en (2.23) est dans la partie (1).
La ressemblance n’est pas fortuite. Elle s’ensuit du fait qu’une injection entre deux ensembles de
même cardinal est forcément une bijection (voir Proposition 2.2). Pour A = {a, b} et B = {1, 2, 3},
on a
Inj[A, B] = { {(a, 1), (b, 2)}, {(a, 2), (b, 1)},
{(a, 1), (b, 3)}, {(a, 3), (b, 1)},
{(a, 2), (b, 3)}, {(a, 3), (b, 2)} }.
Pour qu’il existe une injection f : A ,→ B, le nombre d’éléments de A doit nécessairement être plus
petit ou égal à celui de B, c.-à-d. : |A| ≤ |B|. On a donc Inj[A, B] = ∅, lorsque |A| > |B|.
Le composé de deux fonctions injectives est toujours une fonction injective. De plus, si on a deux
fonctions telles que le composé g ◦ f soit une fonction injective, alors f est forcément injective (mais
pas nécessairement g).
2.7. FONCTIONS 53
2.7.3 Surjections
1
Une fonction f : A → B est dite surjective si et seule- 5 a
2
ment si
3
4
b
Pour chaque élément y de B, il existe
6
8 c
au moins un élément x de A tel que f (x) = y.
7
9 d
Autrement dit, f est un processus qui
choisit
Pour qu’il existe une surjection f : A B, le nombre d’éléments de A doit nécessairement être
plus grand ou égal à celui de B, c.-à-d. : |A| ≥ |B|. On a donc Surj[A, B] = ∅, lorsque |A| < |B|.
On peut calculer récursivement l’ensemble des fonctions surjectives entre deux ensembles fins A et
B par la récurrence
(1) f = ∅ et A = B = ∅,
(2) f = g + h, avec C ⊆ A, y ∈ B,
f ∈ Surj[A, B] ssi (2.29)
g ∈ Surj[A \ C, B \ {y}], et
h ∈ Fonct[C, {y}].
Le composé de deux fonctions surjectives est toujours une fonction surjective. De plus, si on a deux
fonctions telles que le composé g ◦ f soit une fonction surjective, alors g est forcément surjective
(mais pas nécessairement f ).
On montre facilement que
Proposition 2.2. Une fonction qui est à la fois surjective et injective est une fonction bijective.
Autrement dit,
Bij[A, B] = Inj[A, B] ∩ Surj[A, B]. (2.30)
54 CHAPITRE 2. ENSEMBLES ET FONCTIONS
Lorsqu’on cherche à compter les éléments d’un ensemble A, le problème se décompose souvent en
un (ou des) problème(s) plus simple(s), selon que l’ensemble à énumérer peut se décrire en terme
des constructions de base sur les ensembles.
On démarre les choses en montrant (par récurrence) que
(i) |A + B| = n + k, (ii) |A × B| = n k,
n
(iii) |P[A]| = 2n , (iv) |P k [A]| = , (2.31)
k
(v) |B n | = k n .
Le problème de compter les éléments d’un ensemble fini est parfois difficile, et même dans certains
cas pas encore résolu. Il donne lieu à un domaine des mathématiques qu’on appelle la combinatoire
énumérative. C’est l’un des domaines de recherche dans lequel des professeurs du département de
mathématiques de l’UQAM sont spécialisés. Pour en savoir plus à ce sujet, on peut consulter la
page web du centre de recherche institutionnel Lacim :
http://www.lacim.uqam.ca/
Pour des ensembles infinis, on a aussi des résultats d’énumération. Il y a en fait toute une hiérarchie
des infinis, le plus petit étant l’infini correspondant au nombre de l’ensemble N. On le dénote
ℵ0 . Cantor a étudié cette question, en exploitant le point de vue que deux ensembles ont le même
cardinal si et seulement s’il existe une bijection entre les deux. Autrement dit,
∼
|A| = |B|, ssi ∃f : A −→ B. (2.32)
On étend les inégalités entre cardinaux d’ensembles infinis, en considérant que |A| ≤ |B| s’il existe
une injection de A dans B. Bien entendu, |A| |B| s’il y a une injection de A dans B, mais pas de
bijection. Avec ces conventions, on montre qu’on a toujours
2.8. COMPTER LES ÉLÉMENTS D’UN ENSEMBLE 55
|A| |P[A]|.
a ↔ 0, b ↔ 2, c ↔ 2, etc.
α := a0 a1 a2 · · · ak , avec k∈N et 0 ≤ ai ≤ n − 1.
On transforme alors bijectivement cette suite en un (grand) nombre en- Kurt Gödel
tier, en posant (avec Albert Einstein)
Γ(α) := a0 + a1 n + a2 n2 + . . . + ak nk . (1906–1978)
Ainsi, à chaque nombre entier il correspond un texte, et inversement à chaque texte il correspond un
nombre. Bien entendu, la plupart des textes 5 associés à des entiers sont sans aucune signification,
mais tous ceux qui décrivent des algorithmes en font partie. De plus, un même algorithme peut-être
décrit de plusieurs façons différentes. On en conclut qu’il y a au plus ℵ0 algorithmes possibles.
La bibliothèque de Borges(∗)
ce qui est quelque peu plus grand que le nombre d’atomes dont il est question. Il est donc un peu
difficile de trouver assez de place (et de matériel) pour ériger la bibliothèque de Borges dans notre
univers.
Informellement, on dit d’un sous-ensemble A, des entiers positifs N, qu’il est décidable s’il existe un
algorithme effectif (qui s’arrête après un temps fini) qui permet de vérifier l’appartenance ou non
à cet ensemble.
Plus précisément, on demande que la fonction caractéristique de A soit calculable avec une Machine
de Turing 6 (un ordinateur, sans limites précises de mémoire). Cela comprend les fonctions qu’on
peut construire, à partir des fonctions de base sur les entiers, avec la composition et la récursivité.
Pour certains ensembles, il est facile de déterminer qu’il sont décidables. C’est le cas, par exemple,
pour l’ensemble des nombres pairs, ou l’ensemble des nombres premiers.
On peut prouver que l’appartenance à certains ensembles est en fait indécidable. C’est-à-dire qu’il
ne peut pas y avoir d’algorithme permettant de tester cette appartenance. Il est fascinant de voir
ainsi qu’on n’aura jamais la possibilité de résoudre ce genre de questions avec un ordinateur tel
qu’on les conçoit. Cependant, très souvent on ne sait pas (encore) si une question est décidable ou
non. Avec le problème de Collatz, on en a un exemple.
Lorsqu’on a un algorithme pour calculer une fonction f : N → X, celui-ci n’est pas nécessairement
très efficace. Parfois même, il est pratiquement inutile. Il importe donc, autant que possible, d’avoir
une idée du temps de calcul nécessaire pour calculer f (n), en fonction de la valeur de n.
L’expression exacte de ce temps de calcul est généralement trop complexe pour être directement
calculable. On utilise donc une forme d’approximation qui donne un ordre de grandeur pour ce temps
de calcul. C’est la notation O(g(n)), qui mesure la complexité d’un algorithme. Intuitivement, les
algorithmes en
(1) O(1), dits constants, sont instantanés ,
(2) O(log(n)), dits logarithmiques, sont très rapides ,
(3) O(n), dits linéaires, sont rapides ,
(4) O(n2 ), dits quadratiques, sont assez rapides ,
(5) O(nk ), dits polynomiaux sont acceptables ,
(6) O(en ), dits exponentiels sont très lents .
(7) O(n!), dits factoriels sont très très lents .
Au-delà de O(n!) (et souvent même avant), les algorithmes deviennent essentiellement inutilisables
(même sur un superordinateur). D’un point de vue technique, on associe à chaque fonction h(x)
(définie pour x ∈ R si x est assez grand, et à valeurs positives), on dénote par O(h(x)) un certain
ensemble de fonctions. Plus précisément, on a g(x) ∈ O(h(x)), s’il existe N > 0 et une certaine
constante positive M , tels que
Autrement dit, à un multiple M près, la fonction h(x) croit plus vite que la fonction g(x) pour des
valeurs assez grandes de x. On montre facilement qu’on a les propriétés
Analyser la complexité d’un algorithme qui calcule la fonction f (n) consiste donc à estimer le
nombre maximum (ou moyen) d’étapes simples de calcul qui sont nécessaires lors du calcul. Cette
estimation s’exprime sous la forme O(g(n)), donc en terme d’une fonction de n.
L’analyse de complexité moyenne d’un algorithme peut se faire de façon beaucoup plus fine, au
moyen d’outils mathématiques élaborés : fonctions génératrices, combinatoire énumérative, analyse
complexe, analyse de singularité, etc.
Dans un autre registre, on étudie aussi la complexité théorique de certains calculs. Dans ce cas
il s’agit moins d’estimer la complexité moyenne de calculs explicites, que de démontrer qu’il est
possible ou impossible de résoudre efficacement des problèmes d’un certain genre. Ici l’effica-
cité est à prendre avec un grain de sel. Elle signifie l’existence d’algorithmes qui calcule en temps
58 CHAPITRE 2. ENSEMBLES ET FONCTIONS
polynomial, mais on ne sait parfois même pas comment construire ces algorithmes. Pire encore, il
y a des exemples explicites pour lesquels on peut démontrer qu’il existe des algorithmes poly-
nomiaux ; mais on peut aussi démontrer qu’on ne saura jamais les trouver. D’autre part, même des
algorithmes polynomiaux peuvent être pratiquement inutilisables, si l’exposant de n est très grand.
C’est dans ce contexte que se pose le problème toujours ouvert P versus NP . Informellement,
la question est de savoir si le fait qu’on puisse vérifier en temps polynomial qu’on a bien une solu-
tion aux problèmes d’une certaine famille, implique ou non qu’on puisse effectivement trouver des
solutions aux problèmes en question en temps polynomial. C’est subtil, et il est nécessaire de faire
attention à l’énoncé exact.
Un autre point de vue plus concret sur la question des calculs difficiles est soulevé par la possibilité
de construire des ordinateurs quantiques . Avec de tels outils, on peut contourner certaines diffi-
cultés de calcul. Par exemple, des travaux théoriques montrent comment construire des algorithmes
efficaces de factorisation de grands entiers, si on arrive un jour à avoir accès à de tels ordinateurs.
Le paradoxe de Russell
La théorie des ensembles telle que formulée par Cantor n’était pas
assez précise. Bertrand Russell l’a mis en évidence en soulignant
qu’elle donnait lieu au paradoxe suivant. On considère l’ensemble
de tous les ensembles qui ne se contiennent pas eux-même . En
formule, c’est
A = {x | x 6∈ x}. (2.38)
La question qui se pose est de savoir si
A∈A où A 6∈ A.
Hors on constate (avec Russel) que
A∈A implique A 6∈ A, Bertrand Russell
(1872-1970)
et réciproquement ! C’est là le paradoxe. Attention, on considère ici la notion d’ensemble à la
Cantor. Cette construction n’est pas possible dans les versions modernes de la théorie des ensembles.
En effet, pour remédier au paradoxe de Russel, on a échafaudé plusieurs axiomatiques précises
pour la théorie des ensembles. L’une des plus connues est celle dite de Zermelo-Fraenkel présentée
schématiquement à l’appendice B. C’est dans de tels contextes que les mathématiciens travaillent
maintenant.
2.10 Exercices
a) A = A ∪ B si et seulement si B = A ∩ B.
b) A ∪ (A ∩ B) = A, et A ∩ (A ∪ B) = A,
2.2. Pour des ensembles disjoints A et B, c’est-à-dire que A ∩ B = ∅, on dit de A ∪ B que c’est
une union disjointe. On écrit alors A + B pour cette union. Montrer que, pour tous ensembles A,
B et C deux à deux disjoints, on a
a) A + ∅ = A,
b) A + B = B + A,
c) (A + B) × C = (A × C) + (B × C),
d) A + (B + C) = (A + B) + C.
En utilisant cette dernière associativité, montrer qu’on peut étendre la notionP
d’union disjointe aux
familles d’ensembles deux à deux disjoints. On utilise alors le symbole de , et on écrit donc
n
X
Ai = A1 + A2 + . . . + An , (2.39)
i=1
tout comme d’habitude. Il s’agit ici de vérifier que la valeur de (2.39) ne dépend pas de la façon
d’organiser le calcul (placer des parenthèses).
2.3. Montrer que les ensembles à un élément (les singletons) sont des identités pour le produit
cartésien (à une bijection près). Montrer aussi qu’on a les identités suivantes (modulo des bijections
qui consistent à réordonner les composantes)
∼ ∼
(i) B n × B k −→ B n+k , et (iii) (B n )k −→ B n k . (2.40)
Montrer enfin qu’on peut identifier (via une bijection adéquate) les ensembles B n et Fonct[[n], B].
2.4. Montrer, par récurrence sur n, la formule du binôme de Newton :
n
n
X n k n−k
(x + y) = x y . (2.41)
k
k=0
Montrer que f = g.
60 CHAPITRE 2. ENSEMBLES ET FONCTIONS
2.7. Vérifier que le passage à la fonction caractéristique donne une bijection entre l’ensemble P[A]
et l’ensemble Fonct[A, {0, 1}].
2.8. Montrer par récurrence que n! est le nombre de bijections entre deux ensembles de cardinal n.
2.9. Quel que soit les ensembles A, B, et C, trouver des bijections explicites :
∼
i) Fonct[A + B, C] −→ Fonct[A, C] × Fonct[B, C],
∼
ii) Fonct[A, B × C] −→ Fonct[A, B] × Fonct[A, C], (2.42)
∼
iii) Fonct[A, Fonct[B, C]] −→ Fonct[A × B, C].
2.11. Montrer d’abord qu’il y a bijection entre l’ensemble (0, 1) et R, en utilisant la fonction
f := (0, 1) → R, définie comme
f (x) := tan(π x − π/2).
Pour tous ensembles A et B, on a que |A| ≥ |B| s’il existe une surjection de A vers B. Montrer
qu’on a une surjection 8 g := P[N] [0, 1], définie en posant
X 1
g(A) = A(k) ,
2k+1
k∈N
Programmation mathématique
2.13. Concevoir des procédures qui, étant donnés des ensembles finis A et B, engendrent les en-
sembles :
a) Fonct[A, B], b) Bij[A, B], c) Inj[A, B], d)(∗) Surj[A, B]
Attention, ces ensembles deviennent rapidement très grands.
2.14. Concevoir des procédures de calcul formel qui, étant donnés des ensembles finis A et B,
engendrent aléatoirement (avec distribution uniforme) un élément de :
Ces procédures devraient pouvoir fonctionner pour des ensembles beaucoup plus grands que ceux
de l’exercice précédent.
8. Utiliser le fait qu’on a un développement fractionnaire binaire pour tout nombre réel x ∈ [0, 1].
9. Chaque élément doit avoir la même probabilité d’être engendré, à savoir 1/N , où N est le nombre d’éléments
de l’ensemble concerné.
62 CHAPITRE 2. ENSEMBLES ET FONCTIONS
Chapitre 3
Graphes simples
3.1 Introduction
Avec la notion d’ensemble bien en main, on peut maintenant introduire des constructions plus
élaborées. L’une d’entre elles est la notion de graphes que nous allons maintenant étudier plus
en profondeur, en plus de développer des algorithmes qui résolvent des problèmes impliquant ces
graphes.
Dans le contexte suivant, nous allons dire des éléments d’un ensemble fini S (quelconque) que ce
sont des sommets. Ce n’est qu’un autre nom pour les éléments de S, mais cela rend la discussion
plus agréable. Un graphe (ou graphe simple) sur un ensemble de sommets S est constitué d’un
ensemble A d’arêtes. Une arête est simplement une paire {x, y} d’éléments de S. On dit alors que
les sommets x et y sont adjacents dans le graphe, ou que x et y sont les extrémités de l’arête {x, y}.
Un graphe sur S est donc un couple (S, A), avec A un sous-ensemble quelconque de l’ensemble
de toutes les arêtes possibles. On représente un graphe en le dessinant dans le plan cartésien
R2 . Pour ce faire, on associe à chaque sommet x un point de R2 (qu’on dénotera aussi x pour éviter
d’avoir des notations trop lourdes), et à chaque arête {x, y} une courbe 1 joignant le point x au
point y. Ici, ni la position des points (qu’on suppose au moins deux à deux distincts), ni celle des
courbes qui les joignent n’ont vraiment d’importance. On dit parfois que le sommet x est l’étiquette
1. Voir la section 3.14
63
64 CHAPITRE 3. GRAPHES SIMPLES
du point de R2 qui le représente. La Figure 3.1 donne deux représentations par dessin du même
graphe G = (S, A) sur l’ensemble de sommets S = {a, b, c, d, e}, avec comme arêtes les éléments de
l’ensemble
A = {{a, b}, {a, c}, {a, e}, {b, c}, {c, d}, {d, e}}.
Il n’est pas toujours évident de savoir comment bien dessiner un graphe, et il n’y a pas une seule
bonne façon. Certains logiciels spécialisés arrivent cependant à d’assez bons résultats. Il est
peut-être aussi important de souligner que certains graphes sont si complexes qu’il est fort probable
qu’un dessin ne soit d’aucune utilité pour arriver à en comprendre la nature, saufs peut-être pour
les esthètes. La manipulation de tels graphes par ordinateur est alors probablement la seule solution
pratique.
Il est classique de souligner qu’un des premiers
problèmes connus de la théorie des graphes (résolu par
Euler), consistait à trouver une façon de traverser les
7 ponts de la ville de Konigsberg, telle qu’elle était au
17-ième siècle selon la carte (un peu coloriée depuis)
ci-contre, sans passer deux fois par le même pont (Voir
Exercice 3.7). Nous y reviendrons.
On dénote par Gra[S] l’ensemble des graphes sur S, et
le nombre de graphes à n sommets est
n
|Gra[S]| = 2( 2 ) . (3.1)
Pour S = {a, b, c}, l’ensemble Gra[S] contient les 8 Figure 3.2 – Konigsberg en 1652.
graphes :
Gra[S] = {∅, {{a, b}}, {{a, c}}, {{b, c}}, {{a, b}, {a, c}},
{{a, b}, {b, c}}, {{a, c}, {b, c}}, {{a, b}, {a, c}, {b, c}}}.
b
b
a c d
a
c
e
e d
Figure 3.1 – Deux représentations du même graphe.
3.2. GRAPHE SIMPLE. 65
b b b b
a c a c a c a c
b b b b
a c a c a c a c
(3.2)
Deux graphes très particuliers ressortent, le graphe discret (S, ∅), qui ne contient aucune arête,
et le graphe complet KS := (S, P2 [S]), qui contient toutes les arêtes possibles. On choisit souvent
pour S l’ensemble [n] des nombres de 1 à n. Le graphe complet associé est dénoté Kn . Les graphes
complets pour n ≤ 8 sont illustrés à la Figure 3.3.
2
1
1
1
1
2
3
2
3
4
K1 K2 K3 K4
1 2 1 2
2
2 1 1 3
3 7 3
5 8 4
3 6 4 6 4
7 5
4 5 5 6
K5 K6 K7 K8
Figure 3.3 – Les graphes complets Kn , n ≤ 8.
Un graphe aussi intéressant, sur l’ensemble de sommets [n + k], est le graphe biparti complet Kn,k .
Ses arêtes sont toutes les paires i, j, avec 1 ≤ i ≤ n, et n + 1 ≤ j ≤ n + k. Autrement dit, les
seules arêtes sont obtenues en reliant chacun des n premiers sommets à chacun des k derniers. La
Figure 3.4 donne des exemples de tels graphes (sans étiquettes pour les sommets).
D’autres (jolis) graphes portent aussi des noms. On a par exemple le graphe de Petersen 2 de même
que le permutoèdre représenté à la Figure 3.5, en omettant d’étiqueter les sommets. On a aussi la
famille des cubes de dimension n, Bn = (Sn , An ), sur l’ensemble des 2n sommets
Sn := {(1 , 2 , . . . , n ) | i = 0, ou i = 1},
2. Nommé ainsi pour le mathématicien danois Julius Petersen (1839–1910). Le graphe de Petersen sert souvent
d’exemple pour illustrer des propriétés sur les graphes.
66 CHAPITRE 3. GRAPHES SIMPLES
exactement quand on a i = δi , pour tous les i sauf un. Ainsi, on obtient les graphes de la Figure 3.6,
pour n = 1, 2, 3, 4. Il y a encore les cycles, Cn = ([n], A), pour lequel les arêtes sont les couples
1 2 1 2 3 2
3 3 2
4
1 4 1 1
4 5
2 3 3 4 5 5 6 6 7
Les voisins d’un sommet x du graphe G = (S, A) sont les sommets y pour lesquels on a une arête
{x, y} ∈ A. Le voisinage V (x) = VG (x), d’un sommet x dans G, est l’ensemble des voisins de x :
Le degré deg(x) = degG (x), d’un sommet x de G, est le cardinal de V (x). C’est donc le nombre de
voisins de x, ou encore le nombre d’arêtes incidentes à x. Dans un graphe à n sommets, le degré
ne peut prendre que les valeurs entre 0 et n − 1. Si c’est 0, c’est qu’il n’y a aucune arête ayant x
comme extrémité, et on dit que x est un sommet isolé. À l’autre extrême, un point x peut-être
relié à tous les autres sommets du graphe. C’est le cas où le degré est maximal, alors égal à n − 1.
Dans le graphe de Petersen et dans le permutoèdre, tous les sommets ont même degré égal à 3. En
général, un graphe est dit régulier si tous ses sommets ont même degré.
Lemme 3.1 (des poignées de mains). Dans tout graphe simple, on a
X
deg(x) = 2 |A|, (3.4)
x∈S
Preuve. Dans la somme de gauche de (3.4), chaque arête est comptée 2 fois, puisqu’elle a deux
extrémités.
Pour voir ceci de façon amusante, on pense à chaque sommet comme représentant un individu, et
aux arêtes comme étant des poignées de main qu’il donne à ses voisins. Chaque poignée de main
fait intervenir deux individus, et le degré d’un sommet correspond au nombre de poignées de mains
données par l’individu correspondant. Le théorème et sa preuve peuvent alors se relire en terme de
poignées de mains.
On en déduit facilement le fait suivant.
Corollaire 3.2. Dans un graphe simple, il y a toujours un nombre pair de sommets de degré
impair.
68 CHAPITRE 3. GRAPHES SIMPLES
Preuve. On commence par séparer l’ensemble des sommets en deux parties disjointes S = P + I,
avec P celle des sommets de degré pair, et I celle des sommets de degré impair, d’où
X X X
deg(x) = deg(x) + deg(x).
x∈S x∈P x∈I
Comme le membre de gauche est manifestement pair, c’est aussi le cas du membre de droite. Cela
force le nombre d’éléments de I a être pair, d’où notre affirmation.
Une autre propriété amusante des degrés des sommets (dont la preuve est aussi très jolie), est la
suivante :
Proposition 3.3. Dans un graphe simple, il y a toujours au moins deux sommets qui ont le même
degré.
Preuve. On procède par contradiction. Supposons qu’il y ait un graphe G à n sommets, tel que
tous les sommets ont un degré différent. Comme il y a exactement n valeurs possibles pour le
degré (les nombres entre 0 et n − 1), on doit avoir un sommet de degré i pour chaque i entre 0 et
n − 1. Donnons donc le nom xi au sommet de degré i. En particulier, le sommet de x0 n’est relié à
aucun autre sommet, et le sommet xn−1 est relié à tous les autres sommets. Ceci est manifestement
impossible, puisqu’alors on aurait que xn−1 est relié à x0 , qui lui n’est relié à aucun sommet. Cette
contradiction nous force à rejeter l’hypothèse qu’il existe un graphe dans lequel tous les sommets
ont un degré différent, ce qui montre la proposition.
Sous-graphes
Boucles
On veut parfois permettre à des graphes simples d’avoir des boucles. Ce sont des arêtes dont les
deux extrémités coı̈ncident, et donc de la forme {x}, avec x un sommet de G. Autrement dit,
l’ensemble A des arêtes est un sous-ensemble de P 1 [S] ∪ P 2 [S], avec
La bonne façon d’adapter la notion de degré d’un sommet à ce nouveau contexte est de poser
|{α ∈ A | α = {x, y} et x 6= y}| + 2 si {x} ∈ A,
deg(x) := (3.6)
|{α ∈ A | α = {x, y} et x 6= y}| sinon.
Plusieurs problèmes classiques de la théorie des graphes font intervenir la notion de chemin dans
un graphe. Intuitivement, on se promène dans le graphe, d’un sommet à l’autre, en passant par des
arêtes. Cependant pour la clarté de l’exposé, et pour simplifier les arguments, il vaut la peine d’en
donner une définition plus rigoureuse. Un chemin
γ = (x0 , x1 , x2 , . . . , xn ),
dans un graphe G = (S, A) est une suite de sommets, xi dans S, pour laquelle chaque paire
{xi , xi+1 } est une arête de G, c.-à-d. : {xi , xi+1 } ∈ A.
On dit que s(γ) := x0 est la source (ou le début) du chemin, et que b(γ) := xn en est le but (ou la
fin). On dit aussi que le chemin γ va de x0 à xn . Chaque paire {xi , xi+1 } est un pas du chemin, et
la longueur `(γ) du chemin est égale à n, c’est-à-dire que la longueur est le nombre de pas dans le
chemin. Dans le graphe de la Figure 3.1, on a le chemin de longueur 6
(a, d, c, e, a, b, d),
de source a et de but d. La suite (a, d, e, b) n’est pas un chemin dans le même graphe, parce que
la paire {d, e} n’est pas une arête du graphe. Pour chaque sommet x d’un graphe, on a le chemin
Idx := (x), de longueur 0, qui va de x à x. C’est le chemin vide en x.
70 CHAPITRE 3. GRAPHES SIMPLES
γ1 · γ2 = (x0 , x1 , . . . , xn , y1 , . . . , yk ). (3.7)
Le chemin Idx joue le rôle d’élément neutre à gauche (resp. à droite) pour la multiplication avec γ,
si s(γ) = x (resp. b(γ) = x), c.-à-d. :
Puisque les arêtes sont sans orientation, on peut retourner un chemin allant de x à y pour obtenir
un chemin allant de y à x. Plus précisément, le retourné ← − d’un chemin γ = (x , . . . , x
γ 0 n−1 , xn )
est le chemin
←− := (x , x
γ n n−1 , . . . , x0 ).
Bien entendu, on a
s(←
−) = b(γ),
γ et b(←
−) = s(γ).
γ
On montre aussi facilement que
←
γ1−·−γ−2 = ←
γ−2 · ←
γ−1 . (3.9)
Si x = s(γ) et y = b(γ), on dénote aussi le fait qu’on a un chemin γ de x à y par :
γ
x y
x y (3.10)
γ1
3.6. CYCLES HAMILTONIENS 71
de la possibilité de composer les chemins. Les composantes connexes du graphe sont les classes
d’équivalence selon la relation ≡G , et un graphe est donc connexe s’il n’a qu’une seule composante
connexe.
Un arbre est un graphe connexe sans cycle. Un sommet d’un arbre est une feuille, s’il n’a qu’un
seul voisin. On étudie les arbres plus en détail au Chapitre 4. Une forêt est un graphe sans cycles.
Pour l’instant, donnons au moins deux résultats concernant les arbres.
Lemme 3.5. Sur un ensemble de sommets S avec |S| ≥ 2, un arbre a toujours au moins 2 feuilles.
Preuve. Considérons un chemin γ = (x0 , . . . , xk ) dans l’arbre, qui soit de longueur maximum.
Cette longueur (= k) est au moins égale à 1, puisque le graphe est connexe avec au moins 2
sommets. On a forcément x0 6= xn , puisqu’il n’y a pas de cycles dans le graphe (c’est un arbre).
Si on avait deg(x0 ) > 1, ou deg(xk ) > 1, on pourrait prolonger le chemin γ. Par hypothèse γ est
de longueur maximale, donc on a forcément deg(x0 ) = 1 et deg(xk ) = 1, ce sont donc deux feuilles
distinctes.
Proposition 3.6. Un graphe connexe, avec s sommets et a arêtes, est un arbre si et seulement si
s − a = 1.
Preuve.
(⇒)
On procède par récurrence sur s le nombre de sommets. Si s = 1, alors on a forcément
a = 0, et l’égalité (2) est vérifiée. Supposons que, pour tout arbre à s sommets, l’égalité
(2) soit vérifiée. Considérons alors un arbre (S, A) à s + 1 sommets (avec s > 1). Par la
proposition 3.6, l’arbre contient au moins une feuille x ∈ S. On enlève cette feuille et l’arête
la joignant au reste de l’arbre pour obtenir le graphe (S 0 , B). C’est donc que S 0 = S \ {x} et
B = A \ {{x, y}}, avec y est le seul voisin de x. Le graphe (S 0 , B) est un arbre, puisqu’il est
connexe et sans cycle, avec s sommets. Il vérifie donc (2). Mais alors (2) est aussi vrai pour
l’arbre (S, A), puisqu’on ajoute 1 au nombre de sommets, et 1 au nombre d’arêtes.
(⇐)
On procède par contradiction. Supposons qu’on ait un graphe connexe G = (S, A) satis-
faisant (2), mais qui ne soit pas un arbre. Autrement dit, on suppose que G contient au
moins un cycle. Lorsqu’on enlève une arête de ce cycle, le graphe reste connexe. On répète
cette étape tant que cela est possible, à chaque fois enlevant une arête. Le graphe résultant
est connexe et sans cycles. C’est donc un arbre, avec le même nombre de sommets que G.
Par l’argument ci-haut, l’égalité (2) est valable pour cet arbre. Mais ceci contredit notre
hypothèse, puisque le nombre d’arêtes de G est strictement plus grand que celui de l’arbre
(obtenu en enlevant un certain nombre, > 1, d’arêtes de G). On a donc forcément que G est
sans cycles.
3.7. COMPOSANTES CONNEXES 73
Une approche algorithmique permet de calculer simplement la composante connexe C(x) = CG (x)
dans laquelle se trouve un sommet donné x de G. On procède comme suit.
Algorithme 3.7 (Calcul de composante connexe). Si x n’a pas de voisins, c.-à-d. : V (x) = ∅,
alors CG (x) = {x}. Sinon, soit G0 := G |T le graphe induit de G sur l’ensemble T := S \ {x}. On
calcule récursivement les composantes connexes CG0 (y) de chaque voisin y ∈ V (x), de x dans G0 ,
qu’on regroupe avec {x} pour obtenir :
[
C(x) := {x} ∪ CG0 (y).
y∈V (x)
Dans un graphe connexe G, on a une notion de distance dG (x, y) entre sommets. On la définie
comme étant égale à la plus courte longueur d’un chemin entre x et y. En formule,
Le rayon r(G) d’un graphe est l’excentricité d’un de ses centres. Excentricité et
On a donc centre (en jaune).
r(G) = min e(x). (3.12)
x∈S
Enfin, le diamètre δ(G), d’un graphe G, est la plus longue distance entre sommets de G :
Dans l’exemple ci-contre, le rayon est 2, et le diamètre 4. Attention, les notions de rayon et de
diamètre de graphes n’ont pas nécessairement les mêmes propriétés que celles de rayon et de
diamètre d’un cercle. Par exemple, le rayon du graphe complet Kn est 1, et son diamètre aussi,
puisque la distance entre deux sommets de Kn est toujours égale à 1.
74 CHAPITRE 3. GRAPHES SIMPLES
L’un des problèmes typiques de la théorie des graphes consiste à trouver le (ou les) chemin le plus
court joignant deux sommets donnés, dans un graphe G = (S, A). Soulignons que ce le graphe n’est
pas connexe, il y aura des paires de sommets entre lesquels il n’y aura aucun chemin. Il y a de
très nombreuses applications des mathématiques qui se traduisent sous cette forme, en adaptant
judicieusement la notion de plus court chemin . Nous y reviendrons.
Pour l’instant, on entend par plus court chemin entre x et y, un chemin qui réalise la distance d(x, y)
(calculée dans la composante connexe commune à x et y). C’est donc dire que la longueur du chemin
est égale à d(x, y). Par définition de distance, un tel chemin existe, et il s’agit maintenant de le
trouver explicitement (ou de les trouver tous, s’il y en a plusieurs). Il y a plusieurs algorithmes pour
ce faire. Une des approches les plus simples peut être agréablement présentée de façon récursive.
Étant donnés deux sommets x et y de G, on procède comme suit pour calculer l’ensemble CG (x, y)
des chemins les plus courts de x à y dans G, c’est-à-dire
Comme nous l’avons déjà souligné, il est possible que cet ensemble soit vide.
Algorithme 3.8 (Plus court chemin). Si x = y alors
CG (x, y) = {(x)}, .
Lorsque au moins un des CG (z, y) est non vide, alors l’ensemble CG (x, y) est alors facilement obtenu
comme
CG (x, y) := { (x, z) · γ | γ ∈ CG (z, y), dG (z, y) = d0 , z voisin de x },
et on a dG (x, y) = d0 + 1. Sinon on a
CG (x, y) := ∅.
On dit qu’on a un cycle eulérien dans G, s’il existe un cycle dans G qui emprunte chaque arête une
et une seule fois. Bien entendu, pour que cela soit possible G dois être connexe. Euler à montré que
3.9. CYCLES EULÉRIENS 75
⤵
⤴ ⤵
⤴
⤵ ⤴
⤴
⤴
⤴
⤵
⤵
⤴ ⤴ ⤵
⤴
⤴
⤵
⤴ ⤴ ⤴
⤴
⤴ ⤴
⤴
⤴
⤵ ⤵ ⤵ ⤵
Théorème 3.9 (Euler). Un graphe G admet un cycle eulérien si et seulement G est connexe, et
tous les sommets de G sont de degré pair.
Preuve. Supposons que le graphe G admet un cycle eulérien γ. Pour chaque sommet x, le cycle γ
contient les deg(x) arêtes issues de x. Comme γ arrive en x autant de fois qu’il en part (n’utilisant
ces arêtes qu’une et une seule fois), deg(x) doit être pair.
Pour montrer la réciproque, on suppose donc que tous les sommets de G = (S, A) sont de degré
pair, et que G est connexe. Débutant avec un sommet x0 fixé (n’importe lequel), on chemine dans
G aussi longtemps que possible, choisissant à chaque étape une arête qui n’a pas déjà été utilisée.
Soit donc γ1 le chemin ainsi obtenu. Quel que soit les choix faits en cour de route, le chemin γ1
doit être un cycle se terminant en x0 . Autrement, le sommet final de γ1 devrait être un sommet de
degré impair (on y arrive une fois de plus que le nombre de passages, chacun avec son arrivée et son
départ). Si le cycle passe par toutes les arêtes du graphe, alors on a terminé. Sinon, on considère le
graphe G0 = (S, A0 ), où
Autrement dit, c’est le graphe obtenu de G en enlevant toutes les arêtes utilisées dans le cycle γ.
Par hypothèse A0 est non vide, et on désigne par d0 (x) le degré des sommets dans G0 . Tous les
sommets de G0 sont de degré pair, et il y en a au moins un x0 qui se situe sur γ, avec d0 (x0 ) > 0.
Attention, G0 n’est peut-être pas connexe. On peut cependant construire un cycle γ 0 , partant de
x0 , dans la composante connexe de G0 contenant x0 . On peut rallonger γ = (x0 , . . . , x0 , . . . , x0 ),
en remplaçant x0 par γ 0 = (x0 , . . . , x0 ), pour obtenir le nouveau cycle plus long :
(x0 , . . . , x0 , . . . , x0 , . . . , x0 ).
76 CHAPITRE 3. GRAPHES SIMPLES
Autrement dit, on greffe un cycle en x0 . On répète ce processus autant que possible. Après un
nombre fini d’étapes (puisque A est fini), le cycle obtenu doit contenir toutes les arêtes dans A, et
on a obtenu le cycle eulérien cherché.
3
Une variante facile du théorème consiste à considérer les chemins
a c
eulérien (auquel cas on accepte d’avoir une source différente du b
but), qui est un chemin qui passe par toutes les arêtes. Dans ce
2 4
cas, la condition est plutôt qu’il doit y avoir exactement deux som-
mets de degré impair (qui feront office de source et de but du che- e d
f
min eulérien). Une extension différente du Théorème 3.9, consiste
à considérer le cas des multigraphes , c’est-à-dire qu’il peut y 1
avoir plusieurs arêtes entre deux sommets. C’est ce cas qui a permis Figure 3.10 – Multigraphe
à Euler de montrer que le problème des ponts de Konigsberg n’a des ponts de Konigsberg.
pas de solution.
On peut transformer la preuve du Théorème 3.9 en un algorithme récursif qui trouve un chemin
eulérien dans un (multi-)graphe connexe ayant tous ses sommets de degré pair, ou exactement deux
sommets de degré impair. C’est ce qu’a proposé M. Fleury (voir [12]) en 1883, à partir de remarques
de M. Lucas. Dans le cas de la recherche d’un cycle eulérien, n’importe quel sommet peut servir de
point de départ, de la façon décrite ci-dessous. Cependant, dans le cas où G contient exactement
deux sommets de degré impairs, on doit forcément choisir l’un de ces deux sommets de degré impair
comme point de départ.
3.10 Multigraphe
de la Figure 3.10. Comme les 4 sommets sont de degré impair, il n’y a pas de chemin eulérien, et
le problème n’a donc pas de solution.
Comme pour toutes les notions mathématiques, il est essentiel de savoir comparer des graphes
entre eux. Intuitivement, ils ont la même forme si on peut renommer les sommets de l’un pour
obtenir l’autre. Plus précisément, pour deux graphes G = (S, A) et G0 = (T, B), on dit qu’on a
isomorphisme de graphe
∼
f : G −→ G0 , (3.15)
∼
si on a une bijection f : S −→ T , telle que
Le composé d’isomorphismes de graphes est un isomorphisme de graphe, ainsi que l’inverse d’un
∼
isomorphisme. Un automorphisme d’un graphe G est un isomorphisme f : G −→ G. En vertu des
observations précédentes, l’ensemble des automorphismes d’un graphe forme un groupe. Certains
graphes, les graphes de Cayley, sont en fait construits à partir d’un groupe, et ce groupe apparaı̂t
alors comme groupe d’automorphismes de son graphe.
En général il est difficile de vérifier que deux graphes donnés sont isomorphes, c’est-à-dire qu’on ne
connaı̂t pas d’algorithme qui réponde à la question en temps polynomial. Cependant, on connaı̂t des
algorithmes efficaces pour certaines familles de graphes étudiés dans la suite de ces notes comme :
les arbres, ou les graphes planaires.
La notion suivante permet de détecter facilement (mais pas à coup sûr) que des graphes ne sont
pas isomorphes. La suite de degrés d’un graphe G = (S, A) à n sommets est la liste
n = s0 + s1 + . . . + sn−1 . (3.18)
Proposition 3.10. Si deux graphes G = (S, A) et G0 = (T, B) sont isomorphes, alors leur suite de
degré sont forcément égales, c’est-à-dire que LG = LG0 .
78 CHAPITRE 3. GRAPHES SIMPLES
Pour simplifier la présentation du sujet de cette section, nous allons supposer que les graphes
G = (S, A) ont S = [n] comme ensemble de sommets. Pour un tel graphe, on considère la matrice
n×n (
1 si {i, j} ∈ A,
AG := (aij )1≤i,j≤n , avec aij = (3.19)
0 sinon.
dite d’adjacence du graphe 5 G. Le coefficient aij de A = AG prend donc la valeur 1 ou 0 selon qu’il
y a ou pas d’arête entre les sommets i et j. On présente à la Figure 3.12 un graphe et sa matrice
d’adjacence. La matrice d’adjacence d’un graphe est symétrique, c’est-à-dire que aij = aji .
1 4
0 1 0 1 1
1 0 0 1 0
0 0 0 1 1
1 1 1 0 0
1 0 1 0 0
5 3
Figure 3.12 – Un graphe et sa matrice d’adjacence
Deux graphes G et G0 sur [n] sont isomorphes si et seulement si leurs matrices d’adjacences sont
conjuguées. C’est-à-dire qu’il existe un matrice de permutation 6 P , avec
AG0 = P AG P −1 . (3.20)
On utilise efficacement la matrice d’adjacence d’un graphe pour énumérer le nombre de chemins
de longueur k allant d’un sommet i à un sommet j. En effet, ce nombre apparaı̂t tout simplement
comme coefficient i, j de la matrice AkG . On le montre facilement par récurrence (voir Exercice 3.17).
Par exemple, les nombres de chemins de longueur 4 entre les divers sommets de G sont donnés par
la matrice
15 8 11 7 3
8 8 6 8 6
4
AG = 11 6 9 3 1 .
7 8 3 15 11
3 6 1 11 9
5. C’est aussi la fonction caractéristique de l’ensemble A.
6. Une matrice de 0 et de 1, avec un seul 1 par ligne, et un seul 1 par colonne.
3.13. CONTRACTION D’ARÊTES ET MINEURS(∗) 79
Une opération importante sur un graphe G = (S, A) consiste à contracter une arête {x, y}. Dans
le graphe résultant G0 = (S 0 , A0 ), les deux sommets x et y sont identifiés, et le sommet résultant a
comme voisins tous ceux de x ainsi que tous ceux de y. Plus précisément, donnons 7 le nom z au
sommet remplaçant x et y, c’est-à-dire que
On utilise ici la somme disjointe pour souligner que z n’est pas déjà dans S. Pour les arêtes de G0 ,
on a alors
u 6= z, v 6= z, et {u, v} ∈ A, ou
0
{u, v} ∈ A ssi (3.22)
u = z, et ({x, v} ∈ A ou {y, v} ∈ A).
Le processus est illustré à la Figure 3.13. En général, on procède à une suite de contraction sur
x y z
un graphe. La situation est souvent celle pour laquelle on contracte toute une chaı̂ne, c’est-à-dire
qu’on a une suite de sommets
x1 , x2 , . . . , xk−1 , xk ,
7. Il est peut-être même plus élégant de supposer que tous les sommets sont étiquetés par des ensembles, et de
poser z = x ∪ y. Voir l’exercice 3.22.
80 CHAPITRE 3. GRAPHES SIMPLES
dans le graphe pour lesquels on a des arêtes {xi , xi+1 }, mais autres arêtes dans le graphe se terminant
en l’un des xi pour 2 ≤ i ≤ k − 1. On peut alors tout contracter d’un bloc, pour remplacer la chaı̂ne
par une seule arête {x1 , xk }.
L’opération de contraction permet de définir la notion de mineur d’un graphe G = (S, A). On dit
qu’un graphe M est un mineur de G si on peut obtenir M par une suite de contraction à partir
d’un sous-graphe de G. Autrement dit, le graphe M s’obtient de G par une succession d’opérations
choisies parmi les suivantes :
(1) suppression d’un sommet, c’est-à-dire que, pour x ∈ S, on considère le graphe G0 = (S 0 , A0 )
avec S 0 := S \ {x}, et A0 = {{u, v} ∈ A | u 6= x, et v 6= x}.
(2) suppression d’une arête, c’est-à-dire que, pour {x, y} ∈ A, on considère le graphe G0 = (S 0 , A0 )
avec S 0 := S, et A0 = A \ {{x, y}}.
(2) contraction d’une arête.
Cette notion, introduite par Klaus Wagner (1910–2000), a eu un impact considérable sur la théorie
des graphes. Elle a mené au maintenant fameux théorème de Robertson-Seymour 8 énoncé ci-
dessous. Pour le formuler, rappelons qu’on dit qu’une famille F de graphe est dite mineur-fermée
si elle contient tout mineur d’un graphe qui lui appartient. En formule, on demande que F soit
telle que
Si (G ∈ F et M mineur de G) alors M ∈ F.
On ne considère ici que des classes qui sont aussi fermées par isomorphisme. Selon le théorème
de Robertson-Seymour, l’ensemble F, des graphes qui ne sont pas dans une telle classe F, est
caractérisé par un ensemble fini GF (à isomorphisme près) de graphes dit d’obstruction, dont au
moins un doit apparaı̂tre comme mineur de n’importe quel graphe G dans F. Autrement dit, on a
On dit donc des éléments de GF que ce sont des mineurs-exclus. Un exemple classique donne une
caractérisation par mineur exclu pour la notion de graphes planaires discutés à la section suivante.
On dit qu’un graphe (ou multigraphe avec boucle) est planaire si on peut le plonger dans le
plan (ou sur la sphère 9 ) sans qu’il y ait croisement entre les arêtes. Plus techniquement, on associe
d’abord à chaque sommet x du graphe un point Px de R2 . Puis, pour chaque arête {x, y}, on se
donne une courbe simple (une fonction continue)
qui est injective (elle ne se recoupe pas). On dit alors qu’on a un plongement du graphe dans le
plan, et que le graphe est planaire, si et seulement s’il est possible de choisir le tout pour que les
courbes γxy soient sans intersections entre elles en dehors de leurs extrémités, c.-à-d. :
Il est facile de voir que le graphe de la Figure 3.12 est planaire, puisqu’il est dessiné de façon
à satisfaire la condition (3.25). Il est un peu plus difficile de constater qu’il n’y a aucune façon de
dessiner le graphe de Petersen pour que (3.25) soit satisfait. Dans ce type de situation, on dit que
le graphe n’est pas planaire.
3.15 Cartes
Une carte (mathématique) est simplement un plongement d’un multigraphe planaire G = (S, A),
avec boucles, dans la sphère S, à homéomorphisme près 10 . On considère donc que deux cartes sont
équivalentes si on peut déformer l’une dans l’autre par une déformation continue de la sphère. Le
même multigraphe peut donner lieu à plusieurs cartes différentes, c’est-à-dire que l’on ne peut pas
passer de l’une à l’autre par une déformation continue (voir Exercice ??). Pour une carte, on peut
considérer la notion de face. C’est une région connexe ouverte 11 de la sphère, délimitée par des
arêtes (qui forment un cycle). Plus précisément, les faces sont les régions connexes du sous-ensemble
de points de la sphère
{P ∈ S | P = γxy (t), {x, y} ∈ A, 0 ≤ t ≤ 1}.
Par exemple, lorsqu’on associe une carte à un arbre on n’a qu’une seule face. Lorsqu’on parle d’une
carte, obtenue par plongement de G, on identifie un sommet x avec le point Px , et l’arête {x, y}
avec la courbe γxy . Autrement dit, x est le nom du point Px . La figure 3.12 (qu’on imagine dessinée
sur une grande sphère) donne une carte avec 5 sommets, 6 arêtes, et 3 faces (incluant la face
9. Ce qui est en fait totalement équivalent.
10. Ceci signifie simplement qu’on peut déformer la figure obtenue de façon continue.
11. Rappelons que c’est un ouvert dans lequel il est possible de passer d’un point à un autre par une courbe continue
entièrement contenue dans l’ouvert. Pour plus de détails, voir un bon bouquin de topologie.
82 CHAPITRE 3. GRAPHES SIMPLES
C’est-à-dire que la courbe est contenue dans la fermeture de F . Dans ce cas, on dit aussi que la
face F est incidente à l’arête {x, y}. De façon tout à fait semblable, on a la relation d’incidence
entre sommets et arêtes, et entre sommets et faces. Un isthme est une arête qui n’est incidente
qu’à une face. Toute autre arête est incidente à exactement deux faces. Les déformations continues
d’une carte préservent toutes ces relations d’incidence. En particulier, on montre à la Figure ??
deux cartes différentes associées au même graphe. Leur différence est mise en évidence par le fait
qu’elles donnent lieu à des relations d’incidence différentes.
Lorsqu’on efface des arêtes d’une carte (ou des sommets isolés) on obtient encore une carte. C’est
une sous-carte de la carte. Euler a trouvé une très jolie relation concernant les cartes.
Théorème 3.11 (Euler). Pour une carte connexe avec s sommets, a arêtes, et f faces, on a
toujours
s − a + f = 2. (3.26)
Preuve. On procède par récurrence sur a. Si a=0, comme la carte est connexe, on doit avoir
s = f = 1, et la relation est vérifiée. Par hypothèse de récurrence, supposons maintenant que la
relation d’Euler est vérifiée pour toute carte connexe ayant au plus a arêtes. On considère une carte
connexe C 0 ayant a0 := a + 1 arêtes (s0 sommets, et f 0 faces). Dans un premier temps, on suppose
qu’on peut effacer une des arêtes de cette carte, tout en conservant le fait d’être connexe. La carte
résultante C satisfait les conditions de l’hypothèse de récurrence, puisqu’elle contient a arêtes. Le
nombre de sommets de C étant s = s0 , on a la relation d’Euler pour cette carte : s − a + f = 2, avec
f son nombre de faces. Deux cas se présentent, et dans les deux cas nous allons voir que le nombre
de faces de la nouvelle carte est f := f 0 − 1. Puisqu’alors
s0 − a0 + f 0 = s − (a + 1) + (f + 1) = s − a + f = 2,
on aura montré (dans cette situation) que la relation d’Euler tient pour C 0 .
Pour vérifier que le nombre de faces de C est un de moins que le nombre de faces de C 0 , on raisonne
comme suit. Une première possibilité est que l’arête enlevée est une boucle, et alors on perd une face
en enlevant l’arête. Autrement l’arête enlevée se situe forcément entre deux faces, sinon le graphe
résultant en l’enlevant ne serait plus connexe. Ces deux faces se joignent pour n’en former qu’une
seule dans la carte C, et nous avons fini de discuter le cas où on peut obtenir une carte connexe en
enlevant une arête.
3.15. CARTES 83
Ne reste plus qu’à étudier la situation où il est impossible d’enlever une arête sans déconnecter
la carte. La seule possibilité est que le graphe sous-jacent est un arbre, et on a une seule face. La
relation d’Euler se déduit alors de la proposition 3.6.
On associe à une carte C la carte duale C ∗ obtenue de la façon suivante. Les sommets de C ∗ sont
les faces de C, on a une arête entre deux sommets de C ∗ pour chaque arête entre les deux faces
correspondantes de C. Attention, on obtient parfois plusieurs arêtes entre deux sommets. On a
donc une carte qui correspond à plonger un mutigraphe dans la sphère, avec des boucles si la carte
comporte des isthmes. Chaque face du dual correspond à un sommet x de C. Elle est délimitée par
les arêtes de C ∗ obtenues à partir d’arêtes C, qui sont adjacentes à x. Il s’ensuit que le double dual
redonne la carte originale :
(C ∗ )∗ = C.
Les propositions suivantes permettent de montrer facilement que certains graphes ne sont pas pla-
naires, en partie en exploitant la relation d’Euler. On débute par souligner qu’on peut directement
calculer le nombre de face d’un graphe planaire connexe sans vraiment le dessiner, puisque toute
carte correspondant à un dessin de ce graphe satisfait la relation d’Euler. Pour tout graphe, on peut
donc calculer
f := a + 2 − s.
Proposition 3.12. Pour tout graphe simple planaire connexe ayant s ≥ 3 sommet et a arêtes, on
a les inégalités
3 f ≤ 2 a, et a ≤ 3 s − 6. (3.27)
Preuve. La première étape est de montrer qu’on peut se restreindre aux graphes sans isthmes,
pour montrer la première inégalité. En effet, pour un sous-graphe obtenu en enlevant un isthme,
le nombre de face est conservé tout en réduisant le nombre d’arêtes. Cependant on peut perdre
la connexité. On montre d’abord que fait la première inégalité est valable pour les graphes simple
planaire sans isthmes, sans condition de connexité. En éliminant les situations extrêmes, on vérifie
facilement qu’on peut supposer qu’il y a au moins deux faces, et au moins trois arêtes.
Pour une arête α et une face F , on pose m(α, F ) = 1 si α est incidente à F . Sinon, on pose
m(α, F ) = 0. Les sommes
X X
m(α, F ), et m(α, F ),
F face α arête
On déduit alors la deuxième inégalité à partir de la relation d’Euler par simple calcul, puisqu’on a
2a
2=s−a+f ≤s−a+ .
3
En isolant a on trouve bien l’inégalité désirée.
Pour le graphe complet K5 par exemple, on a 10 arêtes et 5 sommets, et l’inégalité n’est pas
satisfaite. Donc K5 n’est pas planaire. Cependant, le théorème n’est pas une caractérisation des
graphes planaires. Ainsi, le graphe biparti complet K3,3 (avec 6 sommets et 9 arêtes) n’est pas
planaire, mais il satisfait l’inégalité (3.27). Pour le voir, on adapte un peu la preuve de la proposition
comme suit. La remarque clé est que les faces d’une carte qu’on aurait obtenue par un plongement
hypothétique de K3,3 , devraient forcément être délimitées par au moins 4 arêtes. En effet, parce que
K3,3 est biparti, on doit alterner entre sommets d’une des parties et sommets de l’autre lorsqu’on
tourne autour d’une face. Il s’ensuit qu’on a
X X X X
2a = m(α, F ) = m(α, F ) ≥ 4 f.
α arête F face F face α arête
En remplaçant dans la relation d’Euler, on trouve que a ≤ 2 s − 4. Mais cette relation n’est pas
vérifiée pour K3,3 , puisque a = 9 et s = 6. On conclut donc que K3,3 n’est pas planaire.
Il peut sembler difficile de savoir reconnaı̂tre en général les graphes planaires des graphes non-
planaires, mais on a en fait la caractérisation très simple suivante.
Théorème 3.13 (Wagner). Un graphe est planaire si et seulement s’il ne contient comme mineur,
ni un graphe K3,3 , ni un graphe K5 .
Il s’ensuit qu’on peut mettre au point un algorithme assez efficace pour vérifier si un graphe est
planaire ou pas, en vérifiant si le graphe contient ou non l’un des deux mineurs exclus. Cependant,
cet algorithme ne donne aucune indication sur la façon de dessiner le graphe de façon planaire,
même s’il affirme que cela est possible. En fait, il y a généralement plusieurs façons de dessiner un
graphe qu’on sait être planaire, et aucune ne s’impose comme la meilleure façon.
3.16. COLORATION DE GRAPHES 85
d’abord, il est clair que k s est le nombre de k-colorations possibles pour un graphe discret à s
sommets, puisqu’on peut choisir librement les couleurs d’un sommet. Un graphe discret à s sommet
admet donc ts comme polynôme chromatique. Dans les autres cas, on calcule récursivement le
polynôme PG (t), au moyen de l’équation
où G0 est le graphe obtenu par suppression d’une arête {x, y}, et G00 est obtenu par contraction de
cette même arête. On justifie cette équation par le raisonnement suivant. Pour calculer le nombre
PG (k) de k-colorations d’un graphe G, on calcule d’abord (récursivement) le nombre PG0 (k) de k-
coloration du graphe G0 obtenu en enlevant l’arête {x, y}. Ce nombre est plus grand que le nombre
de k-colorations de G, puisque les sommets x et y peuvent être de même couleur. Hors, le nombre
de k-colorations de G, pour lesquelles x et y sont de la même couleur, est clairement égal au nombre
de k-colorations de G00 (obtenu par contracte de {x, y}), avec comme couleur de x et de y la couleur
du sommet obtenu en contractant l’arête {x, y}. On a donc bien (3.29). Par récurrence, on peut
supposer que PG0 (t) et PG00 (t) sont des polynômes, respectivement de degré s et s − 1, donc PG (t)
est un polynôme de degré s. On a la proposition suivante.
Preuve. On vérifie facilement (1) par récurrence sur le nombre d’arêtes via l’équation (3.29), avec
comme cas initial la situation du graphe discret (qui n’a aucune arête). La propriété (6) découle de
ce que le nombre de k-colorations de G, ayant les composantes connexes Gi , est égal au produit
puisque le choix des couleurs de sommets de composantes distinctes peut se faire de façon indépen-
dante. On montre aussi (2) par récurrence sur le nombre d’arêtes, puisque le nombre d’arêtes de
G0 est a − 1, et que PG00 (t) est de degré s − 1 avec coefficient dominant égal à 1. On remarque
que le polynôme chromatique n’a jamais de terme constant, puisqu’il ni a aucune coloration avec
0 couleurs. Ceci permet de déduire (3) de (6), puisque chaque P (Gi , t) est multiple de t. Pour
3.16. COLORATION DE GRAPHES 87
montrer (5), encore une fois par récurrence, on observe que les termes de même degré de PG0 (t)
et de −PG00 (t) ont même signe. D’autre part, (4) découle du cas c = 1 (c.-à-d. : G est connexe)
puisque chaque P (Gi , t) est multiple de t. Pour voir que le coefficient de t est non nul dans le cas
où G est connexe, on utilise (5) et la récurrence en observant que G00 est connexe si G l’est.
Bien entendu, le nombre chromatique du graphe apparaı̂t comme étant le plus petit entier k pour
lequel on a PG (k) 6= 0. Il s’ensuit que, si k = χ(G), alors on a
où Q(t) est un certain polynôme. En effet, pour les entiers i entre 0 et k−1, le polynôme chromatique
doit s’annuler, ce qui force 3.30 (à ce propos, voir Appendice C.1).
On a les valeurs particulières suivantes (voir Exercice 3.18) :
Il s’ensuit que 2 est le nombre chromatique d’un arbre et d’un cycle, mais on peut aussi voir cela
directement facilement.
88 CHAPITRE 3. GRAPHES SIMPLES
pour chaque sommet (x, y). Une partie de ce graphe orienté est illustré à la Figure 3.16.
Tout comme dans le cas des graphes finis, un chemin
γ dans le graphe Z × Z est donc une suite finie
γ = (p0 , p1 , . . . , pn ), (3.34)
et vers la gauche) ; et y et y dénotant des pas verticaux (respectivement vers le haut et vers le
bas). Par abus de langage, on désigne aussi par γ le mot associé au chemin γ. Ainsi le chemin de
la Figure 3.16 correspond au mot
xyxxyxxxxyyyxyyyyxxxxxyxxxxxxx.
Lorsqu’on regarde de loin un chemin très long dans Z×Z, on tend vers le mouvement brownien .
Ceci est illustré à la Figure 3.17.
L’étude du mouvement brownien est importante dans plusieurs contextes physiques. Pour en savoir
un peu plus, voir le site :
http://fr.wikipedia.org/wiki/Mouvement_brownien
3.18 Exercices
3.1. En comptant de deux façons le nombre d’arêtes du graphe complet Kn+1 , montrer qu’on a
l’identité
n(n + 1)
1 + 2 + 3 + ... + n = . (3.35)
2
3.2. Combien le cube de dimension n a-t-il d’arêtes ?
3.3. Montrer que le graphe biparti complet Kn,k est toujours un sous-graphe du graphe biparti
Kn+r,k+s , quelque soit r et s dans N.
3.4. Montrer qu’on peut définir récursivement la distance entre deux sommets x et y d’un graphe
connexe G, en posant
(
0 si x = y,
dG (x, y) := (3.36)
1 + minz∈VG (x) dG (z, y) sinon.
3.5. Calculer, pour les graphes bipartis complets, les cubes, et les cycles,
a) l’excentricité de chaque sommet,
b) le rayon,
c) le diamètre.
Trouver aussi tous les centres de ces graphes.
3.6. Montrer que le diamètre d’un graphe connexe à n sommets est toujours plus petit ou égal à
n − 1.
90 CHAPITRE 3. GRAPHES SIMPLES
3.7. Prouver la variante du Théorème 3.9 correspondant au cas des multigraphes connexes avec
exactement deux sommets de degré impair.
3.8. Montrer que tout graphe à n sommet est isomorphe à un sous-graphe du graphe complet Kn .
3.9. Trouver deux graphes non isomorphes ayant la même suite de degré (0, 1, 3, 1, 0).
3.10. On dit qu’une suite (s0 , s1 , . . . , sn−1 ), avec si ∈ N et s0 + s1 + . . . + sn−1 = n, est graphique
si elle apparaı̂t comme suite de degrés d’un graphe G (à n sommets). Parmi les suites suivantes,
déterminer celles qui sont graphiques.
a) (0, 2, 1, 2, 0),
b) (0, 0, 2, 2),
c) (0, 1, 2, 3, . . . , n − 1).
3.11. On dit qu’un graphe est pair si tous ces sommets sont de degré pair. Montrer que le nombre
de graphes pairs ayant n + 1 sommets est le même que le nombre de graphes ayant n sommets.
3.12. Montrer que, pour un graphe simple avec c composantes connexes, s sommet et a arêtes, on
a les inégalités
s−c+1
s−c≤a≤ .
2
Suggestion : Pour la seconde inégalité, considérer la situation où toutes les composantes connexes,
sauf une, sont réduites à un seul sommet.
3.13. Prouver qu’un graphe avec s sommets et plus (>) de s−1
2 arêtes est forcément connexe.
3.14. Montrer que pour une forêt G = (S, A), avec s sommets et a arêtes, on a que s − a est égal
au nombre de composantes connexes de G.
3.15. Montrer que pour une carte, avec s sommets, a arêtes, f faces, et c composantes connexes,
on a
s − a + f = 1 + c.
3.16. On dit qu’un graphe est sans triangle s’il ne contient aucun sous-graphe isomorphe à K3 .
Montrer que pour un graphe planaire sans isthme et sans triangle, ayant s sommets, a arêtes, et c
composantes connexes, on a l’inégalité
a ≤ 2 s − 2 c − 2.
3.17. Montrer par récurrence que le coefficient (i, j) de la k-ième puissances AkG , de la matrice
d’adjacence d’un graphe G = ([n], A), donne bien le nombre de chemins de longueur k allant de i
à j. On observe facilement que c’est le cas pour k = 0, puisque A0G = Idn est la matrice identité
n × n. Pour montrer l’étape de récurrence, expliciter le produit de matrice AkG · AG .
3.18. Montrer qu’on a les formules (3.31), (3.32), et (3.33).
3.18. EXERCICES 91
Programmation mathématique
3.19. Concevoir un programme qui calcule le diamètre et le rayon d’un graphe, et qui en trouve
tous les centres.
Exploration mathématique
3.20. Montrer qu’on peut plonger K3,3 dans un tore, c.-à-d. : dessiner le graphe K3,3 sur le tore
sans croisement des arêtes. Combien obtient-on de faces ?
3.22. Étant donné un graphe G = (S, A), on considère le graphe G0 obtenu à partir de G en ré-
étiquettant chaque sommet x par l’ensemble {x}. Autrement dit, G0 := (S 0 , A0 ) avec S 0 := {{x} | x ∈
S}, et A0 := {{{x}, {y}} | {x, y} ∈ A}. Lors d’une contraction de l’arête {{x}, {y}}, on étiquette
{x, y} le sommet obtenu. Montrer qu’en contractant (dans n’importe quel ordre) successivement
toutes les arêtes de graphe G0 , on obtient toujours un graphe discret dont le nombre de sommets
est le nombre de composantes connexes de G0 .
3.23. Adapter l’approche de l’exercice 3.22 pour en faire une procédure qui calcule les composantes
connexes d’un graphe.
92 CHAPITRE 3. GRAPHES SIMPLES
Chapitre 4
Structures arborescentes
4.1 Introduction
Parmi les graphes simples, les arbres jouent un rôle spécial. Leur étude est liée à celle des arbres
enracinés , qu’on appelle ici arborescences. Ces derniers graphes sont naturellement orientés (en
allant vers la racine), et il est donc naturel de discuter de ces objets à ce stade de notre présentation.
4.2 Arbres
Rappelons qu’un arbre est tout simplement un graphe simple connexe sans cycle. De façon équivalente,
un arbre G = (S, A) est un graphe simple dans lequel il existe un et un seul chemin reliant toute
paire de sommets. En effet, il existe un tel chemin parce que G est connexe, et le chemin est unique
parce que sinon on aurait un cycle. On appelle aussi souvent noeuds les sommets d’un arbre. Tous
les noeuds d’un arbre ont au moins un voisin. Ceux qui n’en n’ont qu’un seul sont appelés feuilles
de l’arbre.
Lorsqu’on dessine un arbre dans le plan, la disposition des voisins d’un noeud autour de celui-ci
n’a pas d’importance. Autrement dit, les deux arbres de la Figure 4.1 sont les mêmes. On dénote
Arb[S] l’ensemble des arbres qui ont l’ensemble S comme ensemble de noeuds. Par définition, il n’y
a pas d’arbre sur l’ensemble vide, et un seul arbre sur un singleton. On a les 16 arbres suivants sur
93
94 CHAPITRE 4. STRUCTURES ARBORESCENTES
t z
v
q v
q
e
g d d u
s
c f c
b w b f w
s e g
a z a t
u
S = {a, b, c, d}.
au bu cu d,u au bu du c,u au cu bu du
,
au cu du b,u au du bu c,u au du cu bu
,
bu au cu d,u bu au du c,u cu au bu du
,
(4.1)
cu au du b,u du au bu c,u du au cu bu
,
cu cu bu bu
@ @ @ @
@au bu @bu au @cu au @du au
@ @ @ @
bu du du cu
, , , .
Une des preuves les plus élégantes de ce fait passe par la théorie des
espèces introduite par A. Joyal, et développée par le groupe de combi-
natoire de l’UQAM. Elle consiste, par un simple argument combinatoire,
à déduire la formule (4.2) de la formule d’énumération facile des endo-
fonctions sur un ensemble à n éléments, à savoir qu’il y en a nn . Cette
preuve est mentionnée dans le livre The Book comme l’une des plus jolies
preuves en mathématiques. Arthur Cayley
(1821–1895)
4.3. ARBORESCENCES 95
La notion de centre, que nous avons introduite au à la section 3.7 pour tout graphe connexe, prend
une forme particulière pour les arbres.
En effet, il n’y a que deux possibilités. Soit que l’arbre t
v
q
ait un seul centre ; soit qu’il en ait deux, mais alors ce
e
sont deux sommets adjacents. En fait, le centre c(G) g d
s
d’un arbre G = (S, A) peut-être calculé récursivement c f
b w
comme suit. Si G est réduit à un noeud, ou une arête,
alors C(G) = G. Sinon, soit F l’ensemble des feuilles a z u
de G, et T := S \ F . On a alors que
Autrement dit, le centre d’un arbre est égal au centre de l’arbre obtenu en coupant toutes les
feuilles de l’arbre. C’est donc, soit un noeud, soit une arête. Par exemple, le centre de l’arbre de la
Figure 4.2 est le noeud (rouge) étiquetté b. De nombreuses identités profondes, de la combinatoire
des arbres, peuvent s’obtenir en exploitant une décomposition autour du centre des arbres. C’est
le cas pour la formule d’Otter-Leroux 1 .
4.3 Arborescences
où B varie dans l’ensemble des branches de l’arborescence. Bien entendu, si l’arborescence est
réduite à sa racine, la profondeur est égale à 1. Une récurrence semblable permet de calculer le
nombre f (G) de feuilles d’une arborescence :
X
f (G) = 1 + f (B). (4.4)
B
Considérant l’ensemble Gk des noeuds de profondeur k dans une arborescence G, la largeur λ(G)
de G est alors définie comme étant
L’étude de ces paramètres sur les arborescences est intimement liée à l’analyse en complexité d’al-
gorithmes de recherche dans les arbres, ou les dictionnaires. Pour la profondeur, cela correspond à
mesurer le nombre de comparaisons nécessaire avant de trouver une information.
4.4. ARBRES BINAIRES 97
Un arbre binaire 2 sur l’ensemble S peut se décrire récursivement de la façon suivante. Il est
a) soit l’arbre binaire vide, dans le cas S = ∅ ; soit l’arbre binaire réduit à un seul noeud, lorsque
|S| = 1 ;
b) soit constitué d’un noeud (la racine, qui est un élément x de S) auquel sont attachées une
branche gauche et une branche droite (qui sont chacun des arbres binaires, respectivement
sur des ensembles B et C tels que B + C = S \ {x}).
Plus techniquement, un arbre binaire est un triplet α = (x, γ, δ), avec x ∈ S, γ un arbre binaire
sur B, δ un arbre binaire sur C, et B + C = S \ {x}. On dit que x est la racine de l’arbre, et que γ
en est la branche gauche, et δ la branche droite. On dénote par B[S] l’ensemble des arbres binaires
sur S. On a donc un graphe orienté, mais il est en plus dessiné dans le plan de façon à distinguer
la gauche de la droite.
On dessine habituellement les arbres binaires avec la racine tout en haut, et les
deux branches pointant vers le bas, l’une vers la gauche, l’autre vers la droite.
Le noeud c est la racine, et a, d et f sont des feuilles. La branche gauche de
l’arbre est réduite au seul noeud a, et la branche droite est celle portée par les
noeuds b, d, e, et f .
Il est courant de présenter des arbres, ou des graphes, sans étiquettes. On dit
alors qu’on a dessiné la forme de l’arbre. Plus techniquement, on définit la
notion de type de graphes, c’est-à-dire les classes d’équivalences pour a notion
d’isomorphisme de graphe. On a donc une notion de type d’arbres, type de
graphes orientés, etc.
À chaque forme d’arbre binaire à n noeuds, il correspond en fait n! arbres qui Eugène Catalan
peuvent s’obtenir en étiquetant (de toutes les façons possibles) les n noeuds par (1814–1894)
les éléments de S. Le nombre de formes (voir exercice 4.3) d’arbres binaires à
n noeuds est le n-ième nombre de Catalan :
1 2n
Cn = . (4.6)
n+1 n
Les 5 formes d’arbres binaires à n = 3 noeuds sont celles illustrées à la Figure 4.4.
2. On devrait plutôt dire arborescence binaire , mais ce n’est pas la tradition.
98 CHAPITRE 4. STRUCTURES ARBORESCENTES
u u u u u
@ @ @
u u @u
@ @u
@ u @u
@
@ @
u @u
@ u @@u
Dans plusieurs contextes, on s’intéresse à l’exploration des valeurs qui se retrouve dans un arbre
binaire, par exemple pour trouver où se situe une valeur spécifique. Pour ce faire, il est fréquent
qu’on parcoure systématiquement l’arbre selon l’une des stratégies suivantes. On a les parcours
préfixe (dénoté ϕ) et postfixe (dénoté ψ), qui sont respectivement définis 3 comme suit :
(
x si, α = (x),
ϕ(α) := (4.8)
x ϕ(γ) ϕ(δ) si, α = (x, γ, δ),
et (
x si, α = (x),
ψ(α) := (4.9)
ψ(γ) ψ(δ) x si, α = (x, γ, δ).
Par exemple, avec l’arbre de la figure 4.5, on obtient respectivement
dans S \{min(S)}. Sur l’ensemble S = {1, 2, 3}, on a les 6 arbres binaires croissants de la Figure 4.6.
u1 u1 u1 u1 u1 u1
@ @ @ @
u2 u2 @@u2 @@u2 u3 @@u2 u2 @@u3
@ @
u3 @@u3 u3 @@u3
En fait, le nombre d’arbres binaires croissants à n-sommets est exactement n!. Ceci découle du fait
qu’on a une bijection π (la projection) entre arbres binaires croissants et ordre totaux sur S. Elle se
définit récursivement comme suit, en présentant les ordres totaux sur S sous forme de mots. Pour
un arbre croissant α = (a, γ, δ) (avec branche gauche γ et branche droite δ), on a la projection
où u et v sont les mots qui sont uniquement caractérisés par le fait que ` se décompose comme
comme produit (de concaténation) de la façon suivante :
` = u a v.
On voit facilement que la fonction ∆ est l’inverse de π. Par exemple, le mot cabf de est la projection
de l’arbre binaire croissant de la Figure 4.5. On dit aussi parfois qu’on a obtenu le mot π(α) par
lecture infixe de l’arbre α.
Il découle directement de la construction de la bijection π que
Un arbre ordonné) est un arbre (une arborescence) soit réduit à un seul noeud, soit constitué d’un
noeud (la racine) auquel est rattachée une suite non vide d’arbres ordonnés. Ce sont les branches
de l’arbre, et elles sont ordonnées de gauche à droite. La Figure 4.7 présente les formes d’arbres
ordonnés à 4 noeuds.
Plus techniquement, un arbre ordonné sur S est soit réduit à (x) si S = {x}, soit un couple (x, B),
où x (dans S) est la racine de l’arbre, et B = (α1 , α2 , . . . , αk ) est une suite non vide (k > 0)
d’arbres ordonnés. Il n’y a pas d’arbre ordonné sur l’ensemble vide.
Il y a une bijection classique entre arbres binaires et arbres ordonnés. Le passage d’un arbre binaire
à un arbre ordonné peut se décrire aisément en terme de filiation. On ajoute un nouveau noeud
u u u u u
@ @ @
u u u @u
@ u u @
@u u @u
@
@
u u @u
@ u u
comme père 4 de la racine, et on interprète le fait de descendre dans la branche gauche d’un
arbre binaire comme le passage de père en fils . Descendre dans la branche droite s’interprète
comme le passage de frère à frère cadet . Ce processus est illustré à la Figure 4.6. Le noeud
supplémentaire est celui qui est étiqueté x. On enlève de part et d’autre les étiquettes des noeuds,
pour obtenir la correspondance en terme de forme d’arbres.
Pour n = 3, la bijection de la Figure 4.9.
4. Selon le goût du lecteur, on peut substituer mère pour père et fille pour fils , ou même encore
a a x x
v v v v
@ @
@ @
@ @
b v @vc b v @v c
@ a v c v @ve
@
@
7→ @
@ 7→ A
A
d v @ ve d v @ ve
@ b v v
d Avf
@ @
@
@
@vf @ vf
@
s s s s s
s s @s @s s @s
@ @ @
s @s s @s
@ @
l l l l l
s s s s s
s s s @s s s @s s @s
@ @ @
s s @s s s
@
s
Figure 4.9 – La bijection arbres binaires, arbres aodonnés, pour n = 3.
Apparemment la notion que nous allons maintenant aborder est due à R. Pyke (voir [25]). Elle a
été redécouverte par A.G. Konheim et B. Weiss (voir [19]) dans un contexte informatique, pour
l’étude d’un certain type de hashage .
On suppose que n conducteurs ont chacun opté d’avance pour une des n places de stationne-
ment, toutes situées du même coté d’une rue à sens unique et numéroté consécutivement de 1 à n.
Autrement dit, on a une fonction ψ de l’ensemble C des conducteurs vers l’ensemble {1, 2, . . . , n},
qui rend compte des préférences de stationnement de chaque conducteur, avec ψ(c) = k si le conduc-
teur c préfère la place k. On dit que ψ est la fonction de préférence. Il n’y a aucune restriction
sur ces préférences. Par exemple, les conducteurs peuvent avoir tous choisi la place 1 comme place
préférée.
Pour une fonction de préférence ψ fixée, on suppose que les conducteurs arrivent l’un après l’autre,
dans un ordre quelconque, et s’avancent jusqu’à leur place préférée. Ils s’y garent si elle est libre, ou
se garent à la première place libre qui suit leur place préférée. Dans le cas illustré à la Figure 4.10,
102 CHAPITRE 4. STRUCTURES ARBORESCENTES
le prochain conducteur désire se garer à la place numérotée 8, qui est occupée. Il se garera donc à
la donc la place 9, qui est libre.
ψ(c)=8
J
1 2 3
JJ 6 7
J 9 10 11
J
S’il existe un ordre d’arrivée des conducteurs pour lequel un des conducteurs n’arrive pas à se
trouver une place (suivant cette procédure) avant de parvenir à la fin de la rue, on dit que la
fonction de préférence ψ n’est pas une fonction de stationnement. Au contraire, on dit avoir une
fonction de stationnement si chaque conducteur réussit à se garer, quelque soit l’ordre d’arrivée.
On montre facilement que ψ est une fonction de stationnement si et seulement si, pour tout k entre
1 et n, l’image inverse
ψ − ([k]) = {c ∈ C | ψ(c) ≤ k}.
contient au moins k éléments, i.e. :
ψ − ([k]) ≥ k. (4.13)
Autrement dit, pour chaque k il y a au moins k conducteurs qui désirent se garer dans les k
premières places.
On dénote Sta[n] l’ensemble des fonctions de stationnement, avec C = [n]. On peut décrire une
fonction de stationnement comme un mot ψ = p1 p2 · · · pn , avec pi = ψ(i). Ainsi, les 3 fonctions de
stationnement qui correspondent au cas n = 2 sont :
J J
1 2
1
n+
...
n
...
k
J
Figure 4.11 – Stationnement circulaire.
en résulte donc que ψ prend maintenant des valeurs entre 1 et n + 1. Toutes les voitures peuvent
toujours se stationner, quitte à repasser par le début ; et, à la fin, il reste toujours exactement une
place de libre. La fonction ψ est une fonction de stationnement si la seule place libre est la place
numérotée n + 1. Pour chaque fonction de préférence ψ, et chaque j entre 0 et n, on a une fonction
de préférence ψj définie comme :
Parmi les (n + 1)n fonctions de préférences, il y en a n + 1 qui s’écrivent comme ψj , pour chaque
fonction de stationnement ψ. Une seule d’entre elles laisse la place n + 1 libre. On a donc (n +
1)n /(n + 1) = (n + 1)n−1 fonctions de stationnement :
4.8 Forêts
Le lien entre fonctions de stationnement et les graphes simples passe par la notion de forêt, c’est-
à-dire tout simplement un graphe simple dont les composantes connexes sont des d’arborescence
(chacune est un arbre où on a sélectionné une racine). Par exemple, sur l’ensemble de sommets
S = {1, 2, 3}, on a les 16 forêts de la Figure 4.12.
4.9 Exercices
4.1. Montrer que la profondeur d’un arbre binaire à n feuilles est au moins égale à log2 (n).
104 CHAPITRE 4. STRUCTURES ARBORESCENTES
1 1 1 1 1 3 2 3 1 2 3 2
2 3 2 3 2 3 2 3 2 1 3 1
2 1 3 1 1 1 2 2 3 3
2 3 1 3 1 2
3 2 3 2 3 1 2 1
4.2. Montrer que, pour Cn le nombre de formes d’arbres binaires à n noeuds, on a la récurrence
n−1
X
Cn = Ck Cn−k−1 , (4.15)
k=0
avec C0 = 1.
4.3. Avec Cn comme à l’exercice 4.2, on considère la série
∞
X
C(x) := Ck xk .
k=0
b) En déduire que √
1−
1 − 4x
C(x) = . (4.17)
2x
c) Démontrer la formule (4.6) en utilisant la formule classique de développement en série
(a x)2 (a x)3 (a x)k
(1 + a x)r = 1 + r (a x) + r(r − 1) + r(r − 1(r − 2) + . . . + (r)k + ....
2 6 k!
(4.18)
Rappelons que le symbole de Pochammer , (r)k , se définit récursivement en posant
(
1 si k = 0,
(r)k :=
r (r − 1)k−1 si k ≥ 1.
4.4. Décrire une bijection directe entre les formes d’arbres binaires sur n noeuds, et les triangula-
tions d’un polygone à n+2 sommets. Suggestion : Les noeuds de l’arbre correspondent aux triangles,
et deux noeuds sont reliés si les triangles correspondants ont une arête en commun. On place la
racine dans le triangle contenant l’arête {1, 2}. Pour n = 3, on aura la bijection de la Figure 4.13.
4.9. EXERCICES 105
s s s s s
s s @s @s s @s
@ @ @
s @s s @s
@ @
l l l l l
2 2 2 2 2
3 1 3 1 3 1 3 1 3 1
4 5 4 5 4 5 4 5 4 5
Programmation mathématique
4.5. Construire une procédure qui calcule tous les arbres binaires sur un ensemble S.
4.6. Construire une procédure qui calcule la profondeur d’un arbre binaire sur un ensemble S.
4.7. Construire une procédure qui calcule tous les arbres binaires croissants sur un ensemble tota-
lement ordonné S.
4.8. Construire une procédure qui calcule la profondeur d’un arbre binaire croissant sur un ensemble
totalement ordonné S.
4.9. Construire une procédure qui calcule tous les arbres ordonnés sur un ensemble S.
4.10. Construire une procédure qui transforme un arbre binaire en arbre ordonné, comme il est
décrit à la Figure 4.8.
106 CHAPITRE 4. STRUCTURES ARBORESCENTES
Chapitre 5
Graphes orientés
5.1 Introduction
Lorsqu’on oriente les arêtes d’un graphe, on obtient la notion de graphes orientés. On a dans ce cas
des variantes intéressantes des algorithmes sur les graphes.
Un graphe orienté G est la donnée d’un couple (S, A), avec A ⊆ S × S. Un graphe orienté sur
un ensemble de sommets S correspond donc à la donnée d’une relation A sur S. Comme pour les
graphes simples, les éléments de S sont appelés sommets, mais les éléments de A sont plutôt appelé
des arcs. Autrement dit, la différence avec les graphes simples 1 et les graphes orientés réside dans
le fait qu’on a donné une orientation aux arêtes, puisqu’il y une différence entre (x, y) et (y, x).
Pour un arc a = (x, y) dans A, on dit que x est la source de a, et que y en est le but. La Figure 5.2
illustre par un dessin 2 cette notion de graphe orienté.
On dit d’un arc (x, x) que c’est une boucle du graphe. On désigne par Gro[S] l’ensemble des graphes
orientés sur un ensemble S, de n sommets, et le nombre de graphes orientés sur S est
Gro[S] = 2n·n . (5.1)
Les graphes orientés de sommets {•, •} sont les 16 graphes de la Figure 5.1. Le degré sortant (resp.
−
degré entrant) d’un sommet x du graphe G = (S, A), dénoté d+G (x) (resp. dG (x)), est défini comme
d+
G (x) := #{y | (x, y) ∈ A} (resp. d−
G (x) := #{y | (y, x) ∈ A}).
1. On insiste ici mieux sur la différence entre les deux notions en utilisant l’adjectif simple.
2. Bien entendu, plusieurs dessins différents peuvent correspondent au même graphe. Nous y reviendrons.
107
108 CHAPITRE 5. GRAPHES ORIENTÉS
En particulier une boucle contribue autant au degré sortant qu’au degré entrant. On a alors
À chaque graphe orienté G = (S, A), on associe les deux nouveaux graphes suivants. On a G(−1) =
(S, A(−1) ) le graphe orienté inverse de G, et G = (S, A) le graphe orienté complémentaire de G,
respectivement définis en posant
et on a les égalités
d+
G−1
(x) = d−
G (x), et d−
G−1
(x) = d+
G (x),
−
d+
G
(x) = n − d+
G (x), et dG (x) = n − d−
G (x).
Tout comme dans le cas des graphes simples, pour S = [n], la matrice d’adjacence d’un graphe
orienté (S, A) est définie comme
(
1 si (i, j) ∈ A,
AG := (aij )1≤i,j≤n , avec aij = (5.4)
0 sinon.
Ainsi, on un graphe orienté et sa matrice d’adjacence à la Figure 5.2. Toutes les matrices n × n de 0
5.2. GRAPHE ORIENTÉ. 109
1
3
0 1 0 0 1
0 1 1 0 0
A=
0 0 0 1 0
0 1 0 1 0
5 4 1 0 0 1 1
et de 1 peuvent apparaı̂tre comme matrice d’adjacence d’un graphe orienté. Ainsi, aux 16 graphes
orientés de la Figure 5.1, correspondent les 16 matrices :
0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 0
, , , , , , , ,
0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1
(5.5)
0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1
, , , , , , , .
0 0 1 0 1 1 1 1 1 0 0 1 1 0 1 1
On observe que la matrice d’adjacence du graphe inverse de G est la transposé de la matrice
d’adjacence de G :
AG(−1) = (AG )tr (5.6)
La matrice d’adjacence du complémentaire de G s’obtient simplement en remplaçant chaque 0 par
1, et chaque 1 par un 0, dans la matrice d’adjacence de G :
AG (i, j) = 1 − AG (i, j). (5.7)
On peut simuler un graphe simple G = (S, A) par un graphe orienté G0 = (S, B), ayant les
mêmes sommets, en posant
Autrement dit, on remplace chaque arête de A par les deux arcs possibles entre x et y (c.-à-d. :
dans les deux orientations). On a donc
G = G(−1) .
Cette construction est compatible avec la notion d’isomorphisme, et avec le passage à la matrice
d’adjacence, qui est alors symétrique. Ainsi, plusieurs résultats concernant les graphes orientés
s’adaptent au cas des graphes simples par le biais de cette même construction.
On peut associer un graphe simple à chaque graphe orienté G = (S, A) (sans boucle), simplement
en remplaçant chaque arc (x, y) par l’arête {x, y}. Au besoin, on enlève d’abord les boucles. On dit
alors qu’on a oublié l’orientation des arcs.
On peut aussi construire plusieurs graphes orientés à partir d’un graphe simple G donné, en mu-
nissant d’une orientation chaque arête de G. Ceci correspond à choisir de remplacer l’arête {x, y}
soit par l’arc (x, y), soit par l’arc (y, x). On dit alors qu’on a orienté l’arête {x, y}. Clairement, un
graphe simple G, avec a arêtes, admet 2a orientations distinctes.
5.3 Endofonction
Une façon agréable de construire certains graphes orientés, sur un ensemble de sommets S, est de
considérer une fonction quelconque f : S → S. On dit souvent qu’on a une endofonction sur S. Les
arcs du graphe associé sont les couples (x, f (x)), c’est-à-dire les éléments de la relation fonctionnelle
sous-jacente à la fonction f .
Le graphe ainsi construit porte parfois le nom de graphe sagittal
de la fonction f . On le dénote Gf . Observons que la matrice d’ad-
jacence de Gf contient un et un seul 1 sur chacune de ses lignes.
C’est l’expression de la propriété de fonctionnalité en terme de
graphes : il y a un et un seul arc sortant de chaque sommet.
Lorsque f est bijective, il y a de plus un et un seul arc entrant
dans chaque sommet, et on dit que la matrice d’adjacence est
une matrice de permutation. Elle a un et un seul 1 sur chaque
ligne et sur chaque colonne. Figure 5.3 – Une endofonction.
Un élément x dans S est dit récurrent (pour f ) s’il existe k > 0
5.4. CHEMINS DANS UN GRAPHE ORIENTÉ 111
tel que x = f k (x). Comme S est fini, S contient forcément (voir Exercice 5.8) au moins un élément
récurrent pour f .
On adapte la notion de chemin dans un graphe simple, au contexte des graphes orientés, tout
simplement en demandant de respecter l’orientation des arêtes. Un chemin
γ = (x0 , x1 , x2 , . . . , xn ),
dans un graphe orienté G = (S, A) est donc une suite de sommets, xi dans S, avec chaque (xi , xi+1 )
un arc de G. Tout comme on l’a fait pour les chemins dans les graphes simples, on dit que x0 est
la source de γ, et que xn est son but. Encore ici, n est la longueur de γ.
L’ensemble des chemins de longueur k, allant de x à y, est dénoté Gk (x, y). Les chemins de longueur
0 s’identifient aux sommets du graphe, et on écrit plus simplement 1(x, y) pour G0 (x, y). Ainsi,
{(x)} si, x = y,
1(x, y) =
∅ sinon.
Les chemins de longueur 1 correspondent aux arcs du graphe, et si on écrit simplement G(x, y),
plutôt que G1 (x, y), alors
{(x, y)} si, (x, y) ∈ A,
G(x, y) =
∅ sinon.
On dénote par G∗ (x, y) l’ensemble des chemins allant de x à y dans le graphe orienté G, c.-à-d. :
Observons, en particulier, qu’il y a un unique chemin de longueur k issu d’un sommet donné x dans
le graphe sagittal Gf , associé à une endofonction f . C’est le chemin
obtenu en itérant f .
Chaı̂nes
Une chaı̂ne dans un graphe orienté G = (S, A) est chemin dans le graphe simple obtenu en oubliant
l’orientation dans G. Autrement dit, on a
γ = (x0 , x1 , x2 , . . . , xn ),
avec (xi , xi+1 ) ∈ A ou (xi+1 , xi ) ∈ A. Par ce biais, on peut donc transposer au contexte des graphes
orientés les notions de connexité déjà considérées pour les graphes simples.
Par exemple, on peut décomposer une endofonction sur S en composantes connexes, comme illustré
à la Figure 5.3.
En utilisant la notion de chemins, plutôt que celle de chaı̂ne, on est amené à considérer la notion de
connexité forte sur un graphe orienté. Plus précisément, on introduit la relation d’équivalence
x ≡ y entre sommets de G = (S, A), qui code le fait que deux sommets x et y sont dans une même
composante fortement connexe. C’est-à-dire que x ≡ y si et seulement si il existe dans G un chemin
de x à y, et un chemin de y à x.
Tout graphe orienté admet une décomposition unique en composantes connexes, et chacune de ces
composantes se décompose à son tour en composantes fortement connexes de façon unique.
5.5. GRAPHES ACYCLIQUES 113
Proposition 5.3. Tout graphe acyclique contient au moins une source, et au moins un puits.
Preuve. On procède par contradiction. Soit G un graphe acyclique sans puits (l’argument est
semblable dans le cas des sources). Considérons un chemin (x0 , x1 , . . . , xk ) dans G. Comme xk
n’est pas un puits, il existe un arc (x, y) dans G via lequel on peut prolonger le chemin ci-haut pour
obtenir le chemin (x0 , x1 , . . . , xk , y). Ceci montre qu’il y a un chemin de longueur arbitraire dans
G. Par le principe des tiroirs, tout chemin assez long contient forcément deux sommets du chemin
qui coı̈ncident, disons xi = xj avec i < j. On a donc un circuit (xi , . . . , xj ) dans le graphe, ce qui
contredit l’hypothèse d’acyclicité.
Dans un graphe acyclique G = (S, A), on peut découper l’ensemble des sommets selon leur
rang. Notre description de cette décomposition exploite les ensembles
associés aux sommets de S. Observons que A−1 (x) = ∅ si et seulement si x est un puit de G. On a
alors la décomposition en somme disjointe
S = R0 + R1 + . . . Rk , (5.12)
où k est la longueur d’un plus long chemin dans G, et Ri est l’ensemble des sommets de rang i
obtenus récursivement comme suit. On commence par poser
C’est donc l’ensemble des puits de G. Puis, pour chaque 0 < i ≤ k, on pose
Par définition, le rang, rG (x), d’un sommet x, est égal à i si et seulement si x ∈ Ri . Tous les
sommets dans Rk sont des puits, mais il peut y avoir des puits qui sont dans l’un des Ri , avec
∼
i < k. Une numérotation, d’un graphe G = (S, A) à n sommets, est une bijection f : S −→[n]
telle que f (x) < f (y) si (x, y) ∈ A. En exploitant ces notions de rang et de numérotation, on peut
montrer que
Proposition 5.4. Un graphe à n sommets G = (S, A) est acyclique, si et seulement s’il admet une
numérotation.
En élaborant sur ces idées 3 , on peut montrer (voir [29]) que le nombre αn := |Acyc[A]| de graphes
acycliques sur un ensemble A à n élément est caractérisé par la récurrence
n
k+1 n
X
αn = (−1) 2k (n−k) αn−k , (5.15)
k
k=1
et on a les valeurs
n 0 1 2 3 4 5 6 7 8 ...
Proposition 5.5. Dans un graphe acyclique G sur A, de cardinal n, les chemins ont une longueur
bornée par le nombre de sommets. On a donc Gk = ∅ pour tout k ≥ n. Il en découle que pour tout
sommet x et y, on a :
On dit qu’on a muni un graphe simple d’une orientation acyclique, si le graphe orienté résultant
est acyclique. Par exemple, le graphe complet K3 (le triangle) admet les 6 orientations acycliques
suivantes :
2 2 2
1 3 1 3 1 3
2 2 2
1 3 1 3 1 3
Un résultat surprenant est que le nombre d’orientations acycliques d’un graphe simple G peut
s’obtenir facilement en évaluant le polynôme chromatique PG (t) du graphe simple. En effet, on a
que
Théorème 5.6 (Stanley 4 ). Le nombre α(G), d’orientations acycliques d’un graphe simple G à n
sommets, est tel que
α(G) = (−1)n PG (−1). (5.17)
Preuve. On procède par récurrence sur le nombre d’arêtes, en utilisant l’équation (3.29). Le cas
du graphe discret est clair, puisqu’il n’a qu’une seule orientation acyclique. Supposons donc qu’on
a (5.17) pour les graphes simples ayant au plus a arêtes. Pour G0 et G00 , obtenus respectivement
par suppression et contraction d’une arête choisie, joignant deux sommets de x et y, d”un graphe
simple G ayant a + 1 arêtes, il faut montrer que
Observons d’abord que toute orientation acyclique de G00 donne une orientation acyclique de G0
obtenue via la correspondance qu’il y a entre les arêtes de G0 et celles de G00 établie par le processus
de contraction. On oriente simplement les arêtes de G0 de la même façon que l’arête image suivant
la contraction. Pour un orientation acyclique donnée de G0 , il y a deux cas possibles. Le premier
cas correspond à la situation où l’on peut orienter l’arête choisie sans restriction. Cela correspond
exactement au cas où l’orientation acyclique de G0 proviens d’une orientation acyclique de G00
comme nous venons de le décrire. Il en résulte donc 2 α(G00 ) orientations acycliques de G. Dans
le deuxième cas, on doit simplement vérifier qu’il existe toujours une orientation de l’arête choisie
qui donne une orientation acyclique de G à partir d’une orientation acyclique de G0 . S’il n’est pas
possible de choisir l’orientation (x, y) pour l’arête choisie, c’est parce qu’on créé ainsi dans G un cycle
(x0 , x1 , . . . xn ), avec x = x0 = xn et y = x1 . Si l’autre orientation (y, x) est elle aussi impossible,
on aura un cycle (y0 , y1 , . . . yk ), avec y = y0 = yn et x = y1 . Mais alors (y1 , . . . yk , x2 , . . . xn ) est
alors un cycle dans G0 , ce qui contredit le fait qu’on est parti d’une orientation acyclique de G0 .
4. Richard P. Stanley, Acyclic orientations of graphs, Discrete Mathematics 5 (2) (1973), pp. 171–178.
116 CHAPITRE 5. GRAPHES ORIENTÉS
Par exemple, on calcule qu’il y a n! orientations acycliques du graphe complet Kn , puisque son
polynôme chromatique est t(t − 1)(t − 1) · · · (t − (n − 1)). On peut le voir directement en raisonnant
récursivement comme suit. De la proposition 5.3, il découle qu’on a au moins un sommet source.
En fait, il ne peut y en avoir qu’un, puisque deux sommets sources ne peuvent être reliés par un
arc. Bien entendu, il y a n choix pour ce sommet source. Si on enlève ce sommet, l’hypothèse de
récurrence assure qu’il y a (n−1)! orientations acycliques du graphe restant. On a donc globalement
n! orientations.
Il est souvent intéressant, pour des applications, de donner un poids aux arcs d’un graphe
orienté. Ce poids (ou valuation) correspond par exemple à une distance (entre villes), à un coût
(d’un voyage, d’une transaction), ou encore à une probabilité (de passer d’un sommet à un autre).
Bien entendu, selon la nature de cette valuation, des problèmes différents se posent. Nous allons
cependant voir que leur solution suit très souvent le même cheminement.
Un graphe valué est simplement un graphe orienté G = (S, A) muni d’une valuation des arcs,
c’est-à-dire une fonction
ν : A → R, (5.19)
à valeur dans un certain (demi-)anneau 5 R (comme N, Q, R, R+ ∪ {∞}, {0, 1}, etc.). L’avantage
de choisir des poids qui font partie d’un anneau (ou d’un demi-anneau) deviendra évident par la
suite. Il est habituel d’étendre la valuation à tout l’ensemble S × S, en posant simplement que
valué généralise celle de graphe orienté. On peut donc reformuler la définition de graphe valué
sous la forme simplifiée suivante. Un graphe valué, sur un ensemble de sommets S, est un couple
G = (S, ν) avec ν une valuation des éléments de S × S, c’est-à-dire une fonction
ν : S × S → R, (5.22)
à valeur dans un demi-anneau R. On considère alors que les arcs de G sont les couples (x, y) ∈ S
tels que ν(x, y) 6= 0. Autrement formulé, l’ensemble A des arcs de G est
où la multiplication est celle de R. On cherche très souvent à calculer les chemins de valuation
minimale (ou maximale). On considère aussi la valuation ν(H) de sous-graphes H = (S, B), avec
B ⊆ A, définie en posant X
ν(H) := ν(x, y). (5.24)
(x,y)∈B
Le cas particulier où H est un arbre (dit couvrant) est très souvent important, et la recherche d’un
arbre couvrant de valuation minimale est un problème classique dans ce domaine.
(k)
Les coefficients de la matrice Akν = (aij )1≤i,j≤n correspondent alors à
(k)
X
aij = ν(γ),
γ
où la somme a lieu sur l’ensemble des chemins de longueur k, allant de i à j. Selon le contexte,
plusieurs problèmes sur les graphes valués peuvent se résoudre par un calcul matriciel bien adapté.
Nous allons en discuter quelques exemples.
118 CHAPITRE 5. GRAPHES ORIENTÉS
Comme Boole, nous allons maintenant calculer avec des matrices de façon
logique , tout simplement en supposant que
1 + 1 = 1.
et la multiplication
0 · 0 = 0, 0 · 1 = 0, 1 · 0 = 0, et 1 · 1 = 1.
Nous considérons ici le cas des graphes valués avec valeur dans l’anneau booléen. La matrice d’ad-
jacence correspondante est la même que la matrice d’adjacence usuelle d’un graphe orienté, mais
les calculs sont différents. Il découle de (5.25) que le coefficient (i, j) de Ak = AkG est soit 1, soit 0,
selon qu’il y ait ou non un chemin de longueur k allant de i à j, et on a que
Proposition 5.7. La matrice booléenne
A∗ = Idn + A + A2 + A3 + . . . , (5.26)
a coefficient (i, j) égal à 1, si et seulement s’il existe un chemin allant de i à j dans G. Sinon, ce
coefficient est 0.
Observez que pour calculer A∗ , dans un graphe orienté à n sommets, il n’est pas nécessaire de
dépasser le calcul de An−1 , puisque le plus court chemin entre deux sommets est au plus de longueur
n − 1. En fait, on obtient A∗ = Ak aussitôt que Ak = Ak+1 .
5.8. LE DEMI-ANNEAU TROPICAL 119
x ⊕ y := min(x, y) et x ⊗ y := x + y.
On pose x ⊕ ∞ = x (c’est-à-dire que ∞ est l’élément neutre pour ⊕), et x ⊗ ∞ = ∞. Il peut paraı̂tre
étrange d’utiliser + comme multiplication , mais on constate qu’on a bien
x ⊗ (y ⊕ z) = (x ⊗ y) ⊕ (x ⊗ z),
ainsi que les autres propriétés nécessaires pour obtenir un demi-anneau. Le demi-anneau résultant a
été nommé tropical par Dominique Perrin, en l’honneur d’Imre Simon qui en a étudié beaucoup
de propriétés et d’applications. Au cours des récentes années, un vaste champ d’études, appelé
géométrie tropicale, s’est développé.
6. Suivant la méthode du schéma de Horner , pour William George Horner, mathématicien anglais (1786–1837).
120 CHAPITRE 5. GRAPHES ORIENTÉS
0 ⊕ ∞ = 0, x ⊕ ∞ = x, x⊗0=x et x ⊗ ∞ = ∞.
1
b
3
2
∞ 3 ∞ ∞ 3
a
c ∞ 1 2 ∞ ∞
5
∞ ∞ ∞ 4 ∞
Aν =
4
3 3
∞ 5 ∞ 1 ∞
3 ∞ ∞ 2 1
e d
2
1 1
Proposition 5.8. La matrice des coûts est égale à la k-ième puissance tropicale :
C = Akν ,
Un réseau est un graphe valué G = (S, ν), à valeurs 7 dans R, dans lequel il y a un unique sommet
source s, avec d− (s) = 0, et un unique sommet puits p, avec d+ (p) = 0. Dans la plupart des cas,
le graphe est acyclique. Pour chaque arc, on dit que ν(x, y) est la capacité de l’arc. Ces notions
apparaissent naturellement dans l’étude de réseaux électriques, de réseaux de transport, de réseaux
de distribution, de réseaux d’aqueducs, etc.
Pour toute fonction f : S × S → R, et tout sommet x de G, on considère les valeurs :
X X
f − (x) := f (y, x), et f + (x) := f (x, y). (5.29)
y∈S y∈S
Il est naturel de considérer que la capacité du réseau νG est le minimum des capacités de ses
séparateurs :
νG = min{ν(T ) | T séparateur de G}. (5.31)
Ceci est rendu plus clair par le lemme suivant.
Lemme 5.9. Pour tout réseau G, la capacité d’un séparateur T , de G, est toujours plus grande ou
égale à la valeur d’un flot dans G. Si la valeur de f est égale à la capacité de T , alors tous les arcs
de T sont saturés.
7. On peut considérer des valuations plus générales, avec valeurs dans un demi-anneau ordonné.
8. Dans le contexte des réseaux électriques, c’est la première loi de Kirchhoff.
122 CHAPITRE 5. GRAPHES ORIENTÉS
Preuve.
Théorème 5.10 (Ford-Fulkerson). Dans un réseau G, la valeur d’un flot maximal f est égale à
la capacité de G :
V (f ) = νG .
γ = (x0 , x1 , . . . , xn ),
allant de la source s = x0 au puits p = xn , le long duquel aucun des arcs n’est saturé :
c.-à-d. : f (xi , xi+1 ) < ν(xi , xi+1 ). On peut alors considérer le flot f 0 :
(
f (x, y) si l’arc (x, y) n’est pas dans γ,
f 0 (x, y) := (5.32)
f (x, y) + ε sinon,
avec ε égal à
ε := min{ν(x, y) − f (x, y) | (x, y) dans γ}.
9. On trouve un tel chemin par une exploration facile à mettre en place. Voir Exercice 5.14.
5.10. CHEMINS ET MOTS (∗) 123
À la fin de ce processus de marquage, si le puits n’est pas marqué alors le flot est maximal et on a
terminé. Sinon, le puits est forcément marqué d’un +, et il existe un chemin, constitué de sommets
marqués, allant de la source au puits :
γ = (x0 , x1 , . . . , xn ), où s = x0 , et xn = p.
(∗)
5.10 Chemins et mots
θ : A ,→ {a, b, c, . . . },
de façon à ce qu’on ait des lettres distinctes associées aux arcs issus
d’un même sommet,
θ(x, y) 6= θ(x, z) si y 6= z,
10. En fait, tout ceci est encore une fois un cas de graphe valué. La valuation est dans le demi-anneau des sommes
formelles de mots , avec comme multiplication la concaténation de mots.
124 CHAPITRE 5. GRAPHES ORIENTÉS
n Chemins de longueur n de • à •
b
0 {ε}
1 {a}
2 {aa, ba} a
3 {aaa, baa, aba} a
4 {aaaa, baaa, abaa, aaba, baba}
.. ..
. .
Les nombres Fn sont donc les fameux nombres de Fibonacci , dont les premières valeurs sont
n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 . . .
Fn 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 . . .
On vérifie facilement par récurrence que les puissances de la matrice d’adjacence du graphe de
Fibonacci donne n
1 1 Fn Fn−1
= , (5.35)
1 0 Fn−1 Fn−2
par le biais de l’égalité
1 1 Fn−1 Fn−2 Fn Fn−1
= ,
1 0 Fn−2 Fn−3 Fn−1 Fn−2
qui découle de (5.34). En passant, soulignons que les nombres de Fibonacci admettent de nombreuses
autres interprétations combinatoires.
5.11. CHAÎNES DE MARKOV(∗) 125
Chaı̂nes de Markov
5.12 Ordres(∗)
La notion de graphe acyclique est intimement liée à la notion d’ordre. Mettre en ordre les éléments
d’un ensemble est non seulement naturel, mais cela est parfois essentiel pour pouvoir analyser
et comprendre un problème. De plus, lorsqu’on cherche à compter les éléments d’un ensemble de
structures, le fait de savoir les énumérer (les présenter successivement) dans un certain ordre facilite
grandement le travail. Bref, la notion d’ordre est essentielle pour toutes sortes de raisons 11 .
Rappelons qu’une relation d’ordre (on dit aussi un ordre) ≺ sur un ensemble S, est n’importe
quelle relation qui est à la fois antiréflexive, antisymétrique et transitive. Si le couple (x, y) fait partie
de la relation d’ordre, on écrit x ≺ y, et on dit que x est plus petit à y. En formule, ≺ est un
ordre sur S si et seulement si, pour tout x, y et z dans S, on a
(a) x 6≺ x,
(b) si x ≺ y alors y 6≺ x,
(c) si x ≺ y et y ≺ z, alors x ≺ z.
Pour chaque relation d’ordre, le couple (S, ≺) est un graphe acyclique. On écrit x y pour signifier
que x est plus petit que y (x ≺ y), ou x = y. Un exemple typique d’ensemble ordonné est obtenu en
considérant la relation d’inclusion sur l’ensemble P[S], des parties de S. La Figure 5.7 présente 12
l’ensemble ordonné (P[{a, b, c}], ⊂).
Attention, la définition d’ensemble ordonné ne signifie pas que {a, b, c}
l’on puisse comparer tous les éléments de l’ensemble, et cette @
notion mathématique ne coı̈ncide donc pas avec la notion utilisée @
dans la vie courante . Cette dernière correspond plutôt au {a, b} {a, c} {b, c}
concept d’ordre total au sens ci-dessous. @ @
@ @
Un ordre total (ou linéaire) < , est un ordre sur S pour lequel {a} {b} {c}
tous les éléments de S sont comparables deux à deux, c.-à-d. : @
pour chaque x et y distincts dans S, on a soit x < y ou y < x. @
Une telle relation correspond à une orientation acyclique des arcs ∅
du graphe complet sur les éléments de S. Ainsi, la Figure 5.8 Figure 5.7 – Treillis des sous-
présente tous les ordres totaux sur l’ensemble A = {a, b, c}. Les ensembles de {a, b, c}
ordres possibles sur {a, b, c} incluent non seulement ces 6 ordres
totaux, mais aussi les 13 autres de la Figure 5.9, pour un total de 19. Il n’y a pas encore de formule
connue pour le nombre On , d’ordres sur un ensemble à n éléments. On connaı̂t au moins les valeurs
11. Pensez au côté peu pratique d’un dictionnaire dans lequel les mots seraient disposés au hasard.
12. Sous la forme du diagramme de Hasse de l’ordre, au sens défini un peu plus loin.
5.12. ORDRES(∗) 127
tc tb tc ta tb ta
tb tc ta tc ta tb
6 6 6 6 6 6
6 6 6 6 6 6
ta ta tb tb tc tc
6 6 6 6 6 6
tb ta tc ta tc tb
tc tc tb tb tc tc
ta tb ta tc tb tc
6 6 6 6 6 6
tc tb tc ta tb ta ta tb tc
A A A A A A
AK AK AK
At At At c tc Atb tc Ata tb Ata
K
A K
A AK
a b
ta tb tc
suivantes :
n 0 1 2 3 4 5 6 7 8 9 ...
On 1 1 3 19 219 4231 130023 6129859 431723379 44511042511 . . .
241939392597201176602897820148085023.
Diagrammes de Hasse
Pour des éléments distincts x et y d’un ensemble ordonné (S, ≺), on dit que y couvre x, s’il n’y a
aucun élément de S se situant entre x et y. On écrit alors x →≺ y (ou plus simplement x → y).
Toute l’information sur la relation d’ordre peut-être entièrement récupérée (voir Section 5.4) à
partir de la relation de couverture. La relation de couverture est antitransitive, c.-à-d. :
x0 → x1 → x1 → · · · → xn ,
{(123, 213), (123, 132), (213, 231), (132, 312), (231, 321), (312, 321))},
sur l’ensemble {123, 132, 213, 231, 312, 321}. Lorsque la relation d’ordre est totale, le diagramme de
321
v
@
@
231 v @v312
213 v v132
@
@
@v
123
Figure 5.10 – Un diagramme de Hasse
Un jeu impartial , à deux joueurs sur un graphe acyclique G = (S, A), se déroule de la façon suivante.
Au départ, un jeton se situe sur un sommet x0 . À tour de rôle, chaque joueur déplace le jeton du
sommet où il se trouve vers un sommet voisin (donc le long d’un arc (x, y)). La partie s’achève
lorsqu’un joueur ne peut pas déplacer le jeton, c’est donc dire que le jeton se trouve alors sur un
puits. Ce joueur est le perdant. Le fait que le graphe soit acyclique assure que la partie se termine
forcément après un nombre fini d’étapes. L’histoire d’une partie se résume donc à un chemin
γ = (x0 , x1 , x2 , . . . xn ),
avec xn un puits. Si n est impair, alors le second joueur est perdant. Sinon, c’est le premier qui
est perdant. Parmi les jeux bien connus qu’on peut envisager de ce point de vue, on retrouve par
exemple le tic-tac-toe, et le jeu de Nim (dont on reparlera ci-dessous).
Pour un sommet de départ x0 donné, on cherche à
savoir s’il y a une stratégie gagnante pour le premier
joueur. On dit alors que x0 est une position gagnante
pour le premier joueur. Avec ce point de vue, on in-
troduit la terminologie suivante. On dit que x0 est une
N -position, si le premier joueur peut faire en sorte de
gagner, quels que soient les choix de mouvements de son
adversaire. Sinon, le sommet x0 est une P -position.
On détermine itérativement les N -positions (et les P -
positions), comme suit. À chaque étape du processus,
si tous les voisins d’un sommet y sont des N -positions,
alors on déclare que y est une P -position. En parti-
culier, on amorce le processus en remarquant que les
Figure 5.11 – Noyau de Grundy
puits sont forcément des P -positions, puisqu’ils n’ont
aucun voisin. S’il existe un voisin de y qui est une P -position, alors on déclare plutôt que y est
une N -position. Pour chaque sommet du graphe on détermine ainsi s’il est une N -position, ou une
P -position, après un nombre fini d’étapes de calcul. À la Figure 5.11, on a marqué en rouge les
P -positions, et en bleu les N -positions d’un graphe acyclique.
Pour un jeu démarrant en une N -position, la stratégie gagnante du premier joueur consiste à tou-
jours déplacer le jeton vers une des P -position voisine. Le second joueur doit alors obligatoirement
déplacer le jeton vers une N -position, ce qui permet au premier joueur d’appliquer de nouveau sa
stratégie. Après un nombre fini d’étapes, le premier joueur peut déplacer le jeton vers un puits et
ainsi gagner la partie. Pour un jeu démarrant en une P -position, le premier joueur doit déplacer le
point en une N -position, et c’est alors le second joueur qui a une stratégie gagnante.
130 CHAPITRE 5. GRAPHES ORIENTÉS
Une approche plus calculatoire passe par la fonction de Sprague-Grundy 13 (ou plus simplement
fonction de Grundy) G : S → N, du graphe acyclique G = (S, A). On la définit simplement en
posant récursivement
G(x) := min(N \ {G(y) | (x, y) ∈ A}). (5.37)
Autrement dit, G(x) est le plus petit entier qui n’a pas été utilisé comme valeur de G pour un voisin
de x. En particulier,
G(x) := 0 si VG (x) = ∅, (5.38)
c’est-à-dire lorsque x est un puits. Le fait que le graphe G soit acyclique assure que (5.37) est une
bonne définition. On montre par récurrence que
ΓG := {x ∈ S | G(x) = 0 }. (5.39)
Jeu de Nim
Dans le jeu de Nim 14 , deux joueurs enlèvent à tour de rôle un nombre quelconque (mais plus grand
que 1) de jetons de l’un de n tas distincts. Le gagnant est celui qui enlève le (ou les) dernier
jeton. À chaque étape on a donc une configuration
x := (x1 , x2 , x3 , . . . , xn ),
avec les 0 ≤ xi ≤ ki , où ki est le nombre de jetons dans le tas i au départ. Un mouvement consiste
à soustraire au moins 1 à exactement l’un de ces xi , mais on peut soustraire aussi n’importe qu’elle
valeurs ≤ xi . Le perdant est celui qui se retrouve devant la configuration xi = 0, pour tout i.
La fonction de Sprague-Grundy du jeu de Nim a été décrite par Bouton 15 en 1901 (voir [8]). Pour
la calculer, on écrit chaque nombre xi en binaire et on calcule la fonction de Grundy, au moyen de
la somme digitale ⊕ , en posant
G(x) := x1 ⊕ x2 ⊕ . . . ⊕ xn . (5.40)
x = (αk · · · α2 α1 α0 )2
= α0 + α1 2 + α2 4 + . . . + αk 2k ,
y = (βk · · · β2 β1 β0 )2
= β0 + β1 2 + β2 4 + . . . + βk 2k ,
13 ⊕ 7 = 11012 ⊕ 1112
= 102
= 2
Cette somme est associative, commutative, avec 0 comme neutre. De plus, comme n ⊕ n = 0, on a
un inverse. Il s’ensuit que
x⊕z =y⊕z ssi x = y. (5.42)
On a une stratégie gagnante pour le premier joueur si, au départ, les tas sont tels que
k1 ⊕ k2 ⊕ . . . ⊕ kn 6= 0. (5.43)
y := (y1 , y2 , y3 , . . . , yn ),
x1 ⊕ x2 ⊕ . . . ⊕ xn = 0, (5.45)
5.14 Exercices
5.1. Montrer l’égalité 5.2 en comptant les arcs de G selon la source, puis selon le but.
5.2. Compter le nombre de chemins de longueur k, allant de 1 à n dans le graphe orienté sur [n],
dont l’ensemble d’arcs est
a) {(i, j) | 1 ≤ i ≤ n, et 1 ≤ j ≤ n}.
b) {(i, j) | 1 ≤ i ≤ j ≤ n}.
c) {(i, j) | j − i ≤ 2}.
5.3. Montrer que le nombre de cycles de longueur k, dans un graphe orienté G, est égal à la trace
de la matrice AkG . Rappelons que la trace d’une matrice est la somme des éléments de sa diagonale
principale.
5.4. Montrer que tout chemin dans un graphe acyclique est de longueur inférieure ou égale au
diamètre du graphe. En déduire que la matrice d’adjacence d’un graphe acyclique est nilpotente,
c’est-è dire qu’une de ses puissances est nulle.
5.5. Montrer qu’un graphe orienté G = (S, A) est fortement connexe si et seulement si sa fermeture
transitive donne le graphe complet, c’est-à-dire que G∗ = (S, S × S).
5.6. Montrer qu’un graphe orienté est acyclique si et seulement si la matrice (Id− χG ) est inversible.
Suggestion : Montrer que pour un graphe acyclique, les coefficients de la matrice (Id − χG )−1 (qui
existe) correspondent aux nombres de chemins reliant les sommets dans le graphe. En particulier,
il y a un nombre fini de tels chemins.
5.7. Montrer directement qu’un arbre sur n sommet admet 2n−1 orientations acycliques.
5.9. Soit A la matrice d’adjacence booléenne d’un graphe acyclique. Montrer que la matrice
booléenne
A∗ := Id + A + A2 + A3 + . . .,
est antisymétrique, ce qui revient à dire que pour i 6= j on a A∗ (i, j) = 1 si et seulement si
A∗ (j, i) = 0. On rappelle que dans ce contexte 1 + 1 = 1.
Programmation mathématique
5.10. Pour deux graphes orientés donnés G1 = (S1 , A1 ) et G2 = (S2 , A2 ), écrire une procédure qui
engendre tous les ismorphismes de G1 vers G2 .
5.14. EXERCICES 133
5.11. Pour un graphe orienté donné G = (S, A) et x, y dans S, écrire une procédure récursive qui
engendre tous les chemins de x vers y dans G. Suggestion : exploiter la composition de chemins.
5.12. Construire une procédure qui, pour un ensemble fini A donné, engendre
c) toutes les endofonctions sur A.
d) aléatoirement (avec distribution uniforme) ces mêmes structures.
5.13. Concevoir une procédure qui, étant donnée une endofonction f : S → S, calcule sa décompo-
sition en composantes connexes.
5.14. Étant donné un flot non complet dans un réseau, concevoir un algorithme qui recherche un
chemin non saturé, allant de la source au puits. Pour ce faire, il suffit de trouver un chemin de la
source au puits dans le graphe orienté obtenu en ne conservant que les arcs du réseau qui ne sont
pas saturés.
134 CHAPITRE 5. GRAPHES ORIENTÉS
Chapitre 6
6.1 Introduction.
Cette droite peut se coder alors comme xxyxxyxxxyxxyxx, et il en ressort qu’on peut efficacement
manipuler des droites, par le biais de mots.
135
136 CHAPITRE 6. MOTS, LANGAGES, ET AUTOMATES
6.2 Mots
Pour introduire la notion de mot, on commence par choisir un alphabet A, qui est simplement un
ensemble fini (quelconque) de lettres. En pratique, il est bien plus agréable de choisir A de façon
à ce que ses éléments se prêtent bien aux constructions suivantes, mais cela n’est qu’une question
de goût. Tout ensemble fini peut servir d’alphabet. Par exemple, on pourra choisir A comme étant
l’un des ensembles suivants
Un mot de longueur n sur l’alphabet A est simplement une suite quelconque de n lettres
w = w1 w2 w3 . . . wn , avec wi ∈ A, (6.1)
qui sont écrites successivement, sans virgules séparatrices. Autrement dit, au détail près de la
présentation, ce sont les éléments de An . Le mot vide est noté 1 (ou encore ε, par exemple dans le
cas où 1 est une lettre de l’alphabet). Insistons encore sur le fait qu’il n’y a ici aucune prétention de
vouloir attribuer une signification à un mot. En particulier, on n’a aucun besoin d’un dictionnaire.
Par exemple, sur l’alphabet A = {a, c, g, t}, on a le mot de longueur 218
ctaaggcccaaatctcagccatgcatcggggagtacaatccgtatggccaacaactggcg
cgtacgtaaagtctcctttctcgatggtccataccttagatgcgttagcattaatcaggc
aacggctctctagatagagccctcaaccggagtttgaagcatggcttctaactttactca
gttcgttctcgtcgacaatggcggaactggcgacgtg
qui décrit une portion de protéine d’un virus. Comme autres exemples, pour l’alphabet A = {a, b, c},
on a les mots (respectivement de longueur 0, 1 et 2) des ensembles
6.3 Langages
Pour nous, un langage n’est qu’un sous-ensemble de mots possibles. Autrement dit, c’est un sous-
ensemble quelconque de A∗ :
L ⊆ A∗ . (6.6)
On ne s’interroge donc pas sur le fait que des mots puissent avoir un sens dans ce langage, mais
on s’intéresse plutôt à la façon dont les mots d’un langage sont construits. L’accent est mis sur le
calcul des langages, l’analyse de la structure des mots qui le compose, ou encore sur leur construc-
tion. D’autre part, on s’intéressera aussi à la classification de la complexité algorithmique de
langages.
Pour un alphabet donné, disons A = {a, b}, on a des langages finis comme
On convient d’écrire Lk pour le langage ne contenant que les mots de longueur k dans L, c.-à-d. :
A∗ · A ∗ = A∗ .
Pour obtenir des mots dans l’étoile L∗ , on concatène un nombre quelconque de mots de L. C’est
donc dire qu’on a
∞
[
∗
L := Lk , (6.9)
k=0
avec L0 := {1}, et
Lk := L · Lk−1 , (6.10)
si k > 0. Pour illustrer l’opération d’étoile, considérons le langage L = {ab, ba}. On a alors
En passant, on remarque qu’il y a compatibilité entre cette définition et nos usages précédents,
puisque l’ensemble A est lui-même un langage (dont les mots sont les lettres de l’alphabet).
Rappelons qu’on utilise le symbole de somme, entre ensembles, pour désigner le fait qu’on a une
union disjointe. On a alors les identités (voir Exercice 6.1
∞
X
L = Lk , (6.11)
k=0
∞
X k
[
L · L0 = Lj · L0k−j . (6.12)
k=0 j=0
u · v = u0 · v 0 , ssi (u = u0 et v = v 0 ). (6.13)
Il est habituel (mais potentiellement moins rigoureux, voir Exercice 6.2) de simplifier la notation
en écrivant simplement w pour le langage L = {w}, qui ne contient que le mot w. Avec cette
convention 4 , on obtient une notation additive pour les langages, qui se présentent maintenant sous
la forme de la somme (formelle) des mots qu’ils contiennent :
X
L= w. (6.14)
w∈L
En guise d’autre illustration, le langage sur {a, b}, constitué de tous les mots qui contiennent
exactement une occurrence de deux a consécutifs, admet la description
6.4 Grammaires
Nous allons maintenant voir comment décrire récursivement des langages par le biais règles de
grammaire écrites au moyen des opérations introduites ci-haut. Ces règles de grammaires décrivent
comment construire récursivement les mots des langages considérés. Commençons par illustrer
l’approche par un exemple. Le langage des mots de Dyck sur l’alphabet {a, b}, est caractérisé par
les règles de grammaire
D → 1 (6.16)
D → a · D · b · D. (6.17)
On interprète ces règles comme signifiant qu’un mot de Dyck est : soit le mot vide 1, soit un mot
de la forme
a · u · b · v,
où u et v sont eux-mêmes des mots de Dyck (évidemment plus courts). En considérant toutes les
possibilités de satisfaire à ces règles, on trouve que le langage de Dyck est l’ensemble des mots :
Plus généralement, une grammaire (algébrique, ou hors contexte 5 ) est un ensemble fini Γ de règles
de grammaires, qui sont simplement des expressions de la forme
Z → ω, (6.18)
avec ω un mot sur un alphabet B en deux composantes V + A, où Z ∈ V. Les lettres de la partie
V sont des lettres axillaires, appelées variables (souvent en majuscules). Les lettres de la partie A
(souvent des minuscules), sont appelées symboles terminaux . L’intention est de décrire un langage
sur l’alphabet A, comme dans l’exemple ci-haut, où V = {D}, et A = {a, b}. Dans ce cas, il y a
donc une seule variable D et deux symboles terminaux a, b.
Le mécanisme par lequel on obtient un langage à partir d’une grammaire, est par une dérivation
grammaticale, c’est-à-dire une suite
w0 =⇒ w1 =⇒ w2 =⇒ · · · =⇒ wn ,
de mots wi sur l’alphabet B = V + A, où chaque wi =⇒ wi+1 est étape est de la forme
wi = u · Z · v =⇒ u · ω · v = wi+1 ,
avec Z → ω une des règles de la grammaire Γ. Autrement dit, on a obtenu wi+1 en remplaçant Z
par ω dans wi . On dit alors qu’on a dérivé wn à partir de w0 .
5. Il existe une notion plus générale de grammaires dites contextuelles que nous ne présenterons pas ici.
6.5. AUTOMATES DÉTERMINISTES 141
Pour X l’une des variables de la grammaire Γ, les mots du langage L = LΓ,X sont tous les mots de
u ∈ A∗ qu’on peut dériver de X. On dit donc que L est le langage dérivé de X selon la grammaire
Γ. Un exemple illustre bien comment on procède. Considérons la grammaire Γ constituée des règles
B → b B b,
B → A,
A → a A,
A → 1,
où les variables sont A et B, et l’alphabet des lettres du langage est {a, b}. On s’intéresse au langage
dérivé de B. Par exemple, on a
L = {bn ak bn | n ≥ 1, et k ≥ 0},
= {bb, bab, baab, . . . bbbb, bbabb, bbaabb, . . . }.
Une autre façon de spécifier un langage est par le biais d’un automate , c.-à-d. : un modèle abs-
trait de machine de calcul. L’histoire des modèles mathématiques de machines de calculs est longue
et pleine de rebondissements. Elle culmine (pour l’instant) avec l’introduction des ordinateurs mo-
dernes. Les automates considérés ici sont des machines beaucoup plus limitées dans leur capacité
de calculs. Il y en a plusieurs variantes, mais nous ne considérerons que le cas des automates dits
déterministes.
Soit A un alphabet, et E un ensemble fini dont les éléments seront appelés états. Un automate
déterministe α est simplement une fonction
α : A → End[E],
142 CHAPITRE 6. MOTS, LANGAGES, ET AUTOMATES
b
a a
b
étiquetés par les lettres de l’alphabet A. On dit multigraphe, parce qu’il y a potentiellement plusieurs
arcs allant d’un sommet x à un sommet y. Techniquement, un tel multigraphe (qui n’est pas
nécessairement un automate déterministe) est simplement un sous-ensemble du produit cartésien
A × E × E. On interprète alors le triplet (x, e, f ) comme étant un arc allant de e à f , portant
l’étiquette a.
Il est naturel de désigner par x la fonction αx . On fait fonctionner un automate au moyen des
mots sur l’alphabet A. En effet, on considère un mot comme fonction composée à partir des fonctions
associées à chacune de ses lettres. L’habitude dans ce domaine est de composer de gauche à droite,
plutôt que de droite à gauche comme on a l’habitude de le faire pour des fonctions. Ainsi, pour un
automate fixé, un mot w = w1 w2 · · · wn devient synonyme de la fonction w = wn ◦ · · · ◦ w2 ◦ w1 ,
selon la convention usuelle de composition de fonction. On évite d’avoir à continuellement tout
retourner, en convenant dorénavant de désigner par e ·α w, ou plus simplement par e · w, l’effet (via
l’automate) du mot w sur un état e dans E. On a alors, pour chaque w ∈ A∗ et e ∈ E :
a) e · 1 = e,
(6.19)
b) e · (u v) = (e · u) · v.
L’interprétation imagée du calcul e · w est la suivante. Partant de l’état e, on suit le chemin, dans
le multigraphe orienté, qui correspond au mot w. Plus précisément, pour chaque lettre x, il y a un
seul arc du multigraphe (l’automate) de la forme (x, e, f ). L’effet de x sur e est d’aller à f , c.-à-d. :
e · x = f . Le processus se déroule ensuite récursivement, en exploitant le fait que
e · (x u) = (e · x) · u = f · u.
Le chemin associé à e · w, pour w = w1 w2 · · · wn , est donc
(e0 , e1 , . . . , en ), avec e = e0 , e · w = en ,
6.6. EXERCICES 143
• · aabaab = • · abaab
= • · baab
= • · aab
= • · ab
= •·b
= •
Le lien entre la notion d’automate et celle de langage s’établit de la façon suivante. Soit α : A → E
un automate donné, et e ∈ E un état fixé que l’on va appeler initial . On choisit aussi un sous-
ensemble F de E, et on dit que les éléments de F sont des états finaux . Un langage L, sur l’alphabet
A, est reconnu par l’automate α : A → E, avec le choix de e comme état initial et des états finaux
F , si et seulement si on a
w∈L ⇐⇒ e ·α w ∈ F . (6.20)
S’il existe un automate (avec choix d’état initial et d’états finaux) qui reconnaı̂t un langage L, on
dit que le langage est reconnaissable. Un célèbre théorème lie cette notion à celle des langages qu’on
peut décrire avec les opérations introduites ci-haut. En voici l’énoncé, sans démonstration :
Théorème 6.1 (Kleene 7 , 1954). Un langage est reconnaissable si et seulement s’il peut être en-
gendré, à partir des lettres de l’alphabet, à l’aide des trois opérations union, produit et étoile.
6.6 Exercices
6.2. (∗) Pour rendre rigoureux la notation additive des langages, on considère l’anneau des séries
QhhAii en les variables non commutatives correspondant aux éléments de A, c.-à-d. : x y 6= y x,
pour x et y dans A. Par définition, les éléments de cet anneau sont les sommes formelles
X
cw w, avec cw ∈ Q, (6.21)
w∈A∗
6.3. Montrer qu’il y a bijection entre les mots du langage (a + b)n , et les sous-ensembles de [n].
6.4. Montrer que les mots de Dyck correspondent aux parenthèsages équilibrés , pour lesquels
à chaque parenthèse ouvrante ( , il correspond une parenthèse fermante ) bien placée. Par
exemple, les 5 parenthèsages
correspondent aux 5 mots de Dyck : ababab, abaabb, aabbab, aababb, et aaabbb. Plus précisément,
un parenthésage est un mot sur l’alphabet constitué des deux lettres ( et ) . Pour chaque
i entre 1 et n, on calcule la différence
Programmation mathématique
6.6. Construire une procédure qui, avec comme données un automate, un état et un mot, calcule
le résultat obtenu en appliquant la fonction associée à ce mot à l’état donné.
6.7. Construire une procédure qui, avec comme données un automate, un état initial et des états
finaux fixés, calcule tous les mots de longueur n du langage reconnu par cet automate, avec cet état
initial et ces états finaux.
Chapitre 7
Algèbre(∗)
7.1 Introduction
Nous n’allons qu’esquisser ici le vaste domaine de l’utilisation d’algorithmes dans un contexte
algébrique.
145
146 CHAPITRE 7. ALGÈBRE(∗)
système. Nous allons seulement rappeler le résultat global, puisque les détails ont été (ou seront)
vus dans un autre cours.
On commence par coder le système (7.1) de façon matricielle, comme
a11 a12 . . . a1n b1
a21 a22 . . . a2n b2
(7.2)
.. .. . . .. ..
. . . . .
ak1 ak2 . . . akn bk .
Cette matrice est transformée en une matrice échelon réduite par une succession d’opérations
de lignes, qui consiste à
(1) multiplier (ou diviser) une ligne par un scalaire 1 non nul.
(2) échanger deux lignes,
(3) ajouter à une ligne le multiple d’une autre.
Rappelons qu’une matrice est échelon réduite si
(1) la première valeur non nulle de chaque ligne est un 1. On dit que c’est le pivot de cette ligne.
(2) sur chaque colonne correspondant à un pivot de ligne, il y a une seule valeur non nulle. C’est
le 1 correspondant au pivot.
À chaque matrice (7.2), on peut associer une unique matrice échelon réduite obtenue par une suite
d’opération de ligne. L’algorithme de Gauss-Jordan organise se calcule de façon systématique.
Un plus grand commun diviseur d(x) de polynômes 2 f (x) et g(x) est caractérisé (à un multiple
constant non nul près) par le fait que
(1) d(x) divise f (x) et g(x), et
(2) Si c(x) divide f (x) et g(x), alors c(x) divise d(x).
Tout comme pour les entiers, on a l’algorithme d’Euclide pour le calcul d’un PGCD de polynômes.
Il est basé sur le fait que d(x) est un PGCD pour f (x) et g(x), si et seulement c’est un PGCD pour
g(x) et r(x), avec r(x) donné par (C.5). Illustrons par un exemple, pour bien constater qu’on a le
même processus que dans le cas des entiers. Les étapes du calcul du PGCD des polynômes x54 − 1
et x30 − 1 sont
x54 − 1 = x24 · (x30 − 1) + (x24 − 1), et donc h x30 − 1, x54 − 1 i = h x24 − 1, x30 − 1 i,
x30 − 1 = x6 · (x24 − 1) + (x6 − 1), = h x6 − 1, x24 − 1 i,
x24 − 1 = (x18 + x12 + x6 + 1) · (x6 − 1) + 0, = h 0, x6 − 1 i,
= x6 − 1.
Le calcul du PGCD d(x), de f (x) et de sa dérivée f 0 (x), donne des informations intéressantes. En
particulier, si a est une racine de d(x), alors
Une formulation élégante de ces notions passe par le concept d’idéal d’un anneau (voir appen-
dice C.2).
f1 = 0, f2 = 0, f3 = 0, . . . , fn = 0, (7.3)
on combine judicieusement les équations de (7.3) pour produire de nouvelles identités (plus
simples). À cette fin, on exploite le fait que
Si fi = 0 et fj = 0 alors fi + g fj = 0.
La discussion de l’algorithme comme tel est un peu trop longue pour ces notes, mais voici un
148 CHAPITRE 7. ALGÈBRE(∗)
x + y + z = 1,
x2 + y 2 + z 2 = 2, (7.4)
x3 + y 3 + z 3 = 3,
l’algorithme de Buchberger (avec les options correctement choisies) donne le système équivalent
x + y + z = 1,
2 z2 + 2 zy + 2 y2 − 2 z − 2 y = 1, (7.5)
6 z 3 − 6 z 2 − 3 z = 1.
xki = 1, et xk−1
i + xik−2 xj + . . . + xi xjk−2 + xk−1
j = 0. (7.6)
Le résultat est que g est k-colorable, si et seulement si le système (7.6) admet au moins une solution.
En fait chaque solution donne une coloration. On calcule une base de Gröbner de (7.6), et alors on
a les k-coloration de G. Soulignons que, lorsque l’équation xi − xj se déduit des équations données,
alors les sommets i et j ont forcément la même couleur.
L’exemple suivant est dû à Hillar et Windfeldt (2006). Lors- 1 2
qu’on cherche, avec l’approche ci-haut, les 3-colorations du
graphe de la Figure 7.1, on trouve (avec les bonnes options) 5 6
la base de Gröbner constituée des polynômes
12 7
(a) x2 − x11 , x3 − x12 , x4 − x12 , x6 − x11 , x7 − x12 , et
x9 − x11 , 11 8
(b) x1 + x11 + x12 , x5 + x11 + x12 , x8 + x11 + x12 ,
10 9
et x10 + x11 + x12 ,
(c) x211 + x11 x12 + x212 , et x312 − 1. 4 3
On observe facilement que les équations x1 − x10 , x5 − x10 ,
x8 − x10 , se déduisent des équations en (b). Avec les Figure 7.1 – Une 3-coloration.
équations en (a), on conclut donc que les sommets
{3, 4, 7, 12}, doivent avoir la même couleur, de même que {6, 9, 11} et les sommets {1, 5, 8, 10}.
Les équations en (c) signifient qu’on peut choisir arbitrairement la couleur du sommet 12, parmi les
3 couleurs ; et qu’ensuite on peut donner n’importe quelle des 2 couleurs restantes à 11. Le nombre
de 3-colorations du graphe est donc 6. L’une d’entre elles correspond celle de la Figure 7.1.
7.5. PERMUTATIONS 149
7.5 Permutations
Rappelons qu’une permutation de A est simplement une bijection de A vers A, et qu’on dénote SA
l’ensemble des permutations de A, c’est-à-dire
∼
SA := {σ : A −→ A | σ est une bijection}.
σ = σ1 σ2 · · · σn .
S4 = {1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431,
3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321}.
Partages
Un partage d’un entier n > 0 est une liste décroissante d’entiers positifs (> 0) dont la somme donne
n. Ainsi, (7, 7, 4, 4, 4, 2, 1, 1) (aussi dénoté 77444211) est un partage de
30 = 7 + 7 + 4 + 4 + 4 + 2 + 1 + 1.
Λ[0] = {0}
Λ[1] = {1}
Λ[2] = {2, 11}
Λ[3] = {3, 21, 111}
Λ[4] = {4, 31, 22, 211, 1111}
Λ[5] = {5, 41, 32, 311, 221, 2111, 11111}
Bien entendu, une colonne du diagramme de Ferrers µ est l’ensemble des cases qui ont même
première coordonnée, et sa hauteur est le nombre de ces cases.
Tableaux de Young
3 3 4 4 4 4 5 5
2 5 2 6 2 5 2 6 3 5 3 6 2 4 2 6
1 4 6 1 4 5 1 3 6 1 3 5 1 2 6 1 2 5 1 3 6 1 3 4
5 5 5 6 6 6 6 6
3 4 3 6 4 6 2 4 2 5 3 4 3 5 4 5
1 2 6 1 2 4 1 2 3 1 3 5 1 3 4 1 2 5 1 2 4 1 2 3
(P (σ), Q(σ)) = (P σ , Qσ ),
σ = σ1 σ2 · · · σn ,
chacun des deux tableaux. Ce sont les valeurs σi qui sont insérées dans le P -tableau, tandis que ce
sont les positions i qui s’insèrent dans le Q-tableau.
D’une façon grossière, on peut dire que l’insertion dans le P -tableau consiste en une cascade de
remplacement de valeurs, culminant par l’ajout d’une nouvelle case à l’une des lignes ; et l’insertion
dans le Q-tableau enregistre les étapes de croissance du P -tableau.
Il est courant de commencer la présentation de l’algorithme par un exemple, plutôt que de décrire
formellement le processus d’entrée de jeu. Ainsi donc, pour la permutation
σ = 5 4 8 2 3 6 1 7,
on a les étapes successives :
σ 7→ (P σ , Qσ ) σ 7→ (P σ , Qσ )
(a) 5 · · · 7→ 5 1 5 3
4 8 2 5
5 2
(f) 548236 ··· 7→ 2 3 6 1 3 6
(b) 5 4 · · · 7→ 4 1
5 7
5 2
4 3
(c) 548 ··· 7→ 4 8 1 3
2 8 2 5
5 4 (g) 5482361 ··· 7→ 1 3 6 1 3 6
4 2
5 7
(d) 5 4 8 2 · · · 7→ 2 8 1 3
4 3
5 3 2 8 2 5
4 8 2 5 (h) 54823617 7→ 1 3 6 7 1 3 6 8
(e) 54823 ··· 7→ 2 3 1 3
Plus spécifiquement maintenant, pour tout mot σ = σ1 σ2 · · · σn−1 σn d’entiers distincts (σi ∈ N),
la construction procède récursivement comme suit.
1. Si σ est le mot vide, alors (P σ , Qσ ) = (0, 0)
2. Sinon, σ est de la forme σ = τ a, pour τ = σ1 σ2 · · · σn−1 , un mot de longueur n − 1, et
a ∈ N. On suppose avoir déjà construit (P τ , Qτ ), et on modifie ces deux tableaux de la façon
suivante.
(a) La valeur a remplace la plus petite valeur (qui est éjectée) de la première ligne de P τ qui
est plus grande que a, s’il y en a une. La valeur éjectée est récursivement insérée dans le
tableau formé des lignes 2, 3, . . . de P τ , et ainsi de suite. Si a est plus grand que toute
les valeurs de la première ligne, alors on ajoute a dans une nouvelle case à la fin de cette
ligne. Le résultat P σ est donc un tableau standard qui diffère de P τ , dans sa forme, par
une case.
7.7. ALGORITHME RSK 153
(b) On modifie le tableau Qτ en lui ajoutant une case en même position que celle par laquelle
P σ diffère de P τ , et donne la valeur n à case.
Une étape du processus d’insertion est illustrée à la figure 7.3. On insère 6 dans le premier tableau.
Cette insertion éjecte 8 de la première ligne, et on doit l’insérer dans la seconde, etc. Les éléments
qui sont déplacés par l’insertion sont dans les cases en vert dans le second tableau. La case qui
12 12
7 7 9
3 9 11 3 8 11
1 2 5 8 10 ←− 6 = 1 2 5 6 10
avec i1 < i2 < . . . < ik . Par exemple, 2 5 7 9 est une sous-suite croissante de longueur 4 de
σ = 2 8 6 5 3 1 4 7 9.
Cette dernière permutation admet aussi la sous-suite 2 3 4 7 9 de longueur 5. En fait, 5 est la longueur
maximale d’une sous-suite croissante de σ.
Soit σ permutation de [n]. Alors, la longueur maximale d’une sous-suite croissante de σ est égale
à la longueur de la première ligne du tableau P (σ), obtenu par l’algorithme RSK. Cette propriété
est utilisée pour l’étude de certains algorithmes, plus particulièrement dans le domaine de la bioin-
formatique en relation avec le séquençage de gènes.
154 CHAPITRE 7. ALGÈBRE(∗)
7.9 Exercices
Bien entendu, on doit lire cette dernière expression en interprétant la notation exponentielle
de la façon usuelle pour les entiers.
7.2. Combien y a-t-il de partages de n en parts au plus égales à 2 ?
7.3. On peut ordonner l’ensemble de tous les diagrammes de Young par inclusion (en tant que
sous-ensembles de N × N). On obtient ce qu’on appelle le treillis de Young, dont voici une petite
partie du début de son diagramme de Hasse
.. .
. . .. . . . ..
.. . . . .
. ..
I
@
@ @
I
@
@ @
@
I
@
@
↑
0
Montrer qu’il y a bijection entre tableaux de Young de forme µ (un partage), et chemins allant de
0 à µ dans ce treillis, et en déduire qu’on a la récurrence
X
fµ = fν , (7.13)
ν→µ
ν1 + ν2 ≤ µ1 + µ2 ,
..
.
ν1 + ν2 + · · · + νk ≤ µ1 + µ2 + · · · + µk ,
où µi = 0 si i > `(µ), avec une convention similaire pour ν. Le diagramme de Hasse de cet ordre
sur l’ensemble des partages de 3 est : Trouver le diagramme de Hasse de cet ordre sur l’ensemble
% & % &
→ → → →
& % & %
Montrer que l’ordre lexicographique est une extension linéaire de l’ordre de dominance. C’est-à-dire
que l’ordre lexicographique est un ordre total tel que
νµ implique ν ≤ µ.
Programmation mathématique
7.6. Concevoir des procédures qui, pour une permutation σ de [n] donnée sous forme de mot,
a) calcule la décomposition cyclique de σ.
b) trouve une représentation de σ comme produit de transpositions adjacentes.
c) trouve toutes les représentations (de longueur minimale) de σ comme produit de transposi-
tions adjacentes.
7.7. Écrire une procédure qui trouve tous les partages de n en parts plus petites ou égales à k.
7.9. EXERCICES 157
7.8. Concevoir une procédure qui trouve tous les tableaux de Young de forme donnée.
7.9. Concevoir des procédures qui réalisent l’algorithme RSK, c.-à-d. : calculent le couple (P , Q) à
partir de σ. Tester l’énoncé (7.9).
158 CHAPITRE 7. ALGÈBRE(∗)
Annexe A
Un soupçon de logique
Pour développer des preuves, il est nécessaire de connaı̂tre les manipulations logiques de base. Nous
n’allons ici n’en rappeler que quelques principes. Informellement, un énoncé (mathématiques) est
une phrase qui affirme un certain fait (mathématique). L’important est de pouvoir déterminer si
l’énoncé est vrai ou faux . Une preuve est constituée d’un enchaı̂nement de déductions
logiques, à partir de faits connus (ou d’axiomes), avec comme conclusion le fait que l’énoncé (qu’on
cherchait à prouver) est vrai. La forme d’une preuve dépend fortement de la forme de l’énoncé à
prouver. On décrit ces formes possibles ci-dessous.
À partir d’énoncés connus A et B, on peut former de nouveaux énoncés au moyen d’opérations
logiques. On a les énoncés :
1. (A et B), qui est vrai si et seulement si A et B le sont tous les deux,
2. (A ou B), qui est vrai si et seulement si A est vrai ou B est vrai,
3. (¬A), qui est vrai si et seulement si A est faux,
4. (A ⇒ B), qui n’est faux que lorsque A est vrai et B est faux,
5. (A ⇔ B), qui est vrai exactement quand A et B sont tous les deux vrai, ou tous les deux
faux.
Dans la description de chacune des opérations, on décrit quelle est la façon de procéder pour
prouver l’énoncé composé, à partir de ses composantes. L’opération d’équivalence ⇔ permet
de comparer la véracité d’énoncés logique. Ainsi, l’énoncé (A ⇔ B) se formule aussi
A si et seulement si B,
ou même (A ssi B). Ce sont diverses façons d’exprimer le fait que A soit vrai est équivalent au fait
que B le soit. L’opération d’implication ⇒ correspond à la déduction logique. Ainsi, l’énoncé
(A ⇒ B) se formule aussi
si A alors B.
159
160 ANNEXE A. UN SOUPÇON DE LOGIQUE
Ce sont diverses façons d’exprimer le fait que B soit vrai se déduit du fait que A l’est. Autrement
dit, une preuve de (A ⇒ B) pourra se dérouler comme suit. On suppose que A est vrai, et on
montre qu’un enchaı̂nement logique de déductions prouve que B l’est alors forcément.
Dans une série de manipulations logiques, il est agréable de savoir quand on peut remplacer une
affirmation par une autre qui lui est logiquement équivalente (en espérant qu’elle soit plus facile
à montrer). Les règles du calcul des propositions expliquent quand il est possible de remplacer un
énoncé par un énoncé qui lui est logiquement équivalent. On a par exemple :
1. ¬(A et B) si et seulement si (¬A ou ¬B),
2. ¬(A ou B) si et seulement si (¬A et ¬B),
3. (A ⇒ B) si et seulement si (¬B ⇒ ¬A),
4. (A ⇒ B) si et seulement si (¬A et B),
5. (A ⇔ B) si et seulement si (A ⇒ B) et (B ⇒ A)
Chacun de ces cas représente une stratégie potentielle de preuve, si l’énoncé est de la bonne forme.
Cette liste est incomplète, mais elle comprend les principales stratégies usuelles.
Certains énoncés font intervenir une variable, et sont vrais pour certaines valeurs de cette variable.
On écrit P (x) pour ce genre d’énoncés, avec x la variable, et on dit qu’on a un prédicat. Infor-
mellement, c’est une phrase avec x comme sujet. Typiquement, on pense à P comment étant une
propriété que x peut avoir (ou pas). Par exemple, on a
— P (x) = (x est un nombre pair), ou
— P (x) = (x est égal à 1),
— etc.
Pour chaque a, valeur possible 1 de x, on a un énoncé P (a) qui est vrai si et seulement si a
possède la propriété P . À partir de prédicats donnés, on peut former de nouveaux prédicats au
moyen des opérations logiques : (P (x) et Q(x)), (P (x) ou Q(x)), (¬P (x)), etc. Bien entendu, on a
des prédicats à plusieurs variables, prenant la forme P (x, y) par exemple.
Au moyen d’un prédicat, on peut former les énoncés logiques
1. (∀x P (x)), qui est vrai si et seulement si P (a) est vrai pour toutes la valeur possible de x,
2. (∃x P (x)), qui est vrai si et seulement si il existe a, une valeur possible de x, pour laquelle
P (a) est vrai.
On a les équivalences logiques
1. ¬(∀x P (x)) si et seulement si (∃x ¬P (x)),
2. ¬(∃x P (x)) si et seulement si (∀x ¬P (x)).
La présentation ci-dessous ne vise qu’à donner une idée de ce à quoi peut ressembler une théorie
axiomatique des ensembles. Pour en savoir plus, il faut suivre un cours sur le sujet, ou consulter
un livre plus spécialisé, comme
Il existe plusieurs systèmes axiomatiques formels pour la théorie des ensembles. L’un des plus connus
est le système ZFC de Zermelo-Fraenkel (avec l’axiome du choix). L’axiomatique ZFC se décrie
dans le contexte du calcul des prédicats avec relation d’égalité. Toute la théorie étant formulée
en terme d’ensembles, on doit se rappeler que les éléments d’ensembles sont aussi des ensembles.
Tout est, en quelque sorte, construit à partir de l’ensemble vide. Ainsi on aura les ensembles tous
distincts
∅, {∅}, {{∅}}, ...
{∅, {∅}}, {{∅, {∅}}}, {{{∅, {∅}}}}, ...
(B.1)
{∅, {∅}, {{∅}}}, {{∅, {∅}, {{∅}}}}, {{{∅, {∅}, {{∅}}}}}, . . .
.. .. .. ..
. . . .
La relation d’appartenance x ∈ A et la notion d’ensemble ne sont définies que par le fait qu’elle
satisfont les axiomes suivants. La relation d’inclusion A ⊆ B est définie par
(A ⊆ B) ssi ∀x (x ∈ A ⇒ x ∈ B).
161
162 ANNEXE B. AXIOMATIQUE DE LA THÉORIE DES ENSEMBLES
1) Axiome d’extensionalité. Deux ensembles sont égaux, si et seulement s’ils ont les mêmes
éléments. En formule,
∀A ∀B [∀x (x ∈ A ⇔ x ∈ B) ⇒ (A = B)]. (B.2)
2) Axiome de la paire. Pour tous ensembles A et B, on peut construire un ensemble C dont les
seuls éléments sont A et B. Autrement dit, on permet ici de construire
C := {A, B}.
En formule,
∀A ∀B ∃C[∀x (x ∈ C) ⇔ (x = A ou x = B)]. (B.3)
3) Axiome de la réunion. Pour tout ensemble A, on peut construire un ensemble B dont les
seuls éléments sont tous ceux qui sont éléments des éléments de A. Autrement dit, on permet ici la
construction de l’ensemble [
B := x.
x∈A
En formule,
∀A ∀B ∃C[∀x (x ∈ C) ⇔ (x = A ou x = B)]. (B.4)
4) Axiome de l’ensemble des parties. Pour tout ensemble A, on peut construire l’ensemble B
des sous-ensembles de A. Autrement dit, on permet ici la construction de l’ensemble
B := {x | x ⊆ A}.
En formule,
∀A ∃B ∀x(x ∈ B) ⇔ (x ⊆ A). (B.5)
5) Axiome de l’infini. Cet axiome permet de construire (au moins un) ensemble infini. C’est
l’ensemble
A := { ∅,
{∅},
{∅, {∅}},
{∅, {∅}, {∅, {∅}}},
{∅, {∅}, {∅, {∅}}, {∅, {∅}, {∅, {∅}}}}}, . . .}.
Cet axiome permet aussi (avec les précédents) de construire l’ensemble N des entiers positifs. En
formule,
∃A (∅ ∈ A) et (x ∪ {x} ∈ A). (B.6)
163
B := {x ∈ A | P (x)}.
En formule,
∀y1 · · · ∀yn ∀A ∃B ∀x[(x ∈ B) ⇔ (x ∈ A et P (x, y1 , . . . , yn )). (B.7)
Les yi sont ici simplement des paramètres auxiliaires dont on pourrait avoir besoin pour formuler
plus facilement la propriété P . On dit qu’on a un schéma d’axiomes, parce qu’il y a un axiome
pour chaque choix de P .
7) Shéma d’axiomes de remplacement. Pour tout ensemble A et toute relation fonctionnelle
F , on a un ensemble
B := {y | x ∈ A et F (x, y)}.
Pour exprimer ceci en formule (simplifiée 1 ), rappelons d’abord que F est une relation fonctionnelle,
on écrit Fonct(F ), si et seulement si
8) Axiomes de fondation. Pour tout ensemble A non vide, il existe un ensemble B, appartenant
à A, qui n’a aucun élément en commun avec A, c’est-à-dire que
A ∩ B = ∅.
En formule,
∀A[(A 6= ∅) et ∃B (B ∈ A et A ∩ B = ∅)]. (B.8)
9) Axiomes du choix. Pour tout ensemble A, d’ensembles non vides, le produit cartésien des
éléments de A est non vide. En formule,
Y
[∀x ∈ A (x 6= ∅)] ⇒ x 6= ∅. (B.9)
x∈A
1. La formulation plus juste fait apparaı̂tre des paramètres dans F comme dans l’axiome précédent.
164 ANNEXE B. AXIOMATIQUE DE LA THÉORIE DES ENSEMBLES
Annexe C
Notions d’algèbre
Ici, on rappelle certaines notions d’algèbre qui sont utiles pour notre approche algorithmique des
mathématiques.
C.1 Polynômes
sont égaux si et seulement s’ils ont même degré et même coefficients. C’est donc dire qu’on a
n = k, et ai = bi , pour 0 ≤ i ≤ n.
On dénote respectivement par Q[x], R[x], et C[x] l’ensemble des polynômes pour lesquels les co-
efficients sont supposés appartenir respectivement à Q, R ou C. Pour simplifier la discussion, on
dénote K l’un de ces divers contextes.
La somme et le produit de polynômes f et g dans K[x] est un polynôme dans K[x], et on a
165
166 ANNEXE C. NOTIONS D’ALGÈBRE
pour d’uniques polynômes q(x) et r(x) dans K[x]. Ces polynômes se calculent comme suit, par
récurrence sur le degré. Si deg(f ) < deg(g), alors q(x) := 0 et r(x) := f (x). Sinon, avec les conven-
tions en (C.2) on a n ≥ k, et il y a un unique polynôme F (x) tel que
an n−k
f (x) = x g(x) + F (x).
bk
Il est tout simplement obtenu par la soustraction f (x) − (an /bk ) xn−k g(x). Par récurrence, on peut
faire la division euclidienne de F (x) par g(x), puisque deg(F ) < deg(f ) :
et alors les polynômes cherchés sont q(x) := (an /bk ) xn−k + Q(x), et r(x) := R(x). On dit que g(x)
divise f (x), si le reste de la division euclidienne de f est g est nul.
On dit aussi que a ∈ K est une racine de f ∈ K[x] si
f (a) = 0. (C.7)
Si a est une racine de f , alors f (x) = q(x) (x − a) pour un certain polynôme q(x). En effet, on le
vérifie en procédant à la division euclidienne de f (x) par x − a, pour obtenir
On conclu que r est une constante. En évaluant chaque membre de cette dernière égalité en a, on
constate que r doit en fait être égal à 0. Un argument semblable montre qu’on a
Un groupe est un ensemble G muni d’une opération associative, avec élément neutre, ainsi qu’un
inverse pour chaque élément de G. On adopte fréquemment une notation multiplicative g · h pour
cette opération, avec 1 désignant l’élément neutre. L’inverse de g est alors g −1 . Cependant, si
l’opération est aussi commutative, on utilise parfois une notation additive g+h, avec 0 pour l’élément
neutre. et −g pour l’inverse de g.
C.2. GROUPE ET ANNEAUX 167
L’ordre d’un groupe G est simplement un autre nom pour le nombre d’éléments de G. Un sous-
groupe de G est un sous-ensemble H de G, qui contient l’identité, l’inverse de chacun de ses éléments,
et qui est fermé par produit, c.-à-d. : si h1 et h2 sont dans H alors h1 · h2 est aussi dans H. Si G
est fini, alors l’ordre d’un sous-groupe de G divise l’ordre de G.
On a les groupes
(1) L’ensemble Z des entiers, avec l’addition.
(2) L’ensemble Q+ , des nombres rationnels non nuls, avec la multiplication.
(3) Les permutations d’un ensemble avec la composition.
(4) L’ensemble des automorphisme d’un graphe avec la composition.
(5) L’ensemble des matrices n × n de déterminant non nul, avec la multiplication.
(6) Dans Zn , l’ensemble des entiers relativement premier à n avec la multiplication.
Un anneau est un ensemble R muni de deux opérations (souvent dénotées respectivement additive-
ment et multiplicativement). On demande que (R, +) forme un groupe, que la multiplication soit
associative avec un élément neutre (souvent désigné par 1), et enfin que la multiplication soit distri-
butive sur l’addition (autant à gauche qu’à droite). L’anneau est dit commutatif si la multiplication
est commutative.
On a les anneaux
(1) L’ensemble Z des entiers, avec l’addition et la multiplication.
(2) L’ensemble Zn des entiers modulo n, avec l’addition et la multiplication.
(3) L’ensemble K[x] des polynômes, avec l’addition et la multiplication.
(4) L’ensemble des matrices n × n (à coefficient dans un anneau R), avec l’addition :
M + P, avec (M + P )ij := Mij + Pij ,
(où l’addition dans le membre de droite est celle de R) ; et la multiplication :
n
X
M · P, avec (M · P )ij := Mik · Pkj ,
k=1
f1 = 0, f2 = 0, . . . , fn = 0, (C.8)
et alors g est éléments de l’idéal I si et seulement si on peut déduire l’équation g = 0 des équations (C.8).
En particulier, pour tout d dans R, on a
h d i = {r · d | r ∈ R}.
Soit R un anneau pour lequel la seule façon d’avoir f · g = 0 est lorsque f = 0 ou g = 0. On dit
que R est un anneau euclidien, si on a une fonction ∆ : R → N, pour laquelle on a une division
euclidienne. C’est-à-dire que, quelque soit a et b dans R, il existe q et r tels que
Dans un anneau euclidien, on a une notion de plus grand commun diviseur . Dans le cas de l’anneau
Z, la fonction ∆ est la valeur absolue. Dans le cas de K[x], c’est le degré des polynômes qui joue ce
rôle. On dit que d est un glus grand diviseur pour les éléments f1 , f2 , . . ., fk , si on a
(d) = h f1 , f2 , . . . , fk i.
Le théorème est que dans un anneau euclidien, il existe toujours un tel d. Dans la mesure où sa
division euclidienne est effective (se calcule), on peut appliquer l’algorithme d’Euclide au calcul du
PGCD dans un anneau euclidien.
Annexe D
Calcul formel
D.1 Introduction
Les systèmes de calcul formel permettent de manipuler concrètement des objets mathématiques
abstraits de façon rigoureuse. Cela va des nombres entiers, rationnels, réels ou complexes (et des
calculs sur ceux-ci) ; à des manipulations d’opérateurs sur des espaces de fonctions ; en passant par
un vaste spectre de notions mathématiques de l’algèbre, du calcul, de l’analyse complexe, de la
théorie des nombres, etc. Tout système de calcul formel (Sage, Maple, etc.) permet, entre autres,
de manipuler des ensembles, des fonctions, des listes, et diverses constructions les concernant.
D.1.1 Maple
Dans ce système de calcul formel, une session de travail est un processus interactif qui consiste à
donner au système une instruction de calcul et on obtient alors comme résultat la valeur du calcul
demandé (apparaissant en bleu). Le système affiche automatiquement le symbole > chaque fois
qu’il est prêt à effectuer une prochaine instruction. Le ; signifie la fin de l’instruction donnée,
et la touche return (ou enter ) déclenche le calcul. Ainsi, on peut demander de calculer
> gcd(x36 − 1, x24 − 1) ;
x12 − 1
Ici, la fonction Maple gcd trouve que x12 −1 est un 1 plus grand commun diviseur des polynômes
x36 − 1 et x24 − 1.
En plus d’effectuer des calculs explicites, il est possible de donner des noms à certains objets au
moyen l’assignation := . On peut donc poser
1. Puisque définit à un multiple scalaire prêt.
169
170 ANNEXE D. CALCUL FORMEL
> x := 100 ;
x := 100
Les changements de lignes et les espaces supplémentaires n’ont ici aucun effet sur le calcul. Ils ne
servent qu’à disposer la description de la fonction F de manière plus agréable. Normalement, le
résultat d’une telle instruction est d’afficher le texte de la fonction ainsi définie. Le fait d’utiliser le
: , plutôt que le ; comme indication de fin de l’instruction, évite cet affichage assez inutile.
Observons ici (comme le veut la théorie) que la répétition d’un élément n’a aucun effet. Bien
entendu, on a aussi les opérations usuelles sur les ensembles
> {a, b, c} intersect {b, c, d} ;
{b, c}
D.1. INTRODUCTION 171
En passant, rien n’empêche d’utiliser abstraitement ces opérations sur des ensembles B et C non
spécifiées. Ainsi, on obtient
> (B union D) intersect (C union D) ;
(B ∪ D) ∩ (C ∪ D)
> B minus B ;
∅
La fonction nops est très générale. Elle permet de compter le nombre d’opérandes dans une
expression. En particulier elle donne le nombre d’éléments d’un ensemble. Cependant, pour faciliter
la compréhension, il est possible de lui donner un synonyme en posant :
> card := nops :
Par la même occasion, on se permet de mettre en place les autres synonymes :
> ‘&+‘ := ‘union‘ :
> ‘&-‘ := ‘minus‘ :
L’utilisation du caractère & , dans &+ , est nécessaire en Maple lorsqu’on désire considérer
de nouveaux opérateurs binaires avec une notation infixe . C’est aussi une particularité de la
syntaxe de Maple qui forcent l’utilisation des ‘ au moment de l’établissement de ces synonymes.
172 ANNEXE D. CALCUL FORMEL
Pour décrire un ensemble de la forme {g(x) | x ∈ A}, on peut utiliser la fonction Maple seq qui
permet de construire des séquences de valeurs g(x) pour x variant dans A. Puisque l’ensemble A a
déjà été défini (mais pas g), on obtient :
> {seq(g(x), x in A)}) ;
{g(a), g(b), g(c)}
Autres opérations. On peut définir d’autres opérations usuelles sur les ensembles comme ci-
dessous. Si A = {x} + B, le calcul de l’ensemble P[A] des parties de A est basé sur la récurrence :
Avec une syntaxe légèrement différente de celle déjà utilisée, on exploite cette récurrence pour
obtenir la nouvelle fonction
> P := proc(A) local x, B :
if A = {} then {{}}
else x := op(1, A) : (x est le premier élément dans A)
B := A & − {x} :
P (B) &+ {seq( C &+ {x}, C in P (B)}
fi
end :
Après avoir considéré le cas spécial A = ∅, on choisit x comme étant le premier élément de A, et la
cinquième ligne reproduit (presque fidèlement) le membre de droite de (D.1). On obtient ainsi une
fonction calculant l’ensemble P (A) des parties de A :
> P ({a, b, c}) ;
{∅, {a} , {b} , {c} , {a, b} , {a, c} , {b, c} , {a, b, c}}
Avant de construire le produit cartésien comme opération binaire, on rappelle qu’en Maple un
couple, normalement dénoté (x, y) dans des contextes mathématiques, est plutôt dénoté [x, y]. Ceci
est dû au fait que les parenthèses usuelles sont réservées à d’autres fins syntaxiques. On pose donc
> ‘&X‘ := proc(A, B) local x, y :
{seq(seq([x, y] , x in A), y in B)}
end :
D.1. INTRODUCTION 173
Alors, on obtient
> {a, b, c} &X {a, b} ;
{[1, a], [1, b], [2, a], [2, b], [3, a], [3, b]}
et aussi
> {a, b, c} &X {} ;
∅
comme il se doit. On peut maintenant obtenir la fonction qui calcule l’ensemble des relations entre
A et B, simplement en posant :
> Relations := (A, B)− > P (A &X B) :
et donc on peut ensuite calculer que
> Relations({a, b}, {x, y}) ;
∅, {[a, x]} , {[a, y]} , {[b, x]} , {[b, y]} , {[a, x], [a, y]} , {[a, x], [b, x]} , {[a, x], [b, y]} , {[a, y], [b, x]} ,
{[a, y], [b, y]} , {[b, x], [b, y]} , {[a, x], [a, y], [b, x]} , {[a, x], [a, y], [b, y]} , {[a, x], [b, x], [b, y]} ,
{[a, y], [b, x], [b, y]} , {[a, x], [a, y], [b, x], [b, y]}
Une construction similaire permet d’obtenir l’ensemble des mots de longueur k, sur un alphabet A,
au moyen de la fonction Maple cat qui concatène deux mots.
> Mots := (A, k)− >
if k = 1 then A
else {seq(seq(cat(w, x) , x in A), w in Mots(A, k − 1))}
fi :
> Mots({a, b, c}, 3) ;
aaa, aab, aac, aba, abb, abc, aca, acb, acc,
baa, bab, bac, bba, bbb, bbc, bca, bcb, bcc,
caa, cab, cac, cba, cbb, cbc, cca, ccb, ccc
174 ANNEXE D. CALCUL FORMEL
D.1.2 Sage
Notations
175
176 ANNEXE E. NOTATIONS
[1] E.A. Bender and S.G. Williamson, Foundations of Applied Combinatorics, Addison-
Wesley, 1991.
[2] C. Berge, Principes de Combinatoire, Dunod, 1968.
[3] F. Bergeron, Algebraic Combinatorics and Coinvariant Spaces, CMS Treatise in Mathema-
tics, CMS et A.K. Peters, 2009.
[4] F. Bergeron, G. Labelle & P. Leroux, Espèces de structures et combinatoire des struc-
tures aborescentes, Publications du LACIM 19, UQAM, Montréal, 1994.
[5] F. Bergeron, G. Labelle & P. Leroux, Combinatorial Species and Tree-Like Structures,
Encyclopedia of Mathematics and its Applications 67, Cambridge University Press, 1998.
• Texte d’introduction aux espèces (en anglais)
• Site Wikipedia sur le espèces
[6] F. Bergeron and S. Plouffe, Computing the Generating Function of a Series Given its
First Few Terms, Experimental Mathematics 1, 1992, 307–312.
[7] M. Bona, A Walk Through Combinatorics : An Introduction to Enumeration and Graph
Theory, World Scientific, 2006.
[8] C.L. Bouton, Nim, a game with a complete mathematical theory, Ann. Math. Princeton,
Series 2, 3, 1902, 35–39.
[9] A. Cayley, A theorem on trees, Quart. J. Pure Appl. Math. 23 (1889).
[10] S. Eilenberg, Automata, Languages and Machines, Academic Press Vol. A, 1974 ; et Vol.
B, 1976.
[11] Ph. Flajolet et R. Sedgewick, Analytic Combinatorics, Cambridge University Press,
2009. Aussi disponible gratuitement sur le site :
http://algo.inria.fr/flajolet/Publications/book.pdf
[12] M. Fleury, Deux problemes de geometrie de situation, Journal de mathématiques élémentaires
(1883), 257–261.
177
178 BIBLIOGRAPHIE
[13] R.L. Graham, D.E. Knuth, and O. Patashnik, Concrete Mathematics, Addison-Wesley,
1989.
[14] P.M. Grundy, Mathematics and Games, Eureka, 2, 1939, 6–8. Réédité, 27, 1964, 9–11.
[15] F. Harary, Graph Theory, Addison-Wesley, 1972.
[16] F. Harary and E. Palmer, Graphical Enumeration, Academic Press, 1973.
[17] A. Joyal, Une théorie combinatoire des séries formelles, Advances in Mathematics 42 (1981),
1–82.
[18] Donald Knuth, The Art of Computer Programming, Addison-Wesley, 3-ième édition, 1997.
Page web de Don Knuth
[19] G. Konheim et B. Weiss, An occupancy discipline and applications, SIAM J. Applied Math.
14 (1966), 1266–1274.
[20] J. Labelle, Théorie des graphes, Modulo éditeur, Montréal, 1981.
[21] M. Lothaire, Combinatorics on Words, Encyclopedia of Mathematics Vol. 17, Addison-
Wesley, 1983.
Site Wikipedia sur la combinatoire des mots
[22] J.W. Moon, Counting Labelled Trees, Canadian Mathematical Monographs 1, CMS, 1970.
[23] M. Petkovsek, H. Wilf, et D.Zeilberger, A=B, A.K. Peters, 1996. Aussi disponible
gratuitement sur le site :
http://www.math.upenn.edu/∼wilf/Downld.html
[24] G. Pólya and R.C. Read, Combinatorial Enumeration of Groups, Graphs and Chemical
Compounds, Springer-Verlag, 1987.
[25] R. Pyke, The supremum and infimum of the Poisson process, Ann. Math. Statistics 30 (1959),
568–576.
[26] C. Schensted, Longest increasing and decreasing subsequences, Canad. J. Math. 13 (1961),
179–191.
[27] N. Sloane et S. Plouffe, Encyclopedia of Integer Sequences, Academic Press, 1995.
http://oeis.org/classic/Seis.html
[28] R. P. Sprague Über mathematische Kampfspiele Tôhoku Mathematical Journal, 41, 1906,
438–444.
[29] R.P. Stanley, Acyclic orientations of graphs, Discrete Math., 5 (1973), 171–178.
Index
anneau carte, 81
idéal, 168 duale, 83
tropical, 119 isthme, 82
antisymétrique, 132 coefficient
arête binomial, 18
incidente, 67 complément, 45
arborescence, 95 cube, 65
branche, 96
largeur, 96 décidable, 56
profondeur, 96 degré
arbre entrant, 107
binaire, 97 sortant, 107
croissant, 98 suite, 77
binaire croissant diagramme
déployé, 99 colonne, 150
lecture infixe, 99 Ferrers, 150
projection, 99 hauteur, 150
branche ligne, 150
droite, 97 diagramme de Hasse, 128
gauche, 97 différence, 45
enraciné, 95 divise, 1
feuille, 93 dominance, 155
forme, 97 Dyck, mot de, 140
noeud, 93
ordonné, 100 élément
racine, 95 récurrent, 110
automate, 141 endofonction, 110
état, 141 Ensemble
Mandelbrot, 34
bijection, 50 ensemble
des parties, 43
cardinal, 42 paire, 44
179
180 INDEX
sous-ensemble, 43
sous-suite
croissante, 153
tableau
forme, 151
tours de Hanoı̈, problème des, 13
trace, 132
treillis
de Young, 155
union, 44
disjointe, 45, 59