> with(linalg):

Sample Computation of Hermite Normal Form

> m:=matrix(3,3,[[1,3,4],[-1,2,4],[5,2,1]]);

m := matrix([[1, 3, 4], [-1, 2, 4], [5, 2, 1]])

> det(m);

9

> m:=addcol(m,1,3,-4);

m := matrix([[1, 3, 0], [-1, 2, 8], [5, 2, -19]])

> m:=addcol(m,1,2,-3);

m := matrix([[1, 0, 0], [-1, 5, 8], [5, -13, -19]])...

> m:=addcol(m,2,3,-1);

m := matrix([[1, 0, 0], [-1, 5, 3], [5, -13, -6]])

> m:=addcol(m,3,2,-1);

m := matrix([[1, 0, 0], [-1, 2, 3], [5, -7, -6]])

> m:=addcol(m,2,3,-1);

m := matrix([[1, 0, 0], [-1, 2, 1], [5, -7, 1]])

> m:=addcol(m,3,2,-2);

m := matrix([[1, 0, 0], [-1, 0, 1], [5, -9, 1]])

> m:=swapcol(m,2,3);

m := matrix([[1, 0, 0], [-1, 1, 0], [5, 1, -9]])

> m:=mulrow(m,3,-1)

> ;

m := matrix([[1, 0, 0], [-1, 1, 0], [-5, -1, 9]])

> m:=addcol(m,2,1,1);

m := matrix([[1, 0, 0], [0, 1, 0], [-6, -1, 9]])

> m:=addcol(m,3,1,1);

m := matrix([[1, 0, 0], [0, 1, 0], [3, -1, 9]])

> m:=addcol(m,3,2,1);

m := matrix([[1, 0, 0], [0, 1, 0], [3, 8, 9]])

This is Hermite Normal Form: Lower triangular, with off diagonal entries reduced modulo diagonal ones.