Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2016 08 13 Horner
2016 08 13 Horner
Algoritmo de Horner
Contenido
Después de que muriera Horner, su hijo llamado también William Horner mantuvo en
funcionamiento la escuela de Bath.2
Teorema de Horner
Historia
Aunque el método toma el nombre de William George Horner, quien la describió en 1819, el
método ya se conocía a Isaac Newton en 1669, el matemático chino Qin Jiushao en su Tratado
de Matemáticas en nueve secciones en el siglo 13, e incluso anterior a la persa musulmán
matemático Sharaf Al-Din al-Tusi, en el siglo 12.3 El primer uso del sistema de Horner fue en
los nueve capítulos de la matemática de Arte, un trabajo chino de la dinastía Han (202 aC - 220
dC), editado por Liu Hui (siglo fl. 3).4
Aplicación
El algoritmo de Horner ó El régimen de Horner se usa a menudo para convertir entre distintos
sistemas numéricos posicionales — en cuyo caso x es la base del sistema numérico, y los
2http://es.wikipedia.org/wiki/William_George_Horner
3JL Berggren (1990). "Innovación y tradición en Sharaf al-Din al-Tusi del Muadalat", Journal of the American Oriental Society
110 (2), p. 304-309
4 Templo, Robert. (1986). El genio de China: 3000 años de ciencia, descubrimiento, y la invención. Con un delantero por
Joseph Needham. Nueva York: Simón and Schuster, Inc. ISBN 0671620282. Página 142.
coeficientes a i son los dígitos de la representación del número dado en la base 𝑥 − 𝑦 puede
usarse también si 𝑥 es una matriz, en cuyo caso la carga computacional se reduce aún más.
El algoritmo de Horner también puede considerarse como un algoritmo rápido para dividir un
polinomio por otro polinomio lineal (véase Regla de Ruffini).
Eficiencia
La evaluación usando la forma monomial del polinomio de grado-n requiere al menos 𝑛 sumas
y (𝑛2 + 𝑛)/2 multiplicaciones, si las potencias se calculan mediante la repetición de
multiplicaciones. El algoritmo de Horner sólo requiere n sumas y n multiplicaciones.
(Minimizar el número de multiplicaciones es lo más deseable porque necesitan mucha carga
computacional y son inestables comparadas con la suma).
Definición
Dado el polinomio p( x) a 0 a1 x a 2 x 2 a3 x 3 ... a n x n , donde a0 ,..., a n son números
reales, se quiere evaluar el polinomio a un valor específico de x , digamos. x 0
5 W. Pankiewicz. "Algoritmo 337: el cálculo de un polinomio de valores y sus derivados por Horner régimen".
Http://portal.acm.org/citation.cfm?doid=364063.364089.
6 Markowich Alexander Ostrowski (25 septiembre 1893, Kiev, Ucrania-20 de noviembre 1986, Montagnola, Lugano, Suiza),
bn = an
bn 1 = a n1 bn x0
b0 = a0 b1 x0
Entonces b0 es el valor de p( x0 ) .
Para ver cómo funciona esto, nótese que el polinomio puede escribirse de la forma
p( x) a0 xa1 xa2 xa3 ... xan1 an x
Después, sustituyendo iterativamente la b j en la expresión,
p( x0 ) a0 x0 a1 xa2 ...x0 an1 bn x0 ...
a0 x0 a1 xa2 ...x0 bn1 ...
.
.
a0 x0 (b1 )
b0
Divisores de la forma (𝑥 + 𝑎) y (𝑥 − 𝑎)
Para dividir por el método de Ruffini se trazan dos líneas vertical y horizontal que se
interceptan:
Solución: Inicialmente se colocan en la primera fila de una tabla los coeficientes del dividendo,
en este caso los valores 9, -12, 6 y -3. Deberán aparecer 𝑛 + 1 término, donde n es el orden
del polinomio. En caso de allegar a faltar un monomio se coloca con cero (0). En la segunda
fila y una columna atrás del primer término se coloca el valor que anula el factor sobre el cual
se quiere dividir es decir el factor (𝑥 − 3) se anula cuando 𝑥 = 3, por lo tanto se coloca 3,
como se observa en seguida.
9 -12 6 -3
3 El valor de x que anula el factor (𝑥 − 3) es 3
9 -12 6 -3
3
9
Éste se multiplica por el valor de "x" que anula al divisor (3) y el resultado (3x9) se coloca
debajo del siguiente coeficiente del dividendo (-12), es decir el valor de 27.
9 -12 6 -3
3 27
9
9 -12 6 -3
3 27
9 15
Luego se procede a multiplicar el resultado (15) por el valor de "x" que anula al divisor (3) y
dicho resultado (45) se coloca en la siguiente columna.
9 -12 6 -3
3 27 45
9 15 51
Este proceso se sigue realizando hasta agotar los coeficientes del dividendo;
9 -12 6 -3
3 27 45 153
9 15 51 150
Siendo el último coeficiente resultante, el que constituye el residuo y los demás coeficientes
del resultado vienen a ser los coeficientes del cociente.
Ejemplo 2: f1 ( x) 2 x 3 6 x 2 2 x 1 para x 3 .
Fila 1→ 𝑥0 𝑥 3 𝑥 2 𝑥1 𝑥0
Fila 2→ 3 2 -6 2 -1 Coeficientes de la función original
Fila 3→ 6 0 6
Fila 4→ 2 0 2 5
Las entradas en la cuarta fila son la suma de las de la segunda y tercera fila. Cada entrada en
la tercera fila es el producto de la x-valor (3 en este ejemplo) con la cuarta fila de entrada de
inmediato a la izquierda. Las entradas en la primera fila son los coeficientes del polinomio a
evaluar. La respuesta es 5.
Como consecuencia del teorema de polinomio resto, las entradas en la tercera fila son los
coeficientes del polinomio de segundo grado que es el cociente de 𝒇𝟏 /(𝒙 − 𝟑). O sea que el
polinomio resultante de la división es 2 x 2 0 x 2 y el residuo es 5. Esto hace que el método
de Horner útil para polinomio largo división.
Fila 1→ 𝑥0 𝑥 3 𝑥 2 𝑥1 𝑥0
Fila 2→ 2 1 -6 11 -6 Coeficientes de la función original
Fila 3→ 2 -8 6
Fila 4→ 1 -4 3 0
El cociente es x 2 4 x 3 .
Sin embargo al hacer esto el residuo quedará dividido por dicho coeficiente de "x", para lo
cual se multiplicará por el mismo y se hallará el residuo final o verdadero.
𝟔𝒙𝟑 + 𝒙𝟐 + 𝟖𝒙 − 𝟔 3𝑥 − 1
:
3 3
𝒙𝟐 𝟖𝒙 𝟏
Resultando: 2𝒙𝟑 + + − 𝟐: 𝒙 −
3 𝟑 𝟑
𝑥0 𝑥 4 𝑥3 𝑥2 𝑥1 𝑥0
2 4 -6 0 3 -5 Coeficientes de la función original
1 2 -2 -1 1 Segunda Fila
2 -2 -1 1 -4 Tercera Fila
La Tercera Fila, es la suma de las dos primeras filas, dividido por 2. Cada entrada en la segunda
fila es el producto de 1 con la tercera fila de entrada a la izquierda. La respuesta es:
f 1 ( x) 4
2x3 2x 2 x 1
f 2 ( x) (2 x 1)
Divisor de la forma: x n a y x n a
Para resolver una división por este método se requiere que todos los exponentes de la variable
"x" en el dividendo sean múltiplos de los exponentes de dicha variable en el divisor.
Solución:
→ 2𝑥 3 + 3𝑦 2 + 8𝑦 + 9 entre y+1
Finalmente se reemplaza 𝑦 = 𝑥 2 :
𝑄(𝑥) = 2𝑦 2 + 𝑦 + 7
𝑄(𝑥) = 2(𝑥 2 )2 + 𝑥 2 + 7 = 2𝑥 4 + 𝑥 2 + 7
𝑄(𝑥) = 2𝑥 4 + 𝑥 2 + 7
R=2
6 x 5 15 x 4 8 x 3 23x 2 0 x 4 , entre 2 x 3 5 x 2 0 x 1
A continuación:
2 6 15 8 23 0 4
5
0
1
********
Antes de comenzar a dividir se cuenta de derecha a izquierda la cantidad de columnas
en el dividendo según el grado de divisor. además de trazar una recta paralela a la del
dividendo para colocar debajo de ella la respuesta a las operaciones.
Para dividir:
Se divide el coeficiente del primer término del dividendo (6) entre el número "atrapado"
entre la intersección de las rectas horizontal y vertical (2); resultando 3, para colocar este
debajo de la segunda línea horizontal y se multiplica por los números que hay a la
izquierda de la línea vertical, y debajo de la primera línea horizontal se colocan los
productos.
A continuación se suma la siguiente columna y el resultado se divide por el número
"atrapado"(entre la intersección de las líneas horizontal y vertical) y se coloca el resultado
debajo de la segunda línea horizontal y sigue el mismo proceso mencionado
anteriormente hasta completar la primera columna (contando de derecha a izquierda).
Teorema del resto o Descartes
Permite calcular el resto sin necesidad de efectuar una división.
Por lo general se utiliza en polinomios de la forma: (𝑎𝑥 + 𝑏) y (𝑎𝑥 − 𝑏), o variables que se
puedan transformar a esta.
(2𝑥 5 − 3𝑥 4 + 5𝑥 − 4)/ (𝑥 − 2)
Residuo = 22 → Rpta.
Cocientes notables:
Son ciertos cocientes que se escriben por simple inspección, sujetándose a reglas fijas y sin
realizar la división.
Casos
http://photos1.blogger.com/blogger/294/1402/1600/ecu7.jpg
𝑥 7 +𝑎7
Ejemplo: = 𝑥 6 − 𝑎𝑥 5 + 𝑎2 𝑥 4 − 𝑎3 𝑥 3 + ⋯ + 𝑎6
𝑥+𝑎
Factorización:
Casos:
Factorizar 4𝑥 3 − 12𝑥 2 + 6𝑥
En este caso podemos observar que la variable x aparece en todos los términos y debe formar
parte del máximo factor común. Podemos decir que el máximo factor común de un conjunto
de variables es el producto de las variables que se repiten al exponente menor.
Volviendo al ejemplo anterior podemos decir que el máximo factor común entre los términos
del polinomio es 2𝑥 y la factorización se llevará a cabo de la siguiente manera:
Esto es: Buscamos el máximo factor común y dividimos cada término del polinomio por el
máximo factor común.
= 2𝑥(2𝑥 2 − 6𝑥 + 3)
Recuerda en división: si las bases son iguales los exponentes se restan.
1. Agrúpense convenientemente los cuatro términos en dos binomios tales que cada uno
admita un factor común.
2. Indíquese, en cada grupo, el producto del factor común por su binomio
correspondiente, el cual resultará el mismo en todos ellos, si efectivamente el
polinomio dado proviene del producto de dos factores binomios.
3. Indíquese el producto del binomio común por la suma algebraica de los otros factores
diferentes.
Sea el polinomio: 𝑎𝑐 + 𝑎𝑑 + 𝑏𝑐 + 𝑏𝑑, Que se supone provenir del producto de dos factores
binomios.
Agrupando los términos de dos en dos, de manera que cada grupo tenga un factor común, se
puede escribir: (𝑎𝑐 + 𝑎𝑑) + (𝑏𝑐 + 𝑏𝑑).
Como se ve, el primer grupo es divisible entre a y el segundo lo es entre b ; resulta por tanto:
(𝑎𝑐 + 𝑎𝑑) + (𝑏𝑐 + 𝑏𝑑) = 𝑎(𝑐 + 𝑑) + 𝑏(𝑐 + 𝑑).
Suma de cubos
Diferencia de cubos
Trinomios de segundo grado:
Teniendo presente que el producto de dos binomios, tales como (𝑥 + 𝑎)(𝑥 + 𝑏), es:
(𝑥 + 𝑎)(𝑥 + 𝑏) = 𝑥 2 + (𝑎 + 𝑏)𝑥 + 𝑎𝑏,
Si se reemplaza 𝑎 + 𝑏 por m y 𝑎𝑏 por n, se puede escribir:
𝑥 2 + 𝑚𝑥 + 𝑛 = (𝑥 + 𝑎)(𝑥 + 𝑏)
Sea 𝑥 2 + 7𝑥 + 12.
El producto +12 indica que los factores son del mismo signo, y la suma +7 indica que los dos
son positivos.
El producto 12, con factores enteros, puede obtenerse multiplicando 12 por 1, ó 6 por 2, ó 4
por 3 . Los dos últimos factores son los buscados, pues su suma es 4 + 3 = 7. Se tiene, por
consiguiente, que: 𝑥 2 + 7𝑥 + 12 = (𝑥 + 4)(𝑥 + 3).
Trinomio por suma y resta (Quita y Pon): Se basa en el siguiente principio: Si a una expresión
se le suma y se le resta una misma expresión, la expresión inicial no varía.
Sumamos y estamos este doble producto para completar el trinomio cuadrado perfecto
(T.C.P.) y además obtener una diferencia de cuadrados. Sumamos y estamos este doble
producto para completar el trinomio cuadrado perfecto (T.C.P.) y además obtener una
diferencia de cuadrados.
Máximo común divisor: El máximo común divisor (m.c.d.) de dos o más números es el
mayor de los divisores comunes.
Mínimo común múltiplo: El mínimo común múltiplo de dos o más números es el menor
múltiplo común distinto a cero
Ahora se procede a calcular las raíces irracionales por medio de un proceso conocido con el
nombre de método de aproximación de Horner. Este método sólo es aplicable a las ecuaciones
enteras, pero tiene la ventaja de que los cálculos necesarios son más sencillos que los usados
en el método de la interpolación lineal. La facilidad de cálculo es debida a que cada cifra de la
raíz se determina individualmente.
El razonamiento fundamental del método de Horner es muy sencillo. Supongamos que una
ecuación entera dada f ( x) 0 y tiene una raíz irracional que, correcta con 3 cifras decimales,
es 2.124. Para determinar esta raíz primeramente veremos que la ecuación dada tiene una
raíz entera. Después disminuiremos las raíces de f ( x) 0 en 2 unidades, obteniendo la nueva
ecuación f1 ( x1 ) 0 que tiene la raíz 0.124. Entonces hacemos ver que f1{X 1} 0 tiene una
raíz entre 0.1 y 0.2 y disminuimos sus raíces en 0.1, obteniendo una nueva ecuación
f 2 ( x2 ) 0 que tiene la raíz 0.024. Repitiendo el paso anterior, mostramos que f 2 {X 2 } 0
tiene una raíz entre 0.02 y 0.03 y disminuimos sus raíces en 0.02, obteniendo una nueva
ecuación f 3 ( x3 ) 0 que tiene la raíz 0.004. Continuando este proceso, es posible obtener la
raíz con el número de cifras decimales correctas que se desee. Los detalles del método los
vamos a explicar en el ejemplo que sigue.
Ejemplo 11
f ( x ) x 3 5x 2 x 9 0
Ecuación 1
SOLUCION
Tiene una raíz entre 0 y 1 que procederemos a determinar entre dos décimas sucesivas. Ya
que la raíz de Ecuación 2 es pequeña, su cubo y cuadrado son aún más pequeños, por lo que,
para una primera aproximación, podemos despreciar los términos en X13 y X12, obteniendo así
la ecuación modificada 12x1- 4 = O que tiene la solución X1 = 0.3+. Ya que esto es sólo una
aproximación, debemos probarla en la ecuación (2). Por división sintética se encuentra
f1 (0.3) 0.347 y f1 (0.2) 1.272 . Por tanto, la Ecuación 2 tiene una raíz entre 0.2 y 0.3. A
continuación disminuimos las raíces de la Ecuación 2 en el valor 0.2. Al efectuar esta operación
conviene dejar espacio suficiente para los decimales necesarias, como se indica:
La ecuación transformada:
f 2 ( x2 ) x23 8.6 x22 15.32 x2 1.272 0
Ecuación 3
La Ecuación 3 tiene una raíz entre 0 y 0.1 que se procede a localizar entre dos centésimas
sucesivas. De los últimos dos términos de la Ecuación 3, se obtiene la ecuación modificada
15.32 x2 1.272 0 que tiene la solución x2 0.08 . Por división sintética se encuentra que
f 2 (00.8) 0.009152 , y f 2 (0.07) 0.157117 . Por tanto, la Ecuación 3 tiene una raíz entre
0.07 y 0.08. Ahora disminuimos las raíces de Ecuación 3 en 0.07:
La ecuación transformada es
f 3 ( x3 ) x33 8.81x32 16.5387 x3 0.157117 0
Ecuación 4
La Ecuación 4 tiene una raíz entre 0 y 0.01 la cual se debe localizar entre dos milésimas
sucesivas. De los últimos dos términos de Ecuación 4, se tiene la ecuación modificada
16.5387 x3 0.157117 0 , con la, solución x3 0.009 . Por división sintética se encuentra
f 3 (0.009) 10.007554361 y f 3 (0.01) 0.009152 . Por tanto, la Ecuación 4 tiene una raíz
entre 0.009 y 0.011, Ahora disminuimos las raíces de la Ecuación 4 en 0.009.
Por tanto, la raíz buscada es x = 1 + 0.2 + 0.07 + 0.009 + 0.0004 = 1.2794 y, con precisión de
3 decimales, es 1.279.
NOTAS.
Esto no supone mayor problema cuando se evalúa un polinomio sencillito para un solo valor,
como 𝑥 = 7, pero ¿Y si se necesita evaluar un polinomio una y otra vez para montones de
valores distintos de 𝑥?
Se planteará cómo hacerlo lo mejor posible con la ayuda del esquema de Horner, como de
costumbre con un enfoque básico. Simplemente pretendemos ilustrar cómo a veces, un poco
de análisis y reflexión permiten construir algoritmos más eficientes.
El algoritmo de Horner propone una forma de evaluar los polinomios descritos como una suma
de monomios.
El algoritmo se basa en el Esquema de Horner, una forma de reescribir los polinomios atribuida
a William George Horner, un matemático inglés del siglo XIII, más conocido por la invención
del zootropo, un aparato que mostraba imágenes creando la ilusión de animación. Digo
atribuido porque aunque el algoritmo lleva su nombre, y en efecto Horner lo describió, se sabe
que el algoritmo había sido utilizado con anterioridad.
Pero hablaremos luego del esquema de Horner. Primero veamos cómo evaluaríamos un
polinomio genérico sin conocer el esquema de Horner.
Almacenamos los coeficientes al revés de cómo se escribe el polinomio, porque así tenemos
el coeficiente del monomio de grado 0 en la componente 0 del vector, y el coeficiente del
monomio de grado 3 en la posición 3 del vector.
Bien... vamos a calcular el valor del polinomio para un valor cualquiera de x. Como vamos a
tener que elevar x al cuadrado y también al cubo, quizá fuera conveniente definirnos un
método o función para calcular una potencia. Después, basta con ir recorriendo el vector,
multiplicando cada coeficiente por la potencia de x elevado al grado del monomio
correspondiente, que por la forma en la que hemos almacenado los coeficientes, corresponde
con la posición del vector. Bien... programémoslo:
Si nos paramos un momento a pensar las operaciones de suma y producto que estamos
haciendo, nos daremos cuenta rápidamente de que el algoritmo no es muy bueno. ¿Por qué?
Pues porque invocamos varias veces al método potencia. En cada invocación, se calcula una
potencia de x. En el caso del ejemplo, x3, luego x2, luego x1 y luego x0. Ningún programador
elegante haría semejante barbaridad, ya que en cada llamada a potencia se entra en un bucle
que multiplica x por sí mismo un determinado número de veces. Es decir... si nuestro
polinomio fuera de grado 15, una llamada a potencia(x,15) multiplicaría x por sí mismo 15
veces, y luego la llamada a potencia(x,14) de la iteración siguiente volvería a multiplicar x por
sí mismo 14 veces.
Mucho mejor... con éste algoritmo de arriba, en cada iteración del bucle for se realizan sólo
dos multiplicaciones y una suma. Es decir, para nuestro polinomio de ejemplo, se realizan
cuatro vueltas del bucle, así que 8 multiplicaciones y cuatro sumas. En el primer algoritmo, se
realizaban 13 multiplicaciones y cuatro sumas. Si el polinomio fuera mayor, por ejemplo de
grado 15... Con éste segundo algoritmo se realizan 30 multiplicaciones y 15 sumas, pero con
el primero se realizan ¡¡¡ 134 multiplicaciones y 15 sumas !!! Como ves, hemos disminuido
muchísimo el número de operaciones.
Bueno, pero todavía lo podemos mejorar. Aquí es donde entra el algoritmo de Horner.
Vale. Ahora cojamos el interior del paréntesis (nos dejamos la x que multiplica en el mismo
lado que nos dejamos el -1), y volvamos a separar el coeficiente que no multiplica a x (y
nuevamente lo dejamos a un lado)... 3𝑥 2 − 2𝑥 Si se saca factor común, queda (3x − 2)x
Ahora reescriba todo junto, el resultado al que se ha llegado y todo lo que se ha dejado a un
lado: ((3x − 2)x + 5)x − 1. Simplemente, se tiene el mismo polinomio de antes, pero escrito
de otra forma. De la expresión como suma de monomios se ha sacado la 𝑥 como factor común
unas cuantas veces. ¿No crees?... Haz las operaciones...
Bueno... pues a esta forma de escribir los polinomios "((3x-2)x -5)x-1", en la cual, todas las
veces que aparece x no está elevado a ninguna potencia, se le denomina esquema de horner.
Realmente, x se va multiplicando por sí mismo, pero esto se logra gracias a la astuta
parentización.
Pues bien, cuando implementamos un algoritmo que se basa en evaluar un polinomio escrito
según el esquema de Horner, resulta que sólo necesitamos una suma y una multiplicación por
cada iteración del bucle... y además, al no realizarse operaciones de potencia, los errores de
redondeo cometidos son mucho menores.
Recapitulando, para evaluar un polinomio según el algoritmo de Horner, empezamos por el
coeficiente del monomio de mayor grado, y lo multiplicamos por x. Luego sumamos el
siguiente coeficiente y volvemos a multiplicar por x.... Luego sumamos el siguiente y
multiplicamos por x...... y así sucesivamente, hasta que sumamos el último coeficiente y
paramos.
Se coloca todo en una clase que se llama Polinomio. Se coloca un constructor y una función
evaluar que utilice el esquema de Horner.
class Polinomio
{ //los coeficientes, de grado 0 a n
double[] coeficientes;
//una propiedad para obtener el grado
//del polinomio
int grado
{ get {return coeficientes.Length-1;}
}
/* Este constructor admite una serie variable de
* valores double, que representan a los coeficientes.
* El primero será el coeficiente del monomio de mayor
* grado y el último el coeficiente del monomio de grado 0.
*/
public Polinomio(params double[] coeficientes)
{ this.coeficientes = coeficientes;
//vamos a darle la vuelta, sólo por comodidad
//así, nos quedamos con el coeficiente del monomio de
//grado 0 en la posición 0 del vector, y el coeficiente
//del monomio de grado n en la posición n.
Array.Reverse(this.coeficientes);
}
Para utilizarlo, basta con crear un nuevo polinomio, pasándole la lista de coeficientes, tal cual
se escriben en el polinomio, e invocar al método evaluar. Por ejemplo:
//crear el polinomio
Polinomio p = new Polinomio(3, -2, 5, -1);
//evaluar para x=7
Console.WriteLine(p.evaluar(7));