7.74 Lattice

Lattice( G )

Lattice returns the lattice of subgroups of the group G in the form of a record L, say, which contains certain lists with some appropriate information on the subgroups of G and their conjugacy classes. In particular, in its component L.classes, L provides the same list of all conjugacy classes of all subgroups of G as is returned by the ConjugacyClassesSubgroups command (see ConjugacyClassesSubgroups).

The construction of the subgroup lattice record L of a group G may be very time consuming. Therefore, as soon as L has been computed for the first time, it will be saved as a component G.lattice in the group record G to avoid any duplication of that effort.

The underlying routines are a reimplementation of the subgroup lattice routines which have been developed since 1958 by several people in Kiel and Aachen under the supervision of Joachim Neubaccent127 user. Their final version, written by Volkmar Felsch in 1984, has been available since then in Cayley (see BC92) and has also been used in SOGOS (see Sog89). The current implementation in GAP by Jaccent127 urgen Mnich is described in Mni92, a summary of the method and references to all predecessors can be found in FS84.

The Lattice command invokes the following procedure. In a first step, the solvable re-si-du-um P, say, of G is computed and looked up in a built-in catalogue of perfect groups which is given in the file LIBNAME/"lattperf.g". A list of subgroups is read off from that catalogue which contains just one representative of each conjugacy class of perfect subgroups of P and hence at least one representative of each conjugacy class of perfect subgroups of G. Then, starting from the identity subgroup and the conjugacy classes of perfect subgroups, the so called cyclic extension method is used to compute the non-perfect subgroups of G by forming for each class representative all its not yet involved cyclic extensions of prime number index and adding their conjugacy classes to the list.

It is clear that this procedure cannot work if the catalogue of perfect groups does not contain a group isomorphic to P. At present, it contains only all perfect groups of order less than 5000 and, in addition, the groups PSL(3,3), M_{11}, and A_8. If the Lattice command is called for a group G with a solvable residuum P not in the catalogue, it will provide an error message. As an example we handle the group SL(2,19) of order 6840.

    gap> s := [ [4,0], [0,5] ] * Z( 19 )^0;;
    gap> t := [ [4,4], [-9,-4] ] * Z(19)^0;;
    gap> G := Group( s, t );;
    gap> Size( G );
    6840
    gap> Lattice( G );
    Error, sorry, can' t identify the group's solvable residuum 

However, if you know the perfect subgroups of G, you can use the Lattice command to compute the whole subgroup lattice of G even if the solvable residuum of G is not in the catalogue. All you have to do in such a case is to create a list of subgroups of G which contains at least one representative of each conjugacy class of proper perfect subgroups of G, attach this list to the group record as a new component G.perfectSubgroups, and then call the Lattice command. The existence of that record component will prevent GAP from looking up the solvable residuum of G in the catalogue. Instead, it will insert the given subgroups into the lattice, leaving it to you to guarantee that in fact all conjugacy classes of proper perfect subgroups are involved.

If you miss classes, the resulting lattice will be incomplete, but you will not get any warning. As long as you are aware of this fact, you may use this possibility to compute a sublattice of the subgroup lattice of G without getting the above mentioned error message even if the solvable residuum of G is not in the catalogue. In particular, you will get at least the classes of all proper solvable subgroups of G if you define G.perfectSubgroups to be an empty list.

