Exemples de preuves d’algorithmes Algorithme de la division euclidienne Lycée Victor Hugo

Lycée Victor Hugo MPSI-PCSI 2016-2017
Exemples de preuves d’algorithmes
Algorithme de la division euclidienne
Algorithme de division euclidienne
def division_euclidienne (a, b):
""" Division eucl idi enne de a par b.
a : entier positif
b : entier str ictem ent pos it if
Ré ponse : (q , r) , quo tient et reste .
"""
r=a
q=0
whi le r >= b:
r = r -b
q = q +1
return (q , r )
Terminaison
Notons rkla valeur de la variable rà la fin du k-ième passage dans la boucle while (donc avant un
éventuel k+ 1-ième passage). On a r0=ala valeur avant le premier passage dans la boucle.
On observe qu’en cas de (k+1)-ième passage dans la boucle while, on a rk+1 =rkb < rk(car b > 0).
Donc si l’algorithme ne se termine pas, la suite (rk)kNest une suite strictement décroissante d’entiers
positifs (rk>bpour tout kvia le test d’entrée dans la boucle) ce qui n’existe pas. Donc l’algorithme
se termine bien.
Correction
On numérote les itérations de la boucle while par ià partir de 1et on note riet qile contenu des
variables ret qà la fin de la i-ième itération et r0et q0sont les valeurs avant une éventuelle première
entrée dans la boucle.
On définit (ce qu’on espère être un invariant de boucle) H(i): « a=b qi+riet ri>0».
*initialisation
Avant d’entrer dans la boucle, compte-tenu des initialisations r0=aet q0= 0. Ainsi bq0+r0= 0+a=a
et r0>0car aest positif d’après la documentation de la fonction, donc H(0) est vraie.
*hérédité
Supposons H(i)vraie et que l’itération numéro i+ 1 a lieu.
On a donc b qi+ri=aet ri>b(condition pour avoir un i+1-ième passage dans le boucle). L’exécution
de la boucle donne ri+1 =rib>0et qi+1 =qi+1. Ainsi b qi+1 +ri+1 =b(qi+1)+(rib) = bqi+ri=a.
H(i+ 1) est vraie.
*exploitation
À la sortie de la boucle (on suppose que l’on effectue ppassages dans cette dernière), on a donc
a=b qp+rpet rp>0et la condition rp>bn’est pas vérifiée car on ne fait pas de p+ 1-ième passage
dans la boucle while. Ainsi rp< b donc 06rp< b et a=b qp+rpdonc qpet rpsont donc bien
quotient et reste dans la division euclidienne de apar b.La fonction est valide.
1
Lycée Victor Hugo MPSI-PCSI 2016-2017
Algorithme du maximum
Algorithme du calcul du maximum d’une liste non vide
def maxim um ( L ) :
""" Retourne la valeur m ax im al e des élé ments d une liste L .
L est une liste de nombres , sup pos ée non vide .
"""
maxi = L [0]
for iin ran ge (1 , len (L)):
if L [ i ] > maxi :
maxi = L[i]
return maxi
Terminaison
La terminaison de cette fonction est garantie car il y a seulement une boucle for inconditionnelle, qui
n’est exécutée qu’un nombre fini de fois (ici la longueur de la liste moins 1).
Correction
Pour prouver que le résultat final est correct on définit ce qu’on espère être un invariant de boucle :
Soit nla longueur de la liste Let H(k)l’affirmation : « À la fin de l’itération pour i=kdans la
boucle for, la valeur maxikde la variable maxi est le maximum de la liste [L[0], ..., L[k]] ».
H(0) désigne la même propriété juste avant d’entrer dans la boucle. Ainsi H(k)est définie pour k < n.
*initialisation
Avant d’entrer dans la boucle, via l’initialisation maxi0=L[0], c’est bien le maximum de la liste à un
élément [L[0]] :H(0) est vraie.
*hérédité
Supposons H(k)vraie pour un entier kJ0, n 2K(pour qu’un passage de plus dans la boucle ait
lieu). Au début de l’itération pour i=k+ 1,maxikest donc le maximum de [L[0], ..., L[k]].
Deux cas possibles se présentent :
ou bien L[k+1] > maxik, ce qui signifie que L[k+1] est plus grand que tous les termes pré-
cédents de la liste. Dans ce cas L[k+1] est le maximum de la liste [L[0], ..., L[k+1]], et
c’est la valeur maxik+1.
ou bien L[k+1] 6maxik: dans ce cas le maximum de [L[0], ..., L[k+1]] est le même que
celui de [L[0], ..., L[k]]. Comme la valeur de max n’est pas modifié, on a aussi maxik+1 =
maxik.
Dans les deux cas, H(k+ 1) est vraie.
*exploitation
À la sortie de la boucle, on a i=n1. Or par récurrence (limitée) H(n1) est vraie donc la variable
codemax contient le maximum de [L[0], ..., L[n-1]] autrement dit de la liste Lcomplète. La
fonction est valide.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !