Finite residue fields

We can take the residue field of maximal ideals in the ring of integers of number fields. We can also take the residue field of irreducible polynomials over \(\GF{p}\).

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)
sage: P = K.ideal(29).factor()[0][0]
sage: k = K.residue_field(P); k
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
sage: k.order()
841
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]
>>> k = K.residue_field(P); k
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
>>> k.order()
841

We reduce mod a prime for which the ring of integers is not monogenic (i.e., 2 is an essential discriminant divisor):

sage: # needs sage.rings.number_field
sage: K.<a> = NumberField(x^3 + x^2 - 2*x + 8)
sage: F = K.factor(2); F
(Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (-a^2 + 2*a - 3))
* (Fractional ideal (3/2*a^2 - 5/2*a + 4))
sage: F[0][0].residue_field()
Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1)
sage: F[1][0].residue_field()
Residue field of Fractional ideal (-a^2 + 2*a - 3)
sage: F[2][0].residue_field()
Residue field of Fractional ideal (3/2*a^2 - 5/2*a + 4)
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = NumberField(x**Integer(3) + x**Integer(2) - Integer(2)*x + Integer(8), names=('a',)); (a,) = K._first_ngens(1)
>>> F = K.factor(Integer(2)); F
(Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (-a^2 + 2*a - 3))
* (Fractional ideal (3/2*a^2 - 5/2*a + 4))
>>> F[Integer(0)][Integer(0)].residue_field()
Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1)
>>> F[Integer(1)][Integer(0)].residue_field()
Residue field of Fractional ideal (-a^2 + 2*a - 3)
>>> F[Integer(2)][Integer(0)].residue_field()
Residue field of Fractional ideal (3/2*a^2 - 5/2*a + 4)

We can also form residue fields from \(\ZZ\):

sage: ZZ.residue_field(17)
Residue field of Integers modulo 17
>>> from sage.all import *
>>> ZZ.residue_field(Integer(17))
Residue field of Integers modulo 17

And for polynomial rings over finite fields:

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(5)[]
sage: I = R.ideal(t^2 + 2)
sage: k = ResidueField(I); k
Residue field in tbar of Principal ideal (t^2 + 2) of
 Univariate Polynomial Ring in t over Finite Field of size 5
>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(5))['t']; (t,) = R._first_ngens(1)
>>> I = R.ideal(t**Integer(2) + Integer(2))
>>> k = ResidueField(I); k
Residue field in tbar of Principal ideal (t^2 + 2) of
 Univariate Polynomial Ring in t over Finite Field of size 5

AUTHORS:

  • David Roe (2007-10-3): initial version

  • William Stein (2007-12): bug fixes

  • John Cremona (2008-9): extend reduction maps to the whole valuation ring add support for residue fields of ZZ

  • David Roe (2009-12): added support for \(GF(p)(t)\) and moved to new coercion framework.

class sage.rings.finite_rings.residue_field.LiftingMap[source]

Bases: Section

Lifting map from residue class field to number field.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 + 2)
sage: F = K.factor(5)[0][0].residue_field()
sage: F.degree()
2
sage: L = F.lift_map(); L
Lifting map:
  From: Residue field in abar of Fractional ideal (a^2 + 2*a - 1)
  To:   Maximal Order generated by a in Number Field in a with defining polynomial x^3 + 2
sage: L(F.0^2)
3*a + 1
sage: L(3*a + 1) == F.0^2
True

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(13)[]
sage: P = R.ideal(8*t^12 + 9*t^11 + 11*t^10 + 2*t^9 + 11*t^8
....:             + 3*t^7 + 12*t^6 + t^4 + 7*t^3 + 5*t^2 + 12*t + 1)
sage: k.<a> = P.residue_field()
sage: k.lift_map()
Lifting map:
  From: Residue field in a of Principal ideal (t^12 + 6*t^11 + 3*t^10
        + 10*t^9 + 3*t^8 + 2*t^7 + 8*t^6 + 5*t^4 + 9*t^3 + 12*t^2 + 8*t + 5) of
        Univariate Polynomial Ring in t over Finite Field of size 13
  To:   Univariate Polynomial Ring in t over Finite Field of size 13
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) + Integer(2), names=('a',)); (a,) = K._first_ngens(1)
>>> F = K.factor(Integer(5))[Integer(0)][Integer(0)].residue_field()
>>> F.degree()
2
>>> L = F.lift_map(); L
Lifting map:
  From: Residue field in abar of Fractional ideal (a^2 + 2*a - 1)
  To:   Maximal Order generated by a in Number Field in a with defining polynomial x^3 + 2
>>> L(F.gen(0)**Integer(2))
3*a + 1
>>> L(Integer(3)*a + Integer(1)) == F.gen(0)**Integer(2)
True

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(13))['t']; (t,) = R._first_ngens(1)
>>> P = R.ideal(Integer(8)*t**Integer(12) + Integer(9)*t**Integer(11) + Integer(11)*t**Integer(10) + Integer(2)*t**Integer(9) + Integer(11)*t**Integer(8)
...             + Integer(3)*t**Integer(7) + Integer(12)*t**Integer(6) + t**Integer(4) + Integer(7)*t**Integer(3) + Integer(5)*t**Integer(2) + Integer(12)*t + Integer(1))
>>> k = P.residue_field(names=('a',)); (a,) = k._first_ngens(1)
>>> k.lift_map()
Lifting map:
  From: Residue field in a of Principal ideal (t^12 + 6*t^11 + 3*t^10
        + 10*t^9 + 3*t^8 + 2*t^7 + 8*t^6 + 5*t^4 + 9*t^3 + 12*t^2 + 8*t + 5) of
        Univariate Polynomial Ring in t over Finite Field of size 13
  To:   Univariate Polynomial Ring in t over Finite Field of size 13
class sage.rings.finite_rings.residue_field.ReductionMap[source]

Bases: Map

A reduction map from a (subset) of a number field or function field to this residue class field.

It will be defined on those elements of the field with nonnegative valuation at the specified prime.

EXAMPLES:

sage: # needs sage.rings.number_field sage.symbolic
sage: I = QQ[sqrt(17)].factor(5)[0][0]; I
Fractional ideal (5)
sage: k = I.residue_field(); k
Residue field in sqrt17bar of Fractional ideal (5)
sage: R = k.reduction_map(); R
Partially defined reduction map:
  From: Number Field in sqrt17 with defining polynomial x^2 - 17
        with sqrt17 = 4.123105625617660?
  To:   Residue field in sqrt17bar of Fractional ideal (5)

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(next_prime(2^20))[]; P = R.ideal(t^2 + t + 1)
sage: k = P.residue_field()
sage: k.reduction_map()
Partially defined reduction map:
  From: Fraction Field of
        Univariate Polynomial Ring in t over Finite Field of size 1048583
  To:   Residue field in tbar of Principal ideal (t^2 + t + 1) of
        Univariate Polynomial Ring in t over Finite Field of size 1048583
>>> from sage.all import *
>>> # needs sage.rings.number_field sage.symbolic
>>> I = QQ[sqrt(Integer(17))].factor(Integer(5))[Integer(0)][Integer(0)]; I
Fractional ideal (5)
>>> k = I.residue_field(); k
Residue field in sqrt17bar of Fractional ideal (5)
>>> R = k.reduction_map(); R
Partially defined reduction map:
  From: Number Field in sqrt17 with defining polynomial x^2 - 17
        with sqrt17 = 4.123105625617660?
  To:   Residue field in sqrt17bar of Fractional ideal (5)

>>> # needs sage.rings.finite_rings
>>> R = GF(next_prime(Integer(2)**Integer(20)))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(2) + t + Integer(1))
>>> k = P.residue_field()
>>> k.reduction_map()
Partially defined reduction map:
  From: Fraction Field of
        Univariate Polynomial Ring in t over Finite Field of size 1048583
  To:   Residue field in tbar of Principal ideal (t^2 + t + 1) of
        Univariate Polynomial Ring in t over Finite Field of size 1048583
section()[source]

Compute a section of the map, namely a map that lifts elements of the residue field to elements of the field.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^5 - 5*x + 2)
sage: P = K.ideal(47).factor()[0][0]
sage: k = K.residue_field(P)
sage: f = k.convert_map_from(K)
sage: s = f.section(); s
Lifting map:
  From: Residue field in abar of
        Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15)
  To:   Number Field in a with defining polynomial x^5 - 5*x + 2
sage: s(k.gen())
a
sage: L.<b> = NumberField(x^5 + 17*x + 1)
sage: P = L.factor(53)[0][0]
sage: l = L.residue_field(P)
sage: g = l.convert_map_from(L)
sage: s = g.section(); s
Lifting map:
  From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8)
  To:   Number Field in b with defining polynomial x^5 + 17*x + 1
sage: s(l.gen()).parent()
Number Field in b with defining polynomial x^5 + 17*x + 1

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(2)[]; h = t^5 + t^2 + 1
sage: k.<a> = R.residue_field(h)
sage: K = R.fraction_field()
sage: f = k.convert_map_from(K)
sage: f.section()                                                           # needs sage.libs.ntl
Lifting map:
  From: Residue field in a of Principal ideal (t^5 + t^2 + 1) of
        Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X)
  To:   Fraction Field of
        Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X)
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(5) - Integer(5)*x + Integer(2), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(47)).factor()[Integer(0)][Integer(0)]
>>> k = K.residue_field(P)
>>> f = k.convert_map_from(K)
>>> s = f.section(); s
Lifting map:
  From: Residue field in abar of
        Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15)
  To:   Number Field in a with defining polynomial x^5 - 5*x + 2