As an example for the computation of the complete lattice of subgroups of a group which is not covered by the catalogue, we handle the Mathieu group M_{12}.

    gap> # Define the Mathieu group M12.
    gap> a := (2,3,5,7,11,9,8,12,10,6,4);;
    gap> b := (3,6)(5,8)(9,11)(10,12);;
    gap> c := (1,2)(3,4)(5,9)(6,8)(7,12)(10,11);;
    gap> M12 := Group( a, b, c );;
    gap> Print( "#I  M12 has order ", Size( M12 ), "\n" );
    #I  M12 has order 95040
    gap> # Define a list of proper perfect subgroups of M_12 and attach
    gap> # it to the group record M12 as component M12.perfectSubgroups.
    gap> L2_11a := Subgroup( M12, [ a, b ] );;
    gap> M11a   := Subgroup( M12, [ a, b, c*a^-1*b*a*c ] );;
    gap> M11b   := Subgroup( M12, [ a, b, c*a*b*a^-1*c ] );;
    gap> x      := a*b*a^2;;
    gap> y      := a*c*a^-1*b*a*c*a^6;;
    gap> A6a    := Subgroup( M12, [ x, y ] );;
    gap> A5c    := Subgroup( M12, [ x*y, x^3*y^2*x^2*y ] );;
    gap> x      := a^2*b*a;;
    gap> y      := a^6*c*a*b*a^-1*c*a;;
    gap> A6b    := Subgroup( M12, [ x, y ] );;
    gap> A5d    := Subgroup( M12, [ x*y, x^3*y^2*x^2*y ] );;
    gap> x      := a;;
    gap> y      := b*c*b;;
    gap> z      := c;;
    gap> L2_11b := Subgroup( M12, [ x, y, z ] );;
    gap> A5b    := Subgroup( M12, [ y, x*z ] );;
    gap> x      := c;;
    gap> y      := b*a^-1*c*a*b;;
    gap> z      := a^2*b*a^-1*c*a*b*a^-2;;
    gap> A5a    := Subgroup( M12, [ (x*z)^2, (y*z)^2 ] );;
    gap> M12.perfectSubgroups := [
    >   L2_11a, L2_11b, M11a, M11b, A6a, A6b, A5a, A5b, A5c, A5d ];;
    gap> # Now compute the subgroup lattice of M12.
    gap> lat := Lattice( M12 );
    LatticeSubgroups( Group( ( 2, 3, 5, 7,11, 9, 8,12,10, 6, 4), ( 3, 6)
    ( 5, 8)( 9,11)(10,12), ( 1, 2)( 3, 4)( 5, 9)( 6, 8)( 7,12)(10,11) ) )

The Lattice command returns a record which represents a very complicated structure.

    gap> # Subgroup lattice of M12 (continued)
    gap> RecFields( lat );
    [ "isLattice", "classes", "group", "printLevel", "operations" ] 

Probably the most important component of the lattice record is the list lat.classes. Its elements are domains. They are described in section ConjugacyClassesSubgroups. We can use this list, for instance, to print the number of conjugacy classes of subgroups and the number of subgroups of M_{12}.

    gap> # Subgroup lattice of M12 (continued)
    gap> n1 := Length( lat.classes );;
    gap> n2 := Sum( [ 1 .. n1 ], i -> Size( lat.classes[i] ) );;
    gap> Print( "#I  M12 has ", n1, " classes of altogether ", n2,
    >   " subgroups\n" );
    #I  M12 has 147 classes of altogether 214871 subgroups 

It would not make sense to get all components of a subgroup lattice record printed in full detail whenever we ask GAP to print the lattice. Therefore, as you can see in the above example, the default printout is just an expression of the form "Lattice(,group,)". However, you can ask GAP to display some additional information in any subsequent printout of the lattice by increasing its individual print level. This print level is stored (in the form of a list of several print flags) in the lattice record and can be changed by an appropriate call of the SetPrintLevel indexSetPrintLevel command described below.

The following example demonstrates the effect of the subgroup lattice print level.

    gap> # Subgroup lattice of S4
    gap> s4 := Group( (1,2,3,4), (1,2) );;
    gap> lat := Lattice( s4 );
    LatticeSubgroups( Group( (1,2,3,4), (1,2) ) ) 

The default subgroup lattice print level is 0. In this case, the print command provides just the expression mentioned above.

    gap> # Subgroup lattice of S4 (continued)
    gap> SetPrintLevel( lat, 1 );
    gap> lat;
    #I  class 1, size 1, length 1
    #I  class 2, size 2, length 3
    #I  class 3, size 2, length 6
    #I  class 4, size 3, length 4
    #I  class 5, size 4, length 1
    #I  class 6, size 4, length 3
    #I  class 7, size 4, length 3
    #I  class 8, size 6, length 4
    #I  class 9, size 8, length 3
    #I  class 10, size 12, length 1
    #I  class 11, size 24, length 1
    LatticeSubgroups( Group( (1,2,3,4), (1,2) ) ) 

