Misplaced Pages

Horner's method: Difference between revisions

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.
Browse history interactively← Previous editContent deleted Content addedVisualWikitext
Revision as of 11:58, 2 May 2022 edit116.68.75.203 (talk) ExamplesTags: Manual revert Mobile edit Mobile web edit← Previous edit Latest revision as of 10:19, 4 January 2025 edit undo223.122.131.130 (talk)No edit summary 
(32 intermediate revisions by 24 users not shown)
Line 4: Line 4:
In ] and ], '''Horner's method''' (or '''Horner's scheme''') is an algorithm for ]. Although named after ], this method is much older, as it has been attributed to ] by Horner himself, and can be traced back many hundreds of years to Chinese and Persian mathematicians.<ref>600 years earlier, by the Chinese mathematician ] and 700 years earlier, by the Persian mathematician ]</ref> After the introduction of computers, this algorithm became fundamental for computing efficiently with polynomials. In ] and ], '''Horner's method''' (or '''Horner's scheme''') is an algorithm for ]. Although named after ], this method is much older, as it has been attributed to ] by Horner himself, and can be traced back many hundreds of years to Chinese and Persian mathematicians.<ref>600 years earlier, by the Chinese mathematician ] and 700 years earlier, by the Persian mathematician ]</ref> After the introduction of computers, this algorithm became fundamental for computing efficiently with polynomials.


The algorithm is based on '''Horner's rule:''' The algorithm is based on '''Horner's rule''', in which a polynomial is written in ''nested form'':
:<math>\begin{align} <math display="block">\begin{align}
a_0 &+ a_1x + a_2x^2 + a_3x^3 + \cdots + a_nx^n \\ &a_0 + a_1x + a_2x^2 + a_3x^3 + \cdots + a_nx^n \\
&= a_0 + x \bigg(a_1 + x \Big(a_2 + x \big(a_3 + \cdots + x(a_{n-1} + x \, a_n) \cdots \big) \Big) \bigg). ={} &a_0 + x \bigg(a_1 + x \Big(a_2 + x \big(a_3 + \cdots + x(a_{n-1} + x \, a_n) \cdots \big) \Big) \bigg).
\end{align}</math> \end{align}</math>

This allows the evaluation of a ] of degree {{mvar|n}} with only <math>n</math> multiplications and <math>n</math> additions. This is optimal, since there are polynomials of degree {{mvar|n}} that cannot be evaluated with fewer arithmetic operations.<ref>{{harvnb|Pan|1966}}</ref> This allows the evaluation of a ] of degree {{mvar|n}} with only <math>n</math> multiplications and <math>n</math> additions. This is optimal, since there are polynomials of degree {{mvar|n}} that cannot be evaluated with fewer arithmetic operations.<ref>{{harvnb|Pan|1966}}</ref>


Alternatively, '''Horner's method''' also refers to a method for approximating the roots of polynomials, described by Horner in 1819. It is a variant of the ] made more efficient for hand calculation by the application of Horner's rule. It was widely used until computers came into general use around 1970. Alternatively, '''Horner's method''' and '''{{vanchor|Horner–Ruffini method}}''' also refers to a method for approximating the roots of polynomials, described by Horner in 1819. It is a variant of the ] made more efficient for hand calculation by application of Horner's rule. It was widely used until computers came into general use around 1970.


== Polynomial evaluation and long division == == Polynomial evaluation and long division ==


Given the polynomial Given the polynomial
<math display="block">p(x) = \sum_{i=0}^n a_i x^i = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n,</math>

:<math>p(x) = \sum_{i=0}^n a_i x^i = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n,</math>

where <math>a_0, \ldots, a_n</math> are constant coefficients, the problem is to evaluate the polynomial at a specific value <math>x_0</math> of <math>x.</math> where <math>a_0, \ldots, a_n</math> are constant coefficients, the problem is to evaluate the polynomial at a specific value <math>x_0</math> of <math>x.</math>


For this, a new sequence of constants is defined ] as follows: For this, a new sequence of constants is defined ] as follows:
{{NumBlk||<math display="block">\begin{align}

:<math>\begin{align}
b_n & := a_n \\ b_n & := a_n \\
b_{n-1} & := a_{n-1} + b_n x_0 \\ b_{n-1} & := a_{n-1} + b_n x_0 \\
(1)\quad\quad\quad & ~~~ \vdots \\ & ~~~ \vdots \\
b_1 & := a_1 + b_2 x_0 \\ b_1 & := a_1 + b_2 x_0 \\
b_0 & := a_0 + b_1 x_0. b_0 & := a_0 + b_1 x_0.
\end{align}</math> \end{align}</math>|{{EquationRef|1}}}}

Then <math>b_0</math> is the value of <math>p(x_0)</math>. Then <math>b_0</math> is the value of <math>p(x_0)</math>.


To see why this works, the polynomial can be written in the form To see why this works, the polynomial can be written in the form
<math display="block">p(x) = a_0 + x \bigg(a_1 + x \Big(a_2 + x \big(a_3 + \cdots + x(a_{n-1} + x \, a_n) \cdots \big) \Big) \bigg) \ .</math>

:<math>p(x) = a_0 + x \bigg(a_1 + x \Big(a_2 + x \big(a_3 + \cdots + x(a_{n-1} + x \, a_n) \cdots \big) \Big) \bigg) \ .</math>


Thus, by iteratively substituting the <math>b_i</math> into the expression, Thus, by iteratively substituting the <math>b_i</math> into the expression,
<math display="block">\begin{align}
: <math>
\begin{align}
p(x_0) & = a_0 + x_0\Big(a_1 + x_0\big(a_2 + \cdots + x_0(a_{n-1} + b_n x_0) \cdots \big)\Big) \\ p(x_0) & = a_0 + x_0\Big(a_1 + x_0\big(a_2 + \cdots + x_0(a_{n-1} + b_n x_0) \cdots \big)\Big) \\
& = a_0 + x_0\Big(a_1 + x_0\big(a_2 + \cdots + x_0 b_{n-1}\big)\Big) \\ & = a_0 + x_0\Big(a_1 + x_0\big(a_2 + \cdots + x_0 b_{n-1}\big)\Big) \\
Line 45: Line 40:
& = a_0 + x_0 b_1 \\ & = a_0 + x_0 b_1 \\
& = b_0. & = b_0.
\end{align} \end{align}</math>
</math>


Now, it can be proven that; Now, it can be proven that;
{{NumBlk||<math display="block">
:<math>
(2)\quad\quad\quad p(x) = (b_1 + b_2 x + b_3 x^2 + b_4x^3 + \cdots + b_{n-1} x^{n-2} +b_nx^{n-1})(x-x_0)+b_0 p(x) = \left(b_1 + b_2 x + b_3 x^2 + b_4x^3 + \cdots + b_{n-1} x^{n-2} +b_nx^{n-1}\right) \left(x - x_0\right) + b_0
</math> </math>|{{EquationRef|2}}}}
This expression constitutes Horner's practical application, as it offers a very quick way of determining the outcome of; This expression constitutes Horner's practical application, as it offers a very quick way of determining the outcome of;
<math display="block">p(x) / (x-x_0) </math>
:<math>
with <math>b_0</math> (which is equal to <math>p(x_0)</math>) being the division's remainder, as is demonstrated by the examples below. If <math>x_0</math> is a root of <math>p(x)</math>, then <math>b_0 = 0</math> (meaning the remainder is <math>0</math>), which means you can factor <math>p(x)</math> as <math>x-x_0</math>.
p(x)/(x-x_0)

</math>
To finding the consecutive <math>b</math>-values, you start with determining <math>b_n</math>, which is simply equal to <math>a_n</math>. Then you then work recursively using the formula:
with b<sub>0</sub> (which is equal to p(x<sub>0</sub>)) being the division's remainder, as is demonstrated by the examples below. if x<sub>0</sub> is a root of p(x), then b<sub>0</sub> = 0 (meaning the remainder is 0), which means you can factor p(x) with (x-x<sub>0</sub>).<br>
<math display="block"> b_{n-1} = a_{n-1} + b_{n}x_0 </math>
As to finding the consecutive b-values, you start with determining b<sub>n</sub>, which is simply equal to a<sub>n</sub>. You then work your way down to the other b's, using the formula;
till you arrive at <math>b_0</math>.
:<math>
b_{n-1}=a_{n-1}+b_{n}x_0
</math>
till you arrive at b<sub>0</sub>.


=== Examples === === Examples ===


Evaluate <math>f(x)=2x^3-6x^2+2x-1</math> for <math>x=3.</math> Evaluate <math>f(x)=2x^3-6x^2+2x-1</math> for <math>x=3</math>.


