# How to know the Galois Group of a polynomial is a solvable group?

ResourceFunction["StauduharGaloisGroup"][2 x^5+3 x^4+10 x^3+15 x^2+8 x+12,x]["GaloisGroup"]


DihedralGroup[5]

We can use FiniteGroupData like this:

FiniteGroupData[{"DihedralGroup", 5}, "Solvable"]


True

But the FiniteGroupData cannot deal with the PermutationGroup like:

 g = ResourceFunction["StauduharGaloisGroup"][
5 + 14 x + 15 x^2 + 5 x^3 + x^5, x]["GaloisGroup"]


PermutationGroup[{Cycles[{{2,3,5,4}}],Cycles[{{1,2,3,4,5}}]}]

So how to judge the group g is a solvable group or not?

• I might use Magma on the Magma calculator, but I don't know if there's an API you could use to call from Mathematica. Sorry if this isn't helpful. (BTW, your second example factors over the rational into a linear + quartic, so it's solvable, which Solve[5 + 14 x + 15 x^2 + 5 x^3 + x^5 == 0] // ToRadicals also shows.) May 5, 2022 at 4:43
• @MichaelE2 2 x^5 + 7 x^4 + 4 x^2 + 2 x + 1 is also solvable, but ToRadicals[Solve[2 x^5 + 7 x^4 + 4 x^2 + 2 x + 1 == 0, x]] don't work again...
– yode
May 5, 2022 at 5:37
• The docs say ToRadicals does not always work. May 5, 2022 at 5:47
• May 5, 2022 at 5:57
• @MichaelE2 Thanks. Maple also can do this, but I hope to know how to do it by MMA
– yode
May 5, 2022 at 6:01

This is an extended comment:

The group:

p = PermutationGroup[{Cycles[{{2, 3, 5, 4}}],
Cycles[{{1, 2, 3, 4, 5}}]}];


has elements: g = GroupElements[p]:

{Cycles[{}], Cycles[{{2, 3, 5, 4}}], Cycles[{{2, 4, 5, 3}}],
Cycles[{{2, 5}, {3, 4}}], Cycles[{{1, 2}, {3, 5}}], Cycles[{{1, 2, 3, 4, 5}}], Cycles[{{1, 2, 4, 3}}], Cycles[{{1, 2, 5, 4}}], Cycles[{{1, 3, 4, 2}}], Cycles[{{1, 3}, {4, 5}}], Cycles[{{1, 3, 5, 2, 4}}], Cycles[{{1, 3, 2, 5}}], Cycles[{{1, 4, 5, 2}}],
Cycles[{{1, 4, 3, 5}}], Cycles[{{1, 4}, {2, 3}}], Cycles[{{1, 4, 2, 5, 3}}], Cycles[{{1, 5, 4, 3, 2}}], Cycles[{{1, 5, 3, 4}}], Cycles[{{1, 5, 2, 3}}], Cycles[{{1, 5}, {2, 4}}]}

It is of order 20 (Length[g]). This is enough to establish it is solvable. See here

Mathematica can provide insight into this. $$C_5$$ is a subgroup of p:

c5 = GroupElements[CyclicGroup[5]];
in = Intersection[g, c5]


Further, it is a normal subgroup:

