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