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