# Méthode de Ruffini-Horner

En mathématiques et algorithmique, la méthode de Ruffini-Horner, connue aussi sous les noms de méthode de Horner, algorithme de Ruffini-Horner ou règle de Ruffini, se décline sur plusieurs niveaux. Elle permet de calculer la valeur d'un polynôme en x$_0$. Elle présente un algorithme simple effectuant la division euclidienne d'un polynôme par X − x$_0$. Mais elle offre aussi une méthode de changement de variable X = x$_0$ + Y dans un polynôme. C'est sous cette forme qu'elle est utilisée pour déterminer une valeur approchée d'une racine d'un polynôme.

## Histoire

La méthode de Ruffini-Horner de recherche d'une valeur approchée de racine d'un polynôme est publiée à quelques années d'intervalle par Paolo Ruffini (1804-1807-1813) et par William George Horner (1819-1845 posthume) mais il semble bien que Horner n'ait pas eu connaissance des travaux de Ruffini. La méthode de Horner est ensuite popularisée par les mathématiciens Auguste De Morgan et John Radford Young (en). Dans leurs premières publications, ces deux auteurs utilisent des méthodes de dérivations pour effectuer le changement de variable X = x$_0$ + Y. Par la suite, ils présentent des versions ne faisant appel qu'à des techniques algébriques. La méthode de Ruffini-Horner est difficilement exploitable si le polynôme possède deux racines trop proches. Ruffini n'évoque pas ce problème mais Horner propose une procédure spéciale pour ce cas-là.
En tant que technique de changement de variable, on retrouve des algorithmes analogues, en Chine, pour l'extraction de racine n-ième, dans les Neuf Chapitres (263 apr. J.-C.) et dans le monde arabe, dans l'œuvre de Al Samaw'al (XIIe siècle). Mais il semble bien que le Perse, Sharaf al-Dīn al-Tūsī (XIIe siècle) soit le premier à l'utiliser dans le cas général d'une équation de degré 3.

## Valeur d'un polynôme en un point

Soit
    $P=a_{n}X^{n}+a_{n-1}X^{n-1}+\ldots +a_{0}$
un polynôme et x$_0$ un nombre. Le calcul de P(x$_0$)
    $P(x_{0})=a_{n}x_{0}^{n}+a_{n-1}x_{0}^{n-1}+\ldots +a_{0}$
laisse à penser qu'il faut calculer chacune des puissances de x$_0$, multiplier celle-ci par son coefficient a$_k$ puis faire la somme de ce que l'on a trouvé.
Si on calcule les puissances de x$_0$ en multipliant successivement x$_0$ par lui-même, le nombre nécessaire de produits est alors de n + (n – 1) + … + 2 + 1 = n(n+1)/2, quantité qui croît comme le carré du degré du polynôme. On peut améliorer la vitesse du calcul de xn 0 par une méthode d'exponentiation rapide, permettant de réduire le temps du calcul de P(x$_0$) à une quantité qui croît comme n×ln(n). Ou plus efficacement encore, on peut commencer par calculer toutes les puissances de x$_0$, ce qui nécessite n – 1 multiplications, puis multiplier par les coefficients, ce qui nécessite n nouvelles multiplications : le nombre total de produit est alors 2n – 1. La méthode de Horner consiste à combiner les deux itérations précédentes en une seule en effectuant le calcul comme suit :
    $P(x_{0})=((\dots ((a_{n}x_{0}+a_{n-1})x_{0}+a_{n-2})x_{0}+\dots )x_{0}+a_{1})x_{0}+a_{0}$.
Le nombre de produits est alors réduit à n et l'on peut montrer que ce nombre est minimal : il n'est pas possible d'évaluer une fonction polynomiale en moins de n produits en toute généralité.
La méthode consiste donc à multiplier le premier coefficient par x$_0$ et à lui ajouter le deuxième coefficient. On multiplie alors le nombre obtenu par x$_0$ et on lui ajoute le troisième coefficient, etc. Elle s'organise très bien à l'aide d'un tableau dans lequel chaque case de la seconde ligne est obtenue en multipliant le coefficient de la case de gauche par x$_0$ et en lui ajoutant le coefficient de la case du dessus.
| Coefficients de P | a$_n$ | a$_{n–1}$ | a$_{n–2}$ | … | a$_1$ | a$_0$ |
| Facteur x$_0$ | a$_n$ | a$_n$x$_0$ + a$_{n–1}$ | (a$_n$x$_0$ + a$_{n–1}$)x$_0$ + a$_{n–2}$ | … | q$_0$ | P(x$_0$) = q$_0$x$_0$ + a$_0$ |
Exemple pratique : Calcul de 4X$^3$ - 7X$^2$ + 3X – 5 pour X = 2
| Coefficients de P | 4 | −7 | 3 | −5 |
| Facteur 2 | 4 | 8 − 7 = 1 | 2 + 3 = 5 | P(2) = 10 − 5 = 5 |
Outre la réduction du nombre d'opérations, cette méthode peut éviter dans certains cas de manipuler des nombres très grands, et donc peut éviter les dépassements de capacité pour les calculs sur ordinateur. Si l'on prend par exemple le polynôme P(X) = X$^{10}$ – 99X$^9$, alors avec la méthode « classique », pour évaluer P(100), on doit calculer 100$^{10}$ = 10$^{20}$ auquel on retranche 99×10$^{18}$, donnant un résultat erroné sur des logiciels calculant avec 15 chiffres significatifs. Avec la méthode de Ruffini-Horner, on a
    $P(100)=(100-99)\times 100^{9}$
