22 #include "sinfo_solve_poly_root.h"
26 #define RADIX2 (RADIX*RADIX)
43 sinfo_balance_companion_matrix (
double *m,
size_t nc)
45 int not_converged = 1;
57 for (i = 0; i < nc; i++)
63 col_norm = fabs (MAT (m, i + 1, i, nc));
69 for (j = 0; j < nc - 1; j++)
71 col_norm += fabs (MAT (m, j, nc - 1, nc));
79 row_norm = fabs (MAT (m, 0, nc - 1, nc));
83 row_norm = fabs (MAT (m, i, i - 1, nc));
87 row_norm = (fabs (MAT (m, i, i - 1, nc))
88 + fabs (MAT (m, i, nc - 1, nc)));
91 if (col_norm == 0 || row_norm == 0)
98 s = col_norm + row_norm;
106 g = row_norm * RADIX;
114 if ((row_norm + col_norm) < 0.95 * s * f)
122 MAT (m, 0, nc - 1, nc) *= g;
126 MAT (m, i, i - 1, nc) *= g;
127 MAT (m, i, nc - 1, nc) *= g;
132 for (j = 0; j < nc; j++)
134 MAT (m, j, i, nc) *= f;
139 MAT (m, i + 1, i, nc) *= f;