### Navigation

- index
- modules |
- next |
- previous |
- Polynomial Rings »
- Univariate Polynomials and Polynomial Rings »

# Quotients of Univariate Polynomial Rings

EXAMPLES:

    sage: R.<x> = QQ[]
    sage: S = R.quotient(x**3-3*x+1, 'alpha')
    sage: S.gen()**2 in S
    True
    sage: x in S
    True
    sage: S.gen() in R
    False
    sage: 1 in S
    True

`sage.rings.polynomial.polynomial_quotient_ring.``PolynomialQuotientRing`(ring, polynomial, names=None)

  Create a quotient of a polynomial ring.

  INPUT:

  - `ring` - a univariate polynomial ring in one variable.
  - `polynomial` - element with unit leading coefficient
  - `names` - (optional) name for the variable

  OUTPUT: Creates the quotient ring R/I, where R is the ring and I is the principal ideal generated by the polynomial.

  EXAMPLES:

  We create the quotient ring \(\ZZ[x]/(x^3+7)\), and demonstrate many basic functions with it:

      sage: Z = IntegerRing()
      sage: R = PolynomialRing(Z,'x'); x = R.gen()
      sage: S = R.quotient(x^3 + 7, 'a'); a = S.gen()
      sage: S
      Univariate Quotient Polynomial Ring in a over Integer Ring with modulus x^3 + 7
      sage: a^3
      -7
      sage: S.is_field()
      False
      sage: a in S
      True
      sage: x in S
      True
      sage: a in R
      False
      sage: S.polynomial_ring()
      Univariate Polynomial Ring in x over Integer Ring
      sage: S.modulus()
      x^3 + 7
      sage: S.degree()
      3

  We create the “iterated” polynomial ring quotient

  \[R = (\GF{2}[y]/(y^{2}+y+1))[x]/(x^3 - 5).\]

      sage: A.<y> = PolynomialRing(GF(2)); A
      Univariate Polynomial Ring in y over Finite Field of size 2 (using NTL)
      sage: B = A.quotient(y^2 + y + 1, 'y2'); print B
      Univariate Quotient Polynomial Ring in y2 over Finite Field of size 2 with modulus y^2 + y + 1
      sage: C = PolynomialRing(B, 'x'); x=C.gen(); print C
      Univariate Polynomial Ring in x over Univariate Quotient Polynomial Ring in y2 over Finite Field of size 2 with modulus y^2 + y + 1
      sage: R = C.quotient(x^3 - 5); print R
      Univariate Quotient Polynomial Ring in xbar over Univariate Quotient Polynomial Ring in y2 over Finite Field of size 2 with modulus y^2 + y + 1 with modulus x^3 + 1

  Next we create a number field, but viewed as a quotient of a polynomial ring over \(\QQ\):

      sage: R = PolynomialRing(RationalField(), 'x'); x = R.gen()
      sage: S = R.quotient(x^3 + 2*x - 5, 'a')
      sage: S
      Univariate Quotient Polynomial Ring in a over Rational Field with modulus x^3 + 2*x - 5
      sage: S.is_field()
      True
      sage: S.degree()
      3

  There are conversion functions for easily going back and forth between quotients of polynomial rings over \(\QQ\) and number fields:

      sage: K = S.number_field(); K
      Number Field in a with defining polynomial x^3 + 2*x - 5
      sage: K.polynomial_quotient_ring()
      Univariate Quotient Polynomial Ring in a over Rational Field with modulus x^3 + 2*x - 5

  The leading coefficient must be a unit (but need not be 1).

      sage: R = PolynomialRing(Integers(9), 'x'); x = R.gen()
      sage: S = R.quotient(2*x^4 + 2*x^3 + x + 2, 'a')
      sage: S = R.quotient(3*x^4 + 2*x^3 + x + 2, 'a')
      Traceback (most recent call last):
      ...
      TypeError: polynomial must have unit leading coefficient

  Another example:

      sage: R.<x> = PolynomialRing(IntegerRing())
      sage: f = x^2 + 1
      sage: R.quotient(f)
      Univariate Quotient Polynomial Ring in xbar over Integer Ring with modulus x^2 + 1

  This shows that the issue at trac 5482 is solved:

      sage: R.<x> = PolynomialRing(QQ)
      sage: f = x^2-1
      sage: R.quotient_by_principal_ideal(f)
      Univariate Quotient Polynomial Ring in xbar over Rational Field with modulus x^2 - 1

