-
Notifications
You must be signed in to change notification settings - Fork 163
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
Changes from 6 commits
148a607
ea7652d
4702d71
230eac8
d0264f6
deeb084
739cfec
3488e16
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -464,6 +464,49 @@ function( G ) | |
end ); | ||
|
||
|
||
############################################################################# | ||
## | ||
#M MaximalNormalSubgroups( <G> ) | ||
## | ||
InstallMethod( MaximalNormalSubgroups, "for solvable groups", | ||
[ IsGroup ], | ||
RankFilter( IsGroup and IsSolvableGroup ) | ||
- RankFilter( IsGroup ), | ||
|
||
function( G ) | ||
local Gf, # FactorGroup of G | ||
hom, # homomorphism from G to Gf | ||
MaxGf; # MaximalNormalSubgroups of Gf | ||
|
||
if 0 in AbelianInvariants(G) then | ||
# (p) is a maximal normal subgroup in Z for every prime p | ||
Error("number of maximal normal subgroups is infinity"); | ||
elif IsAbelian(G) then | ||
if not IsPcGroup(G) then | ||
# convert it to an Abelian PcGroup with same invariants | ||
Gf := AbelianGroup(IsPcGroup, AbelianInvariants(G)); | ||
hom := IsomorphismGroups(G, Gf); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IsomorphismGroups is potentially expensive -- Why construct a new group and not work in the old one? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @hulpke
On the other hand,
I would prefer not to use isomorphism (or do it with NiceMonomorphism, but I do not understand properly their implementations), but that would need some work on the Abelian groups that you collected in #596 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The whole purpose of It is not a good idea to use expensive functions (such as potentially I'm slightly confused by NormalMaximalSubgroups. Aren't we talking about MaximalNormalSubgroups? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @hulpke NormalMaximalSubgroups computes all maximal subgroups that are actually normal. In abelian groups they are the same as MaximalNormalSubgroups, and also the same as MaximalSubgroups. The code of the latter looked to me exactly the same as NormalMaximalSubgroups except that some extra checks are done in that one (which are unnecessary in the abelian case). That is why I used NormalMaximalSubgroups, instead. Would you prefer that I wrote a general algorithm for abelian groups using independent generators and drop the whole isomorphism route? (I did not want to do that because an algorithm exists already, but if you think that would be the proper way, I will do that.) BTW, again I can only stress that some of these algorithms are incredibly slow for abelian groups. After having independent generators, nothing should be slow anymore, not even isomorphisms.... About There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Replaced |
||
MaxGf := MaximalNormalSubgroups(Gf); | ||
return List(MaxGf, N -> PreImage(hom, N)); | ||
else | ||
# for abelian pc groups return all maximal subgroups | ||
# NormalMaximalSubgroups seems to omit some unnecessary checks, | ||
# hence faster than MaximalSubgroups | ||
return NormalMaximalSubgroups(G); | ||
fi; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @fingolfin Thanks, corrected. |
||
elif IsSolvableGroup(G) then | ||
# every maximal normal subgroup is above the derived subgroup | ||
Gf := CommutatorFactorGroup(G); | ||
hom := NaturalHomomorphism(Gf); | ||
MaxGf := MaximalNormalSubgroups(Gf); | ||
return List(MaxGf, N -> PreImage(hom, N)); | ||
else | ||
# not solvable group | ||
TryNextMethod(); | ||
fi; | ||
end); | ||
|
||
|
||
############################################################################# | ||
## | ||
#F ModifyMinGens( <pcgsG>, <pcgsS>, <pcgsL>, <min> ) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
gap> START_TEST("MaximalNormalSubgroups.tst"); | ||
gap> G := SymmetricGroup(4);; MaximalNormalSubgroups(G)=[DerivedSubgroup(G)]; | ||
true | ||
gap> G := SymmetricGroup(5);; MaximalNormalSubgroups(G)=[DerivedSubgroup(G)]; | ||
true | ||
gap> G := AlternatingGroup(5);; Size(MaximalNormalSubgroups(G))=1 and IsTrivial(MaximalNormalSubgroups(G)[1]); | ||
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> A := AbelianGroup(IsFpGroup, [2,4,8,3,9,5,25,7]);; | ||
gap> List(MaximalNormalSubgroups(A),N -> AbelianInvariants(N)); | ||
[ [ 2, 3, 4, 4, 5, 7, 9, 25 ], [ 2, 2, 3, 5, 7, 8, 9, 25 ], | ||
[ 2, 2, 3, 5, 7, 8, 9, 25 ], [ 3, 4, 5, 7, 8, 9, 25 ], | ||
[ 3, 4, 5, 7, 8, 9, 25 ], [ 3, 4, 5, 7, 8, 9, 25 ], | ||
[ 3, 4, 5, 7, 8, 9, 25 ], [ 2, 3, 3, 4, 5, 7, 8, 25 ], | ||
[ 2, 4, 5, 7, 8, 9, 25 ], [ 2, 4, 5, 7, 8, 9, 25 ], | ||
[ 2, 4, 5, 7, 8, 9, 25 ], [ 2, 3, 4, 5, 5, 7, 8, 9 ], | ||
[ 2, 3, 4, 7, 8, 9, 25 ], [ 2, 3, 4, 7, 8, 9, 25 ], | ||
[ 2, 3, 4, 7, 8, 9, 25 ], [ 2, 3, 4, 7, 8, 9, 25 ], | ||
[ 2, 3, 4, 7, 8, 9, 25 ], [ 2, 3, 4, 5, 8, 9, 25 ] ] | ||
gap> ForAll(MaximalNormalSubgroups(A), N -> IsSubgroup(A, N) and IsNormal(A, N)); | ||
true | ||
gap> D1 := DihedralGroup(Factorial(10));; | ||
gap> List(MaximalNormalSubgroups(D1), StructureDescription); | ||
[ "D1814400", "C1814400", "D1814400" ] | ||
gap> D2 := DihedralGroup(IsFpGroup, 360);; | ||
gap> List(MaximalNormalSubgroups(D2), StructureDescription); | ||
[ "C180", "D180", "D180" ] | ||
gap> ForAll(MaximalNormalSubgroups(D2), N -> IsSubgroup(D2, N) and IsNormal(D2, N)); | ||
true | ||
|
||
# some infinite fp-groups | ||
gap> F := FreeGroup("r", "s");; r := F.1;; s := F.2;; | ||
gap> G := F/[r^(-1)*s^(-1)*r*s, r^18, s^24];; | ||
gap> Length(MaximalNormalSubgroups(G)); | ||
7 | ||
gap> G := F/[s^2, s*r*s*r];; | ||
|
||
# currently IsSolvable(G) would not run, will be remedied later | ||
gap> IsAbelian(DerivedSubgroup(G)); | ||
true | ||
gap> SetIsSolvableGroup(G, true); | ||
gap> Length(MaximalNormalSubgroups(G)); | ||
3 | ||
gap> STOP_TEST("MaximalNormalSubgroups.tst", 10000); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So you method is actually called for arbitrary groups (not just solvable ones), and you assume that you can compute AbelianInvaits, IsAbelian, IsSolvableGroup "cheaply". Hmm
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well..... yes. My gut says that if for a group we cannot even compute
AbelianInvariants
,IsAbelian
andIsSolvableGroup
cheaply, then we have little chance of computing the maximal normal subgroups cheaply by any other method. But I did not verify this feeling in any way.