<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- %% -->
<!-- %A  matint.msk                  GAP documentation            Alexander Hulpke -->
<!-- %A                                                           Thomas Breuer -->
<!-- %A                                                           Rob Wainwright -->
<!-- %% -->
<!-- %A  @(#)<M>Id: matint.msk,v 1.19 2004/01/19 09:52:53 gap Exp </M> -->
<!-- %% -->
<!-- %Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland -->
<!-- %Y  Copyright (C) 2002 The GAP Group -->
<!-- %% -->
<Chapter Label="Integral matrices and lattices">
<Heading>Integral matrices and lattices</Heading>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Linear equations over the integers and Integral Matrices">
<Heading>Linear equations over the integers and Integral Matrices</Heading>

<#Include Label="NullspaceIntMat">
<#Include Label="SolutionIntMat">
<#Include Label="SolutionNullspaceIntMat">
<#Include Label="BaseIntMat">
<#Include Label="BaseIntersectionIntMats">
<#Include Label="ComplementIntMat">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Normal Forms over the Integers">
<Heading>Normal Forms over the Integers</Heading>

This section describes the computation of the Hermite and Smith normal form
of integer matrices.
<P/>
The Hermite Normal Form (HNF) <M>H</M> of an integer matrix <M>A</M> is
a row equivalent upper triangular form such that all off-diagonal entries
are reduced modulo the diagonal entry of the column they are in.
There exists a unique unimodular matrix <M>Q</M> such that <M>Q A = H</M>. 
<P/>
The Smith Normal Form <M>S</M> of an integer matrix <M>A</M> is
the unique equivalent diagonal form with <M>S_i</M> dividing <M>S_j</M> for
<M>i &lt; j</M>.
There exist unimodular integer matrices <M>P, Q</M> such that <M>P A Q = S</M>.
<P/>
All routines described in this section build on the <Q>workhorse</Q> routine
<Ref Func="NormalFormIntMat"/>.

<#Include Label="TriangulizedIntegerMat">
<#Include Label="TriangulizedIntegerMatTransform">
<#Include Label="TriangulizeIntegerMat">
<#Include Label="HermiteNormalFormIntegerMat">
<#Include Label="HermiteNormalFormIntegerMatTransform">
<#Include Label="SmithNormalFormIntegerMat">
<#Include Label="SmithNormalFormIntegerMatTransforms">
<#Include Label="DiagonalizeIntMat">
<#Include Label="NormalFormIntMat">
<#Include Label="AbelianInvariantsOfList">

<!-- %\ Declaration{DiagonalizeIntMatNormDriven} -->
<!-- %\ Declaration{SNFNormDriven} -->
<!-- %\ Declaration{SNFofREF} -->
<!-- %\ Declaration{HNFNormDriven} -->
 
</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Determinant of an integer matrix">
<Heading>Determinant of an integer matrix</Heading>

<#Include Label="DeterminantIntMat">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Decompositions">
<Heading>Decompositions</Heading>

<#Include Label="[1]{zlattice}">
<#Include Label="Decomposition">
<#Include Label="LinearIndependentColumns">
<#Include Label="PadicCoefficients">
<#Include Label="IntegralizedMat">
<#Include Label="DecompositionInt">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Lattice Reduction">
<Heading>Lattice Reduction</Heading>

<#Include Label="LLLReducedBasis">
<#Include Label="LLLReducedGramMat">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Orthogonal Embeddings">
<Heading>Orthogonal Embeddings</Heading>

<#Include Label="OrthogonalEmbeddings">
<#Include Label="ShortestVectors">

</Section>
</Chapter>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- %% -->
<!-- %E -->

