Solving Multiple-Root Polynomials
Solving Multiple-Root Polynomials
Abstract
A given polynomial is transformed herein into a rational function. All the roots and multiplicities of the polynomial are then
easily obtained from the poles and residues of this rational function, instead of solving for them directly using the original,
high-degree multiple-root polynomial. The derived program, using only basic MATLAB built-in routines and existing double-
precision arithmetic, amazingly gives the expected results for test polynomials of very high degree and multiplicity, even as
.
high as p (x) = ( x+98.765 )1234 .
Keywords: Numerical analysis; mathematical programming; polynomial solutions; roots and multiplicities; poles and residues;
rational function; partial fraction expansion; greatest common divisor; Euclidean GCD algorithm
1. Introduction Zk and mk are then simply the poles and residues of the rational
function r(x). In other words, the K desired roots Zk of p (x) are
finding the poles and residues of this rational function, instead of multiple-root polynomial p ( x) = 0, where
by directly solving the original, high-degree multiple-root
polynomial. The approach requires computation of the greatest K
common divisor (GCD). The simple and efficient algorithm by u(x)= TI(X-Zk)' (3)
Chang [1] is employed. It requires only simple arithmetic k==1
operations, without the use of any advanced mathematics. A code
in MATLAB is provided, along with a typical numerical example.
This routine, using only existing double precision, gives the The corresponding multiplicities, mk' are simply the partial
expected results for test polynomials of very high degree and fraction expansion coefficients of the rational function
multiplicities. r(x) = v(x)/u(x):
2. Formulation (4)
k=l x-zk
(6)
IEEEAntennas and Propagation Magazine, Vol. 51, No. 6, December 2009 151
It follows from the first relation that 3. Computer Routines
r(x) = v(x) = p'(x) (7) The program source-code listing, using only basic MATLAB
u(x) p(x)· built-in routines, is herein presented (Figure 1). The input p to the
program is a coefficient vector of the given polynomial p (x), and
Then
the output Z is the list of computed root-multiplicity pairs, zk' mk .
The polynomial coefficients can be either real or complex
u(x)= p(x) numbers.
g(x) ,
(8) A short program is also provided to create a test polynomial
v(x) = p'(x) coefficient vector from several powered polynomial factors
g(x) , (Figure 2).
where
4. A Typical Example
g(x) = gcd[p(x),p'(x)] (9)
Figure 3 shows the results of using the above programs to
is the greatest common divisor of p(x) and p'(x). A pair of solve the following test polynomial, p(x):
polynomials, u (x) and v( x), for the rational function r (x) are
thus determined once the polynomial greatest common divisor
g ( x) is generated. p(x)=(x4 _1)3 (x3 - x2t (x3 +x- 10t
Of crucial concern in carrying out the process so far is the (x3 +Sx2+llx+1S)(x2-4X+3t x (10),
polynomial greatest common divisor computation. The algorithm
"monic polynomial subtraction" developed by Chang [1] is applied Le.,
here. It is adapted and modified from longhand division in the p(x) = x 32 _5x 31 + 2x 30 _6x 29 + 76x 28
classical Euclidean algorithm. All required computations involve
only elementary arithmetic operations, without the use of any + ...-87555x7 + 55800x6 -13500x5 . (11)
advanced mathematics.
function Z = polyroots(p)
% *** Solve multiple-root polymonials ***
% Revised to efficient compact form.
»Z polyroots(p)
z =
3.0000 2
-3.0000 1
-1.0000 + 2.0000i 3
-1.0000 - 2.0000i 3
2.0000 2
-1.0000 3
-0.0000 + 1.0000i 3
-0.0000 - 1.0000i 3
1.0000 7
0.0000 5
IEEE Antennas and Propagation Magazine, Vol. 51, No. 6, December 2009 153
p(x) =(x+1.01)3 (X+1.00)5 (x+0.99)7. (12) 7. References
The author wishes to thank Dr. Jan Grzesik of Allwave 2. Z. Zeng, "Computing Multiple Roots of Inexact Polynomials,"
Corporation, Torrance, California, for his useful discussions and Mathematics ofComputation, 74, 2005, pp. 869-903.
comments on the preparation of the manuscript.
»
» % Ex. 1
»A ([30 -1 1; 25 +2 1; 20 -3 1; 15 +4 1; 10 -5 1; 5 +6 1]);
» p = polyget(A);
» Z = polyroots(p),
Z
-6.00000 5
5.00000 10
-3.99999 15
-2.00000 25
2.99999 20
1.00000 30
» % Ex. 2
» A [10 9 8 7 6 5 4 3 2 1] ;
» p polyget (A) ;
» Z polyroots (p) ,
Z
-1.2887 + 0.4476i 10
-1.2887 - 0.4476i 10
-0.7243 + 1.1369i 10
-0.7243 - 1.1369i 10
0.1363 + 1.3049i 10
0.1363 - 1.3049i 10
0.8767 + 0.8813i 10
0.8767 - 0.8813i 10
» % Ex. 3
» A [9 -1+2i 1; 8 3-4i 1; 7 -5-6i 1] ;
» p polyget (A) i
» Z polyroots (p) I
Z
5.0000 + 6.0000i 7
-3.0000 + 4.0000i 8
1.0000 - 2.0000i 9
» % Ex. 4
» A [9 -1.1234 1; 8 +2.5678 1; 7 -3.9123 1; 6 +4.4567 1;
» 5 -5.8912 1; 4 +6.3456 1; 3 -7.7891 1; 2 +8.2345 1;
» 1 -9.6789 1]) i
» p polyget (A) i
» Z polyroots (p) ,
Z
9.6789 1
-8.2345 2
7.7891 3
-6.3456 4
5.8912 5
-4.4567 6
3.9123 7
-2.5678 8
1.1234 9
» % Ex. 8
7. ( tOO
p(z) = z8_ 1
» p = polyget([70 -9876 12345]) i
» Z = polyroots(p),
Z 8. p(z) = (12345z -9876)70
0.8 70
» % Ex. 9
» p = polyget([1234 1 123456789]) i
9. p( z) = (123456789z _1)1234
» Z = polyroots(p),
Z
-8.10000007371e-009
10. p( z) = (z -123456789)9876
1234
» % Ex. 10
» p = polyget([9876 -123456789 1]) i
» Z = polyroots(p),
Z
123456789 9876
IEEE Antennasand Propagation Magazine, Vol. 51, No. 6, December 2009 155