42 #include <gsl/gsl_math.h>
43 #include <gsl/gsl_complex_math.h>
44 #include <gsl/gsl_complex.h>
45 #include <gsl/gsl_poly.h>
46 #include <o2scl/constants.h>
47 #include <o2scl/err_hnd.h>
49 #ifndef DOXYGEN_NO_O2NS
64 virtual int solve_r(
const double a2,
const double b2,
const double c2,
65 double &
x1,
double &
x2)=0;
68 const char *
type() {
return "quadratic_real"; }
83 virtual int solve_r(
const double a2,
const double b2,
const double c2,
84 double &
x1,
double &
x2);
89 virtual int solve_rc(
const double a2,
const double b2,
const double c2,
90 std::complex<double> &x1,
91 std::complex<double> &x2)=0;
94 const char *
type() {
return "quadratic_real_coeff"; }
108 virtual int solve_r(
const double a2,
const double b2,
const double c2,
109 double &
x1,
double &
x2);
114 virtual int solve_rc(
const double a2,
const double b2,
const double c2,
115 std::complex<double> &x1, std::complex<double> &x2);
120 virtual int solve_c(
const std::complex<double> a2,
121 const std::complex<double> b2,
122 const std::complex<double> c2,
123 std::complex<double> &x1, std::complex<double> &x2)=0;
126 const char *
type() {
return "quadratic_complex"; }
141 virtual int solve_r(
const double a3,
const double b3,
const double c3,
142 const double d3,
double &
x1,
double &
x2,
146 const char *
type() {
return "cubic_real"; }
162 virtual int solve_r(
const double a3,
const double b3,
const double c3,
163 const double d3,
double &
x1,
double &
x2,
double &
x3);
170 virtual int solve_rc(
const double a3,
const double b3,
const double c3,
171 const double d3,
double &x1, std::complex<double> &x2,
172 std::complex<double> &x3)=0;
175 const char *
type() {
return "cubic_real_coeff"; }
191 virtual int solve_r(
const double a3,
const double b3,
const double c3,
192 const double d3,
double &
x1,
double &
x2,
double &
x3);
199 virtual int solve_rc(
const double a3,
const double b3,
const double c3,
200 const double d3,
double &x1, std::complex<double> &x2,
201 std::complex<double> &x3);
208 virtual int solve_c(
const std::complex<double> a3,
209 const std::complex<double> b3,
210 const std::complex<double> c3,
211 const std::complex<double> d3,
212 std::complex<double> &x1, std::complex<double> &x2,
213 std::complex<double> &x3)=0;
216 const char *
type() {
return "cubic_complex"; }
233 virtual int solve_r(
const double a4,
const double b4,
const double c4,
234 const double d4,
const double e4,
235 double &
x1,
double &
x2,
236 double &
x3,
double &
x4)=0;
239 const char *
type() {
return "quartic_real"; }
256 virtual int solve_r(
const double a4,
const double b4,
const double c4,
257 const double d4,
const double e4,
double &
x1,
258 double &
x2,
double &
x3,
double &
x4);
265 virtual int solve_rc(
const double a4,
const double b4,
const double c4,
266 const double d4,
const double e4,
267 std::complex<double> &x1, std::complex<double> &x2,
268 std::complex<double> &x3,
269 std::complex<double> &x4)=0;
272 const char *
type() {
return "quartic_real_coeff"; }
289 virtual int solve_r(
const double a4,
const double b4,
const double c4,
290 const double d4,
const double e4,
double &
x1,
292 double &
x3,
double &
x4);
299 virtual int solve_rc(
const double a4,
const double b4,
const double c4,
300 const double d4,
const double e4,
301 std::complex<double> &x1, std::complex<double> &x2,
302 std::complex<double> &x3, std::complex<double> &x4);
309 virtual int solve_c(
const std::complex<double> a4,
310 const std::complex<double> b4,
311 const std::complex<double> c4,
312 const std::complex<double> d4,
313 const std::complex<double> e4,
314 std::complex<double> &x1,
315 std::complex<double> &x2, std::complex<double> &x3,
316 std::complex<double> &x4)=0;
319 const char *
type() {
return "quartic_complex"; }
338 virtual int solve_rc(
int n,
const double co[],
339 std::complex<double> ro[])=0;
342 const char *
type() {
return "poly_real_coeff"; }
361 virtual int solve_c(
int n,
const std::complex<double> co[],
362 std::complex<double> ro[])=0;
365 virtual int polish_c(
int n,
const std::complex<double> co[],
366 std::complex<double> *ro)=0;
369 const char *
type() {
return "poly_complex"; }
405 virtual int solve_rc(
const double a3,
const double b3,
const double c3,
406 const double d3,
double &
x1,
407 std::complex<double> &
x2, std::complex<double> &
x3);
430 virtual int rrteq3(
double r,
double s,
double t,
double x[],
double &d);
433 const char *
type() {
return "cubic_real_coeff_cern"; }
449 virtual int solve_rc(
const double a4,
const double b4,
const double c4,
450 const double d4,
const double e4,
451 std::complex<double> &
x1, std::complex<double> &
x2,
452 std::complex<double> &
x3, std::complex<double> &
x4);
455 virtual int rrteq4(
double a,
double b,
double c,
double d,
456 std::complex<double> z[],
double &dc,
460 const char *
type() {
return "quartic_real_coeff_cern"; }
462 #ifndef DOXYGEN_INTERNAL
484 virtual int solve_rc(
const double a2,
const double b2,
const double c2,
485 std::complex<double> &
x1, std::complex<double> &
x2);
488 const char *
type() {
return "quadratic_real_coeff_gsl"; }
505 virtual int solve_rc(
const double a3,
const double b3,
const double c3,
506 const double d3,
double &
x1,
507 std::complex<double> &
x2, std::complex<double> &
x3);
510 const char *
type() {
return "cubic_real_coeff_gsl"; }
523 gsl_complex *z0, gsl_complex *z1,
557 virtual int solve_r(
const double a4,
const double b4,
const double c4,
558 const double d4,
const double e4,
double &
x1,
559 double &
x2,
double &
x3,
double &
x4);
562 const char *
type() {
return "quartic_real_gsl"; }
594 virtual int solve_r(
const double a4,
const double b4,
const double c4,
595 const double d4,
const double e4,
double &
x1,
597 double &
x3,
double &
x4);
600 const char *
type() {
return "quartic_real_gsl2"; }
621 virtual int solve_rc(
int n,
const double co[],
622 std::complex<double> ro[]);
626 virtual int solve_rc(
const double a3,
const double b3,
const double c3,
627 const double d3,
double &
x1,
628 std::complex<double> &
x2,
629 std::complex<double> &
x3);
633 virtual int solve_rc(
const double a2,
const double b2,
const double c2,
634 std::complex<double> &x1,
635 std::complex<double> &x2);
639 virtual int solve_rc(
const double a4,
const double b4,
const double c4,
640 const double d4,
const double e4,
641 std::complex<double> &x1, std::complex<double> &x2,
642 std::complex<double> &x3, std::complex<double> &
x4);
645 const char *
type() {
return "poly_real_coeff_gsl"; }
649 #ifndef DOXYGEN_INTERNAL
652 gsl_poly_complex_workspace *
w2;
655 gsl_poly_complex_workspace *
w3;
658 gsl_poly_complex_workspace *
w4;
661 gsl_poly_complex_workspace *
wgen;
681 virtual int solve_c(
const std::complex<double> a2,
682 const std::complex<double> b2,
683 const std::complex<double> c2,
684 std::complex<double> &
x1, std::complex<double> &
x2);
687 const char *
type() {
return "quadratic_complex_std"; }
703 virtual int solve_c(
const std::complex<double> a3,
704 const std::complex<double> b3,
705 const std::complex<double> c3,
706 const std::complex<double> d3,
707 std::complex<double> &
x1, std::complex<double> &
x2,
708 std::complex<double> &
x3);
711 const char *
type() {
return "cubic_complex_std"; }
726 virtual int solve_r(
const double a4,
const double b4,
const double c4,
727 const double d4,
const double e4,
double &
x1,
728 double &
x2,
double &
x3,
double &
x4);
731 const char *
type() {
return "quartic_real_simple"; }
752 virtual int solve_c(
const std::complex<double> a4,
753 const std::complex<double> b4,
754 const std::complex<double> c4,
755 const std::complex<double> d4,
756 const std::complex<double> e4,
757 std::complex<double> &
x1,
758 std::complex<double> &
x2,
759 std::complex<double> &
x3,
760 std::complex<double> &
x4);
763 const char *
type() {
return "quartic_complex_simple"; }
765 #ifndef DOXYGEN_NO_O2NS
776 #ifndef DOXYGEN_NO_O2NS
const char * type()
Return a string denoting the type ("cubic_real_coeff_cern")
virtual int solve_r(const double a4, const double b4, const double c4, const double d4, const double e4, double &x1, double &x2, double &x3, double &x4)
Solves the polynomial giving the four real solutions , , , and .
virtual int solve_r(const double a4, const double b4, const double c4, const double d4, const double e4, double &x1, double &x2, double &x3, double &x4)
Solves the polynomial giving the four solutions , , , and .
const char * type()
Return a string denoting the type ("quadratic_complex")
Solve a quadratic with complex coefficients and complex roots.
const char * type()
Return a string denoting the type ("quartic_real")
virtual int solve_r(const double a2, const double b2, const double c2, double &x1, double &x2)
Solves the polynomial giving the two solutions and .
const char * type()
Return a string denoting the type ("quartic_real_gsl")
virtual int solve_c(const std::complex< double > a3, const std::complex< double > b3, const std::complex< double > c3, const std::complex< double > d3, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3)=0
Solves the complex polynomial giving the three complex solutions , , and .
double cube_root_tol
A tolerance for determining the proper cube root (default )
Solve a general polynomial with real coefficients (GSL)
virtual int solve_r(const double a4, const double b4, const double c4, const double d4, const double e4, double &x1, double &x2, double &x3, double &x4)
Solves the polynomial giving the four solutions , , , and .
cubic_real_coeff_cern cub_obj
The object to solve for the associated cubic.
virtual int polish_c(int n, const std::complex< double > co[], std::complex< double > *ro)=0
Polish the roots.
const char * type()
Return a string denoting the type ("quartic_real_gsl2")
Solve a cubic polynomial with real coefficients and real roots [abstract base].
int gen_size
The size of the workspace wgen.
const char * type()
Return a string denoting the type ("cubic_complex_std")
const char * type()
Return a string denoting the type ("quadratic_real")
virtual int solve_r(const double a4, const double b4, const double c4, const double d4, const double e4, double &x1, double &x2, double &x3, double &x4)
Solves the polynomial giving the four real solutions , , , and .
virtual int solve_rc(const double a4, const double b4, const double c4, const double d4, const double e4, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3, std::complex< double > &x4)
Solves the polynomial giving the four complex solutions , , , and .
Solve a quartic with real coefficients and complex roots (CERNLIB)
cubic_complex_std cub_obj
The object to solve for the associated cubic.
Solve a cubic with real coefficients and complex roots (GSL)
const char * type()
Return a string denoting the type ("quartic_complex_simple")
const char * type()
Return a string denoting the type ("poly_real_coeff")
Solve a cubic with real coefficients and complex roots (CERNLIB)
virtual int solve_rc(const double a2, const double b2, const double c2, std::complex< double > &x1, std::complex< double > &x2)
Solves the polynomial giving the two complex solutions and .
const char * type()
Return a string denoting the type ("cubic_real_coeff_gsl")
virtual int solve_c(const std::complex< double > a4, const std::complex< double > b4, const std::complex< double > c4, const std::complex< double > d4, const std::complex< double > e4, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3, std::complex< double > &x4)
Solves the complex polynomial giving the four complex solutions , , , and .
virtual int solve_rc(const double a3, const double b3, const double c3, const double d3, double &x1, std::complex< double > &x2, std::complex< double > &x3)
Solves the polynomial giving the real solution and two complex solutions and .
virtual int rrteq3(double r, double s, double t, double x[], double &d)
The CERNLIB-like interface.
virtual int solve_r(const double a3, const double b3, const double c3, const double d3, double &x1, double &x2, double &x3)
Solves the polynomial giving the three solutions , , and .
virtual int solve_c(const std::complex< double > a2, const std::complex< double > b2, const std::complex< double > c2, std::complex< double > &x1, std::complex< double > &x2)=0
Solves the complex polynomial giving the two complex solutions and .
Solve a quartic with complex coefficients and complex roots.
virtual int solve_r(const double a3, const double b3, const double c3, const double d3, double &x1, double &x2, double &x3)
Solves the polynomial giving the three solutions , , and .
virtual int solve_r(const double a4, const double b4, const double c4, const double d4, const double e4, double &x1, double &x2, double &x3, double &x4)
Solves the polynomial giving the four solutions , , , and .
const char * type()
Return a string denoting the type ("poly_complex")
Solve a quartic polynomial with real coefficients and real roots [abstract base]. ...
virtual int rrteq4(double a, double b, double c, double d, std::complex< double > z[], double &dc, int &mt)
The CERNLIB-like interface.
int gsl_poly_complex_solve_cubic2(double a, double b, double c, gsl_complex *z0, gsl_complex *z1, gsl_complex *z2)
An alternative to gsl_poly_complex_solve_cubic()
Solve a quartic with real coefficients and real roots.
Solve a quartic polynomial with complex coefficients and complex roots [abstract base].
Solve a general polynomial with complex coefficients [abstract base].
const char * type()
Return a string denoting the type ("quadratic_real_coeff_gsl")
virtual int solve_c(int n, const std::complex< double > co[], std::complex< double > ro[])=0
Solve the n-th order polynomial.
const char * type()
Return a string denoting the type ("cubic_complex")
const char * type()
Return a string denoting the type ("quartic_real_simple")
const char * type()
Return a string denoting the type ("poly_real_coeff_gsl")
Solve a quadratic polynomial with real coefficients and real roots [abstract base].
static const double x3[11]
virtual int solve_rc(const double a2, const double b2, const double c2, std::complex< double > &x1, std::complex< double > &x2)
Solves the polynomial giving the two complex solutions and .
gsl_poly_complex_workspace * w4
Workspace for quartic polynomials.
virtual int solve_rc(int n, const double co[], std::complex< double > ro[])
Solve a generic polynomial given n+1 coefficients.
double cube_root_tol
A tolerance for determining the proper cube root (default )
Solve a cubic polynomial with complex coefficients and complex roots [abstract base].
virtual int solve_c(const std::complex< double > a2, const std::complex< double > b2, const std::complex< double > c2, std::complex< double > &x1, std::complex< double > &x2)
Solves the complex polynomial giving the two complex solutions and .
const char * type()
Return a string denoting the type ("quartic_real_coeff")
const char * type()
Return a string denoting the type ("quartic_real_coeff_cern")
const char * type()
Return a string denoting the type ("cubic_real_coeff")
const char * type()
Return a string denoting the type ("quadratic_real_coeff")
gsl_poly_complex_workspace * wgen
Workspace for general polynomials.
gsl_poly_complex_workspace * w2
Workspace for quadratic polynomials.
bool improve_scale
Improve algorithm for poorly-scaled roots (default true)
const char * type()
Return a string denoting the type ("quartic_complex")
virtual int solve_r(const double a2, const double b2, const double c2, double &x1, double &x2)=0
Solves the polynomial giving the two solutions and .
Solve a quartic with real coefficients and real roots (GSL)
double eps
Numerical tolerance (default )
virtual int solve_rc(const double a4, const double b4, const double c4, const double d4, const double e4, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3, std::complex< double > &x4)
Solves the polynomial giving the four complex solutions , , , and .
virtual int solve_r(const double a3, const double b3, const double c3, const double d3, double &x1, double &x2, double &x3)=0
Solves the polynomial giving the three solutions , , and .
Solve a quartic polynomial with real coefficients and complex roots [abstract base].
virtual int solve_c(const std::complex< double > a3, const std::complex< double > b3, const std::complex< double > c3, const std::complex< double > d3, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3)
Solves the complex polynomial giving the three complex solutions , , and .
virtual int solve_r(const double a4, const double b4, const double c4, const double d4, const double e4, double &x1, double &x2, double &x3, double &x4)=0
Solves the polynomial giving the four solutions , , , and .
gsl_poly_complex_workspace * w3
Workspace for cubic polynomials.
virtual int solve_rc(const double a2, const double b2, const double c2, std::complex< double > &x1, std::complex< double > &x2)=0
Solves the polynomial giving the two complex solutions and .
Solve a cubic polynomial with real coefficients and complex roots [abstract base].
static const double x4[22]
Solve a quadratic polynomial with complex coefficients and complex roots [abstract base]...
double delta
Numerical tolerance (default )
virtual int solve_rc(const double a3, const double b3, const double c3, const double d3, double &x1, std::complex< double > &x2, std::complex< double > &x3)=0
Solves the polynomial giving the real solution and two complex solutions and .
virtual int solve_rc(const double a4, const double b4, const double c4, const double d4, const double e4, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3, std::complex< double > &x4)=0
Solves the polynomial giving the four complex solutions , , , and .
Solve a quadratic polynomial with real coefficients and complex roots [abstract base].
Solve a general polynomial with real coefficients and complex roots [abstract base].
Solve a quartic with real coefficients and real roots (GSL)
Solve a quadratic with real coefficients and complex roots (GSL)
static const double x2[5]
static const double x1[5]
virtual int solve_rc(const double a3, const double b3, const double c3, const double d3, double &x1, std::complex< double > &x2, std::complex< double > &x3)
Solves the polynomial giving the real solution and two complex solutions and .
const char * type()
Return a string denoting the type ("quadratic_complex_std")
Solve a cubic with complex coefficients and complex roots.
virtual int solve_c(const std::complex< double > a4, const std::complex< double > b4, const std::complex< double > c4, const std::complex< double > d4, const std::complex< double > e4, std::complex< double > &x1, std::complex< double > &x2, std::complex< double > &x3, std::complex< double > &x4)=0
Solves the complex polynomial giving the four complex solutions , , , and .
virtual int solve_rc(int n, const double co[], std::complex< double > ro[])=0
Solve the n-th order polynomial.
double cube_root_tol
A tolerance for determining the proper cube root (default )
virtual int solve_rc(const double a3, const double b3, const double c3, const double d3, double &x1, std::complex< double > &x2, std::complex< double > &x3)
Solves the polynomial giving the real solution and two complex solutions , and ...
const char * type()
Return a string denoting the type ("cubic_real")
virtual int solve_r(const double a2, const double b2, const double c2, double &x1, double &x2)
Solves the polynomial giving the two solutions and .