conj[x_] := PermutationProduct[#, x, InversePermutation[#]] & /@ g
Flatten[conj /@ c5] // Union


yields:

{Cycles[{}], Cycles[{{1, 2, 3, 4, 5}}], Cycles[{{1, 3, 5, 2, 4}}],
Cycles[{{1, 4, 2, 5, 3}}], Cycles[{{1, 5, 4, 3, 2}}]}

which establishes $$g H g^{-1}=H$$, where $$H=C_5$$.

Further, "p/C_5" is Abelian can be shown (conveniently from this example) by showing quotient group elements commute:

cos = {a, b, c, d} =
Union[RightCosetRepresentative[CyclicGroup[5], #] & /@ g]
su = Subsets[cos, {2}]
sur = Reverse /@ su
PermutationProduct @@@ su
PermutationProduct @@@ sur


yields:

{Cycles[{{2, 3, 5, 4}}], Cycles[{{2, 4, 5, 3}}], Cycles[{{2, 5}, {3, 4}}], Cycles[{}], Cycles[{{2, 4, 5, 3}}], Cycles[{{2, 3, 5, 4}}]}

{Cycles[{{2, 3, 5, 4}}], Cycles[{{2, 4, 5, 3}}], Cycles[{{2, 5}, {3, 4}}], Cycles[{}], Cycles[{{2, 4, 5, 3}}], Cycles[{{2, 3, 5, 4}}]}

As $$\lhd C_5\lhd$$ p: and the p/$$C_5$$ and $$C_5/$$ are Abelian, p is solvable.

• There is a resource function ResourceFunction["SubgroupQ"][CyclicGroup[5], p] do this
– yode
May 7, 2022 at 8:32
• Thanks. Did not know this. May 7, 2022 at 8:35
• You seem to have learned Group Theory very well, but it seems to be a way to determine a specified group only. (MMA can't even tell if a group is an abelian group
– yode
May 7, 2022 at 8:39
• @yode I am also trying to learn what can and can’t be done with MMA. A lot of brute force here to provide insights. Fortunately, the Sylow theorems etc can make life easier… May 7, 2022 at 8:42
• As far as I know, Sylow theorems cannot be used to determine whether the group is solvable or not?
– yode
May 7, 2022 at 8:44

We can check the Derived Series and the last one equal to PermutationGroup[{}](we use the function delCyc here):

delCyc[g_] := Module[{t = GroupGenerators[g], tmp},
If[PermutationGroup[t] == PermutationGroup[tmp = DeleteCases[t, #]],t=tmp]&/@t;
PermutationGroup[t]]

commutator[a_,b_]:=PermutationProduct[InversePermutation[a],InversePermutation[b],a,b]

DerivedGroup[G_] := Module[{lis},
If[G === PermutationGroup[{}], Return[PermutationGroup[{}]]];
delCyc[PermutationGroup[
DeleteDuplicates[commutator @@@ Subsets[GroupElements[G], {2}]]]]]

Most[FixedPointList[DerivedGroup, G, SameTest -> Equal]]


{PermutationGroup[{Cycles[{{2,3,5,4}}],Cycles[{{1,2,3,4,5}}]}],PermutationGroup[{Cycles[{{1,2,3,4,5}}]}],PermutationGroup[{}]}

Then the group G is a solvable group indeed. But it seem this method just can deal the groups of relatively small order.

This is also a comment extension, maybe it can give some clue for the question.

After I DownValues[DataPacletsFiniteGroupDataDumpRawFiniteGroupData] I will get:

HoldPattern[
DataPacletsFiniteGroupDataDumpRawFiniteGroupData[
DataPacletsFiniteGroupDataDumpgroup_, Solvable]] :>
Block[{DataPacletsFiniteGroupDataDumpres},
DataPacletsFiniteGroupDataDumpres =
DataPacletsFiniteGroupDataDumpRawFiniteGroupData[
DataPacletsFiniteGroupDataDumpgroup, Order];
True /; DataPacletsFiniteGroupDataDumpvalidQ[
DataPacletsFiniteGroupDataDumpres] &&
OddQ[DataPacletsFiniteGroupDataDumpres]]


And GeneralUtilitiesPrintDefinitionsLocal[DataPacletsFiniteGroupDataDumpvalidQ] will get:

validQ[expr_] := And[UnsameQ[expr, \$Failed], UnsameQ[Head @ expr, Missing]];
validQ[___] := False;


This is a built-in algorithm for those named-group, we can use it like:

DataPacletsFiniteGroupDataDumpRawFiniteGroupData[{"SymmetricGroup",3},"Solvable"]
`

True