If the print level is set to a value greater than 0, you get, in addition, for each class a kind of heading line. This line contains the position number and the length of the respective class as well as the order of the subgroups in the class.

    gap> # Subgroup lattice of S4 (continued)
    gap> SetPrintLevel( lat, 2 );
    gap> lat;
    #I  class 1, size 1, length 1
    #I    representative [  ]
    #I      maximals
    #I  class 2, size 2, length 3
    #I    representative [ (1,2)(3,4) ]
    #I      maximals [ 1, 1 ]
    #I  class 3, size 2, length 6
    #I    representative [ (3,4) ]
    #I      maximals [ 1, 1 ]
    #I  class 4, size 3, length 4
    #I    representative [ (2,3,4) ]
    #I      maximals [ 1, 1 ]
    #I  class 5, size 4, length 1
    #I    representative [ (1,2)(3,4), (1,3)(2,4) ]
    #I      maximals [ 2, 1 ] [ 2, 2 ] [ 2, 3 ]
    #I  class 6, size 4, length 3
    #I    representative [ (3,4), (1,2) ]
    #I      maximals [ 3, 1 ] [ 3, 4 ] [ 2, 1 ]
    #I  class 7, size 4, length 3
    #I    representative [ (1,2)(3,4), (1,4,2,3) ]
    #I      maximals [ 2, 1 ]
    #I  class 8, size 6, length 4
    #I    representative [ (2,3,4), (3,4) ]
    #I      maximals [ 4, 1 ] [ 3, 1 ] [ 3, 2 ] [ 3, 3 ]
    #I  class 9, size 8, length 3
    #I    representative [ (3,4), (1,2), (1,3)(2,4) ]
    #I      maximals [ 7, 1 ] [ 6, 1 ] [ 5, 1 ]
    #I  class 10, size 12, length 1
    #I    representative [ (1,2)(3,4), (1,3)(2,4), (2,3,4) ]
    #I      maximals [ 5, 1 ] [ 4, 1 ] [ 4, 2 ] [ 4, 3 ] [ 4, 4 ]
    #I  class 11, size 24, length 1
    #I    representative [ (1,2,3,4), (1,2) ]
    #I      maximals [ 10, 1 ] [ 9, 1 ] [ 9, 2 ] [ 9, 3 ] [ 8, 1 ]
    [ 8, 2 ] [ 8, 3 ] [ 8, 4 ]
    LatticeSubgroups( Group( (1,2,3,4), (1,2) ) )
    gap> PrintClassSubgroupLattice( lat, 8 );
    #I  class 8, size 6, length 4
    #I    representative [ (2,3,4), (3,4) ]
    #I      maximals [ 4, 1 ] [ 3, 1 ] [ 3, 2 ] [ 3, 3 ] 

If the subgroup lattice print level is at least 2, GAP prints, in addition, for each class representative subgroup a set of generators and a list of its maximal subgroups, where each maximal subgroup is represented by a pair of integers consisting of its class number and its position number in that class. As this information blows up the output, it may be convenient to restrict it to a particular class. We can do this by calling the PrintClassSubgroupLattice

    gap> # Subgroup lattice of S4 (continued)
    gap> SetPrintLevel( lat, 3 );
    gap> PrintClassSubgroupLattice( lat, 8 );
    #I  class 8, size 6, length 4
    #I    representative [ (2,3,4), (3,4) ]
    #I      maximals [ 4, 1 ] [ 3, 1 ] [ 3, 2 ] [ 3, 3 ]
    #I    conjugate 2 by (1,4,3,2) is [ (1,2,3), (2,3) ]
    #I    conjugate 3 by (1,2) is [ (1,3,4), (3,4) ]
    #I    conjugate 4 by (1,3)(2,4) is [ (1,2,4), (1,2) ] 

