code 34373;
    integer procedure QRICOM(A1, A2, B, N, EM, VAL1, VAL2, VEC1,
    VEC2); value N; integer N;
    array A1, A2, B, EM, VAL1, VAL2, VEC1, VEC2;
    begin integer M, NM1, I, I1, J, Q, Q1, MAX, COUNT;
        real R, Z1, Z2, DD1, DD2, CC, P1, P2, T1, T2, DELTA1,
        DELTA2, MV1, MV2, H, H1, H2, G1, G2, K1, K2, HC,
        AIJ12, AIJ22, A1NN, A2NN, AIJ1, AIJ2, AI1I, KAPPA,
        NUI, MUI1, MUI2, MUIM11, MUIM12, NUIM1, TOL, MACHTOL;
        array TF1, TF2[1:N];
        TOL:= EM[1] * EM[2]; MACHTOL:= EM[0] * EM[1];
        MAX:= EM[4]; COUNT:= 0; R:= 0; M:= N;
        if N > 1 then HC:= B[N - 1];
        for I:= 1 step 1 until N do 
        begin VEC1[I,I]:= 1; VEC2[I,I]:= 0;
            for J:= I + 1 step 1 until N do VEC1[I,J]:=
            VEC1[J,I]:= VEC2[I,J]:= VEC2[J,I]:= 0
        end;
    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];
            P1:= (A1[NM1,NM1] - DD1) * .5;
            P2:= (A2[NM1,NM1] - DD2) * .5;
            COMKWD(P1, P2, CC * A1[NM1,N], CC * A2[NM1,N], G1,
            G2, K1, K2); if Q = NM1 then 
            begin A1[N,N]:= VAL1[N]:= G1 + DD1;
                A2[N,N]:= VAL2[N]:= G2 + DD2;
                A1[Q,Q]:= VAL1[Q]:= K1 + DD1;
                A2[Q,Q]:= VAL2[Q]:= K2 + DD2;
                KAPPA:= SQRT(K1 ** 2 + K2 ** 2 + CC ** 2);
                NUI:= CC / KAPPA; MUI1:= K1 / KAPPA;
                MUI2:= K2 / KAPPA; AIJ1:= A1[Q,N];
                AIJ2:= A2[Q,N]; H1:= MUI1 ** 2 - MUI2 ** 2;
                H2:= 2 * MUI1 * MUI2; H:= - NUI * 2;
                A1[Q,N]:= H * (P1 * MUI1 + P2 * MUI2) - NUI *
                NUI * CC + AIJ1 * H1 + AIJ2 * H2;
                A2[Q,N]:= H * (P2 * MUI1 - P1 * MUI2) + AIJ2 *
                H1 - AIJ1 * H2;
                ROTCOMROW(Q + 2, M, Q, N, A1, A2, MUI1, MUI2,
                NUI);
                ROTCOMCOL(1, Q - 1, Q, N, A1, A2, MUI1, -
                MUI2, - NUI);
                ROTCOMCOL(1, M, Q, N, VEC1, VEC2, MUI1, -
                MUI2, - NUI); N:= N - 2;
                if N > 1 then HC:= B[N - 1]; B[Q]:= 0
            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; 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, M, Q, Q1, A1, A2, MUI1, MUI2,
                NUI);
                ROTCOMCOL(1, Q, Q, Q1, A1, A2, MUI1, - MUI2, -
                NUI); A1[Q,Q]:= A1[Q,Q] + Z1;
                A2[Q,Q]:= A2[Q,Q] + Z2;
                ROTCOMCOL(1, M, Q, Q1, VEC1, VEC2, MUI1, -
                MUI2, - NUI);
                for I:= Q1 step 1 until NM1 do 
                begin I1:= I + 1; 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, M, I, I1, A1, A2, MUI1,
                    MUI2, NUI); A1[I,I]:= MUIM11 * KAPPA;
                    A2[I,I]:= - MUIM12 * KAPPA;
                    B[I - 1]:= NUIM1 * KAPPA;
                    ROTCOMCOL(1, I, I, I1, A1, A2, MUI1, -
                    MUI2, - NUI); A1[I,I]:= A1[I,I] + Z1;
                    A2[I,I]:= A2[I,I] + Z2;
                    ROTCOMCOL(1, M, I, I1, VEC1, VEC2, MUI1, -
                    MUI2, - NUI);
                end;
                AIJ1:= A1[N,N]; AIJ2:= A2[N,N]; AIJ12:= AIJ1 ** 2;
                AIJ22:= AIJ2 ** 2; KAPPA:= SQRT(AIJ12 + AIJ22);
                if (if KAPPA < TOL then true else AIJ22 <=
                EM[0] * AIJ12) 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(1, NM1, N, A1, A2, MUI1, MUI2);
                    COMCOLCST(1, NM1, N, VEC1, VEC2, MUI1,
                    MUI2);
                    COMROWCST(N + 1, M, N, A1, A2, MUI1, -
                    MUI2);
                    COMCOLCST(N, M, N, VEC1, VEC2, 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;
        for J:= M step - 1 until 2 do 
        begin TF1[J]:= 1; TF2[J]:= 0; T1:= A1[J,J]; T2:= A2[J,J];
            for I:= J - 1 step - 1 until 1 do 
            begin DELTA1:= T1 - A1[I,I]; DELTA2:= T2 - A2[I,I];
                COMMATVEC(I + 1, J, I, A1, A2, TF1, TF2, MV1,
                MV2);
                if ABS(DELTA1) < MACHTOL and ABS(DELTA2) <
                MACHTOL then 
                begin TF1[I]:= MV1 / MACHTOL;
                    TF2[I]:= MV2 / MACHTOL
                end 
                else COMDIV(MV1, MV2, DELTA1, DELTA2, TF1[I],
                TF2[I]);
            end;
            for I:= 1 step 1 until M do COMMATVEC(1, J, I,
            VEC1, VEC2, TF1, TF2, VEC1[I,J], VEC2[I,J]);
        end;
    OUT: EM[3]:= R; EM[5]:= COUNT; QRICOM:= N;
    end QRICOM;
        eop