Differentials of function fields¶
Sage provides basic arithmetic with differentials of function fields. Advanced computations with differentials are available for global function fields.
EXAMPLES:
The module of differentials on a function field forms an one-dimensional vector space over the function field:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = K.extension(Y^3 + x + x^3*Y)
sage: f = x + y
sage: g = 1 / y
sage: df = f.differential()
sage: dg = g.differential()
sage: dfdg = f.derivative() / g.derivative()
sage: df == dfdg * dg
True
sage: df
(x*y^2 + 1/x*y + 1) d(x)
sage: df.parent()
Space of differentials of Function field in y defined by y^3 + x^3*y + x
We can compute a canonical divisor:
sage: k = df.divisor()
sage: k.degree()
4
sage: k.degree() == 2 * L.genus() - 2
True
Exact differentials vanish and logarithmic differentials are stable under the Cartier operation:
sage: df.cartier()
0
sage: w = 1/f * df
sage: w.cartier() == w
True
AUTHORS:
- Kwankyu Lee (2017-04-30): initial version
-
class
sage.rings.function_field.differential.
DifferentialsSpace
(field, category=None)¶ Bases:
sage.structure.unique_representation.UniqueRepresentation
,sage.structure.parent.Parent
Space of differentials of a function field.
INPUT:
field
– function field
EXAMPLES:
sage: K.<x>=FunctionField(GF(4)); _.<Y>=K[] sage: L.<y>=K.extension(Y^3+x+x^3*Y) sage: L.space_of_differentials() Space of differentials of Function field in y defined by y^3 + x^3*y + x
The space of differentials is a one-dimensional module over the function field. So a base differential is chosen to represent differentials. Usually the generator of the base rational function field is a separating element and used to generate the base differential. Otherwise a separating element is automatically found and used to generate the base differential relative to which other differentials are denoted:
sage: K.<x> = FunctionField(GF(5)) sage: R.<y> = K[] sage: L.<y> = K.extension(y^5 - 1/x) sage: L(x).differential() 0 sage: y.differential() d(y) sage: (y^2).differential() (2*y) d(y)
-
Element
¶ alias of
FunctionFieldDifferential
-
basis
()¶ Return a basis.
EXAMPLES:
sage: K.<x>=FunctionField(GF(4)); _.<Y>=K[] sage: L.<y>=K.extension(Y^3+x+x^3*Y) sage: S = L.space_of_differentials() sage: S.basis() Family (d(x),)
-
function_field
()¶ Return the function field to which the space of differentials is attached.
EXAMPLES:
sage: K.<x>=FunctionField(GF(4)); _.<Y>=K[] sage: L.<y>=K.extension(Y^3+x+x^3*Y) sage: S = L.space_of_differentials() sage: S.function_field() Function field in y defined by y^3 + x^3*y + x
-
class
sage.rings.function_field.differential.
DifferentialsSpaceInclusion
¶ Bases:
sage.categories.morphism.Morphism
Inclusion morphisms for extensions of function fields.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) sage: OK = K.space_of_differentials() sage: OL = L.space_of_differentials() sage: OL.coerce_map_from(OK) Inclusion morphism: From: Space of differentials of Rational function field in x over Rational Field To: Space of differentials of Function field in y defined by y^2 - x*y + 4*x^3
-
is_injective
()¶ Return
True
, since the inclusion morphism is injective.EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) sage: OK = K.space_of_differentials() sage: OL = L.space_of_differentials() sage: OL.coerce_map_from(OK).is_injective() True
-
is_surjective
()¶ Return
True
if the inclusion morphism is surjective.EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[] sage: L.<y> = K.extension(y^2 - x*y + 4*x^3) sage: OK = K.space_of_differentials() sage: OL = L.space_of_differentials() sage: OL.coerce_map_from(OK).is_surjective() False sage: S.<z> = L[] sage: M.<z> = L.extension(z - 1) sage: OM = M.space_of_differentials() sage: OM.coerce_map_from(OL).is_surjective() True
-
-
class
sage.rings.function_field.differential.
DifferentialsSpace_global
(field, category=None)¶ Bases:
sage.rings.function_field.differential.DifferentialsSpace
Space of differentials of a global function field.
INPUT:
field
– function field
EXAMPLES:
sage: K.<x>=FunctionField(GF(4)); _.<Y>=K[] sage: L.<y>=K.extension(Y^3+x+x^3*Y) sage: L.space_of_differentials() Space of differentials of Function field in y defined by y^3 + x^3*y + x
-
Element
¶ alias of
FunctionFieldDifferential_global
-
class
sage.rings.function_field.differential.
FunctionFieldDifferential
(parent, f, t=None)¶ Bases:
sage.structure.element.ModuleElement
Base class for differentials on function fields.
INPUT:
f
– element of the function fieldt
– element of the function field; if \(t\) is not specified, the generator of the base differential is assumed
EXAMPLES:
sage: F.<x>=FunctionField(QQ) sage: f = x/(x^2 + x + 1) sage: f.differential() ((-x^2 + 1)/(x^4 + 2*x^3 + 3*x^2 + 2*x + 1)) d(x)
sage: K.<x> = FunctionField(QQ); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x + x^3*Y) sage: L(x).differential() d(x) sage: y.differential() ((21/4*x/(x^7 + 27/4))*y^2 + ((3/2*x^7 + 9/4)/(x^8 + 27/4*x))*y + 7/2*x^4/(x^7 + 27/4)) d(x)
-
divisor
()¶ Return the divisor of the differential.
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y>=K[] sage: L.<y> = K.extension(Y^3+x+x^3*Y) sage: w = (1/y) * y.differential() sage: w.divisor() - Place (1/x, 1/x^3*y^2 + 1/x) - Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1) - Place (x, y) + Place (x + 2, y + 3) + Place (x^6 + 3*x^5 + 4*x^4 + 2*x^3 + x^2 + 3*x + 4, y + x^5) sage: F.<x> = FunctionField(QQ) sage: w = (1/x).differential() sage: w.divisor() -2*Place (x)
-
valuation
(place)¶ Return the valuation of the differential at the
place
.INPUT:
place
– place of the function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y>=K[] sage: L.<y> = K.extension(Y^3+x+x^3*Y) sage: w = (1/y) * y.differential() sage: [w.valuation(p) for p in L.places()] [-1, -1, -1, 0, 1, 0]
-
class
sage.rings.function_field.differential.
FunctionFieldDifferential_global
(parent, f, t=None)¶ Bases:
sage.rings.function_field.differential.FunctionFieldDifferential
Differentials on global function fields.
EXAMPLES:
sage: F.<x>=FunctionField(GF(7)) sage: f = x/(x^2 + x + 1) sage: f.differential() ((6*x^2 + 1)/(x^4 + 2*x^3 + 3*x^2 + 2*x + 1)) d(x) sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x + x^3*Y) sage: y.differential() (x*y^2 + 1/x*y) d(x)
-
cartier
()¶ Return the image of the differential by the Cartier operator.
The Cartier operator operates on differentials. Let \(x\) be a separating element of the function field. If a differential \(\omega\) is written \(\omega=(f_0^p+f_1^px+\dots+f_{p-1}^px^{p-1})dx\) (prime-power representation), then the Cartier operator maps \(\omega\) to \(f_{p-1}dx\). It is known that this definition does not depend on the choice of \(x\).
The Cartier operator has interesting properties. Notably, the set of exact differentials is precisely the kernel of the Cartier operator and logarithmic differentials are stable under the Cartier operation.
EXAMPLES:
sage: K.<x>=FunctionField(GF(4)); _.<Y>=K[] sage: L.<y>=K.extension(Y^3+x+x^3*Y) sage: f = x/y sage: w = 1/f * f.differential() sage: w.cartier() == w True sage: F.<x> = FunctionField(GF(4)) sage: f = x/(x^2+x+1) sage: w = 1/f * f.differential() sage: w.cartier() == w True
-
monomial_coefficients
(copy=True)¶ Return a dictionary whose keys are indices of basis elements in the support of
self
and whose values are the corresponding coefficients.EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y>=K[] sage: L.<y> = K.extension(Y^3+x+x^3*Y) sage: d = y.differential() sage: d ((4*x/(x^7 + 3))*y^2 + ((4*x^7 + 1)/(x^8 + 3*x))*y + x^4/(x^7 + 3)) d(x) sage: d.monomial_coefficients() {0: (4*x/(x^7 + 3))*y^2 + ((4*x^7 + 1)/(x^8 + 3*x))*y + x^4/(x^7 + 3)}
-
residue
(place)¶ Return the residue of the differential at the place.
INPUT:
place
– place of the function field
OUTPUT:
- an element of the residue field of the place
EXAMPLES:
We verify the residue theorem in a rational function field:
sage: F.<x> = FunctionField(GF(4)) sage: f = 0 sage: while f == 0: ....: f = F.random_element() sage: w = 1/f * f.differential() sage: d = f.divisor() sage: s = d.support() sage: sum([w.residue(p).trace() for p in s]) 0
and also in an extension field:
sage: K.<x> = FunctionField(GF(7)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x + x^3*Y) sage: f = 0 sage: while f == 0: ....: f = L.random_element() sage: w = 1/f * f.differential() sage: d = f.divisor() sage: s = d.support() sage: sum([w.residue(p).trace() for p in s]) 0
-