code 34132; procedure LSQDGLINV(A, M, AID, CI, DIAG); value M; integer M; array A, AID, DIAG; integer array CI; begin integer J, K, CIK; real W; for K:= 1 step 1 until M do begin DIAG[K]:= 1 / AID[K]; for J:= K + 1 step 1 until M do DIAG[J]:= - TAMVEC(K, J - 1, J, A, DIAG) / AID[J]; DIAG[K]:= VECVEC(K, M, 0, DIAG, DIAG) end; for K:= M step - 1 until 1 do begin CIK:= CI[K]; if CIK ^= K then begin W:= DIAG[K]; DIAG[K]:= DIAG[CIK]; DIAG[CIK]:= W end end end LSQDGLINV; eop