Computes all the eigenvalues of the symmetric positive definite tridiagonal matrix associated with the qd array z to high relative accuracy. Used by ?bdsqr and ?stegr.
call slasq2( n, z, info )
call dlasq2( n, z, info )
The routine ?lasq2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix associated with the qd array z to high relative accuracy, in the absence of denormalization, underflow and overflow.
To see the relation of z to the tridiagonal matrix, let L be a unit lower bidiagonal matrix with subdiagonals z(2,4,6,,..) and let U be an upper bidiagonal matrix with 1's above and diagonal z(1,3,5,,..). The tridiagonal is LU or, if you prefer, the symmetric tridiagonal to which it is similar.
INTEGER. The number of rows and columns in the matrix. n ≥ 0.
REAL for slasq2
DOUBLE PRECISION for dlasq2.
Array, DIMENSION (4 * n).
On entry, z holds the qd array.
On exit, entries 1 to n hold the eigenvalues in decreasing order, z(2n+1) holds the trace, and z(2n+2) holds the sum of the eigenvalues. If n > 2, then z(2n+3) holds the iteration count, z(2n+4) holds ndivs/nin2, and z(2n+5) holds the percentage of shifts that failed.
INTEGER.
= 0: successful exit;
< 0: if the i-th argument is a scalar and had an illegal value, then info = -i, if the i-th argument is an array and the j-entry had an illegal value, then info = -(i*100+ j);
> 0: the algorithm failed:
= 1, a split was marked by a positive value in e;
= 2, current block of z not diagonalized after 30*n iterations (in inner while loop);
= 3, termination criterion of outer while loop not met (program created more than n unreduced blocks).
The routine ?lasq2 defines a logical variable, ieee, which is .TRUE. on machines which follow ieee-754 floating-point standard in their handling of infinities and NaNs, and .FALSE. otherwise. This variable is passed to ?lasq3.