Galois Groups of Number Fields

AUTHORS:

  • William Stein (2004, 2005): initial version

  • David Loeffler (2009): rewrite to give explicit homomorphism groups

sage.rings.number_field.galois_group.GaloisGroup

alias of sage.rings.number_field.galois_group.GaloisGroup_v1

class sage.rings.number_field.galois_group.GaloisGroupElement

Bases: sage.groups.perm_gps.permgroup_element.PermutationGroupElement

An element of a Galois group. This is stored as a permutation, but may also be made to act on elements of the field (generally returning elements of its Galois closure).

EXAMPLES:

sage: K.<w> = QuadraticField(-7); G = K.galois_group()
sage: G[1]
(1,2)
sage: G[1](w + 2)
-w + 2

sage: L.<v> = NumberField(x^3 - 2); G = L.galois_group(names='y')
sage: G[4]
(1,5)(2,4)(3,6)
sage: G[4](v)
1/18*y^4
sage: G[4](G[4](v))
-1/36*y^4 - 1/2*y
sage: G[4](G[4](G[4](v)))
1/18*y^4
as_hom()

Return the homomorphism L -> L corresponding to self, where L is the Galois closure of the ambient number field.

EXAMPLES:

sage: G = QuadraticField(-7,'w').galois_group()
sage: G[1].as_hom()
Ring endomorphism of Number Field in w with defining polynomial x^2 + 7 with w = 2.645751311064591?*I
  Defn: w |--> -w
ramification_degree(P)

Return the greatest value of v such that s acts trivially modulo P^v. Should only be used if P is prime and s is in the decomposition group of P.

EXAMPLES:

sage: K.<b> = NumberField(x^3 - 3, 'a').galois_closure()
sage: G = K.galois_group()
sage: P = K.primes_above(3)[0]
sage: s = hom(K, K, 1/18*b^4 - 1/2*b)
sage: G(s).ramification_degree(P)
4
class sage.rings.number_field.galois_group.GaloisGroup_subgroup(ambient, elts)

Bases: sage.rings.number_field.galois_group.GaloisGroup_v2

A subgroup of a Galois group, as returned by functions such as decomposition_group.

fixed_field()

Return the fixed field of this subgroup (as a subfield of the Galois closure of the number field associated to the ambient Galois group).

EXAMPLES:

sage: L.<a> = NumberField(x^4 + 1)
sage: G = L.galois_group()
sage: H = G.decomposition_group(L.primes_above(3)[0])
sage: H.fixed_field()
(Number Field in a0 with defining polynomial x^2 + 2 with a0 = a^3 + a,
 Ring morphism:
   From: Number Field in a0 with defining polynomial x^2 + 2 with a0 = a^3 + a
   To:   Number Field in a with defining polynomial x^4 + 1
   Defn: a0 |--> a^3 + a)

