62 for (
int i=0;i<=degree;i++)
83 while (r <= Epsilon && _trueDegree > 0)
168 double x,
y, ax, ay ;
169 std::complex<double> result ;
176 if (ax < epsilon && ay < epsilon)
177 result = std::complex<double>(0.0, 0.0) ;
178 else if (ay < epsilon)
179 result = std::complex<double>(
x, 0.0) ;
180 else if (ax < epsilon)
181 result = std::complex<double>(0.0,
y) ;
184 if ((ay / ax) < epsilon)
185 result = std::complex<double>(
x, 0.0) ;
186 else if ((ax / ay) < epsilon)
187 result = std::complex<double>(0.0,
y) ;
238 std::complex<double> t1, t2, d, z ;
239 std::complex<double> aa[2] ;
245 t2 = aa[0]* std::complex<double>(4.0, 0.0) ;
253 t1 = d/std::complex<double>(r1, 0.0) ;
257 d = std::complex<double>(0.0, 0.0) ;
258 t1 = std::complex<double>(0.0, 0.0) ;
274 z = aa[1]/std::complex<double>(-2.0, 0.0);
291 z = (d-aa[1])/std::complex<double>(2.0, 0.0) ;
293 z = (d+aa[1])/std::complex<double>(-2.0, 0.0);
302 int d3_1r3 , d3_1r2_1r1 ;
303 double r1, r2, ra[3] ;
305 std::complex<double> j, j2 ;
306 std::complex<double> d, q, r, s, t, u, v, w ;
307 std::complex<double> aa[3], zProv[3][3] ;
310 j = std::complex<double>(-0.5, sqrt (3.0) / 2.0) ;
311 j2 = std::complex<double>(-0.5, -sqrt (3.0) / 2.0) ;
314 for (
int i1 = 0; i1 < 3; i1++)
346 else if (d3_1r2_1r1 == 1)
357 u = (aa[1]* aa[2])/ std::complex<double>(6.0, 0.0) ;
358 v = aa[0]/ std::complex<double> (2.0, 0.0);
359 w = pow(aa[2], 3.0)/ std::complex<double>(27.0, 0.0);
361 u = pow (r, 1.0 / 3.0) ;
362 w = aa[2]/ std::complex<double>(3.0, 0.0);
364 zProv[0][1] = u * std::complex<double>(2.0,0.0);
365 zProv[1][0] = u * (j + std::complex<double>(1.0, 0.0));
366 zProv[1][1] = u * (j2* std::complex<double>(2.0, 0.0));
367 zProv[2][0] = u * (j2+ std::complex<double>(1.0, 0.0));
368 zProv[2][1] = u * (j * std::complex<double>(2.0, 0.0));
369 for (
int i1 = 0; i1 <= 2; i1++)
371 zProv[i1][0] = zProv[i1][0]- w;
372 zProv[i1][1] = zProv[i1][1]- w;
374 for (
int i2 = 0; i2 < 3; i2++)
376 u = std::complex<double>(1.0, 0.0) ;
378 for (
int i1 = 2; i1 >= 0; i1--)
379 u = u*zProv[i2][0]+aa[i1] ;
382 u = std::complex<double>(1.0, 0.0) ;
384 for (
int i1 = 2; i1 >= 0; i1--)
385 u = u*zProv[i2][1]+ aa[i1] ;
388 ra[i2] = r1 * r1 + r2 * r2 ;
400 u = aa[1]/ std::complex<double>(3.0, 0.0);
401 v = (aa[2]* aa[2]) / std::complex<double>(9.0, 0.0) ;
403 u = (aa[1]* aa[2]) / std::complex<double>(6.0, 0.0) ;
404 v = aa[0]/ std::complex<double>(2.0, 0.0) ;
405 w = pow(aa[2], 3.0) / std::complex<double>(27.0, 0.0);
407 d = sqrt(pow(q, 3.0) + pow(r, 2.0)) ;
408 s = pow ((r + d) , 1.0 / 3.0) ;
409 t = pow ((r - d) , 1.0 / 3.0) ;
410 w = aa[2]/ std::complex<double>(3.0, 0.0);
413 zProv[0][1] = (j* s) + (j2* t) ;
414 zProv[0][2] = (j2* s) + (j* t) ;
415 zProv[1][0] = s + (j* t);
416 zProv[1][1] = (j* s) + t;
417 zProv[1][2] = j2 * (s+ t) ;
418 zProv[2][0] = s + (j2* t) ;
419 zProv[2][1] = j * (s+ t);
420 zProv[2][2] = (j2* s) + t;
421 for (
int i1 = 0; i1 < 3; i1++)
423 for (
int i2 = 0; i2 < 3; i2++)
424 zProv[i1][i2] = zProv[i1][i2]- w;
426 for (
int i3 = 0; i3 < 3; i3++)
429 for (
int i2 = 0; i2 < 3; i2++)
431 u = std::complex<double>(1.0, 0.0) ;
432 for (
int i1 = 2; i1 >= 0; i1--)
433 u = (u* zProv[i3][i2]) + aa[i1] ;
436 ra[i3] = ra[i3] + r1 * r1 ;
450 for (
int i3 = 0; i3 < 3; i3++)
460 int d4_1r4, d4_2r2, d4_1r3_1r1, d4_1r2_2r1 ;
462 double epsilon = 1.e-12 ;
464 std::complex<double> d, u, v, w,
x,
y ;
465 std::complex<double> aa[4], k[4], b[4], zProv[2][4] ;
469 for (
int i1 = 0; i1 < 4; i1++)
479 k[0] = aa[3]/ std::complex<double>(-4.0, 0.0) ;
481 v = ((aa[3]* std::complex<double>(3.0, 0.0)) * (aa[3]/ std::complex<double>(8.0, 0.0))) ;
490 k[1] = std::complex<double>(0.0, 0.0) ;
493 v = (aa[2]* aa[3]) / std::complex<double>(2.0, 0.0) ;
494 w = pow (aa[3], 3.0) / std::complex<double>(8.0, 0.0) ;
502 k[2] = std::complex<double>(0.0, 0.0) ;
504 v = (aa[1]* aa[3]) / std::complex<double>(4.0, 0.0);
505 w = (aa[2]* aa[3]) * (aa[3]/ std::complex<double>(16.0, 0.0)) ;
506 x = pow (aa[3], 4.0) * std::complex<double>(3.0 / 256.0, 0.0) ;
514 k[3] = (u- v) + (w-
x) ;
516 k[3] = std::complex<double>(0.0, 0.0) ;
547 else if (d4_2r2 == 1)
558 u = sqrt (k[1]/ std::complex<double>(-2.0, 0.0)) ;
565 else if (d4_1r3_1r1 == 1)
576 u = (k[2]* std::complex<double>(-3.0, 0.0)) / (k[1]* std::complex<double>(4.0, 0.0)) ;
577 v = u * std::complex<double>(-3.0, 0.0);
584 else if (d4_1r2_2r1 == 1)
597 u = (k[3]* std::complex<double>(-4.0, 0.0)) / (k[2]* std::complex<double>(3.0, 0.0));
598 v = sqrt ((u* std::complex<double>(-2.0, 0.0)) * u) ;
605 v = (k[2]* k[2]) * std::complex<double>(9.0, 0.0) ;
606 w = (k[1]* k[3]) * std::complex<double>(32.0, 0.0) ;
608 v = (k[2] * std::complex<double>(-3.0, 0.0)) ;
609 w = (k[1] * std::complex<double>(4.0, 0.0)) ;
612 u = ((
x*
x) * std::complex<double>(-2.0, 0.0)) ;
613 u = sqrt((u- k[1])) ;
614 v = ((
y*
y) * std::complex<double>(-2.0, 0.0)) ;
615 v = sqrt((v- k[1])) ;
616 zProv[0][0] = (k[0]+
x) ;
617 zProv[0][1] = (k[0] - (
x- u)) ;
618 zProv[0][2] = (k[0] - (
x+ u)) ;
619 zProv[1][0] = (k[0]+
y) ;
620 zProv[1][1] = (k[0] - (
y- v)) ;
621 zProv[1][2] = (k[0] - (
y+ v)) ;
624 for (
int i1 = 0; i1 < 3; i1++)
626 u = std::complex<double>(1.0, 0.0) ;
627 for (
int i2 = 3; i2 >= 0; i2--)
628 u = ((u* zProv[0][i1])+ aa[i2]) ;
631 h[0] = h[0] + r * r ;
632 u = std::complex<double>(1.0, 0.0) ;
633 for (
int i2 = 3; i2 >= 0; i2--)
634 u = ((u* zProv[1][i1])+ aa[i2]) ;
636 h[1] = h[1] + r * r ;
639 for (
int i2 = 0; i2 < 3; i2++)
650 u = ((aa[0]* aa[2]) * std::complex<double>(4.0, 0.0)) ;
651 v = (aa[1] * aa[1]) ;
652 w = ((aa[0]* aa[3]) * aa[3]) ;
653 b[0] = (u - (v+ w)) ;
654 b[1] = ((aa[1]* aa[3]) - (aa[0]* std::complex<double>(4.0, 0.0))) ;
656 b[3] = std::complex<double>(1.0, 0.0) ;
668 v = ((aa[2]- u) * std::complex<double>(4.0, 0.0)) ;
669 v = sqrt(((aa[3]* aa[3]) - v)) ;
670 w = sqrt(((u* u) - (aa[0]* std::complex<double>(4.0, 0.0)))) ;
671 x = ((aa[3]+ v) / std::complex<double>(2.0, 0.0)) ;
672 y = ((u+ w) / std::complex<double>(2.0, 0.0)) ;
673 d = sqrt(((
x*
x) - (
y* std::complex<double>(4.0, 0.0)))) ;
674 zProv[0][0] = ((
x- d) / std::complex<double>(-2.0, 0.0)) ;
675 zProv[0][1] = ((
x+ d) / std::complex<double>(-2.0, 0.0)) ;
677 x = ((aa[3]- v) / std::complex<double>(2.0, 0.0)) ;
678 y = ((u- w) / std::complex<double>(2.0, 0.0)) ;
679 d = sqrt((
x*
x) - (
y* std::complex<double>(4.0, 0.0))) ;
680 zProv[0][2] = ((
x- d) / std::complex<double>(-2.0, 0.0)) ;
681 zProv[0][3] = ((
x+ d) / std::complex<double>(-2.0, 0.0)) ;
683 x = ((aa[3]+ v) / std::complex<double>(2.0, 0.0)) ;
684 y = ((u- w) / std::complex<double>(2.0, 0.0)) ;
685 d = sqrt(((
x*
x) - (
y* std::complex<double>(4.0, 0.0)))) ;
686 zProv[1][0] = ((
x- d) / std::complex<double>(-2.0, 0.0)) ;
687 zProv[1][1] = ((
x+ d) / std::complex<double>(-2.0, 0.0)) ;
689 x = ((aa[3]- v) / std::complex<double>(2.0, 0.0)) ;
690 y = ((u+ w) / std::complex<double>(2.0, 0.0)) ;
691 d = sqrt((
x*
x) - (
y* std::complex<double>(4.0, 0.0))) ;
692 zProv[1][2] = ((
x- d) / std::complex<double>(-2.0, 0.0)) ;
693 zProv[1][3] = ((
x+ d) / std::complex<double>(-2.0, 0.0)) ;
697 for (
int i1 = 0; i1 < 4; i1++)
699 u = std::complex<double>(1.0, 0.0) ;
701 for (
int i2 = 3; i2 >= 0; i2--)
702 u = ((u* zProv[0][i1])+ aa[i2]) ;
705 h[0] = h[0] + r * r ;
706 u = std::complex<double>(1.0, 0.0) ;
708 for (
int i2 = 3; i2 >= 0; i2--)
709 u = ((u* zProv[1][i1])+ aa[i2]) ;
712 h[1] = h[1] + r * r ;
723 for (
int i2 = 0; i2 < 4; i2++)
735 double d, dp[2], q, r ;
736 std::complex<double> u, v ;
740 v = a[1]*std::complex<double>(3.0, 0.0) ;
743 d = (dp[0] > dp[1]) ? dp[0] : dp[1] ;
744 q = (d > epsilon) ?
abs((u- v)/ std::complex<double> (d, 0.0))
748 v = a[0]* std::complex<double>(9.0, 0.0) ;
751 d = (dp[0] > dp[1]) ? dp[0] : dp[1] ;
752 r = (d > epsilon) ?
abs ((u-v)/std::complex<double>(d, 0.0))
755 return ((q <= epsilon) && (r <= epsilon)) ? 1 : 0 ;
761 std::complex<double> u, t[5] ;
765 t[0] = pow (a[1], 3.0)*std::complex<double>(4.0, 0.0) ;
766 t[1] = a[0]*a[0]* std::complex<double>(27.0, 0.0);
767 t[2] = a[0]* std::complex<double>(4.0, 0.0)*pow (a[2], 3.0) ;
769 t[4] = std::complex<double>(-18.0, 0.0)* a[0] * u;
771 for (
int i = 0 ; i < 5 ; i++)
776 for (
int i = 1 ; i < 5 ; i++)
779 d = (k > epsilon) ?
abs (t[0]/std::complex<double>(k,0.0))
782 return (d <= epsilon) ? 1 : 0 ;
792 for (
int i = 1; i <
n; i++)
794 if ( list[i] < xMin )
811 for (
int i = 1; i <
n; i++)
813 if ( list[i] > xMax )
830 return ((r1 < epsilon) && (r2 < epsilon) && (r3 < epsilon)) ? 1 : 0 ;
836 double r0, r1, r2, h[5] ;
837 std::complex<double> u, t[5] ;
841 t[0] = (u* u) * std::complex<double>(3.0 / 16.0, 0.0);
842 t[1] = a[0] * std::complex<double>(4.0,0.0);
846 for (
int i = 0 ; i < 5 ; i++)
850 u = (t[0]- t[1]) + t[2];
851 u = u - (t[3]- t[4]) ;
852 r2 = (r1 > epsilon) ?
abs (u) / r1 : 0.0 ;
857 if ((r0 >= epsilon) && (r1 < epsilon) && (r2 < epsilon))
868 double r, r0, r1, r2, h[4] ;
869 std::complex<double> u, t[4] ;
873 t[1] = a[0] * std::complex<double>(12.0, 0.0);
874 t[2] = (a[1]* a[3]) * std::complex<double>(3.0, 0.0) ;
875 for (
int i = 0 ; i < 3 ; i++)
879 u = t[0] + (t[1]- t[2]) ;
880 r1 = (r > epsilon) ?
abs (u) / r : 0.0 ;
883 t[1] = (a[0]* a[2]) * std::complex<double>(4.0, 0.0) ;
884 u = a[3]* std::complex<double>(3.0, 0.0) ;
885 t[2] = (u* u) * (a[0]* std::complex<double>(3.0, 0.0)) ;
886 t[3] = (a[2]* a[2]) * a[2] ;
887 for (
int i = 0 ; i < 4 ; i++)
890 u = ((t[0]- t[1])* std::complex<double>(27.0, 0.0))+ (t[2]- t[3]) ;
891 r2 = (r > epsilon) ?
abs (u) / r : 0.0 ;
895 if ((r0 >= epsilon) && (r1 < epsilon) && (r2 < epsilon))
906 std::complex<double> u, v, w ;
909 u = (a[1]* a[1]) - (a[3]* std::complex<double>(4.0, 0.0)) ;
910 u = u* a[3] * u * std::complex<double>(16.0, 0.0);
913 w = pow (a[1], 3.0) * std::complex<double>(4.0, 0.0) ;
914 v = (a[2]* a[2]) * std::complex<double>(27.0, 0.0) ,
915 v = (w+ v) * (a[2]* a[2]) ;
918 w = (a[1]* a[2]) * (a[2]* a[3]) ;
919 w = w * std::complex<double>(144.0, 0.0) ;
925 else if (r[1] <= 1.0)
926 r[0] =
abs ((u- v)+ w) ;
928 r[0] =
abs (((u- v)+ w)/ std::complex<double>(r[1], 0.0)) ;
930 return (r[0] < (2.0 * epsilon)) ? 1 : 0 ;
int _degree
Equation degree.
void CreateEquation(int degree, std::complex< double > *coefficients)
int TestDegreeSimpleSimpleDouble(std::complex< double > *a, double epsilon)
Tests whether two simple root and one double root exist in a fourth degree equation.
std::vector< int > _order
std::complex< double > Proche(std::complex< double > z, double epsilon)
??
int IndiceMax(int n, double *list)
Returns the index of the greater list element.
int IndiceMin(int n, double *list)
Returns the index of the smaller list element.
os2<< "> n<< " > nendobj n
int TestDegree3Triple(std::complex< double > *a, double epsilon)
Tests whether a triple root exists in a third degree equation.
double _normalisationCoefficient
int TestDegree4DoubleDouble(std::complex< double > *a, std::complex< double > *k, double epsilon)
Tests whether two double roots exist in a fourth degree equation.
This class manages and solves an equation of the fourth degree.
NormalisationType _normalisationType
int TestDegree4SimpleTriple(std::complex< double > *a, std::complex< double > *k, double epsilon)
Tests whether one simple root and one triple root exist in a fourth degree equation.
int TestDegree4Quad(std::complex< double > *a, double epsilon)
Tests whether a quadruple root exists in a fourth degree equation.
std::complex< double > * _coefficients
Equation coefficients.
static const double Epsilon
Equation & operator=(const Equation &rhs)
std::complex< double > * _solutions
const std::complex< double > * get_solutions() const
int TestDegree3SimpleDouble(std::complex< double > *a, double epsilon)
Tests whether a double root and a simple root exist in a third degree equation.