
FUNCTION DECOMPOSE ( VAR MATRIX		: REAL_MATRIX;
		     VAR PVT_VECTOR	: INT_VECTOR;
		     N			: INTEGER	) : BOOLEAN;

{ BASED ON SUBROUTINE DECOMP BY CLEVE B. MOLER,DEPT. OF MATHEMATICS,
  THE UNIVERSITY OF MICHIGAN,ANN ARBOR,MI 48104.

  REFERENCES : 1 : ALGORITHM 423 OF COLLECTED ALG. OF CACM.
	       2 : MOLER,C.B. Matrix Computations with Fortran and paging.
                   Comm.ACM 15 (Apr.1972),268-270.
               3 : FORSYTHE,G.E.;MALCOLM,M.A.;and MOLER,C.B. Computer 
		   Methods for Mathematical Computations.
			Prentice-Hall,Inc. Englewood Cliffs,N.J.
					1977

  TRANSLATED TO PASCAL/Z BY G.M.ACLAND,UNIV. OF PENNSYLVANIA.               }

VAR	INDEX1,INDEX2,INDEX3,PIVOT,FIRST	: INTEGER;
	BIGGEST,TEMP				: REAL;

BEGIN
 DECOMPOSE := SUCCESSFUL;
 FOR INDEX1 := 1 TO (N-1) DO BEGIN
  BIGGEST := 0.0;
  FOR INDEX2 := INDEX1 TO N DO BEGIN
   IF (ABS(MATRIX[INDEX2,INDEX1]) > BIGGEST) THEN BEGIN
    PIVOT   := INDEX2;
    BIGGEST := ABS(MATRIX[INDEX2,INDEX1]);
    END; { OF : IF (ABS(MATRIX[.... }
   END; { OF : INDEX2 LOOP }
   IF BIGGEST = 0.0 THEN DECOMPOSE := NOT SUCCESSFUL
    ELSE BEGIN
    PVT_VECTOR[INDEX1]  := PIVOT;
    TEMP		:= MATRIX[PIVOT,INDEX1];
    IF PIVOT <> INDEX1 THEN BEGIN
     MATRIX[PIVOT,INDEX1]  := MATRIX[INDEX1,INDEX1];
     MATRIX[INDEX1,INDEX1] := TEMP;
     TEMP		   := 1.0/TEMP;
     END; { OF : IF PIVOT <> ...   }
    FIRST := INDEX1 + 1;
    FOR INDEX2 := FIRST TO N DO BEGIN
     MATRIX[INDEX2,INDEX1] := -1.0 * MATRIX[INDEX2,INDEX1] * TEMP;
     END; { OF INDEX2 LOOP }
    FOR INDEX2 := FIRST TO N DO BEGIN
     TEMP := MATRIX[PIVOT,INDEX2];
     IF (PIVOT <> INDEX1) THEN BEGIN
      MATRIX[PIVOT,INDEX2]  := MATRIX[INDEX1,INDEX2];
      MATRIX[INDEX1,INDEX2] := TEMP;
      END; { OF : IF PIVOT... }
     IF (TEMP <> 0) THEN BEGIN
      FOR INDEX3 := FIRST TO N DO BEGIN
       MATRIX[INDEX3,INDEX2] := MATRIX[INDEX3,INDEX2] + 
				(MATRIX[INDEX3,INDEX1] * TEMP);
       END; { OF : FOR INDEX3 LOOP }
      END; { OF : IF TEMP <> 0 ... }
     END; { OF : INDEX2 LOOP }
    END; { OF : IF BIGGEST..ELSE.. }
   IF MATRIX[N,N] = 0 THEN DECOMPOSE := NOT SUCCESSFUL;
  END; { OF : INDEX1 LOOP }
END; { OF : FUNCTION DECOMPOSE }