An embedding is returned also if the subgroup is trivial (trac ticket #26817):

sage: H = G.subgroup([G.identity()])
sage: H.fixed_field()
(Number Field in a0 with defining polynomial x^4 + 1 with a0 = a,
 Ring morphism:
   From: Number Field in a0 with defining polynomial x^4 + 1 with a0 = a
   To:   Number Field in a with defining polynomial x^4 + 1
   Defn: a0 |--> a)
order()

Return the order of this subgroup.

EXAMPLES:

sage: K.<a> = NumberField(x^6-3*x^2-1)
sage: L.<b> = K.galois_closure()
sage: G = L.galois_group()
sage: P = L.primes_above(3)[0]
sage: H = G.decomposition_group(P)
sage: H.order()
3
class sage.rings.number_field.galois_group.GaloisGroup_v1(group, number_field)

Bases: sage.structure.sage_object.SageObject

A wrapper around a class representing an abstract transitive group.

This is just a fairly minimal object at present. To get the underlying group, do G.group(), and to get the corresponding number field do G.number_field(). For a more sophisticated interface use the type=None option.

EXAMPLES:

sage: from sage.rings.number_field.galois_group import GaloisGroup_v1
sage: K = QQ[2^(1/3)]
sage: G = GaloisGroup_v1(K.absolute_polynomial().galois_group(pari_group=True), K); G
...DeprecationWarning: GaloisGroup_v1 is deprecated; please use GaloisGroup_v2
See https://trac.sagemath.org/28782 for details.
Galois group PARI group [6, -1, 2, "S3"] of degree 3 of the Number Field in a with defining polynomial x^3 - 2 with a = 1.259921049894873?
sage: G.order()
6
sage: G.group()
PARI group [6, -1, 2, "S3"] of degree 3
sage: G.number_field()
Number Field in a with defining polynomial x^3 - 2 with a = 1.259921049894873?
group()

Return the underlying abstract group.

EXAMPLES:

sage: from sage.rings.number_field.galois_group import GaloisGroup_v1
sage: K = NumberField(x^3 + 2*x + 2, 'theta')
sage: G = GaloisGroup_v1(K.absolute_polynomial().galois_group(pari_group=True), K)
...DeprecationWarning: GaloisGroup_v1 is deprecated; please use GaloisGroup_v2
See https://trac.sagemath.org/28782 for details.
sage: H = G.group(); H
PARI group [6, -1, 2, "S3"] of degree 3
sage: P = H.permutation_group(); P
Transitive group number 2 of degree 3
sage: sorted(P)
[(), (2,3), (1,2), (1,2,3), (1,3,2), (1,3)]
number_field()

Return the number field of which this is the Galois group.

EXAMPLES:

sage: from sage.rings.number_field.galois_group import GaloisGroup_v1
sage: K = NumberField(x^6 + 2, 't')
sage: G = GaloisGroup_v1(K.absolute_polynomial().galois_group(pari_group=True), K); G
...DeprecationWarning: GaloisGroup_v1 is deprecated; please use GaloisGroup_v2
See https://trac.sagemath.org/28782 for details.
Galois group PARI group [12, -1, 3, "D(6) = S(3)[x]2"] of degree 6 of the Number Field in t with defining polynomial x^6 + 2
sage: G.number_field()
Number Field in t with defining polynomial x^6 + 2
order()

Return the order of this Galois group.

EXAMPLES:

sage: from sage.rings.number_field.galois_group import GaloisGroup_v1
sage: K = NumberField(x^5 + 2, 'theta_1')
sage: G = GaloisGroup_v1(K.absolute_polynomial().galois_group(pari_group=True), K); G
...DeprecationWarning: GaloisGroup_v1 is deprecated; please use GaloisGroup_v2
See https://trac.sagemath.org/28782 for details.
Galois group PARI group [20, -1, 3, "F(5) = 5:4"] of degree 5 of the Number Field in theta_1 with defining polynomial x^5 + 2
sage: G.order()
20
class sage.rings.number_field.galois_group.GaloisGroup_v2(number_field, algorithm='pari', names=None, gc_numbering=None, _type=None)

Bases: sage.groups.galois_group.GaloisGroup

The Galois group of an (absolute) number field.

Note

We define the Galois group of a non-normal field K to be the Galois group of its Galois closure L, and elements are stored as permutations of the roots of the defining polynomial of L, not as permutations of the roots (in L) of the defining polynomial of K. The latter would probably be preferable, but is harder to implement. Thus the permutation group that is returned is always simply-transitive.

The ‘arithmetical’ features (decomposition and ramification groups, Artin symbols etc) are only available for Galois fields.

Element

alias of GaloisGroupElement

artin_symbol(P)

Return the Artin symbol \(\left(\frac{K / \QQ}{\mathfrak{P}}\right)\), where K is the number field of self, and \(\mathfrak{P}\) is an unramified prime ideal. This is the unique element s of the decomposition group of \(\mathfrak{P}\) such that \(s(x) = x^p \bmod \mathfrak{P}\), where p is the residue characteristic of \(\mathfrak{P}\).

EXAMPLES:

sage: K.<b> = NumberField(x^4 - 2*x^2 + 2, 'a').galois_closure()
sage: G = K.galois_group()
sage: [G.artin_symbol(P) for P in K.primes_above(7)]
[(1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8), (1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7)]
sage: G.artin_symbol(17)
Traceback (most recent call last):
...
ValueError: Fractional ideal (17) is not prime
sage: QuadraticField(-7,'c').galois_group().artin_symbol(13)
(1,2)
sage: G.artin_symbol(K.primes_above(2)[0])
Traceback (most recent call last):
...
ValueError: Fractional ideal (...) is ramified
complex_conjugation(P=None)

Return the unique element of self corresponding to complex conjugation, for a specified embedding P into the complex numbers. If P is not specified, use the “standard” embedding, whenever that is well-defined.

EXAMPLES:

sage: L.<z> = CyclotomicField(7)
sage: G = L.galois_group()
sage: conj = G.complex_conjugation(); conj
(1,4)(2,5)(3,6)
sage: conj(z)
-z^5 - z^4 - z^3 - z^2 - z - 1

An example where the field is not CM, so complex conjugation really depends on the choice of embedding:

sage: L = NumberField(x^6 + 40*x^3 + 1372,'a')
sage: G = L.galois_group()
sage: [G.complex_conjugation(x) for x in L.places()]
[(1,3)(2,6)(4,5), (1,5)(2,4)(3,6), (1,2)(3,4)(5,6)]
decomposition_group(P)

Decomposition group of a prime ideal P, i.e. the subgroup of elements that map P to itself. This is the same as the Galois group of the extension of local fields obtained by completing at P.

This function will raise an error if P is not prime or the given number field is not Galois.

P can also be an infinite prime, i.e. an embedding into \(\RR\) or \(\CC\).

EXAMPLES:

sage: K.<a> = NumberField(x^4 - 2*x^2 + 2,'b').galois_closure()
sage: P = K.ideal([17, a^2])
sage: G = K.galois_group()
sage: G.decomposition_group(P)
Subgroup [(), (1,8)(2,7)(3,6)(4,5)] of Galois group 8T4 ([4]2) with order 8 of x^8 - 20*x^6 + 104*x^4 - 40*x^2 + 1156
sage: G.decomposition_group(P^2)
Traceback (most recent call last):
...
ValueError: Fractional ideal (...) is not a prime ideal
sage: G.decomposition_group(17)
Traceback (most recent call last):
...
ValueError: Fractional ideal (17) is not a prime ideal

An example with an infinite place:

sage: L.<b> = NumberField(x^3 - 2,'a').galois_closure(); G=L.galois_group()
sage: x = L.places()[0]
sage: G.decomposition_group(x).order()
2
easy_order(algorithm=None)

Return the order of this Galois group if it’s quick to compute.

EXAMPLES:

sage: R.<x> = ZZ[]
sage: K.<a> = NumberField(x^3 + 2*x + 2)
sage: G = K.galois_group()
sage: G.easy_order()
6
sage: L.<b> = NumberField(x^72 + 2*x + 2)
sage: H = L.galois_group()
sage: H.easy_order()
group()

While GaloisGroup_v1 is being deprecated, this provides public access to the Pari/GAP group in order to keep all aspects of that API.

EXAMPLES:

sage: R.<x> = ZZ[]
sage: K.<a> = NumberField(x^3 + 2*x + 2)
sage: G = K.galois_group(type="pari")
...DeprecationWarning: the different Galois types have been merged into one class
See https://trac.sagemath.org/28782 for details.
sage: G.group()
...DeprecationWarning: the group method is deprecated; you can use _pol_galgp if you really need it
See https://trac.sagemath.org/28782 for details.
PARI group [6, -1, 2, "S3"] of degree 3
inertia_group(P)

Return the inertia group of the prime P, i.e. the group of elements acting trivially modulo P. This is just the 0th ramification group of P.

EXAMPLES:

sage: K.<b> = NumberField(x^2 - 3,'a')
sage: G = K.galois_group()
sage: G.inertia_group(K.primes_above(2)[0])
Subgroup [(), (1,2)] of Galois group 2T1 (S2) with order 2 of x^2 - 3
sage: G.inertia_group(K.primes_above(5)[0])
Subgroup [()] of Galois group 2T1 (S2) with order 2 of x^2 - 3
is_galois()

Whether the underlying number field is Galois

EXAMPLES:

sage: NumberField(x^3 - x + 1,'a').galois_group(names='b').is_galois()
False
sage: NumberField(x^2 - x + 1,'a').galois_group().is_galois()
True
list()

List of the elements of self.

EXAMPLES:

sage: NumberField(x^3 - 3*x + 1,'a').galois_group().list()
[(), (1,2,3), (1,3,2)]
number_field()

The ambient number field.

EXAMPLES:

sage: K = NumberField(x^3 - x + 1, 'a')
sage: K.galois_group(names='b').number_field() is K
True
order(algorithm=None, recompute=False)

Return the order of this Galois group

EXAMPLES:

sage: R.<x> = ZZ[]
sage: K.<a> = NumberField(x^3 + 2*x + 2)
sage: G = K.galois_group()
sage: G.order()
6
pari_label()

Return the label assigned by Pari for this Galois group, an attempt at giving a human readable description of the group.

EXAMPLES:

sage: R.<x> = ZZ[]
sage: K.<a> = NumberField(x^8 - x^5 + x^4 - x^3 + 1)
sage: G = K.galois_group()
sage: G.transitive_label()
'8T44'
sage: G.pari_label()
'[2^4]S(4)'
ramification_breaks(P)

Return the set of ramification breaks of the prime ideal P, i.e. the set of indices i such that the ramification group \(G_{i+1} \ne G_{i}\). This is only defined for Galois fields.

EXAMPLES:

sage: K.<b> = NumberField(x^8 - 20*x^6 + 104*x^4 - 40*x^2 + 1156)
sage: G = K.galois_group()
sage: P = K.primes_above(2)[0]
sage: G.ramification_breaks(P)
{1, 3, 5}
sage: min( [ G.ramification_group(P, i).order() / G.ramification_group(P, i+1).order() for i in G.ramification_breaks(P)] )
2
ramification_group(P, v)

Return the vth ramification group of self for the prime P, i.e. the set of elements s of self such that s acts trivially modulo P^(v+1). This is only defined for Galois fields.

EXAMPLES:

sage: K.<b> = NumberField(x^3 - 3,'a').galois_closure()
sage: G=K.galois_group()
sage: P = K.primes_above(3)[0]
sage: G.ramification_group(P, 3)
Subgroup [(), (1,2,4)(3,5,6), (1,4,2)(3,6,5)] of Galois group 6T2 ([3]2) with order 6 of x^6 + 243
sage: G.ramification_group(P, 5)
Subgroup [()] of Galois group 6T2 ([3]2) with order 6 of x^6 + 243
signature()

Return 1 if contained in the alternating group, -1 otherwise.

EXAMPLES:

sage: R.<x> = ZZ[]
sage: K.<a> = NumberField(x^3 - 2)
sage: K.galois_group().signature()
-1
sage: K.<a> = NumberField(x^3 - 3*x - 1)
sage: K.galois_group().signature()
1
subgroup(elts)

Return the subgroup of self with the given elements. Mostly for internal use.

EXAMPLES:

sage: G = NumberField(x^3 - x - 1, 'a').galois_closure('b').galois_group()
sage: G.subgroup([ G(1), G([(1,2,3),(4,5,6)]), G([(1,3,2),(4,6,5)]) ])
Subgroup [(), (1,2,3)(4,5,6), (1,3,2)(4,6,5)] of Galois group 6T2 ([3]2) with order 6 of x^6 - 6*x^4 + 9*x^2 + 23

Subgroups can be specified using generators (trac ticket #26816):

sage: K.<a> = NumberField(x^6 - 6*x^4 + 9*x^2 + 23)
sage: G = K.galois_group()
sage: list(G)
[(),
 (1,2,3)(4,5,6),
 (1,3,2)(4,6,5),
 (1,4)(2,6)(3,5),
 (1,5)(2,4)(3,6),
 (1,6)(2,5)(3,4)]
sage: g = G[1]
sage: h = G[3]
sage: list(G.subgroup([]))
[()]
sage: list(G.subgroup([g]))
[(), (1,2,3)(4,5,6), (1,3,2)(4,6,5)]
sage: list(G.subgroup([h]))
[(), (1,4)(2,6)(3,5)]
sage: list(G.subgroup([g,h])) == list(G)
True
transitive_number(algorithm=None, recompute=False)

Regardless of the value of gc_numbering, this gives the transitive number for the action on the roots of the defining polynomial of the original number field, not the Galois closure.

INPUT:

  • algorithm – string, specify the algorithm to be used

  • recompute – boolean, whether to recompute the result even if known by another algorithm

EXAMPLES:

sage: R.<x> = ZZ[]
sage: K.<a> = NumberField(x^3 + 2*x + 2)
sage: G = K.galois_group()
sage: G.transitive_number()
2
sage: L.<b> = NumberField(x^13 + 2*x + 2)
sage: H = L.galois_group(algorithm="gap")
sage: H.transitive_number() # optional - gap_packages
9
unrank(i)

Return the i-th element of self.

INPUT:

  • i – integer between 0 and n-1 where n is the cardinality of this set

EXAMPLES:

sage: G = NumberField(x^3 - 3*x + 1,'a').galois_group()
sage: [G.unrank(i) for i in range(G.cardinality())]
[(), (1,2,3), (1,3,2)]