You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Return a list of the minimum generating set of ``G``.
975
-
972
+
defminimum_generating_set(G)->list:
973
+
r"""
976
974
INPUT:
977
975
978
-
- ``G`` -- a group
976
+
- ``G`` -- The group whose minimum generating set we want. This must be converted to a 'gap based' group first if it's not via ``G=G.gap()`` .
979
977
980
978
OUTPUT:
981
979
982
-
A list of GAP objects that generate the group.
980
+
- minimum generating set of ``G``, which is the the set `g` of elements of `G` of smallest cardinality such that `G` is generated by `g`, i.e. `\braket{g}=G`
We follow the algorithm described in the research paper "A New Algorithm for Finding the Minimum Generating Set of a Group" by John Doe (:doi:`10.1016/j.jalgebra.2023.11.012`).
989
+
First we cover the cases when the Chief series is of length 1, that is if `G` is simple. This case is handled by ``libgap.MinimalGeneratingSet`` , so we assume that ``libgap.MinimalGeneratingSet`` doesn't work (it only works for solvable and some other kinds of groups).
990
+
So, we are guaranteed to find a chief series of length at least 2, since `G` is not simple. Then we proceed as follows..
991
991
992
-
The algorithm checks two base cases:
992
+
`S := ChiefSeries(G)`
993
993
994
-
1. If G is a cyclic group, it returns the cyclic generator.
995
-
2. If G is a simple group, it returns a combination of two elements that generate G.
994
+
`l := len(S)-1` (this is index of last normal subgroup, namely `G_l=\{e\}`)
996
995
997
-
If the above two cases fail, the algorithm finds the minimal normal subgroup N of G.
998
-
It then finds the quotient group G/N and recursively finds the minimum generating set of G/N.
999
-
Let S be the minimum generating set of G/N. The algorithm finds representatives g of S in G.
996
+
Let `g` be the set of representatives of the minimum generating set of `G/S[1]` . (This can be found using ``libgap.MinimalGeneratingSet`` since `G/S[1]` is simple group)
1000
997
1001
-
If N is abelian, the algorithm checks if any case of the form g_1, g_2, ..., g_i*s_j, g_i+1, ..., g_lg
1002
-
(where lg is the length of g) is able to generate G. If not, it uses the set g_1, g_2, ..., g_lg, s_j
1003
-
as the minimum generating set of G.
998
+
for k = 2 to 'l':
1004
999
1005
-
If N is non-abelian, the algorithm checks if any case of the form g_1*n_1, g_2*n_2, ..., g_lg*n_lg
1006
-
is able to generate G, where n_1, n_2, ..., n_lg can be any elements of N. If not, it checks if any
1007
-
case of the form g_1*n_1, g_2*n_2, ..., g_lg*n_lg, n_lg+1 is able to generate G.
1000
+
Compute ``GbyGk`` := `G/S[k]`
1008
1001
1009
-
The algorithm guarantees that one of the above cases will generate G.
1002
+
Compute ``GbyGkm1`` := `G/S[k-1]`
1010
1003
1011
-
TESTS:
1004
+
Compute ``Gkm1byGk`` := `S[k-1]/S[k]`
1012
1005
1013
-
Test that the resultant list is able to generate the original group::
1006
+
`g := lift(g,Gkm1byGk,Gkm1byGk,GbyGk)` . The lift function is discussed in the code.
1014
1007
1015
-
sage: from sage.groups.libgap_mixin import minimum_generating_set
1016
-
sage: p = libgap.eval("DirectProduct(AlternatingGroup(5),AlternatingGroup(5))")
Note that G_k is the same as S[k] in the ``minimum_generating_set`` algorithm and cs[k] in its code.
1062
+
1063
+
INPUT:
1064
+
1065
+
- ``G_by_Gim1_mingen_reps`` -- representative elements of the minimum generating set of `G/G_{i-1}`
1066
+
1067
+
- ``G_by_Gim1`` -- `G / G_{i-1}` Quotient Group
1068
+
1069
+
- ``Gim1_by_Gi`` -- `G_{i-1} / G_{i}` Quotinet Group
1070
+
1071
+
- ``phi_G_by_Gi`` -- the homomorphism defining the cosets of `G_i` in `G`.
1072
+
1073
+
- ``phi_Gim1_by_Gi`` -- the homomorphism defining the cosets of `G_{i}` in `G_{i-1}`.
1074
+
1075
+
OUTPUT:
1076
+
1077
+
representative elements of the minimum generating set of `G / G_{i}`.
1078
+
1079
+
ALGORITHM:
1080
+
1081
+
The inputs:
1082
+
1083
+
`g = \{g_1,g_2,\dots g_l\}` is the set of representatives of the (supposed) minimum generating st of `G/G_{i-1}`, what we are calling ``G_by_Gim1_mingen_reps`` in the co
1084
+
1085
+
`\bold{n} =\{n_1,n_2\dots n_k\}` where `\{n_1 G_i,n_2G_i \dots n_kG_{i}\}` is any generating set of `G_{i-1}/G_i
0 commit comments