We use ] as follows: We use ] as follows:


''x<sub>0</sub>''│ ''x<sup>3</sup>'' ''x<sup>2</sup>'' ''x<sup>1</sup>'' ''x<sup>0</sup>'' ''x''{{sub|0}}│ ''x''{{sup|3}} ''x''{{sup|2}} ''x''{{sup|1}} ''x''{{sup|0}}
3 │ 2 −6 2 −1 3 │ 2 −6 2 −1
│ 6 0 6 │ 6 0 6
Line 75: Line 66:
2 0 2 5 2 0 2 5


The entries in the third row are the sum of those in the first two. Each entry in the second row is the product of the ''x''-value (3 in this example) with the third-row entry immediately to the left. The entries in the first row are the coefficients of the polynomial to be evaluated. Then the remainder of <math>f(x)</math> on division by <math>x-3</math> is 5. The entries in the third row are the sum of those in the first two. Each entry in the second row is the product of the {{mvar|x}}-value ({{val|3}} in this example) with the third-row entry immediately to the left. The entries in the first row are the coefficients of the polynomial to be evaluated. Then the remainder of <math>f(x)</math> on division by <math>x-3</math> is {{val|5}}.


But by the ], we know that the remainder is <math>f(3) </math>. Thus <math>f(3) = 5</math> But by the ], we know that the remainder is <math>f(3) </math>. Thus, <math>f(3) = 5</math>.


In this example, if <math>a_3 = 2, a_2 = -6, a_1 = 2, a_0 = -1</math> we can see that <math>b_3 = 2, b_2 = 0, b_1 = 2, b_0 = 5 </math>, the entries in the third row. So, synthetic division is based on Horner's method. In this example, if <math>a_3 = 2, a_2 = -6, a_1 = 2, a_0 = -1</math> we can see that <math>b_3 = 2, b_2 = 0, b_1 = 2, b_0 = 5 </math>, the entries in the third row. So, synthetic division (which was actually invented and published by Ruffini 10 years before Horner's publication) is easier to use; it can be shown to be equivalent to Horner's method.


As a consequence of the polynomial remainder theorem, the entries in the third row are the coefficients of the second-degree polynomial, the quotient of <math>f(x)</math> on division by <math> x-3 </math>. As a consequence of the polynomial remainder theorem, the entries in the third row are the coefficients of the second-degree polynomial, the quotient of <math>f(x)</math> on division by <math> x-3 </math>.
The remainder is 5. This makes Horner's method useful for ]. The remainder is {{val|5}}. This makes Horner's method useful for ].


Divide <math>x^3-6x^2+11x-6</math> by <math>x-2</math>: Divide <math>x^3-6x^2+11x-6</math> by <math>x-2</math>:
Line 95: Line 86:
Let <math>f_1(x)=4x^4-6x^3+3x-5</math> and <math>f_2(x)=2x-1</math>. Divide <math>f_1(x)</math> by <math>f_2\,(x)</math> using Horner's method. Let <math>f_1(x)=4x^4-6x^3+3x-5</math> and <math>f_2(x)=2x-1</math>. Divide <math>f_1(x)</math> by <math>f_2\,(x)</math> using Horner's method.


0.5 │ 4 −6 0 3 −5
│ 2 −2 −1 1
└───────────────────────
0.5 │ 4 -6 0 3 -5
2 -2 -1 1 2 −2 −1 1 −4
└───────────────────────
2 -2 -1 1 -2


The third row is the sum of the first two rows, divided by 2. Each entry in the second row is the product of 1 with the third-row entry to the left. The answer is The third row is the sum of the first two rows, divided by {{val|2}}. Each entry in the second row is the product of {{val|1}} with the third-row entry to the left. The answer is
<math display="block">\frac{f_1(x)}{f_2(x)}=2x^3-2x^2-x+1-\frac{4}{2x-1}.</math>

:<math>\frac{f_1(x)}{f_2(x)}=2x^3-2x^2-x+1-\frac{4}{2x-1}.</math>


=== Efficiency === === Efficiency ===


Evaluation using the monomial form of a degree-''n'' polynomial requires at most ''n'' additions and (''n''<sup>2</sup>&nbsp;+&nbsp;''n'')/2 multiplications, if powers are calculated by repeated multiplication and each monomial is evaluated individually. (This can be reduced to ''n'' additions and 2''n''&nbsp;&minus;&nbsp;1 multiplications by evaluating the powers of ''x'' iteratively.) If numerical data are represented in terms of digits (or bits), then the naive algorithm also entails storing approximately 2''n'' times the number of bits of ''x'' (the evaluated polynomial has approximate magnitude ''x<sup>n</sup>'', and one must also store ''x<sup>n</sup>'' itself). By contrast, Horner's method requires only ''n'' additions and ''n'' multiplications, and its storage requirements are only ''n'' times the number of bits of ''x''. Alternatively, Horner's method can be computed with ''n'' ]s. Horner's method can also be extended to evaluate the first ''k'' derivatives of the polynomial with ''kn'' additions and multiplications.<ref>{{harvnb|Pankiewicz|1968}}.</ref> Evaluation using the monomial form of a degree <math>n</math> polynomial requires at most <math>n</math> additions and <math>(n^2+n)/2</math> multiplications, if powers are calculated by repeated multiplication and each monomial is evaluated individually. The cost can be reduced to <math>n</math> additions and <math>2n-1</math> multiplications by evaluating the powers of <math>x</math> by iteration.


If numerical data are represented in terms of digits (or bits), then the naive algorithm also entails storing approximately <math>2n</math> times the number of bits of <math>x</math>: the evaluated polynomial has approximate magnitude <math>x^n</math>, and one must also store <math>x^n</math> itself. By contrast, Horner's method requires only <math>n</math> additions and <math>n</math> multiplications, and its storage requirements are only <math>n</math> times the number of bits of <math>x</math>. Alternatively, Horner's method can be computed with <math>n</math> ]s. Horner's method can also be extended to evaluate the first <math>k</math> derivatives of the polynomial with <math>kn</math> additions and multiplications.<ref>{{harvnb|Pankiewicz|1968}}.</ref>
Horner's method is optimal, in the sense that any algorithm to evaluate an arbitrary polynomial must use at least as many operations. ] proved in 1954 that the number of additions required is minimal.<ref>{{harvnb|Ostrowski|1954}}.</ref> ] proved in 1966 that the number of multiplications is minimal.<ref>{{harvnb|Pan|1966}}.</ref> However, when ''x'' is a matrix, ].


Horner's method is optimal, in the sense that any algorithm to evaluate an arbitrary polynomial must use at least as many operations. ] proved in 1954 that the number of additions required is minimal.<ref>{{harvnb|Ostrowski|1954}}.</ref> ] proved in 1966 that the number of multiplications is minimal.<ref>{{harvnb|Pan|1966}}.</ref> However, when <math>x</math> is a matrix, ].
This assumes that the polynomial is evaluated in monomial form and no ] of the representation is allowed, which makes sense if the polynomial is evaluated only once. However, if preconditioning is allowed and the polynomial is to be evaluated many times, then ]. They involve a transformation of the representation of the polynomial. In general, a degree-''n'' polynomial can be evaluated using only {{floor|''n''/2}}+2 multiplications and ''n'' additions.<ref>{{harvnb|Knuth|1997}}.</ref>

This assumes that the polynomial is evaluated in monomial form and no ] of the representation is allowed, which makes sense if the polynomial is evaluated only once. However, if preconditioning is allowed and the polynomial is to be evaluated many times, then ]. They involve a transformation of the representation of the polynomial. In general, a degree-<math>n</math> polynomial can be evaluated using only {{floor|''n''/2}}+2 multiplications and <math>n</math> additions.<ref>{{harvnb|Knuth|1997}}.</ref>


====Parallel evaluation==== ====Parallel evaluation====
Line 119: Line 109:


