Matrix Normal Forms#
- sympy.matrices.normalforms.smith_normal_form(m, domain=None)[source]#
Return the Smith Normal Form of a matrix \(m\) over the ring \(domain\). This will only work if the ring is a principal ideal domain.
Examples
>>> from sympy import Matrix, ZZ >>> from sympy.matrices.normalforms import smith_normal_form >>> m = Matrix([[12, 6, 4], [3, 9, 6], [2, 16, 14]]) >>> print(smith_normal_form(m, domain=ZZ)) Matrix([[1, 0, 0], [0, 10, 0], [0, 0, -30]])
- sympy.matrices.normalforms.hermite_normal_form(A, *, D=None, check_rank=False)[source]#
Compute the Hermite Normal Form of a Matrix A of integers.
- Parameters:
A : \(m \times n\)
Matrix
of integers.D : int, optional
Let \(W\) be the HNF of A. If known in advance, a positive integer D being any multiple of \(\det(W)\) may be provided. In this case, if A also has rank \(m\), then we may use an alternative algorithm that works mod D in order to prevent coefficient explosion.
check_rank : boolean, optional (default=False)
The basic assumption is that, if you pass a value for D, then you already believe that A has rank \(m\), so we do not waste time checking it for you. If you do want this to be checked (and the ordinary, non-modulo D algorithm to be used if the check fails), then set check_rank to
True
.- Returns:
Matrix
The HNF of matrix A.
- Raises:
DMDomainError
If the domain of the matrix is not ZZ.
DMShapeError
If the mod D algorithm is used but the matrix has more rows than columns.
Examples
>>> from sympy import Matrix >>> from sympy.matrices.normalforms import hermite_normal_form >>> m = Matrix([[12, 6, 4], [3, 9, 6], [2, 16, 14]]) >>> print(hermite_normal_form(m)) Matrix([[10, 0, 2], [0, 15, 3], [0, 0, 2]])
References
[R598]Cohen, H. A Course in Computational Algebraic Number Theory. (See Algorithms 2.4.5 and 2.4.8.)