Galois Groups

Finding Galois groups (of normal closures) of polynomials over rational function fields over k∈{Q, Fq}, where Fq denotes the finite field of characteristic p with q=pr, r∈Z> 0 is a hard problem, in general. All practical algorithms used the classification of transitive groups, which is known up to degree 31 [CHM98]. These algorithms fall into two groups: The absolute resolvent method [SM85] and the method of Stauduhar [Sta73].

The Magma implementation is based on an extension of the method of Stauduhar by Klüners, Geißler [Gei03], [GK00] and, more recently, Fieker [FK14] and Sutherland [Sut15]. There is no longer any limit on the degree of the polynomials or fields as this algorithm does not use the classification of transitive groups. In contrast to the absolute resolvent method, it also provides the explicit action on the roots of the polynomial f which generates the function field. The algorithm strongly depends on the fact that the corresponding problem is implemented for the residue class field.

Roughly speaking, the method of Stauduhar traverses the subgroup lattice of transitive permutation groups of degree n from the symmetric group to the actual Galois group. This is done by using so-called relative resolvents. Resolvents are polynomials whose splitting fields are subfields of the splitting field of the given polynomial which are computed using approximations of the roots of the polynomial f.

If the field (or the field defined by a polynomial) has subfields (i.e. the Galois group is imprimitive) the current implementation changes the starting point of the algorithm in the subgroup lattice, to get as close as possible to the actual Galois group. This is done via computation of subfields of a stem field of f, that is the field extension of k(t) which we get by adjoining a root of f to k(t). The Galois group is found as a subgroup of the intersection of suitable wreath products (using the knowledge of the subfields) which may be easily computed.

If the field (or the field defined by a polynomial) does not have subfields (i.e. the Galois group is primitive) we use a combination of the method of Stauduhar and the absolute resolvent method. The Frobenius automorphism of the underlying field already determines a subgroup of the Galois group, which is used to speed up computations in the primitive case.

The algorithms used here are similar to those use for number fields. See also Chapter GALOIS GROUPS AND AUTOMORPHISMS. In addition to the intrinsics described here, some of the intrinsics described in Section Galois Groups apply to polynomials over function fields also.

Contents

GaloisGroup(f) : RngUPolElt -> GrpPerm, [ RngElt ], GaloisData
    Prime: RngElt                       Default: 
    NextPrime: UserProgram              Default: 
    ProofEffort: RngIntElt              Default: 10
    Ring: GaloisData                    Default: 
    ShortOK: BoolElt                    Default: false
    Old: BoolElt                        Default: false
    SetVerbose("GaloisGroup", n):       Maximum: 5
Given a separable, (irreducible if k is Q) polynomial f(t, x) of degree n over the rational function field k(t), k∈{Q, Fq}, or an extension K thereof (if k = Fq) this function returns a permutation group that forms the Galois group of a splitting field for f in some algebraic closure of K. The permutation group acts on the points 1, 2, ..., n. The roots of f are calculated in the process, expressed as power series and returned as the second argument: For a prime polynomial p(t)∈k(t) denote by bar(N) the splitting field of the polynomial f(t, x) mod p(t). It is well known that the roots of the polynomial f(t, x) can be expressed as power series in bar(N)[[t]]. We embed bar(N) in an unramified p-adic extension. The third return value is a structure containing information about the computation that can be used to compute the roots of f to arbitrary precision. This can be used for example in GaloisSubgroup to compute arbitrary subfields of the splitting field.

The required precision increases linearly with the index of the subgroups, which are passed traversing the subgroup lattice. Therefore computations may slow down considerably for higher degrees and large indices. This expense can be reduced by setting ShortOK to true, in which case a descent using only the short cosets [Els14] will be considered as reliable as a descent using all cosets.

The default version employs series computations over either unramified p-adic fields (k=Q) or finite fields (k=Fq). The prime polynomial is determined during a Galois group computation in such a way that f is squarefree modulo p.

The prime to use for splitting field computations can be given via the parameter Prime. The method of choosing primes for splitting field computations can be given by the parameter NextPrime. An indication of how much effort the computation should make to prove the results can be provided by altering the parameter ProofEffort, it should be increased if more effort should be made.

If Old is set to true, then the old version is called if available. Since the return values of the new version differ substantially from the old one, this may be used in old applications.

