Skip to content

HermiteDecomposition ​

{u,h}\{u, h\} with uu unimodular and u⋅m=hu \cdot m = h upper triangular in Hermite normal form.

✓ checked against that system · ! checked, with disagreements (hover a chip)Wolfram LanguageHermiteDecomposition✓
HermiteDecomposition(m)a unimodular uu and h=u⋅mh = u \cdot m in Hermite normal form
Typed signatures
TypePackageApplies
(list<list<integer>>) -> listnumber-theoryalways

Domain: Number theory

Details
  • hh is upper triangular with positive pivots, and every entry above a pivot is reduced into [0,pivot)[0, \text{pivot}) — the row-reduced convention that makes hh unique for a given mm.
  • u∈GLn(Z)u \in GL_n(\mathbb{Z}): det⁡u=±1\det u = \pm 1, so uu is invertible over Z\mathbb{Z}, not merely over Q\mathbb{Q}.
  • Used by ProfiniteDecomposition to put a matrix over Q^\hat{\mathbb{Q}} into strong-approximation form (Hertogh's Algorithm 8.4).

Examples

1 more kept as data, checked against the oracles
Basic #
live ↗
InHermiteDecomposition([[0,−3],[2,0]])\mathrm{HermiteDecomposition}(\bigl\lbrack\bigl\lbrack0, -3\bigr\rbrack, \bigl\lbrack2, 0\bigr\rbrack\bigr\rbrack)Out[[[0,1],[−1,0]],[[2,0],[0,3]]]\bigl\lbrack\bigl\lbrack\bigl\lbrack0, 1\bigr\rbrack, \bigl\lbrack-1, 0\bigr\rbrack\bigr\rbrack, \bigl\lbrack\bigl\lbrack2, 0\bigr\rbrack, \bigl\lbrack0, 3\bigr\rbrack\bigr\rbrack\bigr\rbrack
live ↗
InHermiteDecomposition([[1,2],[3,4]])\mathrm{HermiteDecomposition}(\bigl\lbrack\bigl\lbrack1, 2\bigr\rbrack, \bigl\lbrack3, 4\bigr\rbrack\bigr\rbrack)Out[[[−2,1],[3,−1]],[[1,0],[0,2]]]\bigl\lbrack\bigl\lbrack\bigl\lbrack-2, 1\bigr\rbrack, \bigl\lbrack3, -1\bigr\rbrack\bigr\rbrack, \bigl\lbrack\bigl\lbrack1, 0\bigr\rbrack, \bigl\lbrack0, 2\bigr\rbrack\bigr\rbrack\bigr\rbrack
Scope #

3×33\times3, det⁡u=−1\det u=-1

live ↗
InHermiteDecomposition([[1,2,3],[4,5,6],[7,8,10]])\mathrm{HermiteDecomposition}(\bigl\lbrack\bigl\lbrack1, 2, 3\bigr\rbrack, \bigl\lbrack4, 5, 6\bigr\rbrack, \bigl\lbrack7, 8, 10\bigr\rbrack\bigr\rbrack)Out[[[−2,6,−3],[−2,11,−6],[1,−2,1]],[[1,2,0],[0,3,0],[0,0,1]]]\bigl\lbrack\bigl\lbrack\bigl\lbrack-2, 6, -3\bigr\rbrack, \bigl\lbrack-2, 11, -6\bigr\rbrack, \bigl\lbrack1, -2, 1\bigr\rbrack\bigr\rbrack, \bigl\lbrack\bigl\lbrack1, 2, 0\bigr\rbrack, \bigl\lbrack0, 3, 0\bigr\rbrack, \bigl\lbrack0, 0, 1\bigr\rbrack\bigr\rbrack\bigr\rbrack

Rectangular: the column without a pivot is left unreduced

live ↗
InHermiteDecomposition([[2,3,5],[7,11,13]])\mathrm{HermiteDecomposition}(\bigl\lbrack\bigl\lbrack2, 3, 5\bigr\rbrack, \bigl\lbrack7, 11, 13\bigr\rbrack\bigr\rbrack)Out[[[11,−3],[−7,2]],[[1,0,16],[0,1,−9]]]\bigl\lbrack\bigl\lbrack\bigl\lbrack11, -3\bigr\rbrack, \bigl\lbrack-7, 2\bigr\rbrack\bigr\rbrack, \bigl\lbrack\bigl\lbrack1, 0, 16\bigr\rbrack, \bigl\lbrack0, 1, -9\bigr\rbrack\bigr\rbrack\bigr\rbrack

Returns a unimodular matrix and the upper-triangular Hermite form

live ↗
InHermiteDecomposition([[0,5,4],[3,1,2],[3,5,4]])\mathrm{HermiteDecomposition}(\bigl\lbrack\bigl\lbrack0, 5, 4\bigr\rbrack, \bigl\lbrack3, 1, 2\bigr\rbrack, \bigl\lbrack3, 5, 4\bigr\rbrack\bigr\rbrack)Out[[[−1,0,1],[1,1,−1],[4,5,−5]],[[3,0,0],[0,1,2],[0,0,6]]]\bigl\lbrack\bigl\lbrack\bigl\lbrack-1, 0, 1\bigr\rbrack, \bigl\lbrack1, 1, -1\bigr\rbrack, \bigl\lbrack4, 5, -5\bigr\rbrack\bigr\rbrack, \bigl\lbrack\bigl\lbrack3, 0, 0\bigr\rbrack, \bigl\lbrack0, 1, 2\bigr\rbrack, \bigl\lbrack0, 0, 6\bigr\rbrack\bigr\rbrack\bigr\rbrack
Possible issues #

Singular: hh gains a zero row, and uu is no longer unique

live ↗
InHermiteDecomposition([[1,2],[2,4]])\mathrm{HermiteDecomposition}(\bigl\lbrack\bigl\lbrack1, 2\bigr\rbrack, \bigl\lbrack2, 4\bigr\rbrack\bigr\rbrack)Out[[[1,0],[−2,1]],[[1,2],[0,0]]]\bigl\lbrack\bigl\lbrack\bigl\lbrack1, 0\bigr\rbrack, \bigl\lbrack-2, 1\bigr\rbrack\bigr\rbrack, \bigl\lbrack\bigl\lbrack1, 2\bigr\rbrack, \bigl\lbrack0, 0\bigr\rbrack\bigr\rbrack\bigr\rbrack
About
Examples7
Checked againstWolfram Language 7 agree
CrosswalkWolfram Language

Implementation

mappedwolframpackages/oracle/src/mappings.ts

See also: ProfiniteDecomposition, ExtendedGCD