GAP routine for computing orbits of cosets.

145 Views Asked by At

Let $G=N{.}Q$ be an extension with N nonabelian. I act $N$ on the coset $Ng$, g is a lifting for a class representative $q \in Q$, to get say $l$ orbits. Now I act the centralizer $C_Q(q)$ on the set of $l$ orbits to get say $t$ orbits. How do I write a GAP routine to find these orbits. The action is by conjugation.

1

There are 1 best solutions below

5
On BEST ANSWER

You first need to write down how the action happens. Let $ng\in Ng$, and $c\in G$ such that $Nc\in C_{G/N}(g)$. Then $$ (ng)^c=n^cg^c=n^c c^{-1} g c g^{-1} g= \left(n^c [c,g^{-1}]\right) g $$

So that is the action we need to implement. It probably is easiest to represent coset elements by their $N$-part. Then, one can implement this action as follows, using the above formula. Assume that g is already defined as representative. Then define

OngCosetElems:=function(n,c)
  return n^c*Comm(c,Inverse(g));
end;

and for example (here the centralizer preimage is the whole group):

gap> G:=SymmetricGroup(5);;N:=DerivedSubgroup(G);
Alt( [ 1 .. 5 ] )
gap> g:=(1,2);;
gap> e:=Elements(N);;
gap> o:=OrbitsDomain(G,e,OngCosetElems);
[ [ (), (1,2,3), (1,2)(3,4), (1,3,2), (1,2)(4,5), (1,2,4), (1,5,2),(1,2)(3,5), (1,4,2), (1,2,5) ],
  [ (3,4,5), (1,4,5,2,3), (2,5)(3,4), (1,3,2,4,5), (2,3)(4,5), (1,5)(3,4),(1,3,5,2,4), (1,5,2,3,4), (1,3)(4,5), (2,4)(3,5), (1,4,2,3,5),(1,3,4,2,5), (1,5,2,4,3), (1,4)(3,5), (3,5,4), (1,4,3,2,5),(1,4,2,5,3), (1,5,4,2,3), (1,3,2,5,4), (1,5,3,2,4) ],
  [ (2,3,4), (1,2,3,4,5), (1,3,4), (1,3,4,5,2), (1,2,4,5,3), (2,4,5),(1,4,3,5,2), (1,4,5,3,2), (2,3,5), (1,4,5), (2,5,4), (1,2,4,3,5), (1,4)(2,5), (1,3,5), (1,3)(2,5), (1,5)(2,3), (1,5,4), (1,3,5,4,2),(2,5,3), (1,5)(2,4), (1,3)(2,4), (2,4,3), (1,5,3), (1,2,3,5,4),(1,4)(2,3), (1,4,3), (1,5,3,4,2), (1,2,5,3,4), (1,2,5,4,3),(1,5,4,3,2) ] ]
gap> List(o,Length);
[ 10, 20, 30 ]

Instead of using a global variable for g you might find it convenient to create the action function by a function. We also cache $g^{-1}$:

CosetActFunctionCreator:=function(g)
local gi;
  gi:=Inverse(g);
  return function(n,c)
    return n^c*Comm(c,gi);
  end;
end;

and then use:

gap> o:=OrbitsDomain(G,e,CosetActFunctionCreator(g));

Of course in the orbit algorithm, always the same few elements c act, and one could thus cache the commutators. Furthermore, it would be helpful for performance to consider $N$-orbits first, but this quickly gets more difficult.