La propiedad que quiero comprobar es si existe un grupo finito no supersoluble $G$ que admite una triple factorización $G=AB=AC=BC$ , donde $A, B, C$ son subgrupos anormales supersolubles de $G$ . (Un subgrupo $H$ de $G$ se llama anormal si para todo $x \in G$ tenemos $x \in \langle H, H^x \rangle$ .)
He empezado a probar esta propiedad con las siguientes rutinas GAP:
#Checks if g=hk
IsProductOf:=function(g,h,k)
if Order(g)*Order(Intersection(h,k)) = Order(h)*Order(k) then
return true;
fi;
return false;
end;;
#Checks if the subgroup h is abnormal in the group g
IsAbnormalSubgroup:=function(g,h)
local norm, y, closure;
if not IsSubset(h,Centralizer(g,h)) then
return false;
fi;
norm:=Normalizer(g,h);
if Order(norm)>Order(h) then
return false;
fi;
for y in RightTransversal(g,h) do
closure:=ClosureGroup(h,ConjugateGroup(h,y));
if not ForAll(TrivialSubgroup(g),x->x*y in closure) then
return false;
fi;
od;
return true;
end;;
y
# Checks whether the group g can be written as a product g=ab where a, b
# are abnormal supersoluble subgroups of g, and whether g has at least three conjugacy
# classes of such subgroups
IsCandidateGroup:=function(g)
local list, a, b, brep, r, reps, i, j;
list:=Filtered(List(ConjugacyClassesSubgroups(g),Representative),
x->IsSupersolvableGroup(x) and IsAbnormalSubgroup(g,x));
if Size(list)<3 then
return false;
fi;
for i in [1..Length(list)] do
a:=list[i];
for j in [i+1..Length(list)] do
brep:=list[j];
reps:=List(DoubleCosetRepsAndSizes(g,brep,a),x->x[1]);
for r in reps do
b:=brep^r;
if IsProductOf(g,a,b) then
return true;
fi;
od;
od;
od;
return false;
end;;
Siguiente,
test:=function(g)
local i, j, k, list, h, m, n, mrep, nrep, reps, r, s, Reps;
list:=Filtered(List(ConjugacyClassesSubgroups(g),Representative),
x->IsSupersolvableGroup(x) and IsAbnormalSubgroup(g,x));
for i in [1..Length(list)] do
h:=list[i];
for j in [i+1..Length(list)] do
mrep:=list[j];
reps:=List(DoubleCosetRepsAndSizes(g,mrep,h),x->x[1]);
for r in reps do
m:=mrep^r;
if IsProductOf(g,h,m) then
for k in [j+1..Length(list)] do
nrep:=list[k];
Reps:=List(DoubleCosetRepsAndSizes(g,Normalizer(h,m),nrep),x->x[1]);
for s in Reps do
n:=nrep^s;
if IsProductOf(g,h,n) and IsProductOf(g,m,n) then
return true;
fi;
od;
od;
fi;
od;
od;
od;
return false;
end;;
¿Quizás alguien pueda sugerir algún código concreto para mejorar la eficiencia?
He actualizado el código para tener en cuenta las sugerencias y he simplificado las cosas en un par de lugares, aunque no estoy totalmente seguro de que el test
es correcta.
0 votos
Mi primera sugerencia sería sangrar el código para que la estructura se entienda mejor al mirarlo. (Comentaré la pregunta una vez hecho esto).
1 votos
No estoy muy seguro de cuál es el formato correcto para la sangría de código, así que he hecho lo que tiene sentido para mí. Ahora debería verse un poco mejor. Además, podría poner un párrafo extra explicando para qué sirve cada bit si crees que ayudaría.
1 votos
Además, por si fuera de interés: se trata del problema 19.100 del cuaderno de Kourovka (p. 154 en la última edición). En realidad, el problema pregunta si siempre que $G$ admite tal factorización triple, entonces $G$ es en sí supersoluble, por lo que mi código es básicamente la búsqueda de un contraejemplo.
1 votos
@the_fox Me tomé la libertad de actualizar la sangría - por lo general, el cuerpo de los bucles y las sentencias if está sangrado, pero no
for ... od
yif ... fi
ellos mismos. Puede ver algunos ejemplos de sangría en la biblioteca GAP. Pueden variar de vez en cuando (por ejemplo, algunos autores también sangrarán el cuerpo de la función; yo no lo hago porque requiere demasiado esfuerzo, creo). También utilicé triple backticks para mostrar el código - ¡este marcado ahora funciona aquí, así que no tienes que sangrarlo por 4 espacios más, al pegar a este sitio!0 votos
¡Ah, gracias! Creo que esto se ve mejor que lo que hice antes.
0 votos
@the_fox también es posible que desee organizar su búsqueda por órdenes de la Biblioteca de Grupos Pequeños, para evitar repetidas llamadas costosas de
AllSmallGroups
Véase, por ejemplo carpentries-incubator.github.io/gap-lesson/05-small-groups/0 votos
No se necesita tanto tiempo para crear
grps:=AllSmallGroups([1..220],IsSupersolvableGroup,false,IsCandidateGroup,true);;
así que no me importa mucho si GAP tarda un par de minutos en hacerlo. Pero obviamente me gustaría tener el mejor código posible para todo el asunto. ¿Es su sugerencia relacionada con el fragmento de código en el enlace directamente abajo La programación modular comienza aquí ?0 votos
Ese fragmento es la 1ª versión del código, el episodio continúa para mejorarlo, hacerlo más flexible y mostrar el progreso de las pruebas - así que quizás quieras algunas versiones más abajo en esa página.
0 votos
Otra sugerencia es utilizar pruebas ( carpentries-incubator.github.io/gap-lesson/04-testing/ ) - su código evoluciona rápidamente y quiere asegurarse de que cada modificación no lo rompe. Además, ¿está utilizando el control de versiones para realizar un seguimiento de los cambios de su código a nivel local, y simplemente pegar la nueva versión del código aquí?
0 votos
Si utiliza el control de versiones, no tendrá que reproducir el todo GAP para que su código sea más robusto y demostrable; por ejemplo, puede tener una configuración sencilla como la siguiente github.com/sukru-yalcinkaya/unipoly . Si está interesado, tengo una plantilla para tales experimentos computacionales reproducibles en github.com/rse-standrewscs/gap-binder-template y estarán encantados de ayudar (y GitHub es más adecuado para el desarrollo colaborativo de código).
0 votos
También puede acelerar el código haciendo
SubgroupsOfInterest
un atributo (véase carpentries-incubator.github.io/gap-lesson/06-attributes/ ). En caso contrario, se calcula una vez para cada grupo llamando aIsCandidateGroup
enAllSmallGroups
y luego llamarlo de nuevo en el bucle de búsqueda principal.0 votos
@AlexanderKonovalov Necesitaré algo de tiempo para estudiar sus diversas sugerencias. Mientras tanto, eres más que bienvenido a contribuir con cualquier cosa que creas que puede mejorar el código.