GAP Instructional Material

Return to Index


GAP code is shown like this.

[Press ?? to see GAP output]

You can also choose to see a page showing ALL GAP output.


More finitely presented groups

We will now look at the class of groups given by

g = < x, y | x2 = 1, xyxy2xy3xy4 ... = 1 >

and compute the abelian quotients of these groups

Our main purpose here is to show how write a loop which will allow a sequence of different presentations to be examined.

f:= FreeGroup("x","y");; x:= f.1;; y:= f.2;; w:= x*y;;
for i in [ 2..10 ] do
 w:= w * x * y^i;
 rels:= [ x^2, w ];
 Print( rels, "\n" );
 g:= f/rels;
 ag:= AbelianInvariants( g );
 Print( ag, "\n" );
od;
     ??

Fibonacci Groups

Let us now look at the Fibonacci groups and compute their abelian quotients. The Fibonacci group F(n) is defined by

F(n) = < a1 , a2 , ... an | aiai+1 = ai+2 , i = 1.. n >

where the subscripts are reduced mod n to lie in the range 1, 2, .. n. Notice here that since we have a different number of generators for each of the groups in our sequence, we need to use a different method of defining the groups and addressing the generators.

Also note that mod n reduces integers into the range 0, 1, .. n-1 so we need to add 1 to all the entries to get the range into 1, 2, .. , n.

for n in [ 3..8 ] do
 rels:= [];
 gens:= [];
 f:= FreeGroup( n );
 gens:= GeneratorsOfGroup( f );
   for i in [ 1..n ] do
rels[i]:= gens[1+(i mod n)]* gens[1+((1+i) mod n)] * gens[1+((2+i) mod n)]^(-1);
   od;
  g:= f/rels;
  ag:= AbelianInvariants( g );
  Print("Relations for F(",n,")" , "\n" );
  Print( rels, "\n" );
  Print("Abelian quotient for F(",n,")" , "\n" );
  Print( ag, "\n" );
  Print("\n");
od;
     ??

In fact the Fibonacci groups are generated by two generators and we could use Tietze transformations to simplify the presentations and reduce the number of generators

for n in [ 3..8 ] do
  rels:= [];
  gens:= [];
  f:= FreeGroup( n );
  gens:= GeneratorsOfGroup( f );
    for i in [ 1..n ] do
 rels[i]:= gens[1+(i mod n)]* gens[1+((1+i) mod n)] * gens[1+((2+i) mod n)]^(-1);
    od;
  g:= f/rels;
  Print("Simplified presentation for F(",n,")" , "\n");
  presn:= PresentationFpGroup( g );
  TzGoGo( presn );
  TzPrintRelators( presn );
  Print("\n");
od;
     ??

Of course there are many ways of doing the same thing. As an illustration we give a different way of generating the relations of the Fibonacci groups which in many ways is neater. This methods depends on taking the basic relation and applying the cycle (1, 2, 3, ..., n) to each of the generators. The default for CyclicGroup would give a pc group, so we use the filter IsPermGroup to get the cyclic group of order n as a permutation group.

for n in [ 3..8 ] do
  rels:= [];
  gens:= [];
  cy:=CyclicGroup( IsPermGroup, n );;
  f:= FreeGroup( n );;
  gens:= GeneratorsOfGroup( f );
  j:=0;;
    for i in cy do
 j:=j+1;
 rels[j]:= gens[1^i]* gens[2^i] * gens[3^i]^(-1);
    od;
  g:= f/rels;
  Print("Simplified presentation for F(",n,")" , "\n");
  presn:= PresentationFpGroup( g );
  TzGoGo( presn );
  TzPrintRelators( presn );
  Print("\n");
od;
     ??


A more powerful enumerator

The standard tool for many calculations in finitely presented groups is coset enumeration. Although GAP has an excellent built-in enumerator, more powerful coset enumerators also exist. First let us investigate a difficult group

f:= FreeGroup("x","y");; x:= f.1;; y:= f.2;;
rels:= [ x^2*y*x*y*x^-2*y^-1,x*y^4*x*y^-1*x*y^-1 ];
     ??
G:= f/rels;      ??
a:= G.1; b:= G.2;      ??

Now if we look at a subgroup of relatively small index, GAP copes well

H:= Subgroup( G, [b, a^3] );      ??
Index(G,H);      ??

Here is a subgroup which has a larger index and here the coset enumeration program runs out of space

H:= Subgroup( G, [a] );      ??
Index(G,H);      ??

We let it continue

return;      ??

It runs out of space again. We could keep going and we would discover that it fails even with a limit of 2048000 cosets

We could get the enumerator to run without the limit with the command Index( G, H : max := 0 ) but, depending on the computer that it is running on, it may fail or take a very long time if it succeeds.

We could do the coset enumeration with the ACE package.

First we read in the package ACE

RequirePackage("ace");      ??

Then we tell GAP to use ACE whenever it does a coset enumeration. (TCENUM = Todd-Coxeter enumeration)

TCENUM:= ACETCENUM;;

We can control many aspects of the enumeration using the many technical features of ACE - see the ACE manual at: this link

The parameters which we should set to make full use of the power of ACE is to tell it that the enumeration is expected to be hard and to set the workspace. In fact we choose a workspace which will allow ACE to define about the same number of cosets as the built-in enumerator was given when it failed.

Index( G, H : hard, workspace:=8*10^7 );      ??

If we want to see how the enumeration is progressing we need to set the level for GAP reporting ACE's messages to the user. Very large amounts of output will then be produced!

SetInfoLevel(InfoACE,3);
Index( G, H : hard:= true, workspace:= 8*10^7, mess:=10^5 );


JOC/EFR January 2003



Home   |   Members   |   Pre-prints   |   Library   |   Reports   |   Seminars   |   Conferences   |   Research   |   Publicity   |  Pictures   |   GAP   |   Webmail