Adloun

mathématiques approfondies (ECG 1re année) · Chapitre 2 · Exercice

Le schéma de Horner

Polynômes · Identification et calcul effectif · niveau 3 (difficile)

É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 ne forme jamais ces puissances isolées : il est en général 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é.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre