1 Polynômes 2 Algorithme de Horner

publicité
Lycée Sainte Geneviève
BCPST 2
Polynômes.
Python
1
Polynômes
Pour représenter les polynômes avec Python, on peut utiliser le module numpy.
représente le polynôme an xn + . . . + a0. poly1d([an,...,a0],True) représente le polynôme (X −
.
Si p est un polynôme alors p.order donne son degré ; p.coeffs donne ses coecients.
ou
donne les racines (dans C) de p.
ou
évalue le polynôme p au point a (en utilisant l'algorithme d'Horner).
• poly1d([an,...,a0])
an ) . . . (X − a0 )
•
• p.roots
roots(p)
• p(a)
polyval(p,a)
2
Algorithme de Horner
Soient a ∈ K et P =
n
X
bk X k
. On souhaite calculer P (a).
k=0
Naïvement, on calcule les puissances de a, on multiplie les résultats par les coecients bk puis on additionne le tout. Combien
cela fait d'opérations (additions et multiplications)?
L'algorithme d'Horner permet de calculer P (a) avec beaucoup moins d'opérations ; ce qui est intéressant quand P a un très
grand degré. Il repose sur l'égalité suivante :
P (X) = ((. . . ((bn X + bn−1 ) X + bn−2 ) X + . . .) X + b1 ) X + b0
En clair on commence par calculer bn a + bn−1 puis on multiplie le résultat par a et on ajoute bn−2 , etc... Chaque étape
requiert une addition et une multiplication et donc en tout on a 2n opérations.
On peut implémenter cet algorithme en Python. Par exemple si on a un polynôme p, on peut construire la liste de ses
coecients avec p.coeffs (i.e. [bn , bn−1, . . . , b0]) puis appliquer l'algorithme à cette liste :
• soit de manière itérative :
def horner(L,a):
R=0
for k in range(0,len(L)):
R=R*a+L[k]
return(R)
•
soit de manière récursive :
def horner(L,a):
if len(L)==0:
return(0)
else:
b=L[len(L)-1]
L1=L[0:len(L)-1]
return(horner(L1,a)*a+b)
1
Téléchargement