GaloisGroup(F) : FldFun -> GrpPerm, [RngElt], GaloisData
GaloisGroup(F) : FldFun[FldFun[FldFunRat]] -> GrpPerm, [RngElt], GaloisData
GaloisGroup(F) : FldFun[FldFin] -> GrpPerm, [RngElt], GaloisData
GaloisGroup(F) : FldFun[FldFunRat] -> GrpPerm, [RngElt], GaloisData
GaloisGroup(F) : FldFun[FldRat] -> GrpPerm, [RngElt], GaloisData
    Prime: RngElt                       Default: 
    NextPrime: UserProgram              Default: 
    ProofEffort: RngIntElt              Default: 10
    Ring: GaloisData                    Default: 
    ShortOK: BoolElt                    Default: false
Given a function field F defined as an extension of either a rational function field or a global algebraic function field by one polynomial compute the Galois group of a normal closure of F.

The prime to use for splitting field computations can be given via the parameter Prime. The method of choosing primes for splitting field computations can be given by the parameter NextPrime. An indication of how much effort the computation should make to prove the results can be provided by altering the parameter ProofEffort, it should be increased if more effort should be made. If the parameter ShortOK is set to true then a descent using only the short cosets [Els14] will be considered as reliable as a descent using all cosets.

Example FldFunG_GaloisGroups (H45E13)

A Galois group computation is shown below.
> k<t>:= FunctionField(Rationals());
> R<x>:= PolynomialRing(k);
> f:= x^15 + (-1875*t^2 - 125)*x^3 + (4500*t^2 + 300)*x^2 +
>     (-3600*t^2 - 240)*x + 960*t^2+ 64;
> G, r, S:= GaloisGroup(f);
> TransitiveGroupDescription(G);
1/2[S(5)^3]S(3)
> A := Universe(r);
> AssignNames(~A,  ["t"]);
> A;
Power series ring in t over Unramified extension
defined by the polynomial (1 + O(191^20))*x^4 +
    O(191^20)*x^3 + (7 + O(191^20))*x^2 + (100 +
    O(191^20))*x + 19 + O(191^20)
 over Unramified extension defined by the
polynomial (1 + O(191^20))*x + 190 + O(191^20)
 over pAdicField(191)
> r[1];
-49 + O(191) - (39 + O(191))*t + O(t^2)
> S;
GaloisData of type Q(t)
> TransitiveGroupIdentification(G);
99 15

Example FldFunG_GaloisGroups2 (H45E14)

Some examples for polynomials over rational function fields over finite fields.
> k<x>:= FunctionField(GF(1009));
> R<y>:= PolynomialRing(k);
> f:= y^10 + (989*x^4 + 20*x^3 + 989*x^2 + 20*x + 989)*y^8 + (70*x^8 +
> 869*x^7 + 310*x^6 + 529*x^5 + 600*x^4 + 479*x^3 + 460*x^2 + 719*x +
> 120)*y^6 + (909*x^12 + 300*x^11 + 409*x^10 + 1000*x^9 + 393*x^8 +
> 657*x^7 + 895*x^6 + 764*x^5 + 420*x^4 + 973*x^3 + 177*x^2 + 166*x +
> 784)*y^4 + (65*x^16 + 749*x^15 + 350*x^14 + 909*x^13 + 484*x^12 +
> 452*x^11 + 115*x^10 + 923*x^9 + 541*x^8 + 272*x^7 + 637*x^6 + 314*x^5 +
> 724*x^4 + 490*x^3 + 948*x^2 + 99*x + 90)*y^2 + 993*x^20 + 80*x^19 +
> 969*x^18 + 569*x^17 + 895*x^16 + 101*x^15 + 742*x^14 + 587*x^13 +
> 55*x^12+ 437*x^11 + 97*x^10 + 976*x^9 + 62*x^8 + 171*x^7 + 930*x^6 +
> 604*x^5 + 698*x^4 + 60*x^3 + 60*x^2 + 1004*x + 1008;
> G, r, p:= GaloisGroup(f);
> t1, t2:= TransitiveGroupIdentification(G);
> t1;
1
> t2;
10
And a second one.
> k<t>:= FunctionField(GF(7));
> R<x>:= PolynomialRing(k);
> f:= x^12 + x^10 + x^8 + (6*t^2 + 3)*x^6 + (4*t^4 + 6*t^2 + 1)*x^4 +
> (5*t^4 + t^2)*x^2 + 2*t^4;
> G, r, p:= GaloisGroup(f);
> G;
Permutation group G acting on a set of cardinality 12
Order = 24 = 2^3 * 3
    (1, 5, 4, 7, 11, 10)(2, 6, 3, 8, 12, 9)
    (3, 10)(4, 9)(5, 12)(6, 11)
