Fraction fields of Ore polynomial rings - Noncommutative Polynomials

Skip to content
Back to top
View this page
Edit this page

# Fraction fields of Ore polynomial rings

Sage provides support for building the fraction field of any Ore polynomial ring and performing basic operations in it. The fraction field is constructed by the method `sage.rings.polynomial.ore_polynomial_ring.OrePolynomialRing.fraction_field()` as demonstrated below:

Sage

    sage: R.<t> = QQ[]
    sage: der = R.derivation()
    sage: A.<d> = R['d', der]
    sage: K = A.fraction_field()
    sage: K
    Ore Function Field in d over Fraction Field of Univariate Polynomial Ring in t
     over Rational Field twisted by d/dt

Python

    >>> from sage.all import *
    >>> R = QQ['t']; (t,) = R._first_ngens(1)
    >>> der = R.derivation()
    >>> A = R['d', der]; (d,) = A._first_ngens(1)
    >>> K = A.fraction_field()
    >>> K
    Ore Function Field in d over Fraction Field of Univariate Polynomial Ring in t
     over Rational Field twisted by d/dt

The simplest way to build elements in \(K\) is to use the division operator over Ore polynomial rings:

Sage

    sage: f = 1/d
    sage: f
    d^(-1)
    sage: f.parent() is K
    True

[Python]

    >>> from sage.all import *
    >>> f = Integer(1)/d
    >>> f
    d^(-1)
    >>> f.parent() is K
    True

REPRESENTATION OF ELEMENTS:

Elements in \(K\) are internally represented by fractions of the form \(s^{-1} t\) with the denominator on the left. Notice that, because of noncommutativity, this is not the same that fractions with denominator on the right. For example, a fraction created by the division operator is usually displayed with a different numerator and/or a different denominator:

Sage

    sage: g = t / d
    sage: g
    (d - 1/t)^(-1) * t

Python

    >>> from sage.all import *
    >>> g = t / d
    >>> g
    (d - 1/t)^(-1) * t

The left numerator and right denominator are accessible as follows:

Sage

    sage: g.left_numerator()
    t
    sage: g.right_denominator()
    d

[Python]

    >>> from sage.all import *
    >>> g.left_numerator()
    t
    >>> g.right_denominator()
    d

Similarly the methods `OrePolynomial.left_denominator()` and `OrePolynomial.right_numerator()` give access to the Ore polynomials \(s\) and \(t\) in the representation \(s^{-1} t\):

Sage

    sage: g.left_denominator()
    d - 1/t
    sage: g.right_numerator()
    t

Python

    >>> from sage.all import *
    >>> g.left_denominator()
    d - 1/t
    >>> g.right_numerator()
    t

We favored the writing \(s^{-1} t\) because it always exists. On the contrary, the writing \(s t^{-1}\) is only guaranteed when the twisting morphism defining the Ore polynomial ring is bijective. As a consequence, when the latter assumption is not fulfilled (or actually if Sage cannot invert the twisting morphism), computing the left numerator and the right denominator fails:

Sage

    sage: sigma = R.hom([t^2])
    sage: S.<x> = R['x', sigma]
    sage: F = S.fraction_field()
    sage: f = F.random_element()
    sage: while not f:
    ....:     f = F.random_element()
    sage: f.left_numerator()
    Traceback (most recent call last):
    ...
    NotImplementedError: inversion of the twisting morphism
    Ring endomorphism of Fraction Field of Univariate Polynomial Ring in t over Rational Field
      Defn: t |--> t^2

[Python]

    >>> from sage.all import *
    >>> sigma = R.hom([t**Integer(2)])
    >>> S = R['x', sigma]; (x,) = S._first_ngens(1)
    >>> F = S.fraction_field()
    >>> f = F.random_element()
    >>> while not f:
    ...     f = F.random_element()
    >>> f.left_numerator()
    Traceback (most recent call last):
    ...
    NotImplementedError: inversion of the twisting morphism
    Ring endomorphism of Fraction Field of Univariate Polynomial Ring in t over Rational Field
      Defn: t |--> t^2

