Adloun

NSI (première) · Chapitre 3 · Exercice de TD

Voici le calcul du PGCD par soustractions successives

Langages et programmation · Constructions élémentaires, traces et terminaison · niveau 3 (difficile)

É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.

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →