code 34322;
procedure DECSOLBND(A, N, LW, RW, AUX, B); value N, LW, RW;
integer N, LW, RW; array A, B, AUX;
begin integer I, J, K, KK, KK1, PK, IK, LW1, F, Q, W, W1, W2,IW,
        NRW, SHIFT, SDET;
        real R, S, EPS, MIN; array M[0:LW], V[1:N];

        F:= LW; SDET:= 1; W1:= LW + RW; W:= W1 + 1; W2:= W - 2; IW:= 0;
        NRW:= N - RW; LW1:= LW + 1; Q:= LW - 1;
        for I:= 2 step 1 until LW do 
        begin Q:= Q - 1; IW:= IW + W1;
            for J:= IW - Q step 1 until IW do A[J]:= 0
        end;
        IW:= - W2; Q:= - LW;
        for I:= 1 step 1 until N do 
        begin IW:= IW + W; if I <= LW1 then IW:= IW - 1;
            Q:= Q + W; if I > NRW then Q:= Q - 1;
            V[I]:= SQRT(VECVEC(IW, Q, 0, A, A))
        end;
        EPS:= AUX[2]; MIN:= 1; KK:= - W1;
        if F > NRW then W2:= W2 + NRW - F;
        for K:= 1 step 1 until N do 
        begin if F < N then F:= F + 1; IK:= KK:= KK + W;
            S:= ABS(A[KK]) / V[K]; PK:= K; KK1:= KK + 1;
            for I:= K + 1 step 1 until F do 
            begin IK:= IK + W1; M[I - K]:= R:= A[IK]; A[IK]:= 0;
                R:= ABS(R) / V[I]; if R > S then 
                begin S:= R; PK:= I end 
            end;
            if S < MIN then MIN:= S; if S < EPS then 
            begin AUX[3]:= K - 1; AUX[5]:= S; "GO TO" END end;
            if K + W2 >= N then W2:= W2 - 1; if PK ^= K then 
            begin V[PK]:= V[K];
                PK:= PK - K; ICHVEC(KK1, KK1 + W2, PK * W1, A);
                SDET:= - SDET; R:= B[K]; B[K]:= B[PK + K];
                B[PK + K]:= R; R:= M[PK]; M[PK]:= A[KK]; A[KK]:= R
            end 
            else R:= A[KK]; IW:= KK1; LW1:= F - K;
            if R < 0 then SDET:= - SDET;
            for I:= 1 step 1 until LW1 do 
            begin M[I]:= S:= M[I] / R; IW:= IW + W1;
                ELMVEC(IW, IW + W2, KK1 - IW, A, A, - S);
                B[K + I]:= B[K + I] - B[K] * S
            end 
        end;
        AUX[3]:= N; AUX[5]:= MIN;
        KK:= (N + 1) * W - W1; W2:= - 1; SHIFT:= N * W1;
        for K:= N step - 1 until 1 do 
        begin KK:= KK - W; SHIFT:= SHIFT - W1;
            if W2 < W1 then W2:= W2 + 1;
            B[K]:= (B[K] - VECVEC(K + 1, K + W2, SHIFT, B, A)) / A[KK]
        end;
    END: AUX[1]:= SDET
    end DECSOLBND;
        eop