mathématiques approfondies (ECG 1re année) · Chapitre 1 · Exercice
Un binôme sans factorielles
Raisonnement et vocabulaire ensembliste · Coefficients binomiaux · niveau 3 (difficile)
É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 fois 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.
Exercices semblables
- La relation de Pascal, en acte corrigé
- Deux sommes de coefficients binomiaux corrigé
- La formule de Vandermonde corrigé
- Une somme pondérée, par deux chemins corrigé
- Inclusion, réunion, intersection corrigé