GAP Instructional Material

Return to Index


GAP code is shown like this.

[Press ?? to see GAP output]

You can also choose to see a page showing ALL GAP output.


Permutations and permutation groups

We begin by looking at ways to define a permutation.

Permutations

We can construct a permutation as a list of images

a:= PermList( [ 1, 3, 2, 5, 4 ] );      ??

and GAP returns the permutation in cycle notation.

We can also input permutations in cycle notation

b:= (1,2,3)(4,5);      ??

To find the image of the point 3 under a and under b use

3^a;      ??

3^b;      ??

Computing products of permutations is easy

a^2;      ??
b^3;      ??
a*b;      ??
a^(-1);      ??
a*b*a*b^(-1);      ??

If we want to see a permutation as a list of images we use ListPerm

ListPerm(a*b*a*b^(-1) );      ??

Notice that since a*b*a*b-1 only moves 1, 2, 3 then ListPerm does not return the action on the fixed points 4, 5.

Permutation groups

We input a permutation group by giving its generators

G:=Group((1,2), (1,2,3,4,5,6,7,8,9));      ??

To find the order of G is easy - there are powerful algorithms to allow one to compute in permutation groups

Order(G);      ??

We can find the primes involved in this order by finding the prime factors and then putting them in a set to remove repetitions

primes:=Set(Factors(Order(G)));      ??

Now for each prime involved we can find a Sylow p-subgroup

sylowG:= List(primes, p -> SylowSubgroup(G,p));      ??

Of course the orders of the Sylow p-subgroups are the largest powers of the primes dividing the group order

ordsylow:=List(sylowG, Order);      ??

and the product of these orders will be the order of the group

ord:=Product(ordsylow);      ??

ord = Order(G);      ??

Now G has trivial centre

Order(Centre(G));      ??

but each of its Sylow p-subgroups must have non-trivial centre

List(sylowG, g -> Order(Centre(g)));      ??

Let us find the orders of the normalizers of the Sylow p-subgroups

List(sylowG, g -> Order(Normalizer(G,g)));      ??

A well-known theorem proves that these normalizers are self-normalizing. Let us check it

List(sylowG, g -> Order(Normalizer(G,Normalizer(G,g))));      ??

We find the conjugacy classes, the number of classes and their sizes

conjclasses:=ConjugacyClasses(G);;
Length(conjclasses);
     ??

ccsizes:=List(conjclasses, Size);      ??

Choose a representative from each class

ccreps:=List(conjclasses, Representative);;

and find the index of the centralizer of each representative

indexnorm:=List(ccreps, r -> Index(G,Centralizer(G,r)));      ??

By the well-known theorem this index is equal to the number of elements in the conjugacy class. We check this

ccsizes = indexnorm;      ??

Investigating a permutation group

Let us input a permutation group

G:= Group([ (1,2,3,4,5,6,7,8,9,10,11), (3,7,11,8)(4,10,5,6) ]);      ??

What can we say about G. First we could find its order.

Order(G);      ??

Now those who recognise this number will guess straight away what the group is. We will investigate further by looking at a composition series for the group

CompositionSeries(G);      ??

Now we see immediately that G is simple. We could check this directly

IsSimple(G);      ??

We can see what this simple group is by displaying its composition series

DisplayCompositionSeries(G);      ??


A perfect permutation group

Let us input an unknown group of permutations

G:=Group((1,2)(4,5), (2,3,4),
(6,7,10,8)(9,12,11,13)(14,18,16,19)(15,20,17,21)(22,24,
23,25)(26,29,28,27),
(6,9,7)(8,10,11)(12,14,15)(13,16,17)(18,21,22)(19,20,
23)(24,26,27)(25,28,29));
     ??

To get some information about the group we find its order and display its composition series

Order(G);      ??

DisplayCompositionSeries(G);      ??

It is clear that the group is not simple. Is it perfect?

IsPerfect(G);      ??

