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