GAP: How to find a (possibly non-minimal) transitive representation of a group

abstract-algebragalois-theorygapgroup-theorypermutations

I've recently fell in love with Galois Theory again and in an attempt to categorize how one could determine the Galois group of small-degree irreducible polynomials, I stumbled upon this small problem using GAP.

Since any Galois group of an $k$-degree polynomial must be a transitive subgroup of the symmetric group $S_k$, it seems natural enough that we interpret it as some permutation subgroup of $S_k$, i.e. some set of permutations on $k$ elements. As it turns out, some subgroups are intransitive for the "smallest" inclusion in $S_k$, as can be seen by the cyclic group $C_6$ having the representation
$$C_6 \cong \langle (1,2),(3,4,5)\rangle \leq S_5$$
being intransitive over $5$ elements. In contrast, we have that
$$C_6 \cong \langle (1,2,3,4,5,6)\rangle \leq S_6$$
is a transitive group on $6$ elements, i.e. the minimal representation on $5$ elements does not actually imply anything about the transitivity in another context. A similar thing happens with $D_{6} \leq S_5$ being intransitive but $D_{6} \leq S_6$ being transitive on their respective number of elements.

To clearly illustrate the problem, I implemented the example above in GAP:

gap> g:=SmallGroup(6,2)
> ;; iso := Image(MinimalFaithfulPermutationRepresentation(g))
> ; StructureDescription(g)
> ; Transitivity(iso,[1..6])
> ;
Group([(1,2),(3,4,5)])
"C6"
0

gap> g:=Group([(1,2,3,4,5,6)])
> ; StructureDescription(g)
> ; Transitivity(g,[1..6])
> ;
Group([(1,2,3,4,5,6)])
"C6"
1

You can see that while both permutation groups represent $C_6$ in some way, there is a problem with GAP choosing a representation that is "too small".

Thus, my question is the following:

Given a finite group $G$ such that there exists some $k \in \mathbb{N}$ with $G \leq S_k$, how can I use GAP to find a transitive permutation subgroup $H \leq S_l$ such that $H \cong G$ for arbitrary $l \geq k$?

Thank you to James in the comments for supplying a way of how to deal with the different transitive representations! I will try to implement it and if everything works, I will gladly accept an answer from you or the other commenters.

Best Answer

Every transitive permutation representation of our group $G$ is equivalent to the action of $G$ on the cosets of some subgroup $H$ (the stabiliser of any point). The kernel of the action is the core $H_G$ of $H$ in $G$ (that is, the intersection of all the conjugates of $H$ in $G$). So, for the representation to be faithful, we need to consider core-free subgroups $H$, those with $H_G = 1$. For some groups, such as abelian groups, the only faithful transitive permutation representation is the regular one (with $H$ itself being trivial). Therefore, in order to find all the transitive faithful permutation representations, we need to consider all the core-free subgroups $H$ of $G$. Taking one representative from each conjugacy class of core-free subgroups of $G$ will produce all the faithful transitive permutation representations of $G$.

Something like the following should work.

 AllTransReps := function( G )
    local   L;
    if not IsFinite( G ) then
            Error( "group must be finite" );
    fi;
    if IsAbelian( G ) then
            # We could also check for a quaternion group.
            return [ Image( RegularActionHomomorphism( G ) ) ];
    else
            # Get a representative from each conjugacy class of subgroups.
            L := List( ConjugacyClassesSubgroups( G ), Representative );
            # Restrict to those that are core-free.
            L := Filtered( L, H -> Size( Core( G, H ) ) = 1 );
            # Produce the action of G on the cosets of each subgroup.
            return List( L, H -> Image( FactorCosetAction( G, H ) ) );
    fi;
end;;

Try it out on a couple of examples:

gap> T := AllTransReps( SymmetricGroup( 5 ) );;
gap> ForAll( T, IsTransitive );
true
gap> Set( T, IdSmallGroup );
[ [ 120, 34 ] ]
gap> T := AllTransReps( SmallGroup( 8, 5 ) );
[ Group([ (1,2)(3,5)(4,6)(7,8), (1,3)(2,5)(4,7)(6,8), (1,4)(2,6)(3,7)(5,8) ]) ]
gap> ForAll( T, IsTransitive );
true
gap> List( T, IdSmallGroup );
[ [ 8, 5 ] ]