# [GAP Forum] Finding only one GQuotient

Alexander Hulpke hulpke at math.colostate.edu
Mon Mar 31 18:12:31 BST 2008

```Dear Nathan,

> The manual indicates [1] that GQuotients should return only the
> first quotient it finds if the "findall" option is set to false.
> However, when I try
>
> gap> GQuotients(FreeGroup(2), AlternatingGroup(5) : findall := false);
>
> I get all 19 epimorphisms.   What am I doing wrong?

You're doing nothing wrong, the ``findall'' option so far was
implemented only in the code that searches from finite groups (the
code searching from finitely presented groups is a bit different).

This will be fixed in the next release, I append code for the method
which you can read into GAP to get the ``findall''' option already now.

Apologies for the problem,

Alexander

-- Colorado State University, Department of Mathematics,
Weber Building, 1874 Campus Delivery, Fort Collins, CO 80523-1874, USA
email: hulpke at math.colostate.edu, Phone: ++1-970-4914288
http://www.math.colostate.edu/~hulpke

### snip ###

#############################################################################
##
#F  GQuotients(<F>,<G>)  . . . . . epimorphisms from F onto G up to
conjugacy
##
InstallMethod(GQuotients,"whole fp group to finite group",true,
[IsSubgroupFpGroup and IsWholeFamily,IsGroup and IsFinite],1,
function (F,G)
local Fgens,	# generators of F
rels,	# power relations
cl,	# classes of G
imgo,imgos,sel,
e,	# excluded orders (for which the presentation collapses
u,	# trial generating set's group
pimgs,	# possible images
val,	# its value
i,	# loop
h;	# epis

Fgens:=GeneratorsOfGroup(F);

if Length(Fgens)=0 then
if Size(G)>1 then
return [];
else
return [GroupHomomorphismByImagesNC(F,G,[],[])];
fi;
fi;

if Size(G)=1 then
return [GroupHomomorphismByImagesNC(F,G,Fgens,
List(Fgens,i->One(G)))];
elif Length(Fgens)=1 then
Info(InfoMorph,1,"Cyclic group: only one quotient possible");
# a cyclic group has at most one quotient

# force size (in abelian invariants)
e:=AbelianInvariants(F);

if not IsCyclic(G) or (IsFinite(F) and not IsInt(Size(F)/
Size(G))) then
return [];
else
# get the cyclic gens
h:=First(AsList(G),i->Order(i)=Size(G));
# just map them
return [GroupHomomorphismByImagesNC(F,G,Fgens,[h])];
fi;
fi;

cl:=ConjugacyClasses(G);

# search relators in only one generator
rels:=ListWithIdenticalEntries(Length(Fgens),false);

for i in RelatorsOfFpGroup(F) do
if NrSyllables(i)=1 then
# found relator in only one generator
val:=Position(List(FreeGeneratorsOfFpGroup(F),j-
>GeneratorSyllable(j,1)),
GeneratorSyllable(i,1));
u:=AbsInt(ExponentSyllable(i,1));
if rels[val]=false then
rels[val]:=u;
else
rels[val]:=Gcd(rels[val],u);
fi;
fi;
od;

# exclude orders
e:=Set(List(cl,i->Order(Representative(i))));
e:=List(Fgens,i->ShallowCopy(e));
for i in [1..Length(Fgens)] do
if rels[i]<>false then
e[i]:=Filtered(e[i],j->rels[i]<>j and IsInt(rels[i]/j));
fi;
od;
e:=ExcludedOrders(F,e);

# find potential images
pimgs:=[];

for i in [1..Length(Fgens)] do
if rels[i]<>false then
Info(InfoMorph,2,"generator order must divide ",rels[i]);
u:=Filtered(cl,j->IsInt(rels[i]/Order(Representative(j))));
else
Info(InfoMorph,2,"no restriction on generator order");
u:=ShallowCopy(cl);
fi;
u:=Filtered(u,j->not Order(Representative(j)) in e[i]);
od;

val:=Product(pimgs,i->Sum(i,Size));
Info(InfoMorph,2,List(pimgs,Length)," possibilities, Value: ",val);

if ValueOption("findall")=false then
h:=MorClassLoop(G,pimgs, rec(gens:=Fgens,to:=G,from:=F,
free:=FreeGeneratorsOfFpGroup(F),
rels:=List(RelatorsOfFpGroup(F),i->[i,1])),5);
if not IsList(h) then h:=[h];fi;
else
h:=MorClassLoop(G,pimgs, rec(gens:=Fgens,to:=G,from:=F,
free:=FreeGeneratorsOfFpGroup(F),
rels:=List(RelatorsOfFpGroup(F),i->[i,1])),13);
fi;
Info(InfoMorph,2,"Found ",Length(h)," maps, test kernels");
imgos:=[];
cl:=[];
u:=[];
for i in h do
imgo:=List(Fgens,j->Image(i,j));
imgo:=Concatenation(imgo,MorFroWords(imgo));
imgo:=List(imgo,Order);
sel:=Filtered([1..Length(imgos)],i->imgos[i]=imgo);
if not KernelOfMultiplicativeGeneralMapping(i) in u{sel} then
fi;
od;

Info(InfoMorph,1,Length(h)," found -> ",Length(cl)," homs");
return cl;
end);

## snip ###

```