Adloun

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
4818 :
3018 :
1218 :
126 :
66 : 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.