GAP puede devolver todos los subgrupos de $S_4$ prácticamente al instante:
gap> AllSubgroups(SymmetricGroup(4));
[ Group(()), Group([ (1,2)(3,4) ]), Group([ (1,3)(2,4) ]), Group([ (1,4)(2,3) ]), Group([ (3,4) ]), Group([ (2,3) ]),
Group([ (2,4) ]), Group([ (1,2) ]), Group([ (1,3) ]), Group([ (1,4) ]), Group([ (2,4,3) ]), Group([ (1,3,2) ]),
Group([ (1,4,2) ]), Group([ (1,4,3) ]), Group([ (1,4)(2,3), (1,3)(2,4) ]), Group([ (3,4), (1,2)(3,4) ]),
Group([ (1,4), (1,4)(2,3) ]), Group([ (2,4), (1,3)(2,4) ]), Group([ (1,3,2,4), (1,2)(3,4) ]), Group([ (1,4,3,2), (1,
3)(2,4) ]), Group([ (1,2,4,3), (1,4)(2,3) ]), Group([ (3,4), (2,4,3) ]), Group([ (1,4), (1,4,3) ]),
Group([ (2,3), (1,3,2) ]), Group([ (1,2), (1,4,2) ]), Group([ (1,4)(2,3), (1,3)(2,4), (3,4) ]), Group([ (1,2)
(3,4), (1,3)(2,4), (1,4) ]), Group([ (1,2)(3,4), (1,4)(2,3), (2,4) ]), Group([ (1,4)(2,3), (1,3)(2,4), (2,4,3) ]),
Group([ (1,4)(2,3), (1,3)(2,4), (2,4,3), (3,4) ]) ]
$S_4$ tiene 24 elementos ($4! = 24$).
Un enfoque ingenuo para generar todos los subgrupos de un grupo dado G consideraría todos los posibles subconjuntos de G (es decir, el conjunto potencia de G). En este caso, hay 16,777,216 posibles subconjuntos a considerar ($2^{24} = 16777216$).
Por supuesto, el orden de cada subgrupo debe dividir uniformemente el orden de G, por lo que podemos reducir la lista de subconjuntos a considerar usando este hecho (es decir, solo considerar subconjuntos que tengan un orden que divida uniformemente el orden de G). Para $S_4$, eso reduce la lista a 3,587,174.
¡Eso sigue siendo muchos conjuntos para considerar! Me sorprendería si GAP estuviera calculando los subgrupos sobre la marcha utilizando este enfoque ingenuo.
Entonces me pregunto cómo GAP devuelve la respuesta tan rápidamente. ¿GAP tiene precalculados los subgrupos de $S_4$ (y de otros grupos comunes)?