Adloun

Le schéma de Horner

Exercice · niveau 3 (difficile) · mathématiques approfondies (ECG 1re année), chapitre 2 — Polynômes · Identification et calcul effectif

Énoncé

Écrire une fonction Python horner(coefs, x) qui évalue un polynôme par le schéma de Horner (). Combien de multiplications effectue-t-elle, contre l'évaluation naïve terme à terme ?

Corrigé


def horner(coefs, x):
    # coefs = [a0, a1, ..., an], du degre 0 au degre n
    r = 0
    for a in reversed(coefs):
        r = r * x + a
    return r

def naif(coefs, x):
    return sum(a * x**i for i, a in enumerate(coefs))

Le compte, pour un polynôme de degré .

Horner : la boucle fait tours, chacun avec une multiplication (le premier tour la fait sur , donc sont utiles). Total : multiplications et additions.

Naïf : calculer par produits répétés coûte multiplications, plus une pour . En sommant sur , on obtient de l'ordre de multiplications — une croissance quadratique.

Pour : multiplications contre environ .

Et ce n'est pas seulement une question de vitesse. La forme naïve calcule des puissances énormes ou minuscules avant de les recombiner, ce qui, en flottants, détruit des chiffres significatifs. Horner n'évalue jamais rien de plus grand que le résultat lui-même : il est aussi plus stable.

Un bonus. Le tableau des valeurs intermédiaires de r donne les coefficients du quotient de par : le schéma de Horner est la division euclidienne par un facteur du premier degré.

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.