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é.