Horner scheme
From Wikipedia, the free encyclopedia
|
In numerical analysis, the Horner scheme or Horner algorithm, named after William George Horner, is an algorithm for the efficient evaluation of polynomials in monomial form. Horner's method describes a manual process by which one may approximate the roots of a polynomial equation. The Horner scheme can also be viewed as a fast algorithm for dividing a polynomial by a linear polynomial with Ruffini's rule.
Description of the algorithmGiven the polynomial
where Failed to parse (Missing texvc executable; please see math/README to configure.): a_0, \ldots, a_n are real numbers, we wish to evaluate the polynomial at a specific value of Failed to parse (Missing texvc executable; please see math/README to configure.): x\,\! , say Failed to parse (Missing texvc executable; please see math/README to configure.): x_0\,\! . To accomplish this, we define a new sequence of constants as follows:
Then Failed to parse (Missing texvc executable; please see math/README to configure.): b_0\,\! is the value of Failed to parse (Missing texvc executable; please see math/README to configure.): p(x_0)\,\! . To see why this works, note that the polynomial can be written in the form
into the expression,
ExamplesEvaluate Failed to parse (Missing texvc executable; please see math/README to configure.): f_1(x)=2x^3-6x^2+2x-1\, for Failed to parse (Missing texvc executable; please see math/README to configure.): x=3\; . By repeatedly factoring out Failed to parse (Missing texvc executable; please see math/README to configure.): x , Failed to parse (Missing texvc executable; please see math/README to configure.): f_1 may be rewritten as Failed to parse (Missing texvc executable; please see math/README to configure.): x(x(2x-6)+2)-1\; . We use a synthetic diagram to organize these calculations and make the process faster.
Failed to parse (Missing texvc executable; please see math/README to configure.): x_0
| Failed to parse (Missing texvc executable; please see math/README to configure.): x^3
Failed to parse (Missing texvc executable; please see math/README to configure.): x^2
Failed to parse (Missing texvc executable; please see math/README to configure.): x^1
Failed to parse (Missing texvc executable; please see math/README to configure.): x^0
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. The answer is 5. As a consequence of the polynomial remainder theorem, the entries in the third row are the coefficients of the second-degree polynomial that is the quotient of f1/(x-3). The remainder is 5. This makes Horner's method useful for polynomial long division. Divide Failed to parse (Missing texvc executable; please see math/README to configure.): x^3-6x^2+11x-6\, by Failed to parse (Missing texvc executable; please see math/README to configure.): x-2
2 | 1 -6 11 -6
| 2 -8 6
|----------------------
1 -4 3 0
The quotient is Failed to parse (Missing texvc executable; please see math/README to configure.): x^2-4x+3 . Let Failed to parse (Missing texvc executable; please see math/README to configure.): f_1(x)=4x^4-6x^3+3x-5\, and Failed to parse (Missing texvc executable; please see math/README to configure.): f_2(x)=2x-1\, . Divide Failed to parse (Missing texvc executable; please see math/README to configure.): f_1(x)\, by Failed to parse (Missing texvc executable; please see math/README to configure.): f_2\,(x) using Horner's scheme.
2 | 4 -6 0 3 | -5
---------------------------|------
1 | 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
Floating point multiplication and divisionHorner's method is a fast, code-efficient method for multiplication and division of binary numbers on a microcontroller with no math coprocessor. One of the binary numbers to be multiplied is represented as a trivial polynomial, where, (using the above notation): ai = 1, and x = 2. Then, x (or x to some power) is repeatedly factored out. In this binary numeral system (base 2), x = 2, so powers of 2 are repeatedly factored out. ExampleFor example, to find the product of two numbers, (0.15625) and "m":
MethodTo find the product of two binary numbers, "d" and "m".
DerivationIn general, for a binary number with bit values: (Failed to parse (Missing texvc executable; please see math/README to configure.): d_3 d_2 d_1 d_0 ) the product is:
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:
or equivalently (as consistent with the "method" described above):
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. (Kripasagar 62) [1] ApplicationThe Horner scheme is often 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. EfficiencyEvaluation using the monomial form of a degree-n polynomial requires at most n additions and (n2 + n)/2 multiplications, if powers are calculated by repeated multiplication and each monomial is evaluated individually. (This can be reduced to n additions and 2n + 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 2n times the number of bits of x (the evaluated polynomial has approximate magnitude xn, and one must also store xn itself). By contrast, Horner's scheme requires only n additions and n multiplications, and its storage requirements are only n times the number of bits of x. Alternatively, Horner's scheme can be computed with n fused multiply-adds. It has been shown that the Horner scheme is optimal, in the sense that any algorithm to evaluate an arbitrary polynomial must use at least as many operations. That the number of additions required is minimal was shown by Alexander Ostrowski in 1954; that the number of multiplications is minimal by Victor Pan, in 1966. When x is a matrix, the Horner scheme 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 polynomial can be evaluated using only Failed to parse (Missing texvc executable; please see math/README to configure.): {\scriptstyle{\left\lfloor \frac{n}{2} \right\rfloor + 2}} multiplications and n additions (see Knuth: The Art of Computer Programming, Vol.2). HistoryEven though the algorithm is named after William George Horner, who described it in 1819, the method was already known to Isaac Newton in 1669, and even earlier to the Chinese mathematician Ch'in Chiu-Shao in Mathematical Treatise in Nine Sections in the 13th century. See also
References
External links
de:Horner-Schema es:Algoritmo de Horner eo:Hornera algoritmo fr:Méthode de Horner it:Regola di Horner nl:Hornerschema pl:Schemat Hornera pt:Esquema de Horner sv:Horners algoritm ru:Схема Горнера |


