Voici le calcul du PGCD par soustractions successives
Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 3 — Langages et programmation · Constructions élémentaires, traces et terminaison
Énoncé
Voici le calcul du PGCD par soustractions successives :
while a != b:
if a > b:
a = a - b
else:
b = b - a
Dérouler à la main pour , . Énoncer la précondition, l'invariant de la boucle, et le variant qui garantit l'arrêt. Vérifier ensuite la fonction sur toutes les paires avec .
Corrigé
La trace.
| action | ||
|---|---|---|
| 48 | 18 | : |
| 30 | 18 | : |
| 12 | 18 | : |
| 12 | 6 | : |
| 6 | 6 | : sortie, résultat |
Quatre tours, et .
La précondition. et . Avec et , la boucle ferait indéfiniment : elle ne s'arrêterait jamais.
L'invariant. À chaque tour, est inchangé — c'est la propriété pour . Comme à la sortie et que , la valeur commune est le PGCD des données de départ.
Le variant. La quantité est un entier strictement positif qui décroît strictement à chaque tour, puisqu'on retranche à l'un des deux une valeur . Une suite d'entiers positifs strictement décroissante est finie : la boucle s'arrête.
La vérification.
import math
def pgcd_soustractions(a, b):
"""PGCD de a et b par soustractions. Rend le couple (pgcd, nb de tours).
Precondition : a >= 1 et b >= 1.
"""
assert a >= 1 and b >= 1
tours = 0
while a != b:
if a > b:
a = a - b
else:
b = b - a
tours = tours + 1
return a, tours
for a in range(1, 120):
for b in range(1, 120):
assert pgcd_soustractions(a, b)[0] == math.gcd(a, b)
Les cas passent, et pgcd_soustractions(48, 18) rend (6, 4) : les quatre tours de la trace.
Le défaut de la méthode : pgcd_soustractions(1, 1000) fait 999 tours pour un résultat évident. C'est le variant qui le dit : ne décroît que de à chaque tour. L'algorithme d'Euclide par restes corrige cela — banque supplémentaire.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.