# An element in the fraction field of a Ore polynomial ring.¶

AUTHOR:

• Xavier Caruso (2020-05)

class sage.rings.polynomial.ore_function_element.ConstantOreFunctionSection

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)

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 ring

• var – 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()
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

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()
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()
sage: g = (t*u) / (s*u)
sage: g.right_denominator()
x + a

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()
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)

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)

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 or None (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 (see sage.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 or None (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 (see sage.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)