On a related note, fractions are systematically simplified when the twisting morphism is bijective but they are not otherwise. As an example, compare the two following computations:

Sage

    sage: P = d^2 + t*d + 1
    sage: Q = d + t^2
    sage: D = d^3 + t^2 + 1
    sage: f = P^(-1) * Q
    sage: f
    (d^2 + t*d + 1)^(-1) * (d + t^2)
    sage: g = (D*P)^(-1) * (D*Q)
    sage: g
    (d^2 + t*d + 1)^(-1) * (d + t^2)

    sage: P = x^2 + t*x + 1
    sage: Q = x + t^2
    sage: D = x^3 + t^2 + 1
    sage: f = P^(-1) * Q
    sage: f
    (x^2 + t*x + 1)^(-1) * (x + t^2)
    sage: g = (D*P)^(-1) * (D*Q)
    sage: g
    (x^5 + t^8*x^4 + x^3 + (t^2 + 1)*x^2 + (t^3 + t)*x + t^2 + 1)^(-1)
    * (x^4 + t^16*x^3 + (t^2 + 1)*x + t^4 + t^2)
    sage: f == g
    True

Python

    >>> from sage.all import *
    >>> P = d**Integer(2) + t*d + Integer(1)
    >>> Q = d + t**Integer(2)
    >>> D = d**Integer(3) + t**Integer(2) + Integer(1)
    >>> f = P**(-Integer(1)) * Q
    >>> f
    (d^2 + t*d + 1)^(-1) * (d + t^2)
    >>> g = (D*P)**(-Integer(1)) * (D*Q)
    >>> g
    (d^2 + t*d + 1)^(-1) * (d + t^2)

    >>> P = x**Integer(2) + t*x + Integer(1)
    >>> Q = x + t**Integer(2)
    >>> D = x**Integer(3) + t**Integer(2) + Integer(1)
    >>> f = P**(-Integer(1)) * Q
    >>> f
    (x^2 + t*x + 1)^(-1) * (x + t^2)
    >>> g = (D*P)**(-Integer(1)) * (D*Q)
    >>> g
    (x^5 + t^8*x^4 + x^3 + (t^2 + 1)*x^2 + (t^3 + t)*x + t^2 + 1)^(-1)
    * (x^4 + t^16*x^3 + (t^2 + 1)*x + t^4 + t^2)
    >>> f == g
    True

OPERATIONS:

Basic arithmetical operations are available:

Sage

    sage: f = 1 / d
    sage: g = 1 / (d + t)
    sage: u = f + g; u
    (d^2 + ((t^2 - 1)/t)*d)^(-1) * (2*d + (t^2 - 2)/t)
    sage: v = f - g; v
    (d^2 + ((t^2 - 1)/t)*d)^(-1) * t
    sage: u + v
    d^(-1) * 2

    sage: f * g
    (d^2 + t*d)^(-1)
    sage: f / g
    d^(-1) * (d + t)

[Python]

    >>> from sage.all import *
    >>> f = Integer(1) / d
    >>> g = Integer(1) / (d + t)
    >>> u = f + g; u
    (d^2 + ((t^2 - 1)/t)*d)^(-1) * (2*d + (t^2 - 2)/t)
    >>> v = f - g; v
    (d^2 + ((t^2 - 1)/t)*d)^(-1) * t
    >>> u + v
    d^(-1) * 2

    >>> f * g
    (d^2 + t*d)^(-1)
    >>> f / g
    d^(-1) * (d + t)

Of course, multiplication remains noncommutative:

Sage

    sage: g * f
    (d^2 + t*d + 1)^(-1)
    sage: g^(-1) * f
    (d - 1/t)^(-1) * (d + (t^2 - 1)/t)

