34 #define MAX(a, b) ((a) > (b) ? (a) : (b))
39 static double hypot2(
double x,
double y) {
40 return std::sqrt(x * x + y * y);
46 static void tred2(
double V[
n][
n],
double d[
n],
double e[
n])
54 for(
int j = 0; j <
n; j++) {
60 for(
int i =
n - 1; i > 0; i--) {
66 for(
int k = 0; k < i; k++) {
67 scale = scale + std::fabs(d[k]);
71 for(
int j = 0; j < i; j++) {
80 for(
int k = 0; k < i; k++) {
85 double g = std::sqrt(h);
92 for(
int j = 0; j < i; j++) {
98 for(
int j = 0; j < i; j++) {
101 g = e[j] + V[j][j] * f;
102 for(
int k = j + 1; k <= i - 1; k++) {
109 for(
int j = 0; j < i; j++) {
113 double hh = f / (h + h);
114 for(
int j = 0; j < i; j++) {
117 for(
int j = 0; j < i; j++) {
120 for(
int k = j; k <= i - 1; k++) {
121 V[k][j] -= (f * e[k] + g * d[k]);
132 for(
int i = 0; i <
n - 1; i++) {
133 V[
n - 1][i] = V[i][i];
137 for(
int k = 0; k <= i; k++) {
138 d[k] = V[k][i + 1] / h;
140 for(
int j = 0; j <= i; j++) {
142 for(
int k = 0; k <= i; k++) {
143 g += V[k][i + 1] * V[k][j];
145 for(
int k = 0; k <= i; k++) {
150 for(
int k = 0; k <= i; k++) {
154 for(
int j = 0; j <
n; j++) {
158 V[
n - 1][
n - 1] = 1.0;
164 static void tql2(
double V[
n][
n],
double d[
n],
double e[
n])
172 for(
int i = 1; i <
n; i++) {
179 double eps = std::pow(2.0, -52.0);
180 for(
int l = 0; l <
n; l++) {
184 tst1 =
MAX(tst1, std::fabs(d[l]) + std::fabs(e[l]));
187 if(std::fabs(e[m]) <= eps * tst1) {
204 double p = (d[l + 1] - g) / (2.0 * e[l]);
205 double r = hypot2(p, 1.0);
209 d[l] = e[l] / (p + r);
210 d[l + 1] = e[l] * (p + r);
211 double dl1 = d[l + 1];
213 for(
int i = l + 2; i <
n; i++) {
224 double el1 = e[l + 1];
227 for(
int i = m - 1; i >= l; i--) {
237 p = c * d[i] - s * g;
238 d[i + 1] = h + s * (c * g + s * d[i]);
242 for(
int k = 0; k <
n; k++) {
244 V[k][i + 1] = s * V[k][i] + c * h;
245 V[k][i] = c * V[k][i] - s * h;
248 p = -s * s2 *
c3 * el1 * e[l] / dl1;
254 }
while(std::fabs(e[l]) > eps * tst1);
262 for(
int i = 0; i <
n - 1; i++) {
265 for(
int j = i + 1; j <
n; j++) {
274 for(
int j = 0; j <
n; j++) {
289 for(
int i = 0; i < 3; i++) {
290 for(
int j = 0; j < 3; j++) {