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"; }
522 int gsl_poly_complex_solve_cubic2(
double a,
double b,
double c,
523 gsl_complex *z0, gsl_complex *z1,
543 cube_root_tol=1.0e-7;
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"; }
580 cube_root_tol=1.0e-7;
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"; }
721 cube_root_tol=1.0e-6;
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")
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")
const char * type()
Return a string denoting the type ("quartic_real_gsl")
double cube_root_tol
A tolerance for determining the proper cube root (default )
Solve a general polynomial with real coefficients (GSL)
The main O<span style='position: relative; top: 0.3em; font-size: 0.8em'>2</span>scl O$_2$scl names...
cubic_real_coeff_cern cub_obj
The object to solve for the associated cubic.
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")
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)
const char * type()
Return a string denoting the type ("cubic_real_coeff_gsl")
Solve a quartic with complex coefficients and complex roots.
const char * type()
Return a string denoting the type ("poly_complex")
Solve a quartic polynomial with real coefficients and real roots [abstract base]. ...
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")
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]
gsl_poly_complex_workspace * w4
Workspace for quartic polynomials.
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].
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 )
Solve a quartic polynomial with real coefficients and complex roots [abstract base].
gsl_poly_complex_workspace * w3
Workspace for cubic polynomials.
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 )
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]
const char * type()
Return a string denoting the type ("quadratic_complex_std")
Solve a cubic with complex coefficients and complex roots.
double cube_root_tol
A tolerance for determining the proper cube root (default )
const char * type()
Return a string denoting the type ("cubic_real")