7.2 Decomposition of Groups Using GAP
7.2.3 Products of Groups
We can combine groups to form larger groups. The two types of combina- tions we are interested in are direct products and imprimitve wreath products, described in chapter6.
gap> wrg := WreathProduct(SymmetricGroup(IsPermGroup,3), gap> SymmetricGroup(IsPermGroup,3));
gap> dg := DirectProduct(SymmetricGroup(IsPermGroup,3), gap> SymmetricGroup(IsPermGroup,3));
Direct products of groups are intransitive. gap> IsTransitive(dg);
false
gap> orbits := Orbits(dg); [ [ 1, 2, 3 ] , [ 4, 5, 6] ]
If both orbits above are permuted by groups and the sum of the size of these two groups is equal to the size ofdgthen we have a direct product. Recall that to get the group permuting each orbit we use the following code. In practice we would use a loop here, but for the sake of explanation we have not.
gap> orbit1g := ActionHomomorphism(g,orbits[1]); gap> orbit1g := Image(orbit1g);
Group([(1,2,3),(1,2)])
gap> orbit2g := ActionHomomorphism(g,orbits[2]); gap> orbit2g := Image(orbit2g);
Group([(1,2,3),(1,2)])
Now, we check that the product of the sizes of each group is equal to the size ofdg.
gap> if Size(dg) = Size(orbit1g)*Size(orbit2g) then gap> Print("This is the direct product of 2 groups."); gap> fi;
We can now be confident that the group we are examining is the direct product of two groups. Using a loop, we can extend this to test for the direct product of any number of groups. The function DescribeDirectProducts() that does this can be found in AppendixA.
7.2 Decomposition of Groups UsingGAP
Next, we would like to decide the classification of each of the groups attained from the productdg. One example is shown here, but this can be extended to all groups using a loop and the full code is given in AppendixA. We will call the group we are working withg.
We first use IsPrimitive(g) to check whether the group is primitive or not. If this returns true then the group might be a symmetric, cyclic, dihedral, or an alternating group. If these group tests all return false then we have an unknown group. The process for dealing with these unknown groups is simply to return the generators for them to allow another program to decide on the best course of action.
If g is imprimitive then it can be a dihedral, cyclic, or a row and column group, so we first rule these out. After that, the only other possibility that we are interested in is a wreath product of groups.
Much like row and column symmetries, wreath products contain a block system. The set of blocks is a set of sets of points. Consider the wreath product
S3WrS4. This is group acting on 12 points. The points are partitioned into 4 sets of 3 points. The symmetric groupS3permutes the three points in each set, but the symmetric group S4 permutes the four sets. We call the group which acts on the individual points in each set the baseand we call the group which acts on the sets themselves thetop. In order to ensure that we are working with a known example, let us rewritegto beS3WrS4.
gap> g := WreathProduct(SymmetricGroup(IsPermGroup,3),Sym gap> metricGroup(IsPermGroup,4));
To discover thetop of the wreath product we need to compute a minimal non-trivial block in g. We know that this will beS4, so we only perform that test here, but this group could be any of the groups we have covered in this section, even another wreath product so in practice we would re-run the entire set of tests ontop.
gap> blocks := Blocks(g,[1..n]);
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ], [ 10, 11, 12 ] ] gap> topPoints := Length(blocks);
4
7.2 Decomposition of Groups UsingGAP
gap> top := Image(topAHom); Group([ (1,2,3,4), (1,2) ])
gap> IsNaturalSymmetricGroup(top); true
gap> NrMovedPoints(top); 4
Having discovered thetopof the wreath product, we now require thebase. First, we’d like to know the number of points that the base acts on. The number of base points multiplied by the number of top points equals the number of points the wreath product acts on.
gap> basePoints := NrMovedPoints(g)/topPoints; gap> 3
Next we pick a set of three points that form a block at random. Here we will use the first set for simplicity. We want to compute the stabilizer subgroup of these three points ing. This is the subgroup containing all the permutations that fix these three points ing. We can then use this stabilizer to create thebase
group.
gap> s := Stabilizer(g,blocks[1],OnSets);
gap> baseAHom := ActionHomomorphism(s,blocks[1]); gap> base := Image( baseAHom );
Group([ (1,3,2), (2,3) ])
gap> IsNaturalSymmetricGroup(base); true
gap> NrMovedPoints(base); 3
We can now do one quick final check to ensure thatgwas indeed a wreath product by comparing the sizes of the top and base withg.
gap> Size(g) = (Size(base)ˆtopPoints)*(Size(top)); true
We have now shown thatgisS3WrS4.
Using all of the process shown in the last two subsections we can create a series of GAP functions that will, given any group, return a breakdown of
7.2 Decomposition of Groups UsingGAP
products of groups if they are in the small set we have discussed in this thesis. The complete set of functions can be found in AppendixA.