4597N/A//package com.polytechnik.utils; 4597N/A * (C) Vladislav Malyshkin 2010 4597N/A * This file is under GPL version 3. 4597N/A * @author Vladislav Malyshkin mal@gromco.com 4597N/A* @summary C2: assert(!def_outside->member(r)) failed: Use of external LRG overlaps the same LRG defined in this block 4597N/A/* zsolve_quartic.c - finds the complex roots of 4597N/A * x^4 + a x^3 + b x^2 + c x + d = 0 4597N/A final double q2 =
1.0 /
2.0,
q4 =
1.0 /
4.0,
q8 =
1.0 /
8.0;
4597N/A /* Deal easily with the cases where the quartic is degenerate. The 4597N/A * ordering of solutions is done explicitly. */ 4597N/A final double [] u=
new double[
3];
4597N/A /* For non-degenerate solutions, proceed by constructing and 4597N/A * solving the resolvent cubic */ 4597N/A /* This code solves the resolvent cubic in a convenient fashion 4597N/A * for this implementation of the quartic. If there are three real 4597N/A * roots, then they are placed directly into u[]. If two are 4597N/A * complex, then the real root is put into u[0] and the real 4597N/A * and imaginary part of the complex roots are placed into 4597N/A * u[1] and u[2], respectively. */ 4597N/A /* End of solution to resolvent cubic */ 4597N/A /* Combine the square roots of the roots of the cubic 4597N/A * resolvent appropriately. Also, calculate 'mt' which 4597N/A * designates the nature of the roots: 4597N/A // calculate square root of a complex number (u[1],u[2]) 4597N/A // the result is in the (w1_re,w1_im) 4597N/A final double vi = (u[
2] >=
0) ? w : -w;
4597N/A /* Solve the quadratic in order to obtain the roots 4597N/A // a shorcut to reduce rounding error 4597N/A // typically occur when qq==0 4597N/A final double [] p=
new double [n+
1];
4597N/A //System.err.println("j="+j); 4597N/A /* zsolve_cubic.c - finds the complex roots of x^3 + a x^2 + b x + c = 0 4597N/A final double q = (a * a -
3 * b);
4597N/A final double r = (a*(
2 * a * a -
9 * b) +
27 * c);
4597N/A /* this test is actually R2 == Q3, written in a form suitable 4597N/A for exact computation with integers */ 4597N/A /* Due to finite precision some double roots may be missed, and 4597N/A will be considered to be a pair of complex roots z = x +/- 4597N/A epsilon i close to the real axis. */ 4597N/A a=p[
2]/v,b=p[
1]/v,c=p[
0]/v,
4597N/A //System.err.println("3r"); 4597N/A // one real & two complex roots 4597N/A //System.err.println("1r2c"); 4597N/A //final double [] p=new double []{8,1,3,3.6,1}; 4597N/A p=
new double []{
2,-
4,
6,-
4,
1};
4597N/A //p=new double []{-6,6,-6,8,-2}; 4597N/A p=
new double []{
0,-
4,
8,
3,-
9};
4597N/A p=
new double []{-
1,
0,
2,
0,-
1};
4597N/A p=
new double []{-
5,
2,
8,-
2,-
3};
4597N/A //testRoots(2,n_tests,r,eps); 4597N/A //testRoots(3,n_tests,r,eps);