Académique Documents
Professionnel Documents
Culture Documents
Mehdi Mekkaoui
CPGE Tanger
Lycee Moulay Al Hassan
cpge.mekkaoui@gmail.com
19 décembre 2023
Introduction et problématique Rappel Récurrence Correction Terminaison
Introduction
la définition d’un algorithme consiste à passer par des normes , pour garantir
que ce programme fonctionne correctement et facilement , ces normes sont
décrites par trois axes d’études :
la terminaison
1/27
Introduction
la définition d’un algorithme consiste à passer par des normes , pour garantir
que ce programme fonctionne correctement et facilement , ces normes sont
décrites par trois axes d’études :
la terminaison
la correction
1/27
Introduction
la définition d’un algorithme consiste à passer par des normes , pour garantir
que ce programme fonctionne correctement et facilement , ces normes sont
décrites par trois axes d’études :
la terminaison
la correction
complexité ( à voir dans la deuxième année )
1/27
Pour les deux premières normes (notre cours) , on peut bien voir leurs utilité
( rôle ) , en essayant de répondre sur les questions :
est ce que ce programme termine ?
2/27
Pour les deux premières normes (notre cours) , on peut bien voir leurs utilité
( rôle ) , en essayant de répondre sur les questions :
est ce que ce programme termine ?
ce programme rend t-il le résultat correct ?
2/27
Pour les deux premières normes (notre cours) , on peut bien voir leurs utilité
( rôle ) , en essayant de répondre sur les questions :
est ce que ce programme termine ?
ce programme rend t-il le résultat correct ?
Donc ceci est un outil logique pour pouvoir prouver que votre
programme rend bien le résultat attendus
2/27
Induction / récurrence
3/27
Induction / récurrence
3/27
Induction / récurrence
3/27
Induction / récurrence
3/27
Induction / récurrence
3/27
Induction / récurrence
3/27
récurrence simple
récurrence Double
récurrence forte
...
4/27
n n−k k
(a + b)n = Σni=0 a b
k
5/27
6/27
7/27
Définition 1
Il s’agit de montrer que la sortie produite vérifie la postcondition de l’algorithme
(quelle que soit l’entrée vérifiant la précondition). Pour cela, on utilise la notion
d’invariant de boucle. Il s’agit d’une propriété attachée à une boucle qui :
Est vraie initialement, avant de commencer la boucle ;
Est maintenue vraie par toute itération de la boucle, d’où son nom d’invariant.
8/27
9/27
9/27
9/27
Exemple
1 def somme1 ( n ) :
2 s = 0
3 for i in range ( n ) :
4 s += i
5 return s
10/27
Exemple
1 def somme1 ( n ) :
2 s = 0
3 for i in range ( n ) :
4 s += i
5 return s
10/27
INITIALISATION
(L’invariant est-il vrai avant la première itération ?) Vérifions que
l’invariant est vrai pour i = 0 (c’est-à-dire que s = Σ0k=0 k = 0. Avant
l’entrée dans la boucle, s = 0 ( une somme vide est nulle ) donc on a bien
s = 0 = Σ0k=0 k.
11/27
INITIALISATION
(L’invariant est-il vrai avant la première itération ?) Vérifions que
l’invariant est vrai pour i = 0 (c’est-à-dire que s = Σ0k=0 k = 0. Avant
l’entrée dans la boucle, s = 0 ( une somme vide est nulle ) donc on a bien
s = 0 = Σ0k=0 k.
CONSERVATION
(L’invariant est-il maintenu vrai par une itération de la boucle ?)
Supposons que l’invariant soit vrai au début de l’itération d’indice i-1 de
boucle, c’est-à-dire que l’invariant de l’itération précédente est vrai : s =
Σik−=10 k. après , on a l’itération s+=i dont la quelle on affecte a s la valeur
de s + i alors , s = Σki−=10 k + i = Σik=0 k
11/27
INITIALISATION
(L’invariant est-il vrai avant la première itération ?) Vérifions que
l’invariant est vrai pour i = 0 (c’est-à-dire que s = Σ0k=0 k = 0. Avant
l’entrée dans la boucle, s = 0 ( une somme vide est nulle ) donc on a bien
s = 0 = Σ0k=0 k.
CONSERVATION
(L’invariant est-il maintenu vrai par une itération de la boucle ?)
Supposons que l’invariant soit vrai au début de l’itération d’indice i-1 de
boucle, c’est-à-dire que l’invariant de l’itération précédente est vrai : s =
Σik−=10 k. après , on a l’itération s+=i dont la quelle on affecte a s la valeur
de s + i alors , s = Σki−=10 k + i = Σik=0 k
CONCLUSION
(On utilise l’invariant en sortie de boucle pour prouver que l’algorithme
donne le bon résultat) En particulier, l’invariant sera toujours vrai après
la dernière itération de la boucle, celle d’indice i = n – 1. Au début de
−2
cette dernière itération on a s = Σnk= 0 k et après les instructions de la
n−1
dernière itération on a s = Σk=0 k. Autrement dit, après l’exécution de
l’algorithme, la variable s est bien la somme de tous les éléments de 0
jusqu’au n . Cela prouve la correction partielle de l’algorithme. 11/27
Terminaison
Définition
On dit que l’exécution d’un algorithme se termine si elle produit un résultat
en temps fini quelles que soient les données d’entrées fournies vérifient les
préconditions.
12/27
Terminaison
Définition
On dit que l’exécution d’un algorithme se termine si elle produit un résultat
en temps fini quelles que soient les données d’entrées fournies vérifient les
préconditions.
12/27
Terminaison
Définition
On dit que l’exécution d’un algorithme se termine si elle produit un résultat
en temps fini quelles que soient les données d’entrées fournies vérifient les
préconditions.
Remarque
alors il est claire que seul les boucle indéterministes et fonctions récursives
peuvent poser un problème dans le teste du terminaison d’un programme
13/27
Remarque
alors il est claire que seul les boucle indéterministes et fonctions récursives
peuvent poser un problème dans le teste du terminaison d’un programme
13/27
Remarque
alors il est claire que seul les boucle indéterministes et fonctions récursives
peuvent poser un problème dans le teste du terminaison d’un programme
13/27
Preuve de terminaison
14/27
Preuve de terminaison
Remarque
Donc le variant est un entier qui diminue strictement à chaque itération et
qui reste positif. Il ne peut donc prendre qu’un nombre fini de valeurs, ce
qui prouve que le nombre d’itérations de la répétitive tant que est fini, donc
celle-ci termine.
14/27
boucle : for
Exemple
1 for i in range (3 ,10) :
2 print ( i )
15/27
Boucle : while
16/27
Boucle : while
Remarque
Dans ce cas on pourra (comme dans la boucle déterministe ) la structure
représentant une suite décroissante minorée ( croissante majorée ) pour
démontrer que cette dernier termine
16/27
Dans l’autre cas - D’une boucle non simple - on ferra appelle à une structure
de récurrence ( Induction "vu au début" )
17/27
Dans l’autre cas - D’une boucle non simple - on ferra appelle à une structure
de récurrence ( Induction "vu au début" ) Quel type d’induction alors ? !
1 Simple
2 double
17/27
Dans l’autre cas - D’une boucle non simple - on ferra appelle à une structure
de récurrence ( Induction "vu au début" ) Quel type d’induction alors ? !
1 Simple
2 double
3 forte
17/27
récurrence simple
récurrence Double
récurrence forte
18/27
récurrence simple
récurrence Double
récurrence forte
induction structurelle
18/27
Induction Structurelle
Définition
Le schéma de la démonstration précédente est applicable a tous les types de
données définis récursivement. On peut se passer de l’induction sur le
nombre d’applications des règles en invoquant le principe d’induction
structurelle.
19/27
récurrence simple
récurrence Double
récurrence forte
induction structurelle
20/27
récurrence simple
récurrence Double
récurrence forte
induction structurelle
induction bien fondée
20/27
Définition
Soit E un ensemble ordonné par ≤ et F ⊆ E.
x est un élément minimal de F si F ne contient pas d’élément strictement
plus petit que x.(y ∈ F , y ≤ x implique x = y).
Un ordre bien fondé ≤ sur un ensemble E est un ordre tel que tout
sous-ensemble non-vide de E admet un élément minimal, et (E, ≤) est
dit bien fondé.
21/27
Définition
Soit E un ensemble ordonné par ≤ et F ⊆ E.
x est un élément minimal de F si F ne contient pas d’élément strictement
plus petit que x.(y ∈ F , y ≤ x implique x = y).
Un ordre bien fondé ≤ sur un ensemble E est un ordre tel que tout
sous-ensemble non-vide de E admet un élément minimal, et (E, ≤) est
dit bien fondé.
Motivation
Allons alors utiliser cette forme induction sur un exemple !
21/27
Exemple 1
1 d ,f , p =1 ,10 ,2
2 i=d
3 while i < f :
4 print ( i )
5 i += p
soit n ∈ N avec n = f - i
Initiation donc ( n = 10 - 1 = 9 au debut de la boucle )
Induction : soit n1 ∈ N valeur de n dans l’itération i n1 = f - i = 10 - i et
on pose n2 valeur de n dans l’itération i+p (i+2) n2 = f - i - 2 = 10 - i - 2 = 8
- i donc V(n2 ) ≤ V(n1 ) donc dans E = [0,10] on a bien (E,≤) .
Conclusion : Pas induction bien Fondée la boucle termine
22/27
1 def pgcd (a , b ) :
2 u = max (a , b )
3 v = min (a , b )
4 w = u%v
5 while w != 0 :
6 u=v
7 v=w
8 w=u%v
9 return v
23/27
1 def pgcd (a , b ) :
2 u = max (a , b )
3 v = min (a , b )
4 w = u%v
5 while w != 0 :
6 u=v
7 v=w
8 w=u%v
9 return v
23/27
1 def pgcd (a , b ) :
2 u = max (a , b )
3 v = min (a , b )
4 w = u%v
5 while w != 0 :
6 u=v
7 v=w
8 w=u%v
9 return v
23/27
1 Cas de base :
pour le case de base : si v et multiple de u alors la boucle termine et le
résultat sûrement est la valeur la plus petite entre les deux ( v ) .
2 Induction :
Considérons la fonction V (u, v, w) −→ w, soit l’état s := (u −→ uk , v −→
vk , w −→ wk ) obtenu après k passage dans la boucle, et supposons
qu’elle existe une itération suivante, soit s′ := (u −→ uk+1 , v −→ vk+1 , w
−→ wk+1 ) l’état obtenu après l’exécution sur s du corps de la boucle.
On a :
uk+1 = vk ,
vk+1 = wk ,
wk+1 = uk+1 %vk+1 =⇒ q ∈ N : uk+1 = qvk+1 + wk+1
tel que : 0 ≤ wk+1 < vk+1 = wk
V (s) ∈ N, V (s′ ) ∈ N et V (s′ ) < V (s)
3 Conclusion
Donc V est variant de boucle dans N, par suite l’algorithme se termine
24/27
Fonction recursive
25/27
Exemple 2 : Fibonacci
1 def fib ( n ) :
2 if n == 0 or n == 1 :
3 return n
4 return fib (n -1) + fib (n -2)
26/27
Exemple 2 : Fibonacci
1 def fib ( n ) :
2 if n == 0 or n == 1 :
3 return n
4 return fib (n -1) + fib (n -2)
26/27
Exemple 3
1 def p u i s s a n c e _ D e u x _ I n f e r i e u r e ( Nombre ) :
2 i =0
3 while 2** i < Nombre :
4 i +=1
5 if i >0 :
6 return 2**( i -1)
7 else :
8 return 1
27/27