<Chapter Label="Matrix Representations">
<Heading>Matrix Representations</Heading>

This chapter describes functions which compute with matrix
representations for pcp-groups.  So far the routines in this package
are only able to compute matrix representations for torsion-free
nilpotent groups.

<Section Label="Unitriangular matrix groups">
<Heading>Unitriangular matrix groups</Heading>

<ManSection>
<Oper Name="UnitriangularMatrixRepresentation" Arg="G"/>
<Description>
	computes a faithful representation of a torsion-free nilpotent group
	<A>G</A> as unipotent lower triangular matrices over the integers.  The
	pc-presentation for <A>G</A> must not contain any power relations.  The
	algorithm is described in <Cite Key="dGN02"/>.
</Description>
</ManSection>

<ManSection>
<Func Name="IsMatrixRepresentation" Arg="G, matrices"/>
<Description>
	checks if the map defined by mapping the <M>i</M>-th generator of the
	pcp-group <A>G</A> to the <M>i</M>-th matrix of <A>matrices</A> defines a homomorphism.
</Description>
</ManSection>

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Upper unitriangular matrix groups">
<Heading>Upper unitriangular matrix groups</Heading>

We call a matrix upper unitriangular if it is an upper triangular
matrix with ones on the main diagonal.  The weight of an upper
unitriangular matrix is the number of diagonals above the main
diagonal that contain zeroes only.
<P/>
The subgroup of all upper unitriangular matrices of <M>GL(n,&ZZ;)</M> is
torsion-free nilpotent.  The <M>k</M>-th term of its lower central series is
the set of all matrices of weight <M>k-1</M>.  The <M>&ZZ;</M>-rank of the <M>k</M>-th
term of the lower central series modulo the <M>(k+1)</M>-th term is <M>n-k</M>.

<ManSection>
<Func Name="IsomorphismUpperUnitriMatGroupPcpGroup" Arg="G"/>
<Description>
	takes a group <A>G</A> generated by upper unitriangular matrices over the
	integers and computes a polycylic presentation for the group.  The
	function returns an isomorphism from the matrix group to the pcp
	group.  Note that a group generated by upper unitriangular matrices is
	necessarily torsion-free nilpotent.
</Description>
</ManSection>

<ManSection>
<Func Name="SiftUpperUnitriMatGroup" Arg="G"/>
<Description>
	takes a group <A>G</A> generated by upper unitriangular matrices over the
	integers and returns a recursive data structure <A>L</A> with the following
	properties: <A>L</A> contains a polycyclic generating sequence for <A>G</A>,
	using <A>L</A> one can decide if a given upper unitriangular matrix is
	contained in <A>G</A>, a given element of <A>G</A> can be written as a word in
	the polycyclic generating sequence.  <A>L</A> is a representation of a
	chain of subgroups of <A>G</A> refining the lower centrals series of <A>G</A>..
	It contains for each subgroup in the chain a minimal generating set.
</Description>
</ManSection>

<ManSection>
<Func Name="RanksLevels" Arg="L"/>
<Description>
	takes the data structure returned by <C>SiftUpperUnitriMat</C> and prints
	the <M>&ZZ;</M>-rank of each the subgroup in <A>L</A>.
</Description>
</ManSection>

<ManSection>
<Func Name="MakeNewLevel" Arg="m"/>
<Description>
	creates one level of the data structure returned by
	<C>SiftUpperUnitriMat</C> and initialises it with weight <A>m</A>.
</Description>
</ManSection>

<ManSection>
<Func Name="SiftUpperUnitriMat" Arg="gens, level, M"/>
<Description>
	takes the generators <A>gens</A> of an upper  unitriangular group, the data
	structure returned <A>level</A> by <C>SiftUpperUnitriMat</C> and another upper
	unitriangular matrix <A>M</A>.  It sift <A>M</A> through <A>level</A> and adds <A>M</A> at
	the appropriate place if <A>M</A> is not contained in the subgroup
	represented by <A>level</A>.
	<P/>
	The function <C>SiftUpperUnitriMatGroup</C> illustrates the use of
	<C>SiftUpperUnitriMat</C>.
<Example><![CDATA[
InstallGlobalFunction( "SiftUpperUnitriMatGroup", function( G )
    local   firstlevel,  g;

    firstlevel := MakeNewLevel( 0 );
    for g in GeneratorsOfGroup(G) do
        SiftUpperUnitriMat( GeneratorsOfGroup(G), firstlevel, g );
    od;
    return firstlevel;
end );
]]></Example>
</Description>
</ManSection>

<ManSection>
<Func Name="DecomposeUpperUnitriMat" Arg="level, M"/>
<Description>
	takes the data structure <A>level</A> returned by <C>SiftUpperUnitriMatGroup</C>
	and a upper unitriangular matrix <A>M</A> and decomposes <A>M</A> into a word in
	the polycyclic generating sequence of <A>level</A>.
</Description>
</ManSection>

</Section>
</Chapter>

