Paul Igodt asks in his e-mail message of 1994/02/07
When one looks at the output of 'gp.stabilizer'.
If 'gp' is a well defined permutation group,
than one finds a record containing many "transversals".
How should these transversals be understood?
E.g. they contain often many "extra comma's".
The entries 'gp.orbit' and 'gp.transversal' belong together.
The point 'gp.orbit[1]' is called the basepoint 'bpt'.
For each 'i' in 'gp.orbit' there is an entry 'gp.transversal[i]'.
This is the reason why there can be ``extra commas'' in 'gp.transversal'.
E.g., if 'gp.orbit' is '[1,3,5,7]', then only the entries at positions
1, 3, 5, and 7 have assigned values in 'gp.transversal'.
The entry 'gp.transversal[i]' is a permutation 'p' that takes 'i' to a
point earlier in the orbit, i.e.,
'Position( gp.orbit, i ) > Position( gp.orbit, i^p )'.
Actually this is only true if 'i' is not 'bpt',
'gp.transversal[bpt]' is always the identity '()'.
So for example assume that 'gp.orbit' is '[ 3, 7, 5, 4, 8, 6 ]' and
'gp.transversal' is '[,,(),(3,4,5),(3,5,7),(6,8),(3,5,7),(5,8,7)]'.
'gp.transversal[1]' and 'gp.transversal[2]' are unbound because 1 and 2
are not in 'gp.orbit'. We can picture the structure represented by
'gp.orbit' and 'gp.transversal' as follows.
(3,5,7) (3,4,5) .--<---- 5 ----<---- 4 (3,5,7) / 3 ----<---- 7 \ `--<---- 8 ----<---- 6 (5,8,7) (6,8)
To compute a representative for a point 'i' we start with that point and
follow the path to the basepoint 'bpt' multiplying the permutations along
the edges as we go along. The result is a permuation mapping 'i' to
'bpt', so to get a representative we have to invert this.
For example, suppose we start with the point '6'. Then we multiply the permutations along the edges '(6,8) * (5,8,7) * (3,5,7) = (3,5,8,6)'. To get a representative we invert this '(3,6,8,5)'.
In GAP code this looks as follows
# we want to compute a representative for 'i' r := (); while i <> gp.orbit[1] do i := i ^ gp.transversal[i]; r := r * gp.transversal[i]; od; r := r^-1;
One can avoid the extra inversion as follows
# we want to compute a representative for 'i' r := (); while i <> gp.orbit[1] do i := i ^ gp.transversal[i]; r := LeftQuotient( gp.transversal[i], r ); od;
Note that 'LeftQuotient(<x>,<y>)' means '<x>^-1 * <y>', is sometimes
written as '<x> mod <y>', and is for permutations just as fast as an
ordinary multiplication.
Martin.
-- .- .-. - .. -. .-.. --- ...- . ... .- -. -. .. -.- .- Martin Sch"onert, Martin.Schoenert@Math.RWTH-Aachen.DE, +49 241 804551 Lehrstuhl D f"ur Mathematik, Templergraben 64, RWTH, 52056 Aachen, Germany