class `sage.rings.polynomial.polynomial_quotient_ring.``PolynomialQuotientRing_domain`(ring, polynomial, name=None)

  Bases: `sage.rings.polynomial.polynomial_quotient_ring.PolynomialQuotientRing_generic`, `sage.rings.ring.IntegralDomain`

  EXAMPLES:

      sage: R.<x> = PolynomialRing(ZZ)
      sage: S.<xbar> = R.quotient(x^2 + 1)
      sage: S
      Univariate Quotient Polynomial Ring in xbar over Integer Ring with modulus x^2 + 1
      sage: loads(S.dumps()) == S
      True
      sage: loads(xbar.dumps()) == xbar
      True

  `field_extension`(names)

    Takes a polynomial quotient ring, and returns a tuple with three elements: the NumberField defined by the same polynomial quotient ring, a homomorphism from its parent to the NumberField sending the generators to one another, and the inverse isomorphism.

    OUTPUT:

    - field
    - homomorphism from self to field
    - homomorphism from field to self

    EXAMPLES:

        sage: R.<x> = PolynomialRing(Rationals())
        sage: S.<alpha> = R.quotient(x^3-2)
        sage: F.<b>, f, g = S.field_extension()
        sage: F
        Number Field in b with defining polynomial x^3 - 2
        sage: a = F.gen()
        sage: f(alpha)
        b
        sage: g(a)
        alpha

    Note that the parent ring must be an integral domain:

        sage: R.<x> = GF(25,'f25')['x']
        sage: S.<a> = R.quo(x^3 - 2)
        sage: F, g, h = S.field_extension('b')
        Traceback (most recent call last):
        ...
        AttributeError: 'PolynomialQuotientRing_generic_with_category' object has no attribute 'field_extension'

    Over a finite field, the corresponding field extension is not a number field:

        sage: R.<x> = GF(25, 'a')['x']
        sage: S.<a> = R.quo(x^3 + 2*x + 1)
        sage: F, g, h = S.field_extension('b')
        sage: h(F.0^2 + 3)
        a^2 + 3
        sage: g(x^2 + 2)
        b^2 + 2

    We do an example involving a relative number field:

        sage: R.<x> = QQ['x']
        sage: K.<a> = NumberField(x^3 - 2)
        sage: S.<X> = K['X']
        sage: Q.<b> = S.quo(X^3 + 2*X + 1)
        sage: Q.field_extension('b')
        (Number Field in b with defining polynomial X^3 + 2*X + 1 over its base field, ...
          Defn: b |--> b, Relative number field morphism:
          From: Number Field in b with defining polynomial X^3 + 2*X + 1 over its base field
          To:   Univariate Quotient Polynomial Ring in b over Number Field in a with defining polynomial x^3 - 2 with modulus X^3 + 2*X + 1
          Defn: b |--> b
                a |--> a)

    We slightly change the example above so it works.

        sage: R.<x> = QQ['x']
        sage: K.<a> = NumberField(x^3 - 2)
        sage: S.<X> = K['X']
        sage: f = (X+a)^3 + 2*(X+a) + 1
        sage: f
        X^3 + 3*a*X^2 + (3*a^2 + 2)*X + 2*a + 3
        sage: Q.<z> = S.quo(f)
        sage: F.<w>, g, h = Q.field_extension()
        sage: c = g(z)
        sage: f(c)
        0
        sage: h(g(z))
        z
        sage: g(h(w))
        w

    AUTHORS:

    - Craig Citro (2006-08-07)
    - William Stein (2006-08-06)
  `is_finite`()

    Return whether or not this quotient ring is finite.

    EXAMPLES:

        sage: R.<x> = ZZ[]
        sage: R.quo(1).is_finite()
        True
        sage: R.quo(x^3-2).is_finite()
        False

        sage: R.<x> = GF(9,'a')[]
        sage: R.quo(2*x^3+x+1).is_finite()
        True
        sage: R.quo(2).is_finite()
        True

class `sage.rings.polynomial.polynomial_quotient_ring.``PolynomialQuotientRing_field`(ring, polynomial, name=None)

  Bases: `sage.rings.polynomial.polynomial_quotient_ring.PolynomialQuotientRing_domain`, `sage.rings.ring.Field`

  EXAMPLES:

      sage: R.<x> = PolynomialRing(QQ)
      sage: S.<xbar> = R.quotient(x^2 + 1)
      sage: S
      Univariate Quotient Polynomial Ring in xbar over Rational Field with modulus x^2 + 1
      sage: loads(S.dumps()) == S
      True
      sage: loads(xbar.dumps()) == xbar
      True

  `base_field`()

    Alias for base_ring, when we’re defined over a field.

  `complex_embeddings`(prec=53)

    Return all homomorphisms of this ring into the approximate complex field with precision prec.

    EXAMPLES:

        sage: R.<x> = QQ[]
        sage: f = x^5 + x + 17
        sage: k = R.quotient(f)
        sage: v = k.complex_embeddings(100)
        sage: [phi(k.0^2) for phi in v]
        [2.9757207403766761469671194565, -2.4088994371613850098316292196 + 1.9025410530350528612407363802*I, -2.4088994371613850098316292196 - 1.9025410530350528612407363802*I, 0.92103906697304693634806949137 - 3.0755331188457794473265418086*I, 0.92103906697304693634806949137 + 3.0755331188457794473265418086*I]

