Main Branches

Downloads  Installation  Overview  Data Libraries  Packages  Documentation  Contacts  FAQ  GAP 3 

Frequently Asked Questions

General Obtaining GAP Installation Hardware/OS Usage Complaints Computing with GAP Programming GAP

7. Computing with GAP

7.11: How do I use GAP to "identify" a given group?

One of the most frequent requests that comes up is for to "identify" a given group. While some functionality for this exists, the problem is basically what "identify" means, or what a user expects from identification:
  • For tiny orders (say up to 15), there are few groups up to isomorphism, and each of the groups has a "natural" name. Furthermore many these names belong into series (symmetric groups, dihedral groups, cyclic groups) and the remaining groups are in obvious ways (direct product or possibly semidirect product) composed from groups named this way.
  • This clean situation breaks down quickly once the order increases: for example there are - up to isomorphism - 14 groups of order 16, 231 of order 96 and over 10 million of order 512. This rapid growth goes beyond any general "naming" or "composition" scheme.
  • A decomposition as semidirect, subdirect or central product is not uniquely defined without some further information, which can be rather extensive to write down.
  • Even if one might hope that a particular group would be composable in a nice way, this does not lead to an "obvious" description, for example the same group of order 16 could be described for example as a semidirekt product of D8 with a cyclic group of order 2 (i.e. D8:C2), or as semidirect product of Q8 with a cyclic group of order 2 (Q8:C2), or as (C2×C4):C2 (and - vice versa - the last name could be given to 4 nonisomorphic groups). In the context of matrix groups in characteristic 2, S3 is better called SL2(2), and so on.
  • There are libraries of different classes of groups (e.g. small order up to isomorphism, or transitive subgroup of Sn (for small n) up to conjugacy); these libraries typically allow to identify a given group, but the identification is just like the library call number of a book and gives little information about the group, it is mainly of use to allow recreation of the group with the identification number given as only information.
With these caveats, the following functions exist to identify groups and give them a name: StructureDescription returns a string describing the isomorphism type of a group . This string is produced recursively, trying to decompose groups as direct or semidirect products. The resulting string does not identify isomorphism types, nor is it neccessarily the most "natural" description of a group.
gap> g:=Group((1,2,3),(2,3,4));;
gap> StructureDescription(g);

Group Libraries

contains extensive libraries of "small" groups and many of these libraries allow identificatuion of a group therein. The associated library group then often comes with a name that might be appropriate.

Small Groups

The small groups library contains - amongst others - all groups of order up to 1000, except 512. For such a group IdGroup returns a list such that the group is isomorphic to SmallGroup().
gap> g:=Group((1,2,3),(2,3,4));;
gap> IdGroup(g);
[ 12, 3 ]
gap> SmallGroup(12,3);
<pc group of size 12 with 3 generators>

Transitive Groups

The transitive groups library contains transitive subgroups of Sn of degree at most 31 up to Sn conjugacy. For such a group of degree n, TransitiveIdentification returns a number , such that the group is conjugate in Sn to TransitiveGroup().
gap> g:=Group((1,2,3),(2,3,4));;
gap> TransitiveIdentification(g);
gap> TransitiveGroup(NrMovedPoints(g),4);

Primitive Groups

The primitive groups library contains primitive subgroups of Sn (i.e. the group is transitive and affords no nontrivial G-invariant partition of the points) of degree at most 1000 up to Sn conjugacy. For such a group of degree n, PrimitiveIdentification returns a number , such that the group is conjugate in Sn to PrimitiveGroup().
gap> g:=Group((1,2,3),(2,3,4));;
gap> IsPrimitive(g,[1..4]);
gap> PrimitiveIdentification(g);
gap> PrimitiveGroup(NrMovedPoints(g),1);

Simple groups and Composition Series

The one class of groups for which it is unambiguous, and comparatively easy to assign names to is finite simple groups (assuming the classification of finite simple groups). A consequence of the classification is that the order of a simple group determines its isomorphism type, with the exception of two infinite series (which can be distinguished easily otherwise). In GAP, this is achieved by the command IsomorphismTypeInfoFiniteSimpleGroup: For a finite simple group, it returns a record, containing information about the groups structure, as well as some name.
gap> g:=SL(3,5);                          
gap> IsomorphismTypeInfoFiniteSimpleGroup(g/Centre(g));
rec( name := "A(2,5) = L(3,5) ", series := "L", parameter := [ 3, 5 ] )
Clearly, this can be applied to the composition series of a finite group, identifying the isomorphism types of all composition factors. (Of course, this information does not identify the isomorphism type of the group, and - in particular for solvable groups - can be rather uninformative.) The command DisplayCompositionSeries will print information about the composition factors of a finite group.
gap> DisplayCompositionSeries(SymmetricGroup(4));
G (4 gens, size 24)
 | Z(2)
S (3 gens, size 12)
 | Z(3)
S (2 gens, size 4)
 | Z(2)
S (1 gens, size 2)
 | Z(2)
1 (0 gens, size 1)
gap> DisplayCompositionSeries(SymmetricGroup(5));
G (2 gens, size 120)
 | Z(2)
S (3 gens, size 60)
 | A(5) ~ A(1,4) = L(2,4) ~ B(1,4) = O(3,4) ~ C(1,4) = S(2,4) ~ 2A(1,4)
   = U(2,4) ~ A(1,5) = L(2,5) ~ B(1,5) = O(3,5) ~ C(1,5)
   = S(2,5) ~ 2A(1,5) = U(2,5)
1 (0 gens, size 1)
gap> DisplayCompositionSeries(GU(6,2));          
G (size 82771476480)
 | Z(3)
S (4 gens, size 27590492160)
 | 2A(5,2) = U(6,2)
S (1 gens, size 3)
 | Z(3)
1 (size 1)