code 34372;
integer procedure VALQRICOM(A1, A2, B, N, EM, VAL1, VAL2);
value N; integer N; array A1, A2, B, EM, VAL1, VAL2;
begin integer M, NM1, I, I1, Q, Q1, MAX, COUNT;
real R, Z1, Z2, DD1, DD2, CC, G1, G2, K1, K2, HC, A1NN,
A2NN, AIJ1, AIJ2, AI1I, KAPPA, NUI, MUI1, MUI2,
MUIM11, MUIM12, NUIM1, TOL;
TOL:= EM[1] * EM[2]; MAX:= EM[4]; COUNT:= 0; R:= 0;
M:= N; if N > 1 then HC:= B[N - 1];
IN: NM1:= N - 1;
for I:= N, I - 1 while (if I >= 1 then ABS(B[I]) > TOL
else false ) do Q:= I; if Q > 1 then
begin if ABS(B[Q - 1]) > R then R:= ABS(B[Q - 1]) end;
if Q = N then
begin VAL1[N]:= A1[N,N]; VAL2[N]:= A2[N,N]; N:= NM1;
if N > 1 then HC:= B[N - 1];
end
else
begin DD1:= A1[N,N]; DD2:= A2[N,N]; CC:= B[NM1];
COMKWD((A1[NM1,NM1] - DD1) / 2, (A2[NM1,NM1] - DD2)
/ 2, CC * A1[NM1,N], CC * A2[NM1,N], G1, G2, K1,
K2); if Q = NM1 then
begin VAL1[NM1]:= G1 + DD1; VAL2[NM1]:= G2 + DD2;
VAL1[N]:= K1 + DD1; VAL2[N]:= K2 + DD2;
N:= N - 2; if N > 1 then HC:= B[N - 1];
end
else
begin COUNT:= COUNT + 1;
if COUNT > MAX then goto OUT; Z1:= K1 + DD1;
Z2:= K2 + DD2;
if ABS(CC) > ABS(HC) then Z1:= Z1 + ABS(CC);
HC:= CC / 2; I:= Q1:= Q + 1;
AIJ1:= A1[Q,Q] - Z1; AIJ2:= A2[Q,Q] - Z2;
AI1I:= B[Q];
KAPPA:= SQRT(AIJ1 ** 2 + AIJ2 ** 2 + AI1I ** 2);
MUI1:= AIJ1 / KAPPA; MUI2:= AIJ2 / KAPPA;
NUI:= AI1I / KAPPA; A1[Q,Q]:= KAPPA;
A2[Q,Q]:= 0; A1[Q1,Q1]:= A1[Q1,Q1] - Z1;
A2[Q1,Q1]:= A2[Q1,Q1] - Z2;
ROTCOMROW(Q1, N, Q, Q1, A1, A2, MUI1, MUI2,
NUI);
ROTCOMCOL(Q, Q, Q, Q1, A1, A2, MUI1, - MUI2, -
NUI); A1[Q,Q]:= A1[Q,Q] + Z1;
A2[Q,Q]:= A2[Q,Q] + Z2;
for I1:= Q1 + 1 step 1 until N do
begin AIJ1:= A1[I,I]; AIJ2:= A2[I,I];
AI1I:= B[I];
KAPPA:= SQRT(AIJ1 ** 2 + AIJ2 ** 2 + AI1I **
2); MUIM11:= MUI1; MUIM12:= MUI2;
NUIM1:= NUI; MUI1:= AIJ1 / KAPPA;
MUI2:= AIJ2 / KAPPA; NUI:= AI1I / KAPPA;
A1[I1,I1]:= A1[I1,I1] - Z1;
A2[I1,I1]:= A2[I1,I1] - Z2;
ROTCOMROW(I1, N, I, I1, A1, A2, MUI1,
MUI2, NUI); A1[I,I]:= MUIM11 * KAPPA;
A2[I,I]:= - MUIM12 * KAPPA;
B[I - 1]:= NUIM1 * KAPPA;
ROTCOMCOL(Q, I, I, I1, A1, A2, MUI1, -
MUI2, - NUI); A1[I,I]:= A1[I,I] + Z1;
A2[I,I]:= A2[I,I] + Z2; I:= I1;
end;
AIJ1:= A1[N,N]; AIJ2:= A2[N,N];
KAPPA:= SQRT(AIJ1 ** 2 + AIJ2 ** 2);
if (if KAPPA < TOL then true else AIJ2 ** 2
<= EM[0] * AIJ1 ** 2) then
begin B[NM1]:= NUI * AIJ1;
A1[N,N]:= AIJ1 * MUI1 + Z1;
A2[N,N]:= - AIJ1 * MUI2 + Z2
end
else
begin B[NM1]:= NUI * KAPPA; A1NN:= MUI1 * KAPPA;
A2NN:= - MUI2 * KAPPA; MUI1:= AIJ1 / KAPPA;
MUI2:= AIJ2 / KAPPA;
COMCOLCST(Q, NM1, N, A1, A2, MUI1, MUI2);
A1[N,N]:= MUI1 * A1NN - MUI2 * A2NN + Z1;
A2[N,N]:= MUI1 * A2NN + MUI2 * A1NN + Z2;
end;
end
end;
if N > 0 then goto IN;
OUT: EM[3]:= R; EM[5]:= COUNT; VALQRICOM:= N;
end VALQRICOM;
eop