26 double a_norm, a_normEPS, thr, thr_nn;
29 int i, j, k, ij, ik,
l, m, lm, mq, lq, ll, mm, imv, im, iq, ilv, il, nn;
31 double a_ij, a_lm, a_ll, a_mm, a_im, a_il;
35 double sinx, sinx_2, cosx, cosx_2, sincos;
39 nn = (n * (n + 1)) / 2;
44 for (ij = 0; ij < nn; ij++) {
52 v =
new double[n * n];
55 for (i = 0; i < n; i++) {
56 for (j = 0; j < n; j++) {
72 for (i = 1; i <= n; i++) {
73 for (j = 1; j <= i; j++) {
76 a_norm += a_ij * a_ij;
83 a_normEPS = a_norm *
EPS;
87 while (thr > a_normEPS && nb_iter <
MAX_ITER) {
91 for (
l = 1;
l < n;
l++) {
92 for (m =
l + 1; m <= n; m++) {
101 if (a_lm_2 < thr_nn) {
116 x = -atan((a_lm + a_lm) / delta) / 2.0;
121 sinx_2 = sinx * sinx;
122 cosx_2 = cosx * cosx;
123 sincos = sinx * cosx;
129 for (i = 1; i <= n; i++) {
130 if (!
ELEM(i,
l, m)) {
131 iq = (i * i - i) / 2;
149 a[il] = a_il * cosx - a_im * sinx;
150 a[im] = a_il * sinx + a_im * cosx;
159 v[ilv] = cosx * v_ilv - sinx * v_imv;
160 v[imv] = sinx * v_ilv + cosx * v_imv;
166 a[ll] = a_ll * cosx_2 + a_mm * sinx_2 -
x;
167 a[mm] = a_ll * sinx_2 + a_mm * cosx_2 +
x;
170 thr =
fabs(thr - a_lm_2);
181 for (i = 0; i < n; i++) {
182 k = i + (i * (i + 1)) / 2;
191 for (i = 0; i < n; i++) {
195 for (i = 0; i < (n - 1); i++) {
199 for (j = i + 1; j < n; j++) {
200 if (x < eigen_val[j]) {
206 eigen_val[k] = eigen_val[i];
220 for (k = 0; k < n; k++) {
222 for (i = 0; i < n; i++) {
223 eigen_vec[ij++] =
v[ik++];