gausselim := proc(A::matrix)
local B,n,m,i,j,c,t,r;
n := rowdim(A); m := coldim(A);
B := map(Normalizer, A); r := 1;
for c to m while r <= n do
    # Search for a provably non-zero pivot element
    i := 0;
    for j from r to n do
        if not Testzero(B[j,c]) then
            if i = 0 then i := j;
            elif length(B[j,c]) < length(B[i,c]) then
                i := j
            end if; # otherwise B[i,c] is the best
        end if;
    end do;
    if i <> 0 then
        # interchange row i with row r is necessary
        if i <> r then
          for j from c to m do
            t := B[i,j]; B[i,j] := B[r,j]; B[r,j] := t
          end do
        end if;
        for i from r+1 to n do
          if B[i,c] <> 0 then
              t := Normalizer(B[i,c]/B[r,c]);
              for j from c+1 to m do
                B[i,j] := Normalizer(B[i,j]-t*B[r,j])
              end do;
              B[i,c] := 0
          end if;
        end do;
        r := r + 1          # go to next row
    end if
end do;              # go to next column
end proc: