code 34292;
procedure SOLSYM2(A,N,B,P,DETAUX);
value N;integer N;
array A,B,DETAUX;integer array P;
begin integer I,II,J,K,IP1,PI,PII,DUMMY;
    real DET,TEMP,SAVE;
    I:=1;
    for DUMMY:=0 while I<N do 
    begin IP1:=I+1;PI:=P[I];SAVE:=B[PI];
      if P[IP1]>0 then 
      begin B[PI]:=B[I];B[I]:=SAVE/A[I,I];
          ELMVECROW(IP1,N,I,B,A,SAVE);I:=IP1
      end 
      else 
      begin TEMP:=B[I];B[PI]:=B[IP1];DET:=DETAUX[IP1];
          B[I]:=(TEMP*A[IP1,IP1]-SAVE*A[I,IP1])/DET;
          B[IP1]:=(SAVE*A[I,I]-TEMP*A[I,IP1])/DET;
          ELMVECROW(I+2,N,I,B,A,TEMP);ELMVECROW(I+2,N,IP1,B,A,SAVE);
          I:=I+2
      end 
    end WHILE I;
    if I=N then begin B[I]:=B[I]/A[I,I];I:=N-1 end 
      else I:=N-2;
    for DUMMY:=0 while I>0 do 
    begin if P[I]=0 then II:=I-1 else II:=I;
      for K:=II step 1 until I do 
      begin SAVE:=B[K];SAVE:=SAVE+MATVEC(I+1,N,K,A,B);
         B[K]:=SAVE
      end;
      PII:=P[II];B[I]:=B[PII];B[PII]:=SAVE;I:=II-1
    end WHILE I
end SOLSYM2;
        eop