conduisant au résultat correct 100$^9$ = 10$^{18}$ puisque le calcul de la mantisse n'a utilisé que trois chiffres significatifs.

## Conversion de base de numération

Cette méthode permet aussi d'effectuer une conversion rapide d'un nombre écrit en base x$_0$ en écriture en base 10. En effet, si un nombre s'écrit, en base x$_0$,
    $n={\overline {a_{n}a_{n-1}\cdots a_{0}}}$,
ce nombre vaut
    $n=a_{n}x_{0}^{n}+a_{n-1}x_{0}^{n-1}+\cdots +a_{0}$.
Il s'agit donc de l'évaluation d'un polynôme.
Exemple pratique : écriture en base 10 du nombre hexadécimal DA78
| Coefficients | D (13) | A (10) | 7 | 8 |
| Facteur 16 | 13 | 13 × 16 + 10 = 218 | 218 ×16+ 7 = 3 495 | DA78 = 3 495 × 16 + 8 = 55 928 |

## Quotient d'un polynôme par X – x$_0$

Cette même méthode permet aussi d'obtenir la division d'un polynôme par X – x$_0$. Soit $P=a_{n}X^{n}+a_{n-1}X^{n-1}+...+a_{0}$.
La division euclidienne de P par X – x$_0$ donne
       $P=(X-x_{0})Q+P(x_{0})\,$
où Q est un polynôme de degré n - 1.
Si on écrit $Q=q_{n-1}X^{n-1}+q_{n-2}X^{n-2}+...+q_{1}X+q_{0}$ et si on identifie les coefficients de même degré dans les deux membres, on obtient :
       $q_{n-1}=a_{n}\,$
       $q_{k-1}-q_{k}x_{0}=a_{k}\,$ pour tout k tel que 0 < k < n
Soit encore
       $q_{k-1}=q_{k}x_{0}+a_{k}\,$ pour tout k tel que 0 < k < n
Les n valeurs de la suite q calculées ici sont précisément les n valeurs successives calculées dans le paragraphe précédent pour évaluer P(x$_0$). La mémorisation de ces valeurs successives donne donc les coefficients du polynôme quotient, la dernière valeur étant celle du reste.
Application pratique : division euclidienne de 4X$^3$ – 7X$^2$ + 3X – 5 par X – 2
Il suffit de reprendre le tableau précédemment construit et de lire dans les cases de la seconde ligne les coefficients de Q.
| Coefficients de P | 4 | − 7 | 3 | − 5 |
| Coefficients de Q | 4 | 8 − 7 = 1 | 2 + 3 = 5 | Reste = 10 − 5 = 5 |
Donc
    $4X^{3}-7X^{2}+3X-5=(X-2)(4X^{2}+X+5)+5\,$

## Changement de variable

L'algorithme précédent permet donc d'effectuer la division euclidienne du polynôme P par X - x$_0$. On peut alors écrire, en posant Y = X - x$_0$.
    $P(X)=YP_{1}(X)+b_{0}\,$
En utilisant de nouveau l'algorithme pour P$_1$, P$_2$, ... P$_n$, on obtient successivement
    $P(X)=Y\left(YP_{2}(X)+b_{1}\right)+b_{0}\,$
    $P(X)=Y\left(Y\left(...Y\left(Yb_{n}+b_{n-1}\right)...\right)+b_{1}\right)+b_{0}\,$