>>> s(k.gen())
a
>>> L = NumberField(x**Integer(5) + Integer(17)*x + Integer(1), names=('b',)); (b,) = L._first_ngens(1)
>>> P = L.factor(Integer(53))[Integer(0)][Integer(0)]
>>> l = L.residue_field(P)
>>> g = l.convert_map_from(L)
>>> s = g.section(); s
Lifting map:
  From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8)
  To:   Number Field in b with defining polynomial x^5 + 17*x + 1
>>> s(l.gen()).parent()
Number Field in b with defining polynomial x^5 + 17*x + 1

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(2))['t']; (t,) = R._first_ngens(1); h = t**Integer(5) + t**Integer(2) + Integer(1)
>>> k = R.residue_field(h, names=('a',)); (a,) = k._first_ngens(1)
>>> K = R.fraction_field()
>>> f = k.convert_map_from(K)
>>> f.section()                                                           # needs sage.libs.ntl
Lifting map:
  From: Residue field in a of Principal ideal (t^5 + t^2 + 1) of
        Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X)
  To:   Fraction Field of
        Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X)
class sage.rings.finite_rings.residue_field.ResidueFieldFactory[source]

Bases: UniqueFactory

A factory that returns the residue class field of a prime ideal \(p\) of the ring of integers of a number field, or of a polynomial ring over a finite field.

INPUT:

  • p – a prime ideal of an order in a number field

  • names – the variable name for the finite field created; defaults to the name of the number field variable but with bar placed after it

  • check – whether or not to check if \(p\) is prime

OUTPUT: the residue field at the prime \(p\)

EXAMPLES:

sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)                                              # needs sage.rings.number_field
sage: P = K.ideal(29).factor()[0][0]                                            # needs sage.rings.number_field
sage: ResidueField(P)                                                           # needs sage.rings.number_field
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
>>> from sage.all import *
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)# needs sage.rings.number_field
>>> P = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]                                            # needs sage.rings.number_field
>>> ResidueField(P)                                                           # needs sage.rings.number_field
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)

The result is cached:

sage: ResidueField(P) is ResidueField(P)                                        # needs sage.rings.number_field
True
sage: k = K.residue_field(P); k                                                 # needs sage.rings.number_field
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
sage: k.order()                                                                 # needs sage.rings.number_field
841
>>> from sage.all import *
>>> ResidueField(P) is ResidueField(P)                                        # needs sage.rings.number_field
True
>>> k = K.residue_field(P); k                                                 # needs sage.rings.number_field
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
>>> k.order()                                                                 # needs sage.rings.number_field
841

It also works for polynomial rings:

sage: R.<t> = GF(31)[]
sage: P = R.ideal(t^5 + 2*t + 11)
sage: ResidueField(P)                                                           # needs sage.rings.finite_rings
Residue field in tbar of Principal ideal (t^5 + 2*t + 11) of
 Univariate Polynomial Ring in t over Finite Field of size 31

sage: ResidueField(P) is ResidueField(P)                                        # needs sage.rings.finite_rings
True
sage: k = ResidueField(P); k.order()                                            # needs sage.rings.finite_rings
28629151
>>> from sage.all import *
>>> R = GF(Integer(31))['t']; (t,) = R._first_ngens(1)
>>> P = R.ideal(t**Integer(5) + Integer(2)*t + Integer(11))
>>> ResidueField(P)                                                           # needs sage.rings.finite_rings
Residue field in tbar of Principal ideal (t^5 + 2*t + 11) of
 Univariate Polynomial Ring in t over Finite Field of size 31

>>> ResidueField(P) is ResidueField(P)                                        # needs sage.rings.finite_rings
True
>>> k = ResidueField(P); k.order()                                            # needs sage.rings.finite_rings
28629151

An example where the generator of the number field doesn’t generate the residue class field:

sage: # needs sage.rings.number_field
sage: K.<a> = NumberField(x^3 - 875)
sage: P = K.ideal(5).factor()[0][0]; k = K.residue_field(P); k
Residue field in abar of Fractional ideal (5, 1/25*a^2 - 2/5*a - 1)
sage: k.polynomial()
abar^2 + 3*abar + 4
sage: k.0^3 - 875
2
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = NumberField(x**Integer(3) - Integer(875), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(5)).factor()[Integer(0)][Integer(0)]; k = K.residue_field(P); k
Residue field in abar of Fractional ideal (5, 1/25*a^2 - 2/5*a - 1)
>>> k.polynomial()
abar^2 + 3*abar + 4
>>> k.gen(0)**Integer(3) - Integer(875)
2

An example where the residue class field is large but of degree 1:

sage: # needs sage.rings.number_field
sage: K.<a> = NumberField(x^3 - 875)
sage: P = K.ideal(2007).factor()[2][0]; k = K.residue_field(P); k
Residue field of Fractional ideal (223, 1/5*a + 11)
sage: k(a)
168
sage: k(a)^3 - 875
0
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = NumberField(x**Integer(3) - Integer(875), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(2007)).factor()[Integer(2)][Integer(0)]; k = K.residue_field(P); k
Residue field of Fractional ideal (223, 1/5*a + 11)
>>> k(a)
168
>>> k(a)**Integer(3) - Integer(875)
0

And for polynomial rings:

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(next_prime(2^18))[]
sage: P = R.ideal(t - 5)
sage: k = ResidueField(P); k
Residue field of Principal ideal (t + 262142) of
 Univariate Polynomial Ring in t over Finite Field of size 262147
sage: k(t)
5
>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> R = GF(next_prime(Integer(2)**Integer(18)))['t']; (t,) = R._first_ngens(1)
>>> P = R.ideal(t - Integer(5))
>>> k = ResidueField(P); k
Residue field of Principal ideal (t + 262142) of
 Univariate Polynomial Ring in t over Finite Field of size 262147
>>> k(t)
5

In this example, 2 is an inessential discriminant divisor, so divides the index of ZZ[a] in the maximal order for all a:

sage: # needs sage.rings.number_field
sage: K.<a> = NumberField(x^3 + x^2 - 2*x + 8)
sage: P = K.ideal(2).factor()[0][0]; P
Fractional ideal (-1/2*a^2 + 1/2*a - 1)
sage: F = K.residue_field(P); F
Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1)
sage: F(a)
0
sage: B = K.maximal_order().basis(); B
[1, 1/2*a^2 + 1/2*a, a^2]
sage: F(B[1])
1
sage: F(B[2])
0
sage: F
Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1)
sage: F.degree()
1
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = NumberField(x**Integer(3) + x**Integer(2) - Integer(2)*x + Integer(8), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(2)).factor()[Integer(0)][Integer(0)]; P
Fractional ideal (-1/2*a^2 + 1/2*a - 1)
>>> F = K.residue_field(P); F
Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1)
>>> F(a)
0
>>> B = K.maximal_order().basis(); B
[1, 1/2*a^2 + 1/2*a, a^2]
>>> F(B[Integer(1)])
1
>>> F(B[Integer(2)])
0
>>> F
Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1)
>>> F.degree()
1
create_key_and_extra_args(p, names=None, check=True, impl=None, **kwds)[source]

Return a tuple containing the key (uniquely defining data) and any extra arguments.

EXAMPLES:

sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)                                          # needs sage.rings.number_field
sage: ResidueField(K.ideal(29).factor()[0][0])  # indirect doctest          # needs sage.rings.number_field
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
>>> from sage.all import *
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)# needs sage.rings.number_field
>>> ResidueField(K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)])  # indirect doctest          # needs sage.rings.number_field
Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
create_object(version, key, **kwds)[source]

Create the object from the key and extra arguments. This is only called if the object was not found in the cache.

EXAMPLES:

sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)                                          # needs sage.rings.number_field
sage: P = K.ideal(29).factor()[0][0]                                        # needs sage.rings.number_field
sage: ResidueField(P) is ResidueField(P)  # indirect doctest                # needs sage.rings.number_field
True
>>> from sage.all import *
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)# needs sage.rings.number_field
>>> P = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]                                        # needs sage.rings.number_field
>>> ResidueField(P) is ResidueField(P)  # indirect doctest                # needs sage.rings.number_field
True
class sage.rings.finite_rings.residue_field.ResidueFieldHomomorphism_global[source]

Bases: RingHomomorphism

The class representing a homomorphism from the order of a number field or function field to the residue field at a given prime.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)
sage: P  = K.ideal(29).factor()[0][0]
sage: k  = K.residue_field(P)
sage: OK = K.maximal_order()
sage: abar = k(OK.1); abar
abar
sage: (1+abar)^179
24*abar + 12

sage: # needs sage.rings.number_field
sage: phi = k.coerce_map_from(OK); phi
Ring morphism:
  From: Maximal Order generated by a in Number Field in a with defining polynomial x^3 - 7
  To:   Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
sage: phi in Hom(OK,k)
True
sage: phi(OK.1)
abar

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(19)[]; P = R.ideal(t^2 + 5)
sage: k.<a> = R.residue_field(P)
sage: f = k.coerce_map_from(R); f
Ring morphism:
  From: Univariate Polynomial Ring in t over Finite Field of size 19
  To:   Residue field in a of Principal ideal (t^2 + 5) of
        Univariate Polynomial Ring in t over Finite Field of size 19
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)
>>> P  = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]
>>> k  = K.residue_field(P)
>>> OK = K.maximal_order()
>>> abar = k(OK.gen(1)); abar
abar
>>> (Integer(1)+abar)**Integer(179)
24*abar + 12

>>> # needs sage.rings.number_field
>>> phi = k.coerce_map_from(OK); phi
Ring morphism:
  From: Maximal Order generated by a in Number Field in a with defining polynomial x^3 - 7
  To:   Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10)
>>> phi in Hom(OK,k)
True
>>> phi(OK.gen(1))
abar

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(19))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(2) + Integer(5))
>>> k = R.residue_field(P, names=('a',)); (a,) = k._first_ngens(1)
>>> f = k.coerce_map_from(R); f
Ring morphism:
  From: Univariate Polynomial Ring in t over Finite Field of size 19
  To:   Residue field in a of Principal ideal (t^2 + 5) of
        Univariate Polynomial Ring in t over Finite Field of size 19
lift(x)[source]

Return a lift of x to the Order, returning a “polynomial” in the generator with coefficients between 0 and \(p-1\).

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)
sage: P = K.ideal(29).factor()[0][0]
sage: k = K.residue_field(P)
sage: OK = K.maximal_order()
sage: f = k.coerce_map_from(OK)
sage: c = OK(a)
sage: b = k(a)
sage: f.lift(13*b + 5)
13*a + 5
sage: f.lift(12821*b + 918)
3*a + 19

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(17)[]; P = R.ideal(t^3 + t^2 + 7)
sage: k.<a> = P.residue_field(); f = k.coerce_map_from(R)
sage: f.lift(a^2 + 5*a + 1)
t^2 + 5*t + 1
sage: f(f.lift(a^2 + 5*a + 1)) == a^2 + 5*a + 1                             # needs sage.modules
True
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]
>>> k = K.residue_field(P)
>>> OK = K.maximal_order()
>>> f = k.coerce_map_from(OK)
>>> c = OK(a)
>>> b = k(a)
>>> f.lift(Integer(13)*b + Integer(5))
13*a + 5
>>> f.lift(Integer(12821)*b + Integer(918))
3*a + 19

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(17))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(3) + t**Integer(2) + Integer(7))
>>> k = P.residue_field(names=('a',)); (a,) = k._first_ngens(1); f = k.coerce_map_from(R)
>>> f.lift(a**Integer(2) + Integer(5)*a + Integer(1))
t^2 + 5*t + 1
>>> f(f.lift(a**Integer(2) + Integer(5)*a + Integer(1))) == a**Integer(2) + Integer(5)*a + Integer(1)                             # needs sage.modules
True
section()[source]

Compute a section of the map, namely a map that lifts elements of the residue field to elements of the ring of integers.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^5 - 5*x + 2)
sage: P = K.ideal(47).factor()[0][0]
sage: k = K.residue_field(P)
sage: f = k.coerce_map_from(K.ring_of_integers())
sage: s = f.section(); s
Lifting map:
  From: Residue field in abar of
        Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15)
  To:   Maximal Order generated by a in Number Field in a with defining polynomial x^5 - 5*x + 2
sage: s(k.gen())
a
sage: L.<b> = NumberField(x^5 + 17*x + 1)
sage: P = L.factor(53)[0][0]
sage: l = L.residue_field(P)
sage: g = l.coerce_map_from(L.ring_of_integers())
sage: s = g.section(); s
Lifting map:
  From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8)
  To:   Maximal Order generated by b in Number Field in b
        with defining polynomial x^5 + 17*x + 1
sage: s(l.gen()).parent()
Maximal Order generated by b in Number Field in b with defining polynomial x^5 + 17*x + 1

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(17)[]; P = R.ideal(t^3 + t^2 + 7)
sage: k.<a> = P.residue_field()
sage: f = k.coerce_map_from(R)
sage: f.section()
(map internal to coercion system -- copy before use)
Lifting map:
  From: Residue field in a of Principal ideal (t^3 + t^2 + 7) of
        Univariate Polynomial Ring in t over Finite Field of size 17
  To:   Univariate Polynomial Ring in t over Finite Field of size 17
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(5) - Integer(5)*x + Integer(2), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(47)).factor()[Integer(0)][Integer(0)]
>>> k = K.residue_field(P)
>>> f = k.coerce_map_from(K.ring_of_integers())
>>> s = f.section(); s
Lifting map:
  From: Residue field in abar of
        Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15)
  To:   Maximal Order generated by a in Number Field in a with defining polynomial x^5 - 5*x + 2
>>> s(k.gen())
a
>>> L = NumberField(x**Integer(5) + Integer(17)*x + Integer(1), names=('b',)); (b,) = L._first_ngens(1)
>>> P = L.factor(Integer(53))[Integer(0)][Integer(0)]
>>> l = L.residue_field(P)
>>> g = l.coerce_map_from(L.ring_of_integers())
>>> s = g.section(); s
Lifting map:
  From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8)
  To:   Maximal Order generated by b in Number Field in b
        with defining polynomial x^5 + 17*x + 1
>>> s(l.gen()).parent()
Maximal Order generated by b in Number Field in b with defining polynomial x^5 + 17*x + 1

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(17))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(3) + t**Integer(2) + Integer(7))
>>> k = P.residue_field(names=('a',)); (a,) = k._first_ngens(1)
>>> f = k.coerce_map_from(R)
>>> f.section()
(map internal to coercion system -- copy before use)
Lifting map:
  From: Residue field in a of Principal ideal (t^3 + t^2 + 7) of
        Univariate Polynomial Ring in t over Finite Field of size 17
  To:   Univariate Polynomial Ring in t over Finite Field of size 17
class sage.rings.finite_rings.residue_field.ResidueField_generic(p)[source]

Bases: Field

The class representing a generic residue field.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: I = QQ[i].factor(2)[0][0]; I
Fractional ideal (I + 1)
sage: k = I.residue_field(); k
Residue field of Fractional ideal (I + 1)
sage: type(k)
<class 'sage.rings.finite_rings.residue_field.ResidueFiniteField_prime_modn_with_category'>

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(29)[]; P = R.ideal(t^2 + 2); k.<a> = ResidueField(P); k
Residue field in a of Principal ideal (t^2 + 2) of
 Univariate Polynomial Ring in t over Finite Field of size 29
sage: type(k)                                                                   # needs sage.libs.linbox
<class 'sage.rings.finite_rings.residue_field_givaro.ResidueFiniteField_givaro_with_category'>
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> I = QQ[i].factor(Integer(2))[Integer(0)][Integer(0)]; I
Fractional ideal (I + 1)
>>> k = I.residue_field(); k
Residue field of Fractional ideal (I + 1)
>>> type(k)
<class 'sage.rings.finite_rings.residue_field.ResidueFiniteField_prime_modn_with_category'>

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(29))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(2) + Integer(2)); k = ResidueField(P, names=('a',)); (a,) = k._first_ngens(1); k
Residue field in a of Principal ideal (t^2 + 2) of
 Univariate Polynomial Ring in t over Finite Field of size 29
>>> type(k)                                                                   # needs sage.libs.linbox
<class 'sage.rings.finite_rings.residue_field_givaro.ResidueFiniteField_givaro_with_category'>
construction()[source]

Construction of this residue field.

OUTPUT:

An AlgebraicExtensionFunctor and the number field that this residue field has been obtained from.

The residue field is determined by a prime (fractional) ideal in a number field. If this ideal can be coerced into a different number field, then the construction functor applied to this number field will return the corresponding residue field. See Issue #15223.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: K.<z> = CyclotomicField(7)
sage: P = K.factor(17)[0][0]
sage: k = K.residue_field(P); k
Residue field in zbar of Fractional ideal (17)
sage: F, R = k.construction()
sage: F
AlgebraicExtensionFunctor
sage: R
Cyclotomic Field of order 7 and degree 6
sage: F(R) is k
True
sage: F(ZZ)
Residue field of Integers modulo 17
sage: F(CyclotomicField(49))
Residue field in zbar of Fractional ideal (17)
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = CyclotomicField(Integer(7), names=('z',)); (z,) = K._first_ngens(1)
>>> P = K.factor(Integer(17))[Integer(0)][Integer(0)]
>>> k = K.residue_field(P); k
Residue field in zbar of Fractional ideal (17)
>>> F, R = k.construction()
>>> F
AlgebraicExtensionFunctor
>>> R
Cyclotomic Field of order 7 and degree 6
>>> F(R) is k
True
>>> F(ZZ)
Residue field of Integers modulo 17
>>> F(CyclotomicField(Integer(49)))
Residue field in zbar of Fractional ideal (17)
ideal()[source]

Return the maximal ideal that this residue field is the quotient by.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 + x + 1)
sage: P = K.ideal(29).factor()[0][0]
sage: k = K.residue_field(P)  # indirect doctest
sage: k.ideal() is P
True
sage: p = next_prime(2^40); p
1099511627791
sage: k = K.residue_field(K.prime_above(p))
sage: k.ideal().norm() == p
True

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(17)[]; P = R.ideal(t^3 + t^2 + 7)
sage: k.<a> = R.residue_field(P)
sage: k.ideal()
Principal ideal (t^3 + t^2 + 7) of
 Univariate Polynomial Ring in t over Finite Field of size 17
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) + x + Integer(1), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]
>>> k = K.residue_field(P)  # indirect doctest
>>> k.ideal() is P
True
>>> p = next_prime(Integer(2)**Integer(40)); p
1099511627791
>>> k = K.residue_field(K.prime_above(p))
>>> k.ideal().norm() == p
True

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(17))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(3) + t**Integer(2) + Integer(7))
>>> k = R.residue_field(P, names=('a',)); (a,) = k._first_ngens(1)
>>> k.ideal()
Principal ideal (t^3 + t^2 + 7) of
 Univariate Polynomial Ring in t over Finite Field of size 17
lift(x)[source]

Return a lift of x to the Order, returning a “polynomial” in the generator with coefficients between 0 and \(p-1\).

EXAMPLES:

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 - 7)
sage: P = K.ideal(29).factor()[0][0]
sage: k = K.residue_field(P)
sage: OK = K.maximal_order()
sage: c = OK(a)
sage: b = k(a)
sage: k.lift(13*b + 5)
13*a + 5
sage: k.lift(12821*b + 918)
3*a + 19

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(17)[]; P = R.ideal(t^3 + t^2 + 7)
sage: k.<a> = P.residue_field()
sage: k.lift(a^2 + 5)
t^2 + 5
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(29)).factor()[Integer(0)][Integer(0)]
>>> k = K.residue_field(P)
>>> OK = K.maximal_order()
>>> c = OK(a)
>>> b = k(a)
>>> k.lift(Integer(13)*b + Integer(5))
13*a + 5
>>> k.lift(Integer(12821)*b + Integer(918))
3*a + 19

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(17))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(3) + t**Integer(2) + Integer(7))
>>> k = P.residue_field(names=('a',)); (a,) = k._first_ngens(1)
>>> k.lift(a**Integer(2) + Integer(5))
t^2 + 5
lift_map()[source]

Return the standard map from this residue field up to the ring of integers lifting the canonical projection.

EXAMPLES:

sage: # needs sage.rings.number_field sage.symbolic
sage: I = QQ[3^(1/3)].factor(5)[1][0]; I
Fractional ideal (a - 2)
sage: k = I.residue_field(); k
Residue field of Fractional ideal (a - 2)
sage: f = k.lift_map(); f
Lifting map:
  From: Residue field of Fractional ideal (a - 2)
  To:   Maximal Order generated by a in Number Field in a
        with defining polynomial x^3 - 3 with a = 1.442249570307409?
sage: f.domain()
Residue field of Fractional ideal (a - 2)
sage: f.codomain()
Maximal Order generated by a in Number Field in a
 with defining polynomial x^3 - 3 with a = 1.442249570307409?
sage: f(k.0)
1

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(17)[]; P = R.ideal(t^3 + t^2 + 7)
sage: k.<a> = P.residue_field()
sage: f = k.lift_map(); f
(map internal to coercion system -- copy before use)
Lifting map:
  From: Residue field in a of Principal ideal (t^3 + t^2 + 7) of
        Univariate Polynomial Ring in t over Finite Field of size 17
  To:   Univariate Polynomial Ring in t over Finite Field of size 17
sage: f(a^2 + 5)
t^2 + 5
>>> from sage.all import *
>>> # needs sage.rings.number_field sage.symbolic
>>> I = QQ[Integer(3)**(Integer(1)/Integer(3))].factor(Integer(5))[Integer(1)][Integer(0)]; I
Fractional ideal (a - 2)
>>> k = I.residue_field(); k
Residue field of Fractional ideal (a - 2)
>>> f = k.lift_map(); f
Lifting map:
  From: Residue field of Fractional ideal (a - 2)
  To:   Maximal Order generated by a in Number Field in a
        with defining polynomial x^3 - 3 with a = 1.442249570307409?
>>> f.domain()
Residue field of Fractional ideal (a - 2)
>>> f.codomain()
Maximal Order generated by a in Number Field in a
 with defining polynomial x^3 - 3 with a = 1.442249570307409?
>>> f(k.gen(0))
1

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(17))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(3) + t**Integer(2) + Integer(7))
>>> k = P.residue_field(names=('a',)); (a,) = k._first_ngens(1)
>>> f = k.lift_map(); f
(map internal to coercion system -- copy before use)
Lifting map:
  From: Residue field in a of Principal ideal (t^3 + t^2 + 7) of
        Univariate Polynomial Ring in t over Finite Field of size 17
  To:   Univariate Polynomial Ring in t over Finite Field of size 17
>>> f(a**Integer(2) + Integer(5))
t^2 + 5
reduction_map()[source]

Return the partially defined reduction map from the number field to this residue class field.

EXAMPLES:

sage: # needs sage.rings.number_field sage.symbolic
sage: I = QQ[2^(1/3)].factor(2)[0][0]; I
Fractional ideal (a)
sage: k = I.residue_field(); k
Residue field of Fractional ideal (a)
sage: pi = k.reduction_map(); pi
Partially defined reduction map:
  From: Number Field in a with defining polynomial x^3 - 2
        with a = 1.259921049894873?
  To:   Residue field of Fractional ideal (a)
sage: pi.domain()
Number Field in a with defining polynomial x^3 - 2 with a = 1.259921049894873?
sage: pi.codomain()
Residue field of Fractional ideal (a)