> A := Universe(r);
> AssignNames(~A,  ["t"]);
> _<w> := CoefficientRing(Universe(r));
> _<u> := CoefficientField(Parent(w));
> r;
[
    (3*u + 2)*w^5 + (u + 5)*w^4 + (5*u + 6)*w^3 + (4*u + 2)*w^2 + (5*u + 4)*w +
        3*u + 4 + ((6*u + 1)*w^5 + 6*w^4 + (3*u + 4)*w^3 + (u + 2)*w^2 + (3*u +
        3)*w + (3*u + 2))*t + ((5*u + 2)*w^4 + (2*u + 1)*w^3 + (u + 1)*w^2 +
        (3*u + 1)*w + (3*u + 3))*t^2 + ((5*u + 1)*w^5 + 3*u*w^4 + 3*u*w^3 + (3*u
        + 6)*w^2 + (4*u + 4)*w + (5*u + 4))*t^3 + O(t^4),
    (3*u + 2)*w^5 + (6*u + 2)*w^4 + (5*u + 6)*w^3 + (3*u + 5)*w^2 + (5*u + 4)*w
        + 4*u + 3 + ((6*u + 1)*w^5 + w^4 + (3*u + 4)*w^3 + (6*u + 5)*w^2 + (3*u
        + 3)*w + (4*u + 5))*t + ((2*u + 5)*w^4 + (2*u + 1)*w^3 + (6*u + 6)*w^2 +
        (3*u + 1)*w + (4*u + 4))*t^2 + ((5*u + 1)*w^5 + 4*u*w^4 + 3*u*w^3 + (4*u
        + 1)*w^2 + (4*u + 4)*w + (2*u + 3))*t^3 + O(t^4),
    (2*u + 6)*w^5 + (2*u + 3)*w^4 + (2*u + 1)*w^3 + (2*u + 1)*w^2 + (4*u + 6)*w
        + 3*u + 4 + ((4*u + 3)*w^5 + 5*w^4 + (4*u + 3)*w^3 + (4*u + 1)*w^2 + (u
        + 1)*w + (3*u + 2))*t + ((3*u + 4)*w^4 + (5*u + 6)*w^3 + (4*u + 4)*w^2 +
        (u + 5)*w + (3*u + 3))*t^2 + ((u + 3)*w^5 + 6*u*w^4 + 4*u*w^3 + (5*u +
        3)*w^2 + (6*u + 6)*w + (5*u + 4))*t^3 + O(t^4),
    (2*u + 6)*w^5 + (5*u + 4)*w^4 + (2*u + 1)*w^3 + (5*u + 6)*w^2 + (4*u + 6)*w
        + 4*u + 3 + ((4*u + 3)*w^5 + 2*w^4 + (4*u + 3)*w^3 + (3*u + 6)*w^2 + (u
        + 1)*w + (4*u + 5))*t + ((4*u + 3)*w^4 + (5*u + 6)*w^3 + (3*u + 3)*w^2 +
        (u + 5)*w + (4*u + 4))*t^2 + ((u + 3)*w^5 + u*w^4 + 4*u*w^3 + (2*u +
        4)*w^2 + (6*u + 6)*w + (2*u + 3))*t^3 + O(t^4),
    (6*u + 4)*w^5 + (3*u + 1)*w^4 + (5*u + 6)*w^3 + (6*u + 3)*w^2 + (6*u + 2)*w
        + 4*u + 3 + ((5*u + 2)*w^5 + 4*w^4 + (3*u + 4)*w^3 + (5*u + 3)*w^2 +
        (5*u + 5)*w + (4*u + 5))*t + ((u + 6)*w^4 + (2*u + 1)*w^3 + (5*u +
        5)*w^2 + (5*u + 4)*w + (4*u + 4))*t^2 + ((3*u + 2)*w^5 + 2*u*w^4 +
        3*u*w^3 + (u + 2)*w^2 + (2*u + 2)*w + (2*u + 3))*t^3 + O(t^4),
    (6*u + 4)*w^5 + (4*u + 6)*w^4 + (5*u + 6)*w^3 + (u + 4)*w^2 + (6*u + 2)*w +
        3*u + 4 + ((5*u + 2)*w^5 + 3*w^4 + (3*u + 4)*w^3 + (2*u + 4)*w^2 + (5*u
        + 5)*w + (3*u + 2))*t + ((6*u + 1)*w^4 + (2*u + 1)*w^3 + (2*u + 2)*w^2 +
        (5*u + 4)*w + (3*u + 3))*t^2 + ((3*u + 2)*w^5 + 5*u*w^4 + 3*u*w^3 + (6*u
        + 5)*w^2 + (2*u + 2)*w + (5*u + 4))*t^3 + O(t^4),
    (4*u + 5)*w^5 + (u + 5)*w^4 + (2*u + 1)*w^3 + (4*u + 2)*w^2 + (2*u + 3)*w +
        3*u + 4 + ((u + 6)*w^5 + 6*w^4 + (4*u + 3)*w^3 + (u + 2)*w^2 + (4*u +
        4)*w + (3*u + 2))*t + ((5*u + 2)*w^4 + (5*u + 6)*w^3 + (u + 1)*w^2 +
        (4*u + 6)*w + (3*u + 3))*t^2 + ((2*u + 6)*w^5 + 3*u*w^4 + 4*u*w^3 + (3*u
        + 6)*w^2 + (3*u + 3)*w + (5*u + 4))*t^3 + O(t^4),
    (4*u + 5)*w^5 + (6*u + 2)*w^4 + (2*u + 1)*w^3 + (3*u + 5)*w^2 + (2*u + 3)*w
        + 4*u + 3 + ((u + 6)*w^5 + w^4 + (4*u + 3)*w^3 + (6*u + 5)*w^2 + (4*u +
        4)*w + (4*u + 5))*t + ((2*u + 5)*w^4 + (5*u + 6)*w^3 + (6*u + 6)*w^2 +
        (4*u + 6)*w + (4*u + 4))*t^2 + ((2*u + 6)*w^5 + 4*u*w^4 + 4*u*w^3 + (4*u
        + 1)*w^2 + (3*u + 3)*w + (2*u + 3))*t^3 + O(t^4),
    (5*u + 1)*w^5 + (2*u + 3)*w^4 + (5*u + 6)*w^3 + (2*u + 1)*w^2 + (3*u + 1)*w
        + 3*u + 4 + ((3*u + 4)*w^5 + 5*w^4 + (3*u + 4)*w^3 + (4*u + 1)*w^2 +
        (6*u + 6)*w + (3*u + 2))*t + ((3*u + 4)*w^4 + (2*u + 1)*w^3 + (4*u +
        4)*w^2 + (6*u + 2)*w + (3*u + 3))*t^2 + ((6*u + 4)*w^5 + 6*u*w^4 +
        3*u*w^3 + (5*u + 3)*w^2 + (u + 1)*w + (5*u + 4))*t^3 + O(t^4),
    (5*u + 1)*w^5 + (5*u + 4)*w^4 + (5*u + 6)*w^3 + (5*u + 6)*w^2 + (3*u + 1)*w
        + 4*u + 3 + ((3*u + 4)*w^5 + 2*w^4 + (3*u + 4)*w^3 + (3*u + 6)*w^2 +
        (6*u + 6)*w + (4*u + 5))*t + ((4*u + 3)*w^4 + (2*u + 1)*w^3 + (3*u +
        3)*w^2 + (6*u + 2)*w + (4*u + 4))*t^2 + ((6*u + 4)*w^5 + u*w^4 + 3*u*w^3
        + (2*u + 4)*w^2 + (u + 1)*w + (2*u + 3))*t^3 + O(t^4),
    (u + 3)*w^5 + (3*u + 1)*w^4 + (2*u + 1)*w^3 + (6*u + 3)*w^2 + (u + 5)*w +
        4*u + 3 + ((2*u + 5)*w^5 + 4*w^4 + (4*u + 3)*w^3 + (5*u + 3)*w^2 + (2*u
        + 2)*w + (4*u + 5))*t + ((u + 6)*w^4 + (5*u + 6)*w^3 + (5*u + 5)*w^2 +
        (2*u + 3)*w + (4*u + 4))*t^2 + ((4*u + 5)*w^5 + 2*u*w^4 + 4*u*w^3 + (u +
        2)*w^2 + (5*u + 5)*w + (2*u + 3))*t^3 + O(t^4),
    (u + 3)*w^5 + (4*u + 6)*w^4 + (2*u + 1)*w^3 + (u + 4)*w^2 + (u + 5)*w + 3*u
        + 4 + ((2*u + 5)*w^5 + 3*w^4 + (4*u + 3)*w^3 + (2*u + 4)*w^2 + (2*u +
        2)*w + (3*u + 2))*t + ((6*u + 1)*w^4 + (5*u + 6)*w^3 + (2*u + 2)*w^2 +
        (2*u + 3)*w + (3*u + 3))*t^2 + ((4*u + 5)*w^5 + 5*u*w^4 + 4*u*w^3 + (6*u
        + 5)*w^2 + (5*u + 5)*w + (5*u + 4))*t^3 + O(t^4)
]
> p;
GaloisData of type F_q(t)
> p`Prime;
t^2 + t + 4
> p`Ring;
Power series ring in t over GF(7^12)
GeometricGaloisGroup(f) : RngUPolElt -> GrpPerm, RngUPolElt, GaloisData
Given a polynomial f over Q(t) return the Galois group of f as a polynomial over C(t) and a polynomial defining the fixed field of that group. For information about the algorithm involved see [Sut18].
HilbertIrreducibilityCurves(f) : RngUPolElt -> SetEnum, SeqEnum
Given a polynomial f over Q(t) this intrinsic provides a finite set and a sequence of curves such that the rational points on the curves together with the finite set determine the set of exceptions to Hilbert's Irreducibility Theorem for f. For more information see [KS21].

