#include #include #include "nr.h" using namespace std; void NR::hqr(Mat_IO_DP &a, Vec_O_CPLX_DP &wri) { int nn,m,l,k,j,its,i,mmin; DP z,y,x,w,v,u,t,s,r,q,p,anorm; int n=a.nrows(); anorm=0.0; for (i=0;i= 0) { its=0; do { for (l=nn;l>0;l--) { s=fabs(a[l-1][l-1])+fabs(a[l][l]); if (s == 0.0) s=anorm; if (fabs(a[l][l-1]) + s == s) { a[l][l-1] = 0.0; break; } } x=a[nn][nn]; if (l == nn) { wri[nn--]=x+t; } else { y=a[nn-1][nn-1]; w=a[nn][nn-1]*a[nn-1][nn]; if (l == nn-1) { p=0.5*(y-x); q=p*p+w; z=sqrt(fabs(q)); x += t; if (q >= 0.0) { z=p+SIGN(z,p); wri[nn-1]=wri[nn]=x+z; if (z != 0.0) wri[nn]=x-w/z; } else { wri[nn]=complex(x+p,z); wri[nn-1]=conj(wri[nn]); } nn -= 2; } else { if (its == 30) nrerror("Too many iterations in hqr"); if (its == 10 || its == 20) { t += x; for (i=0;i=l;m--) { z=a[m][m]; r=x-z; s=y-z; p=(r*s-w)/a[m+1][m]+a[m][m+1]; q=a[m+1][m+1]-z-r-s; r=a[m+2][m+1]; s=fabs(p)+fabs(q)+fabs(r); p /= s; q /= s; r /= s; if (m == l) break; u=fabs(a[m][m-1])*(fabs(q)+fabs(r)); v=fabs(p)*(fabs(a[m-1][m-1])+fabs(z)+fabs(a[m+1][m+1])); if (u+v == v) break; } for (i=m;i