class `sage.rings.polynomial.polynomial_quotient_ring.``PolynomialQuotientRing_generic`(ring, polynomial, name=None)

  Bases: `sage.rings.ring.CommutativeRing`

  Quotient of a univariate polynomial ring by an ideal.

  EXAMPLES:

      sage: R.<x> = PolynomialRing(Integers(8)); R
      Univariate Polynomial Ring in x over Ring of integers modulo 8
      sage: S.<xbar> = R.quotient(x^2 + 1); S
      Univariate Quotient Polynomial Ring in xbar over Ring of integers modulo 8 with modulus x^2 + 1

  We demonstrate object persistence.

      sage: loads(S.dumps()) == S
      True
      sage: loads(xbar.dumps()) == xbar
      True

  We create some sample homomorphisms;

      sage: R.<x> = PolynomialRing(ZZ)
      sage: S = R.quo(x^2-4)
      sage: f = S.hom([2])
      sage: f
      Ring morphism:
        From: Univariate Quotient Polynomial Ring in xbar over Integer Ring with modulus x^2 - 4
        To:   Integer Ring
        Defn: xbar |--> 2
      sage: f(x)
      2
      sage: f(x^2 - 4)
      0
      sage: f(x^2)
      4

  TESTS:

  By trac ticket #11900, polynomial quotient rings use Sage’s category framework. They do so in an unusual way: During their initialisation, they are declared to be objects in the category of quotients of commutative algebras over a base ring. However, if it is tested whether a quotient ring is actually a field, the category might be refined, which also includes a change of the class of the quotient ring and its newly created elements.

  Thus, in order to document that this works fine, we go into some detail:

      sage: P.<x> = QQ[]
      sage: Q = P.quotient(x^2+2)
      sage: Q.category()
      Join of Category of commutative algebras over Rational Field and Category of subquotients of monoids and Category of quotients of semigroups

  The test suite passes:

      sage: TestSuite(Q).run()

  We verify that the elements belong to the correct element class. Also, we list the attributes that are provided by the element class of the category, and store the current class of the quotient ring:

      sage: isinstance(Q.an_element(),Q.element_class)
      True
      sage: [s for s in dir(Q.category().element_class) if not s.startswith('_')]
      ['cartesian_product', 'is_idempotent', 'is_one', 'is_unit', 'lift']
      sage: first_class = Q.__class__

  We try to find out whether \(Q\) is a field. Indeed it is, and thus its category, including its class and element class, is changed accordingly:

      sage: Q in Fields()
      True
      sage: Q.category()
      Join of Category of fields and Category of commutative algebras over Rational Field and Category of subquotients of monoids and Category of quotients of semigroups
      sage: first_class == Q.__class__
      False
      sage: [s for s in dir(Q.category().element_class) if not s.startswith('_')]
      ['cartesian_product', 'euclidean_degree', 'gcd', 'is_idempotent', 'is_one', 'is_unit', 'lcm', 'lift', 'quo_rem', 'xgcd']

  As one can see, the elements are now inheriting additional methods: lcm and gcd. Even though `Q.an_element()` belongs to the old and not to the new element class, it still inherits the new methods from the category of fields, thanks to `Element.__getattr__()`:

      sage: isinstance(Q.an_element(),Q.element_class)
      False
      sage: Q.an_element().gcd.__module__
      'sage.categories.fields'

  Since the category has changed, we repeat the test suite. However, we have to skip the test for its elements, since \(an_element\) has been cached in the previous run of the test suite, and we have already seen that its class is not matching the new element class:

      sage: TestSuite(Q).run(skip=['_test_elements'])

  Newly created elements are fine, though, and their test suite passes:

      sage: TestSuite(Q(x)).run()
      sage: isinstance(Q(x), Q.element_class)
      True

  `Element`

    alias of `PolynomialQuotientRingElement`

  `S_class_group`(S, proof=True)

    If self is an étale algebra \(D\) over a number field \(K\) (i.e. a quotient of \(K[x]\) by a squarefree polynomial) and \(S\) is a finite set of places of \(K\), return a list of generators of the \(S\)-class group of \(D\).

    NOTE:

    Since the `ideal` function behaves differently over number fields than over polynomial quotient rings (the quotient does not even know its ring of integers), we return a set of pairs `(gen, order)`, where `gen` is a tuple of generators of an ideal \(I\) and `order` is the order of \(I\) in the \(S\)-class group.

    INPUT:

    - `S` - a set of primes of the coefficient ring
    - `proof` - if False, assume the GRH in computing the class group

    OUTPUT:

    A list of generators of the \(S\)-class group, in the form `(gen, order)`, where `gen` is a tuple of elements generating a fractional ideal \(I\) and `order` is the order of \(I\) in the \(S\)-class group.

    EXAMPLES:

    A trivial algebra over \(\QQ(\sqrt{-5})\) has the same class group as its base:

        sage: K.<a> = QuadraticField(-5)
        sage: R.<x> = K[]
        sage: S.<xbar> = R.quotient(x)
        sage: S.S_class_group([])
        [((2, -a + 1), 2)]

    When we include the prime \((2, -a+1)\), the \(S\)-class group becomes trivial:

        sage: S.S_class_group([K.ideal(2, -a+1)])
        []

    Here is an example where the base and the extension both contribute to the class group:

        sage: K.<a> = QuadraticField(-5)
        sage: K.class_group()
        Class group of order 2 with structure C2 of Number Field in a with defining polynomial x^2 + 5
        sage: R.<x> = K[]
        sage: S.<xbar> = R.quotient(x^2 + 23)
        sage: S.S_class_group([])
        [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)]
        sage: S.S_class_group([K.ideal(3, a-1)])
        []
        sage: S.S_class_group([K.ideal(2, a+1)])
        []
        sage: S.S_class_group([K.ideal(a)])
        [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)]

    Now we take an example over a nontrivial base with two factors, each contributing to the class group:

        sage: K.<a> = QuadraticField(-5)
        sage: R.<x> = K[]
        sage: S.<xbar> = R.quotient((x^2 + 23)*(x^2 + 31))
        sage: S.S_class_group([])
        [((1/4*xbar^2 + 31/4, (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8, 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16, -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8), 6), ((-1/4*xbar^2 - 23/4, (1/8*a - 1/8)*xbar^2 + 23/8*a - 23/8, -1/16*xbar^3 - 1/16*xbar^2 - 23/16*xbar - 23/16, 1/16*a*xbar^3 + (-1/16*a - 1/8)*xbar^2 + 23/16*a*xbar - 23/16*a - 23/8), 6), ((-5/4*xbar^2 - 115/4, 5/4*a*xbar^2 + 115/4*a, -5/16*xbar^3 + 5/16*xbar^2 - 115/16*xbar + 115/16, 1/16*a*xbar^3 + 7/16*a*xbar^2 + 23/16*a*xbar + 161/16*a), 2)]

    By using the ideal \((a)\), we cut the part of the class group coming from \(x^2 + 31\) from 12 to 2, i.e. we lose a generator of order 6 (this was fixed in trac ticket #14489):

        sage: S.S_class_group([K.ideal(a)])
        [((1/4*xbar^2 + 31/4, (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8, 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16, -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8), 6), ((-1/4*xbar^2 - 23/4, (1/8*a - 1/8)*xbar^2 + 23/8*a - 23/8, -1/16*xbar^3 - 1/16*xbar^2 - 23/16*xbar - 23/16, 1/16*a*xbar^3 + (-1/16*a - 1/8)*xbar^2 + 23/16*a*xbar - 23/16*a - 23/8), 2)]

    Note that all the returned values live where we expect them to:

        sage: CG = S.S_class_group([])
        sage: type(CG[0][0][1])
        <class 'sage.rings.polynomial.polynomial_quotient_ring_element.PolynomialQuotientRing_generic_with_category.element_class'>
        sage: type(CG[0][1])
        <type 'sage.rings.integer.Integer'>

  `S_units`(S, proof=True)

    If self is an étale algebra \(D\) over a number field \(K\) (i.e. a quotient of \(K[x]\) by a squarefree polynomial) and \(S\) is a finite set of places of \(K\), return a list of generators of the group of \(S\)-units of \(D\).

    INPUT:

    - `S` - a set of primes of the base field
    - `proof` - if False, assume the GRH in computing the class group

    OUTPUT:

    A list of generators of the \(S\)-unit group, in the form `(gen, order)`, where `gen` is a unit of order `order`.

    EXAMPLES:

        sage: K.<a> = QuadraticField(-3)
        sage: K.unit_group()
        Unit group with structure C6 of Number Field in a with defining polynomial x^2 + 3
        sage: K.<a> = QQ['x'].quotient(x^2 + 3)
        sage: u,o = K.S_units([])[0]; u, o
        (-1/2*a + 1/2, 6)
        sage: u^6
        1
        sage: u^3
        -1
        sage: u^2
        -1/2*a - 1/2

        sage: K.<a> = QuadraticField(-3)
        sage: y = polygen(K)
        sage: L.<b> = K['y'].quotient(y^3 + 5); L
        Univariate Quotient Polynomial Ring in b over Number Field in a with defining polynomial x^2 + 3 with modulus y^3 + 5
        sage: L.S_units([])
        [(-1/2*a + 1/2, 6), ((1/3*a - 1)*b^2 + 4/3*a*b + 5/6*a + 7/2, +Infinity), ((-1/3*a + 1)*b^2 + (2/3*a - 2)*b - 5/6*a + 7/2, +Infinity)]
        sage: L.S_units([K.ideal(1/2*a - 3/2)])
        [((-1/6*a - 1/2)*b^2 + (1/3*a - 1)*b + 4/3*a, +Infinity), (-1/2*a + 1/2, 6), ((1/3*a - 1)*b^2 + 4/3*a*b + 5/6*a + 7/2, +Infinity), ((-1/3*a + 1)*b^2 + (2/3*a - 2)*b - 5/6*a + 7/2, +Infinity)]
        sage: L.S_units([K.ideal(2)])
        [((-1/2*a + 1/2)*b^2 + (-a - 1)*b - 3, +Infinity), ((-1/6*a - 1/2)*b^2 + (1/3*a - 1)*b + 5/6*a - 1/2, +Infinity), ((1/6*a + 1/2)*b^2 + (-1/3*a + 1)*b - 5/6*a - 1/2, +Infinity), (-1/2*a + 1/2, 6), ((1/3*a - 1)*b^2 + 4/3*a*b + 5/6*a + 7/2, +Infinity), ((-1/3*a + 1)*b^2 + (2/3*a - 2)*b - 5/6*a + 7/2, +Infinity)]

    Note that all the returned values live where we expect them to:

        sage: U = L.S_units([])
        sage: type(U[0][0])
        <class 'sage.rings.polynomial.polynomial_quotient_ring_element.PolynomialQuotientRing_field_with_category.element_class'>
        sage: type(U[0][1])
        <type 'sage.rings.integer.Integer'>
        sage: type(U[1][1])
        <class 'sage.rings.infinity.PlusInfinity'>

  `ambient`()
  `base_ring`()

    Return the base ring of the polynomial ring, of which this ring is a quotient.

    EXAMPLES:

    The base ring of \(\ZZ[z]/(z^3 + z^2 + z + 1)\) is \(\ZZ\).

        sage: R.<z> = PolynomialRing(ZZ)
        sage: S.<beta> = R.quo(z^3 + z^2 + z + 1)
        sage: S.base_ring()
        Integer Ring

    Next we make a polynomial quotient ring over \(S\) and ask for its base ring.

        sage: T.<t> = PolynomialRing(S)
        sage: W = T.quotient(t^99 + 99)
        sage: W.base_ring()
        Univariate Quotient Polynomial Ring in beta over Integer Ring with modulus z^3 + z^2 + z + 1

  `cardinality`()

    Return the number of elements of this quotient ring.

    EXAMPLES:

        sage: R.<x> = ZZ[]
        sage: R.quo(1).cardinality()
        1
        sage: R.quo(x^3-2).cardinality()
        +Infinity

        sage: R.<x> = GF(9,'a')[]
        sage: R.quo(2*x^3+x+1).cardinality()
        729
        sage: GF(9,'a').extension(2*x^3+x+1).cardinality()
        729
        sage: R.quo(2).cardinality()
        1

  `characteristic`()

    Return the characteristic of this quotient ring.

    This is always the same as the characteristic of the base ring.

    EXAMPLES:

        sage: R.<z> = PolynomialRing(ZZ)
        sage: S.<a> = R.quo(z - 19)
        sage: S.characteristic()
        0
        sage: R.<x> = PolynomialRing(GF(9,'a'))
        sage: S = R.quotient(x^3 + 1)
        sage: S.characteristic()
        3

  `class_group`(proof=True)

    If self is a quotient ring of a polynomial ring over a number field \(K\), by a polynomial of nonzero discriminant, return a list of generators of the class group.

    NOTE:

    Since the `ideal` function behaves differently over number fields than over polynomial quotient rings (the quotient does not even know its ring of integers), we return a set of pairs `(gen, order)`, where `gen` is a tuple of generators of an ideal \(I\) and `order` is the order of \(I\) in the class group.

    INPUT:

    - `proof` - if False, assume the GRH in computing the class group

    OUTPUT:

    A list of pairs `(gen, order)`, where `gen` is a tuple of elements generating a fractional ideal and `order` is the order of \(I\) in the class group.

    EXAMPLES:

        sage: K.<a> = QuadraticField(-3)
        sage: K.class_group()
        Class group of order 1 of Number Field in a with defining polynomial x^2 + 3
        sage: K.<a> = QQ['x'].quotient(x^2 + 3)
        sage: K.class_group()
        []

    A trivial algebra over \(\QQ(\sqrt{-5})\) has the same class group as its base:

        sage: K.<a> = QuadraticField(-5)
        sage: R.<x> = K[]
        sage: S.<xbar> = R.quotient(x)
        sage: S.class_group()
        [((2, -a + 1), 2)]

    The same algebra constructed in a different way:

        sage: K.<a> = QQ['x'].quotient(x^2 + 5)
        sage: K.class_group(())
        [((2, a + 1), 2)]

    Here is an example where the base and the extension both contribute to the class group:

        sage: K.<a> = QuadraticField(-5)
        sage: K.class_group()
        Class group of order 2 with structure C2 of Number Field in a with defining polynomial x^2 + 5
        sage: R.<x> = K[]
        sage: S.<xbar> = R.quotient(x^2 + 23)
        sage: S.class_group()
        [((2, -a + 1, 1/2*xbar + 1/2, -1/2*a*xbar + 1/2*a + 1), 6)]

    Here is an example of a product of number fields, both of which contribute to the class group:

        sage: R.<x> = QQ[]
        sage: S.<xbar> = R.quotient((x^2 + 23)*(x^2 + 47))
        sage: S.class_group()
        [((1/12*xbar^2 + 47/12, 1/48*xbar^3 - 1/48*xbar^2 + 47/48*xbar - 47/48), 3), ((-1/12*xbar^2 - 23/12, -1/48*xbar^3 - 1/48*xbar^2 - 23/48*xbar - 23/48), 5)]

    Now we take an example over a nontrivial base with two factors, each contributing to the class group:

        sage: K.<a> = QuadraticField(-5)
        sage: R.<x> = K[]
        sage: S.<xbar> = R.quotient((x^2 + 23)*(x^2 + 31))
        sage: S.class_group()
        [((1/4*xbar^2 + 31/4, (-1/8*a + 1/8)*xbar^2 - 31/8*a + 31/8, 1/16*xbar^3 + 1/16*xbar^2 + 31/16*xbar + 31/16, -1/16*a*xbar^3 + (1/16*a + 1/8)*xbar^2 - 31/16*a*xbar + 31/16*a + 31/8), 6), ((-1/4*xbar^2 - 23/4, (1/8*a - 1/8)*xbar^2 + 23/8*a - 23/8, -1/16*xbar^3 - 1/16*xbar^2 - 23/16*xbar - 23/16, 1/16*a*xbar^3 + (-1/16*a - 1/8)*xbar^2 + 23/16*a*xbar - 23/16*a - 23/8), 6), ((-5/4*xbar^2 - 115/4, 5/4*a*xbar^2 + 115/4*a, -5/16*xbar^3 + 5/16*xbar^2 - 115/16*xbar + 115/16, 1/16*a*xbar^3 + 7/16*a*xbar^2 + 23/16*a*xbar + 161/16*a), 2)]

    Note that all the returned values live where we expect them to:

        sage: CG = S.class_group()
        sage: type(CG[0][0][1])
        <class 'sage.rings.polynomial.polynomial_quotient_ring_element.PolynomialQuotientRing_generic_with_category.element_class'>
        sage: type(CG[0][1])
        <type 'sage.rings.integer.Integer'>

  `construction`()

    Functorial construction of `self`

    EXAMPLES:

        sage: P.<t>=ZZ[]
        sage: Q = P.quo(5+t^2)
        sage: F, R = Q.construction()
        sage: F(R) == Q
        True
        sage: P.<t> = GF(3)[]
        sage: Q = P.quo([2+t^2])
        sage: F, R = Q.construction()
        sage: F(R) == Q
        True

    AUTHOR:

    – Simon King (2010-05)

  `cover_ring`()

    Return the polynomial ring of which this ring is the quotient.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(QQ)
        sage: S = R.quotient(x^2-2)
        sage: S.polynomial_ring()
        Univariate Polynomial Ring in x over Rational Field

  `degree`()

    Return the degree of this quotient ring. The degree is the degree of the polynomial that we quotiented out by.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(GF(3))
        sage: S = R.quotient(x^2005 + 1)
        sage: S.degree()
        2005

  `discriminant`(v=None)

    Return the discriminant of this ring over the base ring. This is by definition the discriminant of the polynomial that we quotiented out by.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(QQ)
        sage: S = R.quotient(x^3 + x^2 + x + 1)
        sage: S.discriminant()
        -16
        sage: S = R.quotient((x + 1) * (x + 1))
        sage: S.discriminant()
        0

    The discriminant of the quotient polynomial ring need not equal the discriminant of the corresponding number field, since the discriminant of a number field is by definition the discriminant of the ring of integers of the number field:

        sage: S = R.quotient(x^2 - 8)
        sage: S.number_field().discriminant()
        8
        sage: S.discriminant()
        32

  `gen`(n=0)

    Return the generator of this quotient ring. This is the equivalence class of the image of the generator of the polynomial ring.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(QQ)
        sage: S = R.quotient(x^2 - 8, 'gamma')
        sage: S.gen()
        gamma

  `is_field`(proof=True)

    Return whether or not this quotient ring is a field.

    EXAMPLES:

        sage: R.<z> = PolynomialRing(ZZ)
        sage: S = R.quo(z^2-2)
        sage: S.is_field()
        False
        sage: R.<x> = PolynomialRing(QQ)
        sage: S = R.quotient(x^2 - 2)
        sage: S.is_field()
        True

  `krull_dimension`()

    x.__init__(...) initializes x; see help(type(x)) for signature

  `lift`(x)

    Return an element of the ambient ring mapping to the given argument.

    EXAMPLES:

        sage: P.<x> = QQ[]
        sage: Q = P.quotient(x^2+2)
        sage: Q.lift(Q.0^3)
        -2*x
        sage: Q(-2*x)
        -2*xbar
        sage: Q.0^3
        -2*xbar

  `modulus`()

    Return the polynomial modulus of this quotient ring.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(GF(3))
        sage: S = R.quotient(x^2 - 2)
        sage: S.modulus()
        x^2 + 1

  `ngens`()

    Return the number of generators of this quotient ring over the base ring. This function always returns 1.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(QQ)
        sage: S.<y> = PolynomialRing(R)
        sage: T.<z> = S.quotient(y + x)
        sage: T
        Univariate Quotient Polynomial Ring in z over Univariate Polynomial Ring in x over Rational Field with modulus y + x
        sage: T.ngens()
        1

  `number_field`()

    Return the number field isomorphic to this quotient polynomial ring, if possible.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(QQ)
        sage: S.<alpha> = R.quotient(x^29 - 17*x - 1)
        sage: K = S.number_field()
        sage: K
        Number Field in alpha with defining polynomial x^29 - 17*x - 1
        sage: alpha = K.gen()
        sage: alpha^29
        17*alpha + 1

  `order`()

    Return the number of elements of this quotient ring.

    EXAMPLES:

        sage: F1.<a> = GF(2^7)
        sage: P1.<x> = F1[]
        sage: F2 = F1.extension(x^2+x+1, 'u')
        sage: F2.order()
        16384

        sage: F1 = QQ
        sage: P1.<x> = F1[]
        sage: F2 = F1.extension(x^2+x+1, 'u')
        sage: F2.order()
        +Infinity

  `polynomial_ring`()

    Return the polynomial ring of which this ring is the quotient.

    EXAMPLES:

        sage: R.<x> = PolynomialRing(QQ)
        sage: S = R.quotient(x^2-2)
        sage: S.polynomial_ring()
        Univariate Polynomial Ring in x over Rational Field

  `random_element`(*args, **kwds)

    Return a random element of this quotient ring.

    INPUT:

    - `*args`, `**kwds` - Arguments for randomization that are passed on to the `random_element` method of the polynomial ring, and from there to the base ring

    OUTPUT:

    - Element of this quotient ring

    EXAMPLES:

        sage: F1.<a> = GF(2^7)
        sage: P1.<x> = F1[]
        sage: F2 = F1.extension(x^2+x+1, 'u')
        sage: F2.random_element()
        (a^6 + 1)*u + a^5 + a^4 + a^3 + 1

  `retract`(x)

    Return the coercion of x into this polynomial quotient ring.

    The rings that coerce into the quotient ring canonically are:

    - this ring
    - any canonically isomorphic ring
    - anything that coerces into the ring of which this is the quotient
  `selmer_group`(S, m, proof=True)

    If self is an étale algebra \(D\) over a number field \(K\) (i.e. a quotient of \(K[x]\) by a squarefree polynomial) and \(S\) is a finite set of places of \(K\), compute the Selmer group \(D(S,m)\). This is the subgroup of \(D^*/(D^*)^m\) consisting of elements \(a\) such that \(D(\sqrt[m]{a})/D\) is unramified at all primes of \(D\) lying above a place outside of \(S\).

    INPUT:

    - `S` - A set of primes of the coefficient ring (which is a number field).
    - `m` - a positive integer
    - `proof` - if False, assume the GRH in computing the class group

    OUTPUT:

    A list of generators of \(D(S,m)\).

    EXAMPLES:

        sage: K.<a> = QuadraticField(-5)
        sage: R.<x> = K[]
        sage: D.<T> = R.quotient(x)
        sage: D.selmer_group((), 2)
        [-1, 2]
        sage: D.selmer_group([K.ideal(2, -a+1)], 2)
        [2, -1]
        sage: D.selmer_group([K.ideal(2, -a+1), K.ideal(3, a+1)], 2)
        [2, -a - 1, -1]
        sage: D.selmer_group((K.ideal(2, -a+1),K.ideal(3, a+1)), 4)
        [2, -a - 1, -1]
        sage: D.selmer_group([K.ideal(2, -a+1)], 3)
        [2]
        sage: D.selmer_group([K.ideal(2, -a+1), K.ideal(3, a+1)], 3)
        [2, -a - 1]
        sage: D.selmer_group([K.ideal(2, -a+1), K.ideal(3, a+1), K.ideal(a)], 3)
        [2, -a - 1, a]

  `units`(proof=True)

    If this quotient ring is over a number field K, by a polynomial of nonzero discriminant, returns a list of generators of the units.

    INPUT:

    - `proof` - if False, assume the GRH in computing the class group

    OUTPUT:

    A list of generators of the unit group, in the form `(gen, order)`, where `gen` is a unit of order `order`.

    EXAMPLES:

        sage: K.<a> = QuadraticField(-3)
        sage: K.unit_group()
        Unit group with structure C6 of Number Field in a with defining polynomial x^2 + 3
        sage: K.<a> = QQ['x'].quotient(x^2 + 3)
        sage: u = K.units()[0][0]; u
        -1/2*a + 1/2
        sage: u^6
        1
        sage: u^3
        -1
        sage: u^2
        -1/2*a - 1/2
        sage: K.<a> = QQ['x'].quotient(x^2 + 5)
        sage: K.units(())
        [(-1, 2)]

        sage: K.<a> = QuadraticField(-3)
        sage: y = polygen(K)
        sage: L.<b> = K['y'].quotient(y^3 + 5); L
        Univariate Quotient Polynomial Ring in b over Number Field in a with defining polynomial x^2 + 3 with modulus y^3 + 5
        sage: L.units()
        [(-1/2*a + 1/2, 6), ((1/3*a - 1)*b^2 + 4/3*a*b + 5/6*a + 7/2, +Infinity), ((-1/3*a + 1)*b^2 + (2/3*a - 2)*b - 5/6*a + 7/2, +Infinity)]
        sage: L.<b> = K.extension(y^3 + 5)
        sage: L.unit_group()
        Unit group with structure C6 x Z x Z of Number Field in b with defining polynomial x^3 + 5 over its base field
        sage: L.unit_group().gens()    # abstract generators
        (u0, u1, u2)
        sage: L.unit_group().gens_values()
        [-1/2*a + 1/2, (1/3*a - 1)*b^2 + 4/3*a*b + 5/6*a + 7/2, (-1/3*a + 1)*b^2 + (2/3*a - 2)*b - 5/6*a + 7/2]

    Note that all the returned values live where we expect them to:

        sage: L.<b> = K['y'].quotient(y^3 + 5)
        sage: U = L.units()
        sage: type(U[0][0])
        <class 'sage.rings.polynomial.polynomial_quotient_ring_element.PolynomialQuotientRing_field_with_category.element_class'>
        sage: type(U[0][1])
        <type 'sage.rings.integer.Integer'>
        sage: type(U[1][1])
        <class 'sage.rings.infinity.PlusInfinity'>

`sage.rings.polynomial.polynomial_quotient_ring.``is_PolynomialQuotientRing`(x)

  x.__init__(...) initializes x; see help(type(x)) for signature

### Navigation

- index
- modules |
- next |
- previous |
- Polynomial Rings »
- Univariate Polynomials and Polynomial Rings »