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: