I Méthode Horner 1 Le principe Prenons l’exemple de P (x) = 3x5 − 2x4 + 7x3 + 2x2 + 5x − 3. Pour calculer P(x) le calcul classique nécessite . . . . . . multiplications et . . . . . . additions. De même si on généralise Pour calculer P (x) = an xn + an−1 xn−1 + · · · + a1 x + a0 il faut . . . . . . . . . . . . . . . . . . multiplications et . . . . . . . . . . . . . . . additions. Dem : On peut faire de nombreuses économies de calcul en suivant le schéma suivant : P (x) = an xn + · · · + a2 x2 + a1 x +a0 | {z on met x en facteur } = an xn−1 + · · · + a3 x + a2 +a1 x + a0 | = ...... {z on met x en facteur } = (. . . (((an x + an−1 )x + an−2 )x + an−3 ) . . . )x + a0 Ici cela donneP (x) = 3x5 − 2x4 + 7x3 + 2x2 + 5x − 3 = (3x4 − 2x3 + 7x2 + 2x + 5)x − 3 = = = = Avec cette forme de P (x) il y a . . . . . . multiplications et . . . . . . additions. Dans le cas général P (x) = (. . . (((an x + an−1 )x + an−2 )x + an−3 ) . . . )x + a0 Il y a au maximum . . . . . . . . . . . . multiplications et . . . . . . . . . . . . additions (voir moins avec les zéros). Appliquer cet algorithme avec les polynômes suivants. f (x) = 4x3 − 8x2 − 7x − 1 g(x) = 4x4 − 23x2 − 15x − 2 = 1 2 3 4 5 6 7 8 = = = = = Entrées : Les coefficients ai dans l’ordre décroissant des exposants des monômes, le monôme x début n :=degré du polynôme P. Q :=an pour k allant de 1 à n faire Q := Q ∗ x + an−k fin Sorties : Q qui est égal à P(x) sous la forme d’un polynôme de Horner Algorithme 1 : Algorithme de Horner 1 Pour faire les calculs «à la main» il est plus facile de le présenter autrement. Par exemple f (x) = 4x3 − 8x2 − 7x − 1 4 -8 -7 -1 ✄ x 4x (4x − 8)x ((4x − 8)x − 7)x ✂ ✁ 4 (4x − 8) (4x − 8)x − 7 ((4x − 8)x − 7)x − 1 Par exemple pour calculer f(2). Calculer de même pour f (3), P (2). 4 -8 -7 -1 4 -8 -7 -1 3 -2 7 2 5 ✄f ✄f ✄P 8 0 −14 ... ... ... ... ... ... ... ✂2 ✁ ✂3 ✁ ✂2 ✁ 4 0 −7 −15 ... ... ... ... ... ... ... ... ... Donc f (2) = −15. Donc f (3) = . . . . . . Donc P (2) = . . . . . . 2 pour -3 ... ... Démonstration Soit P un polynôme de degré n, x0 un réel. On cherche à déterminer un polynôme Q(x) tel que P (x) = (x − x0 )Q(x) + P (x0 ). Q est forcément un polynôme de degré n − 1 et on a : ➔ P (x) = an xn + · · · + a1 x + a0 ➔ Q(x) = bn−1 xn−1 + · · · + b1 x + b0 . ➔ P (x) = (x − x0 )Q(x) + P (x0 ). Exprimer les coefficients de Q en fonction des coefficients de P et de P (x0 ) (x − x0 )Q(x) + P (x0 ) = (x − x0 )(bn−1 xn−1 + bn−2 xn−2 + · · · + b1 x + b0 ) = = an xn + ( ) xn−1 + · · · + ( ) x2 + ( )x + ( ) Soit en identifiant les coefficients avec P (x) on obtient bn−1 = . . . . . . bn−2 = . . . . . . P an an−1 . . . a2 a1 a0 ✄ ............ ............... x . . . . . . . . . . . . . .. ⇐⇒ ✂ 0✁ a2 = . . . . . . b1 = . . . . . . bn−1 bn−2 . . . b1 b0 P (x0 ) a1 = . . . . . . b0 = . . . . . . a0 = . . . . . . P (x0 ) = . . . . . . On retrouve bien par construction les coefficients (bk ) obtenus avec l’algorithme de Hörner et le dernier coefficient est bien P (x0 ). On a démontré l’existence et l’unicité du polynôme Q(x). an = . . . . . . an−1 = . . . . . . 3 Expérimentation avec xcas Ouvrer xcas et dans un environnement de programme (Alt+p) taper : Horner(C,x):={ local Q,k,n; //les variables locales n:=size(C)-1; // Le degré du polynome P Q:=C[0]; pour k de 1 jusque n faire Q:=(Q*x)+C[k]; fpour; retourne(Q) } Compiler ce programme (F9) et dans une autre entrée tester le avec : L:=[3,-2,7,2,5,-3] Horner(L,2) Horner(L,10000) Horner(L,x) 2 4 Utilisation de cet algorithme Nous avons démontré que P (x) = (x − x0 )Q(x) + P (x0 ) où Q(x) est le polynôme obtenu avec l’algorithme de Hörner. Si x0 est une racine de P alors On trouve p(x0 ) = . . . . . . et donc P (x) = . . . . . . . . . Si on applique l’algorithme on trouve P (x0 ) = 0, mais aussi les coefficients de Q(x). Hörner −1 en complétant le tableau ci dessous. Par exemple calculer f 2 -8 -7 -1 ✞ ☎ 4 −1 ✝2 ✆ ... ... ... ... ... ... ... Donner alors une première factorisation de f (x). En déduire une factorisation «complète» de f (x). Nous allons donc modifier le programme précédent pour faire apparaitre tous les coefficients Horner2(C,x):={ local Q,k,n; n:=size(C)-1; // Le degré du polynome P Q:=[]; // on crée une liste vide Q[0]:=C[0]; pour k de 1 jusque n faire Q[k]:=(Q[k-1]*x)+C[k]; fpour; retourne(Q) } En utilisant cette le programme que nous avons crée calculer g(−2) en déduire une factorisation fois 1 de P . Calculer Q − . En déduire une factorisation de Q(x) puis de P (x). 2 5 Avec une calculatrice TI PGRM➔NEW ➔HORNER Pour afficher seulement P (x0 ). Pour afficher la liste des coefficients de Q et P (x0 ). Prompt X ClrList L6 Disp ``{AN,...,A0}'' Input L6 dim(L6)-1->N L6(1)->Q For(K,1,N,1) Q*X+L6(K+1)->Q End Disp Q Prompt X ClrList L6 Disp ``{AN,...,A0}'' Input L6 dim(L6)-1->N For(K,1,N,1) L6(K)*X+L6(K+1)->L6(K+1) End Disp L6 On écrira seulement le deuxième programme car il donne la liste des coefficients de Q(x). Pour tester plus facilement le programme écrire dans la liste L1 les coefficients 4 − 8 − 7 − 1. Exécuter le programme par exemple pour −0, 5. Horner2➔-0.5➔L1 et vous devez obtenir 0 pour le premier programme et pour le deuxième la liste qui est en L6 = {4 − 10 − 2 0}. On a donc P (−0.5) = 0 et P (x) = (x + 0, 5)(4x2 − 10x − 2). On peut aussi modifier le programme pour faire afficher des fractions. Remplacer Disp L6 par Disp L6➤Frac Ce programme fonctionne aussi avec des complexes. 3 6 Avec python def Horner(C,x): n=len(C) Q=C[0] for k in range(1,n): Q=Q∗x+C[k] return Q P=[4,−8,−7,−1] print(Horner(P,0)) def Horner(C,x): n=len(C) Q=[0]∗n; Q[0]=C[0]; for k in range(1,n): Q[k]=Q[k−1]∗x+C[k] return Q P=[4,−8,−7,−1] print(Horner(P,−0.5)) 7 Correction de la démonstration Soit P un polynôme de degré n, x0 un réel. On cherche à déterminer un polynôme Q(x) tel que P (x) = (x − x0 )Q(x) + P (x0 ). Q est forcément un polynôme de degré n − 1 et on a : ➔ P (x) = an xn + · · · + a1 x + a0 ➔ Q(x) = bn−1 xn−1 + · · · + b1 x + b0 . ➔ P (x) = (x − x0 )Q(x) + P (x0 ). (x − x0 )Q(x) + P (x0 ) = (x − x0 ) bn−1 xn−1 + · · · + b1 x + b0 + P (x0 ) = bn−1 xn + · · · + b1 x2 + b0 x − x0 bn−1 xn−1 − · · · − x0 b1 x − x0 b0 + P (x0 ) = bn−1 xn + (bn−2 − x0 bn−1 )n−1 + · · · + (b1 − x0 b2 )x2 + (b0 − x0 b1 )x − x0 b0 + P (x0 ) On a donc par identification bn−1 = an bn−1 = an b − x b = a b n−2 0 n−1 n−1 n−2 = x0 bn−1 + an−1 ... ... ⇐⇒ b1 − x0 b2 = a2 b1 = x0 b2 + a2 b − x b = a b 0 0 1 1 0 = x0 b1 + a1 −x0 b0 + P (x0 ) = a0 P (x0 ) = x0 b0 + a0 On retrouve bien les coefficients (bk ) obtenus avec l’algorithme de Hörner et le dernier coefficient est bien P (x0 ). Pour la programmation nous avons utilisé les listes [an an−1 . . . a1 a0 ] qui sont numérotées [p0 p1 p2 . . . pn−1 pn ] car les listes commencent à 0 (ou 1 pour la TI). 4