code 34231;
    procedure GSSELM(A, N, AUX, RI, CI); value N; integer N;
    array A, AUX;
    integer array RI, CI;
    begin integer I, J, P, Q, R, R1, JPIV, RANK, SIGNDET;
        real CRIT, PIVOT, RGROW, MAX, AID, MAX1, EPS;
        boolean PARTIAL;
        AUX[5]:= RGROW:= ABSMAXMAT(1, N, 1, N, I, J, A);
        CRIT:= N * RGROW * AUX[4]; EPS:= RGROW * AUX[2]; MAX:= 0;
        RANK:= N; SIGNDET:= 1; PARTIAL:= RGROW ^= 0;
        for Q:= 1 step 1 until N do if Q ^= J then 
        begin AID:= ABS(A[I,Q]);
            if AID > MAX then MAX:= AID
        end;
        RGROW:= RGROW + MAX;
        for R:= 1 step 1 until N do 
        begin R1:= R + 1; if I ^= R then 
            begin SIGNDET:= - SIGNDET; ICHROW(1, N, R, I, A) end;
            if J ^= R then 
            begin SIGNDET:= - SIGNDET; ICHCOL(1, N, R, J, A) end;
            RI[R]:= I; CI[R]:= J; PIVOT:= A[R,R];
            if PIVOT < 0 then SIGNDET:= - SIGNDET;
            if PARTIAL then 
            begin MAX:= MAX1:= 0; J:= R1;
                ROWCST(R1, N, R, A, 1 / PIVOT);
                for P:= R1 step 1 until N do 
                begin ELMROW(R1, N, P, R, A, A, - A[P,R]);
                    AID:= ABS(A[P,R1]); if MAX < AID then 
                    begin MAX:= AID; I:= P end;
                 end;
                for Q:= R1 + 1 step 1 until N do 
                begin AID:= ABS(A[I,Q]);
                    if MAX1 < AID then MAX1:= AID
                end;
                AID:= RGROW; RGROW:= RGROW + MAX1;
                if RGROW > CRIT or MAX < EPS then 
                begin PARTIAL:= false; RGROW:= AID;
                    MAX:= ABSMAXMAT(R1, N, R1, N, I, J, A)
                end 
            end PARTIAL PIVOTINGSTEP
            else 
            begin if MAX <= EPS then 
                begin RANK:= R - 1;
                    if PIVOT < 0 then SIGNDET:= - SIGNDET;goto OUT
                end;
                MAX:= - 1;
                ROWCST(R1, N, R, A, 1 / PIVOT);
                for P:= R1 step 1 until N do 
                begin JPIV:= MAXELMROW(R1, N, P, R, A, A, - A[P,R]);
                    AID:= ABS(A[P,JPIV]); if MAX < AID then 
                    begin MAX:= AID; I:= P; J:= JPIV end 
                end;
                if RGROW < MAX then RGROW:= MAX
            end COMPLETE PIVOTINGSTEP
        end ELIMINATIONSTEP;
    OUT: AUX[1]:= SIGNDET; AUX[3]:= RANK; AUX[7]:= RGROW
    end GSSELM

        eop