qrecvc.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /* qrecvc.c CCMATH mathematics library source code.
  2. *
  3. * Copyright (C) 2000 Daniel A. Atkinson All rights reserved.
  4. * This code may be redistributed under the terms of the GNU library
  5. * public license (LGPL). ( See the lgpl.license file for details.)
  6. * ------------------------------------------------------------------------
  7. */
  8. #include "ccmath.h"
  9. void qrecvc(double *ev, Cpx * evec, double *dp, int n)
  10. {
  11. double cc, sc = 0.0, d, x = 0.0, y, h = 0.0, tzr = 1.e-15;
  12. int i, j, k, m, nqr = 50 * n;
  13. Cpx *p;
  14. for (j = 0, m = n - 1; j < nqr; ++j) {
  15. while (1) {
  16. if (m < 1)
  17. break;
  18. k = m - 1;
  19. if (fabs(dp[k]) <= fabs(ev[m]) * tzr)
  20. --m;
  21. else {
  22. x = (ev[k] - ev[m]) / 2.;
  23. h = sqrt(x * x + dp[k] * dp[k]);
  24. if (m > 1 && fabs(dp[m - 2]) > fabs(ev[k]) * tzr)
  25. break;
  26. if ((cc = sqrt((1. + x / h) / 2.)) != 0.)
  27. sc = dp[k] / (2. * cc * h);
  28. else
  29. sc = 1.;
  30. x += ev[m];
  31. ev[m--] = x - h;
  32. ev[m--] = x + h;
  33. for (i = 0, p = evec + n * (m + 1); i < n; ++i, ++p) {
  34. h = p[0].re;
  35. p[0].re = cc * h + sc * p[n].re;
  36. p[n].re = cc * p[n].re - sc * h;
  37. h = p[0].im;
  38. p[0].im = cc * h + sc * p[n].im;
  39. p[n].im = cc * p[n].im - sc * h;
  40. }
  41. }
  42. }
  43. if (x > 0.)
  44. d = ev[m] + x - h;
  45. else
  46. d = ev[m] + x + h;
  47. cc = 1.;
  48. y = 0.;
  49. ev[0] -= d;
  50. for (k = 0; k < m; ++k) {
  51. x = ev[k] * cc - y;
  52. y = dp[k] * cc;
  53. h = sqrt(x * x + dp[k] * dp[k]);
  54. if (k > 0)
  55. dp[k - 1] = sc * h;
  56. ev[k] = cc * h;
  57. cc = x / h;
  58. sc = dp[k] / h;
  59. ev[k + 1] -= d;
  60. y *= sc;
  61. ev[k] = cc * (ev[k] + y) + ev[k + 1] * sc * sc + d;
  62. for (i = 0, p = evec + n * k; i < n; ++i, ++p) {
  63. h = p[0].re;
  64. p[0].re = cc * h + sc * p[n].re;
  65. p[n].re = cc * p[n].re - sc * h;
  66. h = p[0].im;
  67. p[0].im = cc * h + sc * p[n].im;
  68. p[n].im = cc * p[n].im - sc * h;
  69. }
  70. }
  71. ev[k] = ev[k] * cc - y;
  72. dp[k - 1] = ev[k] * sc;
  73. ev[k] = ev[k] * cc + d;
  74. }
  75. }