Modular subgroup lattice in GAP
I want to know if one can ask GAP to decide whether the subgroup lattice of a specific finite group $G$ is modular, via a simple command.
Many thanks.
Update: relevant questions have been addressed by Ballester-Bolinches, Cosme-Llópez, and Esteban-Romero here. They developed a GAP package PERMUT, which is now redistributed with GAP as an accepted package (the package refereeing system for GAP packages is described here). The manual for the PERMUT package is also included in the distribution, or may be found online here.
Thank you, it's an interesting question. I am not aware of such functionality available anywhere, but looking at the literature (see references in the comments in the GAP code below), it seems that there may be at least three possible approaches:
1) Calculate the lattice of subgroups and check that it does not contain a sublattice isomorphic to the "pentagon" lattice.
2) Since groups with modular subgroup lattice (also called M-groups) are classified, one can try to implement known criteria for a finite group to be an M-group.
3) Straightforward calculation of subgroups of the group and then checking that the modular law holds.
I've implemented (3) in GAP as follows:
IsMGroup:=function(G) # # References: # 1) R. Schmidt, Subgroup lattices of groups. Expositions in Mathematics, 14. # Walter de Gruyter, Berlin, 1994. # 2) P.P. Pálfy, Groups and lattices. Groups St. Andrews 2001 in Oxford. # Vol. II, 428–454, London Math. Soc. Lecture Note Ser., 305, Cambridge # Univ. Press, Cambridge, 2003. # 3) A. Ballester-Bolinches, R. Esteban-Romero, M. Asaad, Products of finite # groups. Expositions in Mathematics, 53. Walter de Gruyter, Berlin, 2010. # local ccg, ccz, cg, cz, x, y, z, c; # Easy cases first # Abelian groups are M-groups if IsAbelian(G) then return true; fi; # Every finite M-group is metabelian if not IsAbelian( DerivedSubgroup(G) ) then return false; fi; # Now do some work ccg:=ConjugacyClassesSubgroups(G); # The lattice of normal subgroups is modular. Since we already # know conjugacy classes, let's check if this may be the case. if ForAll(ccg, c -> Size(c)=1) then return true; fi; # # Check the modular law: x<=z => x v ( y ^ z ) = (x v y) ^ z # for cg in ccg do # z runs over representatives of conjugacy classes of subgroups G z:=Representative(cg); if Size(z)<>1 and Size(z)<>Size(G) then ccz:=ConjugacyClassesSubgroups(z); for cz in ccz do # x runs over representatives of conjugacy classes of subgroups of z x:=Representative(cz); if Size(x) <> 1 then for cg in ccg do # y runs over all subgroups of G for y in cg do if Size(y) <> 1 then if not ClosureGroup(x,Intersection(y,z)) = Intersection(ClosureGroup(x,y),z) then return false; fi; fi; od; od; fi; od; fi; od; return true; end;
For example, using this function we may find that there are 11 M-groups of order 32:
gap> l:=AllSmallGroups(Size,32,IsMGroup,true);;time;Length(l); 40420 11
For larger groups it may take a while to perform the check, especially if the group is an M-group. To avoid spending more time on repetitive checks of the same group, one can declare a property IsMGroup
and then install the function above as a method for that property. For further instructions, enter ?DeclareProperty
and ?InstallMethod
in GAP, and also the chapter "Examples of Extending the System" from the GAP reference manual (enter ?Adding new concepts
to see the particularly relevant manual section which, by coincidence, also adds a property "IsMGroup", but for another notion).