Example FldFunG_appl (H45E15)

We show a computation of a geometric Galois group
> Qt<t> := FunctionField(Rationals());
> Qtx<x> := PolynomialRing(Qt);
> f := x^9 - 3*x^7 + (-6*t - 6)*x^6 + 3*x^5 + (12*t - 6)*x^4 +
> (12*t^2 - 84*t + 11)*x^3 + (-6*t - 6)*x^2 + (-12*t^2 + 12*t + 24)*x -
> 8*t^3 - 24*t^2 - 24*t - 6;
> time GeometricGaloisGroup(f);
Permutation group acting on a set of cardinality 9
Order = 6 = 2 * 3
    (2, 9)(3, 8)(4, 7)
    (1, 9, 2)(3, 8, 6)(4, 7, 5)
x^6 + 78732
GaloisData of type Q(t)
and one of the exceptions and curves involved in making Hilbert's Irreducibility Theorem explicit.
> f := x^6 + t^6 - 1;
> HilbertIrreducibilityCurves(f);
{ -1, 1 }
[
    <Curve over Rational Field defined by
    x^2 + 6*x + 9*t^6, Permutation group acting on a set of cardinality 6
    Order = 6 = 2 * 3
        (2, 5)(3, 4)
        (1, 5, 2)(3, 4, 6)>,
    <Curve over Rational Field defined by
    x^2 + 1728*t^12 - 3456*t^6 + 1728, Permutation group acting on a set of
    cardinality 6
    Order = 6 = 2 * 3
        (1, 3, 2, 6, 5, 4)
        (1, 5, 2)(3, 4, 6)>,
    <Curve over Rational Field defined by
    x^2 - 62208*t^30 + 311040*t^24 - 622080*t^18 + 622080*t^12 - 311040*t^6 +
        62208, Permutation group acting on a set of cardinality 6
    Order = 6 = 2 * 3
        (1, 3)(2, 4)(5, 6)
        (1, 5, 2)(3, 4, 6)>,
    <Curve over Rational Field defined by
    x^3 + 12*x^2 + 48*x - 8*t^6 + 72, Permutation group acting on a set of
    cardinality 6
    Order = 4 = 2^2
        (2, 5)(3, 4)
        (1, 6)(2, 4)(3, 5)>
]

