Adloun

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.