Algorithme
1. Une définition
Un algorithme est la description d'une succession de directives permettant de passer, en un
nombre fini d'étapes, d'un état initial comportant un nombre fini de données à un état final qui
est son objectif.
L'exécution d'un algorithme ne doit pas laisser place à l'interprétation ou à l'imagination.
Exemple :
Trier en ordre croissant les listes T = [1,6,1,8,0,3,3,9,8,8,7,5] et U = [7,6,5,4,3,2,1].
Le tri de la liste U se fait sans problème mentalement, alors que ce sera le pire cas dans
certains algorithmes de tri.
Remarque :
Les problèmes algorithmiques ne sont pas spécifiques aux mathématiques.
Par exemple : trier une liste de noms par ordre alphabétique, trouver un mot dans un
dictionnaire, sortir d'un labyrinthe ...
2. Un exemple décliné dans différents langages
Pour un problème simple, l'algorithme de résolution ne dépend pas du langage utilisé.
Toutefois, selon le type de problème, certains langages seront mieux adaptés que d'autres.
Problème : on souhaite calculer le 51
ème
terme de la suite de Fibonacci définie par :
u
0
=0 et u
1
=1
∀n∈ℕ ,u
n2
=u
n
u
n1
.
Algorithme : lire n (ici, n = 50)
U← 0 ; V← 1 ; W← 1 ; i← 2 (*)
tant que i < n faire (*)
U← V
V← W
W← U + V
i ← i+1
afficher W (*)
Voir en annexe l'implémentation dans différents langages.
3. Preuve d'un programme
En programmation impérative, il est important de prouver deux choses :
- la terminaison du programme
Il a été montré par Gödel qu'il ne pouvait pas exister de programme universel capable de
déterminer si un programme donné se termine pour tous ses arguments.
Toutefois, pour un programme donné, on peut prouver qu'il se termine en un nombre fini
d'étapes.
Dans l'exemple ci-dessus, la boucle est décrite n – 2 fois.
- la validité du programme
Il existe une théorie entière consacrée à la preuve formelle de programmes. On s'intéresse ici
seulement aux boucles (for et while) dans un programme impératif. On utilise un invariant de
boucle pour prouver ce type de programme.
Exemple :
Dans l'algorithme ci-dessus, la propriété (V = u
i-1
et W = u
i
) est toujours vérifiée au niveau des
(*). Elle est clairement vérifiée au début ; si elle est vérifiée à l'étape i, elle l'est aussi à l'étape i
+ 1. Elle est donc vérifiée en sortie de boucle. Comme dans ce cas, i = n, l'algorithme affiche
bien u
n
. On dit que la propriété (V = u
i-1
et W = u
i
) est un invariant de boucle.
Bilan : Pour prouver un programme en utilisant un invariant de boucle, il faut :
- Définir une pré-condition qui décrit l'état des variables avant d'entrer dans la boucle.
- Prouver que l'invariant de boucle est vrai à chaque passage dans la boucle.
- La condition de sortie de boucle, en conjonction avec l'invariant de boucle, permet de
prouver une post-condition, ce qui valide le programme.
On peut également se servir de l'invariant de boucle pour montrer la terminaison d'un
programme ou pour étudier la complexité d'un programme.
Quelques pistes sur l'algorithmique