> < ^ Date: Wed, 09 Feb 1994 09:11:00 -0600
> < ^ From: Philip Osterlund <osterlu@s5.math.umn.edu >
> < ^ Subject: Re: on permutation group "transversals".

I have worked on some functions that, given a permutation group G, and an
element r of G, the functions produce an abstract word such that

I have worked on some functions that work with the word problem for
permutation groups. The functions are elaborations on things written by Peter
Webb. The idea of my functions is this:
Let G be a permutation group generated by [p1..pn].
Define G.abstractGenerators to be a list [a1..an] of abstract generators
Create something like the stabilizer chain, that is actually a chain of
stabilizer subgroups. To make sure that the generators do not grow
exponentially in length, make preferences in the choice of generators to those
of shortest lengths.
Given an element r of G, produce a word r1 in [p1..pn], using the
stabilizer chain in much the same way that "in" works, but keeping track of
what left transversals are multiplied together.

As a sample run, I show an example from Rubik's cube:

gap> Read("abgens2");
gap> Read("cube");
The group 'cube' represents the operations of the Rubik's cube:
           +----------+
           |  1  2  3 |
           |  4  R  5 |
           |  6  7  8 |
+----------+----------+----------+----------+
|  9 10 11 | 17 18 19 | 25 26 27 | 33 34 35 |
| 12  W 13 | 20  Y 21 | 28  B 29 | 36  G 37 |
| 14 15 16 | 22 23 24 | 30 31 32 | 38 39 40 |
+----------+----------+----------+----------+
           | 41 42 43 |
           | 44  O 45 |
           | 46 47 48 |
           +----------+
To draw the cube at any time, type 'drawcube()'.
To draw a particular permutation g, type 'DrawCube(g)'.
The cube is generated by the clockwise rotations of the sides,
R, W, Y, B, G, O for Red, White, Yellow, Blue, Green, and Orange.
They may also be referred to respectively as
top, left, front, right, rear, bottom
gap> l := [18,20,17,4,21,19,5,23,22,15,24,31,36,34,33,37,35,39,38,40];
[ 18, 20, 17, 4, 21, 19, 5, 23, 22, 15, 24, 31, 36, 34, 33, 37, 35, 39, 38,
  40 ]
gap> qube := ShallowCopy(cube);
cube
gap> qube.name := "qube";
"qube"
gap> s := Runtime();MakeAbStabChain(cube);e := Runtime();e-s;MakeAbStabChain(qube,l); Runtime()-e;
5100
53733
48633
43333
gap> ### 48.633 seconds to make the stabilizer chain for cube
gap> ### 43.333 seconds to make the stabilizer chain for qube
gap> r := Random(cube);
( 1,22,38, 9,41,48,35,16,32)( 2, 5,28,18,42,44,12,47,10,45,34,26,21, 7,23,15,
 37,39, 4,31)( 3,40,24,11,33,14,30, 6,27,46,43,17)( 8,25,19)(13,20)
gap> s := Runtime();rc := FactorPermGroupElement(cube,r);;e := Runtime();e-s;
97166
97166
0
gap> s := Runtime();rq := FactorPermGroupElement(qube,r);;e := Runtime();e-s;
97216
97216
0
gap> LengthWord(rc);
1219
gap> LengthWord(rq);
781
gap> s := Runtime();rc1 := Shrink(cube,rc);e := Runtime();e-s;
97350
G^-1*W*G^-1*O*R*O*B*G*R^-1*G^-1*O^-2*G*R*G^-1*B^-1*O^2*W*O*W^-1*R^-1*Y^-1*B*Y*\
B^-1*Y*O^-1*Y^-1*B*Y^-1*B^-1*Y*O*Y*O^-1*Y^-1*O*R*W*R^-1*Y^-1*R*W*R^-1*Y^-1*B*Y\
*B^-1*O^-1*G*R*Y*R^-1*G^-1*Y*B*G*R^-1*G^-1*Y^-1*R*W*R^-1*B*G*R*G^-1*Y^-1*W*G*W\
^-1*R*W^-1*R^-1*G^-2*O^-1*R^-1*G*R*Y*R^-1*G^-1*Y^-1*R*W^-1*R^-1*B*G*R^-1*G^-1*\
B*Y*B^-1*O^-1*B^-1*R*W*R^-1*W*G^-1*W^-1*G^-2*O^-1*Y*R^-1*Y*R*G^-1*B^-1*G*R*G^-\
1*B^-1*R*W^-1*R^-1*B^-1*G*R^-2*G^-1*W*G*W^-1*R*W^-1*R^-1*G*Y^-1*O^-2*W^-1
130833
33483
gap> ### 33.483 seconds to "Shrink" rc using cube
gap> LengthWord(rc1);
135
gap> s := Runtime();rq1 := Shrink(qube,rq);e:=Runtime();e-s;LengthWord(rq1);
130950
G^-2*O*G^-1*O^-1*B*O^-1*B^-1*O*G^-1*O^-1*B*O*B^-1*O*G*O^-2*B*O*B^-1*O*G*O^-1*B\
*O^-1*B^-1*G*B*O*B^-1*O^-1*G^-2*O*G*O^-1*G*O*G^-1*O^-1*G*B*O^-1*B^-1*G*B*O*B^-\
1*O^-1*G^-2*B*O*B^-1*O^-1*G*O*G^-1*O^-1*G*O^2*B*G^-1*B^-1*O*B*G*B^-1*O*B*O*B^-\
1*G^-1*O*B*G^-1*B^-1*O^-1*G^-1*B*O^-1*B*G^-1*O^-2*W^-1*G*W*O*W^-1*G^-2*W*B*O*W\
*O^-1*G*B*O^-1*Y*B^-1*Y^-1*O^-1*W^-1
151366
20416
107
gap> ### 20.416 seconds to "Shrink" rq using qube


You may email me for the files.
                        -Philip Osterlund

> < [top]