I Méthode Horner

publicité
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
Téléchargement