If, however, one is evaluating a single polynomial of very high order, it may be useful to break it up as follows: If, however, one is evaluating a single polynomial of very high order, it may be useful to break it up as follows:
:<math>\begin{align} <math display="block">\begin{align}
p(x) & = \sum_{i=0}^n a_i x^i \\ p(x)
& = \sum_{i=0}^n a_i x^i \\
& = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n \\ & = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n \\
& = \left( a_0 + a_2 x^2 + a_4 x^4 + \cdots\right) + \left(a_1 x + a_3 x^3 + a_5 x^5 + \cdots \right) \\ & = \left( a_0 + a_2 x^2 + a_4 x^4 + \cdots\right) + \left(a_1 x + a_3 x^3 + a_5 x^5 + \cdots \right) \\
& = \left( a_0 + a_2 x^2 + a_4 x^4 + \cdots\right) + x \left(a_1 + a_3 x^2 + a_5 x^4 + \cdots \right) \\ & = \left( a_0 + a_2 x^2 + a_4 x^4 + \cdots\right) + x \left(a_1 + a_3 x^2 + a_5 x^4 + \cdots \right) \\
& = \sum_{i=0}^{\lfloor n/2 \rfloor} a_{2i} x^{2i} + x \sum_{i=0}^{\lfloor n/2 \rfloor} a_{2i+1} x^{2i} \\ & = \sum_{i=0}^{\lfloor n/2 \rfloor} a_{2i} x^{2i} + x \sum_{i=0}^{\lfloor n/2 \rfloor} a_{2i+1} x^{2i} \\
& = p_0(x^2) + x p_1(x^2). \\ & = p_0(x^2) + x p_1(x^2).
\end{align}</math> \end{align}</math>


More generally, the summation can be broken into ''k'' parts: More generally, the summation can be broken into ''k'' parts:
<math display="block">p(x)
:<math>\begin{align}
p(x) & = \sum_{i=0}^n a_i x^i \\ = \sum_{i=0}^n a_i x^i
& = \sum_{j=0}^{k-1} x^j \sum_{i=0}^{\lfloor n/k \rfloor} a_{ki+j} x^{ki} \\ = \sum_{j=0}^{k-1} x^j \sum_{i=0}^{\lfloor n/k \rfloor} a_{ki+j} x^{ki}
& = \sum_{j=0}^{k-1} x^j p_j(x^k) \\ = \sum_{j=0}^{k-1} x^j p_j(x^k)</math>
\end{align}</math>
where the inner summations may be evaluated using separate parallel instances of Horner's method. This requires slightly more operations than the basic Horner's method, but allows ''k''-way ] execution of most of them. Modern compilers generally evaluate polynomials this way when advantageous, although for ] calculations this requires enabling (unsafe) reassociative math{{Citation needed|date=February 2022}}. where the inner summations may be evaluated using separate parallel instances of Horner's method. This requires slightly more operations than the basic Horner's method, but allows ''k''-way ] execution of most of them. Modern compilers generally evaluate polynomials this way when advantageous, although for ] calculations this requires enabling (unsafe) reassociative math{{Citation needed|date=February 2022}}.


Line 143: Line 133:
====Example==== ====Example====
For example, to find the product of two numbers (0.15625) and ''m'': For example, to find the product of two numbers (0.15625) and ''m'':
<math display="block">\begin{align}

(0.15625) m & = (0.00101_b) m = \left( 2^{-3} + 2^{-5} \right) m = \left( 2^{-3})m + (2^{-5} \right)m \\
:<math>
& = 2^{-3} \left(m + \left(2^{-2}\right)m\right) = 2^{-3} \left(m + 2^{-2} (m)\right).
\begin{align}
\end{align}</math>
(0.15625) m & = (0.00101_b) m = ( 2^{-3} + 2^{-5}) m = (2^{-3})m + (2^{-5})m \\
& = 2^{-3} (m + (2^{-2})m) = 2^{-3} (m + 2^{-2} (m)).
\end{align}
</math>


====Method==== ====Method====
To find the product of two binary numbers ''d'' and ''m'': To find the product of two binary numbers ''d'' and ''m'':
:1. A register holding the intermediate result is initialized to ''d''. # A register holding the intermediate result is initialized to ''d''.
:2. Begin with the least significant (rightmost) non-zero bit in ''m''. # Begin with the least significant (rightmost) non-zero bit in ''m''. {{ordered list | list-style-type = lower-alpha | start = 2
::2b. Count (to the left) the number of bit positions to the next most significant non-zero bit. If there are no more-significant bits, then take the value of the current bit position. | Count (to the left) the number of bit positions to the next most significant non-zero bit. If there are no more-significant bits, then take the value of the current bit position.
::2c. Using that value, perform a left-shift operation by that number of bits on the register holding the intermediate result | Using that value, perform a left-shift operation by that number of bits on the register holding the intermediate result}}
:3. If all the non-zero bits were counted, then the intermediate result register now holds the final result. Otherwise, add d to the intermediate result, and continue in step 2 with the next most significant bit in ''m''. # If all the non-zero bits were counted, then the intermediate result register now holds the final result. Otherwise, add d to the intermediate result, and continue in step 2 with the next most significant bit in ''m''.


====Derivation==== ====Derivation====
In general, for a binary number with bit values (<math> d_3 d_2 d_1 d_0 </math>) the product is In general, for a binary number with bit values (<math> d_3 d_2 d_1 d_0 </math>) the product is
:<math> (d_3 2^3 + d_2 2^2 + d_1 2^1 + d_0 2^0)m = d_3 2^3 m + d_2 2^2 m + d_1 2^1 m + d_0 2^0 m. </math> <math display="block"> (d_3 2^3 + d_2 2^2 + d_1 2^1 + d_0 2^0)m = d_3 2^3 m + d_2 2^2 m + d_1 2^1 m + d_0 2^0 m. </math>
At this stage in the algorithm, it is required that terms with zero-valued coefficients are dropped, so that only binary coefficients equal to one are counted, thus the problem of multiplication or ] is not an issue, despite this implication in the factored equation: At this stage in the algorithm, it is required that terms with zero-valued coefficients are dropped, so that only binary coefficients equal to one are counted, thus the problem of multiplication or ] is not an issue, despite this implication in the factored equation:
<math display="block"> = d_0\left(m + 2 \frac{d_1}{d_0} \left(m + 2 \frac{d_2}{d_1} \left(m + 2 \frac{d_3}{d_2} (m)\right)\right)\right). </math>

:<math> = d_0\left(m + 2 \frac{d_1}{d_0} \left(m + 2 \frac{d_2}{d_1} \left(m + 2 \frac{d_3}{d_2} (m)\right)\right)\right). </math>


The denominators all equal one (or the term is absent), so this reduces to The denominators all equal one (or the term is absent), so this reduces to
:<math> = d_0(m + 2 {d_1} (m + 2 {d_2} (m + 2 {d_3} (m)))),</math> <math display="block"> = d_0(m + 2 {d_1} (m + 2 {d_2} (m + 2 {d_3} (m)))),</math>
or equivalently (as consistent with the "method" described above) or equivalently (as consistent with the "method" described above)
:<math> = d_3(m + 2^{-1} {d_2} (m + 2^{-1}{d_1} (m + {d_0} (m)))). </math> <math display="block"> = d_3(m + 2^{-1} {d_2} (m + 2^{-1}{d_1} (m + {d_0} (m)))). </math>


In binary (base-2) math, multiplication by a power of 2 is merely a ] operation. Thus, multiplying by 2 is calculated in base-2 by an ]. The factor (2<sup>−1</sup>) is a right ], a (0) results in no operation (since 2<sup>0</sup> = 1 is the multiplicative ]), and a (2<sup>1</sup>) results in a left arithmetic shift. In binary (base-2) math, multiplication by a power of 2 is merely a ] operation. Thus, multiplying by 2 is calculated in base-2 by an ]. The factor (2<sup>−1</sup>) is a right ], a (0) results in no operation (since 2<sup>0</sup> = 1 is the multiplicative ]), and a (2<sup>1</sup>) results in a left arithmetic shift.
Line 193: Line 179:


Consider the polynomial Consider the polynomial
<math display="block">p_6(x) = (x+8)(x+5)(x+3)(x-2)(x-3)(x-7)</math>

: <math>
p_6(x) = (x+8)(x+5)(x+3)(x-2)(x-3)(x-7)
</math>

which can be expanded to which can be expanded to
<math display="block">p_6(x) = x^6 + 4x^5 - 72x^4 -214x^3 + 1127x^2 + 1602x -5040.</math>

: <math>
p_6(x) = x^6 + 4x^5 - 72x^4 -214x^3 + 1127x^2 + 1602x -5040.
</math>


From the above we know that the largest root of this polynomial is 7 so we are able to make an initial guess of 8. Using Newton's method the first zero of 7 is found as shown in black in the figure to the right. Next <math>p(x)</math> is divided by <math>(x-7)</math> to obtain From the above we know that the largest root of this polynomial is 7 so we are able to make an initial guess of 8. Using Newton's method the first zero of 7 is found as shown in black in the figure to the right. Next <math>p(x)</math> is divided by <math>(x-7)</math> to obtain
<math display="block">p_5(x) = x^5 + 11x^4 + 5x^3 - 179x^2 - 126x + 720</math>

