Divisors of function fields#
Sage allows extensive computations with divisors on function fields.
EXAMPLES:
The divisor of an element of the function field is the formal sum of poles and zeros of the element with multiplicities:
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[]
sage: L.<y> = K.extension(t^3 + x^3*t + x)
sage: f = x/(y+1)
sage: f.divisor()
- Place (1/x, 1/x^3*y^2 + 1/x)
+ Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1)
+ 3*Place (x, y)
- Place (x^3 + x + 1, y + 1)
The Riemann-Roch space of a divisor can be computed. We can get a basis of the space as a vector space over the constant field:
sage: p = L.places_finite()[0]
sage: q = L.places_infinite()[0]
sage: (3*p + 2*q).basis_function_space()
[1/x*y^2 + x^2, 1, 1/x]
We verify the Riemann-Roch theorem:
sage: D = 3*p - q
sage: index_of_speciality = len(D.basis_differential_space())
sage: D.dimension() == D.degree() - L.genus() + 1 + index_of_speciality
True
AUTHORS:
Kwankyu Lee (2017-04-30): initial version
- class sage.rings.function_field.divisor.DivisorGroup(field)#
Bases:
UniqueRepresentation
,Parent
Groups of divisors of function fields.
INPUT:
field
– function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] sage: F.<y> = K.extension(Y^2 - x^3 - 1) sage: F.divisor_group() Divisor group of Function field in y defined by y^2 + 4*x^3 + 4
- Element#
alias of
FunctionFieldDivisor
- function_field()#
Return the function field to which the divisor group is attached.
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] sage: F.<y> = K.extension(Y^2 - x^3 - 1) sage: G = F.divisor_group() sage: G.function_field() Function field in y defined by y^2 + 4*x^3 + 4
- class sage.rings.function_field.divisor.FunctionFieldDivisor(parent, data)#
Bases:
ModuleElement
Divisors of function fields.
INPUT:
parent
– divisor groupdata
– dict of place and multiplicity pairs
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] sage: F.<y> = K.extension(Y^3 - x^2*(x^2 + x + 1)^2) sage: f = x/(y + 1) sage: f.divisor() Place (1/x, 1/x^4*y^2 + 1/x^2*y + 1) + Place (1/x, 1/x^2*y + 1) + 3*Place (x, (1/(x^3 + x^2 + x))*y^2) - 6*Place (x + 1, y + 1)
- basis_differential_space()#
Return a basis of the space of differentials \(\Omega(D)\) for the divisor \(D\).
EXAMPLES:
We check the Riemann-Roch theorem:
sage: K.<x>=FunctionField(GF(4)); _.<Y> = K[] sage: L.<y>=K.extension(Y^3 + x^3*Y + x) sage: d = 3*L.places()[0] sage: l = len(d.basis_function_space()) sage: i = len(d.basis_differential_space()) sage: l == d.degree() + 1 - L.genus() + i True
- basis_function_space()#
Return a basis of the Riemann-Roch space of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] sage: F.<y> = K.extension(Y^2 - x^3 - 1) sage: O = F.maximal_order() sage: I = O.ideal(x - 2) sage: D = I.divisor() sage: D.basis_function_space() [x/(x + 3), 1/(x + 3)]
- degree()#
Return the degree of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: p1,p2 = L.places()[:2] sage: D = 2*p1 - 3*p2 sage: D.degree() -1
- denominator()#
Return the denominator part of the divisor.
The denominator of a divisor is the negative of the negative part of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: p1,p2 = L.places()[:2] sage: D = 2*p1 - 3*p2 sage: D.denominator() 3*Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1)
- dict()#
Return the dictionary representing the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: f = x/(y + 1) sage: D = f.divisor() sage: D.dict() {Place (1/x, 1/x^3*y^2 + 1/x): -1, Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1): 1, Place (x, y): 3, Place (x^3 + x + 1, y + 1): -1}
- differential_space()#
Return the vector space of the differential space \(\Omega(D)\) of the divisor \(D\).
OUTPUT:
a vector space isomorphic to \(\Omega(D)\)
an isomorphism from the vector space to the differential space
the inverse of the isomorphism
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] sage: F.<y> = K.extension(Y^2 - x^3 - 1) sage: O = F.maximal_order() sage: I = O.ideal(x - 2) sage: P1 = I.divisor().support()[0] sage: Pinf = F.places_infinite()[0] sage: D = -3*Pinf + P1 sage: V, from_V, to_V = D.differential_space() sage: all(to_V(from_V(e)) == e for e in V) True
- dimension()#
Return the dimension of the Riemann-Roch space of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] sage: F.<y> = K.extension(Y^2 - x^3 - 1) sage: O = F.maximal_order() sage: I = O.ideal(x - 2) sage: P1 = I.divisor().support()[0] sage: Pinf = F.places_infinite()[0] sage: D = 3*Pinf + 2*P1 sage: D.dimension() 5
- function_space()#
Return the vector space of the Riemann-Roch space of the divisor.
OUTPUT:
a vector space, an isomorphism from the vector space to the Riemann-Roch space, and its inverse.
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] sage: F.<y> = K.extension(Y^2-x^3-1) sage: O = F.maximal_order() sage: I = O.ideal(x - 2) sage: D = I.divisor() sage: V, from_V, to_V = D.function_space() sage: all(to_V(from_V(e)) == e for e in V) True
- is_effective()#
Return
True
if this divisor has non-negative multiplicity at all places.EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: p1, p2 = L.places()[:2] sage: D = 2*p1 + 3*p2 sage: D.is_effective() True sage: E = D - 4*p2 sage: E.is_effective() False
- list()#
Return the list of place and multiplicity pairs of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: f = x/(y + 1) sage: D = f.divisor() sage: D.list() [(Place (1/x, 1/x^3*y^2 + 1/x), -1), (Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1), 1), (Place (x, y), 3), (Place (x^3 + x + 1, y + 1), -1)]
- multiplicity(place)#
Return the multiplicity of the divisor at the place.
INPUT:
place
– place of a function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: p1,p2 = L.places()[:2] sage: D = 2*p1 - 3*p2 sage: D.multiplicity(p1) 2 sage: D.multiplicity(p2) -3
- numerator()#
Return the numerator part of the divisor.
The numerator of a divisor is the positive part of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: p1,p2 = L.places()[:2] sage: D = 2*p1 - 3*p2 sage: D.numerator() 2*Place (1/x, 1/x^3*y^2 + 1/x)
- support()#
Return the support of the divisor.
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: f = x/(y + 1) sage: D = f.divisor() sage: D.support() [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^3 + x + 1, y + 1)]
- valuation(place)#
Return the multiplicity of the divisor at the place.
INPUT:
place
– place of a function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] sage: L.<y> = K.extension(Y^3 + x^3*Y + x) sage: p1,p2 = L.places()[:2] sage: D = 2*p1 - 3*p2 sage: D.multiplicity(p1) 2 sage: D.multiplicity(p2) -3
- sage.rings.function_field.divisor.divisor(field, data)#
Construct a divisor from the data.
INPUT:
field
– function fielddata
– dictionary of place and multiplicity pairs
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[] sage: F.<y> = K.extension(t^3 - x^2*(x^2 + x + 1)^2) sage: from sage.rings.function_field.divisor import divisor sage: p, q, r = F.places() sage: divisor(F, {p: 1, q: 2, r: 3}) Place (1/x, 1/x^2*y + 1) + 2*Place (x, (1/(x^3 + x^2 + x))*y^2) + 3*Place (x + 1, y + 1)
- sage.rings.function_field.divisor.prime_divisor(field, place, m=1)#
Construct a prime divisor from the place.
INPUT:
field
– function fieldplace
– place of the function fieldm
– (default: 1) a positive integer; multiplicity at the place
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[] sage: F.<y> = K.extension(t^3 - x^2*(x^2 + x + 1)^2) sage: p = F.places()[0] sage: from sage.rings.function_field.divisor import prime_divisor sage: d = prime_divisor(F, p) sage: 3 * d == prime_divisor(F, p, 3) True