16int roots(
float *a,
int n,
float *wr,
float *wi) {
17 float sq, b2, c, disc;
35 wr[
m - 2] =
fabs(b2) + sq;
37 wr[
m - 2] = -wr[
m - 2];
41 wr[
m - 1] = c / wr[
m - 2];
60void 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];
85void find_quad(
float *a,
int n,
float *b,
float *quad,
float *err,
int *iter) {
86 float *c, dn, dr, ds, drn, dsn, eps, r, s;
99 if (((*iter) % 200) == 0) {
105 for (
i = 2;
i <= n;
i++) {
106 b[
i] = a[
i] - r * b[
i - 1] - s * b[
i - 2];
107 c[
i] = b[
i] - r * c[
i - 1] - s * c[
i - 2];
109 dn = c[n - 1] * c[n - 3] - c[n - 2] * c[n - 2];
110 drn = b[n] * c[n - 3] - b[n - 1] * c[n - 2];
111 dsn = b[n - 1] * c[n - 1] - b[n] * c[n - 2];
113 if (
fabs(dn) < 1e-10) {
124 }
while ((
fabs(dr) +
fabs(ds)) > eps);
139 for (
i = 1;
i < n;
i++) {
140 b[
i] = a[
i] * ((float)(n -
i)) / coef;
163void recurse(
float *a,
int n,
float *b,
int m,
float *quad,
float *err,
165 float *c, *x, rs[2], tst;
167 if (
fabs(b[
m]) < 1e-16)
176 c =
new float[
m + 1];
177 x =
new float[n + 1];
183 tst =
fabs(rs[0] - quad[0]) +
fabs(rs[1] - quad[1]);
189 if (((*iter > 5) && (tst < 1e-4)) || ((*iter > 20) && (tst < 1e-1))) {
191 recurse(a, n, c,
m - 1, rs, err, iter);
204 float *b, *z, err, tmp;
207 if ((tmp = a[0]) != 1.0) {
209 for (
i = 1;
i <= n;
i++) {
222 b =
new float[n + 1];
223 z =
new float[n + 1];
225 for (
i = 0;
i <= n;
i++) {
231 quad[0] = 3.14159e-1;
232 quad[1] = 2.78127e-1;
235 for (
i = 0;
i < 5;
i++) {
237 if ((err > 1e-7) || (iter >
maxiter)) {
239 recurse(z,
m, b,
m - 1, quad, &err, &iter);
248 printf(
"Error! Convergence failure in quadratic x^2 + r*x + s.\n");
251 }
while (err > 0.01);
255 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 F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 fabs(const F32vec4 &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)