Splitting Fields

The Galois group of a polynomial can be used to compute splitting fields of the polynomial. Magma contains intrinsics which compute a minimal degree splitting field over the coefficient field as well as a splitting field consisting of radical extensions.

GaloisSplittingField(f) : RngUPolElt -> FldFun, [FldFunElt], GrpPerm, [[FldFunElt]]
    Galois: Tup<GrpPerm, [RngElt], GaloisData> Default: 
    Roots: BoolElt                      Default: true
    AllAuto: BoolElt                    Default: false
    Stab: BoolElt                       Default: true
    Chain: [GrpPerm]                    Default: false
    Inv: [RngSLPolElt]                  Default: false
    Name: MonStgElt                     Default: false
For a polynomial f over Fq[t] this function computes the splitting field of f as a tower of fields. The various parameters can be used to force certain subfield towers and/or compute additional data. By default Stab is set to true, which means that the splitting field will be the tower corresponding to the chain of stabilizers of {1}, {1, 2}, ..., {1, ..., n}. Also by default Roots is set to true, which means that the roots of f are expressed as elements of the splitting field. If Roots is set to false, only the field is computed and returned.

The third return value will be the Galois group, the optional fourth value the automorphisms.

If the parameter Galois is used, it should contain a list or triplet containing the output of GaloisGroup(f);.