sage: # needs sage.rings.number_field
sage: x = polygen(ZZ, 'x')
sage: K.<a> = NumberField(x^3 + x^2 - 2*x + 32)
sage: F = K.factor(2)[0][0].residue_field()
sage: F.reduction_map().domain()
Number Field in a with defining polynomial x^3 + x^2 - 2*x + 32
sage: K.<a> = NumberField(x^3 + 128)
sage: F = K.factor(2)[0][0].residue_field()
sage: F.reduction_map().codomain()
Residue field of Fractional ideal (1/4*a)

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(17)[]; P = R.ideal(t^3 + t^2 + 7)
sage: k.<a> = P.residue_field(); f = k.reduction_map(); f
Partially defined reduction map:
  From: Fraction Field of Univariate Polynomial Ring in t
        over Finite Field of size 17
  To:   Residue field in a of Principal ideal (t^3 + t^2 + 7) of
        Univariate Polynomial Ring in t over Finite Field of size 17
sage: f(1/t)
12*a^2 + 12*a
>>> from sage.all import *
>>> # needs sage.rings.number_field sage.symbolic
>>> I = QQ[Integer(2)**(Integer(1)/Integer(3))].factor(Integer(2))[Integer(0)][Integer(0)]; I
Fractional ideal (a)
>>> k = I.residue_field(); k
Residue field of Fractional ideal (a)
>>> pi = k.reduction_map(); pi
Partially defined reduction map:
  From: Number Field in a with defining polynomial x^3 - 2
        with a = 1.259921049894873?
  To:   Residue field of Fractional ideal (a)
>>> pi.domain()
Number Field in a with defining polynomial x^3 - 2 with a = 1.259921049894873?
>>> pi.codomain()
Residue field of Fractional ideal (a)

>>> # needs sage.rings.number_field
>>> x = polygen(ZZ, 'x')
>>> K = NumberField(x**Integer(3) + x**Integer(2) - Integer(2)*x + Integer(32), names=('a',)); (a,) = K._first_ngens(1)
>>> F = K.factor(Integer(2))[Integer(0)][Integer(0)].residue_field()
>>> F.reduction_map().domain()
Number Field in a with defining polynomial x^3 + x^2 - 2*x + 32
>>> K = NumberField(x**Integer(3) + Integer(128), names=('a',)); (a,) = K._first_ngens(1)
>>> F = K.factor(Integer(2))[Integer(0)][Integer(0)].residue_field()
>>> F.reduction_map().codomain()
Residue field of Fractional ideal (1/4*a)

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(17))['t']; (t,) = R._first_ngens(1); P = R.ideal(t**Integer(3) + t**Integer(2) + Integer(7))
>>> k = P.residue_field(names=('a',)); (a,) = k._first_ngens(1); f = k.reduction_map(); f
Partially defined reduction map:
  From: Fraction Field of Univariate Polynomial Ring in t
        over Finite Field of size 17
  To:   Residue field in a of Principal ideal (t^3 + t^2 + 7) of
        Univariate Polynomial Ring in t over Finite Field of size 17
>>> f(Integer(1)/t)
12*a^2 + 12*a
class sage.rings.finite_rings.residue_field.ResidueFiniteField_prime_modn(p, name, intp, to_vs, to_order, PB)[source]

Bases: ResidueField_generic, FiniteField_prime_modn

The class representing residue fields of number fields that have prime order.

EXAMPLES:

sage: # needs sage.rings.number_field
sage: R.<x> = QQ[]
sage: K.<a> = NumberField(x^3 - 7)
sage: P = K.ideal(29).factor()[1][0]
sage: k = ResidueField(P); k
Residue field of Fractional ideal (-a^2 - 2*a - 2)
sage: k.order()
29
sage: OK = K.maximal_order()
sage: c = OK(a)
sage: b = k(a)
sage: k.coerce_map_from(OK)(c)
16
sage: k(4)
4
sage: k(c + 5)
21
sage: b + c
3

sage: # needs sage.rings.finite_rings
sage: R.<t> = GF(7)[]; P = R.ideal(2*t + 3)
sage: k = P.residue_field(); k
Residue field of Principal ideal (t + 5) of
 Univariate Polynomial Ring in t over Finite Field of size 7
sage: k(t^2)
4
sage: k.order()
7
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = QQ['x']; (x,) = R._first_ngens(1)
>>> K = NumberField(x**Integer(3) - Integer(7), names=('a',)); (a,) = K._first_ngens(1)
>>> P = K.ideal(Integer(29)).factor()[Integer(1)][Integer(0)]
>>> k = ResidueField(P); k
Residue field of Fractional ideal (-a^2 - 2*a - 2)
>>> k.order()
29
>>> OK = K.maximal_order()
>>> c = OK(a)
>>> b = k(a)
>>> k.coerce_map_from(OK)(c)
16
>>> k(Integer(4))
4
>>> k(c + Integer(5))
21
>>> b + c
3

>>> # needs sage.rings.finite_rings
>>> R = GF(Integer(7))['t']; (t,) = R._first_ngens(1); P = R.ideal(Integer(2)*t + Integer(3))
>>> k = P.residue_field(); k
Residue field of Principal ideal (t + 5) of
 Univariate Polynomial Ring in t over Finite Field of size 7
>>> k(t**Integer(2))
4
>>> k.order()
7