: <math>
p_5(x) = x^5 + 11x^4 + 5x^3 - 179x^2 - 126x + 720
</math>

which is drawn in red in the figure to the right. Newton's method is used to find the largest zero of this polynomial with an initial guess of 7. The largest zero of this polynomial which corresponds to the second largest zero of the original polynomial is found at 3 and is circled in red. The degree 5 polynomial is now divided by <math>(x-3)</math> to obtain which is drawn in red in the figure to the right. Newton's method is used to find the largest zero of this polynomial with an initial guess of 7. The largest zero of this polynomial which corresponds to the second largest zero of the original polynomial is found at 3 and is circled in red. The degree 5 polynomial is now divided by <math>(x-3)</math> to obtain
<math display="block">p_4(x) = x^4 + 14x^3 + 47x^2 - 38x - 240</math>

: <math>
p_4(x) = x^4 + 14x^3 + 47x^2 - 38x - 240
</math>

which is shown in yellow. The zero for this polynomial is found at 2 again using Newton's method and is circled in yellow. Horner's method is now used to obtain which is shown in yellow. The zero for this polynomial is found at 2 again using Newton's method and is circled in yellow. Horner's method is now used to obtain
<math display="block">p_3(x) = x^3 + 16x^2 + 79x + 120</math>

: <math>
p_3(x) = x^3 + 16x^2 + 79x + 120
</math>

which is shown in green and found to have a zero at&nbsp;&minus;3. This polynomial is further reduced to which is shown in green and found to have a zero at&nbsp;&minus;3. This polynomial is further reduced to
<math display="block">p_2(x) = x^2 + 13x + 40</math>

: <math>
p_2(x) = x^2 + 13x + 40
</math>

which is shown in blue and yields a zero of&nbsp;&minus;5. The final root of the original polynomial may be found by either using the final zero as an initial guess for Newton's method, or by reducing <math>p_2(x)</math> and solving the ]. As can be seen, the expected roots of &minus;8, &minus;5, &minus;3, 2, 3, and 7 were found. which is shown in blue and yields a zero of&nbsp;&minus;5. The final root of the original polynomial may be found by either using the final zero as an initial guess for Newton's method, or by reducing <math>p_2(x)</math> and solving the ]. As can be seen, the expected roots of &minus;8, &minus;5, &minus;3, 2, 3, and 7 were found.


Line 233: Line 196:


Horner's method can be modified to compute the divided difference <math>(p(y) - p(x))/(y - x).</math> Given the polynomial (as before) Horner's method can be modified to compute the divided difference <math>(p(y) - p(x))/(y - x).</math> Given the polynomial (as before)
<math display="block">p(x) = \sum_{i=0}^n a_i x^i = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n,</math>

:<math>p(x) = \sum_{i=0}^n a_i x^i = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_n x^n,</math>

proceed as follows<ref name="Fateman & Kahan">{{harvnb|Fateman|Kahan|2000}}</ref> proceed as follows<ref name="Fateman & Kahan">{{harvnb|Fateman|Kahan|2000}}</ref>
<math display="block">\begin{align}

:<math>\begin{align}
b_n & = a_n, &\quad d_n &= b_n, \\ b_n & = a_n, &\quad d_n &= b_n, \\
b_{n-1} & = a_{n-1} + b_n x, &\quad d_{n-1} &= b_{n-1} + d_n y, \\ b_{n-1} & = a_{n-1} + b_n x, &\quad d_{n-1} &= b_{n-1} + d_n y, \\
Line 247: Line 207:


At completion, we have At completion, we have
:<math>\begin{align} <math display="block">\begin{align}
p(x) &= b_0, \\ p(x) &= b_0, \\
\frac{p(y) - p(x)}{y - x} &= d_1, \\ \frac{p(y) - p(x)}{y - x} &= d_1, \\
p(y) &= b_0 + (y - x) d_1. p(y) &= b_0 + (y - x) d_1.
\end{align}</math> \end{align}</math>
This computation of the divided difference is subject to less round-off error than evaluating <math>p(x)</math> and <math>p(y)</math> separately, particularly when <math> x \approx y</math>. Substituting <math>y = x</math> in this method gives <math>d_1 = p'(x)</math>, the derivative of <math>p(x)</math>.
This computation of the divided difference is subject to less
round-off error than evaluating <math>p(x)</math> and <math>p(y)</math> separately, particularly when
<math> x \approx y</math>. Substituting
<math>y = x</math> in this method gives <math>d_1 = p'(x)</math>, the derivative of <math>p(x)</math>.


== History == == History ==
]'s algorithm for solving the quadratic polynomial equation<math>-x^4+763200x^2-40642560000=0</math><br />result: x=840<ref>{{harvnb|Libbrecht|2005|pages=181–191}}.</ref>]] ]'s algorithm for solving the quadratic polynomial equation<math>-x^4+763200x^2-40642560000=0</math><br />result: ''x''=840<ref>{{harvnb|Libbrecht|2005|pages=181–191}}.</ref>]]
Horner's paper, titled "A new method of solving numerical equations of all orders, by continuous approximation",<ref name="Horner">{{harvnb|Horner|1819}}.</ref> was before the Royal Society of London, at its meeting on July 1, 1819, with a sequel in 1823.<ref name="Horner" /> Horner's paper in Part II of ''Philosophical Transactions of the Royal Society of London'' for 1819 was warmly and expansively welcomed by a {{Dead link|date=January 2020|bot=InternetArchiveBot|fix-attempted=yes}} in the issue of ''The Monthly Review: or, Literary Journal'' for April, 1820; in comparison, a technical paper by ] is dismissed curtly in this review. The sequence of reviews in ''The Monthly Review'' for September, 1821, concludes that Holdred was the first person to discover a direct and general practical solution of numerical equations. Fuller<ref>{{harvnb|Fuller|1999|pages=29–51}}.</ref> showed that the method in Horner's 1819 paper differs from what afterwards became known as "Horner's method" and that in consequence the priority for this method should go to Holdred (1820). Horner's paper, titled "A new method of solving numerical equations of all orders, by continuous approximation",<ref name="Horner">{{harvnb|Horner|1819}}.</ref> was before the Royal Society of London, at its meeting on July 1, 1819, with a sequel in 1823.<ref name="Horner" /> Horner's paper in Part II of ''Philosophical Transactions of the Royal Society of London'' for 1819 was warmly and expansively welcomed by a {{Dead link|date=January 2020|bot=InternetArchiveBot|fix-attempted=yes}} in the issue of ''The Monthly Review: or, Literary Journal'' for April, 1820; in comparison, a technical paper by ] is dismissed curtly in this review. The sequence of reviews in ''The Monthly Review'' for September, 1821, concludes that Holdred was the first person to discover a direct and general practical solution of numerical equations. Fuller<ref>{{harvnb|Fuller|1999|pages=29–51}}.</ref> showed that the method in Horner's 1819 paper differs from what afterwards became known as "Horner's method" and that in consequence the priority for this method should go to Holdred (1820).


Unlike his English contemporaries, Horner drew on the Continental literature, notably the work of ]. Horner is also known to have made a close reading of John Bonneycastle's book on algebra, though he neglected the work of ]. Unlike his English contemporaries, Horner drew on the Continental literature, notably the work of ]. Horner is also known to have made a close reading of John Bonneycastle's book on algebra, though he neglected the work of ].


Although Horner is credited with making the method accessible and practical, it was known long before Horner. In reverse chronological order, Horner's method was already known to: Although Horner is credited with making the method accessible and practical, it was known long before Horner. In reverse chronological order, Horner's method was already known to:


* ] in 1809 (see ])<ref name="Cajori">{{harvnb|Cajori|1911}}.</ref><ref name="St Andrews">{{MacTutor|id=Horner}}</ref> * ] in 1809 (see ])<ref name="Cajori">{{harvnb|Cajori|1911}}.</ref><ref name="St Andrews">{{MacTutor|id=Horner}}</ref>
* ] in 1669<ref>Analysis Per Quantitatum Series, Fluctiones ac Differentias : Cum Enumeratione Linearum Tertii Ordinis, Londini. Ex Officina Pearsoniana. Anno MDCCXI, p. 10, 4th paragraph.</ref><ref>Newton's collected papers, the edition 1779, in a footnote, vol. I, p. 270-271</ref> * ] in 1669<ref>Analysis Per Quantitatum Series, Fluctiones ac Differentias : Cum Enumeratione Linearum Tertii Ordinis, Londini. Ex Officina Pearsoniana. Anno MDCCXI, p. 10, 4th paragraph.</ref><ref>Newton's collected papers, the edition 1779, in a footnote, vol. I, p. 270-271</ref>
* the ] ] in the 14th century<ref name="St Andrews" /> * the ] ] in the 14th century<ref name="St Andrews" />
Line 289: Line 246:


