class operator TMatrix.Multiply(const A, B: TMatrix): TMatrix;
begin
Result.M[0, 0] := A.M[0, 0] * B.M[0, 0] + A.M[0, 1] * B.M[1, 0] + A.M[0, 2] * B.M[2, 0] + A.M[0, 3] * B.M[3, 0];
Result.M[0, 1] := A.M[0, 0] * B.M[0, 1] + A.M[0, 1] * B.M[1, 1] + A.M[0, 2] * B.M[2, 1] + A.M[0, 3] * B.M[3, 1];
Result.M[0, 2] := A.M[0, 0] * B.M[0, 2] + A.M[0, 1] * B.M[1, 2] + A.M[0, 2] * B.M[2, 2] + A.M[0, 3] * B.M[3, 2];
Result.M[0, 3] := A.M[0, 0] * B.M[0, 3] + A.M[0, 1] * B.M[1, 3] + A.M[0, 2] * B.M[2, 3] + A.M[0, 3] * B.M[3, 3];
Result.M[1, 0] := A.M[1, 0] * B.M[0, 0] + A.M[1, 1] * B.M[1, 0] + A.M[1, 2] * B.M[2, 0] + A.M[1, 3] * B.M[3, 0];
Result.M[1, 1] := A.M[1, 0] * B.M[0, 1] + A.M[1, 1] * B.M[1, 1] + A.M[1, 2] * B.M[2, 1] + A.M[1, 3] * B.M[3, 1];
Result.M[1, 2] := A.M[1, 0] * B.M[0, 2] + A.M[1, 1] * B.M[1, 2] + A.M[1, 2] * B.M[2, 2] + A.M[1, 3] * B.M[3, 2];
Result.M[1, 3] := A.M[1, 0] * B.M[0, 3] + A.M[1, 1] * B.M[1, 3] + A.M[1, 2] * B.M[2, 3] + A.M[1, 3] * B.M[3, 3];
Result.M[2, 0] := A.M[2, 0] * B.M[0, 0] + A.M[2, 1] * B.M[1, 0] + A.M[2, 2] * B.M[2, 0] + A.M[2, 3] * B.M[3, 0];
Result.M[2, 1] := A.M[2, 0] * B.M[0, 1] + A.M[2, 1] * B.M[1, 1] + A.M[2, 2] * B.M[2, 1] + A.M[2, 3] * B.M[3, 1];
Result.M[2, 2] := A.M[2, 0] * B.M[0, 2] + A.M[2, 1] * B.M[1, 2] + A.M[2, 2] * B.M[2, 2] + A.M[2, 3] * B.M[3, 2];
Result.M[2, 3] := A.M[2, 0] * B.M[0, 3] + A.M[2, 1] * B.M[1, 3] + A.M[2, 2] * B.M[2, 3] + A.M[2, 3] * B.M[3, 3];
Result.M[3, 0] := A.M[3, 0] * B.M[0, 0] + A.M[3, 1] * B.M[1, 0] + A.M[3, 2] * B.M[2, 0] + A.M[3, 3] * B.M[3, 0];
Result.M[3, 1] := A.M[3, 0] * B.M[0, 1] + A.M[3, 1] * B.M[1, 1] + A.M[3, 2] * B.M[2, 1] + A.M[3, 3] * B.M[3, 1];
Result.M[3, 2] := A.M[3, 0] * B.M[0, 2] + A.M[3, 1] * B.M[1, 2] + A.M[3, 2] * B.M[2, 2] + A.M[3, 3] * B.M[3, 2];
Result.M[3, 3] := A.M[3, 0] * B.M[0, 3] + A.M[3, 1] * B.M[1, 3] + A.M[3, 2] * B.M[2, 3] + A.M[3, 3] * B.M[3, 3];
end;