321 for (
int j = 0; j < n; j++) {
327 for (
int i = n-1; i > 0; i--) {
331 Real scale = Real(0.0);
333 for (
int k = 0; k < i; k++) {
334 scale = scale + abs(d[k]);
336 if (scale == Real(0.0)) {
338 for (
int j = 0; j < i; j++) {
347 for (
int k = 0; k < i; k++) {
359 for (
int j = 0; j < i; j++) {
365 for (
int j = 0; j < i; j++) {
368 g = e[j] + V[j][j] * f;
369 for (
int k = j+1; k <= i-1; k++) {
376 for (
int j = 0; j < i; j++) {
380 Real hh = f / (h + h);
381 for (
int j = 0; j < i; j++) {
384 for (
int j = 0; j < i; j++) {
387 for (
int k = j; k <= i-1; k++) {
388 V[k][j] -= (f * e[k] + g * d[k]);
399 for (
int i = 0; i < n-1; i++) {
403 if (h != Real(0.0)) {
404 for (
int k = 0; k <= i; k++) {
405 d[k] = V[k][i+1] / h;
407 for (
int j = 0; j <= i; j++) {
409 for (
int k = 0; k <= i; k++) {
410 g += V[k][i+1] * V[k][j];
412 for (
int k = 0; k <= i; k++) {
417 for (
int k = 0; k <= i; k++) {
418 V[k][i+1] = Real(0.0);
421 for (
int j = 0; j < n; j++) {
423 V[n-1][j] = Real(0.0);
425 V[n-1][n-1] = Real(1.0);
438 for (
int i = 1; i < n; i++) {
444 Real tst1 = Real(0.0);
445 Real eps = pow(2.0,-52.0);
446 for (
int l = 0; l < n; l++) {
450 tst1 = max(tst1,abs(d[l]) + abs(e[l]));
455 if (abs(e[m]) <= eps*tst1) {
473 Real p = (d[l+1] - g) / (2.0 * e[l]);
474 Real r =
hypot(p,
static_cast<Real
>(Real(1.0)));
478 d[l] = e[l] / (p + r);
479 d[l+1] = e[l] * (p + r);
482 for (
int i = l+2; i < n; i++) {
496 for (
int i = m-1; i >= l; i--) {
506 p = c * d[i] - s * g;
507 d[i+1] = h + s * (c * g + s * d[i]);
511 for (
int k = 0; k < n; k++) {
513 V[k][i+1] = s * V[k][i] + c * h;
514 V[k][i] = c * V[k][i] - s * h;
517 p = -s * s2 * c3 * el1 * e[l] / dl1;
523 }
while (abs(e[l]) > eps*tst1);
531 for (
int i = 0; i < n-1; i++) {
534 for (
int j = i+1; j < n; j++) {
543 for (
int j = 0; j < n; j++) {
564 for (
int m = low+1; m <= high-1; m++) {
568 Real scale = Real(0.0);
569 for (
int i = m; i <= high; i++) {
570 scale = scale + abs(H[i][m-1]);
572 if (scale != Real(0.0)) {
577 for (
int i = high; i >= m; i--) {
578 ort[i] = H[i][m-1]/scale;
579 h += ort[i] * ort[i];
591 for (
int j = m; j < n; j++) {
593 for (
int i = high; i >= m; i--) {
597 for (
int i = m; i <= high; i++) {
602 for (
int i = 0; i <= high; i++) {
604 for (
int j = high; j >= m; j--) {
608 for (
int j = m; j <= high; j++) {
612 ort[m] = scale*ort[m];
619 for (
int i = 0; i < n; i++) {
620 for (
int j = 0; j < n; j++) {
621 V[i][j] = (i == j ? Real(1.0) : Real(0.0));
625 for (
int m = high-1; m >= low+1; m--) {
626 if (H[m][m-1] != Real(0.0)) {
627 for (
int i = m+1; i <= high; i++) {
630 for (
int j = m; j <= high; j++) {
632 for (
int i = m; i <= high; i++) {
633 g += ort[i] * V[i][j];
636 g = (g / ort[m]) / H[m][m-1];
637 for (
int i = m; i <= high; i++) {
638 V[i][j] += g * ort[i];
649 void cdiv(Real xr, Real xi, Real yr, Real yi) {
651 if (abs(yr) > abs(yi)) {
654 cdivr = (xr + r*xi)/d;
655 cdivi = (xi - r*xr)/d;
659 cdivr = (r*xr + xi)/d;
660 cdivi = (r*xi - xr)/d;
680 Real eps = pow(2.0,-52.0);
681 Real exshift = Real(0.0);
682 Real p=0,q=0,r=0,s=0,z=0,t,w,x,y;
686 Real
norm = Real(0.0);
687 for (
int i = 0; i < nn; i++) {
688 if ((i < low) || (i > high)) {
692 for (
int j = max(i-1,0); j < nn; j++) {
706 s = abs(H[l-1][l-1]) + abs(H[l][l]);
707 if (s == Real(0.0)) {
710 if (abs(H[l][l-1]) < eps * s) {
720 H[n][n] = H[n][n] + exshift;
728 }
else if (l == n-1) {
729 w = H[n][n-1] * H[n-1][n];
730 p = (H[n-1][n-1] - H[n][n]) / 2.0;
733 H[n][n] = H[n][n] + exshift;
734 H[n-1][n-1] = H[n-1][n-1] + exshift;
747 if (z != Real(0.0)) {
756 r = sqrt(p * p+q * q);
762 for (
int j = n-1; j < nn; j++) {
764 H[n-1][j] = q * z + p * H[n][j];
765 H[n][j] = q * H[n][j] - p * z;
770 for (
int i = 0; i <= n; i++) {
772 H[i][n-1] = q * z + p * H[i][n];
773 H[i][n] = q * H[i][n] - p * z;
778 for (
int i = low; i <= high; i++) {
780 V[i][n-1] = q * z + p * V[i][n];
781 V[i][n] = q * V[i][n] - p * z;
806 w = H[n][n-1] * H[n-1][n];
813 for (
int i = low; i <= n; i++) {
816 s = abs(H[n][n-1]) + abs(H[n-1][n-2]);
831 s = x - w / ((y - x) / 2.0 + s);
832 for (
int i = low; i <= n; i++) {
849 p = (r * s - w) / H[m+1][m] + H[m][m+1];
850 q = H[m+1][m+1] - z - r - s;
852 s = abs(p) + abs(q) + abs(r);
859 if (abs(H[m][m-1]) * (abs(q) + abs(r)) <
860 eps * (abs(p) * (abs(H[m-1][m-1]) + abs(z) +
861 abs(H[m+1][m+1])))) {
867 for (
int i = m+2; i <= n; i++) {
868 H[i][i-2] = Real(0.0);
870 H[i][i-3] = Real(0.0);
876 for (
int k = m; k <= n-1; k++) {
877 int notlast = (k != n-1);
881 r = (notlast ? H[k+2][k-1] : Real(0.0));
882 x = abs(p) + abs(q) + abs(r);
883 if (x != Real(0.0)) {
889 if (x == Real(0.0)) {
892 s = sqrt(p * p + q * q + r * r);
900 H[k][k-1] = -H[k][k-1];
911 for (
int j = k; j < nn; j++) {
912 p = H[k][j] + q * H[k+1][j];
914 p = p + r * H[k+2][j];
915 H[k+2][j] = H[k+2][j] - p * z;
917 H[k][j] = H[k][j] - p * x;
918 H[k+1][j] = H[k+1][j] - p * y;
923 for (
int i = 0; i <= min(n,k+3); i++) {
924 p = x * H[i][k] + y * H[i][k+1];
926 p = p + z * H[i][k+2];
927 H[i][k+2] = H[i][k+2] - p * r;
929 H[i][k] = H[i][k] - p;
930 H[i][k+1] = H[i][k+1] - p * q;
935 for (
int i = low; i <= high; i++) {
936 p = x * V[i][k] + y * V[i][k+1];
938 p = p + z * V[i][k+2];
939 V[i][k+2] = V[i][k+2] - p * r;
941 V[i][k] = V[i][k] - p;
942 V[i][k+1] = V[i][k+1] - p * q;
951 if (
norm == Real(0.0)) {
955 for (n = nn-1; n >= 0; n--) {
964 for (
int i = n-1; i >= 0; i--) {
967 for (
int j = l; j <= n; j++) {
968 r = r + H[i][j] * H[j][n];
970 if (e[i] < Real(0.0)) {
975 if (e[i] == Real(0.0)) {
976 if (w != Real(0.0)) {
979 H[i][n] = -r / (eps *
norm);
987 q = (d[i] - p) * (d[i] - p) + e[i] * e[i];
988 t = (x * s - z * r) / q;
990 if (abs(x) > abs(z)) {
991 H[i+1][n] = (-r - w * t) / x;
993 H[i+1][n] = (-s - y * t) / z;
1000 if ((eps * t) * t > 1) {
1001 for (
int j = i; j <= n; j++) {
1002 H[j][n] = H[j][n] / t;
1015 if (abs(H[n][n-1]) > abs(H[n-1][n])) {
1016 H[n-1][n-1] = q / H[n][n-1];
1017 H[n-1][n] = -(H[n][n] - p) / H[n][n-1];
1019 cdiv(Real(0.0),-H[n-1][n],H[n-1][n-1]-p,q);
1020 H[n-1][n-1] = cdivr;
1023 H[n][n-1] = Real(0.0);
1024 H[n][n] = Real(1.0);
1025 for (
int i = n-2; i >= 0; i--) {
1029 for (
int j = l; j <= n; j++) {
1030 ra = ra + H[i][j] * H[j][n-1];
1031 sa = sa + H[i][j] * H[j][n];
1035 if (e[i] < Real(0.0)) {
1051 vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
1052 vi = (d[i] - p) * 2.0 * q;
1053 if ((vr == Real(0.0)) && (vi == Real(0.0))) {
1054 vr = eps *
norm * (abs(w) + abs(q) +
1055 abs(x) + abs(y) + abs(z));
1057 cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi);
1060 if (abs(x) > (abs(z) + abs(q))) {
1061 H[i+1][n-1] = (-ra - w * H[i][n-1] + q * H[i][n]) / x;
1062 H[i+1][n] = (-sa - w * H[i][n] - q * H[i][n-1]) / x;
1064 cdiv(-r-y*H[i][n-1],-s-y*H[i][n],z,q);
1065 H[i+1][n-1] = cdivr;
1072 t = max(abs(H[i][n-1]),abs(H[i][n]));
1073 if ((eps * t) * t > 1) {
1074 for (
int j = i; j <= n; j++) {
1075 H[j][n-1] = H[j][n-1] / t;
1076 H[j][n] = H[j][n] / t;
1086 for (
int i = 0; i < nn; i++) {
1087 if (i < low || i > high) {
1088 for (
int j = i; j < nn; j++) {
1096 for (
int j = nn-1; j >= low; j--) {
1097 for (
int i = low; i <= high; i++) {
1099 for (
int k = low; k <= min(j,high); k++) {
1100 z = z + V[i][k] * H[k][j];
1121 for (
int j = 0; (j < n) && issymmetric; j++) {
1122 for (
int i = 0; (i < n) && issymmetric; i++) {
1123 issymmetric = (A[i][j] == A[j][i]);
1128 for (
int i = 0; i < n; i++) {
1129 for (
int j = 0; j < n; j++) {
1144 for (
int j = 0; j < n; j++) {
1145 for (
int i = 0; i < n; i++) {
1223 for (
int i = 0; i < n; i++) {
1224 for (
int j = 0; j < n; j++) {
1225 D[i][j] = Real(0.0);
1230 }
else if (e[i] < 0) {
1898 int nct = min(m-1,n);
1899 int nrt = max(0,min(n-2,m));
1900 for (k = 0; k < max(nct,nrt); k++) {
1907 for (i = k; i < m; i++) {
1908 s[k] =
hypot(s[k],A[i][k]);
1910 if (s[k] != Real(0.0)) {
1911 if (A[k][k] < Real(0.0)) {
1914 for (i = k; i < m; i++) {
1917 A[k][k] += Real(1.0);
1921 for (j = k+1; j < n; j++) {
1922 if ((k < nct) && (s[k] != Real(0.0))) {
1927 for (i = k; i < m; i++) {
1928 t += A[i][k]*A[i][j];
1931 for (i = k; i < m; i++) {
1932 A[i][j] += t*A[i][k];
1941 if (wantu & (k < nct)) {
1946 for (i = k; i < m; i++) {
1956 for (i = k+1; i < n; i++) {
1957 e[k] =
hypot(e[k],e[i]);
1959 if (e[k] != Real(0.0)) {
1960 if (e[k+1] < Real(0.0)) {
1963 for (i = k+1; i < n; i++) {
1966 e[k+1] += Real(1.0);
1969 if ((k+1 < m) & (e[k] != Real(0.0))) {
1973 for (i = k+1; i < m; i++) {
1974 work[i] = Real(0.0);
1976 for (j = k+1; j < n; j++) {
1977 for (i = k+1; i < m; i++) {
1978 work[i] += e[j]*A[i][j];
1981 for (j = k+1; j < n; j++) {
1982 double t = -e[j]/e[k+1];
1983 for (i = k+1; i < m; i++) {
1984 A[i][j] += t*work[i];
1993 for (i = k+1; i < n; i++) {
2004 s[nct] = A[nct][nct];
2010 e[nrt] = A[nrt][p-1];
2017 for (j = nct; j < nu; j++) {
2018 for (i = 0; i < m; i++) {
2019 U[i][j] = Real(0.0);
2021 U[j][j] = Real(1.0);
2023 for (k = nct-1; k >= 0; k--) {
2024 if (s[k] != Real(0.0)) {
2025 for (j = k+1; j < nu; j++) {
2027 for (i = k; i < m; i++) {
2028 t += U[i][k]*U[i][j];
2031 for (i = k; i < m; i++) {
2032 U[i][j] += t*U[i][k];
2035 for (i = k; i < m; i++ ) {
2038 U[k][k] = Real(1.0) + U[k][k];
2039 for (i = 0; i < k-1; i++) {
2040 U[i][k] = Real(0.0);
2043 for (i = 0; i < m; i++) {
2044 U[i][k] = Real(0.0);
2046 U[k][k] = Real(1.0);
2054 for (k = n-1; k >= 0; k--) {
2055 if ((k < nrt) & (e[k] != Real(0.0))) {
2056 for (j = k+1; j < nu; j++) {
2058 for (i = k+1; i < n; i++) {
2059 t += V[i][k]*V[i][j];
2062 for (i = k+1; i < n; i++) {
2063 V[i][j] += t*V[i][k];
2067 for (i = 0; i < n; i++) {
2068 V[i][k] = Real(0.0);
2070 V[k][k] = Real(1.0);
2078 double eps = pow(2.0,-52.0);
2095 for (k = p-2; k >= -1; k--) {
2099 if (abs(e[k]) <= eps*(abs(s[k]) + abs(s[k+1]))) {
2108 for (ks = p-1; ks >= k; ks--) {
2112 double t = (ks != p ? abs(e[ks]) : 0.) +
2113 (ks != k+1 ? abs(e[ks-1]) : 0.);
2114 if (abs(s[ks]) <= eps*t) {
2121 }
else if (ks == p-1) {
2139 for (j = p-2; j >= k; j--) {
2140 double t =
hypot(s[j],f);
2149 for (i = 0; i < n; i++) {
2150 t = cs*V[i][j] + sn*V[i][p-1];
2151 V[i][p-1] = -sn*V[i][j] + cs*V[i][p-1];
2164 for (j = k; j < p; j++) {
2165 double t =
hypot(s[j],f);
2172 for (i = 0; i < m; i++) {
2173 t = cs*U[i][j] + sn*U[i][k-1];
2174 U[i][k-1] = -sn*U[i][j] + cs*U[i][k-1];
2188 double scale = max(max(max(max(
2189 abs(s[p-1]),abs(s[p-2])),abs(e[p-2])),
2190 abs(s[k])),abs(e[k]));
2191 double sp = s[p-1]/scale;
2192 double spm1 = s[p-2]/scale;
2193 double epm1 = e[p-2]/scale;
2194 double sk = s[k]/scale;
2195 double ek = e[k]/scale;
2196 double b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0;
2197 double c = (sp*epm1)*(sp*epm1);
2198 double shift = Real(0.0);
2199 if ((b != Real(0.0)) || (c != Real(0.0))) {
2200 shift = sqrt(b*b + c);
2201 if (b < Real(0.0)) {
2204 shift = c/(b + shift);
2206 double f = (sk + sp)*(sk - sp) + shift;
2211 for (j = k; j < p-1; j++) {
2212 double t =
hypot(f,g);
2218 f = cs*s[j] + sn*e[j];
2219 e[j] = cs*e[j] - sn*s[j];
2223 for (i = 0; i < n; i++) {
2224 t = cs*V[i][j] + sn*V[i][j+1];
2225 V[i][j+1] = -sn*V[i][j] + cs*V[i][j+1];
2233 f = cs*e[j] + sn*s[j+1];
2234 s[j+1] = -sn*e[j] + cs*s[j+1];
2237 if (wantu && (j < m-1)) {
2238 for (i = 0; i < m; i++) {
2239 t = cs*U[i][j] + sn*U[i][j+1];
2240 U[i][j+1] = -sn*U[i][j] + cs*U[i][j+1];
2256 if (s[k] <= Real(0.0)) {
2257 s[k] = (s[k] < Real(0.0) ? -s[k] : Real(0.0));
2259 for (i = 0; i <= pp; i++) {
2268 if (s[k] >= s[k+1]) {
2274 if (wantv && (k < n-1)) {
2275 for (i = 0; i < n; i++) {
2276 t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] = t;
2279 if (wantu && (k < m-1)) {
2280 for (i = 0; i < m; i++) {
2281 t = U[i][k+1]; U[i][k+1] = U[i][k]; U[i][k] = t;
2297 int minm = min(m+1,n);
2301 for (
int i=0; i<m; i++)
2302 for (
int j=0; j<minm; j++)
2327 for (
int i = 0; i < n; i++) {
2328 for (
int j = 0; j < n; j++) {
2329 A[i][j] = Real(0.0);
2344 return s[0]/s[min(m,n)-1];
2353 double eps = pow(2.0,-52.0);
2354 double tol = max(m,n)*s[0]*eps;
2356 for (
int i = 0; i < s.dim(); i++) {