== References == == References ==
{{refbegin}}

*{{cite journal *{{cite journal
| last = Berggren | last = Berggren
Line 314: Line 271:
| url = http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.bams/1183421253 | url = http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.bams/1183421253
| doi = 10.1090/s0002-9904-1911-02072-9 | doi = 10.1090/s0002-9904-1911-02072-9
| doi-access = free | doi-access = free
| access-date = 2012-03-04
| archive-date = 2017-09-04
| archive-url = https://web.archive.org/web/20170904152220/http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.bams%2F1183421253
| url-status = live
}} Read before the Southwestern Section of the American Mathematical Society on November 26, 1910. }} Read before the Southwestern Section of the American Mathematical Society on November 26, 1910.
*{{cite journal *{{cite journal
Line 391: Line 352:
}} }}
*: Holdred's method is in the supplement following page numbered 45 (which is the 52nd page of the pdf version). *: Holdred's method is in the supplement following page numbered 45 (which is the 52nd page of the pdf version).
*{{cite journal|last = Horner|first = William George|author-link = William George Horner|date = July 1819|title = A new method of solving numerical equations of all orders, by continuous approximation|url = https://www.ece.cmu.edu/~ece447/s15/lib/exe/fetch.php?media=horner-1819.pdf|journal = Philosophical Transactions|publisher = Royal Society of London|volume = 109|pages = 308–335|jstor = 107508|doi = 10.1098/rstl.1819.0023|s2cid = 186210512|access-date = 2017-03-28|archive-url = https://web.archive.org/web/20170328195847/https://www.ece.cmu.edu/~ece447/s15/lib/exe/fetch.php?media=horner-1819.pdf|archive-date = 2017-03-28|url-status = dead|doi-access = free}} *{{cite journal|last = Horner|first = William George|author-link = William George Horner|date = July 1819|title = A new method of solving numerical equations of all orders, by continuous approximation|journal = Philosophical Transactions|publisher = Royal Society of London|volume = 109|pages = 308–335|jstor = 107508|doi = 10.1098/rstl.1819.0023|s2cid = 186210512|doi-access = }}
*: Directly available online via the link, but also reprinted with appraisal in D.E. Smith: ''A Source Book in Mathematics'', McGraw-Hill, 1929; Dover reprint, 2 vols, 1959. *: Directly available online via the link, but also reprinted with appraisal in D.E. Smith: ''A Source Book in Mathematics'', McGraw-Hill, 1929; Dover reprint, 2 vols, 1959.
*{{cite book *{{cite book
Line 445: Line 406:
| pages = 74–77 | pages = 74–77
| chapter-url = https://archive.org/stream/treatiseindynami033561mbp#page/n89/mode/2up | chapter-url = https://archive.org/stream/treatiseindynami033561mbp#page/n89/mode/2up
}} <!-- Yes, really! It looks as though the link is taking you to a completely different work, but you end up at Mikami's book, as you find on checking the specified pages. --> }} <!-- Yes, really! It looks as though the link is taking you to a completely different work, but you end up at Mikami's book, as you find on checking the specified pages. -->
*{{cite book *{{cite book
| last = Ostrowski | last = Ostrowski
Line 456: Line 417:
| isbn = 978-1-4832-3272-0 | isbn = 978-1-4832-3272-0
| chapter-url = http://www.sciencedirect.com/science/book/9781483232720 | chapter-url = http://www.sciencedirect.com/science/book/9781483232720
| access-date = 2016-08-23
}}
| archive-date = 2019-04-15
| archive-url = https://web.archive.org/web/20190415045523/http://www.sciencedirect.com/science/book/9781483232720
| url-status = live
}}
*{{cite journal *{{cite journal
| last = Pan | last = Pan
Line 466: Line 431:
| pages = 105–136 | pages = 105–136
| doi = 10.1070/rm1966v021n01abeh004147 | doi = 10.1070/rm1966v021n01abeh004147
| s2cid = 250869179
}}
}}
*{{cite journal *{{cite journal
| last = Pankiewicz | last = Pankiewicz
Line 479: Line 445:
| doi=10.1145/364063.364089 | doi=10.1145/364063.364089
| s2cid = 52859619 | s2cid = 52859619
| doi-access = free
}} }}
*{{cite book *{{cite book
Line 488: Line 455:
| year = 1956 | year = 1956
| publisher = McGraw-Hill | publisher = McGraw-Hill
| isbn = 9780070602267
}}
}}
*{{cite book *{{cite book
| last = Temple | last = Temple
Line 500: Line 468:
| last1 = Whittaker | last1 = Whittaker
| first1 = E.T. | first1 = E.T.
| author1-link = E._T._Whittaker | author1-link = E. T. Whittaker
| last2 = Robinson | last2 = Robinson
| first2 = G. | first2 = G.
Line 508: Line 476:
| publisher = Blackie | publisher = Blackie
| url = https://archive.org/stream/calculusofobserv031400mbp#page/n119/mode/2up/search/100 | url = https://archive.org/stream/calculusofobserv031400mbp#page/n119/mode/2up/search/100
}} }}
* {{cite book * {{cite book
| last = Wylie | last = Wylie
Line 518: Line 486:
| location = Shanghai | location = Shanghai
| chapter-url = https://archive.org/details/chineseresearche00wyliuoft | chapter-url = https://archive.org/details/chineseresearche00wyliuoft
}} }}
*: Reprinted from issues of ''The North China Herald'' (1852). *: Reprinted from issues of ''The North China Herald'' (1852).
{{refend}}

== External links == == External links ==
{{wikibooks|Algorithm Implementation|Mathematics/Polynomial evaluation|Polynomial evaluation}} {{wikibooks|Algorithm Implementation|Mathematics/Polynomial evaluation|Polynomial evaluation}}
* {{springer|title=Horner scheme|id=p/h048030}} * {{springer|title=Horner scheme|id=p/h048030}}
* Qiu Jin-Shao, (Cong Shu Ji Cheng ed.) * Qiu Jin-Shao, (Cong Shu Ji Cheng ed.)
* For more on the root-finding application see * For more on the root-finding application see {{Webarchive|url=https://web.archive.org/web/20180928120845/http://mathworld.wolfram.com/HornersMethod.html |date=2018-09-28 }}


{{Polynomials}} {{Polynomials}}


] ]
] ]
] ]

Latest revision as of 10:19, 4 January 2025

Algorithm for polynomial evaluation
This article may require cleanup to meet Misplaced Pages's quality standards. The specific problem is: See Talk:Horner's method#This Article is about Two Different Algorithms. Please help improve this article if you can. (November 2018) (Learn how and when to remove this message)

In mathematics and computer science, Horner's method (or Horner's scheme) is an algorithm for polynomial evaluation. Although named after William George Horner, this method is much older, as it has been attributed to Joseph-Louis Lagrange by Horner himself, and can be traced back many hundreds of years to Chinese and Persian mathematicians. After the introduction of computers, this algorithm became fundamental for computing efficiently with polynomials.

The algorithm is based on Horner's rule, in which a polynomial is written in nested form: a 0 + a 1 x + a 2 x 2 + a 3 x 3 + + a n x n = a 0 + x ( a 1 + x ( a 2 + x ( a 3 + + x ( a n 1 + x a n ) ) ) ) . {\displaystyle {\begin{aligned}&a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+\cdots +a_{n}x^{n}\\={}&a_{0}+x{\bigg (}a_{1}+x{\Big (}a_{2}+x{\big (}a_{3}+\cdots +x(a_{n-1}+x\,a_{n})\cdots {\big )}{\Big )}{\bigg )}.\end{aligned}}}

This allows the evaluation of a polynomial of degree n with only n {\displaystyle n} multiplications and n {\displaystyle n} additions. This is optimal, since there are polynomials of degree n that cannot be evaluated with fewer arithmetic operations.

Alternatively, Horner's method and Horner–Ruffini method also refers to a method for approximating the roots of polynomials, described by Horner in 1819. It is a variant of the Newton–Raphson method made more efficient for hand calculation by application of Horner's rule. It was widely used until computers came into general use around 1970.

Polynomial evaluation and long division

