In this section we will show you the investigation of a Coxeter group that is given by its presentation. You will see that finitely presented groups and presentations are different kinds of objects in GAP. While finitely presented groups can never be changed after they have been created as factor groups of free groups, presentations allow manipulations of the generators and relators by Tietze transformations. The investigation of the example will involve methods and algorithms like Todd-Coxeter, Reidemeister-Schreier, Nilpotent Quotient, and Tietze transformations.
We start by defining a Coxeter group c
on five generators as a factor
group of the free group of rank 5, whose generators we already call
c.1
, ..., c.5
.
gap> c := FreeGroup( 5, "c" );; gap> r := List( c.generators, x -> x^2 );; gap> Append( r, [ (c.1*c.2)^3, (c.1*c.3)^2, (c.1*c.4)^3, > (c.1*c.5)^3, (c.2*c.3)^3, (c.2*c.4)^2, (c.2*c.5)^3, > (c.3*c.4)^3, (c.3*c.5)^3, (c.4*c.5)^3, > (c.1*c.2*c.5*c.2)^2, (c.3*c.4*c.5*c.4)^2 ] ); gap> c := c / r; Group( c.1, c.2, c.3, c.4, c.5 )
If we call the function Size
for this group GAP will invoke the
Todd-Coxeter method, which however will fail to get a result going up to
the default limit of defining 64000 cosets:
gap> Size(c); Error, the coset enumeration has defined more than 64000 cosets: type 'return;' if you want to continue with a new limit of 128000 cosets, type 'quit;' if you want to quit the coset enumeration, type 'maxlimit := 0; return;' in order to continue without a limit, in AugmentedCosetTableMtc( G, H, -1, "_x" ) called from D.operations.Size( D ) called from Size( c ) called from main loop brk> quit;
In fact, as we shall see later, our finitely presented group is infinite and hence we would get the same answer also with larger limits. So we next look for subgroups of small index, in our case limiting the index to four.
gap> lis := LowIndexSubgroupsFpGroup( c, TrivialSubgroup(c), 4 );; gap> Length(lis); 10
The LowIndexSubgroupsFpGroup
function in fact determines generators for
the subgroups, written in terms of the generators of the given group. We
can find the index of these subgroups by the function Index
, and the
permutation representation on the cosets of these subgroups by the
function OperationCosetsFpGroup
, which use a Todd-Coxeter method. The
size of the image of this permutation representation is found using
Size
which in this case uses a Schreier-Sims method for permutation
groups.
gap> List(lis, x -> [Index(c,x),Size(OperationCosetsFpGroup(c,x))]); [ [ 1, 1 ], [ 4, 24 ], [ 4, 24 ], [ 4, 24 ], [ 4, 24 ], [ 4, 24 ], [ 4, 24 ], [ 4, 24 ], [ 3, 6 ], [ 2, 2 ] ]
We next determine the commutator factor groups of the kernels of these
permutation representations. Note that here the difference of finitely
presented groups and presentations has to be observed: We first
determine the kernel of the permutation representation by the function
Core
as a subgroup of c
, then a presentation of this subgroup using
PresentationSubgroup
, which has to be converted into a finitely
presented group of its own right using FpGroupPresentation
, before its
commutator factor group and the abelian invariants can be found using
integer matrix diagonalisation of the relators matrix by an elementary
divisor algorithm. The conversion is necessary because Core
computes a
subgroup given by words in the generators of c
but
CommutatorFactorGroup
needs a parent group given by generators and
relators.
gap> List( lis, x -> AbelianInvariants( CommutatorFactorGroup( > FpGroupPresentation( PresentationSubgroup( c, Core(c,x) ) ) ) ) ); [ [ 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 0, 0, 0, 0, 0, 0 ], [ 2, 2, 2, 2, 2, 2 ], [ 3 ] ]
More clearly arranged, this is
[ [ 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 2, 2, 2, 2, 2, 2, 2, 2 ], [ 0, 0, 0, 0, 0, 0 ], [ 2, 2, 2, 2, 2, 2 ], [ 3 ] ]
Note that there is another function AbelianInvariantsSubgroupFpGroup
which we could have used to obtain this list which will do an abelianized
Reduced Reidemeister-Schreier. This function is much faster because it
does not compute a complete presentation for the core.
The output obtained shows that the third last of the kernels has a free
abelian commutator factor group of rank 6. We turn our attention to this
kernel which we call n
, while we call the associated presentation pr
.
gap> lis[8]; Subgroup( Group( c.1, c.2, c.3, c.4, c.5 ), [ c.1, c.2, c.3*c.2*c.5^-1, c.3*c.4*c.3^-1, c.4*c.1*c.5^-1 ] ) gap> pr := PresentationSubgroup( c, Core( c, lis[8] ) ); << presentation with 22 gens and 41 rels of total length 156 >> gap> n := FpGroupPresentation(pr);;
We first determine p-factor groups for primes 2, 3, 5, and 7.
gap> InfoPQ1:= Ignore;; gap> List( [2,3,5,7], p -> PrimeQuotient(n,p,5).dimensions ); [ [ 6, 10, 18, 30, 54 ], [ 6, 10, 18, 30, 54 ], [ 6, 10, 18, 30, 54 ], [ 6, 10, 18, 30, 54 ] ]
Observing that the ranks of the lower exponent-p central series are the same for these primes we suspect that the lower central series may have free abelian factors. To investigate this we have to call the package "nq".
gap> RequirePackage("nq"); gap> NilpotentQuotient( n, 5 ); [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ] gap> List( last, Length ); [ 6, 4, 8, 12, 24 ]
The ranks of the factors except the first are divisible by four, and we compare them with the corresponding ranks of a free group on two generators.
gap> f2 := FreeGroup(2); Group( f.1, f.2 ) gap> PrimeQuotient( f2, 2, 5 ).dimensions; [ 2, 3, 5, 8, 14 ] gap> NilpotentQuotient( f2, 5 ); [ [ 0, 0 ], [ 0 ], [ 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ] gap> List( last, Length ); [ 2, 1, 2, 3, 6 ]
The result suggests a close relation of our group to the direct product
of four free groups of rank two. In order to study this we want a simple
presentation for our kernel n
and obtain this by repeated use of Tietze
transformations, using first the default simplification function TzGoGo
and later specific introduction of new generators that are obtained as
product of two of the existing ones using the function TzSubstitute
.
(Of course, this latter sequence of Tietze transformations that we
display here has only been found after some trial and error.)
gap> pr := PresentationSubgroup( c, Core( c, lis[8] ) ); << presentation with 22 gens and 41 rels of total length 156 >> gap> TzGoGo(pr); #I there are 6 generators and 14 relators of total length 74 gap> TzGoGo(pr); #I there are 6 generators and 13 relators of total length 66 gap> TzGoGo(pr); gap> TzPrintPairs(pr); #I 1. 3 occurrences of _x6 * _x11^-1 #I 2. 3 occurrences of _x3 * _x15 #I 3. 2 occurrences of _x11^-1 * _x15^-1 #I 4. 2 occurrences of _x6 * _x15 #I 5. 2 occurrences of _x6^-1 * _x15^-1 #I 6. 2 occurrences of _x4 * _x15 #I 7. 2 occurrences of _x4^-1 * _x15^-1 #I 8. 2 occurrences of _x4^-1 * _x11 #I 9. 2 occurrences of _x4 * _x6 #I 10. 2 occurrences of _x3^-1 * _x11 gap> TzSubstitute(pr,10,2); #I substituting new generator _x26 defined by _x3^-1*_x11 #I eliminating _x11 = _x3*_x26 #I there are 6 generators and 13 relators of total length 70 gap> TzGoGo(pr); #I there are 6 generators and 12 relators of total length 62 #I there are 6 generators and 12 relators of total length 60 gap> TzGoGo(pr); gap> TzSubstitute(pr,9,2); #I substituting new generator _x27 defined by _x1^-1*_x15 #I eliminating _x15 = _x27*_x1 #I there are 6 generators and 12 relators of total length 64 gap> TzGoGo(pr); #I there are 6 generators and 11 relators of total length 56 gap> TzGoGo(pr); gap> p2 := Copy(pr); << presentation with 6 gens and 11 rels of total length 56 >> gap> TzPrint(p2); #I generators: [ _x1, _x3, _x4, _x6, _x26, _x27 ] #I relators: #I 1. 4 [ -6, -1, 6, 1 ] #I 2. 4 [ 4, 6, -4, -6 ] #I 3. 4 [ 5, 4, -5, -4 ] #I 4. 4 [ 4, -2, -4, 2 ] #I 5. 4 [ -3, 2, 3, -2 ] #I 6. 4 [ -3, -1, 3, 1 ] #I 7. 6 [ -4, 3, 4, 6, -3, -6 ] #I 8. 6 [ -1, -6, -2, 6, 1, 2 ] #I 9. 6 [ -6, -2, -5, 6, 2, 5 ] #I 10. 6 [ 2, 5, 1, -5, -2, -1 ] #I 11. 8 [ -1, -6, -5, 3, 6, 1, 5, -3 ] gap> TzPrintPairs(p2); #I 1. 5 occurrences of _x1^-1 * _x27^-1 #I 2. 3 occurrences of _x6 * _x27 #I 3. 3 occurrences of _x3 * _x26 #I 4. 2 occurrences of _x3 * _x27 #I 5. 2 occurrences of _x1 * _x4 #I 6. 2 occurrences of _x1 * _x3 #I 7. 1 occurrence of _x26 * _x27 #I 8. 1 occurrence of _x26 * _x27^-1 #I 9. 1 occurrence of _x26^-1 * _x27 #I 10. 1 occurrence of _x6 * _x27^-1 gap> TzSubstitute(p2,1,2); #I substituting new generator _x28 defined by _x1^-1*_x27^-1 #I eliminating _x27 = _x1^-1*_x28^-1 #I there are 6 generators and 11 relators of total length 58 gap> TzGoGo(p2); #I there are 6 generators and 11 relators of total length 54 gap> TzGoGo(p2); gap> p3 := Copy(p2); << presentation with 6 gens and 11 rels of total length 54 >> gap> TzSubstitute(p3,3,2); #I substituting new generator _x29 defined by _x3*_x26 #I eliminating _x26 = _x3^-1*_x29 gap> TzGoGo(p3); #I there are 6 generators and 11 relators of total length 52 gap> TzGoGo(p3); gap> TzPrint(p3); #I generators: [ _x1, _x3, _x4, _x6, _x28, _x29 ] #I relators: #I 1. 4 [ 6, 4, -6, -4 ] #I 2. 4 [ 1, -6, -1, 6 ] #I 3. 4 [ -5, -1, 5, 1 ] #I 4. 4 [ -2, -5, 2, 5 ] #I 5. 4 [ 4, -2, -4, 2 ] #I 6. 4 [ -3, 2, 3, -2 ] #I 7. 4 [ -3, -1, 3, 1 ] #I 8. 6 [ -2, 5, -6, 2, -5, 6 ] #I 9. 6 [ 4, -1, -5, -4, 5, 1 ] #I 10. 6 [ -6, 3, -5, 6, -3, 5 ] #I 11. 6 [ 3, -5, 4, -3, -4, 5 ]
The resulting presentation could further be simplified by Tietze
transformations using TzSubstitute
and TzGoGo
until one reaches
finally a presentation on 6 generators with 11 relators, 9 of which are
commutators of the generators. Working by hand from these, the kernel
can be identified as a particular subgroup of the direct product of four
copies of the free group on two generators.
GAP 3.4.4