Gracias, es una pregunta interesante. No tengo constancia de que esa funcionalidad esté disponible en ningún sitio, pero si miramos la bibliografía (véanse las referencias en los comentarios del código GAP más abajo), parece que puede haber al menos tres enfoques posibles:
1) Calcular la red de subgrupos y comprobar que no contiene una red isomorfo a la red "pentágono".
2) Dado que los grupos con retícula de subgrupos modulares (también llamados grupos M) están clasificados, se puede intentar aplicar los criterios conocidos para que un grupo finito sea un grupo M.
3) Cálculo sencillo de los subgrupos del grupo y posterior comprobación de que la ley modular se cumple la ley modular.
He implementado (3) en GAP de la siguiente manera:
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;
Por ejemplo, utilizando esta función podemos encontrar que hay 11 grupos M de orden 32:
gap> l:=AllSmallGroups(Size,32,IsMGroup,true);;time;Length(l);
40420
11
En el caso de los grupos más grandes, puede llevar un tiempo realizar la comprobación, especialmente si el grupo es un grupo M. Para evitar gastar más tiempo en comprobaciones repetitivas del mismo grupo, se puede declarar una propiedad IsMGroup
y luego instalar la función anterior como un método para esa propiedad. Para más instrucciones, introduzca ?DeclareProperty
y ?InstallMethod
en GAP, y también el capítulo "Ejemplos de ampliación del sistema" del manual de referencia de GAP (introduzca ?Adding new concepts
para ver la sección del manual particularmente relevante que, por coincidencia, también añade una propiedad "IsMGroup", pero para otra noción).