L`induction mathématique

Transcription

L`induction mathématique
L’induction mathématique
François Lemieux
L’induction mathématique est une technique de preuve essentielle pour vérifier
non seulement certaines équations mathématiques mais aussi pour démontrer
l’exactitude de programmes informatiques ainsi que certaines propriétés des
structures de données. Dans ces notes nous allons définir ce qu’est l’induction
mathématique et donner plusieurs applications en mathématique discrète et en
informatique.
1
Quelques rappels en logique
Nous appellerons assertion, un énoncé dont on peut dire sans ambiguı̈té s’il est
vrai ou faux. Il existe des énoncés qui ne sont pas des assertions. Par exemple
l’énoncé:
Cet énoncé est faux
est un paradoxe qui ne peut être ni vrai ni faux. Nous ne considérerons pas
d’avantage ce type d’énoncé.
Exemple 1 L’assertion:
1 + 2 + 2 2 + 23 + 24 = 2 5 − 1
est vraie.
Exemple 2 L’assertion:
31, 331, 3331, 33331, 333331, 3333331 et 33333331 sont des nombres premiers
est vraie.
Exemple 3 L’assertion:
333333331 est un nombre premier
est fausse.
Exemple 4 L’assertion:
La profondeur minimale d’un arbre binaire de 4 noeuds est 2
est vraie.
1
Afin de rendre la notation plus concise et plus générale, chaque assertion
peut être représentée par un symbole. Par exemple, les assertions des quatre
exemples précédents pourraient être représentées par les symboles A, B, C et
D, respectivement. On dirait alors que A, B et D sont vrais mais que C est
faux.
Si A et B sont deux assertions alors on peut utiliser les connecteurs logiques
ET, OU, NON, et ⇒ afin de créer de nouvelles assertions:
• A ∧ B (ET logique): cette assertion est vraie si et seulement si A et B
sont tous les deux vrais.
• A ∨ B (OU logique): cette assertion est fausse si et seulement si A et B
sont tous les deux faux.
• A (négation): cette assertion est vraie si et seulement si A est faux.
• A ⇒ B (implication): Si A est vrai alors cette assertion est vrai si et
seulement si B est vrai; si A est faux alors cette assertion est toujours
vraie. En d’autres mots, A ⇒ B est équivalent à A ∨ B.
Remarque. Il peut sembler étrange que A ⇒ B soit toujours vrai lorsque A
est faux. Cela est cependant justifié par l’usage que nous allons en faire. Par
exemple, considérez un ensemble U et deux sous-ensembles S ⊆ U et T ⊆ U .
Par définition, S est un sous-ensemble de T si pour tout élément x ∈ U on a:
x∈S⇒x∈T
Remarquez que l’implication doit être vrai quelque soit x ∈ U et en particulier
lorsque x 6∈ S.
Exemple 5 Soit G un graphe non dirigé. Consédérons les assertions A, B, C
et D suivantes:
A: G est un graphe sans cycle.
B: G est un graphe connexe.
C: G possède 5 noeuds.
D: G possède 4 arêtes.
Alors, on peut définir les assertions suivantes:
• A ∧ B ∧ C: cette assertion est vraie si et seulement si G est un graphe
connexe et sans cycle qui possède 5 noeuds.
• (A ∧ B ∧ C) ⇒ D: Cette assertion est vraie puisqu’il est connu que tout
graphe connexe et sans cycle qui possède n noeuds possède exactement
n − 1 arêtes.
• (A ∧ C) ⇒ D: Cette assertion est fausse puisqu’il existe des graphes de 5
noeuds sans cycle qui ont moins de 4 arêtes.
2
Exemple 6 Soit S ⊆ N un ensemble de nombres entiers. Considérons les deux
assertions suivantes:
A: Tous les sous-ensembles de 2 éléments de S ne contiennent que des nombres
pairs.
B: Tous les sous-ensembles de 3 éléments de S ne contiennent que des nombres
pairs.
On veut démontrer que A ⇒ B est vrai quel que soit l’ensemble S. Bien sur,
il y a deux possibilités: A est vrai ou A est faux. Si A est faux alors A ⇒ B
est nécessairement vrai par définition de l’opérateur d’implication. Il reste donc
à montrer que si A est vrai alors B est aussi vrai. Supposons donc que A est
vrai et soit T = {x, y, z}, un sous-ensemble de S. On peut exprimer T sous
la forme: T = {x, y} ∪ {y, z}. Si A est vrai alors {x, y} ne contient que des
nombres pairs et il en est de même pour {y, z}. Donc tous les entiers dans T
sont pairs. On conclu que si A est vrai alors B est vrai.
L’exemple précédent indique que le fait qu’une assertion A ⇒ B soit vraie
ne donne aucune information sur la véracité ou la fausseté de A et de B. Par
exemple, la démonstration demeure valable si S = {1, 3, 5, 7, . . .} ou si S =
{2, 4, 6, 8, . . .}. Par contre si A ⇒ B est vrai et que A est vrai alors nous
sommes certain que B est vrai. Cet argument a pour nom Modus Ponens. Il
est si fréquent et si important pour notre propos que nous l’écrivons sous forme
de règle formelle:
Règle du Modus Ponens: Soit A et B deux assertions. Si on sait que:
1. A est vrai et
2. (A ⇒ B) est vrai
alors on peut conclure que B est vrai.
2
Les prédicats
Dans l’exemple précédent, les assertions A et B sont presque identiques. Elles
ne diffèrent que par le nombre d’éléments dans l’ensemble. Nous pourrions
aussi vouloir définir des assertions similaires pour les ensembles de 4 éléments
et plus. Dans une telle situation, il est utile d’associer un paramètre n ≥ 0 à
une assertion comme dans la définition suivante:
P(n): Tous les sous-ensembles de n éléments de S ne contiennent que des nombres pairs.
On a alors: A = P (2) et B = P (3).
3
Exemple 7 Soit n ≥ 0 un entier. Consédérons les assertions A(n), B(n) et
C(n) suivantes:
A(n): n = 2
B(n): n est pair
C(n): n est premier
Alors, on peut définir les assertions suivantes:
• B(n) ∧ C(n): cette assertion est vraie si et seulement si n est un nombre
premier et pair.
• (B(n) ∧ C(n)) ⇒ A(n): Cette assertion est toujours vraie car si n est à
la fois premier et pair alors n doit valoir 2.
Exemple 8 Considérons la fonction C suivante:
int max(int Tab[], int n){
int a,b;
if (n==1) return T[0];
a=T[n-1];
b=max(T, n-1);
if (a>b) return a;
else return b;
}
Pour tout n ≥ 1 on défini l’assertion P (n) suivante:
P(n): max(T,n) retourne le maximum des n premiers éléments de T .
On montre que P (n − 1) ⇒ P (n) est vrai de la façon suivante. Si P (n − 1) est
vrai alors l’appel recursif max(T, n-1) retourne le maximum des n − 1 premiers
éléments de T . La fonction retourne le maximum entre cette valeur et T [n − 1].
La valeur retournée est donc le maximum des n premiers éléments du tableau.
Ce qui montre que P (n) est vrai.
Si une assertion P (n) est définie pour tout n ≥ 0 alors P peut être vu comme
une fonction associant à chaque nombre naturel la valeur vrai ou faux. Une telle
fonction est appelée prédicat.
Définition 1 Un prédicat est une fonction dont la valeur est vrai (V) ou faux
(F). Nous nous intéressons principalement aux prédicats sur les entiers, c’està-dire aux fonctions de la forme:
P : N → {V, F }
4
Exemple 9 Soit P1 : N → {V, F } le prédicat défini par:
½
V si n est un nombre premier
P1 (n) =
F sinon
Ce prédicat est parfois vrai, parfois faux selon la valeur de n.
Exemple 10 Soit P2 : N → {V, F } le prédicat défini par:
½
Pn
i
n+1
V si
−1
i=0 2 = 2
P2 (n) =
F sinon
On peut démontrer que ce P2 (n) est vrai pour tout n ≥ 0.
Exemple 11 Pour tout n ≥ 1 définissons G(n) comme l’ensemble de tous les
graphes de n noeuds qui sont à la fois connexes et acycliques.
Soit P3 : N → {V, F } le prédicat défini par:
½
V si tous les graphes dans G(n) possèdent n − 1 arêtes
P3 (n) =
F sinon
On peut démontrer que P3 (n) est vrai pour tout n ≥ 1.
Exemple 12 Considérons la fonction C suivante:
int fib3(int n){
int i = 1, j = 0, k = 0, h = 1, t;
while (n>0){
if (n%2){
t = j*h;
j = i*h + j*k + t;
i = i*k + t;
}
t = h*h;
h = 2*k*h + t;
k = k*k + t;
n = n/2;
}
return j;
}
5
Soit P4 : N → {V, F } le prédicat défini par:
½
V si fib3(n) retourne le n-ième nombre de Fibonacci
P4 (n) =
F sinon
On peut démontrer que P4 (n) est vrai pour tout n ≥ 0.
Exemple 13 Considérons la fonction C suivante:
int troisn (int n){
if (n==1) return 1;
if (n%2) return troisn(n/2);
return troisn(3*n+1);
}
Soit P5 : N → {V, F } le prédicat défini par:
½
V si troisn(n) s’arrête éventuellement
P5 (n) =
F si troisn(n) boucle à l’infini
Dans l’état actuel de nos connaissances, on ne connait aucune valeur n0 pour
laquelle P5 (n0 ) est faux. Par ailleurs, on ne connait aucune preuve démontrant
qu’un tel n0 existe.
Exemple 14 Considérons la fonction C suivante:
int fib1 (int n){
if (n<2) return n;
return fib1(n-1)+fib1(n-2);
}
Soit T (n) le temps d’exécution de fib1(n). On a:
½
a
T (n) =
T (n − 1) + T (n − 2) + b
si n < 2
si n ≥ 2
où a et b sont deux constante positives. Soit c = max {a, b} et soit P6 : N →
{V, F } le prédicat défini par:
½
V si T (n) ≤ c(φn − 1)
P6 (n) =
F sinon
où φ =
√
1+ 5
2 .
On peut démontrer que P6 (n) est vrai pour tout n ≥ 1.
6
3
L’induction mathématique
L’exemple 10 de la section précédente présentait un précicat:
P : N → {V, F }
tels que P (n) est toujours vrai lorsque n est plus grand ou égal à 0. Cela signifie
que toutes les assertions:
P (0), P (1), P (2), P (3), P (4), . . .
sont vraies.
Mais comment peut-on prouver qu’une infinité d’assertions sont vraies? Nous
allons développer une startégie où la règle du Modus Ponens jouera un rôle crucial.
Première stratégie:
1. On commence par prouver que P (1) est vrai.
2. On montre ensuite que P (1) ⇒ P (2) est vrai.
3. Si l’on réussi les deux premières étapes, la règle du modus ponens nous
dit que P (2) est vrai.
4. On montre ensuite que P (2) ⇒ P (3) est vrai.
5. Si l’on réussi les quatre premières étapes, la règle du modus ponens nous
dit que P (3) est vrai.
6. On montre ensuite que P (3) ⇒ P (4) est vrai.
7. Si l’on réussi les six premières étapes, la règle du modus ponens nous dit
que P (4) est vrai.
8. On poursuit de cette façon.
Exemple 15 Considérons le prédicat P : N → {0, 1} défini par:
P(n):
n
X
2i = 2n+1 − 1
i=0
Utilisons notre stratégie pour montrer que P (2) est vrai.
7
1. P (0) est vrai car
P0
i=0
2i = 1 = 21 − 1.
2. Montrons ensuite que P (0) ⇒ P (1) est vrai. On a:
1
X
2i = 2 +
0
X
i=0
2i
i=0
Si on suppose que P (0) est vrai alors on a:
0
X
2i = 21 − 1
i=0
Substituant la dernière équation dans la précédente on obtient:
1
X
2i = 2 + (21 − 1) = 22 − 1
i=0
Ce qui montre que P (0) ⇒ P (1) est vrai.
3. Puisque l’on a montré que P (0) est vrai et que P (0) ⇒ P (1) est vrai alors
la règle du modus ponens nous dit que P (1) est vrai.
4. Montrons ensuite que P (1) ⇒ P (2) est vrai. On a:
2
X
2i = 22 +
i=0
1
X
2i
i=0
Si on suppose que P (1) est vrai alors on a:
1
X
2i = 22 − 1
i=0
Substituant la dernière équation dans la précédente on obtient:
2
X
2i = 22 + (22 − 1) = 23 − 1
i=0
Ce qui montre que P (1) ⇒ P (2) est vrai.
5. Puisque l’on a montré que P (1) est vrai et que P (1) ⇒ P (2) est vrai alors
la règle du modus ponens nous dit que P (2) est vrai.
Bien sur, cette façon de procéder est correcte mais elle possède un défaut
majeur: Le nombre d’étapes nécessaires pour prouver P (n) augmente avec n. Il
faut une étape pour montrer P (0), deux de plus pour prouver P (1), deux autres
8
pour prouver P (2), et ainsi de suite. Cela signifie qu’il faudrait une infinité
d’étapes pour montrer que P (n) est vrai pour tout n ≥ 0.
Dans l’exemple précédent, on remarque que les étapes 2 et 4 sont presque
identiques: seules les constantes sont différentes. Il en est de même avec les
étapes 3 et 5. Cela suggère d’utiliser une variable n et de démontrer que
P (n − 1) ⇒ P (n) est vrai sans substituer n par une constante.
Exemple 16 Montrons que P (n − 1) ⇒ P (n) est vrai. On a:
n
X
i
n
2 =2 +
i=0
n−1
X
2i
i=0
Si on suppose que P (n − 1) est vrai alors on a:
n−1
X
2i = 2n − 1
i=0
Substituant la dernière équation dans la précédente on obtient:
n
X
2i = 2n + (2n − 1) = 2n+1 − 1
i=0
Ce qui montre que P (n − 1) ⇒ P (n) est vrai.
Une fois que l’on a montré que P (n − 1) ⇒ P (n) est vrai alors on peut
substituer n par n’importe quelle valeur plus grande que 0 et l’assertion demeure
vrai. On a donc:
1. P (0) ⇒ P (1) est vrai.
2. P (1) ⇒ P (2) est vrai.
3. P (2) ⇒ P (3) est vrai.
4. P (3) ⇒ P (4) est vrai.
5. etc.
Notons que cela ne donne aucune indication sur la véracité ou la fausseté de
P (0), P (1), P (2), . . .. Pour s’en convaincre, on observe que si on remplace P par
le prédicat P 0 défini de la façon suivante:
P’(n):
Pn
i=0
2i = 2n+1 − 3.1416
alors on prouvera de la même manière que dans l’exemple précédent que
P 0 (n − 1) ⇒ P 0 (n) est vrai.
Par contre, si l’on réussi à montrer que P (0) est vrai alors on aura:
9
1. Puisque P (0) est vrai et P (0) ⇒ P (1) est vrai donc P (1) est vrai par la
règle du modus ponens.
2. Puisque P (1) est vrai et P (1) ⇒ P (2) est vrai donc P (2) est vrai par la
règle du modus ponens.
3. Puisque P (2) est vrai et P (2) ⇒ P (3) est vrai donc P (3) est vrai par la
règle du modus ponens.
4. etc.
La discussion précédente nous conduit à la formulation de notre seconde
stratégie qui est l’induction mathématique.
Principe de l’induction mathématique: Soit P : N ⇒ {V, F } un prédicat
et k ≥ 0 une constante. Si les deux conditions suivantes sont vérifiées:
1. P (k) est vrai
2. Pour tout n > k, P (n − 1) ⇒ P (n) est vrai
alors P (m) est vrai pour tout m ≥ k.
Exemple 17 Considérons à nouveau l’exemple 8. On veut montrer par induction mathématique que P (n) est vrai pour tout n ≥ 1.
Base: On vérifie facilement que P (1) est vrai puisque si un tableau ne contient
qu’un seul élément alors celui-ci est nécessairement le maximum et c’est
cet élément qui est retourné par la fonction.
Hypothèse d’induction:
Soit n > 1. Supposons que P (n − 1) est vrai.
Pas d’induction: Nous devons montrer que si l’hypothèse d’induction est vrai
alors P (n) est aussi vrai. En d’autres termes nous devons montrer que
P (n − 1) ⇒ P (n) est vrai et cela a été fait dans l’exemple 8.
Conclusion: Puisque P (1) est vrai et puisque P (n − 1) ⇒ P (n) est vrai pour
tout n > 1 alors, par le principe de l’induction mathématique, P (n) est
vrai pour tout n ≥ 1.
10
Exemple 18 Soit P : (N ) ⇒ {V, F, } le précicat défini par: P (n) = V si et
seulement si tous les arbres binaires de profondeur au plus n ont au plus 2n
feuilles. On veut montrer par induction mathématique que P (n) est vrai pour
tout n ≥ 0.
Base: P (0) est vrai car un arbre binaire de profondeur 0 ne peut posséder
qu’un seul noeud.
Hypothèse d’induction:
Soit n ≥ 0 et supposons que P (n) est vrai.
Pas d’induction: Nous devons montrer que P(n+1) est vrai. Soit T , un arbre binaire de profondeur n + 1. Par définition, T possède au plus deux
sous-arbres et ceux-ci ont une profondeur d’au plus n. Par hypothèse
d’induction chaque sous arbre possède au plus 2n feuilles. L’arbre T
possède donc au plus 2 · 2n = 2n+1 feuilles, ce qui montre que P (n + 1)
est vrai.
Conclusion: Par le principe de l’induction généralisée, nous avons que P (n)
est vrai pour tout n ≥ 1.
Dans certain cas l’induction mathématique simple que nous venons de voir
n’est pas suffisante et nous devons utiliser une version plus puissante:
Principe de l’induction mathématique généralisée: Soit P : N ⇒ {V, F }
un prédicat et k ≥ 0 une constante. Si les deux conditions suivantes sont vérifiées:
1. P (k) est vrai
2. Pour tout n > k, P (k) ∧ P (k + 1) ∧ · · · ∧ P (n − 1) ⇒ P (n) est vrai
alors P (m) est vrai pour tout m ≥ k.
11
Exemple 19 Soit P : (N ) ⇒ {V, F, } le précicat défini par: P (n) = V si et
seulement si tous les arbres binaires de n noeuds ont une profondeur d’au moins
blog2 nc. On veut montrer par induction mathématique généralisée que P (n) est
vrai pour tout n ≥ 1.
Base: P (1) est vrai car s’il n’y a qu’un seul noeud alors la profondeur est 0.
Hypothèse d’induction:
soient vrais.
Soit n > 1. Supposons que P (1), . . . , P (n − 1)
Pas d’induction: Nous devons montrer que P (n) est vrai. Soit T , un arbre
contenant n noeuds. Puisque n > 1 alors T possède un sous-arbre dont
la taille est au moins d(n − 1)/2e noeuds. Par hypothèse d’induction, la
profondeur de S est au moins: blog2 d(n − 1)/2ec. Par le Lemme 1 on a :
blog2 d(n − 1)/2ec = blog2 nc − 1
La profondeur de T est donc au moins blog2 nc ce qui montre que P (n)
est vrai.
Conclusion: Par le principe de l’induction généralisée, nous avons que P (n)
est vrai pour tout n ≥ 1.
Lemme 1 blog2 d(n − 1)/2ec = blog2 nc − 1
Preuve. Nous allons distinguer les cas où n est pair et impair.
Si n est pair alors d(n − 1)/2e = n/2. On a donc blog2 d(n − 1)/2ec =
blog2 n/2c = blog2 n − 1c = b log2 nc − 1
Si n est impair alors blog2 (n − 1)c = blog2 nc. On a donc blog2 d(n − 1)/2ec =
blog2 (n − 1)/2c = blog2 (n − 1) − 1c = blog2 (n − 1)c − 1 = blog2 nc − 1
12