Galois groups of number fields¶
AUTHORS:
William Stein (2004, 2005): initial version
David Loeffler (2009): rewrote to give explicit homomorphism groups
- class sage.rings.number_field.galois_group.GaloisGroupElement[source]¶
Bases:
PermutationGroupElementAn 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: x = polygen(ZZ, 'x') 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()[source]¶
Return the homomorphism
corresponding toself, where 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)[source]¶
Return the greatest value of
such that acts trivially modulo . Should only be used if is prime and is in the decomposition group of .EXAMPLES:
sage: x = polygen(ZZ, 'x') 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, gens=None, gap_group=None, domain=None, category=None, canonicalize=True, check=True)[source]¶
Bases:
GaloisSubgroup_permA subgroup of a Galois group, as returned by functions such as
decomposition_group.INPUT:
ambient– the ambient Galois groupgens– list of generators for the groupgap_group– a gap or libgap permutation group, or a stringdefining one (default:
None)
domain– set on which this permutation group acts; extracted fromambientif not specifiedcategory– the category for this objectcanonicalize– ifTrue, sorts and removes duplicatescheck– whether to check that generators actually lie in the ambient group
EXAMPLES:
sage: from sage.rings.number_field.galois_group import GaloisGroup_subgroup sage: x = polygen(ZZ, 'x') sage: G = NumberField(x^3 - x - 1, 'a').galois_closure('b').galois_group() sage: GaloisGroup_subgroup( G, [G([(1,2,3),(4,5,6)])]) Subgroup generated by [(1,2,3)(4,5,6)] of (Galois group 6T2 ([3]2) with order 6 of x^6 - 6*x^4 + 9*x^2 + 23) 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 sage: G = NumberField(x^3 - x - 1, 'a').galois_closure('b').galois_group() sage: H = G.subgroup([G([(1,2,3),(4,5,6)])]) sage: H Subgroup generated by [(1,2,3)(4,5,6)] of (Galois group 6T2 ([3]2) with order 6 of x^6 - 6*x^4 + 9*x^2 + 23)
- Element[source]¶
alias of
GaloisGroupElement
- fixed_field(name=None, polred=None, threshold=None)[source]¶
Return the fixed field of this subgroup (as a subfield of the Galois closure of the number field associated to the ambient Galois group).
INPUT:
name– a variable name for the new fieldpolred– whether to optimize the generator of the newly created fieldfor a simpler polynomial, using PARI’s pari:polredbest. Defaults to
Truewhen the degree of the fixed field is at most 8.
threshold– positive number; polred only performed if the cost is at most this threshold
EXAMPLES:
sage: x = polygen(ZZ, 'x') 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)
You can use the
polredoption to get a simpler defining polynomial:sage: K.<a> = NumberField(x^5 - 5*x^2 - 3) sage: G = K.galois_group(); G Galois group 5T2 (5:2) with order 10 of x^5 - 5*x^2 - 3 sage: sigma, tau = G.gens() sage: H = G.subgroup([tau]) sage: H.fixed_field(polred=False) (Number Field in a0 with defining polynomial x^2 + 84375 with a0 = 5*ac^5 + 25*ac^3, Ring morphism: From: Number Field in a0 with defining polynomial x^2 + 84375 with a0 = 5*ac^5 + 25*ac^3 To: Number Field in ac with defining polynomial x^10 + 10*x^8 + 25*x^6 + 3375 Defn: a0 |--> 5*ac^5 + 25*ac^3) sage: H.fixed_field(polred=True) (Number Field in a0 with defining polynomial x^2 - x + 4 with a0 = -1/30*ac^5 - 1/6*ac^3 + 1/2, Ring morphism: From: Number Field in a0 with defining polynomial x^2 - x + 4 with a0 = -1/30*ac^5 - 1/6*ac^3 + 1/2 To: Number Field in ac with defining polynomial x^10 + 10*x^8 + 25*x^6 + 3375 Defn: a0 |--> -1/30*ac^5 - 1/6*ac^3 + 1/2) sage: G.splitting_field() Number Field in ac with defining polynomial x^10 + 10*x^8 + 25*x^6 + 3375
An embedding is returned also if the subgroup is trivial (Issue #26817):
sage: H = G.subgroup([]) sage: H.fixed_field() (Number Field in ac with defining polynomial x^10 + 10*x^8 + 25*x^6 + 3375, Identity endomorphism of Number Field in ac with defining polynomial x^10 + 10*x^8 + 25*x^6 + 3375)
- class sage.rings.number_field.galois_group.GaloisGroup_v2(number_field, algorithm='pari', names=None, gc_numbering=None, _type=None)[source]¶
Bases:
GaloisGroup_permThe Galois group of an (absolute) number field.
Note
We define the Galois group of a non-normal field
to be the Galois group of its Galois closure , and elements are stored as permutations of the roots of the defining polynomial of , not as permutations of the roots (in ) of the defining polynomial of . 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.
EXAMPLES:
sage: x = polygen(ZZ, 'x') sage: G = NumberField(x^3 - x - 1, 'a').galois_closure('b').galois_group() sage: G.subgroup([G([(1,2,3),(4,5,6)])]) Subgroup generated by [(1,2,3)(4,5,6)] 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 (Issue #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: sorted(G.subgroup([g,h])) == sorted(G) True
- Element[source]¶
alias of
GaloisGroupElement
- Subgroup[source]¶
alias of
GaloisGroup_subgroup
- artin_symbol(P)[source]¶
Return the Artin symbol
, where is the number field ofself, and is an unramified prime ideal. This is the unique element of the decomposition group of such that , where is the residue characteristic of .EXAMPLES:
sage: x = polygen(ZZ, 'x') sage: K.<b> = NumberField(x^4 - 2*x^2 + 2, 'a').galois_closure() sage: G = K.galois_group() sage: sorted([G.artin_symbol(P) for P in K.primes_above(7)]) # random (see remark in primes_above) [(1,4)(2,3)(5,8)(6,7), (1,4)(2,3)(5,8)(6,7), (1,5)(2,6)(3,7)(4,8), (1,5)(2,6)(3,7)(4,8)] 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)[source]¶
Return the unique element of
selfcorresponding to complex conjugation, for a specified embedding into the complex numbers. If 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: x = polygen(ZZ, 'x') 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)[source]¶
Decomposition group of a prime ideal
, i.e., the subgroup of elements that map to itself. This is the same as the Galois group of the extension of local fields obtained by completing at .This function will raise an error if
is not prime or the given number field is not Galois. can also be an infinite prime, i.e., an embedding into or .EXAMPLES:
sage: x = polygen(ZZ, 'x') 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 generated by [(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: x = polygen(ZZ, 'x') 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)[source]¶
Return the order of this Galois group if it’s quick to compute.
EXAMPLES:
sage: R.<x> = ZZ[] sage: x = polygen(ZZ, 'x') sage: K.<a> = NumberField(x^3 + 2*x + 2) sage: G = K.galois_group() sage: G.easy_order() 6 sage: x = polygen(ZZ, 'x') sage: L.<b> = NumberField(x^72 + 2*x + 2) sage: H = L.galois_group() sage: H.easy_order()
- inertia_group(P)[source]¶
Return the inertia group of the prime
, i.e., the group of elements acting trivially modulo . This is just the 0th ramification group of .EXAMPLES:
sage: x = polygen(ZZ, 'x') sage: K.<b> = NumberField(x^2 - 3, 'a') sage: G = K.galois_group() sage: G.inertia_group(K.primes_above(2)[0]) Subgroup generated by [(1,2)] of (Galois group 2T1 (S2) with order 2 of x^2 - 3) sage: G.inertia_group(K.primes_above(5)[0]) Subgroup generated by [()] of (Galois group 2T1 (S2) with order 2 of x^2 - 3)
- is_galois()[source]¶
Whether the underlying number field is Galois.
EXAMPLES:
sage: x = polygen(ZZ, 'x') 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()[source]¶
List of the elements of
self.EXAMPLES:
sage: x = polygen(ZZ, 'x') sage: NumberField(x^3 - 3*x + 1,'a').galois_group().list() [(), (1,2,3), (1,3,2)]
- number_field()[source]¶
The ambient number field.
EXAMPLES:
sage: x = polygen(ZZ, 'x') sage: K = NumberField(x^3 - x + 1, 'a') sage: K.galois_group(names='b').number_field() is K True
- order(algorithm=None, recompute=False)[source]¶
Return the order of this Galois group.
EXAMPLES:
sage: R.<x> = ZZ[] sage: x = polygen(ZZ, 'x') sage: K.<a> = NumberField(x^3 + 2*x + 2) sage: G = K.galois_group() sage: G.order() 6
- pari_label()[source]¶
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: x = polygen(ZZ, 'x') 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)[source]¶
Return the set of ramification breaks of the prime ideal
, i.e., the set of indices such that the ramification group . This is only defined for Galois fields.EXAMPLES:
sage: x = polygen(ZZ, 'x') 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)[source]¶
Return the
-th ramification group ofselffor the prime , i.e., the set of elements ofselfsuch that acts trivially modulo . This is only defined for Galois fields.EXAMPLES:
sage: x = polygen(ZZ, 'x') 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 generated by [(1,2,4)(3,5,6)] of (Galois group 6T2 ([3]2) with order 6 of x^6 + 243) sage: G.ramification_group(P, 5) Subgroup generated by [()] of (Galois group 6T2 ([3]2) with order 6 of x^6 + 243)
- signature()[source]¶
Return
if contained in the alternating group, otherwise.EXAMPLES:
sage: R.<x> = ZZ[] sage: x = polygen(ZZ, 'x') 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
- transitive_number(algorithm=None, recompute=False)[source]¶
Regardless of the value of
gc_numbering, give 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 usedrecompute– boolean, whether to recompute the result even if known by another algorithm
EXAMPLES:
sage: R.<x> = ZZ[] sage: x = polygen(ZZ, 'x') sage: K.<a> = NumberField(x^3 + 2*x + 2) sage: G = K.galois_group() sage: G.transitive_number() 2 sage: x = polygen(ZZ, 'x') sage: L.<b> = NumberField(x^13 + 2*x + 2) sage: H = L.galois_group(algorithm='gap') sage: H.transitive_number() # optional - gap_packages 9