Elements of function fields¶
Sage provides arithmetic with elements of function fields.
EXAMPLES:
Arithmetic with rational functions:
sage: K.<t> = FunctionField(QQ)
sage: f = t - 1
sage: g = t^2 - 3
sage: h = f^2/g^3
sage: h.valuation(t-1)
2
sage: h.valuation(t)
0
sage: h.valuation(t^2 - 3)
-3
>>> from sage.all import *
>>> K = FunctionField(QQ, names=('t',)); (t,) = K._first_ngens(1)
>>> f = t - Integer(1)
>>> g = t**Integer(2) - Integer(3)
>>> h = f**Integer(2)/g**Integer(3)
>>> h.valuation(t-Integer(1))
2
>>> h.valuation(t)
0
>>> h.valuation(t**Integer(2) - Integer(3))
-3
Derivatives of elements in separable extensions:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field
sage: (y^3 + x).derivative() # needs sage.rings.finite_rings sage.rings.function_field
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
>>> from sage.all import *
>>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings
>>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field
>>> (y**Integer(3) + x).derivative() # needs sage.rings.finite_rings sage.rings.function_field
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
The divisor of an element of a global function field:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field
sage: y.divisor() # needs sage.rings.function_field
- Place (1/x, 1/x*y)
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
>>> from sage.all import *
>>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)
>>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.function_field
>>> y.divisor() # needs sage.rings.function_field
- Place (1/x, 1/x*y)
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
AUTHORS:
William Stein: initial version
Robert Bradshaw (2010-05-27): cythonize function field elements
Julian Rueth (2011-06-28, 2020-09-01): treat zero correctly; implement nth_root/is_nth_power
Maarten Derickx (2011-09-11): added doctests, fixed pickling
Kwankyu Lee (2017-04-30): added elements for global function fields
Vincent Macri (2024-09-03): added subs method
- class sage.rings.function_field.element.FunctionFieldElement[source]¶
Bases:
FieldElement
Abstract base class for function field elements.
EXAMPLES:
sage: t = FunctionField(QQ,'t').gen() sage: isinstance(t, sage.rings.function_field.element.FunctionFieldElement) True
>>> from sage.all import * >>> t = FunctionField(QQ,'t').gen() >>> isinstance(t, sage.rings.function_field.element.FunctionFieldElement) True
- characteristic_polynomial(*args, **kwds)[source]¶
Return the characteristic polynomial of the element. Give an optional input string to name the variable in the characteristic polynomial.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: x.characteristic_polynomial('W') # needs sage.modules W - x sage: # needs sage.rings.function_field sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[] sage: M.<z> = L.extension(z^3 - y^2*z + x) sage: y.characteristic_polynomial('W') W^2 - x*W + 4*x^3 sage: z.characteristic_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> x.characteristic_polynomial('W') # needs sage.modules W - x >>> # needs sage.rings.function_field >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1); R = L['z']; (z,) = R._first_ngens(1) >>> M = L.extension(z**Integer(3) - y**Integer(2)*z + x, names=('z',)); (z,) = M._first_ngens(1) >>> y.characteristic_polynomial('W') W^2 - x*W + 4*x^3 >>> z.characteristic_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
- charpoly(*args, **kwds)[source]¶
Return the characteristic polynomial of the element. Give an optional input string to name the variable in the characteristic polynomial.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: x.characteristic_polynomial('W') # needs sage.modules W - x sage: # needs sage.rings.function_field sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[] sage: M.<z> = L.extension(z^3 - y^2*z + x) sage: y.characteristic_polynomial('W') W^2 - x*W + 4*x^3 sage: z.characteristic_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> x.characteristic_polynomial('W') # needs sage.modules W - x >>> # needs sage.rings.function_field >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1); R = L['z']; (z,) = R._first_ngens(1) >>> M = L.extension(z**Integer(3) - y**Integer(2)*z + x, names=('z',)); (z,) = M._first_ngens(1) >>> y.characteristic_polynomial('W') W^2 - x*W + 4*x^3 >>> z.characteristic_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
- degree()[source]¶
Return the max degree between the denominator and numerator.
EXAMPLES:
sage: FF.<t> = FunctionField(QQ) sage: f = (t^2 + 3) / (t^3 - 1/3); f (t^2 + 3)/(t^3 - 1/3) sage: f.degree() 3 sage: FF.<t> = FunctionField(QQ) sage: f = (t+8); f t + 8 sage: f.degree() 1
>>> from sage.all import * >>> FF = FunctionField(QQ, names=('t',)); (t,) = FF._first_ngens(1) >>> f = (t**Integer(2) + Integer(3)) / (t**Integer(3) - Integer(1)/Integer(3)); f (t^2 + 3)/(t^3 - 1/3) >>> f.degree() 3 >>> FF = FunctionField(QQ, names=('t',)); (t,) = FF._first_ngens(1) >>> f = (t+Integer(8)); f t + 8 >>> f.degree() 1
- derivative()[source]¶
Return the derivative of the element.
The derivative is with respect to the generator of the base rational function field, over which the function field is a separable extension.
EXAMPLES:
sage: K.<t> = FunctionField(QQ) sage: f = (t + 1) / (t^2 - 1/3) sage: f.derivative() # needs sage.modules (-t^2 - 2*t - 1/3)/(t^4 - 2/3*t^2 + 1/9) sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (y^3 + x).derivative() # needs sage.rings.finite_rings sage.rings.function_field ((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
>>> from sage.all import * >>> K = FunctionField(QQ, names=('t',)); (t,) = K._first_ngens(1) >>> f = (t + Integer(1)) / (t**Integer(2) - Integer(1)/Integer(3)) >>> f.derivative() # needs sage.modules (-t^2 - 2*t - 1/3)/(t^4 - 2/3*t^2 + 1/9) >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (y**Integer(3) + x).derivative() # needs sage.rings.finite_rings sage.rings.function_field ((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
- differential()[source]¶
Return the differential \(dx\) where \(x\) is the element.
EXAMPLES:
sage: K.<t> = FunctionField(QQ) sage: f = 1 / t sage: f.differential() # needs sage.modules (-1/t^2) d(t) sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x +1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (y^3 + x).differential() # needs sage.rings.finite_rings sage.rings.function_field (((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3) d(x)
>>> from sage.all import * >>> K = FunctionField(QQ, names=('t',)); (t,) = K._first_ngens(1) >>> f = Integer(1) / t >>> f.differential() # needs sage.modules (-1/t^2) d(t) >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x +Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (y**Integer(3) + x).differential() # needs sage.rings.finite_rings sage.rings.function_field (((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3) d(x)
- divisor()[source]¶
Return the divisor of the element.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)) sage: f = 1/(x^3 + x^2 + x) sage: f.divisor() # needs sage.libs.pari sage.modules 3*Place (1/x) - Place (x) - Place (x^2 + x + 1)
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1) >>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x) >>> f.divisor() # needs sage.libs.pari sage.modules 3*Place (1/x) - Place (x) - Place (x^2 + x + 1)
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field sage: y.divisor() # needs sage.rings.function_field - Place (1/x, 1/x*y) - Place (x, x*y) + 2*Place (x + 1, x*y)
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1) >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.function_field >>> y.divisor() # needs sage.rings.function_field - Place (1/x, 1/x*y) - Place (x, x*y) + 2*Place (x + 1, x*y)
- divisor_of_poles()[source]¶
Return the divisor of poles for the element.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)) sage: f = 1/(x^3 + x^2 + x) sage: f.divisor_of_poles() # needs sage.libs.pari sage.modules Place (x) + Place (x^2 + x + 1)
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1) >>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x) >>> f.divisor_of_poles() # needs sage.libs.pari sage.modules Place (x) + Place (x^2 + x + 1)
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (x/y).divisor_of_poles() # needs sage.rings.finite_rings sage.rings.function_field Place (1/x, 1/x*y) + 2*Place (x + 1, x*y)
>>> from sage.all import * >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (x/y).divisor_of_poles() # needs sage.rings.finite_rings sage.rings.function_field Place (1/x, 1/x*y) + 2*Place (x + 1, x*y)
- divisor_of_zeros()[source]¶
Return the divisor of zeros for the element.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)) sage: f = 1/(x^3 + x^2 + x) sage: f.divisor_of_zeros() # needs sage.libs.pari sage.modules 3*Place (1/x)
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1) >>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x) >>> f.divisor_of_zeros() # needs sage.libs.pari sage.modules 3*Place (1/x)
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (x/y).divisor_of_zeros() # needs sage.rings.finite_rings sage.rings.function_field 3*Place (x, x*y)
>>> from sage.all import * >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (x/y).divisor_of_zeros() # needs sage.rings.finite_rings sage.rings.function_field 3*Place (x, x*y)
- evaluate(place)[source]¶
Return the value of the element at the place.
INPUT:
place
– a function field place
OUTPUT:
If the element is in the valuation ring at the place, then an element in the residue field at the place is returned. Otherwise, a
ValueError
is raised.EXAMPLES:
sage: K.<t> = FunctionField(GF(5)) sage: p = K.place_infinite() sage: f = 1/t^2 + 3 sage: f.evaluate(p) 3
>>> from sage.all import * >>> K = FunctionField(GF(Integer(5)), names=('t',)); (t,) = K._first_ngens(1) >>> p = K.place_infinite() >>> f = Integer(1)/t**Integer(2) + Integer(3) >>> f.evaluate(p) 3
sage: # needs sage.rings.finite_rings sage.rings.function_field sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) sage: p, = L.places_infinite() sage: p, = L.places_infinite() sage: (y + x).evaluate(p) Traceback (most recent call last): ... ValueError: has a pole at the place sage: (y/x + 1).evaluate(p) 1
>>> from sage.all import * >>> # needs sage.rings.finite_rings sage.rings.function_field >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1) >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1) >>> p, = L.places_infinite() >>> p, = L.places_infinite() >>> (y + x).evaluate(p) Traceback (most recent call last): ... ValueError: has a pole at the place >>> (y/x + Integer(1)).evaluate(p) 1
- higher_derivative(i, separating_element=None)[source]¶
Return the \(i\)-th derivative of the element with respect to the separating element.
INPUT:
i
– nonnegative integerseparating_element
– a separating element of the function field; the default is the generator of the rational function field
EXAMPLES:
sage: K.<t> = FunctionField(GF(2)) sage: f = t^2 sage: f.higher_derivative(2) # needs sage.rings.function_field 1
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('t',)); (t,) = K._first_ngens(1) >>> f = t**Integer(2) >>> f.higher_derivative(Integer(2)) # needs sage.rings.function_field 1
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (y^3 + x).higher_derivative(2) # needs sage.rings.finite_rings sage.rings.function_field 1/x^3*y + (x^6 + x^4 + x^3 + x^2 + x + 1)/x^5
>>> from sage.all import * >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (y**Integer(3) + x).higher_derivative(Integer(2)) # needs sage.rings.finite_rings sage.rings.function_field 1/x^3*y + (x^6 + x^4 + x^3 + x^2 + x + 1)/x^5
- is_integral()[source]¶
Determine if the element is integral over the maximal order of the base field.
EXAMPLES:
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) sage: y.is_integral() True sage: (y/x).is_integral() True sage: (y/x)^2 - (y/x) + 4*x 0 sage: (y/x^2).is_integral() False sage: (y/x).minimal_polynomial('W') W^2 - W + 4*x
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1) >>> y.is_integral() True >>> (y/x).is_integral() True >>> (y/x)**Integer(2) - (y/x) + Integer(4)*x 0 >>> (y/x**Integer(2)).is_integral() False >>> (y/x).minimal_polynomial('W') W^2 - W + 4*x
- is_nth_power(n)[source]¶
Return whether this element is an
n
-th power in the rational function field.INPUT:
n
– integer
OUTPUT:
Returns
True
if there is an element \(a\) in the function field such that this element equals \(a^n\).See also
EXAMPLES:
sage: K.<x> = FunctionField(GF(3)) sage: f = (x+1)/(x-1) sage: f.is_nth_power(2) False
>>> from sage.all import * >>> K = FunctionField(GF(Integer(3)), names=('x',)); (x,) = K._first_ngens(1) >>> f = (x+Integer(1))/(x-Integer(1)) >>> f.is_nth_power(Integer(2)) False
- matrix(base=None)[source]¶
Return the matrix of multiplication by this element, interpreting this element as an element of a vector space over
base
.INPUT:
base
– a function field (default:None
); ifNone
, then the matrix is formed over the base field of this function field
EXAMPLES:
A rational function field:
sage: K.<t> = FunctionField(QQ) sage: t.matrix() # needs sage.modules [t] sage: (1/(t+1)).matrix() # needs sage.modules [1/(t + 1)]
>>> from sage.all import * >>> K = FunctionField(QQ, names=('t',)); (t,) = K._first_ngens(1) >>> t.matrix() # needs sage.modules [t] >>> (Integer(1)/(t+Integer(1))).matrix() # needs sage.modules [1/(t + 1)]
Now an example in a nontrivial extension of a rational function field:
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) sage: y.matrix() [ 0 1] [-4*x^3 x] sage: y.matrix().charpoly('Z') Z^2 - x*Z + 4*x^3
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1) >>> y.matrix() [ 0 1] [-4*x^3 x] >>> y.matrix().charpoly('Z') Z^2 - x*Z + 4*x^3
An example in a relative extension, where neither function field is rational:
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) sage: M.<T> = L[] sage: Z.<alpha> = L.extension(T^3 - y^2*T + x) sage: alpha.matrix() [ 0 1 0] [ 0 0 1] [ -x x*y - 4*x^3 0] sage: alpha.matrix(K) [ 0 0 1 0 0 0] [ 0 0 0 1 0 0] [ 0 0 0 0 1 0] [ 0 0 0 0 0 1] [ -x 0 -4*x^3 x 0 0] [ 0 -x -4*x^4 -4*x^3 + x^2 0 0] sage: alpha.matrix(Z) [alpha]
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1) >>> R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1) >>> M = L['T']; (T,) = M._first_ngens(1) >>> Z = L.extension(T**Integer(3) - y**Integer(2)*T + x, names=('alpha',)); (alpha,) = Z._first_ngens(1) >>> alpha.matrix() [ 0 1 0] [ 0 0 1] [ -x x*y - 4*x^3 0] >>> alpha.matrix(K) [ 0 0 1 0 0 0] [ 0 0 0 1 0 0] [ 0 0 0 0 1 0] [ 0 0 0 0 0 1] [ -x 0 -4*x^3 x 0 0] [ 0 -x -4*x^4 -4*x^3 + x^2 0 0] >>> alpha.matrix(Z) [alpha]
We show that this matrix does indeed work as expected when making a vector space from a function field:
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^5 - (x^3 + 2*x*y + 1/x)) sage: V, from_V, to_V = L.vector_space() sage: y5 = to_V(y^5); y5 ((x^4 + 1)/x, 2*x, 0, 0, 0) sage: y4y = to_V(y^4) * y.matrix(); y4y ((x^4 + 1)/x, 2*x, 0, 0, 0) sage: y5 == y4y True
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1) >>> R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(5) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/x), names=('y',)); (y,) = L._first_ngens(1) >>> V, from_V, to_V = L.vector_space() >>> y5 = to_V(y**Integer(5)); y5 ((x^4 + 1)/x, 2*x, 0, 0, 0) >>> y4y = to_V(y**Integer(4)) * y.matrix(); y4y ((x^4 + 1)/x, 2*x, 0, 0, 0) >>> y5 == y4y True
- minimal_polynomial(*args, **kwds)[source]¶
Return the minimal polynomial of the element. Give an optional input string to name the variable in the characteristic polynomial.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: x.minimal_polynomial('W') # needs sage.modules W - x sage: # needs sage.rings.function_field sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[] sage: M.<z> = L.extension(z^3 - y^2*z + x) sage: y.minimal_polynomial('W') W^2 - x*W + 4*x^3 sage: z.minimal_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> x.minimal_polynomial('W') # needs sage.modules W - x >>> # needs sage.rings.function_field >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1); R = L['z']; (z,) = R._first_ngens(1) >>> M = L.extension(z**Integer(3) - y**Integer(2)*z + x, names=('z',)); (z,) = M._first_ngens(1) >>> y.minimal_polynomial('W') W^2 - x*W + 4*x^3 >>> z.minimal_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
- minpoly(*args, **kwds)[source]¶
Return the minimal polynomial of the element. Give an optional input string to name the variable in the characteristic polynomial.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: x.minimal_polynomial('W') # needs sage.modules W - x sage: # needs sage.rings.function_field sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[] sage: M.<z> = L.extension(z^3 - y^2*z + x) sage: y.minimal_polynomial('W') W^2 - x*W + 4*x^3 sage: z.minimal_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> x.minimal_polynomial('W') # needs sage.modules W - x >>> # needs sage.rings.function_field >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1); R = L['z']; (z,) = R._first_ngens(1) >>> M = L.extension(z**Integer(3) - y**Integer(2)*z + x, names=('z',)); (z,) = M._first_ngens(1) >>> y.minimal_polynomial('W') W^2 - x*W + 4*x^3 >>> z.minimal_polynomial('W') W^3 + (-x*y + 4*x^3)*W + x
- norm()[source]¶
Return the norm of the element.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) # needs sage.rings.function_field sage: y.norm() # needs sage.rings.function_field 4*x^3
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.function_field >>> y.norm() # needs sage.rings.function_field 4*x^3
The norm is relative:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3); R.<z> = L[] # needs sage.rings.function_field sage: M.<z> = L.extension(z^3 - y^2*z + x) # needs sage.rings.function_field sage: z.norm() # needs sage.rings.function_field -x sage: z.norm().parent() # needs sage.rings.function_field Function field in y defined by y^2 - x*y + 4*x^3
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1); R = L['z']; (z,) = R._first_ngens(1)# needs sage.rings.function_field >>> M = L.extension(z**Integer(3) - y**Integer(2)*z + x, names=('z',)); (z,) = M._first_ngens(1)# needs sage.rings.function_field >>> z.norm() # needs sage.rings.function_field -x >>> z.norm().parent() # needs sage.rings.function_field Function field in y defined by y^2 - x*y + 4*x^3
- nth_root(n)[source]¶
Return an
n
-th root of this element in the function field.INPUT:
n
– integer
OUTPUT:
Returns an element
a
in the function field such that this element equals \(a^n\). Raises an error if no such element exists.See also
EXAMPLES:
sage: K.<x> = FunctionField(GF(3)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^2 - x) # needs sage.rings.function_field sage: L(y^27).nth_root(27) # needs sage.rings.function_field y
>>> from sage.all import * >>> K = FunctionField(GF(Integer(3)), names=('x',)); (x,) = K._first_ngens(1) >>> R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.function_field >>> L(y**Integer(27)).nth_root(Integer(27)) # needs sage.rings.function_field y
- poles()[source]¶
Return the list of the poles of the element.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)) sage: f = 1/(x^3 + x^2 + x) sage: f.poles() # needs sage.libs.pari sage.modules [Place (x), Place (x^2 + x + 1)]
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1) >>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x) >>> f.poles() # needs sage.libs.pari sage.modules [Place (x), Place (x^2 + x + 1)]
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (x/y).poles() # needs sage.rings.finite_rings sage.rings.function_field [Place (1/x, 1/x*y), Place (x + 1, x*y)]
>>> from sage.all import * >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (x/y).poles() # needs sage.rings.finite_rings sage.rings.function_field [Place (1/x, 1/x*y), Place (x + 1, x*y)]
- subs(in_dict=None, **kwds)[source]¶
Substitute the given generators with given values while not touching other generators.
INPUT:
in_dict
– (optional) dictionary of inputs**kwds
– named parameters
OUTPUT: new object if substitution is possible, otherwise
self
EXAMPLES:
Basic substitution:
sage: K = GF(7) sage: Kx.<x> = FunctionField(K) sage: y = polygen(Kx) sage: f = x^6 + 3; f x^6 + 3
>>> from sage.all import * >>> K = GF(Integer(7)) >>> Kx = FunctionField(K, names=('x',)); (x,) = Kx._first_ngens(1) >>> y = polygen(Kx) >>> f = x**Integer(6) + Integer(3); f x^6 + 3
We also substitute the generators in any base fields:
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x)) sage: S.<t> = L[] sage: M.<t> = L.extension(t^2 - x*y) sage: f = 7 * t + 3*x*y sage: f.subs(t=9) 3*x*y + 63 sage: f.subs(x=2, y=4) 7*t + 24 sage: f.subs(t=1, x=2, y=3) 25
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1) >>> R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(3) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/x), names=('y',)); (y,) = L._first_ngens(1) >>> S = L['t']; (t,) = S._first_ngens(1) >>> M = L.extension(t**Integer(2) - x*y, names=('t',)); (t,) = M._first_ngens(1) >>> f = Integer(7) * t + Integer(3)*x*y >>> f.subs(t=Integer(9)) 3*x*y + 63 >>> f.subs(x=Integer(2), y=Integer(4)) 7*t + 24 >>> f.subs(t=Integer(1), x=Integer(2), y=Integer(3)) 25
Because of the possibility of extension fields, a generator to substitute must be specified:
sage: K.<x> = FunctionField(QQ) sage: f = x sage: f.subs(2) Traceback (most recent call last): ... TypeError: in_dict must be a dict sage: # needs sage.rings.function_field sage: R.<y> = K[] sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x)) sage: f = x + y sage: f.subs(0) Traceback (most recent call last): ... TypeError: in_dict must be a dict
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1) >>> f = x >>> f.subs(Integer(2)) Traceback (most recent call last): ... TypeError: in_dict must be a dict >>> # needs sage.rings.function_field >>> R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(3) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/x), names=('y',)); (y,) = L._first_ngens(1) >>> f = x + y >>> f.subs(Integer(0)) Traceback (most recent call last): ... TypeError: in_dict must be a dict
We can also substitute using dictionary syntax:
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ) sage: R.<y> = K[] sage: L.<y> = K.extension(y^3 - (x^3 + 2*x*y + 1/x)) sage: S.<t> = L[] sage: M.<t> = L.extension(t^2 - x*y) sage: f = x + y + t sage: f.subs({x: 1, y: 3, t: 4}) 8 sage: f.subs({x: 1, t: 4}) y + 5
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1) >>> R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(3) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/x), names=('y',)); (y,) = L._first_ngens(1) >>> S = L['t']; (t,) = S._first_ngens(1) >>> M = L.extension(t**Integer(2) - x*y, names=('t',)); (t,) = M._first_ngens(1) >>> f = x + y + t >>> f.subs({x: Integer(1), y: Integer(3), t: Integer(4)}) 8 >>> f.subs({x: Integer(1), t: Integer(4)}) y + 5
- trace()[source]¶
Return the trace of the element.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) # needs sage.rings.function_field sage: y.trace() # needs sage.rings.function_field x
>>> from sage.all import * >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); R = K['y']; (y,) = R._first_ngens(1) >>> L = K.extension(y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.function_field >>> y.trace() # needs sage.rings.function_field x
- valuation(place)[source]¶
Return the valuation of the element at the place.
INPUT:
place
– a place of the function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.function_field sage: p = L.places_infinite()[0] # needs sage.rings.function_field sage: y.valuation(p) # needs sage.rings.function_field -1
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1) >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.function_field >>> p = L.places_infinite()[Integer(0)] # needs sage.rings.function_field >>> y.valuation(p) # needs sage.rings.function_field -1
sage: # needs sage.rings.function_field sage: K.<x> = FunctionField(QQ); _.<Y> = K[] sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) sage: O = L.maximal_order() sage: p = O.ideal(x - 1).place() sage: y.valuation(p) 0
>>> from sage.all import * >>> # needs sage.rings.function_field >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1) >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1) >>> O = L.maximal_order() >>> p = O.ideal(x - Integer(1)).place() >>> y.valuation(p) 0
- zeros()[source]¶
Return the list of the zeros of the element.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)) sage: f = 1/(x^3 + x^2 + x) sage: f.zeros() # needs sage.libs.pari sage.modules [Place (1/x)]
>>> from sage.all import * >>> K = FunctionField(GF(Integer(2)), names=('x',)); (x,) = K._first_ngens(1) >>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x) >>> f.zeros() # needs sage.libs.pari sage.modules [Place (1/x)]
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] # needs sage.rings.finite_rings sage: L.<y> = K.extension(Y^2 + Y + x + 1/x) # needs sage.rings.finite_rings sage.rings.function_field sage: (x/y).zeros() # needs sage.rings.finite_rings sage.rings.function_field [Place (x, x*y)]
>>> from sage.all import * >>> K = FunctionField(GF(Integer(4)), names=('x',)); (x,) = K._first_ngens(1); _ = K['Y']; (Y,) = _._first_ngens(1)# needs sage.rings.finite_rings >>> L = K.extension(Y**Integer(2) + Y + x + Integer(1)/x, names=('y',)); (y,) = L._first_ngens(1)# needs sage.rings.finite_rings sage.rings.function_field >>> (x/y).zeros() # needs sage.rings.finite_rings sage.rings.function_field [Place (x, x*y)]
- sage.rings.function_field.element.is_FunctionFieldElement(x)[source]¶
Return
True
ifx
is any type of function field element.EXAMPLES:
sage: t = FunctionField(QQ,'t').gen() sage: sage.rings.function_field.element.is_FunctionFieldElement(t) doctest:warning... DeprecationWarning: The function is_FunctionFieldElement is deprecated; use '....parent() in FunctionFields()' instead. See https://github.com/sagemath/sage/issues/38289 for details. True sage: sage.rings.function_field.element.is_FunctionFieldElement(0) False
>>> from sage.all import * >>> t = FunctionField(QQ,'t').gen() >>> sage.rings.function_field.element.is_FunctionFieldElement(t) doctest:warning... DeprecationWarning: The function is_FunctionFieldElement is deprecated; use '....parent() in FunctionFields()' instead. See https://github.com/sagemath/sage/issues/38289 for details. True >>> sage.rings.function_field.element.is_FunctionFieldElement(Integer(0)) False
- sage.rings.function_field.element.make_FunctionFieldElement(parent, element_class, representing_element)[source]¶
Used for unpickling FunctionFieldElement objects (and subclasses).
EXAMPLES:
sage: from sage.rings.function_field.element import make_FunctionFieldElement sage: K.<x> = FunctionField(QQ) sage: make_FunctionFieldElement(K, K.element_class, (x+1)/x) (x + 1)/x
>>> from sage.all import * >>> from sage.rings.function_field.element import make_FunctionFieldElement >>> K = FunctionField(QQ, names=('x',)); (x,) = K._first_ngens(1) >>> make_FunctionFieldElement(K, K.element_class, (x+Integer(1))/x) (x + 1)/x