Algorithmique
Feuille d’exercices 2: correction et terminaison des boucles
Prenons quelques tˆaches simples, pour lesquelles on demande d’´ecrire un algorithme qui la remplit, de
d´emontrer sa correction et, si n´ecessaire, sa terminaison. Ce sont plus des exercices de r´edaction que de
r´eflexion. Les points `a ne pas n´egliger :
— ´enoncer clairement les invariants de boucle
— justifier leur invariance
— v´erifier qu’ils sont vrais avant la boucle pour en conclure qu’ils sont vrais apr`es celle-ci.
Si on montre la terminaison avec un variant de boucle :
— indiquer clairement ce dernier en tant que variant de boucle
— au moins mentionner le fait qu’il ne prend que des valeurs enti`eres, mˆeme si c’est ´evident
— justifier sa d´ecroissance stricte d’une it´eration `a la suivante
— justifier le fait qu’il ne peut pas d´ecroˆıtre ind´efiniment (qu’il doit rester positif, par exemple)
Les deux premiers exercices sont corrig´es pour donner un exemple du niveau de formalisme attendu.
1. pgcd de aet b: On choisit l’algorithme d’Euclide, avec une pr´ecaution au d´ebut pour s’assurer de la
positivit´e des arguments :
a=abs(a)
b=abs(b)
while b>0:
r=a%b
a=b
b=r
d=a
Correction : On note a0et b0les valeurs initiales de aet b. La positivit´e de aet b, le fait que pgcd(a,
b)=pgcd(a0,b0), sont des invariants de la boucle :
— si best positif avant une it´eration, aqui prend sa valeur au cours de cette it´eration sera positif apr`es
cela. La valeur de bapr`es une it´eration est le reste de la division euclidienne de deux naturels :
elle est donc positive.
— en notant aiet biles valeurs de aet bavant une it´eration, et afet bfleurs valeurs apr`es cette
it´eration, on a af=biet ai=q×bi+bfpour un certain entier q. Comme aiet bisont des
combinaisons enti`eres de afet bf, et r´eciproquement afet bfsont des combinaisons enti`eres de
aiet bi, on a pgcd(ai,bi)=pgcd(af,bf)
Ces invariants ´etant vrais avant l’entr´ee dans la boucle, ils le sont encore `a sa sortie. D’apr`es la
condition de sortie de boucle, on a b= 0 `a ce moment-l`a, ce qui permet de conclure que a, et donc d,
vaut pgcd(a0,b0).
Terminaison : best un variant de boucle : il est ´evidemment `a valeurs enti`eres, et `a chaque it´eration,
sa valeur finale bfest le reste dans une division euclidienne par sa valeur initiale, bi: on a donc
0≤bf< biet par cons´equent bd´ecroˆıt strictement `a chaque it´eration. Comme il doit rester positif
d’apr`es la condition de la boucle, ceci prouve la terminaison de cette boucle.
2. ´
Ecrire un algorithme qui prend une liste tet une valeur x, et d´etermine si xest un ´el´ement de t.
R´eponse :
1