15int roots(
float* a,
int n,
float* wr,
float* wi)
17 float sq, b2, c, disc;
36 wr[m - 2] = fabs(b2) + sq;
37 if (b2 < 0.0) wr[m - 2] = -wr[m - 2];
38 if (wr[m - 2] == 0) wr[m - 1] = 0;
40 wr[m - 1] = c / wr[m - 2];
59void deflate(
float* a,
int n,
float* b,
float* quad,
float* err)
69 for (i = 2; i <= n; i++) {
70 b[i] = a[i] - r * b[i - 1] - s * b[i - 2];
72 *err = fabs(b[n]) + fabs(b[n - 1]);
85void find_quad(
float* a,
int n,
float* b,
float* quad,
float* err,
int* iter)
87 float *c, dn, dr, ds, drn, dsn, eps, r, s;
99 if (((*iter) % 200) == 0) { eps *= 10.0; }
103 for (i = 2; i <= n; i++) {
104 b[i] = a[i] - r * b[i - 1] - s * b[i - 2];
105 c[i] = b[i] - r * c[i - 1] - s * c[i - 2];
107 dn = c[n - 1] * c[n - 3] - c[n - 2] * c[n - 2];
108 drn = b[n] * c[n - 3] - b[n - 1] * c[n - 2];
109 dsn = b[n - 1] * c[n - 1] - b[n] * c[n - 2];
111 if (fabs(dn) < 1e-10) {
112 if (dn < 0.0) dn = -1e-8;
121 }
while ((fabs(dr) + fabs(ds)) > eps);
124 *err = fabs(ds) + fabs(dr);
137 for (i = 1; i < n; i++) {
138 b[i] = a[i] * ((float) (n - i)) / coef;
161void recurse(
float* a,
int n,
float* b,
int m,
float* quad,
float* err,
int* iter)
163 float *c, *
x, rs[2], tst;
165 if (fabs(b[m]) < 1e-16) m--;
173 c =
new float[m + 1];
174 x =
new float[n + 1];
180 tst = fabs(rs[0] - quad[0]) + fabs(rs[1] - quad[1]);
186 if (((*iter > 5) && (tst < 1e-4)) || ((*iter > 20) && (tst < 1e-1))) {
188 recurse(a, n, c, m - 1, rs, err, iter);
202 float *b, *z, err, tmp;
205 if ((tmp = a[0]) != 1.0) {
207 for (i = 1; i <= n; i++) {
221 b =
new float[n + 1];
222 z =
new float[n + 1];
224 for (i = 0; i <= n; i++) {
230 quad[0] = 3.14159e-1;
231 quad[1] = 2.78127e-1;
234 for (i = 0; i < 5; i++) {
236 if ((err > 1e-7) || (iter >
maxiter)) {
238 recurse(z, m, b, m - 1, quad, &err, &iter);
241 if (err < 0.001)
break;
246 printf(
"Error! Convergence failure in quadratic x^2 + r*x + s.\n");
249 }
while (err > 0.01);
253 for (i = 0; i <= m; i++) {
269 float* quad =
new float[2];
270 float*
x =
new float[n];
273 quad[0] = 2.71828e-1;
274 quad[1] = 3.14159e-1;
278 numr =
roots(
x, n, wr, wi);
friend fvec sqrt(const fvec &a)
void polynomComplexRoots(float *wr, float *wi, int n, float *a, int &numr)
int roots(float *a, int n, float *wr, float *wi)
void diff_poly(float *a, int n, float *b)
void find_quad(float *a, int n, float *b, float *quad, float *err, int *iter)
void deflate(float *a, int n, float *b, float *quad, float *err)
void get_quads(float *a, int n, float *quad, float *x)
void recurse(float *a, int n, float *b, int m, float *quad, float *err, int *iter)