/** * Multiplies the two polynomials together. * @param a Polynomial * @param b Polynomial * @param result Optional storage parameter for the results. Must be have enough coefficients to store the results. * If null a new instance is declared. * @return Results of the multiplication */ public static Polynomial multiply( Polynomial a , Polynomial b , Polynomial result ) { int N = Math.max(0,a.size() + b.size() - 1); if( result == null ) { result = new Polynomial(N); } else { if( result.size < N ) throw new IllegalArgumentException("Unexpected length of 'result'"); result.zero(); } for( int i = 0; i < a.size; i++ ) { double coef = a.c[i]; int index = i; for( int j = 0; j < b.size; j++ ) { result.c[index++] += coef*b.c[j]; } } return result; }
/** * Multiplies the two polynomials together. * @param a Polynomial * @param b Polynomial * @param result Optional storage parameter for the results. Must be have enough coefficients to store the results. * If null a new instance is declared. * @return Results of the multiplication */ public static Polynomial multiply( Polynomial a , Polynomial b , Polynomial result ) { int N = Math.max(0,a.size() + b.size() - 1); if( result == null ) { result = new Polynomial(N); } else { if( result.size < N ) throw new IllegalArgumentException("Unexpected length of 'result'"); result.zero(); } for( int i = 0; i < a.size; i++ ) { double coef = a.c[i]; int index = i; for( int j = 0; j < b.size; j++ ) { result.c[index++] += coef*b.c[j]; } } return result; }
Polynomial deriv = new Polynomial(poly.size()); derivative(poly,deriv);
Polynomial deriv = new Polynomial(poly.size()); derivative(poly,deriv);
/** * Several consistency checks on random polynomials to the number of roots within a random interval */ @Test public void rootCountConsistency_Random() { for( int i = 3; i < 20; i++ ) { Polynomial p = new Polynomial(i); for( int trial = 0; trial < 20; trial++ ) { for( int j = 0; j < p.size; j++ ) { p.c[j] = (rand.nextDouble()-0.5)*2; } SturmSequence alg = new SturmSequence(p.size()); double low = (rand.nextDouble() - 0.5)*200; double high = low + rand.nextDouble()*200; double middle = (low+high)/2.0; alg.initialize(p); int every = alg.countRealRoots(Double.NEGATIVE_INFINITY,Double.POSITIVE_INFINITY); int all = alg.countRealRoots(low,high); int lowN = alg.countRealRoots(low,middle); int highN = alg.countRealRoots(middle,high); assertTrue(all >= 0); assertTrue(lowN >= 0); assertTrue(highN >= 0); assertEquals(all, lowN + highN); assertTrue(all <= every); } } }