Python

    >>> from sage.all import *
    >>> g * f
    (d^2 + t*d + 1)^(-1)
    >>> g**(-Integer(1)) * f
    (d - 1/t)^(-1) * (d + (t^2 - 1)/t)

AUTHOR:

- Xavier Caruso (2020-05)

class sage.rings.polynomial.ore_function_field.OreFunctionCenterInjection(domain, codomain, ringembed)

  Bases: `RingHomomorphism`

  Canonical injection of the center of a Ore function field into this field.

  section()

    Return a section of this morphism.

    EXAMPLES:

    Sage

        sage: k.<a> = GF(5^3)
        sage: S.<x> = SkewPolynomialRing(k, k.frobenius_endomorphism())
        sage: K = S.fraction_field()
        sage: Z = K.center()
        sage: iota = K.coerce_map_from(Z)
        sage: sigma = iota.section()
        sage: sigma(x^3 / (x^6 + 1))
        z/(z^2 + 1)

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('a',)); (a,) = k._first_ngens(1)
        >>> S = SkewPolynomialRing(k, k.frobenius_endomorphism(), names=('x',)); (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> Z = K.center()
        >>> iota = K.coerce_map_from(Z)
        >>> sigma = iota.section()
        >>> sigma(x**Integer(3) / (x**Integer(6) + Integer(1)))
        z/(z^2 + 1)

class sage.rings.polynomial.ore_function_field.OreFunctionField(ring, category=None)

  Bases: `Parent`, `UniqueRepresentation`

  A class for fraction fields of Ore polynomial rings.

  Element = None
  change_var(var)

    Return the Ore function field in variable `var` with the same base ring, twisting morphism and twisting derivation as `self`.

    INPUT:

    - `var` – string representing the name of the new variable

    EXAMPLES:

    Sage

        sage: k.<t> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: R.<x> = OrePolynomialRing(k,Frob)
        sage: K = R.fraction_field()
        sage: K
        Ore Function Field in x over Finite Field in t of size 5^3 twisted by t |--> t^5
        sage: Ky = K.change_var('y'); Ky
        Ore Function Field in y over Finite Field in t of size 5^3 twisted by t |--> t^5
        sage: Ky is K.change_var('y')
        True

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('t',)); (t,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> R = OrePolynomialRing(k,Frob, names=('x',)); (x,) = R._first_ngens(1)
        >>> K = R.fraction_field()
        >>> K
        Ore Function Field in x over Finite Field in t of size 5^3 twisted by t |--> t^5
        >>> Ky = K.change_var('y'); Ky
        Ore Function Field in y over Finite Field in t of size 5^3 twisted by t |--> t^5
        >>> Ky is K.change_var('y')
        True

  characteristic()

    Return the characteristic of this Ore function field.

    EXAMPLES:

    Sage

        sage: R.<t> = QQ[]
        sage: sigma = R.hom([t+1])
        sage: S = R['x',sigma]
        sage: S.fraction_field().characteristic()
        0

        sage: k.<u> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S = k['y',Frob]
        sage: S.fraction_field().characteristic()
        5

    Python

        >>> from sage.all import *
        >>> R = QQ['t']; (t,) = R._first_ngens(1)
        >>> sigma = R.hom([t+Integer(1)])
        >>> S = R['x',sigma]
        >>> S.fraction_field().characteristic()
        0

        >>> k = GF(Integer(5)**Integer(3), names=('u',)); (u,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['y',Frob]
        >>> S.fraction_field().characteristic()
        5

  fraction_field()

    Return the fraction field of this Ore function field, i.e. this Ore function field itself.

    EXAMPLES:

    Sage

        sage: R.<t> = QQ[]
        sage: der = R.derivation()
        sage: A.<d> = R['d', der]
        sage: K = A.fraction_field(); K
        Ore Function Field in d
         over Fraction Field of Univariate Polynomial Ring in t over Rational Field
         twisted by d/dt
        sage: K.fraction_field()
        Ore Function Field in d
         over Fraction Field of Univariate Polynomial Ring in t over Rational Field
         twisted by d/dt
        sage: K.fraction_field() is K
        True

    Python

        >>> from sage.all import *
        >>> R = QQ['t']; (t,) = R._first_ngens(1)
        >>> der = R.derivation()
        >>> A = R['d', der]; (d,) = A._first_ngens(1)
        >>> K = A.fraction_field(); K
        Ore Function Field in d
         over Fraction Field of Univariate Polynomial Ring in t over Rational Field
         twisted by d/dt
        >>> K.fraction_field()
        Ore Function Field in d
         over Fraction Field of Univariate Polynomial Ring in t over Rational Field
         twisted by d/dt
        >>> K.fraction_field() is K
        True

  gen(n=0)

    Return the indeterminate generator of this Ore function field.

    INPUT:

    - `n` – index of generator to return (default: 0); exists for compatibility with other polynomial rings

    EXAMPLES:

    Sage

        sage: k.<a> = GF(5^4)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: K.gen()
        x

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(4), names=('a',)); (a,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.gen()
        x

  gens()

    Return the tuple of generators of `self`.

    EXAMPLES:

    Sage

        sage: k.<a> = GF(5^4)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: K.gens()
        (x,)

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(4), names=('a',)); (a,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.gens()
        (x,)

  gens_dict()

    Return a {name: variable} dictionary of the generators of this Ore function field.

    EXAMPLES:

    Sage

        sage: R.<t> = ZZ[]
        sage: sigma = R.hom([t+1])
        sage: S.<x> = OrePolynomialRing(R, sigma)
        sage: K = S.fraction_field()
        sage: K.gens_dict()
        {'x': x}

    Python

        >>> from sage.all import *
        >>> R = ZZ['t']; (t,) = R._first_ngens(1)
        >>> sigma = R.hom([t+Integer(1)])
        >>> S = OrePolynomialRing(R, sigma, names=('x',)); (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.gens_dict()
        {'x': x}

  is_exact()

    Return `True` if elements of this Ore function field are exact. This happens if and only if elements of the base ring are exact.

    EXAMPLES:

    Sage

        sage: k.<t> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: K.is_exact()
        True

        sage: k.<u> = Qq(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: K.is_exact()
        False

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('t',)); (t,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.is_exact()
        True

        >>> k = Qq(Integer(5)**Integer(3), names=('u',)); (u,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.is_exact()
        False

  is_field(proof=False)

    Return always `True` since Ore function field are (skew) fields.

    EXAMPLES:

    Sage

        sage: k.<a> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: S.is_field()
        False
        sage: K.is_field()
        True

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('a',)); (a,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> S.is_field()
        False
        >>> K.is_field()
        True

  is_finite()

    Return `False` since Ore function field are not finite.

    EXAMPLES:

    Sage

        sage: k.<t> = GF(5^3)
        sage: k.is_finite()
        True
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x',Frob]
        sage: K = S.fraction_field()
        sage: K.is_finite()
        False

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('t',)); (t,) = k._first_ngens(1)
        >>> k.is_finite()
        True
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x',Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.is_finite()
        False

  is_sparse()

    Return `True` if the elements of this Ore function field are sparsely represented.

    Warning

    Since sparse Ore polynomials are not yet implemented, this function always returns `False`.

    EXAMPLES:

    Sage

        sage: R.<t> = RR[]
        sage: sigma = R.hom([t+1])
        sage: S.<x> = R['x', sigma]
        sage: K = S.fraction_field()
        sage: K.is_sparse()
        False

    Python

        >>> from sage.all import *
        >>> R = RR['t']; (t,) = R._first_ngens(1)
        >>> sigma = R.hom([t+Integer(1)])
        >>> S = R['x', sigma]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.is_sparse()
        False

  ngens()

    Return the number of generators of this Ore function field, which is \(1\).

    EXAMPLES:

    Sage

        sage: R.<t> = RR[]
        sage: sigma = R.hom([t+1])
        sage: S.<x> = R['x',sigma]
        sage: K = S.fraction_field()
        sage: K.ngens()
        1

    Python

        >>> from sage.all import *
        >>> R = RR['t']; (t,) = R._first_ngens(1)
        >>> sigma = R.hom([t+Integer(1)])
        >>> S = R['x',sigma]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.ngens()
        1

  parameter(n=0)

    alias of `gen()`.

  random_element(degree=2, monic=False, *args, **kwds)

    Return a random Ore function in this field.

    INPUT:

    - `degree` – (default: 2) an integer or a list of two integers; the degrees of the denominator and numerator

    - `monic` – boolean (default: `False`); if `True`, return a monic Ore function with monic numerator and denominator

    - `*args`, `**kwds` – passed in to the `random_element()` method for the base ring

    EXAMPLES:

    Sage

        sage: k.<t> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: K.random_element()              # random
        (x^2 + (2*t^2 + t + 1)*x + 2*t^2 + 2*t + 3)^(-1)
        * ((2*t^2 + 3)*x^2 + (4*t^2 + t + 4)*x + 2*t^2 + 2)
        sage: K.random_element(monic=True)    # random
        (x^2 + (4*t^2 + 3*t + 4)*x + 4*t^2 + t)^(-1)
        * (x^2 + (2*t^2 + t + 3)*x + 3*t^2 + t + 2)
        sage: K.random_element(degree=3)      # random
        (x^3 + (2*t^2 + 3)*x^2 + (2*t^2 + 4)*x + t + 3)^(-1)
        * ((t + 4)*x^3 + (4*t^2 + 2*t + 2)*x^2 + (2*t^2 + 3*t + 3)*x + 3*t^2 + 3*t + 1)
        sage: K.random_element(degree=[2,5])  # random
        (x^2 + (4*t^2 + 2*t + 2)*x + 4*t^2 + t + 2)^(-1)
        * ((3*t^2 + t + 1)*x^5 + (2*t^2 + 2*t)*x^4 + (t^2 + 2*t + 4)*x^3
           + (3*t^2 + 2*t)*x^2 + (t^2 + t + 4)*x)

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('t',)); (t,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.random_element()              # random
        (x^2 + (2*t^2 + t + 1)*x + 2*t^2 + 2*t + 3)^(-1)
        * ((2*t^2 + 3)*x^2 + (4*t^2 + t + 4)*x + 2*t^2 + 2)
        >>> K.random_element(monic=True)    # random
        (x^2 + (4*t^2 + 3*t + 4)*x + 4*t^2 + t)^(-1)
        * (x^2 + (2*t^2 + t + 3)*x + 3*t^2 + t + 2)
        >>> K.random_element(degree=Integer(3))      # random
        (x^3 + (2*t^2 + 3)*x^2 + (2*t^2 + 4)*x + t + 3)^(-1)
        * ((t + 4)*x^3 + (4*t^2 + 2*t + 2)*x^2 + (2*t^2 + 3*t + 3)*x + 3*t^2 + 3*t + 1)
        >>> K.random_element(degree=[Integer(2),Integer(5)])  # random
        (x^2 + (4*t^2 + 2*t + 2)*x + 4*t^2 + t + 2)^(-1)
        * ((3*t^2 + t + 1)*x^5 + (2*t^2 + 2*t)*x^4 + (t^2 + 2*t + 4)*x^3
           + (3*t^2 + 2*t)*x^2 + (t^2 + t + 4)*x)

  twisting_derivation()

    Return the twisting derivation defining this Ore function field or `None` if this Ore function field is not twisted by a derivation.

    EXAMPLES:

    Sage

        sage: R.<t> = QQ[]
        sage: der = R.derivation(); der
        d/dt
        sage: A.<d> = R['d', der]
        sage: F = A.fraction_field()
        sage: F.twisting_derivation()
        d/dt

        sage: k.<a> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x', Frob]
        sage: K = S.fraction_field()
        sage: K.twisting_derivation()

    Python

        >>> from sage.all import *
        >>> R = QQ['t']; (t,) = R._first_ngens(1)
        >>> der = R.derivation(); der
        d/dt
        >>> A = R['d', der]; (d,) = A._first_ngens(1)
        >>> F = A.fraction_field()
        >>> F.twisting_derivation()
        d/dt

        >>> k = GF(Integer(5)**Integer(3), names=('a',)); (a,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x', Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.twisting_derivation()

    See also

    `sage.rings.polynomial.ore_polynomial_element.OrePolynomial.twisting_derivation()`, `twisting_morphism()`

  twisting_morphism(n=1)

    Return the twisting endomorphism defining this Ore function field iterated `n` times or `None` if this Ore function field is not twisted by an endomorphism.

    INPUT:

    - `n` – integer (default: 1)

    EXAMPLES:

    Sage

        sage: R.<t> = QQ[]
        sage: sigma = R.hom([t+1])
        sage: S.<x> = R['x', sigma]
        sage: K = S.fraction_field()
        sage: K.twisting_morphism()
        Ring endomorphism of
         Fraction Field of Univariate Polynomial Ring in t over Rational Field
          Defn: t |--> t + 1

    Python

        >>> from sage.all import *
        >>> R = QQ['t']; (t,) = R._first_ngens(1)
        >>> sigma = R.hom([t+Integer(1)])
        >>> S = R['x', sigma]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> K.twisting_morphism()
        Ring endomorphism of
         Fraction Field of Univariate Polynomial Ring in t over Rational Field
          Defn: t |--> t + 1

    When the Ore polynomial ring is only twisted by a derivation, this method returns nothing:

    Sage

        sage: der = R.derivation()
        sage: A.<d> = R['x', der]
        sage: F = A.fraction_field()
        sage: F.twisting_morphism()

    [Python]

        >>> from sage.all import *
        >>> der = R.derivation()
        >>> A = R['x', der]; (d,) = A._first_ngens(1)
        >>> F = A.fraction_field()
        >>> F.twisting_morphism()

    See also

    `sage.rings.polynomial.ore_polynomial_element.OrePolynomial.twisting_morphism()`, `twisting_derivation()`

class sage.rings.polynomial.ore_function_field.OreFunctionField_with_large_center(ring, category=None)

  Bases: `OreFunctionField`

  A specialized class for Ore polynomial fields whose center has finite index.

  center(name=None, names=None, default=False)

    Return the center of this Ore function field.

    Note

    One can prove that the center is a field of rational functions over a subfield of the base ring of this Ore function field.

    INPUT:

    - `name` – string or `None` (default: `None`); the name for the central variable

    - `default` – boolean (default: `False`); if `True`, set the default variable name for the center to `name`

    EXAMPLES:

    Sage

        sage: k.<t> = GF(5^3)
        sage: Frob = k.frobenius_endomorphism()
        sage: S.<x> = k['x',Frob]
        sage: K = S.fraction_field()
        sage: Z = K.center(); Z
        Fraction Field of Univariate Polynomial Ring in z over Finite Field of size 5

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(5)**Integer(3), names=('t',)); (t,) = k._first_ngens(1)
        >>> Frob = k.frobenius_endomorphism()
        >>> S = k['x',Frob]; (x,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> Z = K.center(); Z
        Fraction Field of Univariate Polynomial Ring in z over Finite Field of size 5

    We can pass in another variable name:

    Sage

        sage: K.center(name='y')
        Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5

    [Python]

        >>> from sage.all import *
        >>> K.center(name='y')
        Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5

    or use the bracket notation:

    Sage

        sage: Zy.<y> = K.center(); Zy
        Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5

    Python

        >>> from sage.all import *
        >>> Zy = K.center(names=('y',)); (y,) = Zy._first_ngens(1); Zy
        Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5

    A coercion map from the center to the Ore function field is set:

    Sage

        sage: K.has_coerce_map_from(Zy)
        True

    [Python]

        >>> from sage.all import *
        >>> K.has_coerce_map_from(Zy)
        True

    and pushout works:

    Sage

        sage: x.parent()
        Ore Polynomial Ring in x over Finite Field in t of size 5^3 twisted by t |--> t^5
        sage: y.parent()
        Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5
        sage: P = x + y; P
        x^3 + x
        sage: P.parent()
        Ore Function Field in x over Finite Field in t of size 5^3 twisted by t |--> t^5

    Python

        >>> from sage.all import *
        >>> x.parent()
        Ore Polynomial Ring in x over Finite Field in t of size 5^3 twisted by t |--> t^5
        >>> y.parent()
        Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5
        >>> P = x + y; P
        x^3 + x
        >>> P.parent()
        Ore Function Field in x over Finite Field in t of size 5^3 twisted by t |--> t^5

    A conversion map in the reverse direction is also set:

    Sage

        sage: Zy(x^(-6) + 2)
        (2*y^2 + 1)/y^2
        sage: Zy(1/x^2)
        Traceback (most recent call last):
        ...
        ValueError: x^(-2) is not in the center

    [Python]

        >>> from sage.all import *
        >>> Zy(x**(-Integer(6)) + Integer(2))
        (2*y^2 + 1)/y^2
        >>> Zy(Integer(1)/x**Integer(2))
        Traceback (most recent call last):
        ...
        ValueError: x^(-2) is not in the center

    ABOUT THE DEFAULT NAME OF THE CENTRAL VARIABLE:

    A priori, the default is `z`.

    However, a variable name is given the first time this method is called, the given name become the default for the next calls:

    Sage

        sage: k.<t> = GF(11^3)
        sage: phi = k.frobenius_endomorphism()
        sage: S.<X> = k['X', phi]
        sage: K = S.fraction_field()
        sage: C.<u> = K.center()  # first call
        sage: C
        Fraction Field of Univariate Polynomial Ring in u over Finite Field of size 11
        sage: K.center()  # second call: the variable name is still u
        Fraction Field of Univariate Polynomial Ring in u over Finite Field of size 11

    Python

        >>> from sage.all import *
        >>> k = GF(Integer(11)**Integer(3), names=('t',)); (t,) = k._first_ngens(1)
        >>> phi = k.frobenius_endomorphism()
        >>> S = k['X', phi]; (X,) = S._first_ngens(1)
        >>> K = S.fraction_field()
        >>> C = K.center(names=('u',)); (u,) = C._first_ngens(1)# first call
        >>> C
        Fraction Field of Univariate Polynomial Ring in u over Finite Field of size 11
        >>> K.center()  # second call: the variable name is still u
        Fraction Field of Univariate Polynomial Ring in u over Finite Field of size 11

    We can update the default variable name by passing in the argument `default=True`:

    Sage

        sage: D.<v> = K.center(default=True)
        sage: D
        Fraction Field of Univariate Polynomial Ring in v over Finite Field of size 11
        sage: K.center()
        Fraction Field of Univariate Polynomial Ring in v over Finite Field of size 11

    [Python]

        >>> from sage.all import *
        >>> D = K.center(default=True, names=('v',)); (v,) = D._first_ngens(1)
        >>> D
        Fraction Field of Univariate Polynomial Ring in v over Finite Field of size 11
        >>> K.center()
        Fraction Field of Univariate Polynomial Ring in v over Finite Field of size 11

class sage.rings.polynomial.ore_function_field.SectionOreFunctionCenterInjection(embed)

  Bases: `Section`

  Section of the canonical injection of the center of a Ore function field into this field