Daniel Ruberman writes:
Dear Gap-Forum: I have the following sort of computation which I would like
to do using GAP: I am given a finitely presented group P, a surjective
homomorphism f from P to a finite group G (given, as, say a subgroup of
a permutation group), and a subgroup H of G. I would like to compute the
abelianization of the inverse image of H under f. I realize that this
could be done using the command `AbelianInvariantsSubgroupFpGroup', once
generators have been chosen for the subgroup f^-1(H). Finding
generators is easy `by hand' starting from a transversal of f^-1(H) in P;
the question is how to find such transversal using GAP. The key point
seems to be pulling back a transversal of H in G to P. Does anyone have
any pointers on how this can be done in GAP?
Here is an example which demonstrates how you can compute the abelian
invariants of the commutator factor group of the inverse image of H
under f:
gap> # Let P be a product of a free group on 1 generator and a cyclic group gap> # of order 2. gap> P := FreeGroup( 2 ); Group( f.1, f.2 ) gap> P.relators := [ P.2^2 ];; gap> gap> # Let G be the symmetric group of degree 3. gap> G := SymmetricGroup( 3 ); Group( (1,3), (2,3) ) gap> # Ensure that G has 2 generators. gap> Length( G.generators ); 2 gap> gap> # Get in G a subgroup H of order 2. gap> H := Subgroup( G, [ (1,2) ] ); Subgroup( Group( (1,3), (2,3) ), [ (1,2) ] ) gap> gap> # Compute the permutation group PG induced by G acting on the right gap> # costets of H. gap> PG := Operation( G, Cosets( G, H ), OnRight ); Group( (1,3), (1,2) ) gap> gap> # Construct a coset table of H in G from the generators of PG which gap> # respects square relators of P. gap> T := [ ];; gap> D := [ 1 .. Maximum( List( PG.generators, LargestMovedPointPerm ) ) ]; [ 1 .. 3 ] gap> for i in [ 1 .. Length( P.generators ) ] do > g := PG.generators[i]; > T[2*i-1] := OnTuples( D, g ); > p := P.generators[i]; > if p^2 in P.relators or p^-2 in P.relators then > T[2*i] := T[2*i-1]; > else > T[2*i] := OnTuples( D, g^-1 ); > fi; > od; gap> StandardizeTable( T ); gap> Print( T, "\n" ); [ [ 2, 1, 3 ], [ 2, 1, 3 ], [ 3, 2, 1 ], [ 3, 2, 1 ] ] gap> gap> # Get a subgroup S of P, enter the coset table into its group record. gap> # and compute the abelian invariants of S/S'. gap> S := ShallowCopy( Subgroup( P, [ ] ) );; gap> S.cosetTable := T;; gap> A := AbelianInvariantsSubgroupFpGroupRrs( P, S ); [ 2, 0, 0 ]
Note that what we are doing here is not quite legal: In general, the
subgroup S which is defined by its generators is not consistent with
the coset table T associated to it (in fact, in our example S is the
trivial subgroup of P, that's why we are cautious and use the
ShallowCopy command). In deed, we make use of the fact that the
'AbelianInvariantsSubgroupFpGroup' command ignores the rest of S if a
record component S.cosetTable is given. You should use this only as a
kind of intermediate solution for your problem. In the next patch of
GAP I will change the command such that it allows the second argument
to be a coset table instead of a subgroup. Unfortunately, it is to
late to insert this change into the current release of GAP 3.4.
I would like to add another hint: Werner Nickel at Aachen is just
finishing a file 'ctpg.g' containing some functions which are useful in
the situation described above. He will put it into the directory
~ftp/pub/incoming on samson.math.rwth-aachen.de
within the next couple of days. For further details you should look
into the comments of that file.
Volkmar Felsch, Aachen