# Polynomial Roots

Up ] Nonlinear ] Linear ] Integration ] [ Roots ] XBCD_Math ] Parsers ]

In circuit and control systems theory, a need for determining the complex roots of polynomials frequently arises. In fact, whenever Laplace transforms are tools of choice for solving systems governed by differential equations, polynomials will occur. In these applications the roots are generally complex, so there is a common need for a solver which finds all roots, real and complex.

This page provides links to several files which will do the job. You will find software based on Bairstow's method, which uses a Newton-type iteration on quadratic factors, and a full port of the famous Jenkins-Traub method from FORTRAN to C++.

For those situations which require polynomial roots beyond double precision accuracy, the Jenkins-Traub method has been ported to the XBCD extended precision math package. A command line executable using extended precision can be found here.

## A New Method for Finding Real and Complex Polynomial Roots

Here you will find C++ source code and a DOS executable implementing a new method for finding polynomial roots. A paper describing the method in detail is also available. The method was developed to solve convergence problems associated with iterative methods for finding roots when the multiplicity of one or more roots is greater than unity. It uses recursive differentiation to reduce the order of multiple roots to unity so that the root location can be found to machine accuracy.

This method has also been implemented in XBCD extended precision format. Polynomial root finding is one of the areas of applied math where extended precision is often required. The program: xbbpr.exe is available here as a (*.zip) file.

## A High Performance 'Front End' for Iterative Polynomial Root Finders

The method described in the previous section uses recursive differentiation to isolate multiple roots for extraction at machine precision. It has been found to be very successful at recovering roots of polynomials which defeat conventional solvers. The solution strategy described in this paper uses Euclid's algorithm to identify and divide out multiple roots so that the solver never has to deal with them at all. The process is stable and has been implemented in a preprocessor (front end) which works with an iterative solver to find all real and complex roots of real polynomials.

The use of Euclid's algorithm to determine the greatest common divisor (GCD) of a polynomial, sometimes called the greatest common factor (GCF), in connection with the multiple root problem has been suggested before amid mixed reviews. Nevertheless, the author has found that superior performance is possible compared with purely iterative root finding strategies.

The front end also includes a root estimator which uses a novel formulation of Rutishauser's Quotient-Difference algorithm to globally estimate all roots simultaneously. The combination considerably eases the burden on iterative solvers and could be used with any of the methods in common use, such as Newton's, Mullers, Bairstow's, etc. Below you will find a group of miscellaneous polynomials with their roots as found by an implementation of this method.

`x5+x4+x3+x2+x+1`
```Re: +5.00000000000000e-01, Im: +8.66025403784439e-01
Re: +5.00000000000000e-01, Im: -8.66025403784439e-01
Re: -5.00000000000000e-01, Im: +8.66025403784439e-01
Re: -5.00000000000000e-01, Im: -8.66025403784439e-01
Re: -1.00000000000000e+00, Im: +0.00000000000000e+00```

`x5-113x4+1333x3-3331x2+3110x-1000`
```Re: +1.00000000000000e+02, Im: +0.00000000000000e+00
Re: +1.00000000000000e+01, Im: +0.00000000000000e+00
Re: +1.00000000000000e+00, Im: +0.00000000000000e+00
Re: +1.00000000000000e+00, Im: +0.00000000000000e+00
Re: +1.00000000000000e+00, Im: +0.00000000000000e+00```

`x6+6x5+15x4+20x3+15x2+6x+1`
```Re: -1.00000000000000e+00, Im: +0.00000000000000e+00
Re: -1.00000000000000e+00, Im: +0.00000000000000e+00
Re: -1.00000000000000e+00, Im: +0.00000000000000e+00
Re: -1.00000000000000e+00, Im: +0.00000000000000e+00
Re: -1.00000000000000e+00, Im: +0.00000000000000e+00
Re: -1.00000000000000e+00, Im: +0.00000000000000e+00```

`x4-x2+1`
```Re: +8.66025403784439e-01, Im: +5.00000000000000e-01
Re: +8.66025403784439e-01, Im: -5.00000000000000e-01
Re: -8.66025403784439e-01, Im: +5.00000000000000e-01
Re: -8.66025403784439e-01, Im: -5.00000000000000e-01```

`x6+3x4+3x2+1`
```Re: -0.00000000000000e+00, Im: +1.00000000000000e+00
Re: -0.00000000000000e+00, Im: -1.00000000000000e+00
Re: -0.00000000000000e+00, Im: +1.00000000000000e+00
Re: -0.00000000000000e+00, Im: -1.00000000000000e+00
Re: -0.00000000000000e+00, Im: +1.00000000000000e+00
Re: -0.00000000000000e+00, Im: -1.00000000000000e+00```

`x10+1`
```Re: +9.51056516295154e-01, Im: +3.09016994374948e-01
Re: +9.51056516295154e-01, Im: -3.09016994374948e-01
Re: +5.87785252292473e-01, Im: +8.09016994374947e-01
Re: +5.87785252292473e-01, Im: -8.09016994374947e-01
Re: -1.89149869515930e-16, Im: +9.99999999999999e-01
Re: -1.89149869515930e-16, Im: -9.99999999999999e-01
Re: -5.87785252292473e-01, Im: +8.09016994374947e-01
Re: -5.87785252292473e-01, Im: -8.09016994374947e-01
Re: -9.51056516295153e-01, Im: +3.09016994374947e-01
Re: -9.51056516295153e-01, Im: -3.09016994374947e-01```

`x9-1000092x8+92003682x7-3682083720x6+83721182769x5-1182779630508x4`
```	+10630567354028x3-59354216204400x2+1.882046594592e14x-2.594592e14
```
```Re: +9.99999999976836e+00, Im: +0.00000000000000e+00
Re: +9.00000000007466e+00, Im: +0.00000000000000e+00
Re: +1.19999999963639e+01, Im: +0.00000000000000e+00
Re: +1.10000000013610e+01, Im: +0.00000000000000e+00
Re: +1.39999999972161e+01, Im: +0.00000000000000e+00
Re: +1.30000000045853e+01, Im: +0.00000000000000e+00
Re: +1.50000000006610e+01, Im: +0.00000000000000e+00
Re: +7.99999999996965e+00, Im: +0.00000000000000e+00
Re: +1.00000000000000e+06, Im: +0.00000000000000e+00```

`x7+8.638x6+31.977876x5+65.76783164x4+81.15750424376x3+60.0890161420799x2`
`	+24.7166153064422x+4.3571861840213822`
```Re: -1.23400000000000e+00, Im: +0.00000000000000e+00
Re: -1.23400000000000e+00, Im: +0.00000000000000e+00
Re: -1.23400000000000e+00, Im: +0.00000000000000e+00
Re: -1.23400000000000e+00, Im: +0.00000000000000e+00
Re: -1.23400000000000e+00, Im: +0.00000000000000e+00
Re: -1.23400000000000e+00, Im: +0.00000000000000e+00
Re: -1.23400000000000e+00, Im: +0.00000000000000e+00```