Les nombres b$_0$, b$_2$, ... b$_n$ sont donc les coefficients du polynôme Q tel que Q(Y) = P(x$_0$ + Y)
Illustration pratique : Si P(X) = 4X$^3$ - 7X$^2$ + 3X - 5 et que l'on cherche à écrire P(2 + Y), on applique 4 fois la méthode de division euclidienne par X - 2 :
| Coefficients de P | 4 | − 7 | 3 | − 5 |
| Coefficients de P$_1$ | 4 | 8 − 7 = 1 | 2 + 3 = 5 | 10 − 5 = 5 |
| Coefficients de P$_2$ | 4 | 8 + 1 =9 | 18 + 5 = 23 | |
| Coefficients de P$_3$ | 4 | 8 + 9 =17 | | |
| Coefficients de P$_4$ | 4 | | | |
Donc
    $P(2+Y)=4Y^{3}+17Y^{2}+23Y+5\,$

## Valeur approchée d'une racine

Pour chercher la valeur approchée x d'une racine d'un polynôme P, on cherche un entier x$_0$ tel que P(x$_0$) et P(x$_0$ + 1) soient de signe contraire. On sait alors, d'après le théorème des valeurs intermédiaires, qu'il existe une racine entre x$_0$ et x$_0$ + 1. On pose alors x = x$_0$ + y/10. Le nombre x est racine de P(X) si et seulement si le nombre y/10 est racine de P(x$_0$ + Y) = Q(Y). Ce polynôme Q se détermine grâce à la méthode de Horner. Enfin x est racine de P(X) si et seulement y est racine d'un polynôme R(X) obtenu en multipliant les coefficients b$_k$ de Q par $10^{n-k}$.
Il s'agit alors de chercher une racine de R comprise entre 0 et 10 en utilisant un processus analogue : on cherche un entier x$_1$ compris entre 0 et 9 tels que R(x$_1$) et R(x$_1$ + 1) soient de signe contraire. On sait alors qu'il existe une racine x de P comprise entre x$_0$ + x$_1$/10 et x$_0$ + (x$_1$ + 1)/10...
On détermine ainsi les décimales successives du développement décimal de x.
Exemple : algorithme de Ruffini-Horner pour l'extraction de la racine cubique de 18.
Il s'agit de trouver un réel x, racine du polynôme P(X) = X$^3$ - 18. On sait immédiatement que P(2) < 0 et P(3) > 0, x est donc compris entre 2 et 3. On pose alors x = 2+ y/10 et on cherche le polynôme Q tel que P(2 + Y) = Q(Y).
| Coefficients de P | 1 | 0 | 0 | - 18 |
| Coefficients de P$_1$ | 1 | 2 | 4 | - 10 |
| Coefficients de P$_2$ | 1 | 4 | 12 | |
| Coefficients de P$_3$ | 1 | 6 | | |
| Coefficients de P$_4$ | 1 | | | |
Le réel x est racine cubique de 18 si x = 2 + y/10 où y est racine de R(X) = X$^3$ + 60X$^2$ + 1200X - 10000. La racine y est comprise entre 6 et 7 (pour éviter de balayer tous les nombres, il suffit de remarquer que 1200y et 10000 doivent être très proches avec 1200y < 10000). On pose alors y = 6 + z/10 et on cherche le polynôme S tel que R(6 + Z) = S(Z).
| Coefficients de R | 1 | 60 | 1200 | -10000 |
| Coefficients de R$_1$ | 1 | 66 | 1596 | -424 |
| Coefficients de R$_2$ | 1 | 72 | 2028 | |
| Coefficients de R$_3$ | 1 | 78 | | |
| Coefficients de R$_4$ | 1 | | | |
Le réel y est racine de R si y = 6 + z/10 où z est racine de T(X) = X$^3$ + 780X$^2$ + 202800X - 424000. La racine z est comprise entre 2 et 3. Donc y est compris entre 6,2 et 6,3 et x est compris entre 2,62 et 2,63.

## Dérivées successives de P en x$_0$

Cette propriété apparaît ici en dernière position alors qu'elle est la propriété initiale mise en évidence par Ruffini et Horner. Cependant, comme une démarche purement algébrique est possible, celle-ci, plus simple, a été présentée d'abord. Le même algorithme permet de déterminer aussi la valeur de P$^{(k)}$(x$_0$). En effet, le développement de Taylor de P(x$_0$ + Y) donne
    $P(x_{0}+Y)=P(x_{0})+P'(x_{0})Y+{\frac {P^{(2)}(x_{0})}{2}}Y^{2}+\cdots +{\frac {P^{(k)}(x_{0})}{k!}}Y^{k}+\cdots \,$
Si on note Q(Y) = P(x$_0$ + Y), les coefficients b$_k$ de Q, trouvés par la méthode de Ruffini-Horner vérifient l'égalité
    $k!b_{k}=P^{(k)}(x_{0})\,$