43 int nu = std::min(m, n);
53 int i = 0, j = 0, k = 0;
58 int nct = std::min(m - 1, n);
59 int nrt = std::max(0, std::min(n - 2, m));
61 for (k = 0; k < std::max(nct, nrt); k++) {
67 for (i = k; i < m; i++) {
68 s(k) = std::hypot(s(k), A(i, k));
71 if (A(k, k) < 0.0) { s(k) = -s(k); }
72 for (i = k; i < m; i++) {
79 for (j = k + 1; j < n; j++) {
80 if ((k < nct) && (s(k) != 0.0)) {
84 for (i = k; i < m; i++) {
85 t += A(i, k) * A(i, j);
88 for (i = k; i < m; i++) {
89 A(i, j) += t * A(i, k);
98 if (wantu & (k < nct)) {
102 for (i = k; i < m; i++) {
111 for (i = k + 1; i < n; i++) {
112 e(k) = std::hypot(e(k), e(i));
115 if (e(k + 1) < 0.0) { e(k) = -e(k); }
116 for (i = k + 1; i < n; i++) {
122 if ((k + 1 < m) & (e(k) != 0.0)) {
125 for (i = k + 1; i < m; i++) {
128 for (j = k + 1; j < n; j++) {
129 for (i = k + 1; i < m; i++) {
130 work(i) += e(j) * A(i, j);
133 for (j = k + 1; j < n; j++) {
134 Real t(-e(j) / e(k + 1));
135 for (i = k + 1; i < m; i++) {
136 A(i, j) += t * work(i);
144 for (i = k + 1; i < n; i++) {
153 int p = std::min(n, m + 1);
154 if (nct < n) { s(nct) = A(nct, nct); }
155 if (m < p) { s(p - 1) = 0.0; }
156 if (nrt + 1 < p) { e(nrt) = A(nrt, p - 1); }
162 for (j = nct; j < nu; j++) {
163 for (i = 0; i < m; i++) {
168 for (k = nct - 1; k >= 0; k--) {
170 for (j = k + 1; j < nu; j++) {
172 for (i = k; i < m; i++) {
173 t += U(i, k) * U(i, j);
176 for (i = k; i < m; i++) {
177 U(i, j) += t * U(i, k);
180 for (i = k; i < m; i++) {
183 U(k, k) = 1.0 + U(k, k);
184 for (i = 0; i < k - 1; i++) {
188 for (i = 0; i < m; i++) {
199 for (k = n - 1; k >= 0; k--) {
200 if ((k < nrt) & (e(k) != 0.0)) {
201 for (j = k + 1; j < nu; j++) {
203 for (i = k + 1; i < n; i++) {
204 t += V(i, k) * V(i, j);
206 t = -t / V(k + 1, k);
207 for (i = k + 1; i < n; i++) {
208 V(i, j) += t * V(i, k);
212 for (i = 0; i < n; i++) {
223 Real eps(std::pow(2.0, -52.0));
240 for (k = p - 2; k >= -1; k--) {
241 if (k == -1) {
break; }
242 if (std::abs(e(k)) <= eps * (std::abs(s(k)) + std::abs(s(k + 1)))) {
251 for (ks = p - 1; ks >= k; ks--) {
252 if (ks == k) {
break; }
253 Real t((ks != p ? std::abs(e(ks)) : 0.) +
254 (ks != k + 1 ? std::abs(e(ks - 1)) : 0.));
255 if (std::abs(s(ks)) <= eps * t) {
262 }
else if (ks == p - 1) {
279 for (j = p - 2; j >= k; j--) {
280 Real t(std::hypot(s(j), f));
286 e(j - 1) = cs * e(j - 1);
289 for (i = 0; i < n; i++) {
290 t = cs * V(i, j) + sn * V(i, p - 1);
291 V(i, p - 1) = -sn * V(i, j) + cs * V(i, p - 1);
303 for (j = k; j < p; j++) {
304 Real t(std::hypot(s(j), f));
311 for (i = 0; i < m; i++) {
312 t = cs * U(i, j) + sn * U(i, k - 1);
313 U(i, k - 1) = -sn * U(i, j) + cs * U(i, k - 1);
326 std::max(std::max(std::max(std::max(std::abs(s(p - 1)),
331 Real sp = s(p - 1) / scale;
332 Real spm1 = s(p - 2) / scale;
333 Real epm1 = e(p - 2) / scale;
334 Real sk = s(k) / scale;
335 Real ek = e(k) / scale;
336 Real b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0;
337 Real c = (sp * epm1) * (sp * epm1);
339 if ((b != 0.0) || (c != 0.0)) {
340 shift = std::sqrt(b * b + c);
341 if (b < 0.0) { shift = -shift; }
342 shift = c / (b + shift);
344 Real f = (sk + sp) * (sk - sp) + shift;
349 for (j = k; j < p - 1; j++) {
350 Real t = std::hypot(f, g);
353 if (j != k) { e(j - 1) = t; }
354 f = cs * s(j) + sn * e(j);
355 e(j) = cs * e(j) - sn * s(j);
357 s(j + 1) = cs * s(j + 1);
359 for (i = 0; i < n; i++) {
360 t = cs * V(i, j) + sn * V(i, j + 1);
361 V(i, j + 1) = -sn * V(i, j) + cs * V(i, j + 1);
365 t = std::hypot(f, g);
369 f = cs * e(j) + sn * s(j + 1);
370 s(j + 1) = -sn * e(j) + cs * s(j + 1);
372 e(j + 1) = cs * e(j + 1);
373 if (wantu && (j < m - 1)) {
374 for (i = 0; i < m; i++) {
375 t = cs * U(i, j) + sn * U(i, j + 1);
376 U(i, j + 1) = -sn * U(i, j) + cs * U(i, j + 1);
391 s(k) = (s(k) < 0.0 ? -s(k) : 0.0);
393 for (i = 0; i <= pp; i++) {
402 if (s(k) >= s(k + 1)) {
break; }
406 if (wantv && (k < n - 1)) {
407 for (i = 0; i < n; i++) {
409 V(i, k + 1) = V(i, k);
413 if (wantu && (k < m - 1)) {
414 for (i = 0; i < m; i++) {
416 U(i, k + 1) = U(i, k);
430 int minm = std::min(m + 1, n);
434 for (
int i = 0; i < m; i++)
435 for (
int j = 0; j < minm; j++)
450 for (
int i = 0; i < n; i++) {
451 for (
int j = 0; j < n; j++) {
462 Real
cond() {
return s(0) / s(std::min(m, n) - 1); }
468 Real eps = std::pow(2.0, -52.0);
469 Real tol = std::max(m, n) * s(0) * eps;
471 for (
int i = 0; i < s.size(); i++) {
472 if (s(i) > tol) { r++; }