Fraction field elements of Ore polynomial rings#
AUTHOR:
Xavier Caruso (2020-05)
- class sage.rings.polynomial.ore_function_element.ConstantOreFunctionSection#
Bases:
Map
Representation of the canonical homomorphism from the constants of a Ore function field to the base field.
This class is needed by the coercion system.
EXAMPLES:
sage: from sage.rings.polynomial.ore_polynomial_element import ConstantOrePolynomialSection sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: K = S.fraction_field() sage: iota = K.coerce_map_from(k) sage: sigma = iota.section() sage: sigma Generic map: From: Ore Function Field in x over Finite Field in a of size 5^3 twisted by a |--> a^5 To: Finite Field in a of size 5^3
- class sage.rings.polynomial.ore_function_element.OreFunction(parent, numerator, denominator=None, simplify=True)#
Bases:
AlgebraElement
An element in a Ore function field.
- hilbert_shift(s, var=None)#
Return this Ore function with variable shifted by \(s\), i.e. if this Ore function is \(f(x)\), return \(f(x+s)\).
INPUT:
s
– an element in the base ringvar
– a string; the variable name
EXAMPLES:
sage: R.<t> = GF(7)[] sage: der = R.derivation() sage: A.<d> = R['d', der] sage: K = A.fraction_field() sage: f = 1 / (d-t) sage: f.hilbert_shift(t) d^(-1)
One can specify another variable name:
sage: f.hilbert_shift(t, var='x') x^(-1)
When the twisting morphism is not trivial, the output lies in a different Ore polynomial ring:
sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: K = S.fraction_field() sage: f = (x-a)^(-2) sage: g = f.hilbert_shift(a); g x^(-2) sage: g.parent() Ore Function Field in x over Finite Field in a of size 5^3 twisted by a |--> a^5 and a*([a |--> a^5] - id) sage: g.parent() is S False
This behavior ensures that the Hilbert shift by a fixed element defines an homomorphism of fields:
sage: U = K.random_element(degree=5) sage: V = K.random_element(degree=5) sage: s = k.random_element() sage: (U+V).hilbert_shift(s) == U.hilbert_shift(s) + V.hilbert_shift(s) True sage: (U*V).hilbert_shift(s) == U.hilbert_shift(s) * V.hilbert_shift(s) True
- is_zero()#
Return
True
if this element is equal to zero.EXAMPLES:
sage: R.<t> = GF(3)[] sage: der = R.derivation() sage: A.<d> = R['x', der] sage: f = t/d sage: f.is_zero() False sage: (f-f).is_zero() True
- left_denominator()#
Return \(s\) if this element reads \(s^{-1} t\).
WARNING:
When the twisting morphism is bijective, there is a unique irreducible fraction of the form \(s^{-1} t\) representing this element. Here irreducible means that \(s\) and \(t\) have no nontrivial common left divisor. Under this additional assumption, this method always returns this distinguished denominator \(s\).
On the contrary, when the twisting morphism is not bijective, this method returns the denominator of some fraction representing the input element. However, the software guarantees that the method
right_numerator()
outputs the numerator of the same fraction.EXAMPLES:
sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: s = x + a sage: t = x^2 + a*x + a^2 sage: f = s^(-1) * t sage: f.left_denominator() x + a
In the example below, a simplification occurs:
sage: u = S.random_element(degree=2) sage: g = (u*s)^(-1) * (u*t) sage: g.left_denominator() x + a
When the twisting morphism is not invertible, simplifications do not occur in general:
sage: R.<z> = GF(11)[] sage: sigma = R.hom([z^2]) sage: S.<x> = R['x', sigma] sage: s = (x + z)^2 sage: t = (x + z) * (x^2 + z^2) sage: f = s^(-1) * t sage: f.left_denominator() x^2 + (z^2 + z)*x + z^2
However, the following always holds true:
sage: f == f.left_denominator()^(-1) * f.right_numerator() True
See also
- left_numerator()#
Return \(t\) if this element reads \(t s^{-1}\).
WARNING:
When the twisting morphism is bijective, there is a unique irreducible fraction of the form \(t s^{-1}\) representing this element. Here irreducible means that \(s\) and \(t\) have no nontrivial common right divisor. Under this additional assumption, this method always returns this distinguished numerator \(t\).
On the contrary, when the twisting morphism is not bijective, the existence of the writing \(t s^{-1}\) is not guaranteed in general. In this case, this method raises an error.
EXAMPLES:
sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: s = x + a sage: t = x^2 + a*x + a^2 sage: f = t/s sage: f.left_numerator() x^2 + a*x + a^2
In the example below, a simplification occurs:
sage: u = S.random_element(degree=2) sage: g = (t*u) / (s*u) sage: g.left_numerator() x^2 + a*x + a^2
- right_denominator()#
Return \(s\) if this element reads \(t s^{-1}\).
WARNING:
When the twisting morphism is bijective, there is a unique irreducible fraction of the form \(t s^{-1}\) representing this element. Here irreducible means that \(s\) and \(t\) have no nontrivial common right divisor. Under this additional assumption, this method always returns this distinguished denominator \(s\).
On the contrary, when the twisting morphism is not bijective, the existence of the writing \(t s^{-1}\) is not guaranteed in general. In this case, this method raises an error.
EXAMPLES:
sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: s = x + a sage: t = x^2 + a*x + a^2 sage: f = t/s sage: f.right_denominator() x + a
In the example below, a simplification occurs:
sage: u = S.random_element(degree=2) sage: g = (t*u) / (s*u) sage: g.right_denominator() x + a
See also
- right_numerator()#
Return \(t\) if this element reads \(s^{-1} t\).
WARNING:
When the twisting morphism is bijective, there is a unique irreducible fraction of the form \(s^{-1} t\) representing this element. Here irreducible means that \(s\) and \(t\) have no nontrivial common left divisor. Under this additional assumption, this method always returns this distinguished numerator \(t\).
On the contrary, when the twisting morphism is not bijective, this method returns the numerator of some fraction representing the input element. However, the software guarantees that the method
left_denominator()
outputs the numerator of the same fraction.EXAMPLES:
sage: k.<a> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: s = x + a sage: t = x^2 + a*x + a^2 sage: f = s^(-1) * t sage: f.right_numerator() x^2 + a*x + a^2
In the example below, a simplification occurs:
sage: u = S.random_element(degree=2) sage: g = (u*s)^(-1) * (u*t) sage: g.right_numerator() x^2 + a*x + a^2
- class sage.rings.polynomial.ore_function_element.OreFunctionBaseringInjection(domain, codomain)#
Bases:
Morphism
Representation of the canonical homomorphism from a field \(k\) into a Ore function field over \(k\).
This class is needed by the coercion system.
- an_element()#
Return an element of the codomain of the ring homomorphism.
EXAMPLES:
sage: k.<t> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x',Frob] sage: K = S.fraction_field() sage: m = K.coerce_map_from(k) sage: m.an_element() x
- section()#
Return the canonical homomorphism from the constants of a Ore function filed to its base field.
- class sage.rings.polynomial.ore_function_element.OreFunction_with_large_center(parent, numerator, denominator=None, simplify=True)#
Bases:
OreFunction
A special class for elements of Ore function fields whose center has finite index.
- reduced_norm(var=None)#
Return the reduced norm of this Ore function.
INPUT:
var
– a string orNone
(default:None
); the name of the central variable
EXAMPLES:
sage: k.<t> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: K = S.fraction_field() sage: a = (x + t) / (x^2 + t^2) sage: N = a.reduced_norm(); N (z + 2)/(z^2 + 4)
The reduced norm lies in the center of \(S\), which is the fraction field of a univariate polynomial ring in the variable \(z = x^3\) over \(GF(5)\).
sage: N.parent() Fraction Field of Univariate Polynomial Ring in z over Finite Field of size 5 sage: N.parent() is K.center() True
We can use explicit conversion to view
N
as a skew polynomial:sage: K(N) (x^6 + 4)^(-1) * (x^3 + 2)
By default, the name of the central variable is usually
z
(seesage.rings.polynomial.skew_polynomial_ring.SkewPolynomiaRing_finite_order.center()
for more details about this). However, the user can specify a different variable name if desired:sage: a.reduced_norm(var='u') (u + 2)/(u^2 + 4)
- reduced_trace(var=None)#
Return the reduced trace of this element.
INPUT:
var
– a string orNone
(default:None
); the name of the central variable
EXAMPLES:
sage: k.<t> = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: S.<x> = k['x', Frob] sage: K = S.fraction_field() sage: a = 1 / (x^2 + t) sage: tr = a.reduced_trace(); tr 3/(z^2 + 2)
The reduced trace lies in the center of \(S\), which is the fraction field of a univariate polynomial ring in the variable \(z = x^3\) over \(GF(5)\).
sage: tr.parent() Fraction Field of Univariate Polynomial Ring in z over Finite Field of size 5 sage: tr.parent() is K.center() True
We can use explicit conversion to view
tr
as a Ore function:sage: K(tr) (x^6 + 2)^(-1) * 3
By default, the name of the central variable is usually
z
(seesage.rings.polynomial.skew_polynomial_ring.OreFunctionField_with_large_center.center()
for more details about this). However, the user can specify a different variable name if desired:sage: a.reduced_trace(var='u') 3/(u^2 + 2)