FractionFreeElimination := proc(C,M,A,m,n)
local d,i,j,k,s,t,size;
size := `if`(hasCategory(C,EuclideanDomain),
C[EuclideanNorm], length);
s := 1; d := C[1];
for k to m-1 do
for i from k to m while A[i,k] = C[0] do end do;
if i > m then return C[0] fi;
for j from i+1 to m do
if A[j,k] <> C[0] and
size(A[j,k]) < size(A[i,k]) then
i := j
end if
end do;
# Pivot is A[i,k], interchange if necessary
if i <> k then
s := - s;
for j from k to n do
t := A[k,j]; A[k,j] := A[i,j]; A[i,j] := t;
end do;
end if;
# Fraction-free elimination
for i from k+1 to m do
for j from k+1 to n do
t := C[`-`]( C[`*`](A[i,j],A[k,k]),
C[`*`](A[k,j],A[i,k]));
A[i,j] := C[Div](t, d)
end do;
end do;
d := A[k,k]
end do;
s
end proc: