> < ^ Date: Fri, 27 Jul 2001 12:48:29 +0100 (BST)
> < ^ From: Derek Holt <dfh@maths.warwick.ac.uk >
< ^ Subject: Re: free product

Dear GAP Forum

>
> I would like to produce elements of the free square product of alternating
> groups for example A-5 * A-5. I will be more grateful if someone let me know
> that how I can define this group and those elements (with special length) in
> GAP.

```It is not difficult to define a free product of two finitely presented
groups, since < X | R > * < Y | S > = < X union Y | R union S >.
```

Here are a couple of GAP4 functions. The first FPAlt(n) returns the
alternating group A_n as an FP-group for n>=3.

The second, FreeProductFpGroups(G,H) returns a list L, where L[1] is
the free product of the FpGroups G and H returned as an FpGroup, and
L[2], L[3] are the natural insertion homomorphisms G->L[1] and H->L[1].

Using these homomorphisms you can construct elements of G*H from those
of G and H, and you can loop over G and H if you want to form all
elements of a given length in the free factors.

I cannot quite imagine what you will be able to do these groups and
elements apart from defining them, but perhaps that will become clearer
later! It would, for example, be possible to write arbitrary words
in the generators of G*H into a normal form by constructing a
confluent rewriting system for G*H.

Derek Holt.

```FPAlt := function(n)
#Alternating group A_n as a FP-group, n>=3.
local F, FGG, R, i, j;
F := FreeGroup(n-2);
FGG := GeneratorsOfGroup(F);
R := [];
for i in [2..n-2] do Add(R,FGG[i]^2); od;
for i in [1..n-3] do Add(R,(FGG[i]*FGG[i+1])^3); od;
for i in [1..n-4] do for j in [i+2..n-2] do Add(R,(FGG[i]*FGG[j])^2); od; od;

return F/R;
end;
```

FreeProductOfFpGroups := function(G,H)
#G and H should be FP-groups - form free product.
#Returns a list containing the free product F and the insertion
#maps G->F and H->F.
local FG,FH,FGG,FGH,GG,GH,m,n,F,GF,FGtoF,FHtoF,RG,RH,RQ,Q,GQ,GtoQ,HtoQ;
FG := FreeGroupOfFpGroup(G);
FH := FreeGroupOfFpGroup(H);
GG := GeneratorsOfGroup(G);
GH := GeneratorsOfGroup(H);
FGG := FreeGeneratorsOfFpGroup(G);
FGH := FreeGeneratorsOfFpGroup(H);
m := Length(FGG);
n := Length(FGH);
F := FreeGroup(m + n);
GF := GeneratorsOfGroup(F);
FGtoF := GroupHomomorphismByImages(FG,F,FGG,GF{[1..m]});
FHtoF := GroupHomomorphismByImages(FH,F,FGH,GF{[m+1..m+n]});
RG := RelatorsOfFpGroup(G);
RH := RelatorsOfFpGroup(H);
RQ := Concatenation( List(RG,x->x^FGtoF), List(RH,x->x^FHtoF) );
Q := F/RQ;
GQ := GeneratorsOfGroup(Q);
GtoQ := GroupHomomorphismByImagesNC(G,Q,GG,GQ{[1..m]});
HtoQ := GroupHomomorphismByImagesNC(H,Q,GH,GQ{[m+1..m+n]});

return [Q,GtoQ,HtoQ];
end;