From dbb3cbecb469e0a1d538a38e17f57e03fc9bfa68 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Thu, 21 Dec 2023 16:43:55 +0530 Subject: [PATCH 01/15] Simplify the expression before converting it to algebraic number This commit changes the _algebraic_ function of Expression class to simplify the expression with simplify_full() function before converting it to algebraic number. --- src/sage/symbolic/expression.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx index 9d86a81b24b..6be5c2d5457 100644 --- a/src/sage/symbolic/expression.pyx +++ b/src/sage/symbolic/expression.pyx @@ -2040,7 +2040,7 @@ cdef class Expression(Expression_abc): 0 """ from sage.symbolic.expression_conversions import algebraic - return algebraic(self, field) + return algebraic(self.simplify_full(), field) def __hash__(self): r""" From 30b120a310f67e7bdfd24a642f7fb08a51d02730 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Thu, 21 Dec 2023 16:48:05 +0530 Subject: [PATCH 02/15] Added a doctest Added the doctest for _element_constructor_() function of AlgebraicField class. --- src/sage/rings/qqbar.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/sage/rings/qqbar.py b/src/sage/rings/qqbar.py index 5fc675ffd83..9b5605e8d15 100644 --- a/src/sage/rings/qqbar.py +++ b/src/sage/rings/qqbar.py @@ -1646,6 +1646,16 @@ def _element_constructor_(self, x): True sage: pi in QQbar # needs sage.symbolic False + + TESTS:: + + Check if :trac:`12745` is fixed:: + + sage: x = exp(2*I*pi/7) + exp(-2*I*pi/7) + sage: QQbar(x) in AA + True + sage: AA(x) + 1.246979603717467? """ if isinstance(x, AlgebraicNumber): return x From 52a00ba9119789c8b4c5fbcdb079dcdd3ce8c9bb Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Thu, 21 Dec 2023 17:04:35 +0530 Subject: [PATCH 03/15] Corrected a linting error --- src/sage/rings/qqbar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/qqbar.py b/src/sage/rings/qqbar.py index 9b5605e8d15..f9d30f99531 100644 --- a/src/sage/rings/qqbar.py +++ b/src/sage/rings/qqbar.py @@ -1647,7 +1647,7 @@ def _element_constructor_(self, x): sage: pi in QQbar # needs sage.symbolic False - TESTS:: + TESTS: Check if :trac:`12745` is fixed:: From fe0fd281b89248b345a899fab9eeb0d981834a63 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Wed, 10 Jan 2024 00:53:08 +0530 Subject: [PATCH 04/15] Added the function --- src/sage/groups/perm_gps/permgroup.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index 2d73c8e7cf2..4fb86505949 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4106,6 +4106,24 @@ def isomorphism_type_info_simple_group(self): else: raise TypeError("group must be simple") + def minimal_normal_subgroups(self): + """ + Return all minimal normal subgroups of the group. + + EXAMPLES:: + + sage: G = SymmetricGroup(4) + sage: G.minimal_normal_subgroups() + [ Group([ (1,4)(2,3), (1,3)(2,4) ]) ] + + TESTS:: + + sage: G = SymmetricGroup(8) + sage: G.minimal_normal_subgroups() + [ Alt( [ 1 .. 8 ] ) ] + """ + return self._libgap_().MinimalNormalSubgroups() + ###################### Boolean tests ##################### def is_abelian(self): From 295e3836840b959ac4b3ccb0d17e6f0b5ee05491 Mon Sep 17 00:00:00 2001 From: Ruchit Jagodara Date: Wed, 10 Jan 2024 00:56:18 +0530 Subject: [PATCH 05/15] Update qqbar.py --- src/sage/rings/qqbar.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/sage/rings/qqbar.py b/src/sage/rings/qqbar.py index ea25f3e7232..9c286af01ec 100644 --- a/src/sage/rings/qqbar.py +++ b/src/sage/rings/qqbar.py @@ -1646,16 +1646,6 @@ def _element_constructor_(self, x): True sage: pi in QQbar # needs sage.symbolic False - - TESTS: - - Check if :trac:`12745` is fixed:: - - sage: x = exp(2*I*pi/7) + exp(-2*I*pi/7) - sage: QQbar(x) in AA - True - sage: AA(x) - 1.246979603717467? """ if isinstance(x, AlgebraicNumber): return x From cc09a88a561e2e5a1f7146e50d9419b13a9a47f6 Mon Sep 17 00:00:00 2001 From: Ruchit Jagodara Date: Wed, 10 Jan 2024 00:56:55 +0530 Subject: [PATCH 06/15] Update expression.pyx --- src/sage/symbolic/expression.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx index 6be5c2d5457..9d86a81b24b 100644 --- a/src/sage/symbolic/expression.pyx +++ b/src/sage/symbolic/expression.pyx @@ -2040,7 +2040,7 @@ cdef class Expression(Expression_abc): 0 """ from sage.symbolic.expression_conversions import algebraic - return algebraic(self.simplify_full(), field) + return algebraic(self, field) def __hash__(self): r""" From 4fc4d26e180b224d70b12449576ef9f0648ea02a Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Wed, 10 Jan 2024 22:43:55 +0530 Subject: [PATCH 07/15] Convert the result back into sage subgroup --- src/sage/groups/perm_gps/permgroup.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index 4fb86505949..a76c9236436 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4115,14 +4115,10 @@ def minimal_normal_subgroups(self): sage: G = SymmetricGroup(4) sage: G.minimal_normal_subgroups() [ Group([ (1,4)(2,3), (1,3)(2,4) ]) ] - - TESTS:: - - sage: G = SymmetricGroup(8) - sage: G.minimal_normal_subgroups() - [ Alt( [ 1 .. 8 ] ) ] """ - return self._libgap_().MinimalNormalSubgroups() + gap_subgroups = self.gap().MinimalNormalSubgroups() + sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] + return sage_subgroups ###################### Boolean tests ##################### From 4c351f711acf02a38128571e4b5c09c82524e95e Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Wed, 10 Jan 2024 23:26:25 +0530 Subject: [PATCH 08/15] Added another function maximal_normal_subgroups and did some changes in example --- src/sage/groups/perm_gps/permgroup.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index a76c9236436..7529e8b6df5 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4108,18 +4108,34 @@ def isomorphism_type_info_simple_group(self): def minimal_normal_subgroups(self): """ - Return all minimal normal subgroups of the group. + Return a list containing all minimal normal subgroups of the group. EXAMPLES:: - sage: G = SymmetricGroup(4) - sage: G.minimal_normal_subgroups() - [ Group([ (1,4)(2,3), (1,3)(2,4) ]) ] + sage: G = PermutationGroup([(1,2,3),(4,5)]) + sage: G.minimal_normal_subgroups() + [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] """ gap_subgroups = self.gap().MinimalNormalSubgroups() sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] return sage_subgroups + def maximal_normal_subgroups(self): + """ + Return a list containing those proper normal subgroups of the group G that are maximal among the proper normal subgroups. + Gives error if G/G' is infinite, yielding infinitely many maximal normal subgroups. + + EXAMPLES:: + + sage: G = SymmetricGroup(4) + sage: G.maximal_normal_subgroups() + [Subgroup generated by [(2,3,4), (1,2,3)] of (Symmetric group of order 4! as a permutation group)] + """ + gap_subgroups = self.gap().MaximalNormalSubgroups() + sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] + return sage_subgroups + ###################### Boolean tests ##################### def is_abelian(self): From c1f9dbecc8d9d1222dd786f33ebb3cdf93d853ad Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Wed, 10 Jan 2024 23:45:32 +0530 Subject: [PATCH 09/15] Changed the example and added some description --- src/sage/groups/perm_gps/permgroup.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index 7529e8b6df5..f8a203e6b0e 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4108,14 +4108,14 @@ def isomorphism_type_info_simple_group(self): def minimal_normal_subgroups(self): """ - Return a list containing all minimal normal subgroups of the group. + Return a list containing those nontrivial normal subgroups of the group that are minimal among the nontrivial normal subgroups. EXAMPLES:: - sage: G = PermutationGroup([(1,2,3),(4,5)]) - sage: G.minimal_normal_subgroups() - [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), - Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] + sage: G = PermutationGroup([(1,2,3),(4,5)]) + sage: G.minimal_normal_subgroups() + [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] """ gap_subgroups = self.gap().MinimalNormalSubgroups() sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] @@ -4128,9 +4128,10 @@ def maximal_normal_subgroups(self): EXAMPLES:: - sage: G = SymmetricGroup(4) + sage: G = PermutationGroup([(1,2,3),(4,5)]) sage: G.maximal_normal_subgroups() - [Subgroup generated by [(2,3,4), (1,2,3)] of (Symmetric group of order 4! as a permutation group)] + [Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)])] """ gap_subgroups = self.gap().MaximalNormalSubgroups() sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] From df7bf349558bd4f3b7031f0bfe79897fa8a5264f Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Wed, 10 Jan 2024 23:53:02 +0530 Subject: [PATCH 10/15] Improved the codestyle --- src/sage/groups/perm_gps/permgroup.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index f8a203e6b0e..139e7ca7fb7 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4117,9 +4117,7 @@ def minimal_normal_subgroups(self): [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] """ - gap_subgroups = self.gap().MinimalNormalSubgroups() - sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] - return sage_subgroups + return [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in self.gap().MinimalNormalSubgroups()] def maximal_normal_subgroups(self): """ @@ -4133,9 +4131,7 @@ def maximal_normal_subgroups(self): [Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)]), Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)])] """ - gap_subgroups = self.gap().MaximalNormalSubgroups() - sage_subgroups = [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in gap_subgroups] - return sage_subgroups + return [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] ###################### Boolean tests ##################### From 297e8b2e5769d703741abba46edaf5d5a254f60e Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Thu, 11 Jan 2024 21:34:51 +0530 Subject: [PATCH 11/15] Implemented functions in ParentLibGAP --- src/sage/groups/libgap_wrapper.pyx | 27 +++++++++++++++++++++++++++ src/sage/groups/perm_gps/permgroup.py | 27 --------------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/sage/groups/libgap_wrapper.pyx b/src/sage/groups/libgap_wrapper.pyx index edcd50dfa4f..e420a52596f 100644 --- a/src/sage/groups/libgap_wrapper.pyx +++ b/src/sage/groups/libgap_wrapper.pyx @@ -345,6 +345,33 @@ class ParentLibGAP(SageObject): """ return self._libgap._repr_() + def minimal_normal_subgroups(self): + """ + Return a list containing those nontrivial normal subgroups of the group that are minimal among the nontrivial normal subgroups. + + EXAMPLES:: + + sage: G = PermutationGroup([(1,2,3),(4,5)]) + sage: G.minimal_normal_subgroups() + [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] + """ + return [self.subgroup(gap_subgroup.GeneratorsOfGroup()) for gap_subgroup in self.gap().MinimalNormalSubgroups()] + + def maximal_normal_subgroups(self): + """ + Return a list containing those proper normal subgroups of the group G that are maximal among the proper normal subgroups. + Gives error if G/G' is infinite, yielding infinitely many maximal normal subgroups. + + EXAMPLES:: + + sage: G = PermutationGroup([(1,2,3),(4,5)]) + sage: G.maximal_normal_subgroups() + [Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)])] + """ + return [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] + @cached_method def gens(self): """ diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index 139e7ca7fb7..2d73c8e7cf2 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4106,33 +4106,6 @@ def isomorphism_type_info_simple_group(self): else: raise TypeError("group must be simple") - def minimal_normal_subgroups(self): - """ - Return a list containing those nontrivial normal subgroups of the group that are minimal among the nontrivial normal subgroups. - - EXAMPLES:: - - sage: G = PermutationGroup([(1,2,3),(4,5)]) - sage: G.minimal_normal_subgroups() - [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), - Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] - """ - return [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in self.gap().MinimalNormalSubgroups()] - - def maximal_normal_subgroups(self): - """ - Return a list containing those proper normal subgroups of the group G that are maximal among the proper normal subgroups. - Gives error if G/G' is infinite, yielding infinitely many maximal normal subgroups. - - EXAMPLES:: - - sage: G = PermutationGroup([(1,2,3),(4,5)]) - sage: G.maximal_normal_subgroups() - [Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)]), - Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)])] - """ - return [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] - ###################### Boolean tests ##################### def is_abelian(self): From d2f349e347e6a2f10f5e480b9538105702f88d68 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Thu, 11 Jan 2024 21:54:20 +0530 Subject: [PATCH 12/15] Corrected some errors --- src/sage/groups/libgap_wrapper.pyx | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/sage/groups/libgap_wrapper.pyx b/src/sage/groups/libgap_wrapper.pyx index e420a52596f..bcb63d59f69 100644 --- a/src/sage/groups/libgap_wrapper.pyx +++ b/src/sage/groups/libgap_wrapper.pyx @@ -351,10 +351,11 @@ class ParentLibGAP(SageObject): EXAMPLES:: - sage: G = PermutationGroup([(1,2,3),(4,5)]) - sage: G.minimal_normal_subgroups() - [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), - Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] + sage: SL(2,GF(49)).minimal_normal_subgroups() + [Subgroup with 1 generators ( + [6 0] + [0 6] + ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ return [self.subgroup(gap_subgroup.GeneratorsOfGroup()) for gap_subgroup in self.gap().MinimalNormalSubgroups()] @@ -365,12 +366,13 @@ class ParentLibGAP(SageObject): EXAMPLES:: - sage: G = PermutationGroup([(1,2,3),(4,5)]) - sage: G.maximal_normal_subgroups() - [Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)]), - Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)])] + sage: SL(2,GF(49)).maximal_normal_subgroups() + [Subgroup with 1 generators ( + [6 0] + [0 6] + ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ - return [self.subgroup(gap_group=gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] + return [self.subgroup(gap_subgroup.GeneratorsOfGroup()) for gap_subgroup in self.gap().MaximalNormalSubgroups()] @cached_method def gens(self): From fa5b61b22ac33b9da4aa3d3851f21cdccd190926 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Sun, 14 Jan 2024 00:35:35 +0530 Subject: [PATCH 13/15] Changed the method for constructing subgroups --- src/sage/groups/libgap_wrapper.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sage/groups/libgap_wrapper.pyx b/src/sage/groups/libgap_wrapper.pyx index bcb63d59f69..f0ae6804df4 100644 --- a/src/sage/groups/libgap_wrapper.pyx +++ b/src/sage/groups/libgap_wrapper.pyx @@ -357,7 +357,7 @@ class ParentLibGAP(SageObject): [0 6] ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ - return [self.subgroup(gap_subgroup.GeneratorsOfGroup()) for gap_subgroup in self.gap().MinimalNormalSubgroups()] + return [self._subgroup_constructor(gap_subgroup) for gap_subgroup in self.gap().MinimalNormalSubgroups()] def maximal_normal_subgroups(self): """ @@ -366,13 +366,13 @@ class ParentLibGAP(SageObject): EXAMPLES:: - sage: SL(2,GF(49)).maximal_normal_subgroups() + sage: SL(2,GF(49)).minimal_normal_subgroups() [Subgroup with 1 generators ( [6 0] [0 6] - ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] + ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ - return [self.subgroup(gap_subgroup.GeneratorsOfGroup()) for gap_subgroup in self.gap().MaximalNormalSubgroups()] + return [self._subgroup_constructor(gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] @cached_method def gens(self): From 14c225e2ac684775b118370c1f3ef0186f3091e9 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Sun, 14 Jan 2024 00:45:24 +0530 Subject: [PATCH 14/15] Corrected linting error --- src/sage/groups/libgap_wrapper.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/groups/libgap_wrapper.pyx b/src/sage/groups/libgap_wrapper.pyx index f0ae6804df4..1fb5084f381 100644 --- a/src/sage/groups/libgap_wrapper.pyx +++ b/src/sage/groups/libgap_wrapper.pyx @@ -370,7 +370,7 @@ class ParentLibGAP(SageObject): [Subgroup with 1 generators ( [6 0] [0 6] - ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] + ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ return [self._subgroup_constructor(gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] From 0f17e65a28f3b1ff8b6b65c481ac8eef480f3393 Mon Sep 17 00:00:00 2001 From: RuchitJagodara Date: Sun, 14 Jan 2024 12:16:38 +0530 Subject: [PATCH 15/15] Corrected the error in functions --- src/sage/groups/libgap_wrapper.pyx | 14 +++++++----- src/sage/groups/perm_gps/permgroup.py | 31 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/sage/groups/libgap_wrapper.pyx b/src/sage/groups/libgap_wrapper.pyx index 1fb5084f381..d2305a655b4 100644 --- a/src/sage/groups/libgap_wrapper.pyx +++ b/src/sage/groups/libgap_wrapper.pyx @@ -347,7 +347,7 @@ class ParentLibGAP(SageObject): def minimal_normal_subgroups(self): """ - Return a list containing those nontrivial normal subgroups of the group that are minimal among the nontrivial normal subgroups. + Return the nontrivial minimal normal subgroups ``self``. EXAMPLES:: @@ -357,12 +357,15 @@ class ParentLibGAP(SageObject): [0 6] ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ - return [self._subgroup_constructor(gap_subgroup) for gap_subgroup in self.gap().MinimalNormalSubgroups()] + return [self._subgroup_constructor(gap_subgroup) + for gap_subgroup in self._libgap.MinimalNormalSubgroups()] def maximal_normal_subgroups(self): """ - Return a list containing those proper normal subgroups of the group G that are maximal among the proper normal subgroups. - Gives error if G/G' is infinite, yielding infinitely many maximal normal subgroups. + Return the maximal proper normal subgroups of ``self``. + + This raises an error if `G/[G, G]` is infinite, yielding infinitely + many maximal normal subgroups. EXAMPLES:: @@ -372,7 +375,8 @@ class ParentLibGAP(SageObject): [0 6] ) of Special Linear Group of degree 2 over Finite Field in z2 of size 7^2] """ - return [self._subgroup_constructor(gap_subgroup) for gap_subgroup in self.gap().MaximalNormalSubgroups()] + return [self._subgroup_constructor(gap_subgroup) + for gap_subgroup in self._libgap.MaximalNormalSubgroups()] @cached_method def gens(self): diff --git a/src/sage/groups/perm_gps/permgroup.py b/src/sage/groups/perm_gps/permgroup.py index 2d73c8e7cf2..ef828055b6a 100644 --- a/src/sage/groups/perm_gps/permgroup.py +++ b/src/sage/groups/perm_gps/permgroup.py @@ -4106,6 +4106,37 @@ def isomorphism_type_info_simple_group(self): else: raise TypeError("group must be simple") + def minimal_normal_subgroups(self): + """ + Return the nontrivial minimal normal subgroups ``self``. + + EXAMPLES:: + + sage: G = PermutationGroup([(1,2,3),(4,5)]) + sage: G.minimal_normal_subgroups() + [Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)])] + """ + return [self.subgroup(gap_group=gap_subgroup) + for gap_subgroup in self._libgap_().MinimalNormalSubgroups()] + + def maximal_normal_subgroups(self): + """ + Return the maximal proper normal subgroups of ``self``. + + This raises an error if `G/[G, G]` is infinite, yielding infinitely + many maximal normal subgroups. + + EXAMPLES:: + + sage: G = PermutationGroup([(1,2,3),(4,5)]) + sage: G.maximal_normal_subgroups() + [Subgroup generated by [(1,2,3)] of (Permutation Group with generators [(4,5), (1,2,3)]), + Subgroup generated by [(4,5)] of (Permutation Group with generators [(4,5), (1,2,3)])] + """ + return [self.subgroup(gap_group=gap_subgroup) + for gap_subgroup in self._libgap_().MaximalNormalSubgroups()] + ###################### Boolean tests ##################### def is_abelian(self):