Given the polynomial p ( x ) = i = 0 n a i x i = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + + a n x n , {\displaystyle p(x)=\sum _{i=0}^{n}a_{i}x^{i}=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+\cdots +a_{n}x^{n},} where a 0 , , a n {\displaystyle a_{0},\ldots ,a_{n}} are constant coefficients, the problem is to evaluate the polynomial at a specific value x 0 {\displaystyle x_{0}} of x . {\displaystyle x.}

For this, a new sequence of constants is defined recursively as follows:

b n := a n b n 1 := a n 1 + b n x 0       b 1 := a 1 + b 2 x 0 b 0 := a 0 + b 1 x 0 . {\displaystyle {\begin{aligned}b_{n}&:=a_{n}\\b_{n-1}&:=a_{n-1}+b_{n}x_{0}\\&~~~\vdots \\b_{1}&:=a_{1}+b_{2}x_{0}\\b_{0}&:=a_{0}+b_{1}x_{0}.\end{aligned}}} 1

Then b 0 {\displaystyle b_{0}} is the value of p ( x 0 ) {\displaystyle p(x_{0})} .

To see why this works, the polynomial can be written in the form p ( x ) = a 0 + x ( a 1 + x ( a 2 + x ( a 3 + + x ( a n 1 + x a n ) ) ) )   . {\displaystyle p(x)=a_{0}+x{\bigg (}a_{1}+x{\Big (}a_{2}+x{\big (}a_{3}+\cdots +x(a_{n-1}+x\,a_{n})\cdots {\big )}{\Big )}{\bigg )}\ .}

Thus, by iteratively substituting the b i {\displaystyle b_{i}} into the expression, p ( x 0 ) = a 0 + x 0 ( a 1 + x 0 ( a 2 + + x 0 ( a n 1 + b n x 0 ) ) ) = a 0 + x 0 ( a 1 + x 0 ( a 2 + + x 0 b n 1 ) )     = a 0 + x 0 b 1 = b 0 . {\displaystyle {\begin{aligned}p(x_{0})&=a_{0}+x_{0}{\Big (}a_{1}+x_{0}{\big (}a_{2}+\cdots +x_{0}(a_{n-1}+b_{n}x_{0})\cdots {\big )}{\Big )}\\&=a_{0}+x_{0}{\Big (}a_{1}+x_{0}{\big (}a_{2}+\cdots +x_{0}b_{n-1}{\big )}{\Big )}\\&~~\vdots \\&=a_{0}+x_{0}b_{1}\\&=b_{0}.\end{aligned}}}

Now, it can be proven that;

p ( x ) = ( b 1 + b 2 x + b 3 x 2 + b 4 x 3 + + b n 1 x n 2 + b n x n 1 ) ( x x 0 ) + b 0 {\displaystyle p(x)=\left(b_{1}+b_{2}x+b_{3}x^{2}+b_{4}x^{3}+\cdots +b_{n-1}x^{n-2}+b_{n}x^{n-1}\right)\left(x-x_{0}\right)+b_{0}} 2

This expression constitutes Horner's practical application, as it offers a very quick way of determining the outcome of; p ( x ) / ( x x 0 ) {\displaystyle p(x)/(x-x_{0})} with b 0 {\displaystyle b_{0}} (which is equal to p ( x 0 ) {\displaystyle p(x_{0})} ) being the division's remainder, as is demonstrated by the examples below. If x 0 {\displaystyle x_{0}} is a root of p ( x ) {\displaystyle p(x)} , then b 0 = 0 {\displaystyle b_{0}=0} (meaning the remainder is 0 {\displaystyle 0} ), which means you can factor p ( x ) {\displaystyle p(x)} as x x 0 {\displaystyle x-x_{0}} .

To finding the consecutive b {\displaystyle b} -values, you start with determining b n {\displaystyle b_{n}} , which is simply equal to a n {\displaystyle a_{n}} . Then you then work recursively using the formula: b n 1 = a n 1 + b n x 0 {\displaystyle b_{n-1}=a_{n-1}+b_{n}x_{0}} till you arrive at b 0 {\displaystyle b_{0}} .

Examples

Evaluate f ( x ) = 2 x 3 6 x 2 + 2 x 1 {\displaystyle f(x)=2x^{3}-6x^{2}+2x-1} for x = 3 {\displaystyle x=3} .

We use synthetic division as follows:

 x0x    x    x    x
 3 │   2    −6     2    −1
   │         6     0     6
   └────────────────────────
       2     0     2     5

The entries in the third row are the sum of those in the first two. Each entry in the second row is the product of the x-value (3 in this example) with the third-row entry immediately to the left. The entries in the first row are the coefficients of the polynomial to be evaluated. Then the remainder of f ( x ) {\displaystyle f(x)} on division by x 3 {\displaystyle x-3} is 5.

But by the polynomial remainder theorem, we know that the remainder is f ( 3 ) {\displaystyle f(3)} . Thus, f ( 3 ) = 5 {\displaystyle f(3)=5} .