If Chain is set to a sequence of subgroups, this chain is used to compute a subfield tower. In this case the first elements must be G, the full Galois group. If Chain is used, Inv can be used to provide the invariants as well.

If AllAuto is set to true, the full automorphism group of the splitting field is computed as a sequence of sequences giving the all the roots of the relative polynomials.

If Name is given, it should be set to a string. In this case the primitive element of the i-subfield in the tower will be called Name.i.

Example FldFunG_galois-subfield (H45E16)

We start with a small example, to illustrate some of the parameters and their influence:
> F<t> := FunctionField(GF(5));
> P<x> := PolynomialRing(F);
> f := x^3-2*t;
> GaloisSplittingField(f);
Algebraic function field defined over Algebraic function field defined over
Univariate rational function field over GF(5) by
x^3 + 2*t by
$.1^2 + $.1*$.1 + $.1^2
[
    4*$.1,
    4*$.1,
    $.1 + $.1
]
Symmetric group acting on a set of cardinality 3
Order = 6 = 2 * 3
    (1, 2, 3)
    (1, 2)
> K, R, G := $1;
> K:Maximal;
  K
  |
  | $.1^2 + $.1*$.1 + $.1^2
  |
 $2
  |
  | x^3 + 2*t
  |
Univariate rational function field over GF(5)
Variables: t
> [x^3 : x in R];
[
    2*t,
    2*t,
    2*t
]
The fact that by default all generators are called $.1 makes this hard to read, so let us assign other names:
> GaloisSplittingField(f:Name := "K");
Algebraic function field defined over Algebraic function field defined over
Univariate rational function field over GF(5) by
x^3 + 2*t by
K1^2 + K2*K1 + K2^2
[
    4*K2,
    4*K1,
    K1 + K2
]
Symmetric group G acting on a set of cardinality 3
Order = 6 = 2 * 3
    (1, 2, 3)
    (1, 2)
> (K where K := $1):Maximal;
   K<K1>
     |
     | K1^2 + K2*K1 + K2^2
     |
  $2<K2>
     |
     | x^3 + 2*t
     |
Univariate rational function field over GF(5)
Variables: t
So now we can easily see that the splitting field is a relative quadratic extension of the degree 3 stem field. Now we try a different subgroup chain:
> G, r, S := GaloisGroup(f);
> GaloisSplittingField(f:Galois := <G, r, S>,
>     Chain := CompositionSeries(G), Name := "K", AllAuto);
Algebraic function field defined over Algebraic function field defined over
Univariate rational function field over GF(5) by
x^2 + 3*t^2 by
K1^3 + 2*t
[
    4*K1,
    (3/t*K2 + 3)*K1,
    (2/t*K2 + 3)*K1
]
Symmetric group G acting on a set of cardinality 3
Order = 6 = 2 * 3
    (1, 2, 3)
    (1, 2)
[
    [
        4*K2,
        K2
    ],
    [
        4*K1,
        (3/t*K2 + 3)*K1,
        (2/t*K2 + 3)*K1
    ]
]
> (K where K := $1):Maximal;
  $1<K1>
     |
     | K1^3 + 2*t
     |
  $2<K2>
     |
     | x^2 + 3*t^2
     |
