Permutation groups are so easy to input because their elements, i.e., permutations, are so easy to type: they are entered and displayed in disjoint cycle notation. So let's construct a permutation group:
gap> s8 := Group( (1,2), (1,2,3,4,5,6,7,8) ); Group( [ (1,2), (1,2,3,4,5,6,7,8) ] )We formed the group generated by the permutations
(1,2) and
(1,2,3,4,5,6,7,8), which is well known to be the symmetric group on
eight points, and assigned it to the identifier s8. Now the group
S8 contains the alternating group on eight points which can be
described in several ways, e.g., as the group of all even permutations
in s8, or as its derived subgroup.
gap> a8 := DerivedSubgroup( s8 ); Group([(1,2,3),(2,3,4),(2,4)(3,5),(2,6,4),(2,4)(5,7),(2,8,6,4)(3,5)]) gap> Size( a8 ); IsAbelian( a8 ); IsPerfect( a8 ); 20160 false trueOnce information about a group like
s8 or a8 has been computed, it
is stored in the group so that it can simply be looked up when it is
required again. This holds for all pieces of information in the
previous example. Namely, a8 stores its order and that it is
nonabelian and perfect, and s8 stores its derived subgroup a8.
Had we computed a8 as CommutatorSubgroup( s8, s8 ), however, it
would not have been stored, because it would then have been computed
as a function of two arguments, and hence one could not attribute it
to just one of them. (Of course the function CommutatorSubgroup can
compute the commutator subgroup of two arbitrary subgroups.) The
situation is a bit different for Sylow p-subgroups: The function
SylowSubgroup also requires two arguments, namely a group and a
prime p, but the result is stored in the group --- namely together
with the prime p in a list called ComputedSylowSubgroups, but we
won't dwell on the details here.
gap> syl2 := SylowSubgroup( a8, 2 );; Size( syl2 ); 64 gap> Normalizer( a8, syl2 ) = syl2; true gap> cent := Centralizer( a8, Centre( syl2 ) );; Size( cent ); 192 gap> DerivedSeries( cent );; List( last, Size ); [ 192, 96, 32, 2, 1 ]We have typed double semicolons after some commands to avoid the output of the groups (which would be printed by their generator lists). Nevertheless, the beginner is encouraged to type a single semicolon instead and study the full output. This remark also applies for the rest of this tutorial.
With the next examples, we want to calculate a subgroup of a8, then
its normalizer and finally determine the structure of the extension. We
begin by forming a subgroup generated by three commuting involutions,
i.e., a subgroup isomorphic to the additive group of the vector space
23.
gap> elab := Group( (1,2)(3,4)(5,6)(7,8), (1,3)(2,4)(5,7)(6,8), > (1,5)(2,6)(3,7)(4,8) );; gap> Size( elab ); 8 gap> IsElementaryAbelian( elab ); trueAs usual, GAP prints the group by giving all its generators. This can be annoying, especially if there are many of them or if they are of huge degree. It also makes it difficult to recognize a particular group when there already several around. Note that although it is no problem for us to specify a particular group to GAP, by using well-chosen identifiers such as
a8 and elab, it is impossible for GAP to use
these identifiers when printing a group for us, because the group does
not know which identifier(s) point to it, in fact there can be several.
In order to give a name to the group itself (rather than to the
identifier), you have to use the function SetName. We do this with the
name 2^3 here which reflects the mathematical properties of the group.
From now on, GAP will use this name when printing the group for us,
but we still cannot use this name to specify the group to GAP, because
the name does not know to which group it was assigned (after all, you
could assign the same name to several groups). When talking to the
computer, you must always use identifiers.
gap> SetName( elab, "2^3" ); elab; 2^3 gap> norm := Normalizer( a8, elab );; Size( norm ); 1344Now that we have the subgroup
norm of order 1344 and its subgroup
elab, we want to look at its factor group. But since we also want to
find preimages of factor group elements in norm, we really want to look
at the natural homomorphism defined on norm with kernel elab and
whose image is the factor group.
gap> hom := NaturalHomomorphismByNormalSubgroup( norm, elab ); <action homomorphism> gap> f := Image( hom ); Group([(),(),(),(1,2)(3,4),(1,3)(2,4),(1,2)(5,6),(3,5)(4,6),(2,3)(6,7)]) gap> Size( f ); 168The factor group is again represented as a permutation group. However, the action domain of this factor group has nothing to do with the action domain of
norm. (It only happens that both are subsets of the
natural numbers.) We can now form images and preimages under the natural
homomorphism. The set of preimages of an element under hom is a coset
modulo elab. We use the function PreImages here because hom is not
a bijection, so an element of the range can have several preimages or
none at all.
gap> ker:= Kernel( hom ); 2^3 gap> x := (1,8,3,5,7,6,2);; Image( hom, x ); (1,3,2,6,5,4,7) gap> coset := PreImages( hom, last ); RightCoset(2^3,( 2, 8, 6, 7, 3, 4, 5))Note that GAP is free to choose any representative for the coset of preimages. Of course the quotient of two representatives lies in the kernel of the homomorphism.
gap> rep:= Representative( coset ); ( 2, 8, 6, 7, 3, 4, 5) gap> x * rep^-1 in ker; trueThe factor group
f is a simple group, i.e., it has no non-trivial
normal subgroups. GAP can detect this fact, and it can then also find
the name by which this simple group is known among group theorists. (Such
names are of course not available for non-simple groups.)
gap> IsSimple( f ); IsomorphismTypeFiniteSimpleGroup( f ); true rec( series := "L", parameter := [ 2, 7 ], name := "A(1,7) = L(2,7) ~ B(1,7) = O(3,7) ~ C(1,7) = S(2,7) ~ 2A(1,7) = U(2\ ,7) ~ A(2,2) = L(3,2)" ) gap> SetName( f, "L_3(2)" );We give
f the name L_3(2) because the last part of the name string
reveals that it is isomorphic to the simple linear group L3(2). This
group, however, also has a lot of other names. Names that are connected
with a = sign are different names for the same matrix group, e.g.,
A(2,2) is the Lie type notation for the classical notation L(3,2).
Other pairs of names are connected via , these then specify other
classical groups that are isomorphic to that linear group (e.g., the
symplectic group S(2,7), whose Lie type notation would be C(1,7)).
The group norm acts on the eight elements of its normal subgroup elab
by conjugation, yielding a representation of L3(2) in s8 which
leaves one point fixed (namely point 1). The image of this
representation can be computed with the function Action; it is even
contained in the group norm and we can show that norm is indeed a
split extension of the elementary abelian group 23 with this image of
L3(2).
gap> op := Action( norm, elab ); Group( [ (), (), (), (5,6)(7,8), (5,7)(6,8), (3,4)(7,8), (3,5)(4,6), (2,3)(6,7) ] ) gap> IsSubgroup( a8, op ); IsSubgroup( norm, op ); true true gap> IsTrivial( Intersection( elab, op ) ); true gap> SetName( norm, "2^3:L_3(2)" );By the way, you should not try the operator
< instead of the function
IsSubgroup. Something like
gap> elab < a8; falsewill not cause an error, but the result does not signify anything about the inclusion of one group in another;
< tests which of the two groups is
less in some total order. On the other hand, the equality operator = in
fact does test the equality of its arguments.
GAP 4 manual