In this example, if a 3 = 2 , a 2 = 6 , a 1 = 2 , a 0 = 1 {\displaystyle a_{3}=2,a_{2}=-6,a_{1}=2,a_{0}=-1} we can see that b 3 = 2 , b 2 = 0 , b 1 = 2 , b 0 = 5 {\displaystyle b_{3}=2,b_{2}=0,b_{1}=2,b_{0}=5} , the entries in the third row. So, synthetic division (which was actually invented and published by Ruffini 10 years before Horner's publication) is easier to use; it can be shown to be equivalent to Horner's method.

As a consequence of the polynomial remainder theorem, the entries in the third row are the coefficients of the second-degree polynomial, the quotient of f ( x ) {\displaystyle f(x)} on division by x 3 {\displaystyle x-3} . The remainder is 5. This makes Horner's method useful for polynomial long division.

Divide x 3 6 x 2 + 11 x 6 {\displaystyle x^{3}-6x^{2}+11x-6} by x 2 {\displaystyle x-2} :

 2 │   1    −6    11    −6
   │         2    −8     6
   └────────────────────────
       1    −4     3     0

The quotient is x 2 4 x + 3 {\displaystyle x^{2}-4x+3} .

Let f 1 ( x ) = 4 x 4 6 x 3 + 3 x 5 {\displaystyle f_{1}(x)=4x^{4}-6x^{3}+3x-5} and f 2 ( x ) = 2 x 1 {\displaystyle f_{2}(x)=2x-1} . Divide f 1 ( x ) {\displaystyle f_{1}(x)} by f 2 ( x ) {\displaystyle f_{2}\,(x)} using Horner's method.

  0.5 │ 4  −6   0   3  −5
      │     2  −2  −1   1
      └───────────────────────
        2  −2  −1   1  −4

The third row is the sum of the first two rows, divided by 2. Each entry in the second row is the product of 1 with the third-row entry to the left. The answer is f 1 ( x ) f 2 ( x ) = 2 x 3 2 x 2 x + 1 4 2 x 1 . {\displaystyle {\frac {f_{1}(x)}{f_{2}(x)}}=2x^{3}-2x^{2}-x+1-{\frac {4}{2x-1}}.}

Efficiency

Evaluation using the monomial form of a degree n {\displaystyle n} polynomial requires at most n {\displaystyle n} additions and ( n 2 + n ) / 2 {\displaystyle (n^{2}+n)/2} multiplications, if powers are calculated by repeated multiplication and each monomial is evaluated individually. The cost can be reduced to n {\displaystyle n} additions and 2 n 1 {\displaystyle 2n-1} multiplications by evaluating the powers of x {\displaystyle x} by iteration.

If numerical data are represented in terms of digits (or bits), then the naive algorithm also entails storing approximately 2 n {\displaystyle 2n} times the number of bits of x {\displaystyle x} : the evaluated polynomial has approximate magnitude x n {\displaystyle x^{n}} , and one must also store x n {\displaystyle x^{n}} itself. By contrast, Horner's method requires only n {\displaystyle n} additions and n {\displaystyle n} multiplications, and its storage requirements are only n {\displaystyle n} times the number of bits of x {\displaystyle x} . Alternatively, Horner's method can be computed with n {\displaystyle n} fused multiply–adds. Horner's method can also be extended to evaluate the first k {\displaystyle k} derivatives of the polynomial with k n {\displaystyle kn} additions and multiplications.

Horner's method is optimal, in the sense that any algorithm to evaluate an arbitrary polynomial must use at least as many operations. Alexander Ostrowski proved in 1954 that the number of additions required is minimal. Victor Pan proved in 1966 that the number of multiplications is minimal. However, when x {\displaystyle x} is a matrix, Horner's method is not optimal.

This assumes that the polynomial is evaluated in monomial form and no preconditioning of the representation is allowed, which makes sense if the polynomial is evaluated only once. However, if preconditioning is allowed and the polynomial is to be evaluated many times, then faster algorithms are possible. They involve a transformation of the representation of the polynomial. In general, a degree- n {\displaystyle n} polynomial can be evaluated using only ⌊n/2⌋+2 multiplications and n {\displaystyle n} additions.

Parallel evaluation

See also: Estrin's scheme

A disadvantage of Horner's rule is that all of the operations are sequentially dependent, so it is not possible to take advantage of instruction level parallelism on modern computers. In most applications where the efficiency of polynomial evaluation matters, many low-order polynomials are evaluated simultaneously (for each pixel or polygon in computer graphics, or for each grid square in a numerical simulation), so it is not necessary to find parallelism within a single polynomial evaluation.

If, however, one is evaluating a single polynomial of very high order, it may be useful to break it up as follows: p ( x ) = i = 0 n a i x i = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + + a n x n = ( a 0 + a 2 x 2 + a 4 x 4 + ) + ( a 1 x + a 3 x 3 + a 5 x 5 + ) = ( a 0 + a 2 x 2 + a 4 x 4 + ) + x ( a 1 + a 3 x 2 + a 5 x 4 + ) = i = 0 n / 2 a 2 i x 2 i + x i = 0 n / 2 a 2 i + 1 x 2 i = p 0 ( x 2 ) + x p 1 ( x 2 ) . {\displaystyle {\begin{aligned}p(x)&=\sum _{i=0}^{n}a_{i}x^{i}\\&=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+\cdots +a_{n}x^{n}\\&=\left(a_{0}+a_{2}x^{2}+a_{4}x^{4}+\cdots \right)+\left(a_{1}x+a_{3}x^{3}+a_{5}x^{5}+\cdots \right)\\&=\left(a_{0}+a_{2}x^{2}+a_{4}x^{4}+\cdots \right)+x\left(a_{1}+a_{3}x^{2}+a_{5}x^{4}+\cdots \right)\\&=\sum _{i=0}^{\lfloor n/2\rfloor }a_{2i}x^{2i}+x\sum _{i=0}^{\lfloor n/2\rfloor }a_{2i+1}x^{2i}\\&=p_{0}(x^{2})+xp_{1}(x^{2}).\end{aligned}}}

More generally, the summation can be broken into k parts: p ( x ) = i = 0 n a i x i = j = 0 k 1 x j i = 0 n / k a k i + j x k i = j = 0 k 1 x j p j ( x k ) {\displaystyle p(x)=\sum _{i=0}^{n}a_{i}x^{i}=\sum _{j=0}^{k-1}x^{j}\sum _{i=0}^{\lfloor n/k\rfloor }a_{ki+j}x^{ki}=\sum _{j=0}^{k-1}x^{j}p_{j}(x^{k})} where the inner summations may be evaluated using separate parallel instances of Horner's method. This requires slightly more operations than the basic Horner's method, but allows k-way SIMD execution of most of them. Modern compilers generally evaluate polynomials this way when advantageous, although for floating-point calculations this requires enabling (unsafe) reassociative math.

Application to floating-point multiplication and division

Main article: multiplication algorithm § Shift and add

Horner's method is a fast, code-efficient method for multiplication and division of binary numbers on a microcontroller with no hardware multiplier. One of the binary numbers to be multiplied is represented as a trivial polynomial, where (using the above notation) a i = 1 {\displaystyle a_{i}=1} , and x = 2 {\displaystyle x=2} . Then, x (or x to some power) is repeatedly factored out. In this binary numeral system (base 2), x = 2 {\displaystyle x=2} , so powers of 2 are repeatedly factored out.

Example

For example, to find the product of two numbers (0.15625) and m: ( 0.15625 ) m = ( 0.00101 b ) m = ( 2 3 + 2 5 ) m = ( 2 3 ) m + ( 2 5 ) m = 2 3 ( m + ( 2 2 ) m ) = 2 3 ( m + 2 2 ( m ) ) . {\displaystyle {\begin{aligned}(0.15625)m&=(0.00101_{b})m=\left(2^{-3}+2^{-5}\right)m=\left(2^{-3})m+(2^{-5}\right)m\\&=2^{-3}\left(m+\left(2^{-2}\right)m\right)=2^{-3}\left(m+2^{-2}(m)\right).\end{aligned}}}

Method

To find the product of two binary numbers d and m:

  1. A register holding the intermediate result is initialized to d.
  2. Begin with the least significant (rightmost) non-zero bit in m.
    1. Count (to the left) the number of bit positions to the next most significant non-zero bit. If there are no more-significant bits, then take the value of the current bit position.
    2. Using that value, perform a left-shift operation by that number of bits on the register holding the intermediate result
  3. If all the non-zero bits were counted, then the intermediate result register now holds the final result. Otherwise, add d to the intermediate result, and continue in step 2 with the next most significant bit in m.

Derivation

In general, for a binary number with bit values ( d 3 d 2 d 1 d 0 {\displaystyle d_{3}d_{2}d_{1}d_{0}} ) the product is ( d 3 2 3 + d 2 2 2 + d 1 2 1 + d 0 2 0 ) m = d 3 2 3 m + d 2 2 2 m + d 1 2 1 m + d 0 2 0 m . {\displaystyle (d_{3}2^{3}+d_{2}2^{2}+d_{1}2^{1}+d_{0}2^{0})m=d_{3}2^{3}m+d_{2}2^{2}m+d_{1}2^{1}m+d_{0}2^{0}m.} At this stage in the algorithm, it is required that terms with zero-valued coefficients are dropped, so that only binary coefficients equal to one are counted, thus the problem of multiplication or division by zero is not an issue, despite this implication in the factored equation: = d 0 ( m + 2 d 1 d 0 ( m + 2 d 2 d 1 ( m + 2 d 3 d 2 ( m ) ) ) ) . {\displaystyle =d_{0}\left(m+2{\frac {d_{1}}{d_{0}}}\left(m+2{\frac {d_{2}}{d_{1}}}\left(m+2{\frac {d_{3}}{d_{2}}}(m)\right)\right)\right).}

The denominators all equal one (or the term is absent), so this reduces to = d 0 ( m + 2 d 1 ( m + 2 d 2 ( m + 2 d 3 ( m ) ) ) ) , {\displaystyle =d_{0}(m+2{d_{1}}(m+2{d_{2}}(m+2{d_{3}}(m)))),} or equivalently (as consistent with the "method" described above) = d 3 ( m + 2 1 d 2 ( m + 2 1 d 1 ( m + d 0 ( m ) ) ) ) . {\displaystyle =d_{3}(m+2^{-1}{d_{2}}(m+2^{-1}{d_{1}}(m+{d_{0}}(m)))).}

In binary (base-2) math, multiplication by a power of 2 is merely a register shift operation. Thus, multiplying by 2 is calculated in base-2 by an arithmetic shift. The factor (2) is a right arithmetic shift, a (0) results in no operation (since 2 = 1 is the multiplicative identity element), and a (2) results in a left arithmetic shift. The multiplication product can now be quickly calculated using only arithmetic shift operations, addition and subtraction.

The method is particularly fast on processors supporting a single-instruction shift-and-addition-accumulate. Compared to a C floating-point library, Horner's method sacrifices some accuracy, however it is nominally 13 times faster (16 times faster when the "canonical signed digit" (CSD) form is used) and uses only 20% of the code space.

Other applications

Horner's method can be used to convert between different positional numeral systems – in which case x is the base of the number system, and the ai coefficients are the digits of the base-x representation of a given number – and can also be used if x is a matrix, in which case the gain in computational efficiency is even greater. However, for such cases faster methods are known.

Polynomial root finding

Using the long division algorithm in combination with Newton's method, it is possible to approximate the real roots of a polynomial. The algorithm works as follows. Given a polynomial p n ( x ) {\displaystyle p_{n}(x)} of degree n {\displaystyle n} with zeros z n < z n 1 < < z 1 , {\displaystyle z_{n}<z_{n-1}<\cdots <z_{1},} make some initial guess x 0 {\displaystyle x_{0}} such that z 1 < x 0 {\displaystyle z_{1}<x_{0}} . Now iterate the following two steps:

  1. Using Newton's method, find the largest zero z 1 {\displaystyle z_{1}} of p n ( x ) {\displaystyle p_{n}(x)} using the guess x 0 {\displaystyle x_{0}} .
  2. Using Horner's method, divide out ( x z 1 ) {\displaystyle (x-z_{1})} to obtain p n 1 {\displaystyle p_{n-1}} . Return to step 1 but use the polynomial p n 1 {\displaystyle p_{n-1}} and the initial guess z 1 {\displaystyle z_{1}} .

These two steps are repeated until all real zeros are found for the polynomial. If the approximated zeros are not precise enough, the obtained values can be used as initial guesses for Newton's method but using the full polynomial rather than the reduced polynomials.

Example

Polynomial root finding using Horner's method

Consider the polynomial p 6 ( x ) = ( x + 8 ) ( x + 5 ) ( x + 3 ) ( x 2 ) ( x 3 ) ( x 7 ) {\displaystyle p_{6}(x)=(x+8)(x+5)(x+3)(x-2)(x-3)(x-7)} which can be expanded to p 6 ( x ) = x 6 + 4 x 5 72 x 4 214 x 3 + 1127 x 2 + 1602 x 5040. {\displaystyle p_{6}(x)=x^{6}+4x^{5}-72x^{4}-214x^{3}+1127x^{2}+1602x-5040.}

From the above we know that the largest root of this polynomial is 7 so we are able to make an initial guess of 8. Using Newton's method the first zero of 7 is found as shown in black in the figure to the right. Next p ( x ) {\displaystyle p(x)} is divided by ( x 7 ) {\displaystyle (x-7)} to obtain p 5 ( x ) = x 5 + 11 x 4 + 5 x 3 179 x 2 126 x + 720 {\displaystyle p_{5}(x)=x^{5}+11x^{4}+5x^{3}-179x^{2}-126x+720} which is drawn in red in the figure to the right. Newton's method is used to find the largest zero of this polynomial with an initial guess of 7. The largest zero of this polynomial which corresponds to the second largest zero of the original polynomial is found at 3 and is circled in red. The degree 5 polynomial is now divided by ( x 3 ) {\displaystyle (x-3)} to obtain p 4 ( x ) = x 4 + 14 x 3 + 47 x 2 38 x 240 {\displaystyle p_{4}(x)=x^{4}+14x^{3}+47x^{2}-38x-240} which is shown in yellow. The zero for this polynomial is found at 2 again using Newton's method and is circled in yellow. Horner's method is now used to obtain p 3 ( x ) = x 3 + 16 x 2 + 79 x + 120 {\displaystyle p_{3}(x)=x^{3}+16x^{2}+79x+120} which is shown in green and found to have a zero at −3. This polynomial is further reduced to p 2 ( x ) = x 2 + 13 x + 40 {\displaystyle p_{2}(x)=x^{2}+13x+40} which is shown in blue and yields a zero of −5. The final root of the original polynomial may be found by either using the final zero as an initial guess for Newton's method, or by reducing p 2 ( x ) {\displaystyle p_{2}(x)} and solving the linear equation. As can be seen, the expected roots of −8, −5, −3, 2, 3, and 7 were found.

Divided difference of a polynomial

Horner's method can be modified to compute the divided difference ( p ( y ) p ( x ) ) / ( y x ) . {\displaystyle (p(y)-p(x))/(y-x).} Given the polynomial (as before) p ( x ) = i = 0 n a i x i = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + + a n x n , {\displaystyle p(x)=\sum _{i=0}^{n}a_{i}x^{i}=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+\cdots +a_{n}x^{n},} proceed as follows b n = a n , d n = b n , b n 1 = a n 1 + b n x , d n 1 = b n 1 + d n y ,         b 1 = a 1 + b 2 x , d 1 = b 1 + d 2 y , b 0 = a 0 + b 1 x . {\displaystyle {\begin{aligned}b_{n}&=a_{n},&\quad d_{n}&=b_{n},\\b_{n-1}&=a_{n-1}+b_{n}x,&\quad d_{n-1}&=b_{n-1}+d_{n}y,\\&{}\ \ \vdots &\quad &{}\ \ \vdots \\b_{1}&=a_{1}+b_{2}x,&\quad d_{1}&=b_{1}+d_{2}y,\\b_{0}&=a_{0}+b_{1}x.\end{aligned}}}

At completion, we have p ( x ) = b 0 , p ( y ) p ( x ) y x = d 1 , p ( y ) = b 0 + ( y x ) d 1 . {\displaystyle {\begin{aligned}p(x)&=b_{0},\\{\frac {p(y)-p(x)}{y-x}}&=d_{1},\\p(y)&=b_{0}+(y-x)d_{1}.\end{aligned}}} This computation of the divided difference is subject to less round-off error than evaluating p ( x ) {\displaystyle p(x)} and p ( y ) {\displaystyle p(y)} separately, particularly when x y {\displaystyle x\approx y} . Substituting y = x {\displaystyle y=x} in this method gives d 1 = p ( x ) {\displaystyle d_{1}=p'(x)} , the derivative of p ( x ) {\displaystyle p(x)} .

History

Qin Jiushao's algorithm for solving the quadratic polynomial equation x 4 + 763200 x 2 40642560000 = 0 {\displaystyle -x^{4}+763200x^{2}-40642560000=0}
result: x=840

Horner's paper, titled "A new method of solving numerical equations of all orders, by continuous approximation", was read before the Royal Society of London, at its meeting on July 1, 1819, with a sequel in 1823. Horner's paper in Part II of Philosophical Transactions of the Royal Society of London for 1819 was warmly and expansively welcomed by a reviewer in the issue of The Monthly Review: or, Literary Journal for April, 1820; in comparison, a technical paper by Charles Babbage is dismissed curtly in this review. The sequence of reviews in The Monthly Review for September, 1821, concludes that Holdred was the first person to discover a direct and general practical solution of numerical equations. Fuller showed that the method in Horner's 1819 paper differs from what afterwards became known as "Horner's method" and that in consequence the priority for this method should go to Holdred (1820).

Unlike his English contemporaries, Horner drew on the Continental literature, notably the work of Arbogast. Horner is also known to have made a close reading of John Bonneycastle's book on algebra, though he neglected the work of Paolo Ruffini.

Although Horner is credited with making the method accessible and practical, it was known long before Horner. In reverse chronological order, Horner's method was already known to:

Qin Jiushao, in his Shu Shu Jiu Zhang (Mathematical Treatise in Nine Sections; 1247), presents a portfolio of methods of Horner-type for solving polynomial equations, which was based on earlier works of the 11th century Song dynasty mathematician Jia Xian; for example, one method is specifically suited to bi-quintics, of which Qin gives an instance, in keeping with the then Chinese custom of case studies. Yoshio Mikami in Development of Mathematics in China and Japan (Leipzig 1913) wrote:

"... who can deny the fact of Horner's illustrious process being used in China at least nearly six long centuries earlier than in Europe ... We of course don't intend in any way to ascribe Horner's invention to a Chinese origin, but the lapse of time sufficiently makes it not altogether impossible that the Europeans could have known of the Chinese method in a direct or indirect way."

Ulrich Libbrecht concluded: It is obvious that this procedure is a Chinese invention ... the method was not known in India. He said, Fibonacci probably learned of it from Arabs, who perhaps borrowed from the Chinese. The extraction of square and cube roots along similar lines is already discussed by Liu Hui in connection with Problems IV.16 and 22 in Jiu Zhang Suan Shu, while Wang Xiaotong in the 7th century supposes his readers can solve cubics by an approximation method described in his book Jigu Suanjing.

See also

Notes

  1. 600 years earlier, by the Chinese mathematician Qin Jiushao and 700 years earlier, by the Persian mathematician Sharaf al-Dīn al-Ṭūsī
  2. Pan 1966
  3. Pankiewicz 1968.
  4. Ostrowski 1954.
  5. Pan 1966.
  6. Knuth 1997.
  7. Kripasagar 2008, p. 62.
  8. Higham 2002, Section 5.4.
  9. Kress 1991, p. 112.
  10. Fateman & Kahan 2000
  11. Libbrecht 2005, pp. 181–191.
  12. ^ Horner 1819.
  13. Fuller 1999, pp. 29–51.
  14. Cajori 1911.
  15. ^ O'Connor, John J.; Robertson, Edmund F., "Horner's method", MacTutor History of Mathematics Archive, University of St Andrews
  16. Analysis Per Quantitatum Series, Fluctiones ac Differentias : Cum Enumeratione Linearum Tertii Ordinis, Londini. Ex Officina Pearsoniana. Anno MDCCXI, p. 10, 4th paragraph.
  17. Newton's collected papers, the edition 1779, in a footnote, vol. I, p. 270-271
  18. Berggren 1990, pp. 304–309.
  19. Temple 1986, p. 142.
  20. Mikami 1913, p. 77
  21. Libbrecht 2005, p. 208.

References

External links

Polynomials and polynomial functions
By degree
By properties
Tools and algorithms
Categories: