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: 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
>>> 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: f = 1/d
sage: f
d^(-1)
sage: f.parent() is K
True
>>> 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: g = t / d
sage: g
(d - 1/t)^(-1) * t
>>> from sage.all import *
>>> g = t / d
>>> g
(d - 1/t)^(-1) * t
The left numerator and right denominator are accessible as follows:
sage: g.left_numerator()
t
sage: g.right_denominator()
d
>>> 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: g.left_denominator()
d - 1/t
sage: g.right_numerator()
t
>>> 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: # needs sage.rings.function_field
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
>>> from sage.all import *
>>> # needs sage.rings.function_field
>>> 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: # needs sage.rings.function_field
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: # needs sage.rings.function_field
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
>>> from sage.all import *
>>> # needs sage.rings.function_field
>>> 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)
>>> # needs sage.rings.function_field
>>> 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: # needs sage.rings.function_field
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)
>>> from sage.all import *
>>> # needs sage.rings.function_field
>>> 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: # needs sage.rings.function_field
sage: g * f
(d^2 + t*d + 1)^(-1)
sage: g^(-1) * f
(d - 1/t)^(-1) * (d + (t^2 - 1)/t)
>>> from sage.all import *
>>> # needs sage.rings.function_field
>>> 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)[source]#
Bases:
RingHomomorphism
Canonical injection of the center of a Ore function field into this field.
- section()[source]#
Return a section of this morphism.
EXAMPLES:
sage: # needs sage.rings.finite_rings 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)
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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)[source]#
Bases:
Parent
,UniqueRepresentation
A class for fraction fields of Ore polynomial rings.
- Element = None#
- change_var(var)[source]#
Return the Ore function field in variable
var
with the same base ring, twisting morphism and twisting derivation asself
.INPUT:
var
– a string representing the name of the new variable.
EXAMPLES:
sage: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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()[source]#
Return the characteristic of this Ore function field.
EXAMPLES:
sage: R.<t> = QQ[] sage: sigma = R.hom([t+1]) sage: S = R['x',sigma] sage: S.fraction_field().characteristic() # needs sage.rings.function_field 0 sage: # needs sage.rings.finite_rings sage: k.<u> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S = k['y',Frob] sage: S.fraction_field().characteristic() # needs sage.rings.function_field 5
>>> 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() # needs sage.rings.function_field 0 >>> # needs sage.rings.finite_rings >>> 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() # needs sage.rings.function_field 5
- fraction_field()[source]#
Return the fraction field of this Ore function field, i.e. this Ore function field itself.
EXAMPLES:
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
>>> 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)[source]#
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: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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()[source]#
Return the tuple of generators of
self
.EXAMPLES:
sage: # needs sage.rings.finite_rings 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,)
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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()[source]#
Return a {name: variable} dictionary of the generators of this Ore function field.
EXAMPLES:
sage: # needs sage.rings.finite_rings 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}
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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_commutative()[source]#
Return
True
if this Ore function field is commutative, i.e. if the twisting morphism is the identity and the twisting derivation vanishes.EXAMPLES:
sage: # needs sage.rings.finite_rings sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: K = S.fraction_field() sage: K.is_commutative() False sage: T.<y> = k['y', Frob^3] sage: L = T.fraction_field() sage: L.is_commutative() True
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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.is_commutative() False >>> T = k['y', Frob**Integer(3)]; (y,) = T._first_ngens(1) >>> L = T.fraction_field() >>> L.is_commutative() True
- is_exact()[source]#
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: # needs sage.rings.finite_rings 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: # needs sage.rings.padics 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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 >>> # needs sage.rings.padics >>> 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)[source]#
Return always
True
since Ore function field are (skew) fields.EXAMPLES:
sage: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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()[source]#
Return
False
since Ore function field are not finite.EXAMPLES:
sage: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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()[source]#
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: # needs sage.rings.function_field sage.rings.real_mpfr 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
>>> from sage.all import * >>> # needs sage.rings.function_field sage.rings.real_mpfr >>> 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()[source]#
Return the number of generators of this Ore function field, which is \(1\).
EXAMPLES:
sage: # needs sage.rings.function_field sage.rings.real_mpfr 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
>>> from sage.all import * >>> # needs sage.rings.function_field sage.rings.real_mpfr >>> 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)[source]#
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: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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
- random_element(degree=2, monic=False, *args, **kwds)[source]#
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 numeratormonic
– (default:False
) ifTrue
, return a monic Ore function with monic numerator and denominator*args
,**kwds
– passed in to therandom_element()
method for the base ring
EXAMPLES:
sage: # needs sage.rings.finite_rings 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)
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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()[source]#
Return the twisting derivation defining this Ore function field or
None
if this Ore function field is not twisted by a derivation.EXAMPLES:
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: # needs sage.rings.finite_rings 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()
>>> 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 >>> # needs sage.rings.finite_rings >>> 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)[source]#
Return the twisting endomorphism defining this Ore function field iterated
n
times orNone
if this Ore function field is not twisted by an endomorphism.INPUT:
n
– an integer (default: 1)
EXAMPLES:
sage: R.<t> = QQ[] sage: sigma = R.hom([t+1]) sage: S.<x> = R['x', sigma] sage: K = S.fraction_field() # needs sage.rings.function_field sage: K.twisting_morphism() # needs sage.rings.function_field Ring endomorphism of Fraction Field of Univariate Polynomial Ring in t over Rational Field Defn: t |--> t + 1
>>> 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() # needs sage.rings.function_field >>> K.twisting_morphism() # needs sage.rings.function_field 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: der = R.derivation() sage: A.<d> = R['x', der] sage: F = A.fraction_field() # needs sage.rings.function_field sage: F.twisting_morphism() # needs sage.rings.function_field
>>> from sage.all import * >>> der = R.derivation() >>> A = R['x', der]; (d,) = A._first_ngens(1) >>> F = A.fraction_field() # needs sage.rings.function_field >>> F.twisting_morphism() # needs sage.rings.function_field
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)[source]#
Bases:
OreFunctionField
A specialized class for Ore polynomial fields whose center has finite index.
- center(name=None, names=None, default=False)[source]#
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
– a string orNone
(default:None
); the name for the central variabledefault
– a boolean (default:False
); ifTrue
, set the default variable name for the center toname
EXAMPLES:
sage: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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: K.center(name='y') # needs sage.rings.finite_rings Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5
>>> from sage.all import * >>> K.center(name='y') # needs sage.rings.finite_rings Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5
or use the bracket notation:
sage: Zy.<y> = K.center(); Zy # needs sage.rings.finite_rings Fraction Field of Univariate Polynomial Ring in y over Finite Field of size 5
>>> from sage.all import * >>> Zy = K.center(names=('y',)); (y,) = Zy._first_ngens(1); Zy # needs sage.rings.finite_rings 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: K.has_coerce_map_from(Zy) # needs sage.rings.finite_rings True
>>> from sage.all import * >>> K.has_coerce_map_from(Zy) # needs sage.rings.finite_rings True
and pushout works:
sage: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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: # needs sage.rings.finite_rings 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
>>> from sage.all import * >>> # needs sage.rings.finite_rings >>> 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