Adloun

Écrire est fini(p, q) qui décide si la fraction p/q a un développement…

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Automatiser le développement binaire

Énoncé

Écrire est_fini(p, q) qui décide si la fraction a un développement binaire fini, sans calculer ce développement. Tester sur , , , , .

Corrigé

La règle du cours : après réduction, le dénominateur ne doit contenir que des facteurs . On réduit avec le PGCD, puis on retire tous les facteurs : il doit rester .


from math import gcd


def est_fini(p, q):
    """Vrai si p/q a un developpement binaire fini.

    Precondition : q > 0. On reduit la fraction, puis on retire tous
    les facteurs 2 du denominateur : il reste 1 exactement quand ce
    denominateur etait une puissance de deux.
    """
    assert q > 0, "le denominateur doit etre strictement positif"
    d = q // gcd(p, q)
    while d % 2 == 0:
        d = d // 2
    return d == 1

>>> [est_fini(p, q) for p, q in
...  [(1, 2), (5, 8), (1, 10), (1, 3), (6, 8)]]
[True, True, False, False, True]

Pourquoi la réduction est indispensable. n'a pas un dénominateur « déjà réduit » utile : , la fraction vaut , et est bien une puissance de deux — la réponse est vrai. À l'inverse : la réduction ne sauve rien, reste, la réponse est faux.

Erreur attendue : oublier le gcd et tester directement si est une puissance de deux. On répondrait faux pour , qui est pourtant , exact.

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.