Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

The following answer does not really point to an error, since there is no error (to be corrected). The given code works just fine till we construct G, including the line:

G = MatrixGroup(matrices)

We obtain an object of

sage: type(G)
<class 'sage.groups.matrix_gps.finitely_generated.FinitelyGeneratedMatrixGroup_generic_with_category'>

but the present implementation does not provide any method to find the (normal) subgroups of G.

In such cases, my way to "solve the problem" is to get the best from mathematics and sage, in this case, to construct "the same structure" but within a class that always comes with a normal subgroups method.


Note that here also the "more mathematics" approach may be of interest, we are close to apply

Goursat's Lemma

in the following manner. Let $F$ be the field $$F=\Bbb F_3=\texttt{GF(3)}\ .$$ Let $H$ be the group $$H=\operatorname{SL}(4, F)\ .$$ Let $N$ be a normal subgroup of $G=H\times H$. Consider $p,q:H\times H\to H$, the projections of $G$ on the first, respectively second $H$-factor in the direct product. Let $K=p(N)$, $L=q(N)$ be the images of $N$ by $p,q$ respectively, they are normal subgroups of $H$, and there are not so many of them. The possibilities are in this special case

  • $1$, the trivial group with one element,
  • $\pm 1$, the group with two diagonal elements with same entry on the diagonal, or
  • $H$, the full group.

We apply Goursat's lemma for $N$, seen as a subgroup of $K\times L$. The induced, factorizing projections denoted also by $p,q$, $p:K\times L\to K$, and $q:K\times L\to L$ are now surjective, this is needed in the context of Goursat's lemma, and we apply it for $N\subseteq K\times L$. In our particular case we can go further, but below this is also done with sage.


Let us see how the story can be implemented in sage. We let $n=4$ be a variable, so that similar cases can be covered. Then $G = \operatorname{SL}(n, F\times F)$, and $n$ may be some small integer (like 2,3,4). The question is related to the group $$ G = \operatorname{SL}(n, F\times F) \cong\operatorname{SL}(n, F)\times \operatorname{SL}(n, F)=H\times H\ . $$ Here, $H$ is $\operatorname{SL}(n, F)$, of course, as in the previous mathematical preamble, where $n$ was four all the time. The code below prefers to work with $H\times H$, so from now on $G=H\times H$.

Generic elements of $H$ are denoted by $h$, possibly with decorations, e.g. $h',h_1,h_2$,and so on. An element of $G$ is of the shape $(h,k)$. We realize $H$ as a permutation group $P$, and finally work only with $P$ and $P\times P$ instead.

Sage gives the generators of $P=$P (corresponding to those of $H$, if we reject to "canonicalize" them), each generator is a product of disjoint cycles using the set $S={1,2,\dots,M}$ for some suitable $M$ (the "degree" of $P$ with $H\cong P$ in the terminology of sage). It is easy to get one more copy $S'={1',2',\dots,M'}$ of $S$, copy the generators, and get the doubled permutation group $P\times P$, in code PP. Permutation groups in sage come with the method of delivering the normal subgroups, so the end of the tunnel is in sight. We compute them in the world of permutation groups. (A step is needed to come back.)


So the code would be:

n = 4
F = GF(3)    # the field with 3 elements
H = SL(n, GF(3))    # a group with (3^n-1)(3^n-3)...(3^n-3^(n-1)) / (3-1) elements
P = H.as_permutation_group(algorithm='smaller', seed=2024)

M = P.degree()
gens = P.gens()
gens1 = [ [tuple(j     for j in cy) for cy in g.cycle_tuples()] for g in gens]
gens2 = [ [tuple(j + M for j in cy) for cy in g.cycle_tuples()] for g in gens]
PP = PermutationGroup(gens1 + gens2, canonicalize=False)    # canonicalize=0 keeps the generators

p = PP.Hom(P)([P(g) for g in gens1] + [P(1) for g in gens ])
q = PP.Hom(P)([P(1) for g in gens ] + [P(g) for g in gens1])

nors = PP.normal_subgroups()
nors.sort(key=lambda N: N.order())

We can get information on the normal subgroups in the list nors:

print(f"P is:\n{P}")
print(f"P x P is isomorphic to:\n{PP}")
print(f"The normal subgroups of P x P have the following characteristics:\n\n")

