Differentials of function fields

Sage provides basic arithmetic and advanced computations with differentials on 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
Element

alias of FunctionFieldDifferential_global

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.FunctionFieldDifferential

Bases: sage.structure.element.ModuleElement

Base class for differentials on function fields.

class sage.rings.function_field.differential.FunctionFieldDifferential_global(parent, f, t=None)

Bases: sage.rings.function_field.differential.FunctionFieldDifferential

Differentials on global function fields.

INPUT:

  • f – element of the function field
  • t – element of the function field; if \(t\) is not specified, \(t\) is the generator of the base rational function field

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