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