5. Stabilization and Strong Generating Sets

A second essential tool to analyze a group of permutations is the concept of stability.

Given a permutation, there can be points that are not moved:

In[103]:=

StablePoints[Images[{3, 2, 1, 4, 6, 5, 7}], 7]

Out[103]=

{2, 4, 7}

Of course, points over the degree of the permutation are not moved:

In[104]:=

StablePoints[Images[{3, 2, 1, 4, 6, 5, 7}], 10]

Out[104]=

{2, 4, 7, 8, 9, 10}

Given a generating set GS and a list of points, we call pointwise stabilizer of those points to the subset of GS such that none of the permutations in the subset moves none of the points in the list:

In[105]:=

Stabilizer[{1, 3}, GenSet[Perm[{1, 2, 3, 5, 4}], Perm[{1, 2, 4, 3, 5}], Perm[{3, 2, 1, 4, 5}]]]

Out[105]=

GenSet[Perm[{1, 2, 3, 5, 4}]]

There is a different concept, that of set-stabilization, requiring that points do not leave the set, though they can move:

In[106]:=

SetStabilizer[{1, 3}, GenSet[Perm[{1, 2, 3, 5, 4}], Perm[{1, 2, 4, 3, 5}], Perm[{3, 2, 1, 4, 5}]]]

Out[106]=

GenSet[Perm[{1, 2, 3, 5, 4}], Perm[{3, 2, 1, 4, 5}]]

The stabilizer of a group S is a subgroup. However, the stabilizer of a generating set of S is not necessarily a generating set of the subgroup. To solve that problem, Sims introduced the concept of strong generating set: we give a pair formed by a list of points B={b_1, ..., b_k} (called "base") and a generating set GS of the group. The generating set is strong with respect to that base if 1) the stabilizer S(b_1,...,b_m) of any sorted sublist {b_1, ..., b_m}, with mk, can be generated by a subset of the permutations in GS, and 2) no permutation in GS fixes all points in the base. The order of points in the base is relevant. This allows us to form a hierarchy of subgroups: S = S() ⊇ S(b_1) ⊇ S(b_1,b_2) ⊇ ... ⊇ S(b_1,...,b_k) = {ID}.

Hierarchy of subgroups associated to a simple strong generating set:

In[107]:=

StabilizerChain[StrongGenSet[{1, 3}, GenSet[Perm[{2, 1, 3, 4}], Perm[{1, 2, 4, 3}], Perm[{3, 4, 1, 2}]]]]//ColumnForm

Out[107]=

StrongGenSet[{1,3},GenSet[Perm[{2,1,3,4}],Perm[{1,2,4,3}],Perm[{3,4,1,2}]]]
StrongGenSet[{3},GenSet[Perm[{1,2,4,3}]]]
StrongGenSet[{},GenSet[]]

Strong generating sets can be calculated from a generating set using the Schreier-Sims algorithm. Example taken from Butler's book:

In[108]:=

a = Cycles[{1, 8, 9}, {2, 11, 15}, {3, 10, 12}, {4, 14, 19}, {5, 16, 17}, {6, 21, 20}, {7, 13, 18}] ;

b = Cycles[{9, 18, 20}, {12, 19, 17}] ;

c = Cycles[{10, 21, 11}, {13, 16, 14}] ;

In[111]:=

GS = GenSet[a, b, c] ;

In[112]:=

myTiming[SGS = SchreierSims[{}, GS]]

0.566673 Second

Out[112]=

We can give several initial points of the base. Using MathLink is faster, but always returns the result in Images notation:

In[113]:=

myTiming[SGS2 = SchreierSims[{8}, GS, 21, MathLink→True]]

0.004246 Second

Out[113]=

We can also change the base points of a given SGS. This typically introduces many redundant generators and additional points in the base:

In[114]:=

BaseChange[SGS2, {9, 10}]

Out[114]=

In[115]:=

SGS3 = DeleteRedundantGenerators[%]

Out[115]=

Once we have the SGS we can solve any question related to the group:

In[116]:=

StabilizerChain[SGS]//ColumnForm

Out[116]=

StrongGenSet[{9,10,8,2,1,12},GenSet[Cycles[{1,8,9},{2,11,15},{3,10,12},{4,14,19},{5,16,17},{6,21,20},{7,13,18}],Cycles[{9,18,20},{12,19,17}],Cycles[{10,21,11},{13,16,14}],Cycles[{8,13,21},{10,14,16}],Cycles[{8,16,11},{13,14,21}],Cycles[{2,3,6},{4,7,5}],Cycles[{1,7,6},{3,4,5}],Cycles[{12,20,15},{17,19,18}]]]
StrongGenSet[{10,8,2,1,12},GenSet[Cycles[{10,21,11},{13,16,14}],Cycles[{8,13,21},{10,14,16}],Cycles[{8,16,11},{13,14,21}],Cycles[{2,3,6},{4,7,5}],Cycles[{1,7,6},{3,4,5}],Cycles[{12,20,15},{17,19,18}]]]
StrongGenSet[{8,2,1,12},GenSet[Cycles[{8,16,11},{13,14,21}],Cycles[{2,3,6},{4,7,5}],Cycles[{1,7,6},{3,4,5}],Cycles[{12,20,15},{17,19,18}]]]
StrongGenSet[{2,1,12},GenSet[Cycles[{2,3,6},{4,7,5}],Cycles[{1,7,6},{3,4,5}],Cycles[{12,20,15},{17,19,18}]]]
StrongGenSet[{1,12},GenSet[Cycles[{1,7,6},{3,4,5}],Cycles[{12,20,15},{17,19,18}]]]
StrongGenSet[{12},GenSet[Cycles[{12,20,15},{17,19,18}]]]
StrongGenSet[{},GenSet[]]

In[117]:=

OrderOfGroup/@{SGS, SGS2, SGS3}

Out[117]=

{27783, 27783, 27783}

In[118]:=

PermMemberQ[Permute[a, b, c], SGS]

Out[118]=

True

In[119]:=

PermMemberQ[Cycles[{1, 2}], SGS]

Out[119]=

False

A permutation in the group can be uniquely decomposed according to the chain of stabilizers:

In[120]:=

perm = Permute[a, b, c]

Out[120]=

Cycles[{1, 8, 18, 7, 16, 12, 3, 21, 9}, {2, 10, 19, 4, 13, 20, 6, 11, 15}, {5, 14, 17}]

In[121]:=

PermWord[perm, SGS]

Out[121]=

{Cycles[], ID, ID, Cycles[{2, 3, 6}, {4, 7, 5}], ID, Cycles[{8, 13, 21}, {10, 14, 16}], Cycles[{1, 8, 9}, {2, 11, 15}, {3, 10, 12}, {4, 14, 19}, {5, 16, 17}, {6, 21, 20}, {7, 13, 18}]}

In[122]:=

perm === Permute @@ %

Out[122]=

True

or identified from its base images:

In[123]:=

OnPoints[SGS[[1]], perm]

Out[123]=

{1, 19, 18, 10, 8, 3}

In[124]:=

perm === FromBaseImage[%, SGS]

Out[124]=

True

Not every list of images defines a permutation:

In[125]:=

Catch @ FromBaseImage[{1, 2, 3, 4, 5, 6}, SGS]

FromBaseImage :: noimgs : Invalid list of images  {1, 2, 3, 4, 5, 6} .

As we said, there is a one to one correspondence between base images and permutations in a group:

In[126]:=

AllBaseImages[StrongGenSet[{1, 3}, GenSet[-Cycles[{1, 2}], -Cycles[{3, 4}], Cycles[{1, 3}, {2, 4}]]]]//ColumnForm

Out[126]=

{1,3}→ID
{1,4}→-Cycles[{3,4}]
{2,3}→-Cycles[{1,2}]
{2,4}→Cycles[{1,2},{3,4}]
{3,1}→Cycles[{1,3},{2,4}]
{3,2}→-Cycles[{1,3,2,4}]
{4,1}→-Cycles[{1,4,2,3}]
{4,2}→Cycles[{1,4},{2,3}]

