<html><head><title>[ref] 48 Group Libraries</title></head> <body text="#000000" bgcolor="#ffffff"> [<a href="../index.htm">Top</a>] [<a href = "chapters.htm">Up</a>] [<a href ="CHAP047.htm">Previous</a>] [<a href ="CHAP049.htm">Next</a>] [<a href = "theindex.htm">Index</a>] <h1>48 Group Libraries</h1><p> <P> <H3>Sections</H3> <oL> <li> <A HREF="CHAP048.htm#SECT001">Basic Groups</a> <li> <A HREF="CHAP048.htm#SECT002">Classical Groups</a> <li> <A HREF="CHAP048.htm#SECT003">Conjugacy Classes in Classical Groups</a> <li> <A HREF="CHAP048.htm#SECT004">Constructors for Basic Groups</a> <li> <A HREF="CHAP048.htm#SECT005">Selection Functions</a> <li> <A HREF="CHAP048.htm#SECT006">Transitive Permutation Groups</a> <li> <A HREF="CHAP048.htm#SECT007">Small Groups</a> <li> <A HREF="CHAP048.htm#SECT008">Finite Perfect Groups</a> <li> <A HREF="CHAP048.htm#SECT009">Primitive Permutation Groups</a> <li> <A HREF="CHAP048.htm#SECT010">Index numbers of primitive groups</a> <li> <A HREF="CHAP048.htm#SECT011">Irreducible Solvable Matrix Groups</a> <li> <A HREF="CHAP048.htm#SECT012">Irreducible Maximal Finite Integral Matrix Groups</a> </ol><p> <p> When you start <font face="Gill Sans,Helvetica,Arial">GAP</font>, it already knows several groups. Currently <font face="Gill Sans,Helvetica,Arial">GAP</font> initially knows the following groups: <ul> <li> some basic groups, such as cyclic groups or symmetric groups (see <a href="CHAP048.htm#SECT001">Basic Groups</a>), <li> Classical matrix groups (see <a href="CHAP048.htm#SECT002">Classical Groups</a>), <li> the transitive permutation groups of degree at most 30 (see <a href="CHAP048.htm#SECT006">Transitive permutation groups</a>), <li> a library of groups of small order (see <a href="CHAP048.htm#SECT007">Small Groups</a>), <li> the finite perfect groups of size at most 10<sup>6</sup> (excluding 11 sizes) (see <a href="CHAP048.htm#SECT008">Finite perfect groups</a>). <li> the primitive permutation groups of degree < 2499 (see <a href="CHAP048.htm#SECT009">Primitive permutation groups</a>), <li> the irreducible solvable subgroups of <i>GL</i>(<i>n</i>,<i>p</i>) for <i>n</i> > 1 and <i>p</i><sup><i>n</i></sup> < 256 (see <a href="CHAP048.htm#SECT011">Irreducible Solvable Matrix Groups</a>), <li> the irreducible maximal finite integral matrix groups of dimension at most 31 (see <a href="CHAP048.htm#SECT012">Irreducible Maximal Finite Integral Matrix Groups</a>), </ul> <p> There is usually no relation between the groups in the different libraries and a group may occur in different libraries in different incarnations. <p> Note that a system administrator may choose to install all, or only a few, or even none of the libraries. So some of the libraries mentioned below may not be available on your installation. <p> <p> <h2><a name="SECT001">48.1 Basic Groups</a></h2> <p><p> There are several infinite families of groups which are parametrized by numbers. <font face="Gill Sans,Helvetica,Arial">GAP</font> provides various functions to construct these groups. The functions always permit (but do not require) one to indicate a filter (see <a href="CHAP013.htm#SECT002">Filters</a>), for example <code>IsPermGroup</code>, <code>IsMatrixGroup</code> or <code>IsPcGroup</code>, in which the group shall be constructed. There always is a default filter corresponding to a ``natural'' way to describe the group in question. Note that not every group can be constructed in every filter, there may be theoretical restrictions (<code>IsPcGroup</code> only works for solvable groups) or methods may be available only for a few filters. <p> Certain filters may admit additional hints. For example, groups constructed in <code>IsMatrixGroup</code> may be constructed over a specified field, which can be given as second argument of the function that constructs the group; The default field is <code>Rationals</code>. <p> <a name = "SSEC001.1"></a> <li><code>TrivialGroup( [</code><var>filter</var><code>] ) F</code> <p> constructs a trivial group in the category given by the filter <var>filter</var>. If <var>filter</var> is not given it defaults to <code>IsPcGroup</code>. <p> <pre> gap> TrivialGroup(); <pc group of size 1 with 0 generators> gap> TrivialGroup( IsPermGroup ); Group(()) </pre> <p> <a name = "SSEC001.2"></a> <li><code>CyclicGroup( [</code><var>filt</var><code>, ]</code><var>n</var><code> ) F</code> <p> constructs the cyclic group of size <var>n</var> in the category given by the filter <var>filt</var>. If <var>filt</var> is not given it defaults to <code>IsPcGroup</code>. <p> <pre> gap> CyclicGroup(12); <pc group of size 12 with 3 generators> gap> CyclicGroup(IsPermGroup,12); Group([ (1,2,3,4,5,6,7,8,9,10,11,12) ]) gap> matgrp1:= CyclicGroup( IsMatrixGroup, 12 ); <matrix group of size 12 with 1 generators> gap> FieldOfMatrixGroup( matgrp1 ); Rationals gap> matgrp2:= CyclicGroup( IsMatrixGroup, GF(2), 12 ); <matrix group of size 12 with 1 generators> gap> FieldOfMatrixGroup( matgrp2 ); GF(2) </pre> <p> <a name = "SSEC001.3"></a> <li><code>AbelianGroup( [</code><var>filt</var><code>, ]</code><var>ints</var><code> ) F</code> <p> constructs an abelian group in the category given by the filter <var>filt</var> which is of isomorphism type <i>C</i><sub><i>ints</i>[1]</sub> * <i>C</i><sub><i>ints</i>[2]</sub> * …* <i>C</i><sub><i>ints</i>[<i>n</i>]</sub>. <var>ints</var> must be a list of positive integers. If <var>filt</var> is not given it defaults to <code>IsPcGroup</code>. The generators of the group returned are the elements corresponding to the integers in <var>ints</var>. <p> <pre> gap> AbelianGroup([1,2,3]); <pc group of size 6 with 3 generators> </pre> <p> <a name = "SSEC001.4"></a> <li><code>ElementaryAbelianGroup( [</code><var>filt</var><code>, ]</code><var>n</var><code> ) F</code> <p> constructs the elementary abelian group of size <var>n</var> in the category given by the filter <var>filt</var>. If <var>filt</var> is not given it defaults to <code>IsPcGroup</code>. <p> <pre> gap> ElementaryAbelianGroup(8192); <pc group of size 8192 with 13 generators> </pre> <p> <a name = "SSEC001.5"></a> <li><code>DihedralGroup( [</code><var>filt</var><code>, ]</code><var>n</var><code> ) F</code> <p> constructs the dihedral group of size <var>n</var> in the category given by the filter <var>filt</var>. If <var>filt</var> is not given it defaults to <code>IsPcGroup</code>. <p> <pre> gap> DihedralGroup(10); <pc group of size 10 with 2 generators> </pre> <p> <a name = "SSEC001.6"></a> <li><code>ExtraspecialGroup( [</code><var>filt</var><code>, ]</code><var>order</var><code>, </code><var>exp</var><code> ) F</code> <p> Let <var>order</var> be of the form <i>p</i><sup>2<i>n</i>+1</sup>, for a prime integer <i>p</i> and a positive integer <i>n</i>. <code>ExtraspecialGroup</code> returns the extraspecial group of order <var>order</var> that is determined by <var>exp</var>, in the category given by the filter <var>filt</var>. <p> If <i>p</i> is odd then admissible values of <var>exp</var> are the exponent of the group (either <i>p</i> or <i>p</i><sup>2</sup>) or one of <code>'+'</code>, <code>"+"</code>, <code>'-'</code>, <code>"-"</code>. For <i>p</i> = 2, only the above plus or minus signs are admissible. <p> If <var>filt</var> is not given it defaults to <code>IsPcGroup</code>. <p> <pre> gap> ExtraspecialGroup( 27, 3 ); <pc group of size 27 with 3 generators> gap> ExtraspecialGroup( 27, '+' ); <pc group of size 27 with 3 generators> gap> ExtraspecialGroup( 8, "-" ); <pc group of size 8 with 3 generators> </pre> <p> <a name = "SSEC001.7"></a> <li><code>AlternatingGroup( [</code><var>filt</var><code>, ]</code><var>deg</var><code> ) F</code> <li><code>AlternatingGroup( [</code><var>filt</var><code>, ]</code><var>dom</var><code> ) F</code> <p> constructs the alternating group of degree <var>deg</var> in the category given by the filter <var>filt</var>. If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>. In the second version, the function constructs the alternating group on the points given in the set <var>dom</var> which must be a set of positive integers. <p> <pre> gap> AlternatingGroup(5); Alt( [ 1 .. 5 ] ) </pre> <p> <a name = "SSEC001.8"></a> <li><code>SymmetricGroup( [</code><var>filt</var><code>, ]</code><var>deg</var><code> ) F</code> <li><code>SymmetricGroup( [</code><var>filt</var><code>, ]</code><var>dom</var><code> ) F</code> <p> constructs the symmetric group of degree <var>deg</var> in the category given by the filter <var>filt</var>. If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>. In the second version, the function constructs the symmetric group on the points given in the set <var>dom</var> which must be a set of positive integers. <p> <pre> gap> SymmetricGroup(10); Sym( [ 1 .. 10 ] ) </pre> <p> Note that permutation groups provide special treatment of symmetric and alternating groups, see <a href="CHAP041.htm#SECT003">Symmetric and Alternating Groups</a>. <p> <a name = "SSEC001.9"></a> <li><code>MathieuGroup( [</code><var>filt</var><code>, ]</code><var>degree</var><code> ) F</code> <p> constructs the Mathieu group of degree <var>degree</var> in the category given by the filter <var>filt</var>, where <var>degree</var> must be in { 9, 10, 11, 12, 21, 22, 23, 24 }. If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>. <p> <pre> gap> MathieuGroup( 11 ); Group([ (1,2,3,4,5,6,7,8,9,10,11), (3,7,11,8)(4,10,5,6) ]) </pre> <p> <a name = "SSEC001.10"></a> <li><code>SuzukiGroup( [</code><var>filt</var><code>, ] </code><var>q</var><code> ) F</code> <a name = "SSEC001.10"></a> <li><code>Sz( [</code><var>filt</var><code>, ] </code><var>q</var><code> ) F</code> <p> Constructs a group isomorphic to the Suzuki group Sz( <var>q</var> ) over the field with <var>q</var> elements, where <var>q</var> is a non-square power of 2. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the Suzuki group itself. <p> <pre> gap> SuzukiGroup( 32 ); Sz(32) </pre> <p> <a name = "SSEC001.11"></a> <li><code>ReeGroup( [</code><var>filt</var><code>, ] </code><var>q</var><code> ) F</code> <a name = "SSEC001.11"></a> <li><code>Ree( [</code><var>filt</var><code>, ] </code><var>q</var><code> ) F</code> <p> Constructs a group isomorphic to the Ree group 2<i>G</i>2(<i>q</i>) where <i>q</i>=3<sup>1+2<i>m</i></sup> for <i>m</i> a non-negative integer. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code> and the generating matrices are based on <a href="biblio.htm#KLM01"><cite>KLM01</cite></a>. (No particular choice of a generating set is guaranteed.) <p> <pre> gap> ReeGroup( 27 ); Ree(27) </pre> <p> <p> <h2><a name="SECT002">48.2 Classical Groups</a></h2> <p><p> The following functions return classical groups. For the linear, symplectic, and unitary groups (the latter in dimension at least 3), the generators are taken from <a href="biblio.htm#Tay87"><cite>Tay87</cite></a>; for the unitary groups in dimension 2, the isomorphism of <i>SU</i>(2,<i>q</i>) and <i>SL</i>(2,<i>q</i>) is used, see for example <a href="biblio.htm#Hup67"><cite>Hup67</cite></a>. The generators of the orthogonal groups are taken from <a href="biblio.htm#IshibashiEarnest94"><cite>IshibashiEarnest94</cite></a> and <a href="biblio.htm#KleidmanLiebeck90"><cite>KleidmanLiebeck90</cite></a>, except that the generators of the orthogonal groups in odd dimension in even characteristic are constructed via the isomorphism to a symplectic group, see for example <a href="biblio.htm#Car72a"><cite>Car72a</cite></a>. <p> For symplectic and orthogonal matrix groups returned by the functions described below, the invariant bilinear form is stored as the value of the attribute <code>InvariantBilinearForm</code> (see <a href="CHAP042.htm#SSEC004.1">InvariantBilinearForm</a>). Analogously, the invariant sesquilinear form defining the unitary groups is stored as the value of the attribute <code>InvariantSesquilinearForm</code> (see <a href="CHAP042.htm#SSEC004.3">InvariantSesquilinearForm</a>). The defining quadratic form of orthogonal groups is stored as the value of the attribute <code>InvariantQuadraticForm</code> (see <a href="CHAP042.htm#SSEC004.5">InvariantQuadraticForm</a>). <p> <a name = "SSEC002.1"></a> <li><code>GeneralLinearGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>R</var><code> ) F</code> <a name = "SSEC002.1"></a> <li><code>GL( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>R</var><code> ) F</code> <li><code>GeneralLinearGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <li><code>GL( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> The first two forms construct a group isomorphic to the general linear group GL( <var>d</var>, <var>R</var> ) of all <i>d</i> ×<i>d</i> matrices that are invertible over the ring <var>R</var>, in the category given by the filter <var>filt</var>. <p> The third and the fourth form construct the general linear group over the finite field with <var>q</var> elements. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the general linear group as a matrix group in its natural action (see also <a href="CHAP042.htm#SSEC003.2">IsNaturalGL</a>, <a href="CHAP042.htm#SSEC005.4">IsNaturalGLnZ</a>). <p> Currently supported rings <var>R</var> are finite fields, the ring <code>Integers</code>, and residue class rings <code>Integers mod </code><var>m</var><code></code>. <p> <pre> gap> GL(4,3); GL(4,3) gap> GL(2,Integers); GL(2,Integers) gap> GL(3,Integers mod 12); GL(3,Z/12Z) </pre> <p> <a name = "SSEC002.2"></a> <li><code>SpecialLinearGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>R</var><code> ) F</code> <a name = "SSEC002.2"></a> <li><code>SL( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>R</var><code> ) F</code> <li><code>SpecialLinearGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <li><code>SL( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> The first two forms construct a group isomorphic to the special linear group SL( <var>d</var>, <var>R</var> ) of all those <i>d</i> ×<i>d</i> matrices over the ring <var>R</var> whose determinant is the identity of <var>R</var>, in the category given by the filter <var>filt</var>. <p> The third and the fourth form construct the special linear group over the finite field with <var>q</var> elements. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the special linear group as a matrix group in its natural action (see also <a href="CHAP042.htm#SSEC003.4">IsNaturalSL</a>, <a href="CHAP042.htm#SSEC005.5">IsNaturalSLnZ</a>). <p> Currently supported rings <var>R</var> are finite fields, the ring <code>Integers</code>, and residue class rings <code>Integers mod </code><var>m</var><code></code>. <p> <pre> gap> SpecialLinearGroup(2,2); SL(2,2) gap> SL(3,Integers); SL(3,Integers) gap> SL(4,Integers mod 4); SL(4,Z/4Z) </pre> <p> <a name = "I0"></a> Using the <code>OnLines</code> operation it is possible to obtain the corresponding projective groups in a permutation action: <p> <pre> gap> g:=GL(4,3);;Size(g); 24261120 gap> pgl:=Action(g,Orbit(g,Z(3)^0*[1,0,0,0],OnLines),OnLines);; gap> Size(pgl); 12130560 </pre> <p> <a name = "SSEC002.3"></a> <li><code>GeneralUnitaryGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.3"></a> <li><code>GU( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the general unitary group GU( <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <i>q</i> <sup>2</sup> elements that respect a fixed nondegenerate sesquilinear form, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the general unitary group itself. <p> <pre> gap> GeneralUnitaryGroup( 3, 5 ); GU(3,5) </pre> <p> <a name = "SSEC002.4"></a> <li><code>SpecialUnitaryGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.4"></a> <li><code>SU( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the special unitary group <code>GU(</code><var>d</var><code>, </code><var>q</var><code>)</code> of those <i>d</i> ×<i>d</i> matrices over the field with <i>q</i> <sup>2</sup> elements whose determinant is the identity of the field and that respect a fixed nondegenerate sesquilinear form, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the special unitary group itself. <p> <pre> gap> SpecialUnitaryGroup( 3, 5 ); SU(3,5) </pre> <p> <a name = "SSEC002.5"></a> <li><code>SymplecticGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.5"></a> <li><code>Sp( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.5"></a> <li><code>SP( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the symplectic group Sp( <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <var>q</var> elements that respect a fixed nondegenerate symplectic form, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the symplectic group itself. <p> <pre> gap> SymplecticGroup( 4, 2 ); Sp(4,2) </pre> <p> <a name = "SSEC002.6"></a> <li><code>GeneralOrthogonalGroup( [</code><var>filt</var><code>, ][</code><var>e</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.6"></a> <li><code>GO( [</code><var>filt</var><code>, ][</code><var>e</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the general orthogonal group GO( <var>e</var>, <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <var>q</var> elements that respect a non-singular quadratic form (see <a href="CHAP042.htm#SSEC004.5">InvariantQuadraticForm</a>) specified by <var>e</var>, in the category given by the filter <var>filt</var>. <p> The value of <var>e</var> must be 0 for odd <var>d</var> (and can optionally be omitted in this case), respectively one of 1 or −1 for even <var>d</var>. If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the general orthogonal group itself. <p> Note that in <a href="biblio.htm#KleidmanLiebeck90"><cite>KleidmanLiebeck90</cite></a>, GO is defined as the stabilizer ∆(<i>V</i>,<i>F</i>,κ) of the quadratic form, up to scalars, whereas our GO is called <i>I</i>(<i>V</i>,<i>F</i>,κ) there. <p> <a name = "SSEC002.7"></a> <li><code>SpecialOrthogonalGroup( [</code><var>filt</var><code>, ][</code><var>e</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.7"></a> <li><code>SO( [</code><var>filt</var><code>, ][</code><var>e</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> <code>SpecialOrthogonalGroup</code> returns a group isomorphic to the special orthogonal group SO( <var>e</var>, <var>d</var>, <var>q</var> ), which is the subgroup of all those matrices in the general orthogonal group (see <a href="CHAP048.htm#SSEC002.6">GeneralOrthogonalGroup</a>) that have determinant one, in the category given by the filter <var>filt</var>. (The index of SO( <var>e</var>, <var>d</var>, <var>q</var> ) in GO( <var>e</var>, <var>d</var>, <var>q</var> ) is 2 if <var>q</var> is odd, and 1 if <var>q</var> is even.) <p> If <var>filt</var> is not given it defaults to <code>IsMatrixGroup</code>, and the returned group is the special orthogonal group itself. <p> <pre> gap> GeneralOrthogonalGroup( 3, 7 ); GO(0,3,7) gap> GeneralOrthogonalGroup( -1, 4, 3 ); GO(-1,4,3) gap> SpecialOrthogonalGroup( 1, 4, 4 ); GO(+1,4,4) </pre> <p> <a name = "SSEC002.8"></a> <li><code>ProjectiveGeneralLinearGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.8"></a> <li><code>PGL( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the projective general linear group PGL( <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <var>q</var> elements, modulo the centre, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>, and the returned group is the action on lines of the underlying vector space. <p> <a name = "SSEC002.9"></a> <li><code>ProjectiveSpecialLinearGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.9"></a> <li><code>PSL( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the projective special linear group PSL( <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <var>q</var> elements whose determinant is the identity of the field, modulo the centre, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>, and the returned group is the action on lines of the underlying vector space. <p> <a name = "SSEC002.10"></a> <li><code>ProjectiveGeneralUnitaryGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.10"></a> <li><code>PGU( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the projective general unitary group PGU( <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <i>q</i> <sup>2</sup> elements that respect a fixed nondegenerate sesquilinear form, modulo the centre, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>, and the returned group is the action on lines of the underlying vector space. <p> <a name = "SSEC002.11"></a> <li><code>ProjectiveSpecialUnitaryGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.11"></a> <li><code>PSU( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the projective special unitary group PSU( <var>d</var>, <var>q</var> ) of those <i>d</i> ×<i>d</i> matrices over the field with <i>q</i> <sup>2</sup> elements that respect a fixed nondegenerate sesquilinear form and have determinant 1, modulo the centre, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>, and the returned group is the action on lines of the underlying vector space. <p> <a name = "SSEC002.12"></a> <li><code>ProjectiveSymplecticGroup( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.12"></a> <li><code>PSP( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC002.12"></a> <li><code>PSp( [</code><var>filt</var><code>, ]</code><var>d</var><code>, </code><var>q</var><code> ) F</code> <p> constructs a group isomorphic to the projective symplectic group PSp(<var>d</var>,<var>q</var>) of those <i>d</i> ×<i>d</i> matrices over the field with <var>q</var> elements that respect a fixed nondegenerate symplectic form, modulo the centre, in the category given by the filter <var>filt</var>. <p> If <var>filt</var> is not given it defaults to <code>IsPermGroup</code>, and the returned group is the action on lines of the underlying vector space. <p> <p> <h2><a name="SECT003">48.3 Conjugacy Classes in Classical Groups</a></h2> <p><p> <a name = "I1"></a> For general and special linear groups (see <a href="CHAP048.htm#SSEC002.1">GeneralLinearGroup</a> and <a href="CHAP048.htm#SSEC002.2">SpecialLinearGroup</a>) <font face="Gill Sans,Helvetica,Arial">GAP</font> has an efficient method to generate representatives of the conjugacy classes. This uses results from linear algebra on normal forms of matrices. If you know how to do this for other types of classical groups, please, tell us. <p> <pre> gap> g := SL(4,9); SL(4,9) gap> NrConjugacyClasses(g); 861 gap> cl := ConjugacyClasses(g);; gap> Length(cl); 861 </pre> <p> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesGL( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesGU( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesSL( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesSU( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesPGL( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesPGU( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesPSL( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesPSU( </code><var>n</var><code>, </code><var>q</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesSLIsogeneous( </code><var>n</var><code>, </code><var>q</var><code>, </code><var>f</var><code> ) F</code> <a name = "SSEC003.1"></a> <li><code>NrConjugacyClassesSUIsogeneous( </code><var>n</var><code>, </code><var>q</var><code>, </code><var>f</var><code> ) F</code> <p> The first of these functions compute for given <i>n</i> ∈ <i>N</i> and prime power <i>q</i> the number of conjugacy classes in the classical groups <i>GL</i>( <i>n</i> , <i>q</i> ), <i>GU</i>( <i>n</i> , <i>q</i> ), <i>SL</i>( <i>n</i> , <i>q</i> ), <i>SU</i>( <i>n</i> , <i>q</i> ), <i>PGL</i>( <i>n</i> , <i>q</i> ), <i>PGU</i>( <i>n</i> , <i>q</i> ), <i>PSL</i>( <i>n</i> , <i>q</i> ), <i>PSL</i>( <i>n</i> , <i>q</i> ), respectively. (See also <a href="CHAP037.htm#SSEC010.2">ConjugacyClasses!attribute</a> and Section <a href="CHAP048.htm#SECT002">Classical Groups</a>.) <p> For each divisor <i>f</i> of <i>n</i> there is a group of Lie type with the same order as <i>SL</i>( <i>n</i> , <i>q</i> ), such that its derived subgroup modulo its center is isomorphic to <i>PSL</i>( <i>n</i> , <i>q</i> ). The various such groups with fixed <i>n</i> and <i>q</i> are called <strong>isogeneous</strong>. (Depending on congruence conditions on <i>q</i> and <i>n</i> several of these groups may actually be isomorphic.) The function <code>NrConjugacyClassesSLIsogeneous</code> computes the number of conjugacy classes in this group. The extreme cases <i>f</i> = 1 and <i>f</i> = <i>n</i> lead to the groups <i>SL</i>( <i>n</i> , <i>q</i> ) and <i>PGL</i>( <i>n</i> , <i>q</i> ), respectively. <p> The function <code>NrConjugacyClassesSUIsogeneous</code> is the analogous one for the corresponding unitary groups. <p> The formulae for the number of conjugacy classes are taken from <a href="biblio.htm#Mac81"><cite>Mac81</cite></a>. <p> <pre> gap> NrConjugacyClassesGL(24,27); 22528399544939174406067288580609952 gap> NrConjugacyClassesPSU(19,17); 15052300411163848367708 gap> NrConjugacyClasses(SL(16,16)); 1229782938228219920 </pre> <p> <p> <h2><a name="SECT004">48.4 Constructors for Basic Groups</a></h2> <p><p> All functions described in the previous sections call constructor operations to do the work. The names of the constructors are obtained from the names of the functions by appending <code>Cons</code>, so for example <code>CyclicGroup</code> calls the constructor <p> <code> CyclicGroupCons( </code><var>cat</var><code>, </code><var>n</var><code> ) O</code> <p> The first argument <var>cat</var> for each method of this constructor must be the category for which the method is installed. For example the method for constructing a cyclic permutation group is installed as follows (see <a href="../prg/CHAP002.htm#SSEC002.1">InstallMethod</a> in ``Programming in <font face="Gill Sans,Helvetica,Arial">GAP</font>'' for the meaning of the arguments of <code>InstallMethod</code>). <pre> InstallMethod( CyclicGroupCons, "regular perm group", true, [ IsPermGroup and IsRegularProp and IsFinite, IsInt and IsPosRat ], 0, function( filter, n ) ... end ); </pre> <p> <p> <h2><a name="SECT005">48.5 Selection Functions</a></h2> <p><p> <a name = "I2"></a> <a name = "I2"></a> <a name = "I3"></a> <a name = "SSEC005.1"></a> <li><code>All</code><var>Library</var><code>Groups( </code><var>fun1</var><code>, </code><var>val1</var><code>, ... )</code> <p> For a number of the group libraries two <strong>selection functions</strong> are provided. Each <code>All</code><var>Library</var><code>Groups</code> selection function permits one to select <strong>all</strong> groups from the library <var>Library</var> that have a given set of properties. Currently, the library selection functions provided, of this type, are <code>AllSmallGroups</code>, <code>AllIrreducibleSolvableGroups</code>, <code>AllTransitiveGroups</code>, and <code>AllPrimitiveGroups</code>. Corresponding to each of these there is a <code>One</code><var>Library</var><code>Group</code> function (see <a href="CHAP048.htm#SSEC005.2">OneLibraryGroup</a>) which returns at most one group. <p> These functions take an arbitrary number of pairs (but at least one pair) of arguments. The first argument in such a pair is a function that can be applied to the groups in the library, and the second argument is either a single value that this function must return in order to have this group included in the selection, or a list of such values. For the function <code>AllSmallGroups</code> the first such function must be <code>Size</code>, and, unlike the other library selection functions, it supports an alternative syntax where <code>Size</code> is omitted (see <a href="CHAP048.htm#SSEC007.2">AllSmallGroups</a>). Also, see <a href="CHAP048.htm#SSEC011.3">AllIrreducibleSolvableGroups</a>, for details pertaining to <code>AllIrreducibleSolvableGroups</code>. <p> For an example, let us consider the selection function for the library of transitive groups (also see <a href="CHAP048.htm#SECT006">Transitive permutation groups</a>). The command, <p> <pre> gap> AllTransitiveGroups(NrMovedPoints,[10..15], > Size, [1..100], > IsAbelian, false ); </pre> <p> returns a list of all transitive groups with degree between 10 and 15 and size less than 100 that are not abelian. <p> Thus the <code>AllTransitiveGroups</code> behaves as if it was implemented by a function similar to the one defined below, where <code>TransitiveGroupsList</code> is a list of all transitive groups. (Note that in the definition below we assume for simplicity that <code>AllTransitiveGroups</code> accepts exactly 4 arguments. It is of course obvious how to change this definition so that the function would accept a variable number of arguments.) <p> <pre> AllTransitiveGroups := function( fun1, val1, fun2, val2 ) local groups, g, i; groups := []; for i in [ 1 .. Length( TransitiveGroupsList ) ] do g := TransitiveGroupsList[i]; if fun1(g) = val1 or IsList(val1) and fun1(g) in val1 and fun2(g) = val2 or IsList(val2) and fun2(g) in val2 then Add( groups, g ); fi; od; return groups; end; </pre> Note that the real selection functions are considerably more difficult, to improve the efficiency. Most important, each recognizes a certain set of properties which are precomputed for the library without having to compute them anew for each group. This will substantially speed up the selection process. In the description of each library we will list the properties that are stored for this library. <p> <a name = "I4"></a> <a name = "I4"></a> <a name = "I5"></a> <a name = "SSEC005.2"></a> <li><code>One</code><var>Library</var><code>Group( </code><var>fun1</var><code>, </code><var>val1</var><code>, ... )</code> <p> For each <code>All</code><var>Library</var><code>Groups</code> function (see <a href="CHAP048.htm#SSEC005.1">AllLibraryGroups</a>) there is a corresponding function <code>One</code><var>Library</var><code>Group</code> on exactly the same arguments, i.e. there are <code>OneSmallGroup</code>, <code>OneIrreducibleSolvableGroup</code>, <code>OneTransitiveGroup</code>, and <code>OnePrimitiveGroup</code>. Each function simply returns the <strong>first</strong> group in the library (in the stored order) that has the prescribed properties, instead of <strong>all</strong> such groups. It returns <code>fail</code> if no such group exists in the library. <p> <p> <h2><a name="SECT006">48.6 Transitive Permutation Groups</a></h2> <p><p> The transitive groups library currently contains representatives for all transitive permutation groups of degree at most 30. Two permutations groups of the same degree are considered to be equivalent, if there is a renumbering of points, which maps one group into the other one. In other words, if they lie in the same conjugacy class under operation of the full symmetric group by conjugation. <p> <a name = "SSEC006.1"></a> <li><code>TransitiveGroup( </code><var>deg</var><code>, </code><var>nr</var><code> ) F</code> <p> returns the <var>nr</var>-th transitive group of degree <var>deg</var>. Both <var>deg</var> and <var>nr</var> must be positive integers. The transitive groups of equal degree are sorted with respect to their size, so for example <code>TransitiveGroup( </code><var>deg</var><code>, 1 )</code> is a transitive group of degree and size <var>deg</var>, e.g, the cyclic group of size <var>deg</var>, if <var>deg</var> is a prime. <p> <a name = "SSEC006.2"></a> <li><code>NrTransitiveGroups( </code><var>deg</var><code> ) F</code> <p> returns the number of transitive groups of degree <var>deg</var> stored in the library of transitive groups. The function returns <code>fail</code> if <var>deg</var> is beyond the range of the library. <p> The selection functions (see <a href="CHAP048.htm#SECT005">Selection functions</a>) for the transitive groups library are <code>AllTransitiveGroups</code> and <code>OneTransitiveGroup</code>. They obtain the following properties from the database without having to compute them anew: <p> <code>NrMovedPoints</code>, <code>Size</code>, <code>Transitivity</code>, and <code>IsPrimitive</code>. <p> This library was computed by Gregory Butler, John McKay, Gordon Royle and Alexander Hulpke. The list of transitive groups up to degree 11 was published in <a href="biblio.htm#BM83"><cite>BM83</cite></a>, the list of degree 12 was published in <a href="biblio.htm#Roy87"><cite>Roy87</cite></a>, degree 14 and 15 were published in <a href="biblio.htm#Butler93"><cite>Butler93</cite></a> and degrees 16--30 were published in <a href="biblio.htm#Hulpke96"><cite>Hulpke96</cite></a> and <a href="biblio.htm#HulpkeTG"><cite>HulpkeTG</cite></a>. (Groups of prime degree of course are primitive and were known long before.) <p> The arrangement and the names of the groups of degree up to 15 is the same as given in <a href="biblio.htm#ConwayHulpkeMcKay98"><cite>ConwayHulpkeMcKay98</cite></a>. With the exception of the symmetric and alternating group (which are represented as <code>SymmetricGroup</code> and <code>AlternatingGroup</code>) the generators for these groups also conform to this paper with the only difference that 0 (which is not permitted in <font face="Gill Sans,Helvetica,Arial">GAP</font> for permutations to act on) is always replaced by the degree. <p> <pre> gap> TransitiveGroup(10,22); S(5)[x]2 gap> l:=AllTransitiveGroups(NrMovedPoints,12,Size,1440,IsSolvable,false); [ S(6)[x]2, M_10.2(12)=A_6.E_4(12)=[S_6[1/720]{M_10}S_6]2 ] gap> List(l,IsSolvable); [ false, false ] </pre> <p> <a name = "SSEC006.3"></a> <li><code>TransitiveIdentification( </code><var>G</var><code> ) A</code> <p> Let <var>G</var> be a permutation group, acting transitively on a set of up to 30 points. Then <code>TransitiveIdentification</code> will return the position of this group in the transitive groups library. This means, if <var>G</var> acts on <i>m</i> points and <code>TransitiveIdentification</code> returns <i>n</i>, then <var>G</var> is permutation isomorphic to the group <code>TransitiveGroup(m,n)</code>. <p> Note: The points moved do <strong>not</strong> need to be [1..<var>n</var>], the group 〈(2,3,4),(2,3)〉 is considered to be transitive on 3 points. If the group has several orbits on the points moved by it the result of <code>TransitiveIdentification</code> is undefined. <p> <pre> gap> TransitiveIdentification(Group((1,2),(1,2,3))); 2 </pre> <p> <p> <h2><a name="SECT007">48.7 Small Groups</a></h2> <p><p> The Small Groups library gives access to all groups of certain ``small'' orders. The groups are sorted by their orders and they are listed up to isomorphism; that is, for each of the available orders a complete and irredundant list of isomorphism type representatives of groups is given. Currently, the library contains the following groups: <ul> <li> those of order at most 2000 except 1024 (423 164 062 groups); <li> those of cubefree order at most 50 000 (395 703 groups); <li> those of order <i>p</i><sup><i>n</i></sup> for <i>n</i> ≤ 6 and all primes <i>p</i> <li> those of order <i>q</i><sup><i>n</i></sup> ·<i>p</i> for <i>q</i><sup><i>n</i></sup> dividing 2<sup>8</sup>, 3<sup>6</sup>, 5<sup>5</sup> or 7<sup>4</sup> and all primes <i>p</i> with <i>p</i> ≠ <i>q</i>; <li> those of squarefree order; <li> those whose order factorises into at most 3 primes. </ul> The first two items in this list cover an explicit range of orders; the last four provide access to infinite families of groups having orders of certain types. <p> The library also has an identification function: it returns the library number of a given group. This function determines library numbers using invariants of groups. The function is available for all orders in the library except 512, 1536, <i>p</i><sup>6</sup> for <i>p</i> > 3 and <i>p</i><sup>5</sup> for <i>p</i> > 5. <p> The library is organised in 10 layers. Each layer contains the groups of certain orders and their corresponding group identification routines. It is possible to install the first <i>n</i> layers of the group library and the first <i>m</i> layers of the group identification for each 1 ≤ <i>m</i> ≤ <i>n</i> ≤ 10. This might be useful to save disk space. There is an extensive <code>README</code> file for the Small Groups library available in the <code>small</code> directory of the <font face="Gill Sans,Helvetica,Arial">GAP</font> distribution containing detailed information on the layers. A brief description of the layers is given here: <ol> <li> the groups whose order factorises into at most 3 primes. <li> the remaining groups of order at most 1000 except 512 and 768. <li> the remaining groups of order 2<sup><i>n</i></sup> * <i>p</i> with <i>n</i> ≤ 8 and <i>p</i> an odd prime. <li> the remaining groups of order 5<sup>5</sup>, 7<sup>4</sup> and of order <i>q</i><sup><i>n</i></sup> ·<i>p</i> for <i>q</i><sup><i>n</i></sup> dividing 3<sup>6</sup>, 5<sup>5</sup> or 7<sup>4</sup> and <i>p</i> ≠ <i>q</i> a prime. <li> the remaining groups of order at most 2000 except 1024, 1152, 1536 and 1920. <li> the groups of orders 1152 and 1920. <li> the groups of order 512. <li> the groups of order 1536. <li> the remaining groups of order <i>p</i><sup><i>n</i></sup> for 4 ≤ <i>n</i> ≤ 6. <li> the remaining groups of cubefree order at most 50 000 and of squarefree order. </ol> <p> The data in this library has been carefully checked and cross-checked. It is believed to be reliable. However, no absolute guarantees are given and users should, as always, make their own checks in critical cases. <p> The data occupies about 30 MB (storing over 400 million groups in about 200 megabits). The group identification occupies about 47 MB of which 18 MB is used for the groups in layer (6). More information on the Small Groups library can be found on <a href="http://www.tu-bs.de/~hubesche/small.html">http://www.tu-bs.de/~hubesche/small.html</a> <p> This library has been constructed by Hans Ulrich Besche, Bettina Eick and E. A. O'Brien. A survey on this topic and an account of the history of group constructions can be found in <a href="biblio.htm#BEO01"><cite>BEO01</cite></a>. Further detailed information on the construction of this library is available in <a href="biblio.htm#New77"><cite>New77</cite></a>, <a href="biblio.htm#OBr90"><cite>OBr90</cite></a>, <a href="biblio.htm#OBr91"><cite>OBr91</cite></a>, <a href="biblio.htm#BescheEick98"><cite>BescheEick98</cite></a>, <a href="biblio.htm#BescheEick1000"><cite>BescheEick1000</cite></a>, <a href="biblio.htm#BescheEick768"><cite>BescheEick768</cite></a>, <a href="biblio.htm#BEO00"><cite>BEO00</cite></a>, <a href="biblio.htm#EOB99"><cite>EOB99</cite></a>, <a href="biblio.htm#EOB98"><cite>EOB98</cite></a>, <a href="biblio.htm#NOV04"><cite>NOV04</cite></a>, <a href="biblio.htm#Gir03"><cite>Gir03</cite></a>, <a href="biblio.htm#DEi05"><cite>DEi05</cite></a>. <p> <a name = "I6"></a> <a name = "I7"></a> The Small Groups library incorporates the <font face="Gill Sans,Helvetica,Arial">GAP</font> 3 libraries <code>TwoGroup</code> and <code>ThreeGroup</code>. The data from these libraries was directly included into the Small Groups library, and the ordering there was preserved. The Small Groups library replaces the Gap 3 library of solvable groups of order at most 100. However, both the organisation and data descriptions of these groups has changed in the Small Groups library. <p> <a name = "SSEC007.1"></a> <li><code>SmallGroup( </code><var>order</var><code>, </code><var>i</var><code> ) F</code> <li><code>SmallGroup( [</code><var>order</var><code>, </code><var>i</var><code>] ) F</code> <p> returns the <var>i</var>-th group of order <var>order</var> in the catalogue. If the group is solvable, it will be given as a PcGroup; otherwise it will be given as a permutation group. If the groups of order <var>order</var> are not installed, the function reports an error and enters a break loop. <p> <a name = "SSEC007.2"></a> <li><code>AllSmallGroups( </code><var>arg</var><code> ) F</code> <p> returns all groups with certain properties as specified by <var>arg</var>. If <var>arg</var> is a number <i>n</i>, then this function returns all groups of order <i>n</i>. However, the function can also take several arguments which then must be organized in pairs <code>function</code> and <code>value</code>. In this case the first function must be <code>Size</code> and the first value an order or a range of orders. If value is a list then it is considered a list of possible function values to include. The function returns those groups of the specified orders having those properties specified by the remaining functions and their values. <p> Precomputed information is stored for the properties <code>IsAbelian</code>, <code>IsNilpotentGroup</code>, <code>IsSupersolvableGroup</code>, <code>IsSolvableGroup</code>, <code>RankPGroup</code>, <code>PClassPGroup</code>, <code>LGLength</code>, <code>FrattinifactorSize</code> and <code>FrattinifactorId</code> for the groups of order at most 2000 which have more than three prime factors, except those of order 512, 768, 1024, 1152, 1536, 1920 and those of order <i>p</i><sup><i>n</i></sup> ·<i>q</i> > 1000 with <i>n</i> > 2. <p> <a name = "SSEC007.3"></a> <li><code>OneSmallGroup( </code><var>arg</var><code> ) F</code> <p> returns one group with certain properties as specified by <var>arg</var>. The permitted arguments are those supported by <code>AllSmallGroups</code>. <p> <a name = "SSEC007.4"></a> <li><code>NumberSmallGroups( </code><var>order</var><code> ) F</code> <p> returns the number of groups of order <var>order</var>. <p> <a name = "SSEC007.5"></a> <li><code>IdSmallGroup( </code><var>G</var><code> ) A</code> <a name = "SSEC007.5"></a> <li><code>IdGroup( </code><var>G</var><code> ) A</code> <p> returns the library number of <var>G</var>; that is, the function returns a pair <code>[</code><var>order</var><code>, </code><var>i</var><code>]</code> where <var>G</var> is isomorphic to <code>SmallGroup( </code><var>order</var><code>, </code><var>i</var><code> )</code>. <p> <a name = "SSEC007.6"></a> <li><code>IdsOfAllSmallGroups( </code><var>arg</var><code> ) F</code> <p> similar to <code>AllSmallGroups</code> but returns ids instead of groups. This may prevent workspace overflows, if a large number of groups are expected in the output. <p> <a name = "SSEC007.7"></a> <li><code>IdGap3SolvableGroup( </code><var>G</var><code> ) A</code> <a name = "SSEC007.7"></a> <li><code>Gap3CatalogueIdGroup( </code><var>G</var><code> ) A</code> <p> returns the catalogue number of <var>G</var> in the GAP 3 catalogue of solvable groups; that is, the function returns a pair <code>[</code><var>order</var><code>, </code><var>i</var><code>]</code> meaning that <var>G</var> is isomorphic to the group <code>SolvableGroup( </code><var>order</var><code>, </code><var>i</var><code> )</code> in GAP 3. <p> <a name = "SSEC007.8"></a> <li><code>SmallGroupsInformation( </code><var>order</var><code> ) F</code> <p> prints information on the groups of the specified order. <p> <a name = "SSEC007.9"></a> <li><code>UnloadSmallGroupsData( ) F</code> <p> GAP loads all necessary data from the library automatically, but it does not delete the data from the workspace again. Usually, this will be not necessary, since the data is stored in a compressed format. However, if a large number of groups from the library have been loaded, then the user might wish to remove the data from the workspace and this can be done by the above function call. <p> <pre> gap> G := SmallGroup( 768, 1000000 ); <pc group of size 768 with 9 generators> gap> G := SmallGroup( [768, 1000000] ); <pc group of size 768 with 9 generators> </pre> <p> <pre> gap> AllSmallGroups( 6 ); [ <pc group of size 6 with 2 generators>, <pc group of size 6 with 2 generators> ] gap> AllSmallGroups( Size, 120, IsSolvableGroup, false ); [ Group([ (1,2,4,8)(3,6,9,5)(7,12,13,17)(10,14,11,15)(16,20,21,24)(18,22,19, 23), (1,3,7)(2,5,10)(4,9,13)(6,11,8)(12,16,20)(14,18,22)(15,19,23)(17, 21,24) ]), Group([ (1,2,3,4,5), (1,2) ]), Group([ (1,2,3,5,4), (1,3)(2,4)(6,7) ]) ] </pre> <p> <pre> gap> G := OneSmallGroup( 120, IsNilpotentGroup, false ); <pc group of size 120 with 5 generators> gap> IdSmallGroup(G); [ 120, 1 ] gap> G := OneSmallGroup( Size, [1..1000], IsSolvableGroup, false ); Group([ (1,2,3,4,5), (1,2,3) ]) gap> IdSmallGroup(G); [ 60, 5 ] gap> UnloadSmallGroupsData(); </pre> <p> <pre> gap> IdSmallGroup( GL( 2,3 ) ); [ 48, 29 ] gap> IdSmallGroup( Group( (1,2,3,4),(4,5) ) ); [ 120, 34 ] gap> IdsOfAllSmallGroups( Size, 60, IsSupersolvableGroup, true ); [ [ 60, 1 ], [ 60, 2 ], [ 60, 3 ], [ 60, 4 ], [ 60, 6 ], [ 60, 7 ], [ 60, 8 ], [ 60, 10 ], [ 60, 11 ], [ 60, 12 ], [ 60, 13 ] ] </pre> <p> <pre> gap> NumberSmallGroups( 512 ); 10494213 gap> NumberSmallGroups( 2^8 * 23 ); 1083472 </pre> <p> <pre> gap> NumberSmallGroups( 2^9 * 23 ); Error, the library of groups of size 11776 is not available called from <function>( <arguments> ) called from read-eval-loop Entering break read-eval-print loop ... you can 'quit;' to quit to outer loop, or you can 'return;' to continue brk> quit; gap> </pre> <p> <pre> gap> SmallGroupsInformation( 32 ); There are 51 groups of order 32. They are sorted by their ranks. 1 is cyclic. 2 - 20 have rank 2. 21 - 44 have rank 3. 45 - 50 have rank 4. 51 is elementary abelian. For the selection functions the values of the following attributes are precomputed and stored: IsAbelian, PClassPGroup, RankPGroup, FrattinifactorSize and FrattinifactorId. This size belongs to layer 2 of the SmallGroups library. IdSmallGroup is available for this size. </pre> <p> <p> <h2><a name="SECT008">48.8 Finite Perfect Groups</a></h2> <p><p> <a name = "I8"></a> The <font face="Gill Sans,Helvetica,Arial">GAP</font> library of finite perfect groups provides, up to isomorphism, a list of all perfect groups whose sizes are less than 10<sup>6</sup> excluding the following sizes: <ul> <li> For <i>n</i> = 61440, 122880, 172032, 245760, 344064, 491520, 688128, or 983040, the perfect groups of size <i>n</i> have not completely been determined yet. The library neither provides the number of these groups nor the groups themselves. <li> For <i>n</i> = 86016, 368640, or 737280, the library does not yet contain the perfect groups of size <i>n</i>, it only provides their numbers which are 52, 46, and 54, respectively. </ul> <p> Except for these eleven sizes, the list of altogether 1097 perfect groups in the library is complete. It relies on results of Derek F. Holt and Wilhelm Plesken which are published in their book ``Perfect Groups'' <a href="biblio.htm#HP89"><cite>HP89</cite></a>. Moreover, they have supplied us with files with presentations of 488 of the groups. In terms of these, the remaining 607 nontrivial groups in the library can be described as 276 direct products, 107 central products, and 224 subdirect products. They are computed automatically by suitable <font face="Gill Sans,Helvetica,Arial">GAP</font> functions whenever they are needed. Two additional groups omitted from the book ``Perfect Groups'' have also been included. <p> We are grateful to Derek Holt and Wilhelm Plesken for making their groups available to the <font face="Gill Sans,Helvetica,Arial">GAP</font> community by contributing their files. It should be noted that their book contains a lot of further information for many of the library groups. So we would like to recommend it to any <font face="Gill Sans,Helvetica,Arial">GAP</font> user who is interested in the groups. <p> The library has been brought into <font face="Gill Sans,Helvetica,Arial">GAP</font> format by Volkmar Felsch. <p> <a name = "SSEC008.1"></a> <li><code>SizesPerfectGroups( ) F</code> <p> <a name = "SSEC008.2"></a> <li><code>PerfectGroup( [</code><var>filt</var><code>, ]</code><var>size</var><code>[, </code><var>n</var><code>] ) F</code> <li><code>PerfectGroup( [</code><var>filt</var><code>, ]</code><var>sizenumberpair</var><code> ) F</code> <p> returns a group which is isomorphic to the library group specified by the size number <code>[ </code><var>size</var><code>, </code><var>n</var><code> ]</code> or by the two separate arguments <var>size</var> and <var>n</var>, assuming a default value of <i>n</i> = 1. The optional argument <var>filt</var> defines the filter in which the group is returned. Possible filters so far are <code>IsPermGroup</code> and <code>IsSubgroupFpGroup</code>. In the latter case, the generators and relators used coincide with those given in <a href="biblio.htm#HP89"><cite>HP89</cite></a>. <p> <pre> gap> G := PerfectGroup(IsPermGroup,6048,1); U3(3) </pre> <p> As all groups are stored by presentations, a permutation representation is obtained by coset enumeration. Note that some of the library groups do not have a faithful permutation representation of small degree. Computations in these groups may be rather time consuming. <pre> gap> G:=PerfectGroup(IsPermGroup,823080,2); A5 2^1 19^2 C 19^1 gap> NrMovedPoints(G); 6859 </pre> <p> <a name = "SSEC008.3"></a> <li><code>PerfectIdentification( </code><var>G</var><code> ) A</code> <p> This attribute is set for all groups obtained from the perfect groups library and has the value <code>[</code><var>size</var><code>,</code><var>nr</var><code>]</code> if the group is obtained with these parameters from the library. <p> <a name = "SSEC008.4"></a> <li><code>NumberPerfectGroups( </code><var>size</var><code> ) F</code> <p> returns the number of non-isomorphic perfect groups of size <var>size</var> for each positive integer <var>size</var> up to 10<sup>6</sup> except for the eight sizes listed at the beginning of this section for which the number is not yet known. For these values as well as for any argument out of range it returns <code>fail</code>. <p> <a name = "SSEC008.5"></a> <li><code>NumberPerfectLibraryGroups( </code><var>size</var><code> ) F</code> <p> returns the number of perfect groups of size <var>size</var> which are available in the library of finite perfect groups. (The purpose of the function is to provide a simple way to formulate a loop over all library groups of a given size.) <p> <a name = "SSEC008.6"></a> <li><code>SizeNumbersPerfectGroups( </code><var>factor1</var><code>, </code><var>factor2</var><code>, ... ) F</code> <p> <code>SizeNumbersPerfectGroups</code> returns a list of pairs, each entry consisting of a group order and the number of those groups in the library of perfect groups that contain the specified factors <var>factor1</var>, <var>factor2</var>, ... among their composition factors. <p> Each argument must either be the name of a simple group or an integer which stands for the product of the sizes of one or more cyclic factors. (In fact, the function replaces all integers among the arguments by their product.) <p> The following text strings are accepted as simple group names. <ul> <li> <code>A</code><var>n</var><code></code> or <code>A(</code><var>n</var><code>)</code> for the alternating groups <i>A</i><sub><i>n</i></sub>, 5 ≤ <i>n</i> ≤ 9, for example <code>A5</code> or <code>A(6)</code>. <li> <code>L</code><var>n</var><code>(</code><var>q</var><code>)</code> or <code>L(</code><var>n</var><code>,</code><var>q</var><code>)</code> for <i>PSL</i>(<i>n</i>,<i>q</i>), where <i>n</i> ∈ {2,3} and <i>q</i> a prime power, ranging <ul> <li> for <i>n</i>=2 from 4 to 125 <li> for <i>n</i>=3 from 2 to 5 </ul> <li> <code>U</code><var>n</var><code>(</code><var>q</var><code>)</code> or <code>U(</code><var>n</var><code>,</code><var>q</var><code>)</code> for <i>PSU</i>(<i>n</i>,<i>q</i>), where <i>n</i> ∈ {3,4} and <i>q</i> a prime power, ranging <ul> <li> for <i>n</i>=3 from 3 to 5 <li> for <i>n</i>=4 from 2 to 2 </ul> <li> <code>Sp4(4)</code> or <code>S(4,4)</code> for the symplectic group <i>S</i>(4,4), <li> <code>Sz(8)</code> for the Suzuki group <i>Sz</i>(8), <li> <code>M</code><var>n</var><code></code> or <code>M(</code><var>n</var><code>)</code> for the Mathieu groups <i>M</i><sub>11</sub>, <i>M</i><sub>12</sub>, and <i>M</i><sub>22</sub>, and <li> <code>J</code><var>n</var><code></code> or <code>J(</code><var>n</var><code>)</code> for the Janko groups <i>J</i><sub>1</sub> and <i>J</i><sub>2</sub>. </ul> <p> Note that, for most of the groups, the preceding list offers two different names in order to be consistent with the notation used in <a href="biblio.htm#HP89"><cite>HP89</cite></a> as well as with the notation used in the <code>DisplayCompositionSeries</code> command of <font face="Gill Sans,Helvetica,Arial">GAP</font>. However, as the names are compared as text strings, you are restricted to the above choice. Even expressions like <code>L2(2^5)</code> are not accepted. <p> As the use of the term <i>PSU</i>(<i>n</i>,<i>q</i>) is not unique in the literature, we mention that in this library it denotes the factor group of <i>SU</i>(<i>n</i>,<i>q</i>) by its centre, where <i>SU</i>(<i>n</i>,<i>q</i>) is the group of all <i>n</i> ×<i>n</i> unitary matrices with entries in <i>GF</i>(<i>q</i><sup>2</sup>) and determinant 1. <p> The purpose of the function is to provide a simple way to formulate a loop over all library groups which contain certain composition factors. <p> <a name = "SSEC008.7"></a> <li><code>DisplayInformationPerfectGroups( </code><var>size</var><code> ) F</code> <li><code>DisplayInformationPerfectGroups( </code><var>size</var><code>, </code><var>n</var><code> ) F</code> <li><code>DisplayInformationPerfectGroups( [ </code><var>size</var><code>, </code><var>n</var><code> ] ) F</code> <p> <code>DisplayInformationPerfectGroups</code> displays some invariants of the <var>n</var>-th group of order <var>size</var> from the perfect groups library. <p> If no value of <var>n</var> has been specified, the invariants will be displayed for all groups of size <var>size</var> available in the library. The information provided for <i>G</i> includes the following items: <ul> <li> a headline containing the size number <code>[ </code><var>size</var><code>, </code><var>n</var><code> ]</code> of <i>G</i> in the form <code></code><var>size</var><code>.</code><var>n</var><code></code> (the suffix <code>.</code><var>n</var><code></code> will be suppressed if, up to isomorphism, <i>G</i> is the only perfect group of order <var>size</var>), <li> a message if <i>G</i> is simple or quasisimple, i.e., if the factor group of <i>G</i> by its centre is simple, <li> the ``description'' of the structure of <i>G</i> as it is given by Holt and Plesken in <a href="biblio.htm#HP89"><cite>HP89</cite></a> (see below), <li> the size of the centre of <i>G</i> (suppressed, if <i>G</i> is simple), <li> the prime decomposition of the size of <i>G</i>, <li> orbit sizes for a faithful permutation representation of <i>G</i> which is provided by the library (see below), <li> a reference to each occurrence of <i>G</i> in the tables of section 5.3 of <a href="biblio.htm#HP89"><cite>HP89</cite></a>. Each of these references consists of a class number and an internal number (<i>i</i>,<i>j</i>) under which <i>G</i> is listed in that class. For some groups, there is more than one reference because these groups belong to more than one of the classes in the book. </ul> <p> <pre> gap> DisplayInformationPerfectGroups( 30720, 3 ); #I Perfect group 30720: A5 ( 2^4 E N 2^1 E 2^4 ) A #I size = 2^11*3*5 orbit size = 240 #I Holt-Plesken class 1 (9,3) gap> DisplayInformationPerfectGroups( 30720, 6 ); #I Perfect group 30720: A5 ( 2^4 x 2^4 ) C N 2^1 #I centre = 2 size = 2^11*3*5 orbit size = 384 #I Holt-Plesken class 1 (9,6) gap> DisplayInformationPerfectGroups( Factorial( 8 ) / 2 ); #I Perfect group 20160.1: A5 x L3(2) 2^1 #I centre = 2 size = 2^6*3^2*5*7 orbit sizes = 5 + 16 #I Holt-Plesken class 31 (1,1) (occurs also in class 32) #I Perfect group 20160.2: A5 2^1 x L3(2) #I centre = 2 size = 2^6*3^2*5*7 orbit sizes = 7 + 24 #I Holt-Plesken class 31 (1,2) (occurs also in class 32) #I Perfect group 20160.3: ( A5 x L3(2) ) 2^1 #I centre = 2 size = 2^6*3^2*5*7 orbit size = 192 #I Holt-Plesken class 31 (1,3) #I Perfect group 20160.4: simple group A8 #I size = 2^6*3^2*5*7 orbit size = 8 #I Holt-Plesken class 26 (0,1) #I Perfect group 20160.5: simple group L3(4) #I size = 2^6*3^2*5*7 orbit size = 21 #I Holt-Plesken class 27 (0,1) </pre> <p> For any library group <i>G</i>, the library files do not only provide a presentation, but, in addition, a list of one or more subgroups <i>S</i><sub>1</sub>, …, <i>S</i><sub><i>r</i></sub> of <i>G</i> such that there is a faithful permutation representation of <i>G</i> of degree ∑<sub><i>i</i>=1</sub><sup><i>r</i></sup> [<i>G</i>:<i>S</i><sub><i>i</i></sub>] on the set { <i>S</i><sub><i>i</i></sub> <i>g</i> | 1 ≤ <i>i</i> ≤ <i>r</i>, <i>g</i> ∈ <i>G</i> } of the cosets of the <i>S</i><sub><i>i</i></sub>. This allows one to construct the groups as permutation groups. The <code>DisplayInformationPerfectGroups</code> function displays only the available degree. The message <pre> orbit size = 8 </pre> <p> in the above example means that the available permutation representation is transitive and of degree 8, whereas the message <pre> orbit sizes = 5 + 16 </pre> means that a nontransitive permutation representation is available which acts on two orbits of size 5 and 16 respectively. <p> The notation used in the ``description'' of a group is explained in section 5.1.2 of <a href="biblio.htm#HP89"><cite>HP89</cite></a>. We quote the respective page from there: <p> Within a class <i>Q</i> # <i>p</i>, an isomorphism type of groups will be denoted by an ordered pair of integers (<i>r</i>,<i>n</i>), where <i>r</i> ≥ 0 and <i>n</i> > 0. More precisely, the isomorphism types in <i>Q</i> # <i>p</i> of order <i>p</i><sup><i>r</i></sup> |<i>Q</i>| will be denoted by (<i>r</i>,1), (<i>r</i>,2), (<i>r</i>,3), … . Thus <i>Q</i> will always get the size number (0,1). <p> In addition to the symbol (<i>r</i>,<i>n</i>), the groups in <i>Q</i> # <i>p</i> will also be given a more descriptive name. The purpose of this is to provide a very rough idea of the structure of the group. The names are derived in the following manner. First of all, the isomorphism classes of irreducible <i>F</i><sub><i>p</i></sub><i>Q</i>-modules <i>M</i> with |<i>Q</i>|·|<i>M</i>| ≤ 10<sup>6</sup>, where <i>F</i><sub><i>p</i></sub> is the field of order <i>p</i>, are assigned symbols. These will either be simply <i>p</i><sup><i>x</i></sup>, where <i>x</i> is the dimension of the module, or, if there is more than one isomorphism class of irreducible modules having the same dimension, they will be denoted by <i>p</i><sup><i>x</i></sup>, <i>p</i><sup><i>x</i>′</sup>, etc. The one-dimensional module with trivial <i>Q</i>-action will therefore be denoted by <i>p</i><sup>1</sup>. These symbols will be listed under the description of <i>Q</i>. The group name consists essentially of a list of the composition factors working from the top of the group downwards; hence it always starts with the name of <i>Q</i> itself. (This convention is the most convenient in our context, but it is different from that adopted in the ATLAS <a href="biblio.htm#CCN85"><cite>CCN85</cite></a>, for example, where composition factors are listed in the reverse order. For example, we denote a group isomorphic to <i>SL</i>(2,5) by <i>A</i><sub>5</sub> 2<sup>1</sup> rather than 2·<i>A</i><sub>5</sub>.) <p> Some other symbols are used in the name, in order to give some idea of the relationship between these composition factors, and splitting properties. We shall now list these additional symbols. <p> <dl compact> <dt>×<dd>between two factors denotes a direct product of <i>F</i><sub><i>p</i></sub><i>Q</i>-modules or groups. <p> <dt>C<dd>(for ``commutator'') between two factors means that the second lies in the commutator subgroup of the first. Similarly, a segment of the form (<i>f</i><sub>1</sub> × <i>f</i><sub>2</sub>) <i>C</i> <i>f</i><sub>3</sub> would mean that the factors <i>f</i><sub>1</sub> and <i>f</i><sub>2</sub> commute modulo <i>f</i><sub>3</sub> and <i>f</i><sub>3</sub> lies in [<i>f</i><sub>1</sub>,<i>f</i><sub>2</sub>]. <p> <dt>A<dd>(for ``abelian'') between two factors indicates that the second is in the <i>p</i>th power (but not the commutator subgroup) of the first. ``A'' may also follow the factors, if bracketed. <p> <dt>E<dd>(for ``elementary abelian'') between two factors indicates that together they generate an elementary abelian group (modulo subsequent factors), but that the resulting <i>F</i><sub><i>p</i></sub><i>Q</i>-module extension does not split. <p> <dt>N<dd>(for ``nonsplit'') before a factor indicates that <i>Q</i> (or possibly its covering group) splits down as far at this factor but not over the factor itself. So ``<i>Q</i> <i>f</i><sub>1</sub> <i>N</i> <i>f</i><sub>2</sub>'' means that the normal subgroup <i>f</i><sub>1</sub><i>f</i><sub>2</sub> of the group has no complement but, modulo <i>f</i><sub>2</sub>, <i>f</i><sub>1</sub>, does have a complement. <p> </dl> <p> Brackets have their obvious meaning. Summarizing, we have: <p> <dl compact> <dt>×<dd>= direct product; <p> <dt>C<dd>= commutator subgroup; <p> <dt>A<dd>= abelian; <p> <dt>E<dd>= elementary abelian; and <p> <dt>N<dd>= nonsplit. <p> </dl> <p> Here are some examples. <p> <ol type=i> <li> <i>A</i><sub>5</sub> (2<sup>4</sup> <i>E</i> 2<sup>1</sup> <i>E</i> 2<sup>4</sup>) <i>A</i> means that the pairs 2<sup>4</sup> <i>E</i> 2<sup>1</sup> and 2<sup>1</sup> <i>E</i> 2<sup>4</sup> are both elementary abelian of exponent 4. <p> <li> <i>A</i><sub>5</sub> (2<sup>4</sup> <i>E</i> 2<sup>1</sup> <i>A</i>) <i>C</i> 2<sup>1</sup> means that <i>O</i><sub>2</sub>(<i>G</i>) is of symplectic type 2<sup>1+5</sup>, with Frattini factor group of type 2<sup>4</sup> <i>E</i> 2<sup>1</sup>. The ``A'' after the 2<sup>1</sup> indicates that <i>G</i> has a central cyclic subgroup 2<sup>1</sup> <i>A</i> 2<sup>1</sup> of order 4. <p> <li> <i>L</i><sub>3</sub>(2) ((2<sup>1</sup> <i>E</i>) × (<i>N</i> 2<sup>3</sup> <i>E</i> 2<sup>3′</sup> <i>A</i>) <i>C</i>) 2<sup>3′</sup> means that the 2<sup>3′</sup> factor at the bottom lies in the commutator subgroup of the pair 2<sup>3</sup> <i>E</i> 2<sup>3′</sup> in the middle, but the lower pair 2<sup>3′</sup> <i>A</i> 2<sup>3′</sup> is abelian of exponent 4. There is also a submodule 2<sup>1</sup> <i>E</i> 2<sup>3′</sup>, and the covering group <i>L</i><sub>3</sub>(2) 2<sup>1</sup> of <i>L</i><sub>3</sub>(2) does not split over the 2<sup>3</sup> factor. (Since <i>G</i> is perfect, it goes without saying that the extension <i>L</i><sub>3</sub>(2) 2<sup>1</sup> cannot split itself.) <p> </ol> <p> We must stress that this notation does not always succeed in being precise or even unambiguous, and the reader is free to ignore it if it does not seem helpful. <p> If such a group description has been given in the book for <i>G</i> (and, in fact, this is the case for most of the library groups), it is displayed by the <code>DisplayInformationPerfectGroups</code> function. Otherwise the function provides a less explicit description of the (in these cases unique) Holt-Plesken class to which <i>G</i> belongs, together with a serial number if this is necessary to make it unique. <p> <p> <h2><a name="SECT009">48.9 Primitive Permutation Groups</a></h2> <p><p> <font face="Gill Sans,Helvetica,Arial">GAP</font> contains a library of primitive permutation groups which includes the following permutation groups up to permutation isomorphism (i.e., up to conjugacy in the corresponding symmetric group) <ul> <li> all primitive permutation groups of degree < 2500, calculated in <a href="biblio.htm#RoneyDougal05"><cite>RoneyDougal05</cite></a> in particular, <ul> <li> the primitive permutation groups up to degree 50, calculated by C. Sims, <li> the primitive groups with insoluble socles of degree < 1000 as calculated in <a href="biblio.htm#DixonMortimer88"><cite>DixonMortimer88</cite></a>, <li> the solvable (hence affine) primitive permutation groups of degree < 256 as calculated by M. Short <a href="biblio.htm#Sho92"><cite>Sho92</cite></a>, <li> some insolvable affine primitive permutation groups of degree < 256 as calculated in <a href="biblio.htm#Theissen97"><cite>Theissen97</cite></a>. <li> The solvable primitive groups of degree up to 999 as calculated in <a href="biblio.htm#EickHoefling02"><cite>EickHoefling02</cite></a>. <li> The primitive groups of affine type of degree up to 999 as calculated in <a href="biblio.htm#RoneyDougal02"><cite>RoneyDougal02</cite></a>. </ul></ul> <p> Not all groups are named, those which do have names use ATLAS notation. Not all names are necessary unique! <p> The list given in <a href="biblio.htm#RoneyDougal05"><cite>RoneyDougal05</cite></a> is believed to be complete, correcting various omissions in <a href="biblio.htm#DixonMortimer88"><cite>DixonMortimer88</cite></a>, <a href="biblio.htm#Sho92"><cite>Sho92</cite></a> and <a href="biblio.htm#Theissen97"><cite>Theissen97</cite></a>. <p> In detail, we guarantee the following properties for this and further versions (but <strong>not</strong> versions which came before <font face="Gill Sans,Helvetica,Arial">GAP</font> 4.2) of the library: <p> <ul> <li> All groups in the library are primitive permutation groups of the indicated degree. <li> The positions of the groups in the library are stable. That is <code>PrimitiveGroup(</code><var>n</var><code>,</code><var>nr</var><code>)</code> will always give you a permutation isomorphic group. Note however that we do not guarantee to keep the chosen <i>S</i><sub><i>n</i></sub>-representative, the generating set or the name for eternity. <li> Different groups in the library are not conjugate in <i>S</i><sub><i>n</i></sub>. <li> If a group in the library has a primitive subgroup with the same socle, this group is in the library as well. </ul> <p> (Note that the arrangement of groups is not guaranteed to be in increasing size, though it holds for many degrees.) <p> <a name = "SSEC009.1"></a> <li><code>PrimitiveGroup( </code><var>deg</var><code>, </code><var>nr</var><code> ) F</code> <p> returns the primitive permutation group of degree <var>deg</var> with number <var>nr</var> from the list. <p> The arrangement of the groups differs from the arrangement of primitive groups in the list of C. Sims, which was used in <font face="Gill Sans,Helvetica,Arial">GAP</font> 3. See <code>SimsNo</code> (<a href="CHAP048.htm#SSEC010.2">SimsNo</a>). <p> <a name = "SSEC009.2"></a> <li><code>NrPrimitiveGroups( </code><var>deg</var><code> ) F</code> <p> returns the number of primitive permutation groups of degree <var>deg</var> in the library. <p> <pre> gap> NrPrimitiveGroups(25); 28 gap> PrimitiveGroup(25,19); 5^2:((Q(8):3)'4) gap> PrimitiveGroup(25,20); ASL(2, 5) gap> PrimitiveGroup(25,22); AGL(2, 5) gap> PrimitiveGroup(25,23); (A(5) x A(5)):2 </pre> <p> The selection functions (see <a href="CHAP048.htm#SECT005">Selection functions</a>) for the primitive groups library are <code>AllPrimitiveGroups</code> and <code>OnePrimitiveGroup</code>. They obtain the following properties from the database without having to compute them anew: <p> <code>NrMovedPoints</code>, <code>Size</code>, <code>Transitivity</code>, <code>ONanScottType</code>, <code>IsSimpleGroup</code>, <code>IsSolvableGroup</code>, and <code>SocleTypePrimitiveGroup</code>. <p> (Note, that for groups of degree up to 2499, O'Nan-Scott types 4a, 4b and 5 cannot occur.) <p> <a name = "SSEC009.3"></a> <li><code>PrimitiveGroupsIterator( </code><var>attr1</var><code>, </code><var>val1</var><code>, </code><var>attr2</var><code>, </code><var>val2</var><code>, ... ) F</code> <p> returns an iterator through <code>AllPrimitiveGroups(</code><var>attr1</var><code>,</code><var>val1</var><code>,</code><var>attr2</var><code>,</code><var>val2</var><code>,...)</code> without creating all these groups at the same time. <p> <a name = "SSEC009.4"></a> <li><code>COHORTS_PRIMITIVE_GROUPS V</code> <p> In <a href="biblio.htm#DixonMortimer88"><cite>DixonMortimer88</cite></a> the primitive groups are sorted in ``cohorts'' according to their socle. For each degree, the variable <code>COHORTS_PRIMITIVE_GROUPS</code> contains a list of the cohorts for the primitive groups of this degree. Each cohort is represented by a list of length 2, the first entry specifies the socle type (see <code>SocleTypePrimitiveGroup</code>, section <a href="CHAP041.htm#SSEC004.2">SocleTypePrimitiveGroup</a>), the second entry listing the index numbers of the groups in this degree. <p> For example in degree 49, we have four cohorts with socles <b>F</b><sub>7</sub><sup>2</sup>, <i>L</i><sub>2</sub>(7)<sup>2</sup>, <i>A</i><sub>7</sub><sup>2</sup> and <i>A</i><sub>49</sub> respectively. the group <code>PrimitiveGroup(49,36)</code>, which is isomorphic to (<i>A</i><sub>7</sub>×<i>A</i><sub>7</sub>):2<sup>2</sup>, lies in the third cohort with socle (<i>A</i><sub>7</sub>×<i>A</i><sub>7</sub>). <p> <pre> gap> COHORTS_PRIMITIVE_GROUPS[49]; [ [ rec( series := "Z", parameter := 7, width := 2 ), [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 ] ], [ rec( series := "L", parameter := [ 2, 7 ], width := 2 ), [ 34 ] ], [ rec( series := "A", parameter := 7, width := 2 ), [ 35, 36, 37, 38 ] ], [ rec( series := "A", parameter := 49, width := 1 ), [ 39, 40 ] ] ] </pre> <p> <p> <h2><a name="SECT010">48.10 Index numbers of primitive groups</a></h2> <p><p> <a name = "SSEC010.1"></a> <li><code>PrimitiveIdentification( </code><var>G</var><code> ) A</code> <p> For a primitive permutation group for which an <i>S</i><sub><i>n</i></sub>-conjugate exists in the library of primitive permutation groups (see <a href="CHAP048.htm#SECT009">Primitive Permutation Groups</a>), this attribute returns the index position. That is <var>G</var> is conjugate to <code>PrimitiveGroup(NrMovedPoints(</code><var>G</var><code>),PrimitiveIdentification(</code><var>G</var><code>))</code>. <p> Methods only exist if the primitive groups library is installed. <p> Note: As this function uses the primitive groups library, the result is only guaranteed to the same extent as this library. If it is incomplete, <code>PrimitiveIdentification</code> might return an existing index number for a group not in the library. <p> <pre> gap> PrimitiveIdentification(Group((1,2),(1,2,3))); 2 </pre> <p> <a name = "SSEC010.2"></a> <li><code>SimsNo( </code><var>G</var><code> ) A</code> <p> If <var>G</var> is a primitive group obtained by <code>PrimitiveGroup</code> (respectively one of the selection functions) this attribute contains the number of the isomorphic group in the original list of C. Sims. (this is the arrangement as it was used in <font face="Gill Sans,Helvetica,Arial">GAP</font> 3. <p> <pre> gap> g:=PrimitiveGroup(25,2); 5^2:S(3) gap> SimsNo(g); 3 </pre> <p> As mentioned in the previous section, the index numbers of primitive groups in <font face="Gill Sans,Helvetica,Arial">GAP</font> are guaranteed to remain stable. (Thus, missing groups will be added to the library at the end of each degree.) In particular, it is safe to refer to a primitive group of type <var>deg</var>,<var>nr</var> in the <font face="Gill Sans,Helvetica,Arial">GAP</font> library. <p> The system <code>Magma</code> also provides a list of primitive groups (see <a href="biblio.htm#RoneyDougal02"><cite>RoneyDougal02</cite></a>). For historical reasons, its indexing up to degree 999 differs from the one used by <font face="Gill Sans,Helvetica,Arial">GAP</font>. The variable <p> <a name = "SSEC010.3"></a> <li><code>PRIMITIVE_INDICES_MAGMA V</code> <p> can be used to obtain this correspondence. The magma index number of the <font face="Gill Sans,Helvetica,Arial">GAP</font> group <code>PrimitiveGroup(</code><var>deg</var><code>,</code><var>nr</var><code>)</code> is stored in the entry <code>PRIMITIVE_INDICES_MAGMA[</code><var>deg</var><code>][</code><var>nr</var><code>]</code>, for degree at most 999. <p> Vice versa, the group of degree <var>deg</var> with <code>Magma</code> index number <var>nr</var> has the <font face="Gill Sans,Helvetica,Arial">GAP</font> index <p> <code>Position(PRIMITIVE_INDICES_MAGMA[</code><var>deg</var><code>],</code><var>nr</var><code>)</code>, in particular it can be obtained by the <font face="Gill Sans,Helvetica,Arial">GAP</font> command <p> <code>PrimitiveGroup(</code><var>deg</var><code>,Position(PRIMITIVE_INDICES_MAGMA[</code><var>deg</var><code>],</code><var>nr</var><code>));</code> <p> <p> <h2><a name="SECT011">48.11 Irreducible Solvable Matrix Groups</a></h2> <p><p> <a name = "SSEC011.1"></a> <li><code>IrreducibleSolvableGroupMS( </code><var>n</var><code>, </code><var>p</var><code>, </code><var>i</var><code> ) F</code> <p> This function returns a representative of the <var>i</var>-th conjugacy class of irreducible solvable subgroup of <var>GL(n,p)</var>, where <var>n</var> is an integer > 1, <var>p</var> is a prime, and <i>p</i> <sup><i>n</i> </sup> < 256. <p> The numbering of the representatives should be considered arbitrary. However, it is guaranteed that the <var>i</var>-th group on this list will lie in the same conjugacy class in all future versions of <font face="Gill Sans,Helvetica,Arial">GAP</font>, unless two (or more) groups on the list are discovered to be duplicates, in which case <code>IrreducibleSolvableMatrixGroup</code> will return <code>fail</code> for all but one of the duplicates. <p> For values of <var>n</var>, <var>p</var>, and <var>i</var> admissible to <code>IrreducibleSolvableGroup</code>, <code>IrreducibleSolvableMatrixGroup</code> returns a representative of the same conjugacy class of subgroups of <var>GL(n,p)</var> as <code>IrreducibleSolvableGroup</code>. Note that it currently adds two more groups (missing from the original list by Mark Short) for <i>n</i> = 2, <i>p</i> = 13. <p> <a name = "SSEC011.2"></a> <li><code>NumberIrreducibleSolvableGroups( </code><var>n</var><code>, </code><var>p</var><code> ) F</code> <p> This function returns the number of conjugacy classes of irreducible solvable subgroup of <var>GL(n,p)</var>. <p> <a name = "SSEC011.3"></a> <li><code>AllIrreducibleSolvableGroups( </code><var>func_1</var><code>, </code><var>val_1</var><code>, </code><var>func_2</var><code>, </code><var>val_2</var><code>, ... ) F</code> <p> This function returns a list of conjugacy class representatives <var>G</var> of matrix groups over a prime field such that <i>func</i><sub><i>i</i></sub> (<i>G</i>) = <i>val</i><sub><i>i</i></sub> or <i>func</i><sub><i>i</i></sub> (<i>G</i>) ∈ <i>val</i><sub><i>i</i></sub> . The following possibilities for <var>func_i</var> are particularly efficient, because the values can be read off the information in the data base: <code>DegreeOfMatrixGroup</code> (or <code>Dimension</code> or <code>DimensionOfMatrixGroup</code>) for the linear degree, <code>Characteristic</code> for the field characteristic, <code>Size</code>, <code>IsPrimitiveMatrixGroup</code> (or <code>IsLinearlyPrimitive</code>), and <code>MinimalBlockDimension</code>. <p> <a name = "SSEC011.4"></a> <li><code>OneIrreducibleSolvableGroup( </code><var>func1</var><code>, </code><var>val1</var><code>, </code><var>func2</var><code>, </code><var>val2</var><code>, ... ) F</code> <p> This function returns one solvable subgroup <var>G</var> of a matrix group over a prime field such that <i>func</i><sub><i>i</i></sub> (<i>G</i>) = <i>val</i><sub><i>i</i></sub> or <i>func</i><sub><i>i</i></sub> (<i>G</i>) ∈ <i>val</i><sub><i>i</i></sub> for all <var>i</var>. The following possibilities for <var>func_i</var> are particularly efficient, because the values can be read off the information in the data base: <code>DegreeOfMatrixGroup</code> (or <code>Dimension</code> or <code>DimensionOfMatrixGroup</code>) for the linear degree, <code>Characteristic</code> for the field characteristic, <code>Size</code>, <code>IsPrimitiveMatrixGroup</code> (or <code>IsLinearlyPrimitive</code>), and <code>MinimalBlockDimension</code>. <p> <a name = "SSEC011.5"></a> <li><code>PrimitiveIndexIrreducibleSolvableGroup V</code> <p> This variable provides a way to get from irreducible solvable groups to primitive groups and vice versa. For the group <var>G</var>=<code>IrreducibleSolvableGroup( </code><var>n</var><code>, </code><var>p</var><code>, </code><var>k</var><code> )</code> and <i>d</i>=<i>p</i><sup><i>n</i></sup>, the entry <code>PrimitiveIndexIrreducibleSolvableGroup[d][i]</code> gives the index number of the semidirect product <i>p</i><sup><i>n</i></sup>:<i>G</i> in the library of primitive groups. <p> Searching for an index <code>Position</code> in this list gives the translation in the other direction. <p> <a name = "SSEC011.6"></a> <li><code>IrreducibleSolvableGroup( </code><var>n</var><code>, </code><var>p</var><code>, </code><var>i</var><code> ) F</code> <p> This function is obsolete, because for <i>n</i> = 2, <i>p</i> = 13, two groups were missing from the underlying database. It has been replaced by the function <code>IrreducibleSolvableGroupMS</code> (see <a href="CHAP048.htm#SSEC011.1">IrreducibleSolvableGroupMS</a>). Please note that the latter function does not guarantee any ordering of the groups in the database. However, for values of <var>n</var>, <var>p</var>, and <var>i</var> admissible to <code>IrreducibleSolvableGroup</code>, <code>IrreducibleSolvableGroupMS</code> returns a representative of the same conjugacy class of subgroups of <var>GL(n,p)</var> as <code>IrreducibleSolvableGroup</code> did before. <p> <p> <h2><a name="SECT012">48.12 Irreducible Maximal Finite Integral Matrix Groups</a></h2> <p><p> A library of irreducible maximal finite integral matrix groups is provided with <font face="Gill Sans,Helvetica,Arial">GAP</font>. It contains <b>Q</b>-class representatives for all of these groups of dimension at most 31, and <b>Z</b>-class representatives for those of dimension at most 11 or of dimension 13, 17, 19, or 23. <p> The groups provided in this library have been determined by Wilhelm Plesken, partially as joint work with Michael Pohst, or by members of his institute (Lehrstuhl B für Mathematik, RWTH Aachen). In particular, the data for the groups of dimensions 2 to 9 have been taken from the output of computer calculations which they performed in 1979 (see <a href="biblio.htm#PP77"><cite>PP77</cite></a>, <a href="biblio.htm#PP80"><cite>PP80</cite></a>). The <b>Z</b>-class representatives of the groups of dimension 10 have been determined and computed by Bernd Souvignier (<a href="biblio.htm#Sou94"><cite>Sou94</cite></a>), and those of dimensions 11, 13, and 17 have been recomputed for this library from the circulant Gram matrices given in <a href="biblio.htm#Ple85"><cite>Ple85</cite></a>, using the stand-alone programs for the computation of short vectors and Bravais groups which have been developed in Plesken's institute. The <b>Z</b>-class representatives of the groups of dimensions 19 and 23 had already been determined in <a href="biblio.htm#Ple85"><cite>Ple85</cite></a>. Gabriele Nebe has recomputed them for us. Her main contribution to this library, however, is that she has determined and computed the <b>Q</b>-class representatives of the groups of non-prime dimensions between 12 and 24 and the groups of dimensions 25 to 31 (see <a href="biblio.htm#PN95"><cite>PN95</cite></a>, <a href="biblio.htm#NP95"><cite>NP95</cite></a>, <a href="biblio.htm#Neb95"><cite>Neb95</cite></a>, <a href="biblio.htm#Neb96"><cite>Neb96</cite></a>). <p> The library has been brought into <font face="Gill Sans,Helvetica,Arial">GAP</font> format by Volkmar Felsch. He has applied several <font face="Gill Sans,Helvetica,Arial">GAP</font> routines to check certain consistency of the data. However, the credit and responsibility for the lists remain with the authors. We are grateful to Wilhelm Plesken, Gabriele Nebe, and Bernd Souvignier for supplying their results to <font face="Gill Sans,Helvetica,Arial">GAP</font>. <p> In the preceding acknowledgement, we used some notations that will also be needed in the sequel. We first define these. <p> Any integral matrix group <i>G</i> of dimension <i>n</i> is a subgroup of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) as well as of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>) and hence lies in some conjugacy class of integral matrix groups under <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) and also in some conjugacy class of rational matrix groups under <i>GL</i><sub><i>n</i></sub>(<b>Q</b>). As usual, we call these classes the <b>Z</b>-class and the <b>Q</b>-class of <i>G</i>, respectively. Note that any conjugacy class of subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>) contains at least one <b>Z</b>-class of subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) and hence can be considered as the <b>Q</b>-class of some integral matrix group. <p> In the context of this library we are only concerned with <b>Z</b>-classes and <b>Q</b>-classes of subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) which are irreducible and maximal finite in <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) (we will call them <strong>i.m.f.</strong> subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>)). We can distinguish two types of these groups: <p> First, there are those i.m.f. subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) which are also maximal finite subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>). Let us denote the set of their <b>Q</b>-classes by <i>Q</i><sub>1</sub>(<i>n</i>). It is clear from the above remark that <i>Q</i><sub>1</sub>(<i>n</i>) just consists of the <b>Q</b>-classes of i.m.f. subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>). <p> Secondly, there is the set <i>Q</i><sub>2</sub>(<i>n</i>) of the <b>Q</b>-classes of the remaining i.m.f. subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>), i.e., of those which are not maximal finite subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>). For any such group <i>G</i>, say, there is at least one class <i>C</i> ∈ <i>Q</i><sub>1</sub>(<i>n</i>) such that <i>G</i> is conjugate under <b>Q</b> to a proper subgroup of some group <i>H</i> ∈ <i>C</i>. In fact, the class <i>C</i> is uniquely determined for any group <i>G</i> occurring in the library (though there seems to be no reason to assume that this property should hold in general). Hence we may call <i>C</i> the <strong>rational i.m.f. class</strong> of <i>G</i>. Finally, we will denote the number of classes in <i>Q</i><sub>1</sub>(<i>n</i>) and <i>Q</i><sub>2</sub>(<i>n</i>) by <i>q</i><sub>1</sub>(<i>n</i>) and <i>q</i><sub>2</sub>(<i>n</i>), respectively. <p> As an example, let us consider the case <i>n</i> = 4. There are 6 <b>Z</b>-classes of i.m.f. subgroups of <i>GL</i><sub>4</sub>(<b>Z</b>) with representative subgroups <i>G</i><sub>1</sub>, …, <i>G</i><sub>6</sub> of isomorphism types <i>G</i><sub>1</sub> ≅ <i>W</i>(<i>F</i><sub>4</sub>), <i>G</i><sub>2</sub> ≅ <i>D</i><sub>12</sub> wr <i>C</i><sub>2</sub>, <i>G</i><sub>3</sub> ≅ <i>G</i><sub>4</sub> ≅ <i>C</i><sub>2</sub> ×<i>S</i><sub>5</sub>, <i>G</i><sub>5</sub> ≅ <i>W</i>(<i>B</i><sub>4</sub>), and <i>G</i><sub>6</sub> ≅ (<i>D</i><sub>12</sub> <tt>Y</tt> <i>D</i><sub>12</sub>) : <i>C</i><sub>2</sub>. The corresponding <b>Q</b>-classes, <i>R</i><sub>1</sub>, …, <i>R</i><sub>6</sub>, say, are pairwise different except that <i>R</i><sub>3</sub> coincides with <i>R</i><sub>4</sub>. The groups <i>G</i><sub>1</sub>, <i>G</i><sub>2</sub>, and <i>G</i><sub>3</sub> are i.m.f. subgroups of <i>GL</i><sub>4</sub>(<b>Q</b>), but <i>G</i><sub>5</sub> and <i>G</i><sub>6</sub> are not because they are conjugate under <i>GL</i><sub>4</sub>(<b>Q</b>) to proper subgroups of <i>G</i><sub>1</sub> and <i>G</i><sub>2</sub>, respectively. So we have <i>Q</i><sub>1</sub>(4) = { <i>R</i><sub>1</sub>, <i>R</i><sub>2</sub>, <i>R</i><sub>3</sub> }, <i>Q</i><sub>2</sub>(4) = { <i>R</i><sub>5</sub>, <i>R</i><sub>6</sub> }, <i>q</i><sub>1</sub>(4) = 3, and <i>q</i><sub>2</sub>(4) = 2. <p> The <i>q</i><sub>1</sub>(<i>n</i>) <b>Q</b>-classes of i.m.f. subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>) have been determined for each dimension <i>n</i> ≤ 31. The current <font face="Gill Sans,Helvetica,Arial">GAP</font> library provides integral representative groups for all these classes. Moreover, all <b>Z</b>-classes of i.m.f. subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) are known for <i>n</i> ≤ 11 and for <i>n</i> ∈ {13,17,19,23}. For these dimensions, the library offers integral representative groups for all <b>Q</b>-classes in <i>Q</i><sub>1</sub>(<i>n</i>) and <i>Q</i><sub>2</sub>(<i>n</i>) as well as for all <b>Z</b>-classes of i.m.f. subgroups of <i>GL</i><sub><i>n</i></sub>(<b>Z</b>). <p> Any group <i>G</i> of dimension <i>n</i> given in the library is represented as the automorphism group <i>G</i> = <span class="roman">Aut</span>(<i>F</i>,<i>L</i>) = { <i>g</i> ∈ <i>GL</i><sub><i>n</i></sub>(<b>Z</b>) | <i>Lg</i> = <i>L</i> <span class="roman">and</span> <i>g</i> <i>F</i> <i>g</i><sup><span class="roman">tr</span></sup> = <i>F</i> } of a positive definite symmetric <i>n</i> ×<i>n</i> matrix <i>F</i> ∈ <b>Z</b><sup><i>n</i> ×<i>n</i></sup> on an <i>n</i>-dimensional lattice <i>L</i> ≅ <b>Z</b><sup>1 ×<i>n</i></sup> (for details see e.g. <a href="biblio.htm#PN95"><cite>PN95</cite></a>). <font face="Gill Sans,Helvetica,Arial">GAP</font> provides for <i>G</i> a list of matrix generators and the <strong>Gram matrix</strong> <i>F</i>. <p> The positive definite quadratic form defined by <i>F</i> defines a <strong>norm</strong> <i>v</i> <i>F</i> <i>v</i><sup><span class="roman">tr</span></sup> for each vector <i>v</i> ∈ <i>L</i>, and there is only a finite set of vectors of minimal norm. These vectors are often simply called the <strong>short vectors</strong>. Their set splits into orbits under <i>G</i>, and <i>G</i> being irreducible acts faithfully on each of these orbits by multiplication from the right. <font face="Gill Sans,Helvetica,Arial">GAP</font> provides for each of these orbits the orbit size and a representative vector. <p> Like most of the other <font face="Gill Sans,Helvetica,Arial">GAP</font> libraries, the library of i.m.f. integral matrix groups supplies an extraction function, <code>ImfMatrixGroup</code>. However, as the library involves only 525 different groups, there is no need for a selection or an example function. Instead, there are two functions, <code>ImfInvariants</code> and <code>DisplayImfInvariants</code>, which provide some <b>Z</b>-class invariants that can be extracted from the library without actually constructing the representative groups themselves. The difference between these two functions is that the latter one displays the resulting data in some easily readable format, whereas the first one returns them as record components so that you can properly access them. <p> We shall give an individual description of each of the library functions, but first we would like to insert a short remark concerning their names: Any self-explaining name of a function handling <strong>irreducible maximal finite integral matrix groups</strong> would have to include this term in full length and hence would grow extremely long. Therefore we have decided to use the abbreviation <code>Imf</code> instead in order to restrict the names to some reasonable length. <p> The first three functions can be used to formulate loops over the classes. <p> <a name = "SSEC012.1"></a> <li><code>ImfNumberQQClasses( </code><var>dim</var><code> ) F</code> <a name = "SSEC012.1"></a> <li><code>ImfNumberQClasses( </code><var>dim</var><code> ) F</code> <a name = "SSEC012.1"></a> <li><code>ImfNumberZClasses( </code><var>dim</var><code>, </code><var>q</var><code> ) F</code> <p> <code>ImfNumberQQClasses</code> returns the number <i>q</i><sub>1</sub>(<var>dim</var>) of <b>Q</b>-classes of i.m.f. rational matrix groups of dimension <var>dim</var>. Valid values of <var>dim</var> are all positive integers up to 31. <p> Note: In order to enable you to loop just over the classes belonging to <i>Q</i><sub>1</sub>(<var>dim</var>), we have arranged the list of <b>Q</b>-classes of dimension <var>dim</var> for any dimension <var>dim</var> in the library such that, whenever the classes of <i>Q</i><sub>2</sub>(<var>dim</var>) are known, too, i.e., in the cases <i>dim</i> ≤ 11 or <i>dim</i> ∈ {13,17,19,23}, the classes of <i>Q</i><sub>1</sub>(<var>dim</var>) precede those of <i>Q</i><sub>2</sub>(<var>dim</var>) and hence are numbered from 1 to <i>q</i><sub>1</sub>(<var>dim</var>). <p> <code>ImfNumberQClasses</code> returns the number of <b>Q</b>-classes of groups of dimension <var>dim</var> which are available in the library. If <i>dim</i> ≤ 11 or <i>dim</i> ∈ {13,17,19,23}, this is the number <i>q</i><sub>1</sub>(<var>dim</var>) + <i>q</i><sub>2</sub>(<var>dim</var>) of <b>Q</b>-classes of i.m.f. subgroups of <i>GL</i><sub><i>dim</i></sub>(<b>Z</b>). Otherwise, it is just the number <i>q</i><sub>1</sub>(<var>dim</var>) of <b>Q</b>-classes of i.m.f. subgroups of <i>GL</i><sub><i>dim</i></sub>(<b>Q</b>). Valid values of <var>dim</var> are all positive integers up to 31. <p> <code>ImfNumberZClasses</code> returns the number of <b>Z</b>-classes in the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class of i.m.f. integral matrix groups of dimension <var>dim</var>. Valid values of <var>dim</var> are all positive integers up to 11 and all primes up to 23. <p> <a name = "SSEC012.2"></a> <li><code>DisplayImfInvariants( </code><var>dim</var><code>, </code><var>q</var><code> ) F</code> <li><code>DisplayImfInvariants( </code><var>dim</var><code>, </code><var>q</var><code>, </code><var>z</var><code> ) F</code> <p> <code>DisplayImfInvariants</code> displays the following <b>Z</b>-class invariants of the groups in the <var>z</var><sup><span class="roman">th</span></sup> <b>Z</b>-class in the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class of i.m.f. integral matrix groups of dimension <var>dim</var>: <p> <ul> <li> its <b>Z</b>-class number in the form <var>dim</var>.<var>q</var>.<var>z</var>, if <var>dim</var> is at most 11 or a prime at most 23, or its <b>Q</b>-class number in the form <var>dim</var>.<var>q</var>, else, <li> a message if the group is solvable, <li> the size of the group, <li> the isomorphism type of the group, <li> the elementary divisors of the associated quadratic form, <li> the sizes of the orbits of short vectors (these sizes are the degrees of the faithful permutation representations which you may construct using the functions <code>IsomorphismPermGroup</code> or <code>IsomorphismPermGroupImfGroup</code> below), <li> the norm of the associated short vectors, <li> only in case that the group is not an i.m.f. group in <i>GL</i><sub><i>n</i></sub>(<b>Q</b>): an appropriate message, including the <b>Q</b>-class number of the corresponding rational i.m.f. class. </ul> <p> If you specify the value 0 for any of the parameters <var>dim</var>, <var>q</var>, or <var>z</var>, the command will loop over all available dimensions, <b>Q</b>-classes of given dimension, or <b>Z</b>-classes within the given <b>Q</b>-class, respectively. Otherwise, the values of the arguments must be in range. A value <var>z</var> ≠ 1 must not be specified if the <b>Z</b>-classes are not known for the given dimension, i.e., if <i>dim</i> > 11 and <i>dim</i> ∉ {13,17,19,23}. The default value of <var>z</var> is 1. This value of <var>z</var> will be accepted even if the <b>Z</b>-classes are not known. Then it specifies the only representative group which is available for the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class. The greatest legal value of <var>dim</var> is 31. <p> <pre> gap> DisplayImfInvariants( 3, 1, 0 ); #I Z-class 3.1.1: Solvable, size = 2^4*3 #I isomorphism type = C2 wr S3 = C2 x S4 = W(B3) #I elementary divisors = 1^3 #I orbit size = 6, minimal norm = 1 #I Z-class 3.1.2: Solvable, size = 2^4*3 #I isomorphism type = C2 wr S3 = C2 x S4 = C2 x W(A3) #I elementary divisors = 1*4^2 #I orbit size = 8, minimal norm = 3 #I Z-class 3.1.3: Solvable, size = 2^4*3 #I isomorphism type = C2 wr S3 = C2 x S4 = C2 x W(A3) #I elementary divisors = 1^2*4 #I orbit size = 12, minimal norm = 2 gap> DisplayImfInvariants( 8, 15, 1 ); #I Z-class 8.15.1: Solvable, size = 2^5*3^4 #I isomorphism type = C2 x (S3 wr S3) #I elementary divisors = 1*3^3*9^3*27 #I orbit size = 54, minimal norm = 8 #I not maximal finite in GL(8,Q), rational imf class is 8.5 gap> DisplayImfInvariants( 20, 23 ); #I Q-class 20.23: Size = 2^5*3^2*5*11 #I isomorphism type = (PSL(2,11) x D12).C2 #I elementary divisors = 1^18*11^2 #I orbit size = 3*660 + 2*1980 + 2640 + 3960, minimal norm = 4 </pre> <p> Note that the function <code>DisplayImfInvariants</code> uses a kind of shorthand to display the elementary divisors. E. g., the expression <code>1*3^3*9^3*27</code> in the preceding example stands for the elementary divisors 1,3,3,3,9,9,9,27. (See also the next example which shows that the function <code>ImfInvariants</code> provides the elementary divisors in form of an ordinary <font face="Gill Sans,Helvetica,Arial">GAP</font> list.) <p> In the description of the isomorphism types the following notations are used: <p> <dl compact> <dt><i>A</i> <code>x</code> <i>B</i> <dd> denotes a direct product of a group <i>A</i> by a group <i>B</i>, <p> <dt><i>A</i> <code>subd</code> <i>B</i> <dd> denotes a subdirect product of <i>A</i> by <i>B</i>, <p> <dt><i>A</i> <code>Y</code> <i>B</i> <dd> denotes a central product of <i>A</i> by <i>B</i>, <p> <dt><i>A</i> <code>wr</code> <i>B</i> <dd> denotes a wreath product of <i>A</i> by <i>B</i>, <p> <dt><i>A</i><tt>:</tt><i>B</i> <dd> denotes a split extension of <i>A</i> by <i>B</i>, <p> <dt><i>A</i>·<i>B</i> <dd> denotes just an extension of <i>A</i> by <i>B</i> (split or nonsplit). </dl> <p> The groups involved are <ul> <li> the cyclic groups <i>C</i><sub><i>n</i></sub>, dihedral groups <i>D</i><sub><i>n</i></sub>, and generalized quaternion groups <i>Q</i><sub><i>n</i></sub> of order <i>n</i>, denoted by <code>C</code><var>n</var>, <code>D</code><var>n</var>, and <code>Q</code><var>n</var>, respectively, <li> the alternating groups <i>A</i><sub><i>n</i></sub> and symmetric groups <i>S</i><sub><i>n</i></sub> of degree <i>n</i>, denoted by <code>A</code><var>n</var> and <code>S</code><var>n</var>, respectively, <li> the linear groups <i>GL</i><sub><i>n</i></sub>(<i>q</i>), <i>PGL</i><sub><i>n</i></sub>(<i>q</i>), <i>SL</i><sub><i>n</i></sub>(<i>q</i>), and <i>PSL</i><sub><i>n</i></sub>(<i>q</i>), denoted by <code>GL</code>(<var>n</var>,<var>q</var>), <code>PGL</code>(<var>n</var>,<var>q</var>), <code>SL</code>(<var>n</var>,<var>q</var>), and <code>PSL</code>(<var>n</var>,<var>q</var>), respectively, <li> the unitary groups <i>SU</i><sub><i>n</i></sub>(<i>q</i>) and <i>PSU</i><sub><i>n</i></sub>(<i>q</i>), denoted by <code>SU</code>(<var>n</var>,<var>q</var>) and <code>PSU</code>(<var>n</var>,<var>q</var>), respectively, <li> the symplectic groups <i>Sp</i>(<i>n</i>,<i>q</i>) and <i>PSp</i>(<i>n</i>,<i>q</i>), denoted by <code>Sp</code>(<var>n</var>,<var>q</var>) and <code>PSp</code>(<var>n</var>,<var>q</var>), respectively, <li> the orthogonal groups <i>O</i><sub>8</sub><sup> +</sup>(2) and <i>PO</i><sub>8</sub><sup> +</sup>(2), denoted by <code>O+</code>(8,2) and <code>PO+</code>(8,2), respectively, <li> the extraspecial groups 2<sub>+</sub><sup> 1+8</sup>, 3<sub>+</sub><sup> 1+2</sup>, 3<sub>+</sub><sup> 1+4</sup>, and 5<sub>+</sub><sup> 1+2</sup>, denoted by <code>2+^(1+8)</code>, <code>3+^(1+2)</code>, <code>3+^(1+4)</code>, and <code>5+^(1+2)</code>, respectively, <li> the Chevalley group <i>G</i><sub>2</sub>(3), denoted by <code>G2(3)</code>, <li> the twisted Chevalley group <sup>3</sup><i>D</i><sub>4</sub>(2), denoted by <code>3D4(2)</code>, <li> the Suzuki group <i>Sz</i>(8), denoted by <code>Sz(8)</code>, <li> the Weyl groups <i>W</i>(<i>A</i><sub><i>n</i></sub>), <i>W</i>(<i>B</i><sub><i>n</i></sub>), <i>W</i>(<i>D</i><sub><i>n</i></sub>), <i>W</i>(<i>E</i><sub><i>n</i></sub>), and <i>W</i>(<i>F</i><sub>4</sub>), denoted by <code>W(A</code><var>n</var><code>)</code>, <code>W(B</code><var>n</var><code>)</code>, <code>W(D</code><var>n</var><code>)</code>, <code>W(E</code><var>n</var><code>)</code>, and <code>W(F4)</code>, respectively, <li> the sporadic simple groups <i>Co</i><sub>1</sub>, <i>Co</i><sub>2</sub>, <i>Co</i><sub>3</sub>, <i>HS</i>, <i>J</i><sub>2</sub>, <i>M</i><sub>12</sub>, <i>M</i><sub>22</sub>, <i>M</i><sub>23</sub>, <i>M</i><sub>24</sub>, and <i>Mc</i>, denoted by <code>Co1</code>, <code>Co2</code>, <code>Co3</code>, <code>HS</code>, <code>J2</code>, <code>M12</code>, <code>M22</code>, <code>M23</code>, <code>M24</code>, and <code>Mc</code>, respectively, <li> a point stabilizer of index 11 in <i>M</i><sub>11</sub>, denoted by <code>M10</code>. </ul> <p> As mentioned above, the data assembled by the function <code>DisplayImfInvariants</code> are ``cheap data'' in the sense that they can be provided by the library without loading any of its large matrix files or performing any matrix calculations. The following function allows you to get proper access to these cheap data instead of just displaying them. <p> <a name = "SSEC012.3"></a> <li><code>ImfInvariants( </code><var>dim</var><code>, </code><var>q</var><code> ) F</code> <li><code>ImfInvariants( </code><var>dim</var><code>, </code><var>q</var><code>, </code><var>z</var><code> ) F</code> <p> <code>ImfInvariants</code> returns a record which provides some <b>Z</b>-class invariants of the groups in the <var>z</var><sup><span class="roman">th</span></sup> <b>Z</b>-class in the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class of i.m.f. integral matrix groups of dimension <var>dim</var>. A value <var>z</var> ≠ 1 must not be specified if the <b>Z</b>-classes are not known for the given dimension, i.e., if <i>dim</i> > 11 and <i>dim</i> ∉ {13,17,19,23}. The default value of <var>z</var> is 1. This value of <var>z</var> will be accepted even if the <b>Z</b>-classes are not known. Then it specifies the only representative group which is available for the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class. The greatest legal value of <var>dim</var> is 31. <p> The resulting record contains six or seven components: <p> <p> <dl compact> <dt><code>size</code> <dd> the size of any representative group <var>G</var>, <p> <dt><code>isSolvable</code> <dd> is <code>true</code> if <var>G</var> is solvable, <p> <dt><code>isomorphismType</code> <dd> a text string describing the isomorphism type of <var>G</var> (in the same notation as used by the function <code>DisplayImfInvariants</code> above), <p> <dt><code>elementaryDivisors</code> <dd> the elementary divisors of the associated Gram matrix <var>F</var> (in the same format as the result of the function <code>ElementaryDivisorsMat</code>, see <a href="CHAP024.htm#SSEC008.1">ElementaryDivisorsMat</a>), <p> <dt><code>minimalNorm</code> <dd> the norm of the associated short vectors, <p> <dt><code>sizesOrbitsShortVectors</code> <dd> the sizes of the orbits of short vectors under <var>F</var>, <p> <dt><code>maximalQClass</code> <dd> the <b>Q</b>-class number of an i.m.f. group in <i>GL</i><sub><i>n</i></sub>(<b>Q</b>) that contains <var>G</var> as a subgroup (only in case that not <var>G</var> itself is an i.m.f. subgroup of <i>GL</i><sub><i>n</i></sub>(<b>Q</b>)). </dl> <p> Note that four of these data, namely the group size, the solvability, the isomorphism type, and the corresponding rational i.m.f. class, are not only <b>Z</b>-class invariants, but also <b>Q</b>-class invariants. <p> Note further that, though the isomorphism type is a <b>Q</b>-class invariant, you will sometimes get different descriptions for different <b>Z</b>-classes of the same <b>Q</b>-class (as, e.g., for the classes 3.1.1 and 3.1.2 in the last example above). The purpose of this behaviour is to provide some more information about the underlying lattices. <p> <pre> gap> ImfInvariants( 8, 15, 1 ); rec( size := 2592, isSolvable := true, isomorphismType := "C2 x (S3 wr S3)", elementaryDivisors := [ 1, 3, 3, 3, 9, 9, 9, 27 ], minimalNorm := 8, sizesOrbitsShortVectors := [ 54 ], maximalQClass := 5 ) gap> ImfInvariants( 24, 1 ).size; 10409396852733332453861621760000 gap> ImfInvariants( 23, 5, 2 ).sizesOrbitsShortVectors; [ 552, 53130 ] gap> for i in [ 1 .. ImfNumberQClasses( 22 ) ] do > Print( ImfInvariants( 22, i ).isomorphismType, "\n" ); od; C2 wr S22 = W(B22) (C2 x PSU(6,2)).S3 (C2 x S3) wr S11 = (C2 x W(A2)) wr S11 (C2 x S12) wr C2 = (C2 x W(A11)) wr C2 C2 x S3 x S12 = C2 x W(A2) x W(A11) (C2 x HS).C2 (C2 x Mc).C2 C2 x S23 = C2 x W(A22) C2 x PSL(2,23) C2 x PSL(2,23) C2 x PGL(2,23) C2 x PGL(2,23) </pre> <p> <a name = "SSEC012.4"></a> <li><code>ImfMatrixGroup( </code><var>dim</var><code>, </code><var>q</var><code> ) F</code> <li><code>ImfMatrixGroup( </code><var>dim</var><code>, </code><var>q</var><code>, </code><var>z</var><code> ) F</code> <p> <code>ImfMatrixGroup</code> is the essential extraction function of this library (note that its name has been changed from <code>ImfMatGroup</code> in <font face="Gill Sans,Helvetica,Arial">GAP</font> 3 to <code>ImfMatrixGroup</code> in <font face="Gill Sans,Helvetica,Arial">GAP</font> 4). It returns a representative group, <var>G</var> say, of the <var>z</var><sup><span class="roman">th</span></sup> <b>Z</b>-class in the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class of i.m.f. integral matrix groups of dimension <var>dim</var>. A value <var>z</var> ≠ 1 must not be specified if the <b>Z</b>-classes are not known for the given dimension, i.e., if <i>dim</i> > 11 and <i>dim</i> ∉ {13,17,19,23}. The default value of <var>z</var> is 1. This value of <var>z</var> will be accepted even if the <b>Z</b>-classes are not known. Then it specifies the only representative group which is available for the <var>q</var><sup><span class="roman">th</span></sup> <b>Q</b>-class. The greatest legal value of <var>dim</var> is 31. <p> <pre> gap> G := ImfMatrixGroup( 5, 1, 3 ); ImfMatrixGroup(5,1,3) gap> for m in GeneratorsOfGroup( G ) do PrintArray( m ); od; [ [ -1, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0 ], [ 0, 0, 0, 1, 0 ], [ -1, -1, -1, -1, 2 ], [ -1, 0, 0, 0, 1 ] ] [ [ 0, 1, 0, 0, 0 ], [ 0, 0, 1, 0, 0 ], [ 0, 0, 0, 1, 0 ], [ 1, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 1 ] ] </pre> <p> The attributes <code>Size</code> and <code>IsSolvable</code> will be properly set in the resulting matrix group <var>G</var>. In addition, it has two attributes <code>IsImfMatrixGroup</code> and <code>ImfRecord</code> where the first one is just a logical flag set to true and the latter one is a record. Except for the group size and the solvability flag, this record contains the same components as the resulting record of the function <code>ImfInvariants</code> described above (see <a href="CHAP048.htm#SSEC012.3">ImfInvariants</a>), namely the components <code>isomorphismType</code>, <code>elementaryDivisors</code>, <code>minimalNorm</code>, and <code>sizesOrbitsShortVectors</code> and, if <var>G</var> is not a rational i.m.f. group, <code>maximalQClass</code>. Moreover, it has the two components <p> <p> <dl compact> <dt><code>form</code> <dd> the associated Gram matrix <var>F</var>, and <p> <dt><code>repsOrbitsShortVectors</code> <dd> representatives of the orbits of short vectors under <var>F</var>. </dl> <p> The last one of these components will be required by the function <code>IsomorphismPermGroup</code> below. <p> Example: <p> <pre> gap> Size( G ); 3840 gap> imf := ImfRecord( G );; gap> imf.isomorphismType; "C2 wr S5 = C2 x W(D5)" gap> PrintArray( imf.form ); [ [ 4, 0, 0, 0, 2 ], [ 0, 4, 0, 0, 2 ], [ 0, 0, 4, 0, 2 ], [ 0, 0, 0, 4, 2 ], [ 2, 2, 2, 2, 5 ] ] gap> imf.elementaryDivisors; [ 1, 4, 4, 4, 4 ] gap> imf.minimalNorm; 4 </pre> <p> If you want to perform calculations in such a matrix group <var>G</var> you should be aware of the fact that the permutation group routines of <font face="Gill Sans,Helvetica,Arial">GAP</font> are much more efficient than the matrix group routines. Hence we recommend that you do your computations, whenever possible, in the isomorphic permutation group which is induced by the action of <var>G</var> on one of the orbits of the associated short vectors. You may call one of the following functions <code>IsomorphismPermGroup</code> or <code>IsomorphismPermGroupImfGroup</code> to get an isomorphism to such a permutation group (note that these <font face="Gill Sans,Helvetica,Arial">GAP</font> 4 functions have replaced the <font face="Gill Sans,Helvetica,Arial">GAP</font> 3 functions <code>PermGroup</code> and <code>PermGroupImfGroup</code>). <p> <a name = "SSEC012.5"></a> <li><code>IsomorphismPermGroup( </code><var>G</var><code> ) M</code> <p> returns an isomorphism, ϕ say, from the given i.m.f. integral matrix group <var>G</var> to a permutation group <i>P</i> : = ϕ(<i>G</i> ) acting on a minimal orbit, <i>S</i> say, of short vectors of <var>G</var> such that each matrix <i>m</i> ∈ <i>G</i> is mapped to the permutation induced by its action on <i>S</i>. <p> Note that in case of a large orbit the construction of ϕ may be space and time consuming. Fortunately, there are only six <b>Q</b>-classes in the library for which the smallest orbit of short vectors is of size greater than 20000, the worst case being the orbit of size 196560 for the Leech lattice (<i>dim</i> = 24, <i>q</i> = 3). <p> The inverse isomorphism ϕ<sup>−1</sup> from <var>P</var> to <var>G</var> is constructed by determining a <b>Q</b>-base <i>B</i> ⊂ <i>S</i> of <b>Q</b><sup>1 ×<i>dim</i></sup> in <i>S</i> and, in addition, the associated base change matrix <i>M</i> which transforms <i>B</i> into the standard base of <b>Z</b><sup>1 ×<i>dim</i></sup>. This allows a simple computation of the preimage ϕ<sup>−1</sup>(<i>p</i>) of any permutation <i>p</i> ∈ <i>P</i> as follows. If, for 1 ≤ <i>i</i> ≤ <i>dim</i>, <i>b</i><sub><i>i</i></sub> is the position number in <i>S</i> of the <i>i</i><sup><span class="roman">th</span></sup> base vector in <i>B</i>, it suffices to look up the vector whose position number in <i>S</i> is the image of <i>b</i><sub><i>i</i></sub> under <i>p</i> and to multiply this vector by <i>M</i> to get the <i>i</i><sup><span class="roman">th</span></sup> row of ϕ<sup>−1</sup>(<i>p</i>). <p> You may use the functions <code>Image</code> and <code>PreImage</code> (see <a href="CHAP031.htm#SSEC003.6">Image</a> and <a href="CHAP031.htm#SSEC004.6">PreImage</a>) to switch from <var>G</var> to <var>P</var> and back from <var>P</var> to <var>G</var>. <p> As an example, let us continue the preceding example and compute the solvable residuum of the group <var>G</var>. <p> <pre> gap> # Perform the computations in an isomorphic permutation group. gap> phi := IsomorphismPermGroup( G );; gap> P := Image( phi ); Group([ (1,7,6)(2,9)(4,5,10), (2,3,4,5)(6,9,8,7) ]) gap> D := DerivedSubgroup( P ); Group([ (1,2,10,9)(3,8)(4,5)(6,7), (1,3,10,8)(2,5)(4,7)(6,9), (1,2,8,7,5)(3,4,6,10,9) ]) gap> Size( D ); 960 gap> IsPerfectGroup( D ); true gap> # We have found the solvable residuum of P, gap> # now move the results back to the matrix group G. gap> R := PreImage( phi, D ); <matrix group of size 960 with 3 generators> gap> for m in GeneratorsOfGroup( R ) do PrintArray( m ); od; [ [ -1, -1, -1, -1, 2 ], [ 0, -1, 0, 0, 0 ], [ 0, 0, 0, 1, 0 ], [ 0, 0, 1, 0, 0 ], [ -1, -1, 0, 0, 1 ] ] [ [ 0, 0, 0, 1, 0 ], [ -1, -1, -1, -1, 2 ], [ 0, 0, -1, 0, 0 ], [ 1, 0, 0, 0, 0 ], [ 0, -1, -1, 0, 1 ] ] [ [ 0, -1, 0, 0, 0 ], [ 0, 0, 1, 0, 0 ], [ 0, 0, 0, -1, 0 ], [ 1, 1, 1, 1, -2 ], [ 0, 0, 1, 0, -1 ] ] </pre> <p> <a name = "SSEC012.6"></a> <li><code>IsomorphismPermGroupImfGroup( </code><var>G</var><code>, </code><var>n</var><code> ) F</code> <p> <code>IsomorphismPermGroupImfGroup</code> returns an isomorphism, ϕ say, from the given i.m.f. integral matrix group <var>G</var> to a permutation group <var>P</var> acting on the <i>n</i> <sup><span class="roman">th</span></sup> orbit, <i>S</i> say, of short vectors of <var>G</var> such that each matrix <var>m</var> ∈ <var>G</var> is mapped to the permutation induced by its action on <i>S</i>. <p> The only difference to the above function <code>IsomorphismPermGroup</code> is that you can specify the orbit to be used. In fact, as the orbits of short vectors are sorted by increasing sizes, the function <code>IsomorphismPermGroup( </code><var>G</var><code> )</code> has been implemented such that it is equivalent to <code>IsomorphismPermGroupImfGroup( </code><var>G</var><code>, 1 )</code>. <p> <pre> gap> ImfInvariants( 12, 9 ).sizesOrbitsShortVectors; [ 120, 300 ] gap> G := ImfMatrixGroup( 12, 9 ); ImfMatrixGroup(12,9) gap> phi1 := IsomorphismPermGroupImfGroup( G, 1 );; gap> P1 := Image( phi1 ); <permutation group of size 2400 with 2 generators> gap> LargestMovedPoint( P1 ); 120 gap> phi2 := IsomorphismPermGroupImfGroup( G, 2 );; gap> P2 := Image( phi2 ); <permutation group of size 2400 with 2 generators> gap> LargestMovedPoint( P2 ); 300 </pre> <p> <p> [<a href="../index.htm">Top</a>] [<a href = "chapters.htm">Up</a>] [<a href ="CHAP047.htm">Previous</a>] [<a href ="CHAP049.htm">Next</a>] [<a href = "theindex.htm">Index</a>] <P> <font face="Gill Sans,Helvetica,Arial">GAP 4 manual<br>December 2008 </font></body></html>