If the subgroup lattice print level has been set to at least 3, GAP displays, in addition, for each non-representative subgroup of a class its number in the class, an element which transforms the class representative subgroup into that subgroup, and a set of generators.

    gap> # Subgroup lattice of S4 (continued)
    gap> SetPrintLevel( lat, 4 );
    gap> PrintClassSubgroupLattice( lat, 8 );
    #I  class 8, size 6, length 4
    #I    representative [ (2,3,4), (3,4) ]
    #I      maximals [ 4, 1 ] [ 3, 1 ] [ 3, 2 ] [ 3, 3 ]
    #I    conjugate 2 by (1,4,3,2) is [ (1,2,3), (2,3) ]
    #I      maximals [ 4, 2 ] [ 3, 2 ] [ 3, 4 ] [ 3, 5 ]
    #I    conjugate 3 by (1,2) is [ (1,3,4), (3,4) ]
    #I      maximals [ 4, 3 ] [ 3, 1 ] [ 3, 5 ] [ 3, 6 ]
    #I    conjugate 4 by (1,3)(2,4) is [ (1,2,4), (1,2) ]
    #I      maximals [ 4, 4 ] [ 3, 4 ] [ 3, 6 ] [ 3, 3 ] 

A subgroup lattice print level value of at least 4 causes GAP to list the maximal subgroups not only for the class representatives, but also for the other subgroups.

    gap> # Subgroup lattice of S4 (continued)
    gap> SetPrintLevel( lat, 5 );
    gap> PrintClassSubgroupLattice( lat, 8 );
    #I  class 8, size 6, length 4
    #I    representative [ (2,3,4), (3,4) ]
    #I      maximals [ 4, 1 ] [ 3, 1 ] [ 3, 2 ] [ 3, 3 ]
    #I      minimals [ 11, 1 ]
    #I    conjugate 2 by (1,4,3,2) is [ (1,2,3), (2,3) ]
    #I      maximals [ 4, 2 ] [ 3, 2 ] [ 3, 4 ] [ 3, 5 ]
    #I      minimals [ 11, 1 ]
    #I    conjugate 3 by (1,2) is [ (1,3,4), (3,4) ]
    #I      maximals [ 4, 3 ] [ 3, 1 ] [ 3, 5 ] [ 3, 6 ]
    #I      minimals [ 11, 1 ]
    #I    conjugate 4 by (1,3)(2,4) is [ (1,2,4), (1,2) ]
    #I      maximals [ 4, 4 ] [ 3, 4 ] [ 3, 6 ] [ 3, 3 ]
    #I      minimals [ 11, 1 ] 

The maximal valid value of the subgroup lattice print level is 5. If it is set, GAP displays not only the maximal subgroups, but also the minimal supergroups of each subgroup. This is the most extensive output of a subgroup lattice record which you can get with the Print command, but of course you can use the RecFields command (see RecFields) to list all record components and then print them out individually in full detail.

If the computation of some subgroup lattice is very time consuming (as in the above example of the Mathieu group M_{12}), you might wish to see some intermediate printout which informs you about the progress of the computation. In fact, you can get such messages by activating a print mechanism which has been inserted into the subgroup lattice routines for diagnostic purposes. All you have to do is to replace the call

lat := Lattice( M12 );

by the three calls

    InfoLattice1 := Print;
    lat := Lattice( M12 );
    InfoLattice1 := Ignore; 

Note, however, that the final numbering of the conjugacy classes of subgroups will differ from the order in which they occur in the intermediate listing because they will be reordered by increasing subgroup orders at the end of the construction.

PrintClassSubgroupLattice( lattice, n )

PrintClassSubgroupLattice prints information on the nth conjugacy class of subgroups in the subgroup lattice lattice. The amount of this information depends on the current value of the subgroup lattice print level of lattice. Note that the default of that print level is zero which means that you will not get any output from the PrintClassSubgroupLattice command without increasing it (see SetPrintLevel below). Examples are given in the above description of the Lattice command.

SetPrintLevel( lattice, level )

SetPrintLevel changes the subgroup lattice print level of the subgroup lattice lattice to the specified value level by an appropriate alteration of the list of print flags which is stored in lattice.printLevel. The argument level is expected to be an integer between 0 and 5.

Examples of the effect of the subgroup lattice print level are given in the above description of the Lattice command.

Previous Up Top Next
Index

GAP 3.4.4
April 1997