for N in nors:
    pN, qN = p.pushforward(N), q.pushforward(N)
    print(f"ORDER {N.order()} :: Normal subgroup with {len(N.gens())} generators:")
    print(f"\tp(N) has order {pN.order()} and structure {pN.structure_description()}")
    print(f"\tq(N) has order {qN.order()} and structure {qN.structure_description()}\n")

Results:

P is:
Permutation Group with generators [(28,37,46)(29,38,47)(30,39,48)(31,40,49)(32,41,50)(33,42,51)(34,43,52)(35,44,53)(36,45,54)(55,73,64)(56,74,65)(57,75,66)(58,76,67)(59,77,68)(60,78,69)(61,79,70)(62,80,71)(63,81,72), (2,7,10,55,3,4,19,28)(5,25,37,56,9,13,73,30)(6,22,46,29,8,16,64,57)(11,61,12,58,21,31,20,34)(14,79,39,59,27,40,74,36)(15,76,48,32,26,43,65,63)(17,70,66,60,24,49,47,35)(18,67,75,33,23,52,38,62)(41,80,45,68,81,42,77,54)(44,71,72,69,78,51,50,53)]
P x P is isomorphic to:
Permutation Group with generators [(28,37,46)(29,38,47)(30,39,48)(31,40,49)(32,41,50)(33,42,51)(34,43,52)(35,44,53)(36,45,54)(55,73,64)(56,74,65)(57,75,66)(58,76,67)(59,77,68)(60,78,69)(61,79,70)(62,80,71)(63,81,72), (2,7,10,55,3,4,19,28)(5,25,37,56,9,13,73,30)(6,22,46,29,8,16,64,57)(11,61,12,58,21,31,20,34)(14,79,39,59,27,40,74,36)(15,76,48,32,26,43,65,63)(17,70,66,60,24,49,47,35)(18,67,75,33,23,52,38,62)(41,80,45,68,81,42,77,54)(44,71,72,69,78,51,50,53), (109,118,127)(110,119,128)(111,120,129)(112,121,130)(113,122,131)(114,123,132)(115,124,133)(116,125,134)(117,126,135)(136,154,145)(137,155,146)(138,156,147)(139,157,148)(140,158,149)(141,159,150)(142,160,151)(143,161,152)(144,162,153), (83,88,91,136,84,85,100,109)(86,106,118,137,90,94,154,111)(87,103,127,110,89,97,145,138)(92,142,93,139,102,112,101,115)(95,160,120,140,108,121,155,117)(96,157,129,113,107,124,146,144)(98,151,147,141,105,130,128,116)(99,148,156,114,104,133,119,143)(122,161,126,149,162,123,158,135)(125,152,153,150,159,132,131,134)]
The normal subgroups of P x P have the following characteristics:


ORDER 1 :: Normal subgroup with 1 generators:
    p(N) has order 1 and structure 1
    q(N) has order 1 and structure 1

ORDER 2 :: Normal subgroup with 1 generators:
    p(N) has order 2 and structure C2
    q(N) has order 2 and structure C2

ORDER 2 :: Normal subgroup with 1 generators:
    p(N) has order 2 and structure C2
    q(N) has order 1 and structure 1

ORDER 2 :: Normal subgroup with 1 generators:
    p(N) has order 1 and structure 1
    q(N) has order 2 and structure C2

ORDER 4 :: Normal subgroup with 2 generators:
    p(N) has order 2 and structure C2
    q(N) has order 2 and structure C2

ORDER 12130560 :: Normal subgroup with 8 generators:
    p(N) has order 12130560 and structure SL(4,3)
    q(N) has order 1 and structure 1

ORDER 12130560 :: Normal subgroup with 24 generators:
    p(N) has order 1 and structure 1
    q(N) has order 12130560 and structure SL(4,3)

ORDER 24261120 :: Normal subgroup with 11 generators:
    p(N) has order 12130560 and structure SL(4,3)
    q(N) has order 2 and structure C2

ORDER 24261120 :: Normal subgroup with 3 generators:
    p(N) has order 2 and structure C2
    q(N) has order 12130560 and structure SL(4,3)

ORDER 147150485913600 :: Normal subgroup with 4 generators:
    p(N) has order 12130560 and structure SL(4,3)
    q(N) has order 12130560 and structure SL(4,3)

sage: