Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance MaximalNormalSubgroups for finite solvable groups #552

Merged
merged 8 commits into from
Mar 28, 2016
56 changes: 56 additions & 0 deletions lib/grppcatr.gi
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,62 @@ function( G )
end );


#############################################################################
##
#M MaximalNormalSubgroups( <G> )
##
InstallMethod( MaximalNormalSubgroups, "for finite solvable groups",
[ IsGroup ],
RankFilter( IsGroup and CanComputeSize and IsFinite
and IsSolvableGroup ) - RankFilter( IsGroup ),

function( G )
local GF, # FactorGroup of G
MaxGF, # MaximalNormalSubgroups of GF
max, # MaximalNormalSubgroups of G
SS, # SylowSystem of G
N, # a maximal normal subgroup
i, j; # loop variables

if not CanComputeSize(G) or not IsFinite(G) or not IsSolvableGroup(G)
then
# not a finite solvable group
TryNextMethod();
elif not IsAbelian(G) then
# every maximal normal subgroup is above the derived subgroup
GF := CommutatorFactorGroup(G);
MaxGF := MaximalNormalSubgroups(GF);
# currently MaximalNormalSubgroups returns a list, not a set
return List(MaxGF, N -> PreImage(NaturalHomomorphism(GF), N));
elif not IsPGroup(G) then
# maximal normal is maximal in one Sylow multiplied by the other Sylows
SS := SylowSystem(G);
max := [ ];
for i in [1..Length(SS)] do
for N in MaximalNormalSubgroups(SS[i]) do
for j in [1..Length(SS)] do
if j<>i then
N := ClosureSubgroupNC(N, SS[j]);
fi;
od;
Add(max, N);
od;
od;
return max;
elif not IsElementaryAbelian(G) then
# every maximal subgroup is normal, hence above the Frattini subgroup
GF := FactorGroup(G, FrattiniSubgroup(G));
MaxGF := MaximalNormalSubgroups(GF);
return List(MaxGF, N -> PreImage(NaturalHomomorphism(GF), N));
else
# for elementary abelian groups return all maximal subgroups
# NormalMaximalSubgroups seems to omit some unnecessary checks,
# hence faster than MaximalSubgroups
return NormalMaximalSubgroups(G);
fi;
end);


#############################################################################
##
#F ModifyMinGens( <pcgsG>, <pcgsS>, <pcgsL>, <min> )
Expand Down
21 changes: 21 additions & 0 deletions tst/testinstall/opers/MaximalNormalSubgroups.tst
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
gap> START_TEST("normal_hall_subgroups.tst");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't the argument be "MaximalNormalSubgroups.tst"?

gap> G := SymmetricGroup(4);; MaximalNormalSubgroups(G)=[DerivedSubgroup(G)];
true
gap> G := SymmetricGroup(5);; MaximalNormalSubgroups(G)=[DerivedSubgroup(G)];
true
gap> l := [2,4,8,3,9,5,25,7];; G := DirectProduct(List(l, CyclicGroup));;
gap> List(MaximalNormalSubgroups(G),N ->List(MinimalGeneratingSet(N),Order));
[ [ 2, 60, 6300 ], [ 2, 30, 12600 ], [ 2, 30, 12600 ], [ 60, 12600 ],
[ 60, 12600 ], [ 60, 12600 ], [ 60, 12600 ], [ 2, 60, 4200 ],
[ 2, 20, 12600 ], [ 2, 20, 12600 ], [ 2, 20, 12600 ], [ 2, 60, 2520 ],
[ 2, 12, 12600 ], [ 2, 12, 12600 ], [ 2, 12, 12600 ], [ 2, 12, 12600 ],
[ 2, 12, 12600 ], [ 2, 60, 1800 ] ]
gap> D := DihedralGroup(Factorial(10));;
gap> List(MaximalNormalSubgroups(G), StructureDescription);
[ "C6300 x C60 x C2", "C12600 x C30 x C2", "C12600 x C30 x C2",
"C12600 x C60", "C12600 x C60", "C12600 x C60", "C12600 x C60",
"C4200 x C60 x C2", "C12600 x C20 x C2", "C12600 x C20 x C2",
"C12600 x C20 x C2", "C2520 x C60 x C2", "C12600 x C12 x C2",
"C12600 x C12 x C2", "C12600 x C12 x C2", "C12600 x C12 x C2",
"C12600 x C12 x C2", "C1800 x C60 x C2" ]
gap> STOP_TEST("normal_hall_subgroups.tst", 10000);