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: