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