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