  Finitely generated Z-modules have canonical decompositions. When such modules
are given in a finitely presented form there is a classical algorithm for
computing a canonical decomposition. This is the algorithm for computing the
Smith normal form of an integer matrix. We discuss algorithms for Smith normal
form computation, and present practical algorithms which give excellent
performance for modules arising from badly presented abelian groups. We
investigate such issues as congruential techniques, sparsity considerations,
pivoting strategies for Gauss-Jordan elimination, lattice basis reduction and
computational complexity. Our results, which are primarily empirical, show
dramatically improved performance on previous methods.
