Mul:
PUBLIC
PROC [left, rite: Matrix, out: Matrix ¬
NIL]
RETURNS [Matrix] ~ {
FOR i: INT IN [0..3] DO
FOR j: INT IN [0..3] DO
ret[i][j] ← left[i][0]*rite[0][j]+left[i][1]*rite[1][j]+left[i][2]*rite[2][j]+left[i][3]*rite[3][j];
ENDLOOP;
ENDLOOP;
ret: MatrixRep;
IF left = NIL OR rite = NIL THEN RETURN[out];
ret[0][0] ¬ left[0][0]*rite[0][0]+left[0][1]*rite[1][0]+left[0][2]*rite[2][0]+left[0][3]*rite[3][0];
ret[0][1] ¬ left[0][0]*rite[0][1]+left[0][1]*rite[1][1]+left[0][2]*rite[2][1]+left[0][3]*rite[3][1];
ret[0][2] ¬ left[0][0]*rite[0][2]+left[0][1]*rite[1][2]+left[0][2]*rite[2][2]+left[0][3]*rite[3][2];
ret[0][3] ¬ left[0][0]*rite[0][3]+left[0][1]*rite[1][3]+left[0][2]*rite[2][3]+left[0][3]*rite[3][3];
ret[1][0] ¬ left[1][0]*rite[0][0]+left[1][1]*rite[1][0]+left[1][2]*rite[2][0]+left[1][3]*rite[3][0];
ret[1][1] ¬ left[1][0]*rite[0][1]+left[1][1]*rite[1][1]+left[1][2]*rite[2][1]+left[1][3]*rite[3][1];
ret[1][2] ¬ left[1][0]*rite[0][2]+left[1][1]*rite[1][2]+left[1][2]*rite[2][2]+left[1][3]*rite[3][2];
ret[1][3] ¬ left[1][0]*rite[0][3]+left[1][1]*rite[1][3]+left[1][2]*rite[2][3]+left[1][3]*rite[3][3];
ret[2][0] ¬ left[2][0]*rite[0][0]+left[2][1]*rite[1][0]+left[2][2]*rite[2][0]+left[2][3]*rite[3][0];
ret[2][1] ¬ left[2][0]*rite[0][1]+left[2][1]*rite[1][1]+left[2][2]*rite[2][1]+left[2][3]*rite[3][1];
ret[2][2] ¬ left[2][0]*rite[0][2]+left[2][1]*rite[1][2]+left[2][2]*rite[2][2]+left[2][3]*rite[3][2];
ret[2][3] ¬ left[2][0]*rite[0][3]+left[2][1]*rite[1][3]+left[2][2]*rite[2][3]+left[2][3]*rite[3][3];
ret[3][0] ¬ left[3][0]*rite[0][0]+left[3][1]*rite[1][0]+left[3][2]*rite[2][0]+left[3][3]*rite[3][0];
ret[3][1] ¬ left[3][0]*rite[0][1]+left[3][1]*rite[1][1]+left[3][2]*rite[2][1]+left[3][3]*rite[3][1];
ret[3][2] ¬ left[3][0]*rite[0][2]+left[3][1]*rite[1][2]+left[3][2]*rite[2][2]+left[3][3]*rite[3][2];
ret[3][3] ¬ left[3][0]*rite[0][3]+left[3][1]*rite[1][3]+left[3][2]*rite[2][3]+left[3][3]*rite[3][3];
IF out = NIL THEN out ¬ NEW[MatrixRep];
out ¬ ret;
RETURN[out];
};
Cofactors:
PUBLIC
PROC [in: Matrix, out: Matrix ¬
NIL]
RETURNS [Matrix] ~ {
m: Matrix ¬ in;
IF out = NIL THEN out ¬ NEW[MatrixRep];
out[0][0] ¬ Det3x3[[[m[1][1],m[1][2],m[1][3]],[m[2][1],m[2][2],m[2][3]],[m[3][1],m[3][2],m[3][3]]]];
out[0][1] ¬ -Det3x3[[[m[1][0],m[1][2],m[1][3]],[m[2][0],m[2][2],m[2][3]],[m[3][0],m[3][2],m[3][3]]]];
out[0][2] ¬ Det3x3[[[m[1][0],m[1][1],m[1][3]],[m[2][0],m[2][1],m[2][3]],[m[3][0],m[3][1],m[3][3]]]];
out[0][3] ¬ -Det3x3[[[m[1][0],m[1][1],m[1][2]],[m[2][0],m[2][1],m[2][2]],[m[3][0],m[3][1],m[3][2]]]];
out[1][0] ¬ -Det3x3[[[m[0][1],m[0][2],m[0][3]],[m[2][1],m[2][2],m[2][3]],[m[3][1],m[3][2],m[3][3]]]];
out[1][1] ¬ Det3x3[[[m[0][0],m[0][2],m[0][3]],[m[2][0],m[2][2],m[2][3]],[m[3][0],m[3][2],m[3][3]]]];
out[1][2] ¬ -Det3x3[[[m[0][0],m[0][1],m[0][3]],[m[2][0],m[2][1],m[2][3]],[m[3][0],m[3][1],m[3][3]]]];
out[1][3] ¬ Det3x3[[[m[0][0],m[0][1],m[0][2]],[m[2][0],m[2][1],m[2][2]],[m[3][0],m[3][1],m[3][2]]]];
out[2][0] ¬ Det3x3[[[m[0][1],m[0][2],m[0][3]],[m[1][1],m[1][2],m[1][3]],[m[3][1],m[3][2],m[3][3]]]];
out[2][1] ¬ -Det3x3[[[m[0][0],m[0][2],m[0][3]],[m[1][0],m[1][2],m[1][3]],[m[3][0],m[3][2],m[3][3]]]];
out[2][2] ¬ Det3x3[[[m[0][0],m[0][1],m[0][3]],[m[1][0],m[1][1],m[1][3]],[m[3][0],m[3][1],m[3][3]]]];
out[2][3] ¬ -Det3x3[[[m[0][0],m[0][1],m[0][2]],[m[1][0],m[1][1],m[1][2]],[m[3][0],m[3][1],m[3][2]]]];
out[3][0] ¬ -Det3x3[[[m[0][1],m[0][2],m[0][3]],[m[1][1],m[1][2],m[1][3]],[m[2][1],m[2][2],m[2][3]]]];
out[3][1] ¬ Det3x3[[[m[0][0],m[0][2],m[0][3]],[m[1][0],m[1][2],m[1][3]],[m[2][0],m[2][2],m[2][3]]]];
out[3][2] ¬ -Det3x3[[[m[0][0],m[0][1],m[0][3]],[m[1][0],m[1][1],m[1][3]],[m[2][0],m[2][1],m[2][3]]]];
out[3][3] ¬ Det3x3[[[m[0][0],m[0][1],m[0][2]],[m[1][0],m[1][1],m[1][2]],[m[2][0],m[2][1],m[2][2]]]];
RETURN[out];
};