Since it is perfect we may be able to identify it in the perfect groups library. Let us first see how many perfect groups there are of order 7200

NumberPerfectGroups(7200);      ??

PerfectGroup(7200,1);      ??

PerfectGroup(7200,2);      ??

We now have to identify which of these two groups G is. In fact it is easy because GAP will make the identification for us.

PerfectIdentification(G);      ??

This shows that our group G is the first of the two perfect groups of order 7200.

We could make the identification in other ways. Notice that it is only necessary to decide that one of these two groups is not G for us to identify G as the other.

The perfect groups library stores groups as finitely presented groups. We convert them to permutation groups.

P1:=PerfectGroup(IsPermGroup,7200,1);      ??

P2:=PerfectGroup(IsPermGroup,7200,2);      ??

Now we can see that they have different numbers of conjugacy classes

conjclP1:=ConjugacyClasses(P1);;
Length(conjclP1);
     ??

conjclP2:=ConjugacyClasses(P2);;
Length(conjclP2);
     ??

Checking the number of conjugacy classes of G will identify it

conjclG:=ConjugacyClasses(G);;
Length(conjclG);
     ??

We could also ask for more information about the two perfect groups of order 7200

DisplayInformationPerfectGroups(7200,1);      ??

DisplayInformationPerfectGroups(7200,2);      ??

and use this information to identify which group G is.

Here is another way to distinguish the two perfect groups of order 7200, and hence identify G

nsubgpsP1:=NormalSubgroups(P1);      ??

Length(nsubgpsP1);      ??

nsubgpsP2:=NormalSubgroups(P2);      ??

Length(nsubgpsP2);      ??

nsubgpsG:=NormalSubgroups(G);      ??

Length(nsubgpsG);      ??

Now G is isomorphic to P1. Let us look again at the structure of P1

DisplayInformationPerfectGroups(7200,1);      ??

We see that the group is the direct product of SL(2,5) and A5. Let us check this by finding these subgroups in P1.

nsubgpsP1:=NormalSubgroups(P1);      ??

List(nsubgpsP1, Size);      ??

To identify which is A5 is easy - it must be the normal subgroup of order 60. However there are two subgroups of order 120 and we don't know which is SL(2,5). We check to find the perfect subgroups

List(nsubgpsP1, IsPerfect);      ??

So the second and fifth normal subgroups in the list are the ones we want

N1:= nsubgpsP1[2];      ??

N2:= nsubgpsP1[5];      ??

Let us see if we can get a simpler generating set for N2

genN2:=SmallGeneratingSet(N2);      ??

N2:=Group(genN2);      ??

genN1:=GeneratorsOfGroup(N1);      ??

If G is the direct product then G = N1  cross N2 and N1  intersect N2 is trivial. Let us check this.

First we have to create a list of the generators of N1 whch GAP will allow us to change. Reasonably enough GAP will not let us change its standard generators for N1 .

gen:= ShallowCopy(genN1);      ??

Then add the generators of N2 to it

Append(gen, genN2);

Then check if the union of the two generating sets generates the whole group

prod:=Group(gen);      ??

Size(prod);      ??

Finally we check that N1 and N2 have trivial intersection.

int:= Intersection(N1,N2);      ??

Size(int);      ??

Note that we could have found the perfect normal subgroups of P1 in the following way

Filtered(nsubgpsP1, x-> IsPerfect(x)=true);      ??

There is a problem here because the trivial group and the whole group are perfect. We can eliminate these

N:=Filtered(nsubgpsP1, x-> (IsPerfect(x)=true) and
(Size(x) > 1) and (Size(x) < 7200));
     ??

and are left with the two subgroups we want, N[1] and N[2], and we could then proceed as before.


JOC/EFR January 2003



Home   |   Members   |   Pre-prints   |   Library   |   Reports   |   Seminars   |   Conferences   |   Research   |   Publicity   |  Pictures   |   GAP   |   Webmail