Univariate rational function field over GF(5)
Variables: t
And lastly we show a larger example.
> f := x^6 - t^14*x^4 - t^19*x^2 - t^52;
> G, r, S := GaloisGroup(f); G;
Permutation group G acting on a set of cardinality 6
Order = 24 = 2^3 * 3
    (1, 5, 6)(2, 3, 4)
    (1, 2)(4, 5)
    (1, 5)(2, 4)
    (1, 2, 3)(4, 5, 6)
> TransitiveGroupIdentification(G);
7 6
> TransitiveGroupDescription(G);
S_4(6d) = [2^2]S(3)
> time K, R := GaloisSplittingField(f:Name := "K");
Time: 149.700
> K:Maximal;
   K<K1>
     |
     | K1^4 + (K2^2 + 4*t^14)*K1^2 + K2^4 + 4*t^14*K2^2 + 4*t^19
     |
  $2<K2>
     |
     | x^6 + 4*t^14*x^4 + 4*t^19*x^2 + 4*t^52
     |
Univariate rational function field over GF(5)
Variables: t
Solvability by Radicals

For a polynomial f∈Fq[t][x] with solvable Galois group it is well known that the roots of f can be expressed as nested radicals. On the other hand no good algorithm is known to achieve this. Here we use the explicit action of the Galois group of f as a permutation group on the p-adic roots to compute such a representation.

SolveByRadicals(f) : RngUPolElt -> FldFun, [FldFunElt], [FldFunElt]
    Prime: RngIntElt                    Default: false
    Name: MonStgElt                     Default: false
    Galois: Tup<GrpPerm, [RngElt], GaloisData> Default: 
    UseZeta_p: BoolElt                  Default: false
    MaxBound: RngIntElt                 Default: ∞
    SetVerbose("GaloisTower", n):       Maximum: 3
For a polynomial f∈Z[t] with solvable Galois group, a splitting field as a tower of radical extensions is computed together with algebraic representations of the roots of f as elements in the splitting field. The third return value contains the non-trivial roots of unity which are used.

If the parameter Galois is used, it should contain a list or triplet containing the output of GaloisGroup(f);.

If Prime is used, and Galois is unspecified, the value of Prime is passed onto the Galois group computation and can therefore be used to choose the p-adic field.

If UseZeta_p is set to true, then the expression for the roots of p will contain pure radicals and roots of unity. By default, if UseZeta_p is false, radical expressions for the roots of unit necessary will also be computed.

If MaxBound is given, it will be used as an upper bound for the p-adic precision used internally. Especially when the radical tower contains many steps, the internally used precision estimates become more and more pessimistic, thus resulting in larger and larger precision.

If Name is set to some string, the i-th level primitive element in the tower will be called Name.i.

CyclicToRadical(K, a, z) : FldFun, FldFunElt, RngElt -> FldFun, [FldFunElt], [FldFunElt]
Let K/F be a function field with cyclic automorphism group of order n generated by K.1 to a and z be a n-th root of unity in k. This intrinsic will return a field L isomorphic to K such that L is a Kummer extension or an Artin--Schreier extension, i.e. the defining polynomial for L will be of the form yn - b or yp - y - b for some b in the coefficient field k of K. The second returned value contains the roots of f in L while the third return value contains the roots of unity used.

Example FldFunG_solve-radical (H45E17)

> F<t> := FunctionField(GF(5));
> P<x> := PolynomialRing(F);
> f := x^6 + (2*t + 3)*x^4 + 3*t*x^3 + (3*t^2 + 1)*x^2 +
> (4*t^2 + 2*t)*x + 4*t^3 + 3*t^2 + 4*t;
> K, R := SolveByRadicals(f:Name := "K.");
> K:Maximal;
   K<K.1>
     |
     | K.1^3 + 3*$.1*K.2 + 4*$.1
     |
  $2<K.2>
     |
     | K.2^2 + 2*$.1^2 + 1
     |
  $3<K.3>
     |
     | K.3^2 + $.1
     |
Univariate rational function field over GF(5^2)
Variables: $.1
> [ Evaluate(f, x) eq 0 : x in R];
[ true, true, true, true, true, true ]
Note that every step in the tower defining K is radical, ie. given by an equation of type xn - a or xp - x - a in characteristic p.
V2.28, 13 July 2023