Un binôme sans factorielles
Exercice · niveau 3 (difficile) · mathématiques approfondies (ECG 1re année), chapitre 1 — Raisonnement et vocabulaire ensembliste · Coefficients binomiaux
Énoncé
Écrire une fonction Python binomial(n, p) qui calcule sans passer par les factorielles. Comparer, sur , la taille des nombres manipulés par les deux approches.
Corrigé
def binomial(n, p):
if p < 0 or p > n:
return 0
p = min(p, n - p) # symetrie : moins d'iterations
r = 1
for i in range(p):
r = r * (n - i) // (i + 1) # division EXACTE a chaque tour
return r
Le principe. On utilise , en effectuant la division à chaque tour. Elle tombe toujours juste : après tours, r vaut , qui est entier — c'est ce qui autorise le //.
Les tailles en jeu. Pour :
La voie factorielle construit donc un nombre de chiffres pour en obtenir un de , avant de tout simplifier. Notre boucle ne dépasse jamais le résultat final.
Ce que cela change. En Python, les entiers sont de taille arbitraire : les deux méthodes donnent le même résultat exact, seule la vitesse souffre. Dans un langage à entiers bits, la version factorielle déborderait dès et rendrait un résultat faux sans le moindre avertissement, là où celle-ci reste juste jusqu'à .
La ligne exploite : pour , elle ramène tours à un seul.
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.