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