Search code examples
javamathpolynomial-math

Finding roots of polynomial in Java


I need to find a (approximate, numerical) solution to a Legendre polynomial. I tried several Java libraries, but none have what I am looking for (the closest is commons-math which even has code for finding the solutions in the Laguerre solver, but it does not expose the method). Is there an existing solution or do I need to implement my own?


Solution

  • You can use EJML (Efficient Java Matrix Library).

    Please find the below sample example for the same.

    public class PolynomialRootFinder {
    
        /**
         * <p>
         * Given a set of polynomial coefficients, compute the roots of the polynomial.  Depending on
         * the polynomial being considered the roots may contain complex number.  When complex numbers are
         * present they will come in pairs of complex conjugates.
         * </p>
         *
         * @param coefficients Coefficients of the polynomial.
         * @return The roots of the polynomial
         */
        public static Complex64F[] findRoots(double... coefficients) {
            int N = coefficients.length-1;
    
            // Construct the companion matrix
            DenseMatrix64F c = new DenseMatrix64F(N,N);
    
            double a = coefficients[N];
            for( int i = 0; i < N; i++ ) {
                c.set(i,N-1,-coefficients[i]/a);
            }
            for( int i = 1; i < N; i++ ) {
                c.set(i,i-1,1);
            }
    
            // Use generalized eigenvalue decomposition to find the roots
            EigenDecomposition<DenseMatrix64F> evd =  DecompositionFactory.eigGeneral(N, false);
    
            evd.decompose(c);
    
            Complex64F[] roots = new Complex64F[N];
    
            for( int i = 0; i < N; i++ ) {
                roots[i] = evd.getEigenvalue(i);
            }
    
            return roots;
        }
    }