TD 3
TD 3
TD 3
6. pour i de 1 à n faire
pour j de 1 à n faire 9. tant que n >= 0 faire
pour k de 1 à n faire op op
n := n / 2
1
x Exercice 4. (Somme des entrées d’un tableau).
On considère l’algorithme suivant :
s <- 0
i <- 0
tant que i < n faire
s <- s + T[i]
i <- i + 1
retourner s
n−1
X
On veut montrer que l’algorithme calcule T[i].
i=0
1. On considère une étape de boucle. On note s et s0 les valeurs de la variable s avant et après
l’étape de la boucle i et i0 les valeurs de la variable i avant et après l’étape de la boucle. Montrer
0
i−1
X iX −1
0
que si s = T[j] alors s = T[j].
j=0 j=0
i−1
X
On appelle l’énoncé « à la fin d’une étape de boucle, les variables s et i vérifie l’égalité s = T [j] »
j=0
un invariant de boucle.
2. Montrer que avant la boucle l’invariant est vérifié.
Pn−1
3. En déduire que à la fin de la boucle s = j=0 T [j].
4. Montrer que la complexité de cet algorithme est Θ(n). Peut-on faire mieux ?
2
x Exercice 6. (Écriture d’un nombre en base 2).
1. Décrire deux méthodes pour convertir un nombre n en base 2.
On considère l’algorithme suivant.
Entrée : un entier n et un tableau T alloué.
Sortie : un tableau T et un entier i
n2 = n
i = 0
tant que n2 > 0 faire
T[i] = n2 mod 2
n2 = n2 / 2
i = i + 1
retourner T, i
2. Montrer que pour tout i, à la fin de la i-ème étape de boucle
i−1
X
n = n2 × 2i + T[j] × 2j .
j=0
x Exercice 7. (Calcul de an ).
1. Écrire un algorithme qui prend en paramètre un nombre a et un entier positif ou nul n et qui
retourne an .
2. À l’aide d’un invariant de boucle montrer que l’algorithme est correct.
3. Quel est la complexité de cet algorithme.
On considère maintenant l’algorithme suivant
Entrée : un nombre a et un entier positif n
Sortie : p
n2 = n
a2i = a
res = 1
tant que n2 > 0 faire
si n2 mod 2 == 1 alors
res = res*a2i
n2 = n2 / 2
a2i = a2i*a2i
return res
4. Quel est le nombre d’étapes de boucle ?
5. Montrer que à la fin de chaque étape de boucle, on a
an = res × a2in2 .
6. En déduire que l’algorithme retourne ai .
3
x Exercice 8. Calcul de n!
On considère l’algorithme suivant
Entrée: n>0
Sortie: n!
res <- 1
n2 <- n
tant que n2>0 faire
res <- res*n2
n2 <- n2 - 1
retourner res
n
Y
1. Montrer que l’invariant res = i est vrai au départ de la boucle et conservé ensuite. En
i=n2+1
n
Y
déduire que le programme retourne n! = i.
i=1
2. Quel est la complexité de cet algorithme ?
√
x Exercice 9. Calcul de b nc
On considère l’algorithme suivant où toutes les variables contiennent des entiers.
1. Montrer que l’invariant inf2 ≤ n < sup2 est vrai au départ de la boucle et conservé ensuite.
√
2. En déduire que si le programme termine ; il retourne b nc.
3. Montrer que la différence sup − inf diminue strictement à chaque étape de boucle. En déduire
que le programme termine.
4. Quelle est la complexité ?