code 34291;
procedure DECSYM2(A,N,TOL,AUX,P,DETAUX);
value N;integer N;real TOL;
array A,DETAUX;integer array P,AUX;
begin integer I,J,K,M,IP1,IP2,DUMMY;boolean ONEBYONE,SYM;
real DET,S,T,ALPHA,LAMBDA,SIGMA,AII,AIP1,AIP1I;
AUX[3]:=AUX[4]:=0;SYM:=true;I:=0;
for DUMMY:=0 while SYM and (I<N) do
begin I:=I+1;J:=I;
for M:=0 while SYM and (J<N) do
begin J:=J+1;SYM:=SYM and (A[I,J]=A[J,I]) end;
end;
if SYM then AUX[2]:=1
else begin AUX[2]:=0;goto ENDDEC end;
ALPHA:=(1+SQRT(17))/8;P[N]:=N;I:=1;
for DUMMY:=0 while I<N do
begin IP1:=I+1;IP2:=I+2;AII:=ABS(A[I,I]);P[I]:=I;
LAMBDA:=ABS(A[I,IP1]);J:=IP1;
for M:=IP2 step 1 until N do
if ABS(A[I,M])>LAMBDA then
begin J:=M;LAMBDA:=ABS(A[I,M]) end;
T:=ALPHA*LAMBDA;ONEBYONE:=true;
if AII<T then
begin SIGMA:=LAMBDA;
for M:=IP1 step 1 until J-1 do
if ABS(A[M,J])>SIGMA then SIGMA:=ABS(A[M,J]);
for M:=J+1 step 1 until N do
if ABS(A[J,M])>SIGMA then SIGMA:=ABS(A[J,M]);
if SIGMA*AII<LAMBDA then
begin if ALPHA*SIGMA<ABS(A[J,J]) then
begin ICHROW(J+1,N,I,J,A);ICHROWCOL(IP1,J-1,I,J,A);
T:=A[I,I];A[I,I]:=A[J,J];A[J,J]:=T;P[I]:=J
end
else
begin if J>IP1 then
begin ICHROW(J+1,N,IP1,J,A);ICHROWCOL(IP2,J-1,IP1,J,A);
T:=A[I,I];A[I,I]:=A[J,J];A[J,J]:=T;
T:=A[I,J];A[I,J]:=A[I,IP1];A[I,IP1]:=T
end;
DET:=A[I,I]*A[IP1,IP1]-A[I,IP1]**2;AIP1I:=A[I,IP1]/DET;
AII:=A[I,I]/DET;AIP1:=A[IP1,IP1]/DET;P[I]:=J;P[IP1]:=0;
DETAUX[I]:=1;DETAUX[IP1]:=DET;
for J:=IP2 step 1 until N do
begin S:=AIP1I*A[IP1,J]-AIP1*A[I,J];
T:=AIP1I*A[I,J]-AII*A[IP1,J];ELMROW(J,N,J,I,A,A,S);
ELMROW(J,N,J,IP1,A,A,T);A[I,J]:=S;A[IP1,J]:=T
end;
AUX[3]:=AUX[3]+1;AUX[4]:=AUX[4]+1;I:=IP2;
ONEBYONE:=false
end
end
end;
if ONEBYONE then
begin if TOL<ABS(A[I,I]) then
begin AII:=A[I,I];DETAUX[I]:=A[I,I];
if AII>0 then AUX[3]:=AUX[3]+1 else AUX[4]:=AUX[4]+1;
for J:=IP1 step 1 until N do
begin S:=-A[I,J]/AII;ELMROW(J,N,J,I,A,A,S);A[I,J]:=S end
end;I:=IP1
end
end WHILE I;
if I=N then
begin if TOL<ABS(A[N,N]) then
begin if A[N,N]>0 then AUX[3]:=AUX[3]+1
else AUX[4]:=AUX[4]+1
end;DETAUX[N]:=A[N,N]
end;
ENDDEC:
AUX[5]:=N-AUX[3]-AUX[4]
end DECSYM2;
eop