Group Identification functions in GAP =====================================
In discussions with other mathematicians I recently found out that a couple
of very helpful GAP functions do not seem to be well known, probably because
they are hidden in the manual. To change this I decided to use the forum
to give a short explanation of them.
In this mail I want to describe some identification functions for groups.
These functions compare given groups with those in one of GAPs group
libraries and identify the type up to isomorphism. This is done by
searching for properties that identify the groups uniquely rather
than searching explicitely for isomorphisms. Accordingly, the functions
are relatively fast. They don't give Isomorphisms, however. I will give
relatively short descriptions, the manual gives more information.
The first of the functions to be mentioned is 'GroupId'. It will recognize
the abstract isomorphism type of a given group. The function returns a
record with several components (depending on the group), see the manual for
further explanation. Sometimes components give the
name or other identifications. If the size of the group is at most 100, the
component 'catalogue' (of the form [size,nr]) gives the isomorphic group in
the catalogue of solvable groups of small order: SolvableGroup(size,nr). (The
only exception is A5, which is group 60/13; but obviously nonsolvable.)
If the group is a 2-group or a 3-group, the component 'pGroupId' gives the
number in Eamonn O'Brien's catalogue of 2- and 3-groups. To use this
feature also for p-groups of size>100, the ANU PQ share package must be loaded.
To get an actual isomorphism, you would need to call
The corresponding manual section is 'GroupId'.
As an example, we show that the central product of Q8 with Q8 is isomorphic
to the central product of D8 with D8:
gap> f:=FreeGroup(4); Group( f.1, f.2, f.3, f.4 ) #D8 central product D8 gap> g:=f/[f.1^4,f.2^2,f.1^f.2*f.1,f.3^4,f.4^2,f.3^f.4*f.3,f.1^2/f.3^2, > Comm(f.1,f.3),Comm(f.1,f.4),Comm(f.2,f.3),Comm(f.2,f.4)]; Group( f.1, f.2, f.3, f.4 ) gap> Size(g); 32
# GroupId does not work for finitely presented groups, as it compares elements.
# So we make a permutaton group.
catalogue := [ 32, 42 ],
names := [ "D8YD8" ],
size := 32,
pGroupId := 49 )
#Q8 central product Q8 gap> h:=f/[f.1^4,f.2^4,(f.1/f.2)^2/f.1^2,f.1^2/f.2^2, > f.3^4,f.4^4,(f.3/f.4)^2/f.3^2,f.3^2/f.4^2,f.1^2/f.3^2, > Comm(f.1,f.3),Comm(f.1,f.4),Comm(f.2,f.3),Comm(f.2,f.4)]; Group( f.1, f.2, f.3, f.4 ) gap> Size(h); 32 gap> q:=OperationCosetsFpGroup(h,TrivialSubgroup(h));; gap> GroupId(q); rec( catalogue := [ 32, 42 ], names := [ "D8YD8" ], size := 32, pGroupId := 49 )
(Finding the isomorphism using 'IsomorphismGroups' would be quite difficult
in this case, as both groups have a Frattini factor group 2^4).
The other function is 'TransitiveIdentification'. It identifies
transitive permutation groups up to conjugacy in the symmetric group and
returns the number in the catalogue of transitive groups of the same degree
(provided the degree is at most 15). Calling the corresponding group (with
'TransitiveGroup(deg,nr)') provides you with a name.
To get the conjugating permutation, one would have to embed both groups in
the symmetric group and to use 'RepresentativeOperation(Sn,group1,group2)'.
The respective manual section is 'The transitive groups library'.
As an example, we determine the conjugacy classes of maximal transitive
subgroups of S3\wr S4:
gap> g:=TransitiveGroup(12,280); [S(3)^4]A(4) = S(3) wr A(4) gap> a:=AgGroup(g);; gap> s:=SpecialAgGroup(a); Group( g7, g1, g2, g3, g5, g6, g4, g8, g9, g10, g11 ) gap> m:=ConjugacyClassesMaximalSubgroups(s);; gap> m:=List(m,Representative);; gap> m:=List(m,i->Image(a.bijection,Image(s.bijection,i)));; gap> m:=Filtered(m,i->IsTransitive(i,[1..12])); [Subgroup([S(3)^4]A(4)=S(3)wrA(4),[(1,2,3)(5,6,7)(9,10,11), (1,2)(3,4)(5,6)(7,8)(9,10)(11,12),(1,4)(2,3)(5,8)(6,7)(9,12)(10,11), (1,5)(2,6)(3,7)(4,8),(2,6)(3,7),(3,7)(4,8),(1,5,9),(2,6,10),(3,7,11), (4,8,12)]), Subgroup([S(3)^4]A(4)=S(3)wrA(4),[(1,2)(3,4)(5,6)(7,8)(9,10)(11,12), (1,4)(2,3)(5,8)(6,7)(9,12)(10,11),(1,5)(2,6)(3,7)(4,8),(2,6)(3,7),(3,7)(4,8), (3,7),(1,5,9),(2,6,10),(3,7,11),(4,8,12)])] gap> List(m,TransitiveIdentification); [ 271, 261 ] gap> List(last,i->TransitiveGroup(12,i)); [ [3^4:2^3]A(4), [S(3)^4]E(4) = S(3) wr E(4) ]
I hope these descriptions are helpful,