Broots() succeeded in factoring a few polynomials of degree 100,000, but always failed at degree 150,000. Lroots() has been tried on and succesfully factored two polynomials of degree 2,080,000 and two of degree 2,000,000. The larger polynomials took 5.9 days on a 3 GHz Dell computer running Windows. The algorithm of lroots() is O(N2) so it is estimated that a degree 4 million would take 24 CPU days. A 4 million degree polynomial has been factored on four processors of a AMD cluster in 5.3 days using a parallel version of the program.
This file also contains 3 functions for phase unwrapping - unwrapz, unwrapph, and unwrapm.
Why is this code significant? Matlab's polynomial factorization function, roots(), uses the eigenvalue method. This is an extremely powerful method for low and medium degree polynomials. However, it has problems with high degree because it is O(n^3) in operation count and it is O(n^2) in workspace. By contrast, lroots() is O(n^2) in operation count and O(n) in workspace. On a 2.66 GHz computer with 1 GB memory, roots() took 3.7 hours to factor a 5,000 degree polynomial; lroots() got the same answer in 6 seconds. On this computer, any attempt to use roots() to factor a 6,000 degree polynomial immediately returned the error message, "Out of memory" because Matlab could not allocate the 6,001x6001X(8 bytes)=288 MB work array. On this computer, lroots() does not start to get "Out of memory" problems until it gets to degree 2^19-1=524,287, and even then there is a slow work-around by artificially making the radial grid spacing smaller
These programs are also important because phase unwrapping can be done accurately if it is possible to accurately factor the corresponding z-transform. Phase unrapping is a step in the cepstral transform.