StablePoints                Points that are not moved by a permutation
NonStablePoints                Construct a base for a group
Stabilizer                    Subset of permutations that do not move a list of points
SetStabilizer                Subset of permutations that do not move a list of points within a set
StabilizerChain                Chain of stabilizers of a Strong Generating Set
StrongGenSet                Head for a Strong Generating Set
SchreierSims                Algorithm to compute a SGS from a GS
BaseChange                    Change base of a SGS
DeleteRedundantGenerators    Drop unnecessary permutations in a SGS
JoinSGS                        Form SGS for product group
OrderOfGroup                Compute order of group described by a SGS
PermMemberQ                    Check whether a permutation belongs to a group described by a SGS
PermWord                    Decompose a permutation as a unique product of coset representatives in a SGS hierarchy
FromBaseImage                Construct the unique permutation associated to a list of base images
AllBaseImages                List all possible base images and their corresponding permutations

Strong Generating Sets.

The main idea behind the Schreier-Sims algorithm is that of "backtrack search". Using the one-to-one mapping between permutations and base images, it is possible to organize all permutations in a group in a tree whose nodes are the possible images of the points in the base. The Schreier vectors allow us to traverse the tree up and down, and the identification between cosets and points of orbits allows us to discard all leaves of the tree below a given node by testing just a single leave. See Butler's book for full details.

The function Search implements backtracking to search for a SGS of a subgroup of a given group:

In[127]:=

? Search

For instance, let us suppose we start from the group S_4.

In[128]:=

SGS = StrongGenSet[{1, 2, 3}, GenSet[Cycles[{1, 2}], Cycles[{2, 3}], Cycles[{3, 4}], Cycles[{1, 4}]]] ;

and we want to find a sgs for the subgroup of permutations commuting with permutation z (the so-called centralizer of z):

In[129]:=

z = Cycles[{1, 3}, {2, 4}] ;

We define the property P identifying the permutations commuting with z:

In[130]:=

P[perm_] := PermEqual[Permute[z, perm], Permute[perm, z]]

In[131]:=

P[Cycles[{1, 2}, {3, 4}]]

Out[131]=

True

In[132]:=

P[Cycles[{1, 2}]]

Out[132]=

False

The first stabilizer in the chain coincides with the group itself and so we search for the first stabilizer of the subgroup of SGS obeying property P:

In[133]:=

Search[SGS, P, 1, StrongGenSet[{}, GenSet[]], xPermVerbose→True]

Branching over points  {3, 4}

Generate at level 3 with i=4. We have list  {1, 2, 3}  and permutation ID

Generate at level 3 with i=4. We have list  {1, 2, 4}  and permutation Cycles[{3, 4}]

Branching over points  {2, 3, 4}

Generate at level 2 with i=4. We have list  {1, 3, 2}  and permutation Cycles[{2, 3}]

Generate at level 2 with i=4. We have list  {1, 3, 4}  and permutation Cycles[{2, 3, 4}]

Generate at level 2 with i=4. We have list  {1, 4, 2}  and permutation Cycles[{2, 4, 3}]

Generate at level 2 with i=4. We have list  {1, 4, 3}  and permutation Cycles[{2, 4}]

  Added permutation Cycles[{2, 4}]

Branching over points  {1, 2, 4, 3}

Generate at level 1 with i=4. We have list  {2, 1, 3}  and permutation Cycles[{1, 2}]

Generate at level 1 with i=4. We have list  {2, 1, 4}  and permutation Cycles[{1, 2}, {3, 4}]

  Added permutation Cycles[{1, 2}, {3, 4}]

Out[133]=

StrongGenSet[{1, 2, 3}, GenSet[Cycles[{2, 4}], Cycles[{1, 2}, {3, 4}]]]

We see that we have tested 8 permutations in a group of order 24. Only 2 of those 8 form the final sgs of the centralizer, which has order 8:

In[134]:=

OrderOfGroup[%]

Out[134]=

8

Clean up:

In[135]:=

Clear[SGS, z, P, a, b, c]

Search                Compute subgroup of permutations obeying a given property

Search subgroups.


Created by Mathematica  (May 16, 2008) Valid XHTML 1.1!