code 31363;
procedure LUPZERORTPOL (N, M, B, C, ZER, EM);
value N, M; integer N, M; array B, C, ZER, EM;
begin
procedure RATQR(N,M,POSDEF,DLAM,EPS)TRANS:(D,B2);
value N,M,POSDEF,DLAM,EPS;
integer N,M;
boolean POSDEF;
real DLAM,EPS;
array D,B2;
comment QR ALGORITHM FOR THE COMPUTATION OF THE LOWEST EIGENVALUES
OF A SYMMETRIC TRIDIAGONAL MATRIX. A RATIONAL VARIANT OF THE
QR TRANSFORMATION IS USED, CONSISTING OF TWO SUCCESSIVE QD STEPS
PER ITERATION.
A SHIFT OF THE SPECTRUM AFTER EACH ITERATION GIVES AN ACCELERATED
RATE OF CONVERGENCE. A NEWTON CORRECTION,DERIVED FROM THE
CHARACTERISTIC POLYNOMIAL,IS USED AS SHIFT.
RATQR IS IMPLEMENTED BY REINSCH AND BAUER, SEE WILKINSON AND REINSCH
,1971, CONTR. II-6.
FORMATS: D,B2[1:N];
begin
integer I,J,K,T; real DELTA,E,EP,ERR,P,Q,QP,R,S,TOT;
comment LOWER BOUND FOR EIGENVALUES FROM GERSHGORIN, INITIAL SHIFT;
B2[1]:= ERR:= Q:= S:= 0; TOT:= D[1];
for I:= N step -1 until 1 do
begin
P:= Q; Q:= SQRT(B2[I]); E:= D[I]-P-Q;
if E < TOT then TOT:= E
end I;
if POSDEF & TOT < 0 then TOT:= 0 else
for I:= 1 step 1 until N do D[I]:= D[I]-TOT;
T:= 0;
for K:= 1 step 1 until M do
begin
NEXT QR TRANSFORMATION: T:= T + 1;
TOT:= TOT + S; DELTA:= D[N]-S; I:= N;
E:= ABS(EPS*TOT); if DLAM < E then DLAM:= E;
if DELTA < = DLAM then goto CONVERGENCE;
E:= B2[N]/DELTA; QP:= DELTA+E; P:= 1;
for I:= N-1 step -1 until K do
begin
Q:= D[I]-S-E; R:= Q/QP; P:= P*R+1;
EP:= E*R; D[I+1]:= QP+EP; DELTA:= Q-EP;
if DELTA < = DLAM then goto CONVERGENCE;
E:= B2[I]/Q;QP:= DELTA+E; B2[I+1]:= QP*EP
end I;
D[K]:= QP; S:= QP/P;
if TOT+S > TOT then goto NEXT QR TRANSFORMATION;
comment IRREGULAR END OF ITERATION,
DEFLATE MINIMUM DIAGONAL ELEMENT;
S:= 0; I:= K; DELTA:= QP;
for J:= K+1 step 1 until N do
if D[J] < DELTA then
begin I:= J; DELTA:= D[J] end;
CONVERGENCE:
if I < N then B2[I+1]:= B2[I]*E/QP;
for J:= I-1 step -1 until K do
begin D[J+1]:= D[J]-S; B2[J+1]:= B2[J] end J;
D[K]:= TOT; B2[K]:= ERR:= ERR+ABS(DELTA)
end K;
EM[5]:=T;EM[3]:=INFNRMVEC(1,M,T,B2);
end RATQR;
procedure DUPCEV (L, U, SHIFT, A, B);
value L,U,SHIFT;integer L,U,SHIFT;array A,B;
for U:=U step -1 until L do A[U]:=B[U+SHIFT];
integer I;real NRM;
NRM:=ABS(B[0]);
for I:=1step 1until N-2do if C[I]+ABS(B[I])>NRM"THEN"
NRM:=C[I]+ABS(B[I]);
if N>1then NRM:=if NRM+1>=C[N-1]+ABS(B[N-1])then NRM+1else
C[N-1]+ABS(B[N-1]);
EM[1]:=NRM;
DUPCEV(1,N,-1,B,B);
DUPCEV(2,N,-1,C,C);
RATQR (N, M, EM[6] = 1, EM[2], EM[0], B, C);
DUPVEC (1, M, 0, ZER, B)
end LUPZERORTPOL;
eop