Informatique Pour Tous page 4/4 PCSI1 2013-2014
après la dernière itération, max est la valeur la plus élevée de toute la liste soit lst[0 : len(lst)+1].
Les trois conditions nécessaires sont vérifiées donc la correction est démontrée
.
c) Évaluer la complexité en temps dans le pire des cas de cet algorithme
Avant la boucle for, il y a une affectation.
À chaque itération (une gestion du compteur), il y a un test et au pire une affectation soit 3
instructions simples au pire.
Il y a len(lst) itération donc, en notant
n
la longueur de la liste, le nombre d’opération est au pire
3
n
+ 1.
La complexité en temps est donc en
O(n).
14. Recherche d’un algorithme
Étant données deux entiers a et b (tels que a > b), on définit la suite (r
i
)
i
par :
r
0
= a, r
1
= b. tant que r
i
≠
≠≠
≠
0, r
i+1
= r
i–1
– r
i
×
××
×
q
i
avec |r
i+1
|
≤
|r
i
|
Si r
n+1
= 0, r
n–1
= r
n
×
××
×
q
n
et l’on constate facilement que r
n
est le PGCD de a et b.
(PGCD signifie Plus Petit Commun Diviseur).
Propriété 1: si a = bq + r alors PGCD(a, b) = PGCD(b , r)
Propriété 2 : PGCD(a, 0) = a
a) Définir une fonction pgcd(a, b) qui reçoit en argument deux entiers a et b puis
retourne le PGCD de a et b. Compléter le tableau d’état ci-dessous pour a = 753 et b = 246
t D d r
0 753 246 15
1 246 15 6
2 15 6 3
3630
def pgcd( a , b) :
if a > b :
D , d = a , b
else
D , d = b , a
r = D % d
while ( r != 0 ) :
D = d
d = r
r = D % d
return d
pgcd(753, 246)= 3
b) Démontrer la terminaison de cet algorithme
On prend comme
fonction de terminaison
T
=
r.
Par définition du reste de la division
euclidienne, c’est un entier positif.
Par construction, la suite
(r
)
est décroissante donc
T
est une fonction positive décroissante qui
finira par devenir nulle ou négatif.
La boucle while se
termine
alors.
c) Démontrer la correction de cet algorithme à l’aide des propriétés 1 et 2.
On propose comme invariant de boucle la propriété I = {le PGCD de (d ,r) est le PGCD de (D, d)}
avant la première itération D = d×q + r. D’après la propriété 1, on a bien PGCD de (d ,r) est le PGCD de
(D, d)
Si I est vraie avant une itération, le PGCD de (d ,r) est le PGCD de (D, d). Pendant la boucle, D’ devient d
et d’ devient r donc le PGCD de (D’ ,d’) est le PGCD de (d ,r). Comme D’ = d’×q’ + r’, le PGCD de (D’ ,d’)
est aussi le PGCD de (d’, r’). Donc le PGCD de (d’, r’) est le PGCD de (d ,r) qui est le PGCD de (D, d).
après la dernière itération, r = 0 donc le PGCD de (d,0) = d. d’après la propriété 2 C’est le PGCD de (D, d)
d’après l’invariant I et l’algorithme renvoie bien ce PGCD.
Les trois conditions nécessaires sont vérifiées donc la correction est démontrée