Dear GAP-Forum,
The homomorphism routines for AgGroups contain an error that occurs when
computing the (nontrivial) kernel of an homomorphism into an AgGroup:
gap> g:=SymmetricGroup(3);;
gap> h:=TrivialSubgroup(SolvableGroup(2,1));;
gap> hom:=GroupHomomorphismByImages(g,h,g.generators,
List(g.generators,i->h.identity));;
GroupHomomorphismByImages( Group( (1,3), (2,3) ), Subgroup( c2, [ ] ),
[ (1,3), (2,3) ], [ IdAgWord, IdAgWord ] )
gap> Kernel(hom);
Subgroup( Group( (1,3), (2,3) ), [ ] )
Reason for this error is a bad trick the `Kernel` routine plays on
`GroupHomomorphismByImages`: The inverse Mapping is constructed which is not
a true Homomorphism but only used for intermediate computations. This
mapping however is mangled by the AgGroup routines when trying to compute
a Cgs for the source subgroup.
Replacing the routine `AgGroupOps.GroupHomomorphismByImages` in the library
file `aghomom.g` by the following code bypasses the error:
############################################################################# ## #F AgGroupOps.GroupHomomorphismByImages( <U>, <R>, <g>, <i> ) . . create hom ## AgGroupOps.GroupHomomorphismByImages := function( D, R, gens, imgs )
local h, # homomorphism
i,
ogens,
oimgs,
tmp; # temporary
# Normalize <gens> and unbind possible '<D>.field'.
ogens := gens;
oimgs := imgs;
D := Normalized( D );
Unbind( D.field );
if Cgs(D) <> gens then
tmp := AbstractIgs( D, gens, imgs );
gens := tmp.igs;
imgs := tmp.abstractIgs;
fi;
# If range <R> is just 'rec()', try to construct the image.
if not IsBound( R.generators ) then
if 0 = Length(imgs) then
Error( "needs either range or at least one image" );
fi;
R := Group( imgs, imgs[1]^0 );
fi;
# Construct the homorphism record.
h := rec( source := D,
range := R,
domain := Mappings,
generators := gens,
genimages := imgs,
preimage := D,
image := R.operations.Subgroup( Parent(R), imgs ),
isGeneralMapping := true,
operations := AgGroupHomomorphismByImagesOps );
# check at least the given generator images <oimgs>
if not IsFpGroup(R) then
for i in [ 1 .. Length(ogens) ] do
if Image( h, ogens[i] ) <> oimgs[i] then
return GroupOps.GroupHomomorphismByImages(D,R,ogens,oimgs);
fi;
od;
fi;
return h;
end;
AgGroupHomomorphismByImagesOps.Kernel :=
AgGroupHomomorphismByImagesOps.KernelGroupHomomorphism;
I apologize for any inconvenience this error might have caused.
Alexander Hulpke