265 for(
int j = upp; j >= 0; j--) {
266 for(
int i = 0; i <= upp; i++) {
267 if(i != j && copy[j][i] != 0.0)
goto next_column;
272 scale[upp] = double(j);
281 for(
int j = low; j < upp; j++) {
282 for(
int i = low; i <= upp; i++) {
283 if(i != j && copy[i][j] != 0.0)
goto next_row;
288 scale[low] = double(j);
297 for(
int i = low; i <= upp; i++) scale[i] = 1.0;
300 const double radix = 16.0;
301 const double b2 = radix * radix;
307 for(
int i = low; i <= upp; i++) {
311 for(
int j = low; j <= upp; j++) {
313 c += std::abs(copy[j][i]);
314 r += std::abs(copy[i][j]);
319 if(
c != 0.0 && r == 0.0) {
320 double g = r / radix;
337 if((
c + r) / f < s * .95) {
341 for(
int j = low; j < N; j++) copy[i][j] *= g;
342 for(
int j = 0; j <= upp; j++) copy[j][i] *= f;
545 for(
int i = 0; i < low; i++) lambda[i] = std::complex<double>(h[i][i]);
546 for(
int i = upp + 1; i < N; i++) lambda[i] = std::complex<double>(h[i][i]);
551 for(
int i = 0; i < N; i++) {
552 for(
int j = k; j < N; j++) norm += std::abs(h[i][j]);
558 double p = 0.0, q = 0.0, r = 0.0, s = 0.0;
559 double w = 0.0, x = 0.0, y = 0.0, z = 0.0;
561 for(
int en = upp + 1; en-- > low;) {
568 for(l = en; l > low; l--) {
569 s = std::abs(h[l-1][l-1]) + std::abs(h[l][l]);
570 if(s == 0.0) s = norm;
571 if((s + std::abs(h[l][l-1])) == s)
break;
576 if(l == en)
goto one_root;
579 w = h[en][en-1] * h[en-1][en];
580 if(l == en - 1)
goto two_roots;
583 if(itn == 0)
return (en + 1);
586 if(its == 10 || its == 20) {
588 for(
int i = low; i <= en; i++) h[i][i] -= x;
589 s = std::abs(h[en][en-1]) + std::abs(h[en-1][en-2]);
599 for(m = en - 1; m-- > l;) {
603 p = (r * s - w) / h[m+1][m] + h[m][m+1];
604 q = h[m+1][m+1] - z - r - s;
606 s = std::abs(p) + std::abs(q) + std::abs(r);
611 double tst1 = std::abs(p) * (std::abs(h[m-1][m-1]) + std::abs(z) + std::abs(h[m+1][m+1]));
612 double tst2 = tst1 + std::abs(h[m][m-1]) * (std::abs(q) + std::abs(r));
613 if(tst2 == tst1)
break;
617 for(
int i = m + 3; i <= en; i++) h[i][i-2] = h[i][i-3] = 0.0;
620 for(k = m; k < en; k++) {
621 bool notLast = (k != en - 1);
626 r = notLast ? h[k+2][k-1] : 0.0;
627 x = std::abs(p) + std::abs(q) + std::abs(r);
628 if(x == 0.0)
continue;
634 s = std::sqrt(p * p + q * q + r * r);
640 h[k][k-1] = - h[k][k-1];
650 for(
int j = k; j <= en; j++) {
651 p = h[k][j] + q * h[k+1][j];
661 int j = (en < k + 3) ? en : (k + 3);
662 for(
int i = l; i <= j; i++) {
663 p = x * h[i][k] + y * h[i][k+1];
675 lambda[en] = std::complex<double>(x + t);
681 z = std::sqrt(std::abs(q));
686 z = (p > 0.0) ? (p + z) : (p - z);
687 lambda[en-1] = std::complex<double>(x + z);
688 lambda[en] = std::complex<double>((z != 0.0) ? (x - w / z) : x + z);
691 lambda[en-1] = std::complex<double>(x + p, + z);
692 lambda[en] = std::complex<double>(x + p, - z);
754 for(
int i = 0; i < low; i++) lambda[i] = std::complex<double>(h[i][i]);
755 for(
int i = upp + 1; i < N; i++) lambda[i] = std::complex<double>(h[i][i]);
760 for(
int i = 0; i < N; i++) {
761 for(
int j = k; j < N; j++) norm += std::abs(h[i][j]);
766 double p = 0.0, q = 0.0, r = 0.0, s = 0.0;
767 double w = 0.0, x = 0.0, y = 0.0, z = 0.0;
771 for(
int en = upp + 1; en-- > low;) {
777 for(l = en; l > low; l--) {
778 s = std::abs(h[l-1][l-1]) + std::abs(h[l][l]);
779 if(s == 0.0) s = norm;
780 if((s + std::abs(h[l][l-1])) == s)
break;
785 if(l == en)
goto one_root;
788 w = h[en][en-1] * h[en-1][en];
789 if(l == en - 1)
goto two_roots;
792 if(itn == 0)
return (en + 1);
795 if(its == 10 || its == 20) {
797 for(
int i = low; i <= en; i++) h[i][i] -= x;
798 s = std::abs(h[en][en-1]) + std::abs(h[en-1][en-2]);
808 for(m = en - 1; m-- > l;) {
812 p = (r * s - w) / h[m+1][m] + h[m][m+1];
813 q = h[m+1][m+1] - z - r - s;
815 s = std::abs(p) + std::abs(q) + std::abs(r);
820 tst1 = std::abs(p) * (std::abs(h[m-1][m-1]) + std::abs(z) + std::abs(h[m+1][m+1]));
821 tst2 = tst1 + std::abs(h[m][m-1]) * (std::abs(q) + std::abs(r));
822 if(tst2 == tst1)
break;
826 for(
int i = m + 3; i <= en; i++) h[i][i-2] = h[i][i-3] = 0.0;
829 for(k = m; k < en; k++) {
830 bool notLast = (k != en - 1);
835 r = notLast ? h[k+2][k-1] : 0.0;
836 x = std::abs(p) + std::abs(q) + std::abs(r);
837 if(x == 0.0)
continue;
843 s = std::sqrt(p * p + q * q + r * r);
849 h[k][k-1] = - h[k][k-1];
859 for(
int j = k; j < N; j++) {
860 p = h[k][j] + q * h[k+1][j];
870 int j = (en < k + 3) ? en : (k + 3);
871 for(
int i = 0; i <= j; i++) {
872 p = x * h[i][k] + y * h[i][k+1];
882 for(
int i = low; i <= upp; i++) {
895 lambda[en] = std::complex<double>(h[en][en] = x + t);
901 z = std::sqrt(std::abs(q));
902 h[en][en] = x = x + t;
903 h[en-1][en-1] = y + t;
907 z = (p > 0.0) ? (p + z) : (p - z);
909 lambda[en] = (z != 0.0) ? (x - w / z) : (x + z);
911 s = std::abs(x) + std::abs(z);
914 r = std::sqrt(p * p + q * q);
919 for(
int j = en - 1; j < N; j++) {
921 h[en-1][j] = q * z + p * h[en][j];
922 h[en][j] = q * h[en][j] - p * z;
926 for(
int i = 0; i <= en; i++) {
928 h[i][en-1] = q * z + p * h[i][en];
929 h[i][en] = q * h[i][en] - p * z;
933 for(
int i = low; i <= upp; i++) {
940 lambda[en-1] = std::complex<double>(x + p, + z);
941 lambda[en] = std::complex<double>(x + p, - z);
949 if(norm == 0.0)
return 0;
951 for(
int en = N; en-- > 0;) {
952 p = std::real(
lambda[en]);
953 q = std::imag(
lambda[en]);
961 if(std::abs(h[en][en-1]) > std::abs(h[en-1][en])) {
962 h[en-1][en-1] = q / h[en][en-1];
963 h[en-1][en] = - (h[en][en] - p) / h[en][en-1];
965 cdiv(0.0, - h[en-1][en], h[en-1][en-1] - p, q,
966 h[en-1][en-1], h[en-1][en]);
973 for(
int i = en - 1; i-- > 0;) {
978 for(
int j = m; j <= en; j++) {
979 ra += h[i][j] * h[j][en-1];
980 sa += h[i][j] * h[j][en];
983 if(std::imag(
lambda[i]) < 0.0) {
989 if(std::imag(
lambda[i]) == 0.0) {
990 cdiv(- ra, -sa, w, q, h[i][en-1], h[i][en]);
995 double vr = (std::real(
lambda[i]) - p) * (std::real(
lambda[i]) - p) +
997 double vi = std::real(
lambda[i] - p) * 2.0 * q;
999 if(vr == 0.0 && vi == 0.0) {
1001 norm * (std::abs(w) + std::abs(q) + std::abs(x) + std::abs(y) + std::abs(z));
1007 }
while(tst2 > tst1);
1010 cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi,
1011 h[i][en-1], h[i][en]);
1013 if(std::abs(x) > std::abs(z) + std::abs(q)) {
1014 h[i+1][en-1] = (- ra - w * h[i][en-1] + q * h[i][en]) / x;
1015 h[i+1][en] = (- sa - w * h[i][en] - q * h[i][en-1]) / x;
1017 cdiv(- r - y * h[i][en-1], - s - y * h[i][en], z, q,
1018 h[i+1][en-1], h[i+1][en]);
1023 t = std::max(std::abs(h[i][en-1]), std::abs(h[i][en]));
1025 if(t != 0.0 && (t + 1.0 / t) <= t) {
1026 for(
int j = i; j <= en; j++) {
1041 for(
int i = en; i-- > 0;) {
1044 for(
int j = m; j <= en; j++) r += h[i][j] * h[j][en];
1046 if(std::imag(
lambda[i]) < 0.0) {
1051 if(std::imag(
lambda[i]) == 0.0) {
1059 }
while(tst2 > tst1);
1067 q = (std::real(
lambda[i]) - p) * (std::real(
lambda[i]) - p) +
1069 t = (x * s - z * r) / q;
1071 h[i+1][en] = (std::abs(x) > std::abs(z)) ?
1072 (- r - w * t) / x : (- s - y * t) / z;
1076 t = std::abs(h[i][en]);
1077 if(t != 0.0 && (t + 1.0 / t) <= t) {
1078 for(
int j = i; j <= en; j++) h[j][en] /= t;
1088 for(
int i = 0; i < low; i++) {
1089 for(
int j = i; j < N; j++)
vectors[i][j] = h[i][j];
1092 for(
int i = upp + 1; i < N; i++) {
1093 for(
int j = i; j < N; j++)
vectors[i][j] = h[i][j];
1098 for(
int j = N; j-- > low;) {
1099 int m = (j < upp) ? j : upp;
1101 for(
int i = low; i <= upp; i++) {
1103 for(k = low; k <= m; k++) z +=
vectors[i][k] * h[k][j];