Algebraic Function Fields
Release 10.4
The Sage Development Team
Jul 23, 2024
CONTENTS
1 Function Fields 3
2 Function Fields: rational 37
3 Function Fields: extension 53
4 Elements of function fields 97
5 Elements of function fields: rational 115
6 Elements of function fields: extension 123
7 Orders of function fields 127
8 Orders of function fields: rational 133
9 Orders of function fields: basis 139
10 Orders of function fields: extension 151
11 Ideals of function fields 169
12 Ideals of function fields: rational 189
13 Ideals of function fields: extension 195
14 Places of function fields 217
15 Places of function fields: rational 223
16 Places of function fields: extension 227
17 Divisors of function fields 233
18 Differentials of function fields 245
19 Valuation rings of function fields 257
20 Derivations of function fields 261
21 Derivations of function fields: rational 263
22 Derivations of function fields: extension 265
i
23 Morphisms of function fields 269
24 Special extensions of function fields 279
25 Factories to construct function fields 285
26 Jacobians of function fields 289
27 A Support Module 323
28 Indices and Tables 327
Python Module Index 329
Index 331
ii
Algebraic Function Fields, Release 10.4
Sage allows basic computations with elements and ideals in orders of algebraic function fields over arbitrary constant
fields. Advanced computations, like computing the genus or a basis of the Riemann-Roch space of a divisor, are available
for function fields over finite fields, number fields, and the algebraic closure of .
CONTENTS 1
Algebraic Function Fields, Release 10.4
2 CONTENTS
CHAPTER
ONE
FUNCTION FIELDS
A function field (of one variable) is a finitely generated field extension of transcendence degree one. In Sage, a function
field can be a rational function field or a finite extension of a function field.
EXAMPLES:
We create a rational function field:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(5^2, a )); K
Rational function field in x over Finite Field in a of size 5^2
sage: [Link]()
0
sage: f = (x^2 + x + 1) / (x^3 + 1)
sage: f
(x^2 + x + 1)/(x^3 + 1)
sage: f^3
(x^6 + 3*x^5 + x^4 + 2*x^3 + x^2 + 3*x + 1)/(x^9 + 3*x^6 + 3*x^3 + 1)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(5)**Integer(2), a ), names=( x ,)); (x,) = K._first_
˓→ngens(1); K
Rational function field in x over Finite Field in a of size 5^2
>>> [Link]()
0
>>> f = (x**Integer(2) + x + Integer(1)) / (x**Integer(3) + Integer(1))
>>> f
(x^2 + x + 1)/(x^3 + 1)
>>> f**Integer(3)
(x^6 + 3*x^5 + x^4 + 2*x^3 + x^2 + 3*x + 1)/(x^9 + 3*x^6 + 3*x^3 + 1)
Then we create an extension of the rational function field, and do some simple arithmetic in it:
sage: # needs [Link].finite_rings [Link].function_field
sage: R.<y> = K[]
sage: L.<y> = [Link](y^3 - (x^3 + 2*x*y + 1/x)); L
Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
sage: y^2
y^2
sage: y^3
2*x*y + (x^4 + 1)/x
sage: a = 1/y; a
(x/(x^4 + 1))*y^2 + 3*x^2/(x^4 + 1)
sage: a * y
1
3
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/x),␣
˓→names=( y ,)); (y,) = L._first_ngens(1); L
Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
>>> y**Integer(2)
y^2
>>> y**Integer(3)
2*x*y + (x^4 + 1)/x
>>> a = Integer(1)/y; a
(x/(x^4 + 1))*y^2 + 3*x^2/(x^4 + 1)
>>> a * y
1
We next make an extension of the above function field, illustrating that arithmetic with a tower of three fields is fully
supported:
sage: # needs [Link].finite_rings [Link].function_field
sage: S.<t> = L[]
sage: M.<t> = [Link](t^2 - x*y)
sage: M
Function field in t defined by t^2 + 4*x*y
sage: t^2
x*y
sage: 1/t
((1/(x^4 + 1))*y^2 + 3*x/(x^4 + 1))*t
sage: M.base_field()
Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
sage: M.base_field().base_field()
Rational function field in x over Finite Field in a of size 5^2
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> S = L[ t ]; (t,) = S._first_ngens(1)
>>> M = [Link](t**Integer(2) - x*y, names=( t ,)); (t,) = M._first_ngens(1)
>>> M
Function field in t defined by t^2 + 4*x*y
>>> t**Integer(2)
x*y
>>> Integer(1)/t
((1/(x^4 + 1))*y^2 + 3*x/(x^4 + 1))*t
>>> M.base_field()
Function field in y defined by y^3 + 3*x*y + (4*x^4 + 4)/x
>>> M.base_field().base_field()
Rational function field in x over Finite Field in a of size 5^2
It is also possible to construct function fields over an imperfect base field:
sage: N.<u> = FunctionField(K) #␣
˓→needs [Link].finite_rings
>>> from [Link] import *
>>> N = FunctionField(K, names=( u ,)); (u,) = N._first_ngens(1)# needs [Link].
˓→finite_rings
and inseparable extension function fields:
4 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
sage: J.<x> = FunctionField(GF(5)); J
Rational function field in x over Finite Field of size 5
sage: T.<v> = J[]
sage: O.<v> = [Link](v^5 - x); O #␣
˓→needs [Link].function_field
Function field in v defined by v^5 + 4*x
>>> from [Link] import *
>>> J = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = J._first_ngens(1); J
Rational function field in x over Finite Field of size 5
>>> T = J[ v ]; (v,) = T._first_ngens(1)
>>> O = [Link](v**Integer(5) - x, names=( v ,)); (v,) = O._first_ngens(1); O ␣
˓→ # needs [Link].function_field
Function field in v defined by v^5 + 4*x
Function fields over the rational field are supported:
sage: # needs [Link].function_field
sage: F.<x> = FunctionField(QQ)
sage: R.<Y> = F[]
sage: L.<y> = [Link](Y^2 - x^8 - 1)
sage: O = L.maximal_order()
sage: I = [Link](x, y - 1)
sage: P = [Link]()
sage: D = [Link]()
sage: D.basis_function_space()
[1]
sage: (2*D).basis_function_space()
[1]
sage: (3*D).basis_function_space()
[1]
sage: (4*D).basis_function_space()
[1, 1/x^4*y + 1/x^4]
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [Link]()
2*Place (x, y, (1/(x^3 + x^2 + x))*y^2)
+ 2*Place (x^2 + x + 1, y, (1/(x^3 + x^2 + x))*y^2)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [Link]()
- Place (x, x*y)
+ Place (x^2 + 1, x*y)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> R = F[ Y ]; (Y,) = R._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x**Integer(8) - Integer(1), names=( y ,)); (y,) =␣
(continues on next page)
5
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x, y - Integer(1))
>>> P = [Link]()
>>> D = [Link]()
>>> D.basis_function_space()
[1]
>>> (Integer(2)*D).basis_function_space()
[1]
>>> (Integer(3)*D).basis_function_space()
[1]
>>> (Integer(4)*D).basis_function_space()
[1, 1/x^4*y + 1/x^4]
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ]; (Y,) =␣
˓→_._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [Link]()
2*Place (x, y, (1/(x^3 + x^2 + x))*y^2)
+ 2*Place (x^2 + x + 1, y, (1/(x^3 + x^2 + x))*y^2)
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ]; (Y,) =␣
˓→_._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [Link]()
- Place (x, x*y)
+ Place (x^2 + 1, x*y)
Function fields over the algebraic field are supported:
sage: # needs [Link].function_field [Link].number_field
sage: K.<x> = FunctionField(QQbar); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [Link]()
Place (x - I, x*y)
- Place (x, x*y)
+ Place (x + I, x*y)
sage: pl = [Link]().support()[0]
sage: m = [Link](pl, prec=5)
sage: m(x)
I + s + O(s^5)
sage: m(y) # long time (4s)
-2*s + (-4 - I)*s^2 + (-15 - 4*I)*s^3 + (-75 - 23*I)*s^4 + (-413 - 154*I)*s^5 + O(s^6)
sage: m(y)^2 + m(y) + m(x) + 1/m(x) # long time (8s)
O(s^5)
6 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].function_field [Link].number_field
>>> K = FunctionField(QQbar, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ]; (Y,
˓→) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [Link]()
Place (x - I, x*y)
- Place (x, x*y)
+ Place (x + I, x*y)
>>> pl = [Link]().support()[Integer(0)]
>>> m = [Link](pl, prec=Integer(5))
>>> m(x)
I + s + O(s^5)
>>> m(y) # long time (4s)
-2*s + (-4 - I)*s^2 + (-15 - 4*I)*s^3 + (-75 - 23*I)*s^4 + (-413 - 154*I)*s^5 + O(s^6)
>>> m(y)**Integer(2) + m(y) + m(x) + Integer(1)/m(x) # long time (8s)
O(s^5)
1.1 Global function fields
A global function field in Sage is an extension field of a rational function field over a finite constant field by an irreducible
separable polynomial over the rational function field.
EXAMPLES:
A fundamental computation for a global or any function field is to get a basis of its maximal order and maximal infinite
order, and then do arithmetic with ideals of those maximal orders:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(3)); _.<t> = K[]
sage: L.<y> = [Link](t^4 + t - x^5)
sage: O = L.maximal_order()
sage: [Link]()
(1, y, 1/x*y^2 + 1/x*y, 1/x^3*y^3 + 2/x^3*y^2 + 1/x^3*y)
sage: I = [Link](x,y); I
Ideal (x, y) of Maximal order of Function field in y defined by y^4 + y + 2*x^5
sage: J = I^-1
sage: J.basis_matrix()
[ 1 0 0 0]
[1/x 1/x 0 0]
[ 0 0 1 0]
[ 0 0 0 1]
sage: L.maximal_order_infinite().basis()
(1, 1/x^2*y, 1/x^3*y^2, 1/x^4*y^3)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ t ]; (t,) = _._first_ngens(1)
>>> L = [Link](t**Integer(4) + t - x**Integer(5), names=( y ,)); (y,) = L._first_
˓→ngens(1)
>>> O = L.maximal_order()
(continues on next page)
1.1. Global function fields 7
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
(1, y, 1/x*y^2 + 1/x*y, 1/x^3*y^3 + 2/x^3*y^2 + 1/x^3*y)
>>> I = [Link](x,y); I
Ideal (x, y) of Maximal order of Function field in y defined by y^4 + y + 2*x^5
>>> J = I**-Integer(1)
>>> J.basis_matrix()
[ 1 0 0 0]
[1/x 1/x 0 0]
[ 0 0 1 0]
[ 0 0 0 1]
>>> L.maximal_order_infinite().basis()
(1, 1/x^2*y, 1/x^3*y^2, 1/x^4*y^3)
As an example of the most sophisticated computations that Sage can do with a global function field, we compute all the
Weierstrass places of the Klein quartic over F2 and gap numbers for ordinary places:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: [Link]()
3
sage: L.weierstrass_places() #␣
˓→needs [Link]
[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 + 1, (x^3 + 1)*y + x + 1),
Place (x^3 + x + 1, y + 1),
Place (x^3 + x + 1, y + x^2),
Place (x^3 + x + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x),
Place (x^3 + x^2 + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x^2 + x + 1)]
sage: [Link]() #␣
˓→needs [Link]
[1, 2, 3]
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> [Link]()
3
>>> L.weierstrass_places() #␣
˓→needs [Link]
[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 + 1, (x^3 + 1)*y + x + 1),
Place (x^3 + x + 1, y + 1),
Place (x^3 + x + 1, y + x^2),
Place (x^3 + x + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x),
Place (x^3 + x^2 + 1, y + x^2 + 1),
(continues on next page)
8 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Place (x^3 + x^2 + 1, y + x^2 + x + 1)]
>>> [Link]() #␣
˓→needs [Link]
[1, 2, 3]
The gap numbers for Weierstrass places are of course not ordinary:
sage: # needs [Link].function_field
sage: p1,p2,p3 = L.weierstrass_places()[:3]
sage: [Link]()
[1, 2, 4]
sage: [Link]()
[1, 2, 4]
sage: [Link]()
[1, 2, 4]
>>> from [Link] import *
>>> # needs [Link].function_field
>>> p1,p2,p3 = L.weierstrass_places()[:Integer(3)]
>>> [Link]()
[1, 2, 4]
>>> [Link]()
[1, 2, 4]
>>> [Link]()
[1, 2, 4]
AUTHORS:
• William Stein (2010): initial version
• Robert Bradshaw (2010-05-30): added is_finite()
• Julian Rüth (2011-06-08, 2011-09-14, 2014-06-23, 2014-06-24, 2016-11-13): fixed hom(), extension(); use
@cached_method; added derivation(); added support for relative vector spaces; fixed conversion to base fields
• Maarten Derickx (2011-09-11): added doctests
• Syed Ahmad Lavasani (2011-12-16): added genus(), is_RationalFunctionField()
• Simon King (2014-10-29): Use the same generator names for a function field extension and the underlying poly-
nomial ring.
• Kwankyu Lee (2017-04-30): added global function fields
• Brent Baccala (2019-12-20): added function fields over number fields and QQbar
• Sebastian A. Spindler (2024-03-06): implemented Hilbert symbols for global function fields
class [Link].function_field.function_field.FunctionField(base_field, names,
category=Category of
function fields)
Bases: Field
Abstract base class for all function fields.
INPUT:
• base_field – field; the base of this function field
• names – string that gives the name of the generator
EXAMPLES:
1.1. Global function fields 9
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(QQ)
sage: K
Rational function field in x over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> K
Rational function field in x over Rational Field
basis_of_differentials_of_first_kind()
Return a basis of the space of holomorphic differentials of this function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.basis_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
[]
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.basis_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
[((x/(x^3 + 4))*y) d(x),
((1/(x^3 + 4))*y) d(x),
((x/(x^3 + 4))*y^2) d(x),
((1/(x^3 + 4))*y^2) d(x)]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.basis_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
[]
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L.basis_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
[((x/(x^3 + 4))*y) d(x),
((1/(x^3 + 4))*y) d(x),
((x/(x^3 + 4))*y^2) d(x),
((1/(x^3 + 4))*y^2) d(x)]
basis_of_holomorphic_differentials()
Return a basis of the space of holomorphic differentials of this function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.basis_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
[]
(continues on next page)
10 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.basis_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
[((x/(x^3 + 4))*y) d(x),
((1/(x^3 + 4))*y) d(x),
((x/(x^3 + 4))*y^2) d(x),
((1/(x^3 + 4))*y^2) d(x)]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.basis_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
[]
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L.basis_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
[((x/(x^3 + 4))*y) d(x),
((1/(x^3 + 4))*y) d(x),
((x/(x^3 + 4))*y^2) d(x),
((1/(x^3 + 4))*y^2) d(x)]
characteristic()
Return the characteristic of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: [Link]()
0
sage: K.<x> = FunctionField(QQbar) #␣
˓→needs [Link].number_field
sage: [Link]()
0
sage: K.<x> = FunctionField(GF(7))
sage: [Link]()
7
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> [Link]()
0
>>> K = FunctionField(QQbar, names=( x ,)); (x,) = K._first_ngens(1)# needs␣
˓→[Link].number_field
(continues on next page)
1.1. Global function fields 11
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
0
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1)
>>> [Link]()
7
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
˓→# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
completion(place, name=None, prec=None, gen_name=None)
Return the completion of the function field at the place.
INPUT:
• place – place
• name – string; name of the series variable
• prec – positive integer; default precision
• gen_name – string; name of the generator of the residue field; used only when the place is non-rational
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: m = [Link](p); m
Completion map:
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
To: Laurent Series Ring in s over Finite Field of size 2
sage: m(x, 10)
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
sage: m(y, 10)
s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: m = [Link](p); m
Completion map:
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
To: Laurent Series Ring in s over Finite Field of size 2
sage: m(x, 10)
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
sage: m(y, 10)
s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
sage: K.<x> = FunctionField(GF(2))
sage: p = K.places_finite()[0]; p #␣
˓→needs [Link]
Place (x)
sage: m = [Link](p); m #␣
(continues on next page)
12 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ needs [Link].function_field
Completion map:
From: Rational function field in x over Finite Field of size 2
To: Laurent Series Ring in s over Finite Field of size 2
sage: m(1/(x+1)) #␣
˓→needs [Link].function_field
1 + s + s^2 + s^3 + s^4 + s^5 + s^6 + s^7 + s^8 + s^9 + s^10 + s^11 + s^12
+ s^13 + s^14 + s^15 + s^16 + s^17 + s^18 + s^19 + O(s^20)
sage: p = K.place_infinite(); p
Place (1/x)
sage: m = [Link](p); m #␣
˓→needs [Link].function_field
Completion map:
From: Rational function field in x over Finite Field of size 2
To: Laurent Series Ring in s over Finite Field of size 2
sage: m(x) #␣
˓→needs [Link].function_field
s^-1 + O(s^19)
sage: m = [Link](p, prec=infinity); m #␣
˓→needs [Link].function_field
Completion map:
From: Rational function field in x over Finite Field of size 2
To: Lazy Laurent Series Ring in s over Finite Field of size 2
sage: f = m(x); f #␣
˓→needs [Link].function_field
s^-1 + ...
sage: [Link](100) #␣
˓→needs [Link].function_field
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 - x)
sage: O = L.maximal_order()
sage: decomp = [Link](K.maximal_order().ideal(x - 1))
sage: pls = (decomp[0][0].place(), decomp[1][0].place())
sage: m = [Link](pls[0]); m
Completion map:
From: Function field in y defined by y^2 - x
To: Laurent Series Ring in s over Rational Field
sage: xe = m(x)
sage: ye = m(y)
sage: ye^2 - xe == 0
True
sage: # needs [Link].function_field
sage: decomp2 = [Link](K.maximal_order().ideal(x^2 + 1))
sage: pls2 = decomp2[0][0].place()
sage: m = [Link](pls2); m
Completion map:
From: Function field in y defined by y^2 - x
To: Laurent Series Ring in s over
Number Field in a with defining polynomial x^4 + 2*x^2 + 4*x + 2
sage: xe = m(x)
sage: ye = m(y)
(continues on next page)
1.1. Global function fields 13
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: ye^2 - xe == 0
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> m = [Link](p); m
Completion map:
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
To: Laurent Series Ring in s over Finite Field of size 2
>>> m(x, Integer(10))
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
>>> m(y, Integer(10))
s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> m = [Link](p); m
Completion map:
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
To: Laurent Series Ring in s over Finite Field of size 2
>>> m(x, Integer(10))
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + O(s^12)
>>> m(y, Integer(10))
s^-1 + 1 + s^3 + s^5 + s^7 + O(s^9)
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> p = K.places_finite()[Integer(0)]; p ␣
˓→ # needs [Link]
Place (x)
>>> m = [Link](p); m #␣
˓→needs [Link].function_field
Completion map:
From: Rational function field in x over Finite Field of size 2
To: Laurent Series Ring in s over Finite Field of size 2
>>> m(Integer(1)/(x+Integer(1))) ␣
˓→ # needs [Link].function_field
1 + s + s^2 + s^3 + s^4 + s^5 + s^6 + s^7 + s^8 + s^9 + s^10 + s^11 + s^12
+ s^13 + s^14 + s^15 + s^16 + s^17 + s^18 + s^19 + O(s^20)
>>> p = K.place_infinite(); p
Place (1/x)
>>> m = [Link](p); m #␣
˓→needs [Link].function_field
Completion map:
From: Rational function field in x over Finite Field of size 2
To: Laurent Series Ring in s over Finite Field of size 2
>>> m(x) #␣
(continues on next page)
14 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
needs [Link].function_field
˓→
s^-1 + O(s^19)
>>> m = [Link](p, prec=infinity); m #␣
˓→needs [Link].function_field
Completion map:
From: Rational function field in x over Finite Field of size 2
To: Lazy Laurent Series Ring in s over Finite Field of size 2
>>> f = m(x); f #␣
˓→needs [Link].function_field
s^-1 + ...
>>> [Link](Integer(100)) ␣
˓→ # needs [Link].function_field
0
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> decomp = [Link](K.maximal_order().ideal(x - Integer(1)))
>>> pls = (decomp[Integer(0)][Integer(0)].place(),␣
˓→decomp[Integer(1)][Integer(0)].place())
>>> m = [Link](pls[Integer(0)]); m
Completion map:
From: Function field in y defined by y^2 - x
To: Laurent Series Ring in s over Rational Field
>>> xe = m(x)
>>> ye = m(y)
>>> ye**Integer(2) - xe == Integer(0)
True
>>> # needs [Link].function_field
>>> decomp2 = [Link](K.maximal_order().ideal(x**Integer(2) +␣
˓→Integer(1)))
>>> pls2 = decomp2[Integer(0)][Integer(0)].place()
>>> m = [Link](pls2); m
Completion map:
From: Function field in y defined by y^2 - x
To: Laurent Series Ring in s over
Number Field in a with defining polynomial x^4 + 2*x^2 + 4*x + 2
>>> xe = m(x)
>>> ye = m(y)
>>> ye**Integer(2) - xe == Integer(0)
True
divisor_group()
Return the group of divisors attached to the function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.divisor_group() #␣
˓→needs [Link]
Divisor group of Rational function field in t over Rational Field
sage: _.<Y> = K[]
(continues on next page)
1.1. Global function fields 15
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: L.<y> = [Link](Y^3 - (t^3 - 1)/(t^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.divisor_group() #␣
˓→needs [Link].function_field
Divisor group of Function field in y defined by y^3 + (-t^3 + 1)/(t^3 - 2)
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.divisor_group() #␣
˓→needs [Link].function_field
Divisor group of Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.divisor_group() #␣
˓→needs [Link]
Divisor group of Rational function field in t over Rational Field
>>> _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (t**Integer(3) - Integer(1))/
˓→(t**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L.divisor_group() #␣
˓→needs [Link].function_field
Divisor group of Function field in y defined by y^3 + (-t^3 + 1)/(t^3 - 2)
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L.divisor_group() #␣
˓→needs [Link].function_field
Divisor group of Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
extension(f, names=None)
Create an extension 𝐾(𝑦) of this function field 𝐾 extended with a root 𝑦 of the univariate polynomial 𝑓 over
𝐾.
INPUT:
• f – univariate polynomial over 𝐾
• names – string or tuple of length 1 that names the variable 𝑦
OUTPUT:
• a function field
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: [Link](y^5 - x^3 - 3*x + x*y) #␣
˓→needs [Link].function_field
Function field in y defined by y^5 + x*y - x^3 - 3*x
16 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> [Link](y**Integer(5) - x**Integer(3) - Integer(3)*x + x*y) ␣
˓→ # needs [Link].function_field
Function field in y defined by y^5 + x*y - x^3 - 3*x
A nonintegral defining polynomial:
sage: K.<t> = FunctionField(QQ); R.<y> = K[]
sage: [Link](y^3 + (1/t)*y + t^3/(t+1), z ) #␣
˓→needs [Link].function_field
Function field in z defined by z^3 + 1/t*z + t^3/(t + 1)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> [Link](y**Integer(3) + (Integer(1)/t)*y + t**Integer(3)/
˓→(t+Integer(1)), z ) # needs [Link].function_
˓→field
Function field in z defined by z^3 + 1/t*z + t^3/(t + 1)
The defining polynomial need not be monic or integral:
sage: [Link](t*y^3 + (1/t)*y + t^3/(t+1)) #␣
˓→needs [Link].function_field
Function field in y defined by t*y^3 + 1/t*y + t^3/(t + 1)
>>> from [Link] import *
>>> [Link](t*y**Integer(3) + (Integer(1)/t)*y + t**Integer(3)/
˓→(t+Integer(1))) # needs [Link].function_
˓→field
Function field in y defined by t*y^3 + 1/t*y + t^3/(t + 1)
extension_constant_field(k)
Return the constant field extension with constant field 𝑘.
INPUT:
• k – an extension field of the constant field of this function field
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: E = F.extension_constant_field(GF(2^4))
sage: E
Function field in y defined by y^2 + y + (x^2 + 1)/x over its base
sage: E.constant_base_field()
Finite Field in z4 of size 2^4
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
(continues on next page)
1.1. Global function fields 17
Algebraic Function Fields, Release 10.4
(continued from previous page)
= F._first_ngens(1)
˓→
>>> E = F.extension_constant_field(GF(Integer(2)**Integer(4)))
>>> E
Function field in y defined by y^2 + y + (x^2 + 1)/x over its base
>>> E.constant_base_field()
Finite Field in z4 of size 2^4
hilbert_symbol(a, b, P)
Return the Hilbert symbol (𝑎, 𝑏)𝐹𝑃 for the local field 𝐹𝑃 .
The local field 𝐹𝑃 is the completion of this function field 𝐹 at the place 𝑃 .
INPUT:
• a and b – elements of this function field
• P – a place of this function field
The Hilbert symbol (𝑎, 𝑏)𝐹𝑃 is 0 if 𝑎 or 𝑏 is zero. Otherwise it takes the value 1 if the quaternion algebra
defined by (𝑎, 𝑏) over 𝐹𝑃 is split, and −1 if said algebra is a division ring.
ALGORITHM:
For the valuation 𝜈 = 𝜈𝑃 of 𝐹 , we compute the valuations 𝜈(𝑎) and 𝜈(𝑏) as well as elements 𝑎0 and 𝑏0 of
the residue field such that for a uniformizer 𝜋 at 𝑃 , 𝑎𝜋 −𝜈(𝑎)) respectively 𝑏𝜋 −𝜈(𝑏) has the residue class 𝑎0
respectively 𝑏0 modulo 𝜋. Then the Hilbert symbol is computed by formula 12.4.10 in [Voi2021].
Currently only implemented for global function fields.
EXAMPLES:
sage: K.<x> = FunctionField(GF(17))
sage: P = [Link]()[0]; P
Place (1/x)
sage: a = (5*x + 6)/(x + 15)
sage: b = 7/x
sage: K.hilbert_symbol(a, b, P)
-1
sage: Q = [Link]()[7]; Q
Place (x + 6)
sage: c = 15*x + 12
sage: d = 16/(x + 13)
sage: K.hilbert_symbol(c, d, Q)
1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(17)), names=( x ,)); (x,) = K._first_ngens(1)
>>> P = [Link]()[Integer(0)]; P
Place (1/x)
>>> a = (Integer(5)*x + Integer(6))/(x + Integer(15))
>>> b = Integer(7)/x
>>> K.hilbert_symbol(a, b, P)
-1
>>> Q = [Link]()[Integer(7)]; Q
Place (x + 6)
>>> c = Integer(15)*x + Integer(12)
>>> d = Integer(16)/(x + Integer(13))
(continues on next page)
18 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K.hilbert_symbol(c, d, Q)
1
Check that the Hilbert symbol is symmetric and bimultiplicative:
sage: K.<x> = FunctionField(GF(5)); R.<T> = PolynomialRing(K)
sage: f = ((x^2 + 2*x + 2)*T^5 + (4*x^2 + 2*x + 3)*T^4 + 3*T^3 + 4*T^2
....: + (2/(x^2 + 4*x + 1))*T + 3*x^2 + 2*x + 4)
sage: L.<y> = [Link](f)
sage: a = L.random_element()
sage: b = L.random_element()
sage: c = L.random_element()
sage: P = L.places_above([Link]()[0])[1]
sage: Q = L.places_above([Link]()[1])[0]
sage: hP_a_c = L.hilbert_symbol(a, c, P)
sage: hP_a_c == L.hilbert_symbol(c, a, P)
True
sage: L.hilbert_symbol(a, b, P) * hP_a_c == L.hilbert_symbol(a, b*c, P)
True
sage: hP_a_c * L.hilbert_symbol(b, c, P) == L.hilbert_symbol(a*b, c, P)
True
sage: hQ_a_c = L.hilbert_symbol(a, c, Q)
sage: hQ_a_c == L.hilbert_symbol(c, a, Q)
True
sage: L.hilbert_symbol(a, b, Q) * hQ_a_c == L.hilbert_symbol(a, b*c, Q)
True
sage: hQ_a_c * L.hilbert_symbol(b, c, Q) == L.hilbert_symbol(a*b, c, Q)
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = PolynomialRing(K, names=( T ,)); (T,) = R._first_ngens(1)
>>> f = ((x**Integer(2) + Integer(2)*x + Integer(2))*T**Integer(5) +␣
˓→(Integer(4)*x**Integer(2) + Integer(2)*x + Integer(3))*T**Integer(4) +␣
˓→Integer(3)*T**Integer(3) + Integer(4)*T**Integer(2)
... + (Integer(2)/(x**Integer(2) + Integer(4)*x + Integer(1)))*T +␣
˓→Integer(3)*x**Integer(2) + Integer(2)*x + Integer(4))
>>> L = [Link](f, names=( y ,)); (y,) = L._first_ngens(1)
>>> a = L.random_element()
>>> b = L.random_element()
>>> c = L.random_element()
>>> P = L.places_above([Link]()[Integer(0)])[Integer(1)]
>>> Q = L.places_above([Link]()[Integer(1)])[Integer(0)]
>>> hP_a_c = L.hilbert_symbol(a, c, P)
>>> hP_a_c == L.hilbert_symbol(c, a, P)
True
>>> L.hilbert_symbol(a, b, P) * hP_a_c == L.hilbert_symbol(a, b*c, P)
True
>>> hP_a_c * L.hilbert_symbol(b, c, P) == L.hilbert_symbol(a*b, c, P)
True
>>> hQ_a_c = L.hilbert_symbol(a, c, Q)
>>> hQ_a_c == L.hilbert_symbol(c, a, Q)
(continues on next page)
1.1. Global function fields 19
Algebraic Function Fields, Release 10.4
(continued from previous page)
True
>>> L.hilbert_symbol(a, b, Q) * hQ_a_c == L.hilbert_symbol(a, b*c, Q)
True
>>> hQ_a_c * L.hilbert_symbol(b, c, Q) == L.hilbert_symbol(a*b, c, Q)
True
is_finite()
Return whether the function field is finite, which is false.
EXAMPLES:
sage: R.<t> = FunctionField(QQ)
sage: R.is_finite()
False
sage: R.<t> = FunctionField(GF(7))
sage: R.is_finite()
False
>>> from [Link] import *
>>> R = FunctionField(QQ, names=( t ,)); (t,) = R._first_ngens(1)
>>> R.is_finite()
False
>>> R = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = R._first_ngens(1)
>>> R.is_finite()
False
is_global()
Return whether the function field is global, that is, whether the constant field is finite.
EXAMPLES:
sage: R.<t> = FunctionField(QQ)
sage: R.is_global()
False
sage: R.<t> = FunctionField(QQbar) #␣
˓→needs [Link].number_field
sage: R.is_global()
False
sage: R.<t> = FunctionField(GF(7))
sage: R.is_global()
True
>>> from [Link] import *
>>> R = FunctionField(QQ, names=( t ,)); (t,) = R._first_ngens(1)
>>> R.is_global()
False
>>> R = FunctionField(QQbar, names=( t ,)); (t,) = R._first_ngens(1)# needs␣
˓→[Link].number_field
>>> R.is_global()
False
>>> R = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = R._first_ngens(1)
>>> R.is_global()
True
is_perfect()
Return whether the field is perfect, i.e., its characteristic 𝑝 is zero or every element has a 𝑝-th root.
20 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: FunctionField(QQ, x ).is_perfect()
True
sage: FunctionField(GF(2), x ).is_perfect()
False
>>> from [Link] import *
>>> FunctionField(QQ, x ).is_perfect()
True
>>> FunctionField(GF(Integer(2)), x ).is_perfect()
False
jacobian(model=None, base_div=None, **kwds)
Return the Jacobian of the function field.
INPUT:
• model – (default: hess ) model to use for arithmetic
• base_div – an effective divisor
The degree of the base divisor should satisfy certain degree condition corresponding to the model used. The
following table lists these conditions. Let 𝑔 be the genus of the function field.
• hess: ideal-based arithmetic; requires base divisor of degree 𝑔
• km_large: Khuri-Makdisi’s large model; requires base divisor of degree at least 2𝑔 + 1
• km_medium: Khuri-Makdisi’s medium model; requires base divisor of degree at least 2𝑔 + 1
• km_small: Khuri-Makdisi’s small model requires base divisor of degree at least 𝑔 + 1
We assume the function field has a rational place. If a base divisor is not given, one is constructed using an
arbitrary rational place.
EXAMPLES:
sage: A.<x,y> = AffineSpace(GF(5), 2)
sage: C = Curve(y^2*(x^3 - 1) - (x^3 - 2))
sage: F = C.function_field()
sage: [Link]()
Jacobian of Function field in y defined by (x^3 + 4)*y^2 + 4*x^3 + 2 (Hess␣
˓→model)
>>> from [Link] import *
>>> A = AffineSpace(GF(Integer(5)), Integer(2), names=( x , y ,)); (x, y,) =␣
˓→A._first_ngens(2)
>>> C = Curve(y**Integer(2)*(x**Integer(3) - Integer(1)) - (x**Integer(3) -␣
˓→Integer(2)))
>>> F = C.function_field()
>>> [Link]()
Jacobian of Function field in y defined by (x^3 + 4)*y^2 + 4*x^3 + 2 (Hess␣
˓→model)
order(x, check=True)
Return the order generated by x over the base maximal order.
INPUT:
• x – element or list of elements of the function field
1.1. Global function fields 21
Algebraic Function Fields, Release 10.4
• check – boolean; if True, check that x really generates an order
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^3 + x^3 + 4*x + 1)
sage: O = [Link](y); O #␣
˓→needs [Link]
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
sage: [Link]() #␣
˓→needs [Link]
(1, y, y^2)
sage: Z = [Link](x); Z #␣
˓→needs [Link].function_field
Order in Rational function field in x over Rational Field
sage: [Link]() #␣
˓→needs [Link].function_field
(1,)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) + x**Integer(3) + Integer(4)*x + Integer(1),
˓→ names=( y ,)); (y,) = L._first_ngens(1)
>>> O = [Link](y); O #␣
˓→needs [Link]
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
>>> [Link]() #␣
˓→needs [Link]
(1, y, y^2)
>>> Z = [Link](x); Z #␣
˓→needs [Link].function_field
Order in Rational function field in x over Rational Field
>>> [Link]() #␣
˓→needs [Link].function_field
(1,)
Orders with multiple generators are not yet supported:
sage: Z = [Link]([x, x^2]); Z #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
NotImplementedError
>>> from [Link] import *
>>> Z = [Link]([x, x**Integer(2)]); Z ␣
˓→ # needs [Link].function_field
Traceback (most recent call last):
...
NotImplementedError
order_infinite(x, check=True)
Return the order generated by x over the maximal infinite order.
22 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
INPUT:
• x – element or a list of elements of the function field
• check – boolean; if True, check that x really generates an order
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^3 + x^3 + 4*x + 1) #␣
˓→needs [Link].function_field
sage: L.order_infinite(y) # not implemented #␣
˓→needs [Link].function_field
sage: Z = [Link](x); Z #␣
˓→needs [Link]
Order in Rational function field in x over Rational Field
sage: [Link]() #␣
˓→needs [Link]
(1,)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) + x**Integer(3) + Integer(4)*x + Integer(1),
˓→ names=( y ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> L.order_infinite(y) # not implemented #␣
˓→needs [Link].function_field
>>> Z = [Link](x); Z #␣
˓→needs [Link]
Order in Rational function field in x over Rational Field
>>> [Link]() #␣
˓→needs [Link]
(1,)
Orders with multiple generators, not yet supported:
sage: Z = K.order_infinite([x, x^2]); Z
Traceback (most recent call last):
...
NotImplementedError
>>> from [Link] import *
>>> Z = K.order_infinite([x, x**Integer(2)]); Z
Traceback (most recent call last):
...
NotImplementedError
order_infinite_with_basis(basis, check=True)
Return the order with given basis over the maximal infinite order of the base field.
INPUT:
• basis – list of elements of the function field
• check – boolean (default: True); if True, check that the basis is really linearly independent and that
the module it spans is closed under multiplication, and contains the identity element.
EXAMPLES:
1.1. Global function fields 23
Algebraic Function Fields, Release 10.4
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^3 + x^3 + 4*x + 1)
sage: O = L.order_infinite_with_basis([1, 1/x*y, 1/x^2*y^2]); O
Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
sage: [Link]()
(1, 1/x*y, 1/x^2*y^2)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) + x**Integer(3) + Integer(4)*x + Integer(1),
˓→ names=( y ,)); (y,) = L._first_ngens(1)
>>> O = L.order_infinite_with_basis([Integer(1), Integer(1)/x*y, Integer(1)/
˓→x**Integer(2)*y**Integer(2)]); O
Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
>>> [Link]()
(1, 1/x*y, 1/x^2*y^2)
Note that 1 does not need to be an element of the basis, as long it is in the module spanned by it:
sage: O = L.order_infinite_with_basis([1+1/x*y,1/x*y, 1/x^2*y^2]); O #␣
˓→needs [Link].function_field
Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
sage: [Link]() #␣
˓→needs [Link].function_field
(1/x*y + 1, 1/x*y, 1/x^2*y^2)
>>> from [Link] import *
>>> O = L.order_infinite_with_basis([Integer(1)+Integer(1)/x*y,Integer(1)/x*y,
˓→ Integer(1)/x**Integer(2)*y**Integer(2)]); O # needs [Link].
˓→function_field
Infinite order in Function field in y defined by y^3 + x^3 + 4*x + 1
>>> [Link]() #␣
˓→needs [Link].function_field
(1/x*y + 1, 1/x*y, 1/x^2*y^2)
The following error is raised when the module spanned by the basis is not closed under multiplication:
sage: O = L.order_infinite_with_basis([1,y, 1/x^2*y^2]); O #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, y, 1/x^2*y^2) must be closed␣
˓→under multiplication
>>> from [Link] import *
>>> O = L.order_infinite_with_basis([Integer(1),y, Integer(1)/
˓→x**Integer(2)*y**Integer(2)]); O # needs [Link].
˓→function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, y, 1/x^2*y^2) must be closed␣
˓→under multiplication
and this happens when the identity is not in the module spanned by the basis:
24 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
sage: O = L.order_infinite_with_basis([1/x,1/x*y, 1/x^2*y^2]) #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the identity element must be in the module spanned by basis (1/x,␣
˓→1/x*y, 1/x^2*y^2)
>>> from [Link] import *
>>> O = L.order_infinite_with_basis([Integer(1)/x,Integer(1)/x*y, Integer(1)/
˓→x**Integer(2)*y**Integer(2)]) # needs [Link].function_
˓→field
Traceback (most recent call last):
...
ValueError: the identity element must be in the module spanned by basis (1/x,␣
˓→1/x*y, 1/x^2*y^2)
order_with_basis(basis, check=True)
Return the order with given basis over the maximal order of the base field.
INPUT:
• basis – list of elements of this function field
• check – boolean (default: True); if True, check that the basis is really linearly independent and that
the module it spans is closed under multiplication, and contains the identity element.
OUTPUT:
• an order in the function field
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^3 + x^3 + 4*x + 1) #␣
˓→needs [Link].function_field
sage: O = L.order_with_basis([1, y, y^2]); O #␣
˓→needs [Link].function_field
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
sage: [Link]() #␣
˓→needs [Link].function_field
(1, y, y^2)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) + x**Integer(3) + Integer(4)*x + Integer(1),
˓→ names=( y ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.order_with_basis([Integer(1), y, y**Integer(2)]); O ␣
˓→ # needs [Link].function_field
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
>>> [Link]() #␣
˓→needs [Link].function_field
(1, y, y^2)
Note that 1 does not need to be an element of the basis, as long it is in the module spanned by it:
sage: O = L.order_with_basis([1+y, y, y^2]); O #␣
˓→needs [Link].function_field
(continues on next page)
1.1. Global function fields 25
Algebraic Function Fields, Release 10.4
(continued from previous page)
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
sage: [Link]() #␣
˓→needs [Link].function_field
(y + 1, y, y^2)
>>> from [Link] import *
>>> O = L.order_with_basis([Integer(1)+y, y, y**Integer(2)]); O ␣
˓→ # needs [Link].function_field
Order in Function field in y defined by y^3 + x^3 + 4*x + 1
>>> [Link]() #␣
˓→needs [Link].function_field
(y + 1, y, y^2)
The following error is raised when the module spanned by the basis is not closed under multiplication:
sage: O = L.order_with_basis([1, x^2 + x*y, (2/3)*y^2]); O #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, x*y + x^2, 2/3*y^2) must be␣
˓→closed under multiplication
>>> from [Link] import *
>>> O = L.order_with_basis([Integer(1), x**Integer(2) + x*y, (Integer(2)/
˓→Integer(3))*y**Integer(2)]); O # needs [Link].function_
˓→field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, x*y + x^2, 2/3*y^2) must be␣
˓→closed under multiplication
and this happens when the identity is not in the module spanned by the basis:
sage: O = L.order_with_basis([x, x^2 + x*y, (2/3)*y^2]) #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the identity element must be in the module spanned by basis (x,␣
˓→x*y + x^2, 2/3*y^2)
>>> from [Link] import *
>>> O = L.order_with_basis([x, x**Integer(2) + x*y, (Integer(2)/
˓→Integer(3))*y**Integer(2)]) # needs [Link].function_
˓→field
Traceback (most recent call last):
...
ValueError: the identity element must be in the module spanned by basis (x,␣
˓→x*y + x^2, 2/3*y^2)
place_set()
Return the set of all places of the function field.
EXAMPLES:
sage: K.<t> = FunctionField(GF(7))
sage: K.place_set()
(continues on next page)
26 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Set of places of Rational function field in t over Finite Field of size 7
sage: K.<t> = FunctionField(QQ)
sage: K.place_set()
Set of places of Rational function field in t over Rational Field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].function_field
sage: L.place_set() #␣
˓→needs [Link].function_field
Set of places of Function field in y defined by y^2 + y + (x^2 + 1)/x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = K._first_ngens(1)
>>> K.place_set()
Set of places of Rational function field in t over Finite Field of size 7
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.place_set()
Set of places of Rational function field in t over Rational Field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> L.place_set() #␣
˓→needs [Link].function_field
Set of places of Function field in y defined by y^2 + y + (x^2 + 1)/x
rational_function_field()
Return the rational function field from which this field has been created as an extension.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: K.rational_function_field()
Rational function field in x over Rational Field
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x) #␣
˓→needs [Link].function_field
sage: L.rational_function_field() #␣
˓→needs [Link].function_field
Rational function field in x over Rational Field
sage: R.<z> = L[] #␣
˓→needs [Link].function_field
sage: M.<z> = [Link](z^2 - y) #␣
˓→needs [Link].function_field
sage: M.rational_function_field() #␣
˓→needs [Link].function_field
Rational function field in x over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
(continues on next page)
1.1. Global function fields 27
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K.rational_function_field()
Rational function field in x over Rational Field
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
˓→# needs [Link].function_field
>>> L.rational_function_field() #␣
˓→needs [Link].function_field
Rational function field in x over Rational Field
>>> R = L[ z ]; (z,) = R._first_ngens(1)# needs [Link].function_field
>>> M = [Link](z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
˓→# needs [Link].function_field
>>> M.rational_function_field() #␣
˓→needs [Link].function_field
Rational function field in x over Rational Field
some_elements()
Return some elements in this function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: K.some_elements()
[1,
x,
2*x,
x/(x^2 + 2*x + 1),
1/x^2,
x/(x^2 - 1),
x/(x^2 + 1),
1/2*x/(x^2 + 1),
0,
1/x,
...]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> K.some_elements()
[1,
x,
2*x,
x/(x^2 + 2*x + 1),
1/x^2,
x/(x^2 - 1),
x/(x^2 + 1),
1/2*x/(x^2 + 1),
0,
1/x,
...]
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
˓→# needs [Link].function_field
sage: L.some_elements()
˓→# needs [Link].function_field
(continues on next page)
28 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
[1,
y,
1/x*y,
((x + 1)/(x^2 - 2*x + 1))*y - 2*x/(x^2 - 2*x + 1),
1/x,
(1/(x - 1))*y,
(1/(x + 1))*y,
(1/2/(x + 1))*y,
0,
...]
>>> from [Link] import *
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
˓→# needs [Link].function_field
>>> L.some_elements() #␣
˓→needs [Link].function_field
[1,
y,
1/x*y,
((x + 1)/(x^2 - 2*x + 1))*y - 2*x/(x^2 - 2*x + 1),
1/x,
(1/(x - 1))*y,
(1/(x + 1))*y,
(1/2/(x + 1))*y,
0,
...]
space_of_differentials()
Return the space of differentials attached to the function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.space_of_differentials() #␣
˓→needs [Link]
Space of differentials of Rational function field in t over Rational Field
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.space_of_differentials() #␣
˓→needs [Link].function_field
Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.space_of_differentials() #␣
˓→needs [Link]
Space of differentials of Rational function field in t over Rational Field
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
(continues on next page)
1.1. Global function fields 29
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→needs [Link].function_field
>>> L.space_of_differentials() #␣
˓→needs [Link].function_field
Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
space_of_differentials_of_first_kind()
Return the space of holomorphic differentials of this function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.space_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
(Vector space of dimension 0 over Rational Field,
Linear map:
From: Vector space of dimension 0 over Rational Field
To: Space of differentials of Rational function field in t over Rational␣
˓→Field,
Section of linear map:
From: Space of differentials of Rational function field in t over Rational␣
˓→Field
To: Vector space of dimension 0 over Rational Field)
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.space_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
(Vector space of dimension 4 over Finite Field of size 5,
Linear map:
From: Vector space of dimension 4 over Finite Field of size 5
To: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3),
Section of linear map:
From: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
To: Vector space of dimension 4 over Finite Field of size 5)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.space_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
(Vector space of dimension 0 over Rational Field,
Linear map:
From: Vector space of dimension 0 over Rational Field
To: Space of differentials of Rational function field in t over Rational␣
˓→Field,
Section of linear map:
From: Space of differentials of Rational function field in t over Rational␣
˓→Field
To: Vector space of dimension 0 over Rational Field)
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
(continues on next page)
30 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ (x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L.space_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
(Vector space of dimension 4 over Finite Field of size 5,
Linear map:
From: Vector space of dimension 4 over Finite Field of size 5
To: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3),
Section of linear map:
From: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
To: Vector space of dimension 4 over Finite Field of size 5)
space_of_holomorphic_differentials()
Return the space of holomorphic differentials of this function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.space_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
(Vector space of dimension 0 over Rational Field,
Linear map:
From: Vector space of dimension 0 over Rational Field
To: Space of differentials of Rational function field in t over Rational␣
˓→Field,
Section of linear map:
From: Space of differentials of Rational function field in t over Rational␣
˓→Field
To: Vector space of dimension 0 over Rational Field)
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].function_field
sage: L.space_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
(Vector space of dimension 4 over Finite Field of size 5,
Linear map:
From: Vector space of dimension 4 over Finite Field of size 5
To: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3),
Section of linear map:
From: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
To: Vector space of dimension 4 over Finite Field of size 5)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.space_of_holomorphic_differentials() #␣
˓→needs [Link] [Link]
(Vector space of dimension 0 over Rational Field,
Linear map:
From: Vector space of dimension 0 over Rational Field
To: Space of differentials of Rational function field in t over Rational␣
˓→Field,
(continues on next page)
1.1. Global function fields 31
Algebraic Function Fields, Release 10.4
(continued from previous page)
Section of linear map:
From: Space of differentials of Rational function field in t over Rational␣
˓→Field
To: Vector space of dimension 0 over Rational Field)
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L.space_of_holomorphic_differentials() #␣
˓→needs [Link].function_field
(Vector space of dimension 4 over Finite Field of size 5,
Linear map:
From: Vector space of dimension 4 over Finite Field of size 5
To: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3),
Section of linear map:
From: Space of differentials of Function field in y
defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
To: Vector space of dimension 4 over Finite Field of size 5)
valuation(prime)
Return the discrete valuation on this function field defined by prime.
INPUT:
• prime – a place of the function field, a valuation on a subring, or a valuation on another function field
together with information for isomorphisms to and from that function field
EXAMPLES:
We create valuations that correspond to finite rational places of a function field:
sage: K.<x> = FunctionField(QQ)
sage: v = [Link](1); v #␣
˓→needs [Link].function_field
(x - 1)-adic valuation
sage: v(x) #␣
˓→needs [Link].function_field
0
sage: v(x - 1) #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> v = [Link](Integer(1)); v ␣
˓→ # needs [Link].function_field
(x - 1)-adic valuation
>>> v(x) #␣
˓→needs [Link].function_field
0
>>> v(x - Integer(1)) ␣
˓→ # needs [Link].function_field
1
A place can also be specified with an irreducible polynomial:
32 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
sage: v = [Link](x - 1); v #␣
˓→needs [Link].function_field
(x - 1)-adic valuation
>>> from [Link] import *
>>> v = [Link](x - Integer(1)); v ␣
˓→ # needs [Link].function_field
(x - 1)-adic valuation
Similarly, for a finite non-rational place:
sage: v = [Link](x^2 + 1); v #␣
˓→needs [Link].function_field
(x^2 + 1)-adic valuation
sage: v(x^2 + 1) #␣
˓→needs [Link].function_field
1
sage: v(x) #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> v = [Link](x**Integer(2) + Integer(1)); v ␣
˓→ # needs [Link].function_field
(x^2 + 1)-adic valuation
>>> v(x**Integer(2) + Integer(1)) ␣
˓→ # needs [Link].function_field
1
>>> v(x) #␣
˓→needs [Link].function_field
Or for the infinite place:
sage: v = [Link](1/x); v #␣
˓→needs [Link].function_field
Valuation at the infinite place
sage: v(x) #␣
˓→needs [Link].function_field
-1
>>> from [Link] import *
>>> v = [Link](Integer(1)/x); v ␣
˓→ # needs [Link].function_field
Valuation at the infinite place
>>> v(x) #␣
˓→needs [Link].function_field
-1
Instead of specifying a generator of a place, we can define a valuation on a rational function field by giving a
discrete valuation on the underlying polynomial ring:
sage: # needs [Link].function_field
sage: R.<x> = QQ[]
sage: u = [Link](R, [Link](QQ))
sage: w = [Link](x - 1, 1)
(continues on next page)
1.1. Global function fields 33
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: v = [Link](w); v
(x - 1)-adic valuation
>>> from [Link] import *
>>> # needs [Link].function_field
>>> R = QQ[ x ]; (x,) = R._first_ngens(1)
>>> u = [Link](R, [Link](QQ))
>>> w = [Link](x - Integer(1), Integer(1))
>>> v = [Link](w); v
(x - 1)-adic valuation
Note that this allows us to specify valuations which do not correspond to a place of the function field:
sage: w = [Link](R, [Link](2)) #␣
˓→needs [Link].function_field
sage: v = [Link](w); v #␣
˓→needs [Link].function_field
2-adic valuation
>>> from [Link] import *
>>> w = [Link](R, [Link](Integer(2))) ␣
˓→ # needs [Link].function_field
>>> v = [Link](w); v #␣
˓→needs [Link].function_field
2-adic valuation
The same is possible for valuations with 𝑣(1/𝑥) > 0 by passing in an extra pair of parameters, an isomorphism
between this function field and an isomorphic function field. That way you can, for example, indicate that the
valuation is to be understood as a valuation on 𝐾[1/𝑥], i.e., after applying the substitution 𝑥 ↦→ 1/𝑥 (here,
the inverse map is also 𝑥 ↦→ 1/𝑥):
sage: # needs [Link].function_field
sage: w = [Link](R, [Link](2)).augmentation(x, 1)
sage: w = [Link](w)
sage: v = [Link]((w, [Link]([~[Link]()]), [Link]([~[Link]()]))); v
Valuation on rational function field
induced by [ Gauss valuation induced by 2-adic valuation, v(x) = 1 ]
(in Rational function field in x over Rational Field after x |--> 1/x)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> w = [Link](R, [Link](Integer(2))).augmentation(x,
˓→ Integer(1))
>>> w = [Link](w)
>>> v = [Link]((w, [Link]([~[Link]()]), [Link]([~[Link]()]))); v
Valuation on rational function field
induced by [ Gauss valuation induced by 2-adic valuation, v(x) = 1 ]
(in Rational function field in x over Rational Field after x |--> 1/x)
Note that classical valuations at finite places or the infinite place are always normalized such that the uni-
formizing element has valuation 1:
sage: # needs [Link].function_field
sage: K.<t> = FunctionField(GF(3))
sage: M.<x> = FunctionField(K)
(continues on next page)
34 Chapter 1. Function Fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: v = [Link](x^3 - t)
sage: v(x^3 - t)
1
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(3)), names=( t ,)); (t,) = K._first_ngens(1)
>>> M = FunctionField(K, names=( x ,)); (x,) = M._first_ngens(1)
>>> v = [Link](x**Integer(3) - t)
>>> v(x**Integer(3) - t)
1
However, if such a valuation comes out of a base change of the ground field, this is not the case anymore. In
the example below, the unique extension of v to L still has valuation 1 on 𝑥3 − 𝑡 but it has valuation 1/3 on
its uniformizing element 𝑥 − 𝑤:
sage: # needs [Link].function_field
sage: R.<w> = K[]
sage: L.<w> = [Link](w^3 - t)
sage: N.<x> = FunctionField(L)
sage: w = [Link](N) # missing factorization, :issue: 16572
Traceback (most recent call last):
...
NotImplementedError
sage: w(x^3 - t) # not tested
1
sage: w(x - w) # not tested
1/3
>>> from [Link] import *
>>> # needs [Link].function_field
>>> R = K[ w ]; (w,) = R._first_ngens(1)
>>> L = [Link](w**Integer(3) - t, names=( w ,)); (w,) = L._first_ngens(1)
>>> N = FunctionField(L, names=( x ,)); (x,) = N._first_ngens(1)
>>> w = [Link](N) # missing factorization, :issue: 16572
Traceback (most recent call last):
...
NotImplementedError
>>> w(x**Integer(3) - t) # not tested
1
>>> w(x - w) # not tested
1/3
There are several ways to create valuations on extensions of rational function fields:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x); L #␣
˓→needs [Link].function_field
Function field in y defined by y^2 - x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_
(continues on next page)
1.1. Global function fields 35
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ngens(1); L # needs [Link].
˓→function_field
Function field in y defined by y^2 - x
A place that has a unique extension can just be defined downstairs:
sage: v = [Link](x); v #␣
˓→needs [Link].function_field
(x)-adic valuation
>>> from [Link] import *
>>> v = [Link](x); v #␣
˓→needs [Link].function_field
(x)-adic valuation
[Link].function_field.function_field.is_FunctionField(x)
Return True if x is a function field.
EXAMPLES:
sage: from [Link].function_field.function_field import is_FunctionField
sage: is_FunctionField(QQ)
False
sage: is_FunctionField(FunctionField(QQ, t ))
True
>>> from [Link] import *
>>> from [Link].function_field.function_field import is_FunctionField
>>> is_FunctionField(QQ)
False
>>> is_FunctionField(FunctionField(QQ, t ))
True
36 Chapter 1. Function Fields
CHAPTER
TWO
FUNCTION FIELDS: RATIONAL
class [Link].function_field.function_field_rational.RationalFunctionField(con-
stant_field,
names,
cat-
e-
gory=None)
Bases: FunctionField
Rational function field in one variable, over an arbitrary base field.
INPUT:
• constant_field – arbitrary field
• names – string or tuple of length 1
EXAMPLES:
sage: K.<t> = FunctionField(GF(3)); K
Rational function field in t over Finite Field of size 3
sage: [Link]()
t
sage: 1/t + t^3 + 5
(t^4 + 2*t + 1)/t
sage: K.<t> = FunctionField(QQ); K
Rational function field in t over Rational Field
sage: [Link]()
t
sage: 1/t + t^3 + 5
(t^4 + 5*t + 1)/t
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(3)), names=( t ,)); (t,) = K._first_ngens(1); K
Rational function field in t over Finite Field of size 3
>>> [Link]()
t
>>> Integer(1)/t + t**Integer(3) + Integer(5)
(t^4 + 2*t + 1)/t
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1); K
Rational function field in t over Rational Field
>>> [Link]()
t
(continues on next page)
37
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> Integer(1)/t + t**Integer(3) + Integer(5)
(t^4 + 5*t + 1)/t
There are various ways to get at the underlying fields and rings associated to a rational function field:
sage: K.<t> = FunctionField(GF(7))
sage: K.base_field()
Rational function field in t over Finite Field of size 7
sage: [Link]()
Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7
sage: K.constant_field()
Finite Field of size 7
sage: K.maximal_order()
Maximal order of Rational function field in t over Finite Field of size 7
sage: K.<t> = FunctionField(QQ)
sage: K.base_field()
Rational function field in t over Rational Field
sage: [Link]()
Fraction Field of Univariate Polynomial Ring in t over Rational Field
sage: K.constant_field()
Rational Field
sage: K.maximal_order()
Maximal order of Rational function field in t over Rational Field
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = K._first_ngens(1)
>>> K.base_field()
Rational function field in t over Finite Field of size 7
>>> [Link]()
Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7
>>> K.constant_field()
Finite Field of size 7
>>> K.maximal_order()
Maximal order of Rational function field in t over Finite Field of size 7
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.base_field()
Rational function field in t over Rational Field
>>> [Link]()
Fraction Field of Univariate Polynomial Ring in t over Rational Field
>>> K.constant_field()
Rational Field
>>> K.maximal_order()
Maximal order of Rational function field in t over Rational Field
We define a morphism:
sage: K.<t> = FunctionField(QQ)
sage: L = FunctionField(QQ, tbar ) # give variable name as second input
sage: [Link]([Link]())
Function Field morphism:
From: Rational function field in t over Rational Field
To: Rational function field in tbar over Rational Field
Defn: t |--> tbar
38 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> L = FunctionField(QQ, tbar ) # give variable name as second input
>>> [Link]([Link]())
Function Field morphism:
From: Rational function field in t over Rational Field
To: Rational function field in tbar over Rational Field
Defn: t |--> tbar
Here are some calculations over a number field:
sage: R.<x> = FunctionField(QQ)
sage: L.<y> = R[]
sage: F.<y> = [Link](y^2 - (x^2+1)) #␣
˓→needs [Link].function_field
sage: (y/x).divisor() #␣
˓→needs [Link].function_field
- Place (x, y - 1)
- Place (x, y + 1)
+ Place (x^2 + 1, y)
sage: # needs [Link].number_field
sage: A.<z> = QQ[]
sage: NF.<i> = NumberField(z^2 + 1)
sage: R.<x> = FunctionField(NF)
sage: L.<y> = R[]
sage: F.<y> = [Link](y^2 - (x^2+1)) #␣
˓→needs [Link].function_field
sage: (x/y*[Link]()).divisor() #␣
˓→needs [Link].function_field
-2*Place (1/x, 1/x*y - 1)
- 2*Place (1/x, 1/x*y + 1)
+ Place (x, y - 1)
+ Place (x, y + 1)
sage: (x/y).divisor() #␣
˓→needs [Link].function_field
- Place (x - i, y)
+ Place (x, y - 1)
+ Place (x, y + 1)
- Place (x + i, y)
>>> from [Link] import *
>>> R = FunctionField(QQ, names=( x ,)); (x,) = R._first_ngens(1)
>>> L = R[ y ]; (y,) = L._first_ngens(1)
>>> F = [Link](y**Integer(2) - (x**Integer(2)+Integer(1)), names=( y ,)); (y,
˓→) = F._first_ngens(1)# needs [Link].function_field
>>> (y/x).divisor() #␣
˓→needs [Link].function_field
- Place (x, y - 1)
- Place (x, y + 1)
+ Place (x^2 + 1, y)
>>> # needs [Link].number_field
>>> A = QQ[ z ]; (z,) = A._first_ngens(1)
>>> NF = NumberField(z**Integer(2) + Integer(1), names=( i ,)); (i,) = NF._first_
˓→ngens(1)
>>> R = FunctionField(NF, names=( x ,)); (x,) = R._first_ngens(1)
(continues on next page)
39
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> L = R[ y ]; (y,) = L._first_ngens(1)
>>> F = [Link](y**Integer(2) - (x**Integer(2)+Integer(1)), names=( y ,)); (y,
˓→) = F._first_ngens(1)# needs [Link].function_field
>>> (x/y*[Link]()).divisor() #␣
˓→needs [Link].function_field
-2*Place (1/x, 1/x*y - 1)
- 2*Place (1/x, 1/x*y + 1)
+ Place (x, y - 1)
+ Place (x, y + 1)
>>> (x/y).divisor() #␣
˓→needs [Link].function_field
- Place (x - i, y)
+ Place (x, y - 1)
+ Place (x, y + 1)
- Place (x + i, y)
Element
alias of FunctionFieldElement_rational
base_field()
Return the base field of the rational function field, which is just the function field itself.
EXAMPLES:
sage: K.<t> = FunctionField(GF(7))
sage: K.base_field()
Rational function field in t over Finite Field of size 7
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = K._first_ngens(1)
>>> K.base_field()
Rational function field in t over Finite Field of size 7
change_variable_name(name)
Return a field isomorphic to this field with variable name.
INPUT:
• name – a string or a tuple consisting of a single string, the name of the new variable
OUTPUT:
A triple F,f,t where F is a rational function field, f is an isomorphism from F to this field, and t is the
inverse of f.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: L,f,t = K.change_variable_name( y )
sage: L,f,t
(Rational function field in y over Rational Field,
Function Field morphism:
From: Rational function field in y over Rational Field
To: Rational function field in x over Rational Field
Defn: y |--> x,
Function Field morphism:
From: Rational function field in x over Rational Field
To: Rational function field in y over Rational Field
(continues on next page)
40 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
Defn: x |--> y)
sage: L.change_variable_name( x )[0] is K
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> L,f,t = K.change_variable_name( y )
>>> L,f,t
(Rational function field in y over Rational Field,
Function Field morphism:
From: Rational function field in y over Rational Field
To: Rational function field in x over Rational Field
Defn: y |--> x,
Function Field morphism:
From: Rational function field in x over Rational Field
To: Rational function field in y over Rational Field
Defn: x |--> y)
>>> L.change_variable_name( x )[Integer(0)] is K
True
constant_base_field()
Return the field of which the rational function field is a transcendental extension.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.constant_base_field()
Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.constant_base_field()
Rational Field
constant_field()
Return the field of which the rational function field is a transcendental extension.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.constant_base_field()
Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.constant_base_field()
Rational Field
degree(base=None)
Return the degree over the base field of the rational function field. Since the base field is the rational function
field itself, the degree is 1.
INPUT:
• base – the base field of the vector space; must be the function field itself (the default)
EXAMPLES:
41
Algebraic Function Fields, Release 10.4
sage: K.<t> = FunctionField(QQ)
sage: [Link]()
1
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]()
1
different()
Return the different of the rational function field.
For a rational function field, the different is simply the zero divisor.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: [Link]() #␣
˓→needs [Link]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]() #␣
˓→needs [Link]
equation_order()
Return the maximal order of the function field.
Since this is a rational function field it is of the form 𝐾(𝑡), and the maximal order is by definition 𝐾[𝑡], where
𝐾 is the constant field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.maximal_order()
Maximal order of Rational function field in t over Rational Field
sage: K.equation_order()
Maximal order of Rational function field in t over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.maximal_order()
Maximal order of Rational function field in t over Rational Field
>>> K.equation_order()
Maximal order of Rational function field in t over Rational Field
equation_order_infinite()
Return the maximal infinite order of the function field.
By definition, this is the valuation ring of the degree valuation of the rational function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.maximal_order_infinite()
(continues on next page)
42 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
Maximal infinite order of Rational function field in t over Rational Field
sage: K.equation_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.maximal_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
>>> K.equation_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
extension(f, names=None)
Create an extension 𝐿 = 𝐾[𝑦]/(𝑓 (𝑦)) of the rational function field.
INPUT:
• f – univariate polynomial over self
• names – string or length-1 tuple
OUTPUT:
• a function field
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: [Link](y^5 - x^3 - 3*x + x*y) #␣
˓→needs [Link].function_field
Function field in y defined by y^5 + x*y - x^3 - 3*x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> [Link](y**Integer(5) - x**Integer(3) - Integer(3)*x + x*y) ␣
˓→ # needs [Link].function_field
Function field in y defined by y^5 + x*y - x^3 - 3*x
A nonintegral defining polynomial:
sage: K.<t> = FunctionField(QQ); R.<y> = K[]
sage: [Link](y^3 + (1/t)*y + t^3/(t+1)) #␣
˓→needs [Link].function_field
Function field in y defined by y^3 + 1/t*y + t^3/(t + 1)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> [Link](y**Integer(3) + (Integer(1)/t)*y + t**Integer(3)/
˓→(t+Integer(1))) # needs [Link].function_
˓→field
Function field in y defined by y^3 + 1/t*y + t^3/(t + 1)
The defining polynomial need not be monic or integral:
sage: [Link](t*y^3 + (1/t)*y + t^3/(t+1)) #␣
˓→needs [Link].function_field
Function field in y defined by t*y^3 + 1/t*y + t^3/(t + 1)
43
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> [Link](t*y**Integer(3) + (Integer(1)/t)*y + t**Integer(3)/
˓→(t+Integer(1))) # needs [Link].function_
˓→field
Function field in y defined by t*y^3 + 1/t*y + t^3/(t + 1)
field()
Return the underlying field, forgetting the function field structure.
EXAMPLES:
sage: K.<t> = FunctionField(GF(7))
sage: [Link]()
Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]()
Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 7
See also:
[Link].fraction_field.FractionField_1poly_field.function_field()
free_module(base=None, basis=None, map=True)
Return a vector space 𝑉 and isomorphisms from the field to 𝑉 and from 𝑉 to the field.
This function allows us to identify the elements of this field with elements of a one-dimensional vector space
over the field itself. This method exists so that all function fields (rational or not) have the same interface.
INPUT:
• base – the base field of the vector space; must be the function field itself (the default)
• basis – (ignored) a basis for the vector space
• map – (default True), whether to return maps to and from the vector space
OUTPUT:
• a vector space 𝑉 over base field
• an isomorphism from 𝑉 to the field
• the inverse isomorphism from the field to 𝑉
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: K.free_module() ␣
˓→ # needs [Link]
(Vector space of dimension 1 over Rational function field in x over Rational␣
˓→Field,
Isomorphism:
From: Vector space of dimension 1 over Rational function field in x over␣
˓→Rational Field
To: Rational function field in x over Rational Field,
Isomorphism:
From: Rational function field in x over Rational Field
To: Vector space of dimension 1 over Rational function field in x over␣
˓→Rational Field)
44 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> K.free_module() ␣
˓→ # needs [Link]
(Vector space of dimension 1 over Rational function field in x over Rational␣
˓→Field,
Isomorphism:
From: Vector space of dimension 1 over Rational function field in x over␣
˓→Rational Field
To: Rational function field in x over Rational Field,
Isomorphism:
From: Rational function field in x over Rational Field
To: Vector space of dimension 1 over Rational function field in x over␣
˓→Rational Field)
gen(n=0)
Return the n-th generator of the function field. If n is not 0, then an :class:` IndexError` is raised.
EXAMPLES:
sage: K.<t> = FunctionField(QQ); [Link]()
t
sage: [Link]().parent()
Rational function field in t over Rational Field
sage: [Link](1)
Traceback (most recent call last):
...
IndexError: Only one generator.
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1); [Link]()
t
>>> [Link]().parent()
Rational function field in t over Rational Field
>>> [Link](Integer(1))
Traceback (most recent call last):
...
IndexError: Only one generator.
genus()
Return the genus of the function field, namely 0.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: [Link]()
0
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> [Link]()
0
hom(im_gens, base_morphism=None)
Create a homomorphism from self to another ring.
INPUT:
45
Algebraic Function Fields, Release 10.4
• im_gens – exactly one element of some ring. It must be invertible and transcendental over the image
of base_morphism; this is not checked.
• base_morphism – a homomorphism from the base field into the other ring. If None, try to use a
coercion map.
OUTPUT:
• a map between function fields
EXAMPLES:
We make a map from a rational function field to itself:
sage: K.<x> = FunctionField(GF(7))
sage: [Link]((x^4 + 2)/x)
Function Field endomorphism of Rational function field in x over Finite Field␣
˓→of size 7
Defn: x |--> (x^4 + 2)/x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1)
>>> [Link]((x**Integer(4) + Integer(2))/x)
Function Field endomorphism of Rational function field in x over Finite Field␣
˓→of size 7
Defn: x |--> (x^4 + 2)/x
We construct a map from a rational function field into a non-rational extension field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^3 + 6*x^3 + x)
sage: f = [Link](y^2 + y + 2); f
Function Field morphism:
From: Rational function field in x over Finite Field of size 7
To: Function field in y defined by y^3 + 6*x^3 + x
Defn: x |--> y^2 + y + 2
sage: f(x)
y^2 + y + 2
sage: f(x^2)
5*y^2 + (x^3 + 6*x + 4)*y + 2*x^3 + 5*x + 4
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) + Integer(6)*x**Integer(3) + x, names=( y ,
˓→)); (y,) = L._first_ngens(1)
>>> f = [Link](y**Integer(2) + y + Integer(2)); f
Function Field morphism:
From: Rational function field in x over Finite Field of size 7
To: Function field in y defined by y^3 + 6*x^3 + x
Defn: x |--> y^2 + y + 2
>>> f(x)
y^2 + y + 2
>>> f(x**Integer(2))
5*y^2 + (x^3 + 6*x + 4)*y + 2*x^3 + 5*x + 4
maximal_order()
46 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
Return the maximal order of the function field.
Since this is a rational function field it is of the form 𝐾(𝑡), and the maximal order is by definition 𝐾[𝑡], where
𝐾 is the constant field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.maximal_order()
Maximal order of Rational function field in t over Rational Field
sage: K.equation_order()
Maximal order of Rational function field in t over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.maximal_order()
Maximal order of Rational function field in t over Rational Field
>>> K.equation_order()
Maximal order of Rational function field in t over Rational Field
maximal_order_infinite()
Return the maximal infinite order of the function field.
By definition, this is the valuation ring of the degree valuation of the rational function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: K.maximal_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
sage: K.equation_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> K.maximal_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
>>> K.equation_order_infinite()
Maximal infinite order of Rational function field in t over Rational Field
ngens()
Return the number of generators, which is 1.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: [Link]()
1
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]()
1
polynomial_ring(var='x')
Return a polynomial ring in one variable over the rational function field.
INPUT:
47
Algebraic Function Fields, Release 10.4
• var – string; name of the variable
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: K.polynomial_ring()
Univariate Polynomial Ring in x over Rational function field in x over␣
˓→Rational Field
sage: K.polynomial_ring( T )
Univariate Polynomial Ring in T over Rational function field in x over␣
˓→Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> K.polynomial_ring()
Univariate Polynomial Ring in x over Rational function field in x over␣
˓→Rational Field
>>> K.polynomial_ring( T )
Univariate Polynomial Ring in T over Rational function field in x over␣
˓→Rational Field
random_element(*args, **kwds)
Create a random element of the rational function field.
Parameters are passed to the random_element method of the underlying fraction field.
EXAMPLES:
sage: FunctionField(QQ, alpha ).random_element() # random
(-1/2*alpha^2 - 4)/(-12*alpha^2 + 1/2*alpha - 1/95)
>>> from [Link] import *
>>> FunctionField(QQ, alpha ).random_element() # random
(-1/2*alpha^2 - 4)/(-12*alpha^2 + 1/2*alpha - 1/95)
residue_field(place, name=None)
Return the residue field of the place along with the maps from and to it.
INPUT:
• place – place of the function field
• name – string; name of the generator of the residue field
EXAMPLES:
sage: F.<x> = FunctionField(GF(5))
sage: p = F.places_finite(2)[0] #␣
˓→needs [Link]
sage: R, fr_R, to_R = F.residue_field(p) #␣
˓→needs [Link] [Link].function_field
sage: R #␣
˓→needs [Link] [Link].function_field
Finite Field in z2 of size 5^2
sage: to_R(x) in R #␣
˓→needs [Link] [Link].function_field
True
48 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = F._first_ngens(1)
>>> p = F.places_finite(Integer(2))[Integer(0)] ␣
˓→ # needs [Link]
>>> R, fr_R, to_R = F.residue_field(p) #␣
˓→needs [Link] [Link].function_field
>>> R #␣
˓→needs [Link] [Link].function_field
Finite Field in z2 of size 5^2
>>> to_R(x) in R #␣
˓→needs [Link] [Link].function_field
True
class [Link].function_field.function_field_rational.RationalFunctionField_char_zero(con-
stan
nam
cat-
e-
gory
Bases: RationalFunctionField
Rational function fields of characteristic zero.
higher_derivation()
Return the higher derivation for the function field.
This is also called the Hasse-Schmidt derivation.
EXAMPLES:
sage: F.<x> = FunctionField(QQ)
sage: d = F.higher_derivation() #␣
˓→needs [Link] [Link]
sage: [d(x^5,i) for i in range(10)] #␣
˓→needs [Link] [Link]
[x^5, 5*x^4, 10*x^3, 10*x^2, 5*x, 1, 0, 0, 0, 0]
sage: [d(x^9,i) for i in range(10)] #␣
˓→needs [Link] [Link]
[x^9, 9*x^8, 36*x^7, 84*x^6, 126*x^5, 126*x^4, 84*x^3, 36*x^2, 9*x, 1]
>>> from [Link] import *
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> d = F.higher_derivation() #␣
˓→needs [Link] [Link]
>>> [d(x**Integer(5),i) for i in range(Integer(10))] ␣
˓→ # needs [Link] [Link]
[x^5, 5*x^4, 10*x^3, 10*x^2, 5*x, 1, 0, 0, 0, 0]
>>> [d(x**Integer(9),i) for i in range(Integer(10))] ␣
˓→ # needs [Link] [Link]
[x^9, 9*x^8, 36*x^7, 84*x^6, 126*x^5, 126*x^4, 84*x^3, 36*x^2, 9*x, 1]
class [Link].function_field.function_field_rational.RationalFunctionField_global(con-
stant_fie
names,
cat-
e-
gory=No
49
Algebraic Function Fields, Release 10.4
Bases: RationalFunctionField
Rational function field over finite fields.
get_place(degree)
Return a place of degree.
INPUT:
• degree – a positive integer
EXAMPLES:
sage: F.<a> = GF(2)
sage: K.<x> = FunctionField(F)
sage: K.get_place(1) #␣
˓→needs [Link]
Place (x)
sage: K.get_place(2) #␣
˓→needs [Link]
Place (x^2 + x + 1)
sage: K.get_place(3) #␣
˓→needs [Link]
Place (x^3 + x + 1)
sage: K.get_place(4) #␣
˓→needs [Link]
Place (x^4 + x + 1)
sage: K.get_place(5) #␣
˓→needs [Link]
Place (x^5 + x^2 + 1)
>>> from [Link] import *
>>> F = GF(Integer(2), names=( a ,)); (a,) = F._first_ngens(1)
>>> K = FunctionField(F, names=( x ,)); (x,) = K._first_ngens(1)
>>> K.get_place(Integer(1)) ␣
˓→ # needs [Link]
Place (x)
>>> K.get_place(Integer(2)) ␣
˓→ # needs [Link]
Place (x^2 + x + 1)
>>> K.get_place(Integer(3)) ␣
˓→ # needs [Link]
Place (x^3 + x + 1)
>>> K.get_place(Integer(4)) ␣
˓→ # needs [Link]
Place (x^4 + x + 1)
>>> K.get_place(Integer(5)) ␣
˓→ # needs [Link]
Place (x^5 + x^2 + 1)
higher_derivation()
Return the higher derivation for the function field.
This is also called the Hasse-Schmidt derivation.
EXAMPLES:
50 Chapter 2. Function Fields: rational
Algebraic Function Fields, Release 10.4
sage: F.<x> = FunctionField(GF(5))
sage: d = F.higher_derivation() #␣
˓→needs [Link].function_field
sage: [d(x^5,i) for i in range(10)] #␣
˓→needs [Link].function_field
[x^5, 0, 0, 0, 0, 1, 0, 0, 0, 0]
sage: [d(x^7,i) for i in range(10)] #␣
˓→needs [Link].function_field
[x^7, 2*x^6, x^5, 0, 0, x^2, 2*x, 1, 0, 0]
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = F._first_ngens(1)
>>> d = F.higher_derivation() #␣
˓→needs [Link].function_field
>>> [d(x**Integer(5),i) for i in range(Integer(10))] ␣
˓→ # needs [Link].function_field
[x^5, 0, 0, 0, 0, 1, 0, 0, 0, 0]
>>> [d(x**Integer(7),i) for i in range(Integer(10))] ␣
˓→ # needs [Link].function_field
[x^7, 2*x^6, x^5, 0, 0, x^2, 2*x, 1, 0, 0]
place_infinite()
Return the unique place at infinity.
EXAMPLES:
sage: F.<x> = FunctionField(GF(5))
sage: F.place_infinite()
Place (1/x)
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = F._first_ngens(1)
>>> F.place_infinite()
Place (1/x)
places(degree=1)
Return all places of the degree.
INPUT:
• degree – (default: 1) a positive integer
EXAMPLES:
sage: F.<x> = FunctionField(GF(5))
sage: [Link]() #␣
˓→needs [Link]
[Place (1/x),
Place (x),
Place (x + 1),
Place (x + 2),
Place (x + 3),
Place (x + 4)]
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = F._first_ngens(1)
>>> [Link]() #␣
(continues on next page)
51
Algebraic Function Fields, Release 10.4
(continued from previous page)
needs [Link]
˓→
[Place (1/x),
Place (x),
Place (x + 1),
Place (x + 2),
Place (x + 3),
Place (x + 4)]
places_finite(degree=1)
Return the finite places of the degree.
INPUT:
• degree – (default: 1) a positive integer
EXAMPLES:
sage: F.<x> = FunctionField(GF(5))
sage: F.places_finite() #␣
˓→needs [Link]
[Place (x), Place (x + 1), Place (x + 2), Place (x + 3), Place (x + 4)]
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = F._first_ngens(1)
>>> F.places_finite() #␣
˓→needs [Link]
[Place (x), Place (x + 1), Place (x + 2), Place (x + 3), Place (x + 4)]
52 Chapter 2. Function Fields: rational
CHAPTER
THREE
FUNCTION FIELDS: EXTENSION
class [Link].function_field.function_field_polymod.FunctionField_char_zero(poly-
no-
mial,
names,
cat-
e-
gory=None)
Bases: FunctionField_simple
Function fields of characteristic zero.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2))
sage: L
Function field in y defined by y^3 + (-x^3 + 1)/(x^3 - 2)
sage: [Link]()
0
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ]; (Y,
˓→) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/(x**Integer(3) -␣
˓→Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)
>>> L
Function field in y defined by y^3 + (-x^3 + 1)/(x^3 - 2)
>>> [Link]()
0
higher_derivation()
Return the higher derivation (also called the Hasse-Schmidt derivation) for the function field.
The higher derivation of the function field is uniquely determined with respect to the separating element 𝑥 of
the base rational function field 𝑘(𝑥).
EXAMPLES:
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2))
sage: L.higher_derivation() #␣
˓→needs [Link]
Higher derivation map:
(continues on next page)
53
Algebraic Function Fields, Release 10.4
(continued from previous page)
From: Function field in y defined by y^3 + (-x^3 + 1)/(x^3 - 2)
To: Function field in y defined by y^3 + (-x^3 + 1)/(x^3 - 2)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)
>>> L.higher_derivation() #␣
˓→needs [Link]
Higher derivation map:
From: Function field in y defined by y^3 + (-x^3 + 1)/(x^3 - 2)
To: Function field in y defined by y^3 + (-x^3 + 1)/(x^3 - 2)
class [Link].function_field.function_field_polymod.FunctionField_char_zero_integral(poly
no-
mia
nam
cat-
e-
gory
Bases: FunctionField_char_zero, FunctionField_integral
Function fields of characteristic zero, defined by an irreducible and separable polynomial, integral over the maximal
order of the base rational function field with a finite constant field.
class [Link].function_field.function_field_polymod.FunctionField_global(poly-
no-
mial,
names)
Bases: FunctionField_simple
Global function fields.
INPUT:
• polynomial – monic irreducible and separable polynomial
• names – name of the generator of the function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].finite_rings
sage: L #␣
˓→needs [Link].finite_rings
Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/(x**Integer(3) -␣
˓→Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)# needs [Link].finite_
˓→rings
>>> L #␣
(continues on next page)
54 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→needs [Link].finite_rings
Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
The defining equation needs not be monic:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link]((1 - x)*Y^7 - x^3) #␣
˓→needs [Link].finite_rings
sage: [Link]() # long time (6s) #␣
˓→needs [Link].finite_rings
[1, 2, 3]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link]((Integer(1) - x)*Y**Integer(7) - x**Integer(3), names=( y ,));
˓→ (y,) = L._first_ngens(1)# needs [Link].finite_rings
>>> [Link]() # long time (6s) #␣
˓→needs [Link].finite_rings
[1, 2, 3]
or may define a trivial extension:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y-1) #␣
˓→needs [Link].finite_rings
sage: [Link]() #␣
˓→needs [Link].finite_rings
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y-Integer(1), names=( y ,)); (y,) = L._first_ngens(1)# needs␣
˓→[Link].finite_rings
>>> [Link]() #␣
˓→needs [Link].finite_rings
L_polynomial(name='t')
Return the L-polynomial of the function field.
INPUT:
• name – (default: t) name of the variable of the polynomial
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings
sage: F.L_polynomial() #␣
˓→needs [Link].finite_rings
2*t^2 + t + 1
55
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)# needs [Link].finite_rings
>>> F.L_polynomial() #␣
˓→needs [Link].finite_rings
2*t^2 + t + 1
gaps()
Return the gaps of the function field.
These are the gaps at the ordinary places, that is, places which are not Weierstrass places.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 + x^3 * Y + x) #␣
˓→needs [Link].finite_rings
sage: [Link]() #␣
˓→needs [Link] [Link].finite_rings
[1, 2, 3]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) + x**Integer(3) * Y + x, names=( y ,)); (y,
˓→) = L._first_ngens(1)# needs [Link].finite_rings
>>> [Link]() #␣
˓→needs [Link] [Link].finite_rings
[1, 2, 3]
get_place(degree)
Return a place of degree.
INPUT:
• degree – a positive integer
OUTPUT: a place of degree if any exists; otherwise None
EXAMPLES:
sage: # needs [Link].finite_rings
sage: F.<a> = GF(2)
sage: K.<x> = FunctionField(F)
sage: R.<Y> = PolynomialRing(K)
sage: L.<y> = [Link](Y^4 + Y - x^5)
sage: L.get_place(1)
Place (x, y)
sage: L.get_place(2)
Place (x, y^2 + y + 1)
sage: L.get_place(3)
Place (x^3 + x^2 + 1, y + x^2 + x)
sage: L.get_place(4)
Place (x + 1, x^5 + 1)
sage: L.get_place(5)
(continues on next page)
56 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
Place (x^5 + x^3 + x^2 + x + 1, y + x^4 + 1)
sage: L.get_place(6)
Place (x^3 + x^2 + 1, y^2 + y + x^2)
sage: L.get_place(7)
Place (x^7 + x + 1, y + x^6 + x^5 + x^4 + x^3 + x)
sage: L.get_place(8)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = GF(Integer(2), names=( a ,)); (a,) = F._first_ngens(1)
>>> K = FunctionField(F, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = PolynomialRing(K, names=( Y ,)); (Y,) = R._first_ngens(1)
>>> L = [Link](Y**Integer(4) + Y - x**Integer(5), names=( y ,)); (y,) =␣
˓→L._first_ngens(1)
>>> L.get_place(Integer(1))
Place (x, y)
>>> L.get_place(Integer(2))
Place (x, y^2 + y + 1)
>>> L.get_place(Integer(3))
Place (x^3 + x^2 + 1, y + x^2 + x)
>>> L.get_place(Integer(4))
Place (x + 1, x^5 + 1)
>>> L.get_place(Integer(5))
Place (x^5 + x^3 + x^2 + x + 1, y + x^4 + 1)
>>> L.get_place(Integer(6))
Place (x^3 + x^2 + 1, y^2 + y + x^2)
>>> L.get_place(Integer(7))
Place (x^7 + x + 1, y + x^6 + x^5 + x^4 + x^3 + x)
>>> L.get_place(Integer(8))
higher_derivation()
Return the higher derivation (also called the Hasse-Schmidt derivation) for the function field.
The higher derivation of the function field is uniquely determined with respect to the separating element 𝑥 of
the base rational function field 𝑘(𝑥).
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 - (x^3 - 1)/(x^3 - 2)) #␣
˓→needs [Link].finite_rings
sage: L.higher_derivation() #␣
˓→needs [Link] [Link].finite_rings
Higher derivation map:
From: Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
To: Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) - (x**Integer(3) - Integer(1))/
˓→(x**Integer(3) - Integer(2)), names=( y ,)); (y,) = L._first_ngens(1)#␣
˓→needs [Link].finite_rings
>>> L.higher_derivation() #␣
˓→needs [Link] [Link].finite_rings
(continues on next page)
57
Algebraic Function Fields, Release 10.4
(continued from previous page)
Higher derivation map:
From: Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
To: Function field in y defined by y^3 + (4*x^3 + 1)/(x^3 + 3)
maximal_order()
Return the maximal order of the function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^4 + x^12*t^2 + x^18*t + x^21 + x^18)
sage: O = F.maximal_order()
sage: [Link]()
(1, 1/x^4*y, 1/x^11*y^2 + 1/x^2, 1/x^15*y^3 + 1/x^6*y)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(4) + x**Integer(12)*t**Integer(2) +␣
˓→x**Integer(18)*t + x**Integer(21) + x**Integer(18), names=( y ,)); (y,) = F.
˓→_first_ngens(1)
>>> O = F.maximal_order()
>>> [Link]()
(1, 1/x^4*y, 1/x^11*y^2 + 1/x^2, 1/x^15*y^3 + 1/x^6*y)
number_of_rational_places(r=1)
Return the number of rational places of the function field whose constant field extended by degree r.
INPUT:
• r – positive integer (default: 1)
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: F.number_of_rational_places()
4
sage: [F.number_of_rational_places(r) for r in [1..10]]
[4, 8, 4, 16, 44, 56, 116, 288, 508, 968]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> F.number_of_rational_places()
4
>>> [F.number_of_rational_places(r) for r in (ellipsis_range(Integer(1),
˓→Ellipsis,Integer(10)))]
[4, 8, 4, 16, 44, 56, 116, 288, 508, 968]
58 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
places(degree=1)
Return a list of the places with degree.
INPUT:
• degree – positive integer (default: 1)
EXAMPLES:
sage: # needs [Link].finite_rings
sage: F.<a> = GF(2)
sage: K.<x> = FunctionField(F)
sage: R.<t> = PolynomialRing(K)
sage: L.<y> = [Link](t^4 + t - x^5)
sage: [Link](1)
[Place (1/x, 1/x^4*y^3), Place (x, y), Place (x, y + 1)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = GF(Integer(2), names=( a ,)); (a,) = F._first_ngens(1)
>>> K = FunctionField(F, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> L = [Link](t**Integer(4) + t - x**Integer(5), names=( y ,)); (y,) =␣
˓→L._first_ngens(1)
>>> [Link](Integer(1))
[Place (1/x, 1/x^4*y^3), Place (x, y), Place (x, y + 1)]
places_finite(degree=1)
Return a list of the finite places with degree.
INPUT:
• degree – positive integer (default: 1)
EXAMPLES:
sage: # needs [Link].finite_rings
sage: F.<a> = GF(2)
sage: K.<x> = FunctionField(F)
sage: R.<t> = PolynomialRing(K)
sage: L.<y> = [Link](t^4 + t - x^5)
sage: L.places_finite(1)
[Place (x, y), Place (x, y + 1)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = GF(Integer(2), names=( a ,)); (a,) = F._first_ngens(1)
>>> K = FunctionField(F, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> L = [Link](t**Integer(4) + t - x**Integer(5), names=( y ,)); (y,) =␣
˓→L._first_ngens(1)
>>> L.places_finite(Integer(1))
[Place (x, y), Place (x, y + 1)]
weierstrass_places()
Return all Weierstrass places of the function field.
EXAMPLES:
59
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 + x^3 * Y + x) #␣
˓→needs [Link].finite_rings
sage: L.weierstrass_places() #␣
˓→needs [Link] [Link].finite_rings
[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 + 1, (x^3 + 1)*y + x + 1),
Place (x^3 + x + 1, y + 1),
Place (x^3 + x + 1, y + x^2),
Place (x^3 + x + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x),
Place (x^3 + x^2 + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x^2 + x + 1)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) + x**Integer(3) * Y + x, names=( y ,)); (y,
˓→) = L._first_ngens(1)# needs [Link].finite_rings
>>> L.weierstrass_places() #␣
˓→needs [Link] [Link].finite_rings
[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 + 1, (x^3 + 1)*y + x + 1),
Place (x^3 + x + 1, y + 1),
Place (x^3 + x + 1, y + x^2),
Place (x^3 + x + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x),
Place (x^3 + x^2 + 1, y + x^2 + 1),
Place (x^3 + x^2 + 1, y + x^2 + x + 1)]
class [Link].function_field.function_field_polymod.FunctionField_global_integral(poly-
no-
mial,
names)
Bases: FunctionField_global, FunctionField_integral
Global function fields, defined by an irreducible and separable polynomial, integral over the maximal order of the
base rational function field with a finite constant field.
class [Link].function_field.function_field_polymod.FunctionField_integral(poly-
no-
mial,
names,
cat-
e-
gory=None)
Bases: FunctionField_simple
Integral function fields.
A function field is integral if it is defined by an irreducible separable polynomial, which is integral over the maximal
order of the base rational function field.
60 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
equation_order()
Return the equation order of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = PolynomialRing(K) #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2) #␣
˓→needs [Link].finite_rings
sage: F.equation_order() #␣
˓→needs [Link].finite_rings
Order in Function field in y defined by y^3 + x^6 + x^4 + x^2
sage: K.<x> = FunctionField(QQ); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: F.equation_order()
Order in Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 - 2*x^3 - x^
˓→2
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)# needs sage.
˓→rings.finite_rings
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)# needs [Link].finite_rings
>>> F.equation_order() #␣
˓→needs [Link].finite_rings
Order in Function field in y defined by y^3 + x^6 + x^4 + x^2
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R =␣
˓→PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> F.equation_order()
Order in Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 - 2*x^3 - x^
˓→2
equation_order_infinite()
Return the infinite equation order of the function field.
This is by definition 𝑜[𝑏] where 𝑏 is the primitive integral element from primitive_integal_ele-
ment_infinite() and 𝑜 is the maximal infinite order of the base rational function field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = PolynomialRing(K) #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2) #␣
˓→needs [Link].finite_rings
sage: F.equation_order_infinite() #␣
˓→needs [Link].finite_rings
Infinite order in Function field in y defined by y^3 + x^6 + x^4 + x^2
sage: K.<x> = FunctionField(QQ); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: F.equation_order_infinite()
(continues on next page)
61
Algebraic Function Fields, Release 10.4
(continued from previous page)
Infinite order in Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 -␣
˓→2*x^3 - x^2
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)# needs sage.
˓→rings.finite_rings
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)# needs [Link].finite_rings
>>> F.equation_order_infinite() #␣
˓→needs [Link].finite_rings
Infinite order in Function field in y defined by y^3 + x^6 + x^4 + x^2
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R =␣
˓→PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> F.equation_order_infinite()
Infinite order in Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 -␣
˓→2*x^3 - x^2
primitive_integal_element_infinite()
Return a primitive integral element over the base maximal infinite order.
This element is integral over the maximal infinite order of the base rational function field and the function
field is a simple extension by this element over the base order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: b = F.primitive_integal_element_infinite(); b
1/x^2*y
sage: b.minimal_polynomial( t )
t^3 + (x^4 + x^2 + 1)/x^4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> b = F.primitive_integal_element_infinite(); b
1/x^2*y
>>> b.minimal_polynomial( t )
t^3 + (x^4 + x^2 + 1)/x^4
62 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
class [Link].function_field.function_field_polymod.FunctionField_polymod(poly-
no-
mial,
names,
cat-
e-
gory=None)
Bases: FunctionField
Function fields defined by a univariate polynomial, as an extension of the base field.
INPUT:
• polynomial – univariate polynomial over a function field
• names – tuple of length 1 or string; variable names
• category – category (default: category of function fields)
EXAMPLES:
We make a function field defined by a degree 5 polynomial over the rational function field over the rational numbers:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x)); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/
˓→x), names=( y ,)); (y,) = L._first_ngens(1); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
We next make a function field over the above nontrivial function field L:
sage: S.<z> = L[]
sage: M.<z> = [Link](z^2 + y*z + y); M
Function field in z defined by z^2 + y*z + y
sage: 1/z
((-x/(x^4 + 1))*y^4 + 2*x^2/(x^4 + 1))*z - 1
sage: z * (1/z)
1
>>> from [Link] import *
>>> S = L[ z ]; (z,) = S._first_ngens(1)
>>> M = [Link](z**Integer(2) + y*z + y, names=( z ,)); (z,) = M._first_
˓→ngens(1); M
Function field in z defined by z^2 + y*z + y
>>> Integer(1)/z
((-x/(x^4 + 1))*y^4 + 2*x^2/(x^4 + 1))*z - 1
>>> z * (Integer(1)/z)
1
We drill down the tower of function fields:
sage: M.base_field()
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
(continues on next page)
63
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: M.base_field().base_field()
Rational function field in x over Rational Field
sage: M.base_field().base_field().constant_field()
Rational Field
sage: M.constant_base_field()
Rational Field
>>> from [Link] import *
>>> M.base_field()
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> M.base_field().base_field()
Rational function field in x over Rational Field
>>> M.base_field().base_field().constant_field()
Rational Field
>>> M.constant_base_field()
Rational Field
Warning: It is not checked if the polynomial used to define the function field is irreducible Hence it is not
guaranteed that this object really is a field! This is illustrated below.
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](x^2 - y^2)
sage: (y - x)*(y + x)
0
sage: 1/(y - x)
1
sage: y - x == 0; y + x == 0
False
False
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](x**Integer(2) - y**Integer(2), names=( y ,)); (y,) = L._first_
˓→ngens(1)
>>> (y - x)*(y + x)
0
>>> Integer(1)/(y - x)
1
>>> y - x == Integer(0); y + x == Integer(0)
False
False
Element
alias of FunctionFieldElement_polymod
base_field()
Return the base field of the function field. This function field is presented as 𝐿 = 𝐾[𝑦]/(𝑓 (𝑦)), and the base
field is by definition the field 𝐾.
EXAMPLES:
64 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: L.base_field()
Rational function field in x over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> L.base_field()
Rational function field in x over Rational Field
change_variable_name(name)
Return a field isomorphic to this field with variable(s) name.
INPUT:
• name – a string or a tuple consisting of a strings, the names of the new variables starting with a generator
of this field and going down to the rational function field.
OUTPUT:
A triple F,f,t where F is a function field, f is an isomorphism from F to this field, and t is the inverse of
f.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: R.<z> = L[]
sage: M.<z> = [Link](z^2 - y)
sage: M.change_variable_name( zz )
(Function field in zz defined by zz^2 - y,
Function Field morphism:
From: Function field in zz defined by zz^2 - y
To: Function field in z defined by z^2 - y
Defn: zz |--> z
y |--> y
x |--> x,
Function Field morphism:
From: Function field in z defined by z^2 - y
To: Function field in zz defined by zz^2 - y
Defn: z |--> zz
y |--> y
x |--> x)
sage: M.change_variable_name(( zz , yy ))
(Function field in zz defined by zz^2 - yy,
Function Field morphism:
From: Function field in zz defined by zz^2 - yy
To: Function field in z defined by z^2 - y
Defn: zz |--> z
yy |--> y
x |--> x,
Function Field morphism:
From: Function field in z defined by z^2 - y
(continues on next page)
65
Algebraic Function Fields, Release 10.4
(continued from previous page)
To: Function field in zz defined by zz^2 - yy
Defn: z |--> zz
y |--> yy
x |--> x)
sage: M.change_variable_name(( zz , yy , xx ))
(Function field in zz defined by zz^2 - yy,
Function Field morphism:
From: Function field in zz defined by zz^2 - yy
To: Function field in z defined by z^2 - y
Defn: zz |--> z
yy |--> y
xx |--> x,
Function Field morphism:
From: Function field in z defined by z^2 - y
To: Function field in zz defined by zz^2 - yy
Defn: z |--> zz
y |--> yy
x |--> xx)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> M.change_variable_name( zz )
(Function field in zz defined by zz^2 - y,
Function Field morphism:
From: Function field in zz defined by zz^2 - y
To: Function field in z defined by z^2 - y
Defn: zz |--> z
y |--> y
x |--> x,
Function Field morphism:
From: Function field in z defined by z^2 - y
To: Function field in zz defined by zz^2 - y
Defn: z |--> zz
y |--> y
x |--> x)
>>> M.change_variable_name(( zz , yy ))
(Function field in zz defined by zz^2 - yy,
Function Field morphism:
From: Function field in zz defined by zz^2 - yy
To: Function field in z defined by z^2 - y
Defn: zz |--> z
yy |--> y
x |--> x,
Function Field morphism:
From: Function field in z defined by z^2 - y
To: Function field in zz defined by zz^2 - yy
Defn: z |--> zz
y |--> yy
x |--> x)
>>> M.change_variable_name(( zz , yy , xx ))
(Function field in zz defined by zz^2 - yy,
(continues on next page)
66 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
Function Field morphism:
From: Function field in zz defined by zz^2 - yy
To: Function field in z defined by z^2 - y
Defn: zz |--> z
yy |--> y
xx |--> x,
Function Field morphism:
From: Function field in z defined by z^2 - y
To: Function field in zz defined by zz^2 - yy
Defn: z |--> zz
y |--> yy
x |--> xx)
constant_base_field()
Return the base constant field of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x)); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
sage: L.constant_base_field()
Rational Field
sage: S.<z> = L[]
sage: M.<z> = [Link](z^2 - y)
sage: M.constant_base_field()
Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> L.constant_base_field()
Rational Field
>>> S = L[ z ]; (z,) = S._first_ngens(1)
>>> M = [Link](z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> M.constant_base_field()
Rational Field
constant_field()
Return the algebraic closure of the constant field of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^5 - x) #␣
˓→needs [Link].finite_rings
sage: L.constant_field() #␣
˓→needs [Link].finite_rings
Traceback (most recent call last):
...
NotImplementedError
67
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(5) - x, names=( y ,)); (y,) = L._first_ngens(1)
˓→# needs [Link].finite_rings
>>> L.constant_field() #␣
˓→needs [Link].finite_rings
Traceback (most recent call last):
...
NotImplementedError
degree(base=None)
Return the degree of the function field over the function field base.
INPUT:
• base – a function field (default: None), a function field from which this field has been constructed as a
finite extension.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x)); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
sage: [Link]()
5
sage: [Link](L)
1
sage: R.<z> = L[]
sage: M.<z> = [Link](z^2 - y)
sage: [Link](L)
2
sage: [Link](K)
10
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> [Link]()
5
>>> [Link](L)
1
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> [Link](L)
2
>>> [Link](K)
10
different()
Return the different of the function field.
EXAMPLES:
68 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2) #␣
˓→needs [Link].finite_rings
sage: [Link]() #␣
˓→needs [Link].finite_rings
2*Place (x, (1/(x^3 + x^2 + x))*y^2)
+ 2*Place (x^2 + x + 1, (1/(x^3 + x^2 + x))*y^2)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)# needs␣
˓→[Link].finite_rings
>>> [Link]() #␣
˓→needs [Link].finite_rings
2*Place (x, (1/(x^3 + x^2 + x))*y^2)
+ 2*Place (x^2 + x + 1, (1/(x^3 + x^2 + x))*y^2)
equation_order()
Return the equation order of the function field.
If we view the function field as being presented as 𝐾[𝑦]/(𝑓 (𝑦)), then the order generated by the class of 𝑦
is returned. If 𝑓 is not monic, then _make_monic_integral() is called, and instead we get the order
generated by some integral multiple of a root of 𝑓 .
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: O = L.equation_order()
sage: [Link]()
(1, x*y, x^2*y^2, x^3*y^3, x^4*y^4)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> [Link]()
(1, x*y, x^2*y^2, x^3*y^3, x^4*y^4)
We try an example, in which the defining polynomial is not monic and is not integral:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](x^2*y^5 - 1/x); L
Function field in y defined by x^2*y^5 - 1/x
sage: O = L.equation_order()
sage: [Link]()
(1, x^3*y, x^6*y^2, x^9*y^3, x^12*y^4)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
(continues on next page)
69
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> L = [Link](x**Integer(2)*y**Integer(5) - Integer(1)/x, names=( y ,));
˓→ (y,) = L._first_ngens(1); L
Function field in y defined by x^2*y^5 - 1/x
>>> O = L.equation_order()
>>> [Link]()
(1, x^3*y, x^6*y^2, x^9*y^3, x^12*y^4)
free_module(base=None, basis=None, map=True)
Return a vector space and isomorphisms from the field to and from the vector space.
This function allows us to identify the elements of this field with elements of a vector space over the base
field, which is useful for representation and arithmetic with orders, ideals, etc.
INPUT:
• base – a function field (default: None), the returned vector space is over this subfield 𝑅, which defaults
to the base field of this function field.
• basis – a basis for this field over the base.
• maps – boolean (default True), whether to return 𝑅-linear maps to and from 𝑉 .
OUTPUT:
• a vector space over the base function field
• an isomorphism from the vector space to the field (if requested)
• an isomorphism from the field to the vector space (if requested)
EXAMPLES:
We define a function field:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x)); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1); L
Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
We get the vector spaces, and maps back and forth:
sage: # needs [Link]
sage: V, from_V, to_V = L.free_module()
sage: V
Vector space of dimension 5 over Rational function field in x over Rational␣
˓→Field
sage: from_V
Isomorphism:
From: Vector space of dimension 5 over Rational function field in x over␣
˓→Rational Field
To: Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
sage: to_V
Isomorphism:
From: Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
(continues on next page)
70 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
To: Vector space of dimension 5 over Rational function field in x over␣
˓→Rational Field
>>> from [Link] import *
>>> # needs [Link]
>>> V, from_V, to_V = L.free_module()
>>> V
Vector space of dimension 5 over Rational function field in x over Rational␣
˓→Field
>>> from_V
Isomorphism:
From: Vector space of dimension 5 over Rational function field in x over␣
˓→Rational Field
To: Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> to_V
Isomorphism:
From: Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
To: Vector space of dimension 5 over Rational function field in x over␣
˓→Rational Field
We convert an element of the vector space back to the function field:
sage: from_V(V.1) #␣
˓→needs [Link]
>>> from [Link] import *
>>> from_V([Link](1)) ␣
˓→ # needs [Link]
We define an interesting element of the function field:
sage: a = 1/L.0; a #␣
˓→needs [Link]
(x/(x^4 + 1))*y^4 - 2*x^2/(x^4 + 1)
>>> from [Link] import *
>>> a = Integer(1)/[Link](0); a ␣
˓→ # needs [Link]
(x/(x^4 + 1))*y^4 - 2*x^2/(x^4 + 1)
We convert it to the vector space, and get a vector over the base field:
sage: to_V(a) #␣
˓→needs [Link]
(-2*x^2/(x^4 + 1), 0, 0, 0, x/(x^4 + 1))
>>> from [Link] import *
>>> to_V(a) #␣
˓→needs [Link]
(-2*x^2/(x^4 + 1), 0, 0, 0, x/(x^4 + 1))
We convert to and back, and get the same element:
71
Algebraic Function Fields, Release 10.4
sage: from_V(to_V(a)) == a #␣
˓→needs [Link]
True
>>> from [Link] import *
>>> from_V(to_V(a)) == a #␣
˓→needs [Link]
True
In the other direction:
sage: v = x*V.0 + (1/x)*V.1 #␣
˓→needs [Link]
sage: to_V(from_V(v)) == v #␣
˓→needs [Link]
True
>>> from [Link] import *
>>> v = x*[Link](0) + (Integer(1)/x)*[Link](1) ␣
˓→ # needs [Link]
>>> to_V(from_V(v)) == v #␣
˓→needs [Link]
True
And we show how it works over an extension of an extension field:
sage: R2.<z> = L[]; M.<z> = [Link](z^2 - y)
sage: M.free_module() #␣
˓→needs [Link]
(Vector space of dimension 2 over Function field in y defined by y^5 - 2*x*y␣
˓→+ (-x^4 - 1)/x,
Isomorphism:
From: Vector space of dimension 2 over Function field in y defined by y^5 -␣
˓→2*x*y + (-x^4 - 1)/x
To: Function field in z defined by z^2 - y,
Isomorphism:
From: Function field in z defined by z^2 - y
To: Vector space of dimension 2 over Function field in y defined by y^5 -␣
˓→2*x*y + (-x^4 - 1)/x)
>>> from [Link] import *
>>> R2 = L[ z ]; (z,) = R2._first_ngens(1); M = [Link](z**Integer(2) - y,
˓→ names=( z ,)); (z,) = M._first_ngens(1)
>>> M.free_module() #␣
˓→needs [Link]
(Vector space of dimension 2 over Function field in y defined by y^5 - 2*x*y␣
˓→+ (-x^4 - 1)/x,
Isomorphism:
From: Vector space of dimension 2 over Function field in y defined by y^5 -␣
˓→2*x*y + (-x^4 - 1)/x
To: Function field in z defined by z^2 - y,
Isomorphism:
From: Function field in z defined by z^2 - y
To: Vector space of dimension 2 over Function field in y defined by y^5 -␣
˓→2*x*y + (-x^4 - 1)/x)
We can also get the vector space of M over K:
72 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
sage: M.free_module(K) #␣
˓→needs [Link]
(Vector space of dimension 10 over Rational function field in x over Rational␣
˓→Field,
Isomorphism:
From: Vector space of dimension 10 over Rational function field in x over␣
˓→Rational Field
To: Function field in z defined by z^2 - y,
Isomorphism:
From: Function field in z defined by z^2 - y
To: Vector space of dimension 10 over Rational function field in x over␣
˓→Rational Field)
>>> from [Link] import *
>>> M.free_module(K) #␣
˓→needs [Link]
(Vector space of dimension 10 over Rational function field in x over Rational␣
˓→Field,
Isomorphism:
From: Vector space of dimension 10 over Rational function field in x over␣
˓→Rational Field
To: Function field in z defined by z^2 - y,
Isomorphism:
From: Function field in z defined by z^2 - y
To: Vector space of dimension 10 over Rational function field in x over␣
˓→Rational Field)
gen(n=0)
Return the 𝑛-th generator of the function field. By default, 𝑛 is 0; any other value of 𝑛 leads to an error. The
generator is the class of 𝑦, if we view the function field as being presented as 𝐾[𝑦]/(𝑓 (𝑦)).
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: [Link]()
y
sage: [Link](1)
Traceback (most recent call last):
...
IndexError: there is only one generator
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link]()
y
>>> [Link](Integer(1))
Traceback (most recent call last):
...
IndexError: there is only one generator
genus()
Return the genus of the function field.
73
Algebraic Function Fields, Release 10.4
For now, the genus is computed using Singular.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^3 - (x^3 + 2*x*y + 1/x))
sage: [Link]()
3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link]()
3
hom(im_gens, base_morphism=None)
Create a homomorphism from the function field to another function field.
INPUT:
• im_gens – list of images of the generators of the function field and of successive base rings.
• base_morphism – homomorphism of the base ring, after the im_gens are used. Thus if im_gens
has length 2, then base_morphism should be a morphism from the base ring of the base ring of the
function field.
EXAMPLES:
We create a rational function field, and a quadratic extension of it:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
We make the field automorphism that sends y to -y:
sage: f = [Link](-y); f
Function Field endomorphism of Function field in y defined by y^2 - x^3 - 1
Defn: y |--> -y
>>> from [Link] import *
>>> f = [Link](-y); f
Function Field endomorphism of Function field in y defined by y^2 - x^3 - 1
Defn: y |--> -y
Evaluation works:
sage: f(y*x - 1/x)
-x*y - 1/x
74 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> f(y*x - Integer(1)/x)
-x*y - 1/x
We try to define an invalid morphism:
sage: f = [Link](y + 1)
Traceback (most recent call last):
...
ValueError: invalid morphism
>>> from [Link] import *
>>> f = [Link](y + Integer(1))
Traceback (most recent call last):
...
ValueError: invalid morphism
We make a morphism of the base rational function field:
sage: phi = [Link](x + 1); phi
Function Field endomorphism of Rational function field in x over Rational␣
˓→Field
Defn: x |--> x + 1
sage: phi(x^3 - 3)
x^3 + 3*x^2 + 3*x - 2
sage: (x+1)^3 - 3
x^3 + 3*x^2 + 3*x - 2
>>> from [Link] import *
>>> phi = [Link](x + Integer(1)); phi
Function Field endomorphism of Rational function field in x over Rational␣
˓→Field
Defn: x |--> x + 1
>>> phi(x**Integer(3) - Integer(3))
x^3 + 3*x^2 + 3*x - 2
>>> (x+Integer(1))**Integer(3) - Integer(3)
x^3 + 3*x^2 + 3*x - 2
We make a morphism by specifying where the generators and the base generators go:
sage: [Link]([-y, x])
Function Field endomorphism of Function field in y defined by y^2 - x^3 - 1
Defn: y |--> -y
x |--> x
>>> from [Link] import *
>>> [Link]([-y, x])
Function Field endomorphism of Function field in y defined by y^2 - x^3 - 1
Defn: y |--> -y
x |--> x
You can also specify a morphism on the base:
sage: R1.<q> = K[]
sage: L1.<q> = [Link](q^2 - (x+1)^3 - 1)
sage: [Link](q, base_morphism=phi)
(continues on next page)
75
Algebraic Function Fields, Release 10.4
(continued from previous page)
Function Field morphism:
From: Function field in y defined by y^2 - x^3 - 1
To: Function field in q defined by q^2 - x^3 - 3*x^2 - 3*x - 2
Defn: y |--> q
x |--> x + 1
>>> from [Link] import *
>>> R1 = K[ q ]; (q,) = R1._first_ngens(1)
>>> L1 = [Link](q**Integer(2) - (x+Integer(1))**Integer(3) - Integer(1),␣
˓→names=( q ,)); (q,) = L1._first_ngens(1)
>>> [Link](q, base_morphism=phi)
Function Field morphism:
From: Function field in y defined by y^2 - x^3 - 1
To: Function field in q defined by q^2 - x^3 - 3*x^2 - 3*x - 2
Defn: y |--> q
x |--> x + 1
We make another extension of a rational function field:
sage: K2.<t> = FunctionField(QQ); R2.<w> = K2[]
sage: L2.<w> = [Link]((4*w)^2 - (t+1)^3 - 1)
>>> from [Link] import *
>>> K2 = FunctionField(QQ, names=( t ,)); (t,) = K2._first_ngens(1); R2 = K2[
˓→ w ]; (w,) = R2._first_ngens(1)
>>> L2 = [Link]((Integer(4)*w)**Integer(2) - (t+Integer(1))**Integer(3)␣
˓→- Integer(1), names=( w ,)); (w,) = L2._first_ngens(1)
We define a morphism, by giving the images of generators:
sage: f = [Link]([4*w, t + 1]); f
Function Field morphism:
From: Function field in y defined by y^2 - x^3 - 1
To: Function field in w defined by 16*w^2 - t^3 - 3*t^2 - 3*t - 2
Defn: y |--> 4*w
x |--> t + 1
>>> from [Link] import *
>>> f = [Link]([Integer(4)*w, t + Integer(1)]); f
Function Field morphism:
From: Function field in y defined by y^2 - x^3 - 1
To: Function field in w defined by 16*w^2 - t^3 - 3*t^2 - 3*t - 2
Defn: y |--> 4*w
x |--> t + 1
Evaluation works, as expected:
sage: f(y+x)
4*w + t + 1
sage: f(x*y + x/(x^2+1))
(4*t + 4)*w + (t + 1)/(t^2 + 2*t + 2)
>>> from [Link] import *
>>> f(y+x)
4*w + t + 1
(continues on next page)
76 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> f(x*y + x/(x**Integer(2)+Integer(1)))
(4*t + 4)*w + (t + 1)/(t^2 + 2*t + 2)
We make another extension of a rational function field:
sage: K3.<yy> = FunctionField(QQ); R3.<xx> = K3[]
sage: L3.<xx> = [Link](yy^2 - xx^3 - 1)
>>> from [Link] import *
>>> K3 = FunctionField(QQ, names=( yy ,)); (yy,) = K3._first_ngens(1); R3 =␣
˓→K3[ xx ]; (xx,) = R3._first_ngens(1)
>>> L3 = [Link](yy**Integer(2) - xx**Integer(3) - Integer(1), names=( xx
˓→ ,)); (xx,) = L3._first_ngens(1)
This is the function field L with the generators exchanged. We define a morphism to L:
sage: g = [Link]([x,y]); g
Function Field morphism:
From: Function field in xx defined by -xx^3 + yy^2 - 1
To: Function field in y defined by y^2 - x^3 - 1
Defn: xx |--> x
yy |--> y
>>> from [Link] import *
>>> g = [Link]([x,y]); g
Function Field morphism:
From: Function field in xx defined by -xx^3 + yy^2 - 1
To: Function field in y defined by y^2 - x^3 - 1
Defn: xx |--> x
yy |--> y
is_separable(base=None)
Return whether this is a separable extension of base.
INPUT:
• base – a function field from which this field has been created as an extension or None (default: None);
if None, then return whether this is a separable extension over its base field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: L.is_separable()
False
sage: R.<z> = L[]
sage: M.<z> = [Link](z^3 - y)
sage: M.is_separable()
True
sage: M.is_separable(K)
False
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(5))
(continues on next page)
77
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: L.is_separable()
True
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(5))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^5 - 1)
sage: L.is_separable()
False
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> L.is_separable()
False
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(3) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> M.is_separable()
True
>>> M.is_separable(K)
False
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> L.is_separable()
True
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - Integer(1), names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> L.is_separable()
False
maximal_order()
Return the maximal order of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: L.maximal_order()
Maximal order of Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
(continues on next page)
78 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
˓→
>>> L.maximal_order()
Maximal order of Function field in y defined by y^5 - 2*x*y + (-x^4 - 1)/x
maximal_order_infinite()
Return the maximal infinite order of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: L.maximal_order_infinite()
Maximal infinite order of Function field in y defined by y^5 - 2*x*y + (-x^4 -
˓→ 1)/x
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[] #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2) #␣
˓→needs [Link].finite_rings
sage: F.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^3 + x^6 + x^4 + x^2
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings
sage: L.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^2 + y + (x^2 + 1)/x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> L.maximal_order_infinite()
Maximal infinite order of Function field in y defined by y^5 - 2*x*y + (-x^4 -
˓→ 1)/x
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)# needs [Link].finite_rings
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)# needs␣
˓→[Link].finite_rings
>>> F.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^3 + x^6 + x^4 + x^2
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings
>>> L.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^2 + y + (x^2 + 1)/x
79
Algebraic Function Fields, Release 10.4
monic_integral_model(names=None)
Return a function field isomorphic to this field but which is an extension of a rational function field with
defining polynomial that is monic and integral over the constant base field.
INPUT:
• names – a string or a tuple of up to two strings (default: None), the name of the generator of the field,
and the name of the generator of the underlying rational function field (if a tuple); if not given, then the
names are chosen automatically.
OUTPUT:
A triple (F,f,t) where F is a function field, f is an isomorphism from F to this field, and t is the inverse
of f.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](x^2*y^5 - 1/x); L
Function field in y defined by x^2*y^5 - 1/x
sage: A, from_A, to_A = L.monic_integral_model( z )
sage: A
Function field in z defined by z^5 - x^12
sage: from_A
Function Field morphism:
From: Function field in z defined by z^5 - x^12
To: Function field in y defined by x^2*y^5 - 1/x
Defn: z |--> x^3*y
x |--> x
sage: to_A
Function Field morphism:
From: Function field in y defined by x^2*y^5 - 1/x
To: Function field in z defined by z^5 - x^12
Defn: y |--> 1/x^3*z
x |--> x
sage: to_A(y)
1/x^3*z
sage: from_A(to_A(y))
y
sage: from_A(to_A(1/y))
x^3*y^4
sage: from_A(to_A(1/y)) == 1/y
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](x**Integer(2)*y**Integer(5) - Integer(1)/x, names=( y ,));
˓→ (y,) = L._first_ngens(1); L
Function field in y defined by x^2*y^5 - 1/x
>>> A, from_A, to_A = L.monic_integral_model( z )
>>> A
Function field in z defined by z^5 - x^12
>>> from_A
Function Field morphism:
From: Function field in z defined by z^5 - x^12
To: Function field in y defined by x^2*y^5 - 1/x
Defn: z |--> x^3*y
(continues on next page)
80 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
x |--> x
>>> to_A
Function Field morphism:
From: Function field in y defined by x^2*y^5 - 1/x
To: Function field in z defined by z^5 - x^12
Defn: y |--> 1/x^3*z
x |--> x
>>> to_A(y)
1/x^3*z
>>> from_A(to_A(y))
y
>>> from_A(to_A(Integer(1)/y))
x^3*y^4
>>> from_A(to_A(Integer(1)/y)) == Integer(1)/y
True
This also works for towers of function fields:
sage: R.<z> = L[]
sage: M.<z> = [Link](z^2*y - 1/x)
sage: M.monic_integral_model()
(Function field in z_ defined by z_^10 - x^18,
Function Field morphism:
From: Function field in z_ defined by z_^10 - x^18
To: Function field in z defined by y*z^2 - 1/x
Defn: z_ |--> x^2*z
x |--> x, Function Field morphism:
From: Function field in z defined by y*z^2 - 1/x
To: Function field in z_ defined by z_^10 - x^18
Defn: z |--> 1/x^2*z_
y |--> 1/x^15*z_^8
x |--> x)
>>> from [Link] import *
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(2)*y - Integer(1)/x, names=( z ,)); (z,) = M._
˓→first_ngens(1)
>>> M.monic_integral_model()
(Function field in z_ defined by z_^10 - x^18,
Function Field morphism:
From: Function field in z_ defined by z_^10 - x^18
To: Function field in z defined by y*z^2 - 1/x
Defn: z_ |--> x^2*z
x |--> x, Function Field morphism:
From: Function field in z defined by y*z^2 - 1/x
To: Function field in z_ defined by z_^10 - x^18
Defn: z |--> 1/x^2*z_
y |--> 1/x^15*z_^8
x |--> x)
ngens()
Return the number of generators of the function field over its base field. This is by definition 1.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
(continues on next page)
81
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: [Link]()
1
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link]()
1
polynomial()
Return the univariate polynomial that defines the function field, that is, the polynomial 𝑓 (𝑦) so that the function
field is of the form 𝐾[𝑦]/(𝑓 (𝑦)).
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: [Link]()
y^5 - 2*x*y + (-x^4 - 1)/x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link]()
y^5 - 2*x*y + (-x^4 - 1)/x
polynomial_ring()
Return the polynomial ring used to represent elements of the function field. If we view the function field as
being presented as 𝐾[𝑦]/(𝑓 (𝑦)), then this function returns the ring 𝐾[𝑦].
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x))
sage: L.polynomial_ring()
Univariate Polynomial Ring in y over Rational function field in x over␣
˓→Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)
>>> L.polynomial_ring()
Univariate Polynomial Ring in y over Rational function field in x over␣
˓→Rational Field
primitive_element()
Return a primitive element over the underlying rational function field.
82 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
If this is a finite extension of a rational function field 𝐾(𝑥) with 𝐾 perfect, then this is a simple extension of
𝐾(𝑥), i.e., there is a primitive element 𝑦 which generates this field over 𝐾(𝑥). This method returns such an
element 𝑦.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: R.<z> = L[]
sage: M.<z> = [Link](z^2 - y)
sage: R.<z> = L[]
sage: N.<u> = [Link](z^2 - x - 1)
sage: N.primitive_element()
u + y
sage: M.primitive_element()
z
sage: L.primitive_element()
y
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> N = [Link](z**Integer(2) - x - Integer(1), names=( u ,)); (u,) = N._
˓→first_ngens(1)
>>> N.primitive_element()
u + y
>>> M.primitive_element()
z
>>> L.primitive_element()
y
This also works for inseparable extensions:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: R.<Y> = K[]
sage: L.<y> = [Link](Y^2 - x)
sage: R.<Z> = L[]
sage: M.<z> = [Link](Z^2 - y)
sage: M.primitive_element()
z
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ Y ]; (Y,) = R._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> R = L[ Z ]; (Z,) = R._first_ngens(1)
>>> M = [Link](Z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> M.primitive_element()
z
random_element(*args, **kwds)
83
Algebraic Function Fields, Release 10.4
Create a random element of the function field. Parameters are passed onto the random_element method of
the base_field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - (x^2 + x))
sage: L.random_element() # random
((x^2 - x + 2/3)/(x^2 + 1/3*x - 1))*y^2 + ((-1/4*x^2 + 1/2*x - 1)/(-5/2*x + 2/
˓→3))*y
+ (-1/2*x^2 - 4)/(-12*x^2 + 1/2*x - 1/95)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - (x**Integer(2) + x), names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> L.random_element() # random
((x^2 - x + 2/3)/(x^2 + 1/3*x - 1))*y^2 + ((-1/4*x^2 + 1/2*x - 1)/(-5/2*x + 2/
˓→3))*y
+ (-1/2*x^2 - 4)/(-12*x^2 + 1/2*x - 1/95)
separable_model(names=None)
Return a function field isomorphic to this field which is a separable extension of a rational function field.
INPUT:
• names – a tuple of two strings or None (default: None); the second entry will be used as the variable
name of the rational function field, the first entry will be used as the variable name of its separable
extension. If None, then the variable names will be chosen automatically.
OUTPUT:
A triple (F,f,t) where F is a function field, f is an isomorphism from F to this function field, and t is the
inverse of f.
ALGORITHM:
Suppose that the constant base field is perfect. If this is a monic integral inseparable extension of a rational
function field, then the defining polynomial is separable if we swap the variables (Proposition 4.8 in Chapter
VIII of [Lan2002].) The algorithm reduces to this case with monic_integral_model().
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3)
sage: L.separable_model(( t , w ))
(Function field in t defined by t^3 + w^2,
Function Field morphism:
From: Function field in t defined by t^3 + w^2
To: Function field in y defined by y^2 + x^3
Defn: t |--> x
w |--> y,
Function Field morphism:
From: Function field in y defined by y^2 + x^3
To: Function field in t defined by t^3 + w^2
Defn: y |--> w
x |--> t)
84 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3), names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> L.separable_model(( t , w ))
(Function field in t defined by t^3 + w^2,
Function Field morphism:
From: Function field in t defined by t^3 + w^2
To: Function field in y defined by y^2 + x^3
Defn: t |--> x
w |--> y,
Function Field morphism:
From: Function field in y defined by y^2 + x^3
To: Function field in t defined by t^3 + w^2
Defn: y |--> w
x |--> t)
This also works for non-integral polynomials:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2/x - x^2)
sage: L.separable_model()
(Function field in y_ defined by y_^3 + x_^2,
Function Field morphism:
From: Function field in y_ defined by y_^3 + x_^2
To: Function field in y defined by 1/x*y^2 + x^2
Defn: y_ |--> x
x_ |--> y,
Function Field morphism:
From: Function field in y defined by 1/x*y^2 + x^2
To: Function field in y_ defined by y_^3 + x_^2
Defn: y |--> x_
x |--> y_)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2)/x - x**Integer(2), names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> L.separable_model()
(Function field in y_ defined by y_^3 + x_^2,
Function Field morphism:
From: Function field in y_ defined by y_^3 + x_^2
To: Function field in y defined by 1/x*y^2 + x^2
Defn: y_ |--> x
x_ |--> y,
Function Field morphism:
From: Function field in y defined by 1/x*y^2 + x^2
To: Function field in y_ defined by y_^3 + x_^2
Defn: y |--> x_
x |--> y_)
If the base field is not perfect this is only implemented in trivial cases:
85
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings
sage: k.<t> = FunctionField(GF(2))
sage: k.is_perfect()
False
sage: K.<x> = FunctionField(k)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^3 - t)
sage: L.separable_model()
(Function field in y defined by y^3 + t,
Function Field endomorphism of Function field in y defined by y^3 + t
Defn: y |--> y
x |--> x,
Function Field endomorphism of Function field in y defined by y^3 + t
Defn: y |--> y
x |--> x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> k = FunctionField(GF(Integer(2)), names=( t ,)); (t,) = k._first_ngens(1)
>>> k.is_perfect()
False
>>> K = FunctionField(k, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) - t, names=( y ,)); (y,) = L._first_ngens(1)
>>> L.separable_model()
(Function field in y defined by y^3 + t,
Function Field endomorphism of Function field in y defined by y^3 + t
Defn: y |--> y
x |--> x,
Function Field endomorphism of Function field in y defined by y^3 + t
Defn: y |--> y
x |--> x)
Some other cases for which a separable model could be constructed are not supported yet:
sage: R.<y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](y^2 - t) #␣
˓→needs [Link].finite_rings
sage: L.separable_model() #␣
˓→needs [Link].finite_rings
Traceback (most recent call last):
...
NotImplementedError: constructing a separable model is only implemented
for function fields over a perfect constant base field
>>> from [Link] import *
>>> R = K[ y ]; (y,) = R._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](y**Integer(2) - t, names=( y ,)); (y,) = L._first_ngens(1)
˓→# needs [Link].finite_rings
>>> L.separable_model() #␣
˓→needs [Link].finite_rings
Traceback (most recent call last):
...
NotImplementedError: constructing a separable model is only implemented
for function fields over a perfect constant base field
simple_model(name=None)
86 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
Return a function field isomorphic to this field which is a simple extension of a rational function field.
INPUT:
• name – a string (default: None), the name of generator of the simple extension. If None, then the
name of the generator will be the same as the name of the generator of this function field.
OUTPUT:
A triple (F,f,t) where F is a field isomorphic to this field, f is an isomorphism from F to this function
field and t is the inverse of f.
EXAMPLES:
A tower of four function fields:
sage: K.<x> = FunctionField(QQ); R.<z> = K[]
sage: L.<z> = [Link](z^2 - x); R.<u> = L[]
sage: M.<u> = [Link](u^2 - z); R.<v> = M[]
sage: N.<v> = [Link](v^2 - u)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ z ];
˓→ (z,) = R._first_ngens(1)
>>> L = [Link](z**Integer(2) - x, names=( z ,)); (z,) = L._first_
˓→ngens(1); R = L[ u ]; (u,) = R._first_ngens(1)
>>> M = [Link](u**Integer(2) - z, names=( u ,)); (u,) = M._first_
˓→ngens(1); R = M[ v ]; (v,) = R._first_ngens(1)
>>> N = [Link](v**Integer(2) - u, names=( v ,)); (v,) = N._first_ngens(1)
The fields N and M as simple extensions of K:
sage: N.simple_model()
(Function field in v defined by v^8 - x,
Function Field morphism:
From: Function field in v defined by v^8 - x
To: Function field in v defined by v^2 - u
Defn: v |--> v,
Function Field morphism:
From: Function field in v defined by v^2 - u
To: Function field in v defined by v^8 - x
Defn: v |--> v
u |--> v^2
z |--> v^4
x |--> x)
sage: M.simple_model()
(Function field in u defined by u^4 - x,
Function Field morphism:
From: Function field in u defined by u^4 - x
To: Function field in u defined by u^2 - z
Defn: u |--> u,
Function Field morphism:
From: Function field in u defined by u^2 - z
To: Function field in u defined by u^4 - x
Defn: u |--> u
z |--> u^2
x |--> x)
87
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> N.simple_model()
(Function field in v defined by v^8 - x,
Function Field morphism:
From: Function field in v defined by v^8 - x
To: Function field in v defined by v^2 - u
Defn: v |--> v,
Function Field morphism:
From: Function field in v defined by v^2 - u
To: Function field in v defined by v^8 - x
Defn: v |--> v
u |--> v^2
z |--> v^4
x |--> x)
>>> M.simple_model()
(Function field in u defined by u^4 - x,
Function Field morphism:
From: Function field in u defined by u^4 - x
To: Function field in u defined by u^2 - z
Defn: u |--> u,
Function Field morphism:
From: Function field in u defined by u^2 - z
To: Function field in u defined by u^4 - x
Defn: u |--> u
z |--> u^2
x |--> x)
An optional parameter name can be used to set the name of the generator of the simple extension:
sage: M.simple_model(name= t )
(Function field in t defined by t^4 - x, Function Field morphism:
From: Function field in t defined by t^4 - x
To: Function field in u defined by u^2 - z
Defn: t |--> u, Function Field morphism:
From: Function field in u defined by u^2 - z
To: Function field in t defined by t^4 - x
Defn: u |--> t
z |--> t^2
x |--> x)
>>> from [Link] import *
>>> M.simple_model(name= t )
(Function field in t defined by t^4 - x, Function Field morphism:
From: Function field in t defined by t^4 - x
To: Function field in u defined by u^2 - z
Defn: t |--> u, Function Field morphism:
From: Function field in u defined by u^2 - z
To: Function field in t defined by t^4 - x
Defn: u |--> t
z |--> t^2
x |--> x)
An example with higher degrees:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3)); R.<y> = K[]
sage: L.<y> = [Link](y^5 - x); R.<z> = L[]
(continues on next page)
88 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: M.<z> = [Link](z^3 - x)
sage: M.simple_model()
(Function field in z defined by z^15 + x*z^12 + x^2*z^9 + 2*x^3*z^6 + 2*x^4*z^
˓→3 + 2*x^5 + 2*x^3,
Function Field morphism:
From: Function field in z defined by z^15 + x*z^12 + x^2*z^9 + 2*x^3*z^6 +␣
˓→2*x^4*z^3 + 2*x^5 + 2*x^3
To: Function field in z defined by z^3 + 2*x
Defn: z |--> z + y,
Function Field morphism:
From: Function field in z defined by z^3 + 2*x
To: Function field in z defined by z^15 + x*z^12 + x^2*z^9 + 2*x^3*z^6 +␣
˓→2*x^4*z^3 + 2*x^5 + 2*x^3
Defn: z |--> 2/x*z^6 + 2*z^3 + z + 2*x
y |--> 1/x*z^6 + z^3 + x
x |--> x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - x, names=( y ,)); (y,) = L._first_
˓→ngens(1); R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(3) - x, names=( z ,)); (z,) = M._first_ngens(1)
>>> M.simple_model()
(Function field in z defined by z^15 + x*z^12 + x^2*z^9 + 2*x^3*z^6 + 2*x^4*z^
˓→3 + 2*x^5 + 2*x^3,
Function Field morphism:
From: Function field in z defined by z^15 + x*z^12 + x^2*z^9 + 2*x^3*z^6 +␣
˓→2*x^4*z^3 + 2*x^5 + 2*x^3
To: Function field in z defined by z^3 + 2*x
Defn: z |--> z + y,
Function Field morphism:
From: Function field in z defined by z^3 + 2*x
To: Function field in z defined by z^15 + x*z^12 + x^2*z^9 + 2*x^3*z^6 +␣
˓→2*x^4*z^3 + 2*x^5 + 2*x^3
Defn: z |--> 2/x*z^6 + 2*z^3 + z + 2*x
y |--> 1/x*z^6 + z^3 + x
x |--> x)
This also works for inseparable extensions:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x); R.<z> = L[]
sage: M.<z> = [Link](z^2 - y)
sage: M.simple_model()
(Function field in z defined by z^4 + x,
Function Field morphism:
From: Function field in z defined by z^4 + x
To: Function field in z defined by z^2 + y
Defn: z |--> z,
Function Field morphism:
From: Function field in z defined by z^2 + y
To: Function field in z defined by z^4 + x
Defn: z |--> z
(continues on next page)
89
Algebraic Function Fields, Release 10.4
(continued from previous page)
y |--> z^2
x |--> x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_
˓→ngens(1); R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(2) - y, names=( z ,)); (z,) = M._first_ngens(1)
>>> M.simple_model()
(Function field in z defined by z^4 + x,
Function Field morphism:
From: Function field in z defined by z^4 + x
To: Function field in z defined by z^2 + y
Defn: z |--> z,
Function Field morphism:
From: Function field in z defined by z^2 + y
To: Function field in z defined by z^4 + x
Defn: z |--> z
y |--> z^2
x |--> x)
class [Link].function_field.function_field_polymod.FunctionField_simple(poly-
no-
mial,
names,
cat-
e-
gory=None)
Bases: FunctionField_polymod
Function fields defined by irreducible and separable polynomials over rational function fields.
constant_field()
Return the algebraic closure of the base constant field in the function field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(3)); _.<y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x)) #␣
˓→needs [Link].finite_rings
sage: L.constant_field() #␣
˓→needs [Link].finite_rings
Finite Field of size 3
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ y ]; (y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y +␣
˓→Integer(1)/x), names=( y ,)); (y,) = L._first_ngens(1)# needs [Link].
˓→finite_rings
>>> L.constant_field() #␣
˓→needs [Link].finite_rings
Finite Field of size 3
90 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
exact_constant_field(name='t')
Return the exact constant field and its embedding into the function field.
INPUT:
• name – name (default: 𝑡) of the generator of the exact constant field
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3)); _.<Y> = K[]
sage: f = Y^2 - x*Y + x^2 + 1 # irreducible but not absolutely irreducible
sage: L.<y> = [Link](f)
sage: [Link]()
0
sage: L.exact_constant_field()
(Finite Field in t of size 3^2, Ring morphism:
From: Finite Field in t of size 3^2
To: Function field in y defined by y^2 + 2*x*y + x^2 + 1
Defn: t |--> y + x)
sage: (y+x).divisor()
0
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> f = Y**Integer(2) - x*Y + x**Integer(2) + Integer(1) # irreducible but␣
˓→not absolutely irreducible
>>> L = [Link](f, names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link]()
0
>>> L.exact_constant_field()
(Finite Field in t of size 3^2, Ring morphism:
From: Finite Field in t of size 3^2
To: Function field in y defined by y^2 + 2*x*y + x^2 + 1
Defn: t |--> y + x)
>>> (y+x).divisor()
0
genus()
Return the genus of the function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: F.<a> = GF(16)
sage: K.<x> = FunctionField(F); K
Rational function field in x over Finite Field in a of size 2^4
sage: R.<t> = PolynomialRing(K)
sage: L.<y> = [Link](t^4 + t - x^5)
sage: [Link]()
6
sage: # needs [Link].number_field
sage: R.<T> = QQ[]
sage: N.<a> = NumberField(T^2 + 1)
sage: K.<x> = FunctionField(N); K
(continues on next page)
91
Algebraic Function Fields, Release 10.4
(continued from previous page)
Rational function field in x over Number Field in a with defining polynomial␣
˓→T^2 + 1
sage: [Link]()
0
sage: S.<t> = PolynomialRing(K)
sage: L.<y> = [Link](t^2 - x^3 + x)
sage: [Link]()
1
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = GF(Integer(16), names=( a ,)); (a,) = F._first_ngens(1)
>>> K = FunctionField(F, names=( x ,)); (x,) = K._first_ngens(1); K
Rational function field in x over Finite Field in a of size 2^4
>>> R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> L = [Link](t**Integer(4) + t - x**Integer(5), names=( y ,)); (y,) =␣
˓→L._first_ngens(1)
>>> [Link]()
6
>>> # needs [Link].number_field
>>> R = QQ[ T ]; (T,) = R._first_ngens(1)
>>> N = NumberField(T**Integer(2) + Integer(1), names=( a ,)); (a,) = N._
˓→first_ngens(1)
>>> K = FunctionField(N, names=( x ,)); (x,) = K._first_ngens(1); K
Rational function field in x over Number Field in a with defining polynomial␣
˓→T^2 + 1
>>> [Link]()
0
>>> S = PolynomialRing(K, names=( t ,)); (t,) = S._first_ngens(1)
>>> L = [Link](t**Integer(2) - x**Integer(3) + x, names=( y ,)); (y,) =␣
˓→L._first_ngens(1)
>>> [Link]()
1
The genus is computed by the Hurwitz genus formula.
places_above(p)
Return places lying above p.
INPUT:
• p – place of the base rational function field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2) #␣
˓→needs [Link].finite_rings
sage: all(q.place_below() == p #␣
˓→needs [Link].finite_rings
....: for p in [Link]() for q in F.places_above(p))
True
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
(continues on next page)
92 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: O = K.maximal_order()
sage: pls = [[Link](x - c).place() for c in [-2, -1, 0, 1, 2]]
sage: all(q.place_below() == p
....: for p in pls for q in F.places_above(p))
True
sage: # needs [Link].number_field
sage: K.<x> = FunctionField(QQbar); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: O = K.maximal_order()
sage: pls = [[Link](x - QQbar(sqrt(c))).place()
....: for c in [-2, -1, 0, 1, 2]]
sage: all(q.place_below() == p # long time (4s)
....: for p in pls for q in F.places_above(p))
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)# needs␣
˓→[Link].finite_rings
>>> all(q.place_below() == p #␣
˓→needs [Link].finite_rings
... for p in [Link]() for q in F.places_above(p))
True
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = K.maximal_order()
>>> pls = [[Link](x - c).place() for c in [-Integer(2), -Integer(1),␣
˓→Integer(0), Integer(1), Integer(2)]]
>>> all(q.place_below() == p
... for p in pls for q in F.places_above(p))
True
>>> # needs [Link].number_field
>>> K = FunctionField(QQbar, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y
˓→ ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = K.maximal_order()
>>> pls = [[Link](x - QQbar(sqrt(c))).place()
... for c in [-Integer(2), -Integer(1), Integer(0), Integer(1),␣
˓→Integer(2)]]
>>> all(q.place_below() == p # long time (4s)
... for p in pls for q in F.places_above(p))
True
places_infinite(degree=1)
Return a list of the infinite places with degree.
INPUT:
• degree – positive integer (default: 1)
93
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: # needs [Link].finite_rings
sage: F.<a> = GF(2)
sage: K.<x> = FunctionField(F)
sage: R.<t> = PolynomialRing(K)
sage: L.<y> = [Link](t^4 + t - x^5)
sage: L.places_infinite(1)
[Place (1/x, 1/x^4*y^3)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = GF(Integer(2), names=( a ,)); (a,) = F._first_ngens(1)
>>> K = FunctionField(F, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> L = [Link](t**Integer(4) + t - x**Integer(5), names=( y ,)); (y,) =␣
˓→L._first_ngens(1)
>>> L.places_infinite(Integer(1))
[Place (1/x, 1/x^4*y^3)]
residue_field(place, name=None)
Return the residue field associated with the place along with the maps from and to the residue field.
INPUT:
• place – place of the function field
• name – string; name of the generator of the residue field
The domain of the map to the residue field is the discrete valuation ring associated with the place.
The discrete valuation ring is defined as the ring of all elements of the function field with nonnegative valuation
at the place. The maximal ideal is the set of elements of positive valuation. The residue field is then the
quotient of the discrete valuation ring by its maximal ideal.
If an element not in the valuation ring is applied to the map, an exception TypeError is raised.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: R, fr_R, to_R = L.residue_field(p)
sage: R
Finite Field of size 2
sage: f = 1 + y
sage: [Link](p)
-1
sage: to_R(f)
Traceback (most recent call last):
...
TypeError: ...
sage: (1+1/f).valuation(p)
0
sage: to_R(1 + 1/f)
1
sage: [fr_R(e) for e in R]
[0, 1]
94 Chapter 3. Function Fields: extension
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> R, fr_R, to_R = L.residue_field(p)
>>> R
Finite Field of size 2
>>> f = Integer(1) + y
>>> [Link](p)
-1
>>> to_R(f)
Traceback (most recent call last):
...
TypeError: ...
>>> (Integer(1)+Integer(1)/f).valuation(p)
0
>>> to_R(Integer(1) + Integer(1)/f)
1
>>> [fr_R(e) for e in R]
[0, 1]
95
Algebraic Function Fields, Release 10.4
96 Chapter 3. Function Fields: extension
CHAPTER
FOUR
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: [Link](t-1)
2
sage: [Link](t)
0
sage: [Link](t^2 - 3)
-3
>>> from [Link] 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)
>>> [Link](t-Integer(1))
2
>>> [Link](t)
0
>>> [Link](t**Integer(2) - Integer(3))
-3
Derivatives of elements in separable extensions:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (y^3 + x).derivative() #␣
˓→needs [Link].finite_rings [Link].function_field
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].finite_rings [Link].function_field
(continues on next page)
97
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> (y**Integer(3) + x).derivative() ␣
˓→ # needs [Link].finite_rings [Link].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> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
- Place (1/x, 1/x*y)
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].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
class [Link].function_field.[Link]
Bases: FieldElement
Abstract base class for function field elements.
EXAMPLES:
sage: t = FunctionField(QQ, t ).gen()
sage: isinstance(t, [Link].function_field.[Link])
True
>>> from [Link] import *
>>> t = FunctionField(QQ, t ).gen()
>>> isinstance(t, [Link].function_field.[Link])
True
characteristic_polynomial(*args, **kwds)
Return the characteristic polynomial of the element. Give an optional input string to name the variable in the
characteristic polynomial.
EXAMPLES:
98 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: x.characteristic_polynomial( W ) #␣
˓→needs [Link]
W - x
sage: # needs [Link].function_field
sage: L.<y> = [Link](y^2 - x*y + 4*x^3); R.<z> = L[]
sage: M.<z> = [Link](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 [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> x.characteristic_polynomial( W ) #␣
˓→needs [Link]
W - x
>>> # needs [Link].function_field
>>> L = [Link](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 = [Link](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)
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 [Link]
W - x
sage: # needs [Link].function_field
sage: L.<y> = [Link](y^2 - x*y + 4*x^3); R.<z> = L[]
sage: M.<z> = [Link](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 [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> x.characteristic_polynomial( W ) #␣
˓→needs [Link]
W - x
>>> # needs [Link].function_field
(continues on next page)
99
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> L = [Link](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 = [Link](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()
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: [Link]()
3
sage: FF.<t> = FunctionField(QQ)
sage: f = (t+8); f
t + 8
sage: [Link]()
1
>>> from [Link] 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)
>>> [Link]()
3
>>> FF = FunctionField(QQ, names=( t ,)); (t,) = FF._first_ngens(1)
>>> f = (t+Integer(8)); f
t + 8
>>> [Link]()
1
derivative()
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: [Link]() #␣
˓→needs [Link]
(-t^2 - 2*t - 1/3)/(t^4 - 2/3*t^2 + 1/9)
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
(continues on next page)
100 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→needs [Link].finite_rings [Link].function_field
sage: (y^3 + x).derivative() #␣
˓→needs [Link].finite_rings [Link].function_field
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = (t + Integer(1)) / (t**Integer(2) - Integer(1)/Integer(3))
>>> [Link]() #␣
˓→needs [Link]
(-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 [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (y**Integer(3) + x).derivative() ␣
˓→ # needs [Link].finite_rings [Link].function_field
((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3
differential()
Return the differential 𝑑𝑥 where 𝑥 is the element.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: f = 1 / t
sage: [Link]() #␣
˓→needs [Link]
(-1/t^2) d(t)
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x +1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (y^3 + x).differential() #␣
˓→needs [Link].finite_rings [Link].function_field
(((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3) d(x)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = Integer(1) / t
>>> [Link]() #␣
˓→needs [Link]
(-1/t^2) d(t)
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x +Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (y**Integer(3) + x).differential() ␣
˓→ # needs [Link].finite_rings [Link].function_field
(((x^2 + 1)/x^2)*y + (x^4 + x^3 + 1)/x^3) d(x)
divisor()
Return the divisor of the element.
101
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: K.<x> = FunctionField(GF(2))
sage: f = 1/(x^3 + x^2 + x)
sage: [Link]() #␣
˓→needs [Link] [Link]
3*Place (1/x)
- Place (x)
- Place (x^2 + x + 1)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x)
>>> [Link]() #␣
˓→needs [Link] [Link]
3*Place (1/x)
- Place (x)
- Place (x^2 + x + 1)
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
- Place (1/x, 1/x*y)
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
- Place (1/x, 1/x*y)
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
divisor_of_poles()
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 [Link] [Link]
Place (x)
+ Place (x^2 + x + 1)
>>> from [Link] 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 [Link] [Link]
(continues on next page)
102 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Place (x)
+ Place (x^2 + x + 1)
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (x/y).divisor_of_poles() #␣
˓→needs [Link].finite_rings [Link].function_field
Place (1/x, 1/x*y) + 2*Place (x + 1, x*y)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (x/y).divisor_of_poles() #␣
˓→needs [Link].finite_rings [Link].function_field
Place (1/x, 1/x*y) + 2*Place (x + 1, x*y)
divisor_of_zeros()
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 [Link] [Link]
3*Place (1/x)
>>> from [Link] 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 [Link] [Link]
3*Place (1/x)
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (x/y).divisor_of_zeros() #␣
˓→needs [Link].finite_rings [Link].function_field
3*Place (x, x*y)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (x/y).divisor_of_zeros() #␣
˓→needs [Link].finite_rings [Link].function_field
3*Place (x, x*y)
103
Algebraic Function Fields, Release 10.4
evaluate(place)
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, ValueError is raised.
EXAMPLES:
sage: K.<t> = FunctionField(GF(5))
sage: p = K.place_infinite()
sage: f = 1/t^2 + 3
sage: [Link](p)
3
>>> from [Link] 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)
>>> [Link](p)
3
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](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 [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](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)
Return the 𝑖-th derivative of the element with respect to the separating element.
INPUT:
104 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
• i – nonnegative integer
• separating_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 [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( t ,)); (t,) = K._first_ngens(1)
>>> f = t**Integer(2)
>>> f.higher_derivative(Integer(2)) ␣
˓→ # needs [Link].function_field
1
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (y^3 + x).higher_derivative(2) #␣
˓→needs [Link].finite_rings [Link].function_field
1/x^3*y + (x^6 + x^4 + x^3 + x^2 + x + 1)/x^5
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (y**Integer(3) + x).higher_derivative(Integer(2)) ␣
˓→ # needs [Link].finite_rings [Link].function_field
1/x^3*y + (x^6 + x^4 + x^3 + x^2 + x + 1)/x^5
is_integral()
Determine if the element is integral over the maximal order of the base field.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](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
105
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](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)
Return whether this element is an n-th power in the rational function field.
INPUT:
• n – an integer
OUTPUT:
Returns True if there is an element 𝑎 in the function field such that this element equals 𝑎𝑛 .
See also:
nth_root()
EXAMPLES:
sage: K.<x> = FunctionField(GF(3))
sage: f = (x+1)/(x-1)
sage: f.is_nth_power(2)
False
>>> from [Link] 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)
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), if None, then the matrix is formed over the base field of this
function field.
EXAMPLES:
A rational function field:
sage: K.<t> = FunctionField(QQ)
sage: [Link]() #␣
(continues on next page)
106 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ needs [Link]
[t]
sage: (1/(t+1)).matrix() #␣
˓→needs [Link]
[1/(t + 1)]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]() #␣
˓→needs [Link]
[t]
>>> (Integer(1)/(t+Integer(1))).matrix() ␣
˓→ # needs [Link]
[1/(t + 1)]
Now an example in a nontrivial extension of a rational function field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: [Link]()
[ 0 1]
[-4*x^3 x]
sage: [Link]().charpoly( Z )
Z^2 - x*Z + 4*x^3
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> [Link]()
[ 0 1]
[-4*x^3 x]
>>> [Link]().charpoly( Z )
Z^2 - x*Z + 4*x^3
An example in a relative extension, where neither function field is rational:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: M.<T> = L[]
sage: Z.<alpha> = [Link](T^3 - y^2*T + x)
sage: [Link]()
[ 0 1 0]
[ 0 0 1]
[ -x x*y - 4*x^3 0]
sage: [Link](K)
[ 0 0 1 0 0 ␣
˓→0]
[ 0 0 0 1 0 ␣
˓→0]
[ 0 0 0 0 1 ␣
(continues on next page)
107
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ 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: [Link](Z)
[alpha]
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](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 = [Link](T**Integer(3) - y**Integer(2)*T + x, names=( alpha ,));␣
˓→(alpha,) = Z._first_ngens(1)
>>> [Link]()
[ 0 1 0]
[ 0 0 1]
[ -x x*y - 4*x^3 0]
>>> [Link](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]
>>> [Link](Z)
[alpha]
We show that this matrix does indeed work as expected when making a vector space from a function field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](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) * [Link](); y4y
((x^4 + 1)/x, 2*x, 0, 0, 0)
sage: y5 == y4y
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
(continues on next page)
108 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](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)) * [Link](); y4y
((x^4 + 1)/x, 2*x, 0, 0, 0)
>>> y5 == y4y
True
minimal_polynomial(*args, **kwds)
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 [Link]
W - x
sage: # needs [Link].function_field
sage: L.<y> = [Link](y^2 - x*y + 4*x^3); R.<z> = L[]
sage: M.<z> = [Link](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 [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> x.minimal_polynomial( W ) #␣
˓→needs [Link]
W - x
>>> # needs [Link].function_field
>>> L = [Link](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 = [Link](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)
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 [Link]
(continues on next page)
109
Algebraic Function Fields, Release 10.4
(continued from previous page)
W - x
sage: # needs [Link].function_field
sage: L.<y> = [Link](y^2 - x*y + 4*x^3); R.<z> = L[]
sage: M.<z> = [Link](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 [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> x.minimal_polynomial( W ) #␣
˓→needs [Link]
W - x
>>> # needs [Link].function_field
>>> L = [Link](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 = [Link](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()
Return the norm of the element.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
4*x^3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
4*x^3
The norm is relative:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3); R.<z> = L[] #␣
˓→needs [Link].function_field
sage: M.<z> = [Link](z^3 - y^2*z + x) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
(continues on next page)
110 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ needs [Link].function_field
-x
sage: [Link]().parent() #␣
˓→needs [Link].function_field
Function field in y defined by y^2 - x*y + 4*x^3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](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␣
˓→[Link].function_field
>>> M = [Link](z**Integer(3) - y**Integer(2)*z + x, names=( z ,)); (z,)␣
˓→= M._first_ngens(1)# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
-x
>>> [Link]().parent() #␣
˓→needs [Link].function_field
Function field in y defined by y^2 - x*y + 4*x^3
nth_root(n)
Return an n-th root of this element in the function field.
INPUT:
• n – an integer
OUTPUT:
Returns an element a in the function field such that this element equals 𝑎𝑛 . Raises an error if no such element
exists.
See also:
is_nth_power()
EXAMPLES:
sage: K.<x> = FunctionField(GF(3))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x) #␣
˓→needs [Link].function_field
sage: L(y^27).nth_root(27) #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
˓→# needs [Link].function_field
>>> L(y**Integer(27)).nth_root(Integer(27)) ␣
˓→ # needs [Link].function_field
y
poles()
Return the list of the poles of the element.
111
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: K.<x> = FunctionField(GF(2))
sage: f = 1/(x^3 + x^2 + x)
sage: [Link]() #␣
˓→needs [Link] [Link]
[Place (x), Place (x^2 + x + 1)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x)
>>> [Link]() #␣
˓→needs [Link] [Link]
[Place (x), Place (x^2 + x + 1)]
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (x/y).poles() #␣
˓→needs [Link].finite_rings [Link].function_field
[Place (1/x, 1/x*y), Place (x + 1, x*y)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (x/y).poles() #␣
˓→needs [Link].finite_rings [Link].function_field
[Place (1/x, 1/x*y), Place (x + 1, x*y)]
trace()
Return the trace of the element.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
valuation(place)
Return the valuation of the element at the place.
INPUT:
112 Chapter 4. Elements of function fields
Algebraic Function Fields, Release 10.4
• place – a place of the function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].function_field
sage: p = L.places_infinite()[0] #␣
˓→needs [Link].function_field
sage: [Link](p) #␣
˓→needs [Link].function_field
-1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> p = L.places_infinite()[Integer(0)] ␣
˓→ # needs [Link].function_field
>>> [Link](p) #␣
˓→needs [Link].function_field
-1
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: p = [Link](x - 1).place()
sage: [Link](p)
0
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> p = [Link](x - Integer(1)).place()
>>> [Link](p)
0
zeros()
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: [Link]() #␣
˓→needs [Link] [Link]
[Place (1/x)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> f = Integer(1)/(x**Integer(3) + x**Integer(2) + x)
(continues on next page)
113
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]() #␣
˓→needs [Link] [Link]
[Place (1/x)]
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: (x/y).zeros() #␣
˓→needs [Link].finite_rings [Link].function_field
[Place (x, x*y)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> (x/y).zeros() #␣
˓→needs [Link].finite_rings [Link].function_field
[Place (x, x*y)]
[Link].function_field.element.is_FunctionFieldElement(x)
Return True if x is any type of function field element.
EXAMPLES:
sage: t = FunctionField(QQ, t ).gen()
sage: [Link].function_field.element.is_FunctionFieldElement(t)
True
sage: [Link].function_field.element.is_FunctionFieldElement(0)
False
>>> from [Link] import *
>>> t = FunctionField(QQ, t ).gen()
>>> [Link].function_field.element.is_FunctionFieldElement(t)
True
>>> [Link].function_field.element.is_FunctionFieldElement(Integer(0))
False
[Link].function_field.element.make_FunctionFieldElement(parent, element_class,
representing_element)
Used for unpickling FunctionFieldElement objects (and subclasses).
EXAMPLES:
sage: from [Link].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 [Link] import *
>>> from [Link].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
114 Chapter 4. Elements of function fields
CHAPTER
FIVE
ELEMENTS OF FUNCTION FIELDS: RATIONAL
class [Link].function_field.element_rational.FunctionFieldElement_rational
Bases: FunctionFieldElement
Elements of a rational function field.
EXAMPLES:
sage: K.<t> = FunctionField(QQ); K
Rational function field in t over Rational Field
sage: t^2 + 3/2*t
t^2 + 3/2*t
sage: FunctionField(QQ, t ).gen()^3
t^3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1); K
Rational function field in t over Rational Field
>>> t**Integer(2) + Integer(3)/Integer(2)*t
t^2 + 3/2*t
>>> FunctionField(QQ, t ).gen()**Integer(3)
t^3
denominator()
Return the denominator of the rational function.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: f = (t+1) / (t^2 - 1/3); f
(t + 1)/(t^2 - 1/3)
sage: [Link]()
t^2 - 1/3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = (t+Integer(1)) / (t**Integer(2) - Integer(1)/Integer(3)); f
(t + 1)/(t^2 - 1/3)
>>> [Link]()
t^2 - 1/3
element()
Return the underlying fraction field element that represents the element.
EXAMPLES:
115
Algebraic Function Fields, Release 10.4
sage: K.<t> = FunctionField(GF(7))
sage: [Link]()
t
sage: type([Link]()) #␣
˓→needs [Link]
<... [Link].fraction_field_FpT.FpTElement >
sage: # needs [Link].finite_rings
sage: K.<t> = FunctionField(GF(131101))
sage: [Link]()
t
sage: type([Link]())
<... [Link].fraction_field_element.FractionFieldElement_1poly_field >
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]()
t
>>> type([Link]()) #␣
˓→needs [Link]
<... [Link].fraction_field_FpT.FpTElement >
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(131101)), names=( t ,)); (t,) = K._first_
˓→ngens(1)
>>> [Link]()
t
>>> type([Link]())
<... [Link].fraction_field_element.FractionFieldElement_1poly_field >
factor()
Factor the rational function.
EXAMPLES:
sage: # needs [Link]
sage: K.<t> = FunctionField(QQ)
sage: f = (t+1) / (t^2 - 1/3)
sage: [Link]()
(t + 1) * (t^2 - 1/3)^-1
sage: (7*f).factor()
(7) * (t + 1) * (t^2 - 1/3)^-1
sage: ((7*f).factor()).unit()
7
sage: (f^3).factor()
(t + 1)^3 * (t^2 - 1/3)^-3
>>> from [Link] import *
>>> # needs [Link]
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = (t+Integer(1)) / (t**Integer(2) - Integer(1)/Integer(3))
>>> [Link]()
(t + 1) * (t^2 - 1/3)^-1
>>> (Integer(7)*f).factor()
(7) * (t + 1) * (t^2 - 1/3)^-1
>>> ((Integer(7)*f).factor()).unit()
7
(continues on next page)
116 Chapter 5. Elements of function fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> (f**Integer(3)).factor()
(t + 1)^3 * (t^2 - 1/3)^-3
inverse_mod(I)
Return an inverse of the element modulo the integral ideal 𝐼, if 𝐼 and the element together generate the unit
ideal.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order(); I = [Link](x^2 + 1)
sage: t = O(x + 1).inverse_mod(I); t
-1/2*x + 1/2
sage: (t*(x+1) - 1) in I
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order(); I = [Link](x**Integer(2) + Integer(1))
>>> t = O(x + Integer(1)).inverse_mod(I); t
-1/2*x + 1/2
>>> (t*(x+Integer(1)) - Integer(1)) in I
True
is_nth_power(n)
Return whether this element is an n-th power in the rational function field.
INPUT:
• n – an integer
OUTPUT:
Returns True if there is an element 𝑎 in the function field such that this element equals 𝑎𝑛 .
ALGORITHM:
If n is a power of the characteristic of the field and the constant base field is perfect, then this uses the
algorithm described in Lemma 3 of [GiTr1996].
See also:
nth_root()
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3))
sage: f = (x+1)/(x-1)
sage: f.is_nth_power(1)
True
sage: f.is_nth_power(3) #␣
˓→needs [Link]
False
sage: (f^3).is_nth_power(3) #␣
˓→needs [Link]
True
sage: (f^9).is_nth_power(-9) #␣
(continues on next page)
117
Algebraic Function Fields, Release 10.4
(continued from previous page)
needs [Link]
˓→
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1)
>>> f = (x+Integer(1))/(x-Integer(1))
>>> f.is_nth_power(Integer(1))
True
>>> f.is_nth_power(Integer(3)) ␣
˓→ # needs [Link]
False
>>> (f**Integer(3)).is_nth_power(Integer(3)) ␣
˓→ # needs [Link]
True
>>> (f**Integer(9)).is_nth_power(-Integer(9)) ␣
˓→ # needs [Link]
True
is_square()
Return whether the element is a square.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: t.is_square()
False
sage: (t^2/4).is_square()
True
sage: f = 9 * (t+1)^6 / (t^2 - 2*t + 1); f.is_square()
True
sage: K.<t> = FunctionField(GF(5))
sage: (-t^2).is_square() #␣
˓→needs [Link]
True
sage: (-t^2).sqrt() #␣
˓→needs [Link]
2*t
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> t.is_square()
False
>>> (t**Integer(2)/Integer(4)).is_square()
True
>>> f = Integer(9) * (t+Integer(1))**Integer(6) / (t**Integer(2) -␣
˓→Integer(2)*t + Integer(1)); f.is_square()
True
>>> K = FunctionField(GF(Integer(5)), names=( t ,)); (t,) = K._first_ngens(1)
>>> (-t**Integer(2)).is_square() ␣
˓→ # needs [Link]
True
>>> (-t**Integer(2)).sqrt() ␣
˓→ # needs [Link]
(continues on next page)
118 Chapter 5. Elements of function fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
2*t
list()
Return a list with just the element.
The list represents the element when the rational function field is viewed as a (one-dimensional) vector space
over itself.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: [Link]()
[t]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> [Link]()
[t]
nth_root(n)
Return an n-th root of this element in the function field.
INPUT:
• n – an integer
OUTPUT:
Returns an element a in the rational function field such that this element equals 𝑎𝑛 . Raises an error if no such
element exists.
ALGORITHM:
If n is a power of the characteristic of the field and the constant base field is perfect, then this uses the
algorithm described in Corollary 3 of [GiTr1996].
See also:
is_nth_power()
EXAMPLES:
sage: K.<x> = FunctionField(GF(3))
sage: f = (x+1)/(x+2)
sage: f.nth_root(1)
(x + 1)/(x + 2)
sage: f.nth_root(3)
Traceback (most recent call last):
...
ValueError: element is not an n-th power
sage: (f^3).nth_root(3) #␣
˓→needs [Link]
(x + 1)/(x + 2)
sage: (f^9).nth_root(-9) #␣
˓→needs [Link]
(x + 2)/(x + 1)
119
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1)
>>> f = (x+Integer(1))/(x+Integer(2))
>>> f.nth_root(Integer(1))
(x + 1)/(x + 2)
>>> f.nth_root(Integer(3))
Traceback (most recent call last):
...
ValueError: element is not an n-th power
>>> (f**Integer(3)).nth_root(Integer(3)) ␣
˓→ # needs [Link]
(x + 1)/(x + 2)
>>> (f**Integer(9)).nth_root(-Integer(9)) ␣
˓→ # needs [Link]
(x + 2)/(x + 1)
numerator()
Return the numerator of the rational function.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: f = (t+1) / (t^2 - 1/3); f
(t + 1)/(t^2 - 1/3)
sage: [Link]()
t + 1
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = (t+Integer(1)) / (t**Integer(2) - Integer(1)/Integer(3)); f
(t + 1)/(t^2 - 1/3)
>>> [Link]()
t + 1
sqrt(all=False)
Return the square root of the rational function.
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: f = t^2 - 2 + 1/t^2; [Link]()
(t^2 - 1)/t
sage: f = t^2; [Link](all=True)
[t, -t]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = t**Integer(2) - Integer(2) + Integer(1)/t**Integer(2); [Link]()
(t^2 - 1)/t
>>> f = t**Integer(2); [Link](all=True)
[t, -t]
valuation(place)
Return the valuation of the rational function at the place.
Rational function field places are associated with irreducible polynomials.
INPUT:
120 Chapter 5. Elements of function fields: rational
Algebraic Function Fields, Release 10.4
• place – a place or an irreducible polynomial
EXAMPLES:
sage: K.<t> = FunctionField(QQ)
sage: f = (t - 1)^2*(t + 1)/(t^2 - 1/3)^3
sage: [Link](t - 1)
2
sage: [Link](t)
0
sage: [Link](t^2 - 1/3)
-3
sage: K.<x> = FunctionField(GF(2))
sage: p = K.places_finite()[0] #␣
˓→needs [Link]
sage: (1/x^2).valuation(p) #␣
˓→needs [Link]
-2
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( t ,)); (t,) = K._first_ngens(1)
>>> f = (t - Integer(1))**Integer(2)*(t + Integer(1))/(t**Integer(2) -␣
˓→Integer(1)/Integer(3))**Integer(3)
>>> [Link](t - Integer(1))
2
>>> [Link](t)
0
>>> [Link](t**Integer(2) - Integer(1)/Integer(3))
-3
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> p = K.places_finite()[Integer(0)] ␣
˓→ # needs [Link]
>>> (Integer(1)/x**Integer(2)).valuation(p) ␣
˓→ # needs [Link]
-2
121
Algebraic Function Fields, Release 10.4
122 Chapter 5. Elements of function fields: rational
CHAPTER
SIX
ELEMENTS OF FUNCTION FIELDS: EXTENSION
class [Link].function_field.element_polymod.FunctionFieldElement_polymod
Bases: FunctionFieldElement
Elements of a finite extension of a function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: x*y + 1/x^3
x*y + 1/x^3
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> x*y + Integer(1)/x**Integer(3)
x*y + 1/x^3
element()
Return the underlying polynomial that represents the element.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<T> = K[]
sage: L.<y> = [Link](T^2 - x*T + 4*x^3)
sage: f = y/x^2 + x/(x^2+1); f
1/x^2*y + x/(x^2 + 1)
sage: [Link]()
1/x^2*y + x/(x^2 + 1)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ T ];
˓→ (T,) = R._first_ngens(1)
>>> L = [Link](T**Integer(2) - x*T + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> f = y/x**Integer(2) + x/(x**Integer(2)+Integer(1)); f
1/x^2*y + x/(x^2 + 1)
>>> [Link]()
1/x^2*y + x/(x^2 + 1)
is_nth_power(n)
Return whether this element is an n-th power in the function field.
123
Algebraic Function Fields, Release 10.4
INPUT:
• n – an integer
ALGORITHM:
If n is a power of the characteristic of the field and the constant base field is perfect, then this uses the
algorithm described in Proposition 12 of [GiTr1996].
See also:
nth_root()
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: y.is_nth_power(2)
False
sage: L(x).is_nth_power(2)
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> y.is_nth_power(Integer(2))
False
>>> L(x).is_nth_power(Integer(2))
True
list()
Return the list of the coefficients representing the element.
If the function field is 𝐾[𝑦]/(𝑓 (𝑦)), then return the coefficients of the reduced presentation of the element as
a polynomial in 𝐾[𝑦].
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: a = ~(2*y + 1/x); a
(-1/8*x^2/(x^5 + 1/8*x^2 + 1/16))*y + (1/8*x^3 + 1/16*x)/(x^5 + 1/8*x^2 + 1/
˓→16)
sage: [Link]()
[(1/8*x^3 + 1/16*x)/(x^5 + 1/8*x^2 + 1/16), -1/8*x^2/(x^5 + 1/8*x^2 + 1/16)]
sage: (x*y).list()
[0, x]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> a = ~(Integer(2)*y + Integer(1)/x); a
(-1/8*x^2/(x^5 + 1/8*x^2 + 1/16))*y + (1/8*x^3 + 1/16*x)/(x^5 + 1/8*x^2 + 1/
˓→16)
(continues on next page)
124 Chapter 6. Elements of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
[(1/8*x^3 + 1/16*x)/(x^5 + 1/8*x^2 + 1/16), -1/8*x^2/(x^5 + 1/8*x^2 + 1/16)]
>>> (x*y).list()
[0, x]
nth_root(n)
Return an n-th root of this element in the function field.
INPUT:
• n – an integer
OUTPUT:
Returns an element a in the function field such that this element equals 𝑎𝑛 . Raises an error if no such element
exists.
ALGORITHM:
If n is a power of the characteristic of the field and the constant base field is perfect, then this uses the
algorithm described in Proposition 12 of [GiTr1996].
See also:
is_nth_power()
EXAMPLES:
sage: K.<x> = FunctionField(GF(3))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: L(y^3).nth_root(3)
y
sage: L(y^9).nth_root(-9)
1/x*y
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> L(y**Integer(3)).nth_root(Integer(3))
y
>>> L(y**Integer(9)).nth_root(-Integer(9))
1/x*y
This also works for inseparable extensions:
sage: K.<x> = FunctionField(GF(3))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^3 - x^2)
sage: L(x).nth_root(3)^3
x
sage: L(x^9).nth_root(-27)^-27
x^9
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
(continues on next page)
125
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> L = [Link](y**Integer(3) - x**Integer(2), names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> L(x).nth_root(Integer(3))**Integer(3)
x
>>> L(x**Integer(9)).nth_root(-Integer(27))**-Integer(27)
x^9
126 Chapter 6. Elements of function fields: extension
CHAPTER
SEVEN
ORDERS OF FUNCTION FIELDS
An order of a function field is a subring that is, as a module over the base maximal order, finitely generated and of maximal
rank 𝑛, where 𝑛 is the extension degree of the function field. All orders are subrings of maximal orders.
A rational function field has two maximal orders: maximal finite order 𝑜 and maximal infinite order 𝑜∞ . The maximal
order of a rational function field over constant field 𝑘 is just the polynomial ring 𝑜 = 𝑘[𝑥]. The maximal infinite order is
the set of rational functions whose denominator has degree greater than or equal to that of the numerator.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link](1/x); I
Ideal (1/x) of Maximal order of Rational function field in x over Rational Field
sage: 1/x in O
False
sage: Oinf = K.maximal_order_infinite()
sage: 1/x in Oinf
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](Integer(1)/x); I
Ideal (1/x) of Maximal order of Rational function field in x over Rational Field
>>> Integer(1)/x in O
False
>>> Oinf = K.maximal_order_infinite()
>>> Integer(1)/x in Oinf
True
In an extension of a rational function field, an order over the maximal finite order is called a finite order while an order
over the maximal infinite order is called an infinite order. Thus a function field has one maximal finite order 𝑂 and one
maximal infinite order 𝑂∞ . There are other non-maximal orders such as equation orders:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(3)); R.<y> = K[]
sage: L.<y> = [Link](y^3 - y - x)
sage: O = L.equation_order()
sage: 1/y in O
False
sage: x/y in O
True
127
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(3)), names=( x ,)); (x,) = K._first_ngens(1); R = K[
˓→ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) - y - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> Integer(1)/y in O
False
>>> x/y in O
True
Sage provides an extensive functionality for computations in maximal orders of function fields. For example, you can
decompose a prime ideal of a rational function field in an extension:
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: o = K.maximal_order()
sage: p = [Link](x + 1)
sage: p.is_prime() #␣
˓→needs [Link]
True
sage: # needs [Link].function_field
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: [Link](p)
[(Ideal (x + 1, y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal (x + 1, (1/(x^3 + x^2 + x))*y^2 + y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
sage: # needs [Link].function_field
sage: p1, relative_degree,ramification_index = [Link](p)[1]
sage: [Link]()
Monoid of ideals of Maximal order of Function field in y
defined by y^3 + x^6 + x^4 + x^2
sage: relative_degree
2
sage: ramification_index
1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ t ]; (t,) = _._first_ngens(1)
>>> o = K.maximal_order()
>>> p = [Link](x + Integer(1))
>>> p.is_prime() #␣
˓→needs [Link]
True
>>> # needs [Link].function_field
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> [Link](p)
[(Ideal (x + 1, y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal (x + 1, (1/(x^3 + x^2 + x))*y^2 + y + 1) of Maximal order
(continues on next page)
128 Chapter 7. Orders of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
>>> # needs [Link].function_field
>>> p1, relative_degree,ramification_index = [Link](p)[Integer(1)]
>>> [Link]()
Monoid of ideals of Maximal order of Function field in y
defined by y^3 + x^6 + x^4 + x^2
>>> relative_degree
2
>>> ramification_index
1
When the base constant field is the algebraic field , the only prime ideals of the maximal order of the rational function
field are linear polynomials.
sage: # needs [Link].function_field [Link].number_field
sage: K.<x> = FunctionField(QQbar)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - (x^3-x^2))
sage: p = K.maximal_order().ideal(x)
sage: L.maximal_order().decomposition(p)
[(Ideal (1/x*y - I) of Maximal order of Function field in y defined by y^2 - x^3 + x^
˓→2,
1,
1),
(Ideal (1/x*y + I) of Maximal order of Function field in y defined by y^2 - x^3 + x^
˓→2,
1,
1)]
>>> from [Link] import *
>>> # needs [Link].function_field [Link].number_field
>>> K = FunctionField(QQbar, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - (x**Integer(3)-x**Integer(2)), names=( y ,)); (y,
˓→) = L._first_ngens(1)
>>> p = K.maximal_order().ideal(x)
>>> L.maximal_order().decomposition(p)
[(Ideal (1/x*y - I) of Maximal order of Function field in y defined by y^2 - x^3 + x^
˓→2,
1,
1),
(Ideal (1/x*y + I) of Maximal order of Function field in y defined by y^2 - x^3 + x^
˓→2,
1,
1)]
AUTHORS:
• William Stein (2010): initial version
• Maarten Derickx (2011-09-14): fixed ideal_with_gens_over_base() for rational function fields
• Julian Rueth (2011-09-14): added check in _element_constructor_
• Kwankyu Lee (2017-04-30): added maximal orders of global function fields
• Brent Baccala (2019-12-20): support orders in characteristic zero
129
Algebraic Function Fields, Release 10.4
class [Link].function_field.[Link](field,
ideal_class=<class
'[Link]-
tion_field.[Link]-
tionFieldIdeal'>,
category=None)
Bases: UniqueRepresentation, FunctionFieldOrder
Base class of maximal orders of function fields.
class [Link].function_field.[Link](field,
ideal_class=<class
'[Link]-
tion_field.[Link]-
tionField-
Ideal'>,
cate-
gory=None)
Bases: FunctionFieldMaximalOrder, FunctionFieldOrderInfinite
Base class of maximal infinite orders of function fields.
class [Link].function_field.[Link](field, ideal_class=<class
'[Link]-
tion_field.[Link]-
Ideal'>, category=None)
Bases: FunctionFieldOrder_base
Base class for orders in function fields.
class [Link].function_field.[Link](field,
ideal_class=<class
'[Link]-
tion_field.[Link]-
tionFieldIdeal'>,
category=None)
Bases: FunctionFieldOrder_base
Base class for infinite orders in function fields.
class [Link].function_field.order.FunctionFieldOrder_base(field, ideal_class=<class
'[Link]-
tion_field.[Link]-
tionFieldIdeal'>,
category=None)
Bases: CachedRepresentation, Parent
Base class for orders in function fields.
INPUT:
• field – function field
EXAMPLES:
sage: F = FunctionField(QQ, y )
sage: F.maximal_order()
Maximal order of Rational function field in y over Rational Field
130 Chapter 7. Orders of function fields
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> F = FunctionField(QQ, y )
>>> F.maximal_order()
Maximal order of Rational function field in y over Rational Field
fraction_field()
Return the function field to which the order belongs.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().function_field()
Rational function field in y over Rational Field
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().function_field()
Rational function field in y over Rational Field
function_field()
Return the function field to which the order belongs.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().function_field()
Rational function field in y over Rational Field
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().function_field()
Rational function field in y over Rational Field
ideal_monoid()
Return the monoid of ideals of the order.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().ideal_monoid()
Monoid of ideals of Maximal order of Rational function field in y over␣
˓→Rational Field
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().ideal_monoid()
Monoid of ideals of Maximal order of Rational function field in y over␣
˓→Rational Field
is_field(proof=True)
Return False since orders are never fields.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().is_field()
False
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().is_field()
False
131
Algebraic Function Fields, Release 10.4
is_noetherian()
Return True since orders in function fields are Noetherian.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().is_noetherian()
True
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().is_noetherian()
True
is_subring(other)
Return True if the order is a subring of the other order.
INPUT:
• other – order of the function field or the field itself
EXAMPLES:
sage: F = FunctionField(QQ, y )
sage: O = F.maximal_order()
sage: O.is_subring(F)
True
>>> from [Link] import *
>>> F = FunctionField(QQ, y )
>>> O = F.maximal_order()
>>> O.is_subring(F)
True
132 Chapter 7. Orders of function fields
CHAPTER
EIGHT
ORDERS OF FUNCTION FIELDS: RATIONAL
class [Link].function_field.order_rational.FunctionFieldMaximalOrderInfinite_rational(fi
c
e
g
Bases: FunctionFieldMaximalOrderInfinite
Maximal infinite orders of rational function fields.
INPUT:
• field – a rational function field
EXAMPLES:
sage: K.<t> = FunctionField(GF(19)); K
Rational function field in t over Finite Field of size 19
sage: R = K.maximal_order_infinite(); R
Maximal infinite order of Rational function field in t over Finite Field of size␣
˓→19
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(19)), names=( t ,)); (t,) = K._first_ngens(1); K
Rational function field in t over Finite Field of size 19
>>> R = K.maximal_order_infinite(); R
Maximal infinite order of Rational function field in t over Finite Field of size␣
˓→19
basis()
Return the basis (=1) of the order as a module over the polynomial ring.
EXAMPLES:
sage: K.<t> = FunctionField(GF(19))
sage: O = K.maximal_order()
sage: [Link]()
(1,)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(19)), names=( t ,)); (t,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> [Link]()
(1,)
133
Algebraic Function Fields, Release 10.4
gen(n=0)
Return the n-th generator of self. Since there is only one generator n must be 0.
EXAMPLES:
sage: O = FunctionField(QQ, y ).maximal_order()
sage: [Link]()
y
sage: [Link](1)
Traceback (most recent call last):
...
IndexError: there is only one generator
>>> from [Link] import *
>>> O = FunctionField(QQ, y ).maximal_order()
>>> [Link]()
y
>>> [Link](Integer(1))
Traceback (most recent call last):
...
IndexError: there is only one generator
ideal(*gens)
Return the fractional ideal generated by gens.
INPUT:
• gens – elements of the function field
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order_infinite()
sage: [Link](x)
Ideal (x) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
sage: [Link]([x, 1/x]) == [Link](x ,1/x) # multiple generators may be␣
˓→given as a list
True
sage: [Link](x^3 + 1, x^3 + 6)
Ideal (x^3) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
sage: I = [Link]((x^2+1)*(x^3+1), (x^3+6)*(x^2+1)); I
Ideal (x^5) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
sage: [Link](I)
Ideal (x^5) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order_infinite()
>>> [Link](x)
Ideal (x) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
>>> [Link]([x, Integer(1)/x]) == [Link](x ,Integer(1)/x) # multiple␣
˓→generators may be given as a list
True
(continues on next page)
134 Chapter 8. Orders of function fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link](x**Integer(3) + Integer(1), x**Integer(3) + Integer(6))
Ideal (x^3) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
>>> I = [Link]((x**Integer(2)+Integer(1))*(x**Integer(3)+Integer(1)),␣
˓→(x**Integer(3)+Integer(6))*(x**Integer(2)+Integer(1))); I
Ideal (x^5) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
>>> [Link](I)
Ideal (x^5) of Maximal infinite order of Rational function field in x over␣
˓→Rational Field
ngens()
Return 1 the number of generators of the order.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().ngens()
1
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().ngens()
1
prime_ideal()
Return the unique prime ideal of the order.
EXAMPLES:
sage: K.<t> = FunctionField(GF(19))
sage: O = K.maximal_order_infinite()
sage: O.prime_ideal()
Ideal (1/t) of Maximal infinite order of Rational function field in t
over Finite Field of size 19
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(19)), names=( t ,)); (t,) = K._first_ngens(1)
>>> O = K.maximal_order_infinite()
>>> O.prime_ideal()
Ideal (1/t) of Maximal infinite order of Rational function field in t
over Finite Field of size 19
class [Link].function_field.order_rational.FunctionFieldMaximalOrder_rational(field)
Bases: FunctionFieldMaximalOrder
Maximal orders of rational function fields.
INPUT:
• field – a function field
EXAMPLES:
sage: K.<t> = FunctionField(GF(19)); K
Rational function field in t over Finite Field of size 19
sage: R = K.maximal_order(); R
Maximal order of Rational function field in t over Finite Field of size 19
135
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(19)), names=( t ,)); (t,) = K._first_ngens(1); K
Rational function field in t over Finite Field of size 19
>>> R = K.maximal_order(); R
Maximal order of Rational function field in t over Finite Field of size 19
basis()
Return the basis (=1) of the order as a module over the polynomial ring.
EXAMPLES:
sage: K.<t> = FunctionField(GF(19))
sage: O = K.maximal_order()
sage: [Link]()
(1,)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(19)), names=( t ,)); (t,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> [Link]()
(1,)
gen(n=0)
Return the n-th generator of the order. Since there is only one generator n must be 0.
EXAMPLES:
sage: O = FunctionField(QQ, y ).maximal_order()
sage: [Link]()
y
sage: [Link](1)
Traceback (most recent call last):
...
IndexError: there is only one generator
>>> from [Link] import *
>>> O = FunctionField(QQ, y ).maximal_order()
>>> [Link]()
y
>>> [Link](Integer(1))
Traceback (most recent call last):
...
IndexError: there is only one generator
ideal(*gens)
Return the fractional ideal generated by gens.
INPUT:
• gens – elements of the function field
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: [Link](x)
Ideal (x) of Maximal order of Rational function field in x over Rational Field
(continues on next page)
136 Chapter 8. Orders of function fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: [Link]([x, 1/x]) == [Link](x, 1/x) # multiple generators may be␣
˓→given as a list
True
sage: [Link](x^3 + 1, x^3 + 6)
Ideal (1) of Maximal order of Rational function field in x over Rational Field
sage: I = [Link]((x^2+1)*(x^3+1), (x^3+6)*(x^2+1)); I
Ideal (x^2 + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field
sage: [Link](I)
Ideal (x^2 + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> [Link](x)
Ideal (x) of Maximal order of Rational function field in x over Rational Field
>>> [Link]([x, Integer(1)/x]) == [Link](x, Integer(1)/x) # multiple␣
˓→generators may be given as a list
True
>>> [Link](x**Integer(3) + Integer(1), x**Integer(3) + Integer(6))
Ideal (1) of Maximal order of Rational function field in x over Rational Field
>>> I = [Link]((x**Integer(2)+Integer(1))*(x**Integer(3)+Integer(1)),␣
˓→(x**Integer(3)+Integer(6))*(x**Integer(2)+Integer(1))); I
Ideal (x^2 + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field
>>> [Link](I)
Ideal (x^2 + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field
ideal_with_gens_over_base(gens)
Return the fractional ideal with generators gens.
INPUT:
• gens – elements of the function field
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1) ␣
˓→ # needs [Link].function_field
sage: O = L.equation_order() ␣
˓→ # needs [Link].function_field
sage: O.ideal_with_gens_over_base([x^3 + 1, -y]) ␣
˓→ # needs [Link].function_field
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order() ␣
˓→ # needs [Link].function_field
>>> O.ideal_with_gens_over_base([x**Integer(3) + Integer(1), -y]) ␣
(continues on next page)
137
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ # needs [Link].function_field
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
ngens()
Return 1 the number of generators of the order.
EXAMPLES:
sage: FunctionField(QQ, y ).maximal_order().ngens()
1
>>> from [Link] import *
>>> FunctionField(QQ, y ).maximal_order().ngens()
1
138 Chapter 8. Orders of function fields: rational
CHAPTER
NINE
ORDERS OF FUNCTION FIELDS: BASIS
class [Link].function_field.order_basis.FunctionFieldOrderInfinite_basis(ba-
sis,
check=True)
Bases: FunctionFieldOrderInfinite
Order given by a basis over the infinite maximal order of the base field.
INPUT:
• basis – elements of the function field
• check – boolean (default: True); if True, check the basis generates an order
EXAMPLES:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1) #␣
˓→needs [Link].function_field
sage: O = L.equation_order_infinite(); O #␣
˓→needs [Link].function_field
Infinite order in Function field in y defined by y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y ,
˓→)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order_infinite(); O #␣
˓→needs [Link].function_field
Infinite order in Function field in y defined by y^4 + x*y + 4*x + 1
The basis only defines an order if the module it generates is closed under multiplication and contains the identity
element (only checked when check is True):
sage: O = L.order_infinite_with_basis([1, y, 1/x^2*y^2, y^3]); O #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, y, 1/x^2*y^2, y^3)
must be closed under multiplication
>>> from [Link] import *
>>> O = L.order_infinite_with_basis([Integer(1), y, Integer(1)/
˓→x**Integer(2)*y**Integer(2), y**Integer(3)]); O # needs sage.
(continues on next page)
139
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→rings.function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, y, 1/x^2*y^2, y^3)
must be closed under multiplication
The basis also has to be linearly independent and of the same rank as the degree of the function field of its elements
(only checked when check is True):
sage: O = L.order_infinite_with_basis([1, y, 1/x^2*y^2, 1 + y]); O #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: The given basis vectors must be linearly independent.
>>> from [Link] import *
>>> O = L.order_infinite_with_basis([Integer(1), y, Integer(1)/
˓→x**Integer(2)*y**Integer(2), Integer(1) + y]); O # needs sage.
˓→rings.function_field
Traceback (most recent call last):
...
ValueError: The given basis vectors must be linearly independent.
Note that 1 does not need to be an element of the basis, as long as it is in the module spanned by it:
sage: # needs [Link].function_field
sage: O = L.order_infinite_with_basis([1 + 1/x*y, 1/x*y, 1/x^2*y^2, 1/x^3*y^3]); O
Infinite order in Function field in y defined by y^4 + x*y + 4*x + 1
sage: [Link]()
(1/x*y + 1, 1/x*y, 1/x^2*y^2, 1/x^3*y^3)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> O = L.order_infinite_with_basis([Integer(1) + Integer(1)/x*y, Integer(1)/x*y,␣
˓→Integer(1)/x**Integer(2)*y**Integer(2), Integer(1)/
˓→x**Integer(3)*y**Integer(3)]); O
Infinite order in Function field in y defined by y^4 + x*y + 4*x + 1
>>> [Link]()
(1/x*y + 1, 1/x*y, 1/x^2*y^2, 1/x^3*y^3)
basis()
Return a basis of this order over the maximal order of the base field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1) #␣
˓→needs [Link].function_field
sage: O = L.equation_order() #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
(1, y, y^2, y^3)
140 Chapter 9. Orders of function fields: basis
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order() #␣
˓→needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
(1, y, y^2, y^3)
free_module()
Return the free module formed by the basis over the maximal order of the base field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1) #␣
˓→needs [Link].function_field
sage: O = L.equation_order() #␣
˓→needs [Link].function_field
sage: O.free_module() #␣
˓→needs [Link].function_field
Free module of degree 4 and rank 4 over Maximal order of Rational
function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order() #␣
˓→needs [Link].function_field
>>> O.free_module() #␣
˓→needs [Link].function_field
Free module of degree 4 and rank 4 over Maximal order of Rational
function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
ideal(*gens)
Return the fractional ideal generated by the elements in gens.
INPUT:
• gens – list of generators or an ideal in a ring which coerces to this order
EXAMPLES:
141
Algebraic Function Fields, Release 10.4
sage: K.<y> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: [Link](y)
Ideal (y) of Maximal order of Rational function field in y over Rational Field
sage: [Link]([y,1/y]) == [Link](y,1/y) # multiple generators may be given␣
˓→as a list
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( y ,)); (y,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> [Link](y)
Ideal (y) of Maximal order of Rational function field in y over Rational Field
>>> [Link]([y,Integer(1)/y]) == [Link](y,Integer(1)/y) # multiple␣
˓→generators may be given as a list
True
A fractional ideal of a nontrivial extension:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: O = K.maximal_order_infinite()
sage: I = [Link](x^2 - 4)
sage: L.<y> = [Link](y^2 - x^3 - 1) #␣
˓→needs [Link].function_field
sage: S = L.order_infinite_with_basis([1, 1/x^2*y]) #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> O = K.maximal_order_infinite()
>>> I = [Link](x**Integer(2) - Integer(4))
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)# needs [Link].function_field
>>> S = L.order_infinite_with_basis([Integer(1), Integer(1)/x**Integer(2)*y])␣
˓→ # needs [Link].function_field
ideal_with_gens_over_base(gens)
Return the fractional ideal with basis gens over the maximal order of the base field.
It is not checked that gens really generates an ideal.
INPUT:
• gens – list of elements that are a basis for the ideal over the maximal order of the base field
EXAMPLES:
We construct an ideal in a rational function field:
sage: K.<y> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link]([y]); I
Ideal (y) of Maximal order of Rational function field in y over Rational Field
sage: I*I
Ideal (y^2) of Maximal order of Rational function field in y over Rational␣
˓→Field
142 Chapter 9. Orders of function fields: basis
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( y ,)); (y,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link]([y]); I
Ideal (y) of Maximal order of Rational function field in y over Rational Field
>>> I*I
Ideal (y^2) of Maximal order of Rational function field in y over Rational␣
˓→Field
We construct some ideals in a nontrivial function field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order(); O
Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: I = O.ideal_with_gens_over_base([1, y]); I
Ideal (1) of Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: [Link]()
Free module of degree 2 and rank 2 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0]
[0 1]
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order(); O
Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> I = O.ideal_with_gens_over_base([Integer(1), y]); I
Ideal (1) of Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> [Link]()
Free module of degree 2 and rank 2 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0]
[0 1]
There is no check if the resulting object is really an ideal:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = O.ideal_with_gens_over_base([y]); I
Ideal (y) of Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: y in I
True
sage: y^2 in I
False
>>> from [Link] import *
>>> # needs [Link].function_field
(continues on next page)
143
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = O.ideal_with_gens_over_base([y]); I
Ideal (y) of Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> y in I
True
>>> y**Integer(2) in I
False
polynomial()
Return the defining polynomial of the function field of which this is an order.
EXAMPLES:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1) #␣
˓→needs [Link].function_field
sage: O = L.equation_order() #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order() #␣
˓→needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
y^4 + x*y + 4*x + 1
class [Link].function_field.order_basis.FunctionFieldOrder_basis(basis,
check=True)
Bases: FunctionFieldOrder
Order given by a basis over the maximal order of the base field.
INPUT:
• basis – list of elements of the function field
• check – (default: True) if True, check whether the module that basis generates forms an order
EXAMPLES:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1) #␣
˓→needs [Link].function_field
sage: O = L.equation_order(); O #␣
˓→needs [Link].function_field
Order in Function field in y defined by y^4 + x*y + 4*x + 1
144 Chapter 9. Orders of function fields: basis
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y ,
˓→)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order(); O #␣
˓→needs [Link].function_field
Order in Function field in y defined by y^4 + x*y + 4*x + 1
The basis only defines an order if the module it generates is closed under multiplication and contains the identity
element:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^5 - (x^3 + 2*x*y + 1/x)) #␣
˓→needs [Link].function_field
sage: y.is_integral() #␣
˓→needs [Link].function_field
False
sage: [Link](y) #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, y, y^2, y^3, y^4)
must be closed under multiplication
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - (x**Integer(3) + Integer(2)*x*y + Integer(1)/
˓→x), names=( y ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> y.is_integral() #␣
˓→needs [Link].function_field
False
>>> [Link](y) #␣
˓→needs [Link].function_field
Traceback (most recent call last):
...
ValueError: the module generated by basis (1, y, y^2, y^3, y^4)
must be closed under multiplication
The basis also has to be linearly independent and of the same rank as the degree of the function field of its elements
(only checked when check is True):
sage: # needs [Link].function_field
sage: [Link](L(x))
Traceback (most recent call last):
...
ValueError: basis (1, x, x^2, x^3, x^4) is not linearly independent
sage: from [Link].function_field.order_basis import FunctionFieldOrder_basis
sage: FunctionFieldOrder_basis((y,y,y^3,y^4,y^5))
Traceback (most recent call last):
...
ValueError: basis (y, y, y^3, y^4, 2*x*y + (x^4 + 1)/x) is not linearly␣
˓→independent
145
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].function_field
>>> [Link](L(x))
Traceback (most recent call last):
...
ValueError: basis (1, x, x^2, x^3, x^4) is not linearly independent
>>> from [Link].function_field.order_basis import FunctionFieldOrder_basis
>>> FunctionFieldOrder_basis((y,y,y**Integer(3),y**Integer(4),y**Integer(5)))
Traceback (most recent call last):
...
ValueError: basis (y, y, y^3, y^4, 2*x*y + (x^4 + 1)/x) is not linearly␣
˓→independent
basis()
Return a basis of the order over the maximal order of the base field.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: [Link]()
(1, y, y^2, y^3)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> [Link]()
(1, y, y^2, y^3)
coordinate_vector(e)
Return the coordinates of e with respect to the basis of the order.
INPUT:
• e – element of the order or the function field
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: f = (x + y)^3
sage: O.coordinate_vector(f)
(x^3, 3*x^2, 3*x, 1)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
(continues on next page)
146 Chapter 9. Orders of function fields: basis
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> f = (x + y)**Integer(3)
>>> O.coordinate_vector(f)
(x^3, 3*x^2, 3*x, 1)
free_module()
Return the free module formed by the basis over the maximal order of the base function field.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: O.free_module()
Free module of degree 4 and rank 4 over Maximal order of Rational
function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> O.free_module()
Free module of degree 4 and rank 4 over Maximal order of Rational
function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
ideal(*gens)
Return the fractional ideal generated by the elements in gens.
INPUT:
• gens – list of generators or an ideal in a ring which coerces to this order
EXAMPLES:
sage: K.<y> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: [Link](y)
Ideal (y) of Maximal order of Rational function field in y over Rational Field
sage: [Link]([y,1/y]) == [Link](y,1/y) # multiple generators may be given␣
˓→as a list
True
147
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( y ,)); (y,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> [Link](y)
Ideal (y) of Maximal order of Rational function field in y over Rational Field
>>> [Link]([y,Integer(1)/y]) == [Link](y,Integer(1)/y) # multiple␣
˓→generators may be given as a list
True
A fractional ideal of a nontrivial extension:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: O = K.maximal_order()
sage: I = [Link](x^2 - 4)
sage: # needs [Link].function_field
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: S = L.equation_order()
sage: [Link](1/y)
Ideal (1, (6/(x^3 + 1))*y) of
Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: I2 = [Link](x^2 - 4); I2
Ideal (x^2 + 3) of Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: I2 == [Link](I)
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) - Integer(4))
>>> # needs [Link].function_field
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> S = L.equation_order()
>>> [Link](Integer(1)/y)
Ideal (1, (6/(x^3 + 1))*y) of
Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> I2 = [Link](x**Integer(2) - Integer(4)); I2
Ideal (x^2 + 3) of Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> I2 == [Link](I)
True
ideal_with_gens_over_base(gens)
Return the fractional ideal with basis gens over the maximal order of the base field.
It is not checked that the gens really generates an ideal.
INPUT:
• gens – list of elements of the function field
EXAMPLES:
We construct an ideal in a rational function field:
148 Chapter 9. Orders of function fields: basis
Algebraic Function Fields, Release 10.4
sage: K.<y> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link]([y]); I
Ideal (y) of Maximal order of Rational function field in y over Rational Field
sage: I * I
Ideal (y^2) of Maximal order of Rational function field in y over Rational␣
˓→Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( y ,)); (y,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link]([y]); I
Ideal (y) of Maximal order of Rational function field in y over Rational Field
>>> I * I
Ideal (y^2) of Maximal order of Rational function field in y over Rational␣
˓→Field
We construct some ideals in a nontrivial function field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order(); O
Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: I = O.ideal_with_gens_over_base([1, y]); I
Ideal (1) of Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: [Link]()
Free module of degree 2 and rank 2 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0]
[0 1]
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order(); O
Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> I = O.ideal_with_gens_over_base([Integer(1), y]); I
Ideal (1) of Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> [Link]()
Free module of degree 2 and rank 2 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0]
[0 1]
There is no check if the resulting object is really an ideal:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = O.ideal_with_gens_over_base([y]); I
(continues on next page)
149
Algebraic Function Fields, Release 10.4
(continued from previous page)
Ideal (y) of Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: y in I
True
sage: y^2 in I
False
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = O.ideal_with_gens_over_base([y]); I
Ideal (y) of Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> y in I
True
>>> y**Integer(2) in I
False
polynomial()
Return the defining polynomial of the function field of which this is an order.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: [Link]()
y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> [Link]()
y^4 + x*y + 4*x + 1
150 Chapter 9. Orders of function fields: basis
CHAPTER
TEN
ORDERS OF FUNCTION FIELDS: EXTENSION
class [Link].function_field.order_polymod.FunctionFieldMaximalOrderInfinite_polymod(field
cat-
e-
gory
Bases: FunctionFieldMaximalOrderInfinite
Maximal infinite orders of function fields.
INPUT:
• field – function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<t> = PolynomialRing(K) #␣
˓→needs [Link].finite_rings
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2) #␣
˓→needs [Link].finite_rings
sage: F.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^3 + x^6 + x^4 + x^2
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].finite_rings
sage: L.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^2 + y + (x^2 + 1)/x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)# needs [Link].
˓→finite_rings
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,) = F.
˓→_first_ngens(1)# needs [Link].finite_rings
>>> F.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^3 + x^6 + x^4 + x^2
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L.
(continues on next page)
151
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ _first_ngens(1)# needs [Link].finite_rings
>>> L.maximal_order_infinite() #␣
˓→needs [Link].finite_rings
Maximal infinite order of Function field in y defined by y^2 + y + (x^2 + 1)/x
basis()
Return a basis of this order as a module over the maximal order of the base function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: L.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
(1, 1/x^2*y, (1/(x^4 + x^3 + x^2))*y^2)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> L = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
(1, 1/x^2*y, (1/(x^4 + x^3 + x^2))*y^2)
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
(1, 1/x*y)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
(1, 1/x*y)
coordinate_vector(e)
Return the coordinates of e with respect to the basis of the order.
INPUT:
• e – element of the function field
The returned coordinates are in the base maximal infinite order if and only if the element is in the order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
(continues on next page)
152 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: f = 1/y^2
sage: f in Oinf
True
sage: Oinf.coordinate_vector(f)
((x^3 + x^2 + x)/(x^4 + 1), x^3/(x^4 + 1))
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> f = Integer(1)/y**Integer(2)
>>> f in Oinf
True
>>> Oinf.coordinate_vector(f)
((x^3 + x^2 + x)/(x^4 + 1), x^3/(x^4 + 1))
decomposition()
Return prime ideal decomposition of 𝑝𝑂∞ where 𝑝 is the unique prime ideal of the maximal infinite order
of the rational function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = F.maximal_order_infinite()
sage: [Link]()
[(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1/x^2*y + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> [Link]()
[(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1/x^2*y + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
(continues on next page)
153
Algebraic Function Fields, Release 10.4
(continued from previous page)
[(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x, 1, 2)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
[(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x, 1, 2)]
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = F.maximal_order_infinite()
sage: [Link]()
[(Ideal (1/x^2*y - 1) of Maximal infinite order
of Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 - 2*x^3 - x^2, 1,
˓→ 1),
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1/x^2*y + 1) of Maximal infinite order
of Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 - 2*x^3 - x^2, 2,
˓→ 1)]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> [Link]()
[(Ideal (1/x^2*y - 1) of Maximal infinite order
of Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 - 2*x^3 - x^2, 1,
˓→ 1),
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1/x^2*y + 1) of Maximal infinite order
of Function field in y defined by y^3 - x^6 - 2*x^5 - 3*x^4 - 2*x^3 - x^2, 2,
˓→ 1)]
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
[(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x, 1, 2)]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
[(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x, 1, 2)]
154 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
different()
Return the different ideal of the maximal infinite order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
Ideal (1/x) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
Ideal (1/x) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x
gen(n=0)
Return the n-th generator of the order.
The basis elements of the order are generators.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: L.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
1
sage: [Link](1)
1/x^2*y
sage: [Link](2)
(1/(x^4 + x^3 + x^2))*y^2
sage: [Link](3)
Traceback (most recent call last):
...
IndexError: there are only 3 generators
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> L = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
1
>>> [Link](Integer(1))
1/x^2*y
>>> [Link](Integer(2))
(continues on next page)
155
Algebraic Function Fields, Release 10.4
(continued from previous page)
(1/(x^4 + x^3 + x^2))*y^2
>>> [Link](Integer(3))
Traceback (most recent call last):
...
IndexError: there are only 3 generators
ideal(*gens)
Return the ideal generated by gens.
INPUT:
• gens – tuple of elements of the function field
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](x, y); I
Ideal (y) of Maximal infinite order of Function field
in y defined by y^3 + x^6 + x^4 + x^2
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](x, y); I
Ideal (y) of Maximal infinite order of Function field
in y defined by y^3 + x^6 + x^4 + x^2
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](x, y); I
Ideal (x) of Maximal infinite order of Function field
in y defined by y^2 + y + (x^2 + 1)/x
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](x, y); I
Ideal (x) of Maximal infinite order of Function field
in y defined by y^2 + y + (x^2 + 1)/x
ideal_with_gens_over_base(gens)
Return the ideal generated by gens as a module.
INPUT:
156 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
• gens – tuple of elements of the function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = F.maximal_order_infinite()
sage: Oinf.ideal_with_gens_over_base((x^2, y, (1/(x^2 + x + 1))*y^2))
Ideal (y) of Maximal infinite order of Function field in y
defined by y^3 + x^6 + x^4 + x^2
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ t ]; (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> Oinf.ideal_with_gens_over_base((x**Integer(2), y, (Integer(1)/
˓→(x**Integer(2) + x + Integer(1)))*y**Integer(2)))
Ideal (y) of Maximal infinite order of Function field in y
defined by y^3 + x^6 + x^4 + x^2
ngens()
Return the number of generators of the order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: L.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = L.maximal_order_infinite()
sage: [Link]()
3
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> L = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> [Link]()
3
class [Link].function_field.order_polymod.FunctionFieldMaximalOrder_global(field)
Bases: FunctionFieldMaximalOrder_polymod
Maximal orders of global function fields.
INPUT:
• field – function field to which this maximal order belongs
EXAMPLES:
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1) #␣
˓→needs [Link].finite_rings
(continues on next page)
157
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: L.maximal_order() #␣
˓→needs [Link].finite_rings
Maximal order of Function field in y defined by y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ y ]; (y,) = R._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y ,
˓→)); (y,) = L._first_ngens(1)# needs [Link].finite_rings
>>> L.maximal_order() #␣
˓→needs [Link].finite_rings
Maximal order of Function field in y defined by y^4 + x*y + 4*x + 1
decomposition(ideal)
Return the decomposition of the prime ideal.
INPUT:
• ideal – prime ideal of the base maximal order
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: o = K.maximal_order()
sage: O = F.maximal_order()
sage: p = [Link](x + 1)
sage: [Link](p)
[(Ideal (x + 1, y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal (x + 1, (1/(x^3 + x^2 + x))*y^2 + y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ t ]; (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> o = K.maximal_order()
>>> O = F.maximal_order()
>>> p = [Link](x + Integer(1))
>>> [Link](p)
[(Ideal (x + 1, y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal (x + 1, (1/(x^3 + x^2 + x))*y^2 + y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
p_radical(prime)
Return the prime-radical of the maximal order.
INPUT:
• prime – prime ideal of the maximal order of the base rational function field
The algorithm is outlined in Section 6.1.3 of [Coh1993].
EXAMPLES:
158 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2 * (x^2 + x + 1)^2)
sage: o = K.maximal_order()
sage: O = F.maximal_order()
sage: p = [Link](x + 1)
sage: O.p_radical(p)
Ideal (x + 1) of Maximal order of Function field in y
defined by y^3 + x^6 + x^4 + x^2
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2) * (x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> o = K.maximal_order()
>>> O = F.maximal_order()
>>> p = [Link](x + Integer(1))
>>> O.p_radical(p)
Ideal (x + 1) of Maximal order of Function field in y
defined by y^3 + x^6 + x^4 + x^2
class [Link].function_field.order_polymod.FunctionFieldMaximalOrder_polymod(field,
ideal_class=<cla
'[Link]-
tion_field.ideal_
[Link]-
tion-
Fiel-
d-
Ideal_poly-
mod'>)
Bases: FunctionFieldMaximalOrder
Maximal orders of extensions of function fields.
basis()
Return a basis of the order over the maximal order of the base function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: [Link]()
(1, y, y^2, y^3)
sage: K.<x> = FunctionField(QQ)
sage: R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^4 + x^12*t^2 + x^18*t + x^21 + x^18)
sage: O = F.maximal_order()
sage: [Link]()
(1, 1/x^4*y, 1/x^9*y^2, 1/x^13*y^3)
159
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> [Link]()
(1, y, y^2, y^3)
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(4) + x**Integer(12)*t**Integer(2) +␣
˓→x**Integer(18)*t + x**Integer(21) + x**Integer(18), names=( y ,)); (y,) = F.
˓→_first_ngens(1)
>>> O = F.maximal_order()
>>> [Link]()
(1, 1/x^4*y, 1/x^9*y^2, 1/x^13*y^3)
codifferent()
Return the codifferent ideal of the function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.maximal_order()
sage: [Link]()
Ideal (1, (1/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4))*y^3
+ ((5*x^3 + 6*x^2 + x + 6)/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4))*y^2
+ ((x^3 + 2*x^2 + 2*x + 2)/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4))*y
+ 6*x/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4)) of Maximal order of Function field
in y defined by y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> [Link]()
Ideal (1, (1/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4))*y^3
+ ((5*x^3 + 6*x^2 + x + 6)/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4))*y^2
+ ((x^3 + 2*x^2 + 2*x + 2)/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4))*y
+ 6*x/(x^4 + 4*x^3 + 3*x^2 + 6*x + 4)) of Maximal order of Function field
in y defined by y^4 + x*y + 4*x + 1
coordinate_vector(e)
Return the coordinates of e with respect to the basis of this order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
(continues on next page)
160 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: O = L.maximal_order()
sage: O.coordinate_vector(y)
(0, 1, 0, 0)
sage: O.coordinate_vector(x*y)
(0, x, 0, 0)
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: f = (x + y)^3
sage: O.coordinate_vector(f)
(x^3, 3*x^2, 3*x, 1)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> O.coordinate_vector(y)
(0, 1, 0, 0)
>>> O.coordinate_vector(x*y)
(0, x, 0, 0)
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> f = (x + y)**Integer(3)
>>> O.coordinate_vector(f)
(x^3, 3*x^2, 3*x, 1)
decomposition(ideal)
Return the decomposition of the prime ideal.
INPUT:
• ideal – prime ideal of the base maximal order
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: o = K.maximal_order()
sage: O = F.maximal_order()
sage: p = [Link](x + 1)
sage: [Link](p)
[(Ideal (x + 1, y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal (x + 1, (1/(x^3 + x^2 + x))*y^2 + y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
(continues on next page)
161
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ t ]; (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> o = K.maximal_order()
>>> O = F.maximal_order()
>>> p = [Link](x + Integer(1))
>>> [Link](p)
[(Ideal (x + 1, y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 1, 1),
(Ideal (x + 1, (1/(x^3 + x^2 + x))*y^2 + y + 1) of Maximal order
of Function field in y defined by y^3 + x^6 + x^4 + x^2, 2, 1)]
ALGORITHM:
In principle, we’re trying to compute a primary decomposition of the extension of ideal in self (an order,
and therefore a ring). However, while we have primary decomposition methods for polynomial rings, we lack
any such method for an order. Therefore, we construct self mod ideal as a finite-dimensional algebra, a
construct for which we do support primary decomposition.
See Issue #28094 and [Link]
Todo: Use Kummer’s theorem to shortcut this code if possible, like as done in
FunctionFieldMaximalOrder_global.decomposition()
different()
Return the different ideal of the function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.maximal_order()
sage: [Link]()
Ideal (y^3 + 2*x)
of Maximal order of Function field in y defined by y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> [Link]()
Ideal (y^3 + 2*x)
of Maximal order of Function field in y defined by y^4 + x*y + 4*x + 1
free_module()
Return the free module formed by the basis over the maximal order of the base field.
EXAMPLES:
162 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.maximal_order()
sage: O.free_module()
Free module of degree 4 and rank 4 over
Maximal order of Rational function field in x over Finite Field of size 7
User basis matrix:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> O.free_module()
Free module of degree 4 and rank 4 over
Maximal order of Rational function field in x over Finite Field of size 7
User basis matrix:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
gen(n=0)
Return the n-th generator of the order.
The basis elements of the order are generators.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: L.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: O = L.maximal_order()
sage: [Link]()
1
sage: [Link](1)
y
sage: [Link](2)
(1/(x^3 + x^2 + x))*y^2
sage: [Link](3)
Traceback (most recent call last):
...
IndexError: there are only 3 generators
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> L = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = L._first_ngens(1)
(continues on next page)
163
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> O = L.maximal_order()
>>> [Link]()
1
>>> [Link](Integer(1))
y
>>> [Link](Integer(2))
(1/(x^3 + x^2 + x))*y^2
>>> [Link](Integer(3))
Traceback (most recent call last):
...
IndexError: there are only 3 generators
ideal(*gens, **kwargs)
Return the fractional ideal generated by the elements in gens.
INPUT:
• gens – list of generators
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: O = K.maximal_order()
sage: I = [Link](x^2 - 4)
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: S = L.maximal_order()
sage: [Link](1/y)
Ideal ((1/(x^3 + 1))*y) of Maximal order of Function field
in y defined by y^2 + 6*x^3 + 6
sage: I2 = [Link](x^2 - 4); I2
Ideal (x^2 + 3) of Maximal order of Function field in y defined by y^2 + 6*x^
˓→3 + 6
sage: I2 == [Link](I)
True
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: O = K.maximal_order()
sage: I = [Link](x^2 - 4)
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: S = L.maximal_order()
sage: [Link](1/y)
Ideal ((1/(x^3 + 1))*y) of
Maximal order of Function field in y defined by y^2 - x^3 - 1
sage: I2 = [Link](x^2-4); I2
Ideal (x^2 - 4) of Maximal order of Function field in y defined by y^2 - x^3 -
˓→ 1
sage: I2 == [Link](I)
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) - Integer(4))
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
(continues on next page)
164 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ (y,) = L._first_ngens(1)
>>> S = L.maximal_order()
>>> [Link](Integer(1)/y)
Ideal ((1/(x^3 + 1))*y) of Maximal order of Function field
in y defined by y^2 + 6*x^3 + 6
>>> I2 = [Link](x**Integer(2) - Integer(4)); I2
Ideal (x^2 + 3) of Maximal order of Function field in y defined by y^2 + 6*x^
˓→3 + 6
>>> I2 == [Link](I)
True
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) - Integer(4))
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> S = L.maximal_order()
>>> [Link](Integer(1)/y)
Ideal ((1/(x^3 + 1))*y) of
Maximal order of Function field in y defined by y^2 - x^3 - 1
>>> I2 = [Link](x**Integer(2)-Integer(4)); I2
Ideal (x^2 - 4) of Maximal order of Function field in y defined by y^2 - x^3 -
˓→ 1
>>> I2 == [Link](I)
True
ideal_with_gens_over_base(gens)
Return the fractional ideal with basis gens over the maximal order of the base field.
INPUT:
• gens – list of elements that generates the ideal over the maximal order of the base field
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.maximal_order(); O
Maximal order of Function field in y defined by y^2 + 6*x^3 + 6
sage: I = O.ideal_with_gens_over_base([1, y]); I
Ideal (1) of Maximal order of Function field in y defined by y^2 + 6*x^3 + 6
sage: [Link]()
Free module of degree 2 and rank 2 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0]
[0 1]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.maximal_order(); O
(continues on next page)
165
Algebraic Function Fields, Release 10.4
(continued from previous page)
Maximal order of Function field in y defined by y^2 + 6*x^3 + 6
>>> I = O.ideal_with_gens_over_base([Integer(1), y]); I
Ideal (1) of Maximal order of Function field in y defined by y^2 + 6*x^3 + 6
>>> [Link]()
Free module of degree 2 and rank 2 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[1 0]
[0 1]
There is no check if the resulting object is really an ideal:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = O.ideal_with_gens_over_base([y]); I
Ideal (y) of Order in Function field in y defined by y^2 + 6*x^3 + 6
sage: y in I
True
sage: y^2 in I
False
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = O.ideal_with_gens_over_base([y]); I
Ideal (y) of Order in Function field in y defined by y^2 + 6*x^3 + 6
>>> y in I
True
>>> y**Integer(2) in I
False
ngens()
Return the number of generators of the order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: L.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: Oinf = L.maximal_order()
sage: [Link]()
3
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> L = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = L._first_ngens(1)
>>> Oinf = L.maximal_order()
(continues on next page)
166 Chapter 10. Orders of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
3
polynomial()
Return the defining polynomial of the function field of which this is an order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: [Link]()
y^4 + x*y + 4*x + 1
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^4 + x*y + 4*x + 1)
sage: O = L.equation_order()
sage: [Link]()
y^4 + x*y + 4*x + 1
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> [Link]()
y^4 + x*y + 4*x + 1
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(4) + x*y + Integer(4)*x + Integer(1), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> [Link]()
y^4 + x*y + 4*x + 1
167
Algebraic Function Fields, Release 10.4
168 Chapter 10. Orders of function fields: extension
CHAPTER
ELEVEN
IDEALS OF FUNCTION FIELDS
Ideals of an order of a function field include all fractional ideals of the order. Sage provides basic arithmetic with fractional
ideals.
The fractional ideals of the maximal order of a global function field forms a multiplicative monoid. Sage allows advanced
arithmetic with the fractional ideals. For example, an ideal of the maximal order can be factored into a product of prime
ideals.
EXAMPLES:
Ideals in the maximal order of a rational function field:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link](x^3 + 1); I
Ideal (x^3 + 1) of Maximal order of Rational function field in x over Rational Field
sage: I^2
Ideal (x^6 + 2*x^3 + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field
sage: ~I
Ideal (1/(x^3 + 1)) of Maximal order of Rational function field in x over Rational␣
˓→Field
sage: ~I * I
Ideal (1) of Maximal order of Rational function field in x over Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(3) + Integer(1)); I
Ideal (x^3 + 1) of Maximal order of Rational function field in x over Rational Field
>>> I**Integer(2)
Ideal (x^6 + 2*x^3 + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field
>>> ~I
Ideal (1/(x^3 + 1)) of Maximal order of Rational function field in x over Rational␣
˓→Field
>>> ~I * I
Ideal (1) of Maximal order of Rational function field in x over Rational Field
Ideals in the equation order of an extension of a rational function field:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1) ␣
˓→ # needs [Link].function_field
sage: O = L.equation_order() ␣
(continues on next page)
169
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ # needs [Link].function_field
sage: I = [Link](y); I ␣
˓→ # needs [Link].function_field
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
sage: I^2 ␣
˓→ # needs [Link].function_field
Ideal (x^3 + 1, (-x^3 - 1)*y) of Order in Function field in y defined by y^2 - x^3 - 1
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,) =␣
˓→R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,)); (y,) =␣
˓→L._first_ngens(1)# needs [Link].function_field
>>> O = L.equation_order() ␣
˓→ # needs [Link].function_field
>>> I = [Link](y); I ␣
˓→ # needs [Link].function_field
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
>>> I**Integer(2) ␣
˓→ # needs [Link].function_field
Ideal (x^3 + 1, (-x^3 - 1)*y) of Order in Function field in y defined by y^2 - x^3 - 1
Ideals in the maximal order of a global function field:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3*y - x) ␣
˓→ # needs [Link].function_field
sage: O = L.maximal_order() ␣
˓→ # needs [Link].function_field
sage: I = [Link](y) ␣
˓→ # needs [Link].function_field
sage: I^2 ␣
˓→ # needs [Link].function_field
Ideal (x) of Maximal order of Function field in y defined by y^2 + x^3*y + x
sage: ~I ␣
˓→ # needs [Link].function_field
Ideal (1/x*y) of Maximal order of Function field in y defined by y^2 + x^3*y + x
sage: ~I * I ␣
˓→ # needs [Link].function_field
Ideal (1) of Maximal order of Function field in y defined by y^2 + x^3*y + x
sage: J = [Link](x + y) * I ␣
˓→ # needs [Link].finite_rings [Link].function_
˓→field
sage: [Link]() ␣
˓→ # needs [Link].finite_rings [Link].function_
˓→field
(Ideal (y) of Maximal order of Function field in y defined by y^2 + x^3*y + x)^2 *
(Ideal (x^3 + x + 1, y + x) of Maximal order of Function field in y defined by y^2 +␣
˓→x^3*y + x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R = K[
˓→ y ]; (y,) = R._first_ngens(1)
(continues on next page)
170 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> L = [Link](y**Integer(2) - x**Integer(3)*y - x, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> O = L.maximal_order() ␣
˓→ # needs [Link].function_field
>>> I = [Link](y) ␣
˓→ # needs [Link].function_field
>>> I**Integer(2) ␣
˓→ # needs [Link].function_field
Ideal (x) of Maximal order of Function field in y defined by y^2 + x^3*y + x
>>> ~I ␣
˓→ # needs [Link].function_field
Ideal (1/x*y) of Maximal order of Function field in y defined by y^2 + x^3*y + x
>>> ~I * I ␣
˓→ # needs [Link].function_field
Ideal (1) of Maximal order of Function field in y defined by y^2 + x^3*y + x
>>> J = [Link](x + y) * I ␣
˓→ # needs [Link].finite_rings [Link].function_
˓→field
>>> [Link]() ␣
˓→ # needs [Link].finite_rings [Link].function_
˓→field
(Ideal (y) of Maximal order of Function field in y defined by y^2 + x^3*y + x)^2 *
(Ideal (x^3 + x + 1, y + x) of Maximal order of Function field in y defined by y^2 +␣
˓→x^3*y + x)
Ideals in the maximal infinite order of a global function field:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); R.<t> = K[]
sage: F.<y> = [Link](t^3 + t^2 - x^4) ␣
˓→ # needs [Link].function_field
sage: Oinf = F.maximal_order_infinite() ␣
˓→ # needs [Link].function_field
sage: I = [Link](1/y) ␣
˓→ # needs [Link].function_field
sage: I + I == I
True
sage: I^2 ␣
˓→ # needs [Link].function_field
Ideal (1/x^4*y) of Maximal infinite order of Function field in y defined by y^3 + y^2␣
˓→+ 2*x^4
sage: ~I ␣
˓→ # needs [Link].function_field
Ideal (y) of Maximal infinite order of Function field in y defined by y^3 + y^2 + 2*x^
˓→4
sage: ~I * I ␣
˓→ # needs [Link].function_field
Ideal (1) of Maximal infinite order of Function field in y defined by y^3 + y^2 + 2*x^
˓→4
sage: [Link]() ␣
˓→ # needs [Link].function_field
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field in y defined by y^3 +␣
˓→y^2 + 2*x^4)^4
>>> from [Link] import *
(continues on next page)
171
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._first_
˓→ngens(1); R = K[ t ]; (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,)); (y,
˓→) = F._first_ngens(1)# needs [Link].function_field
>>> Oinf = F.maximal_order_infinite() ␣
˓→ # needs [Link].function_field
>>> I = [Link](Integer(1)/y) ␣
˓→ # needs [Link].function_field
>>> I + I == I
True
>>> I**Integer(2) ␣
˓→ # needs [Link].function_field
Ideal (1/x^4*y) of Maximal infinite order of Function field in y defined by y^3 + y^2␣
˓→+ 2*x^4
>>> ~I ␣
˓→ # needs [Link].function_field
Ideal (y) of Maximal infinite order of Function field in y defined by y^3 + y^2 + 2*x^
˓→4
>>> ~I * I ␣
˓→ # needs [Link].function_field
Ideal (1) of Maximal infinite order of Function field in y defined by y^3 + y^2 + 2*x^
˓→4
>>> [Link]() ␣
˓→ # needs [Link].function_field
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field in y defined by y^3 +␣
˓→y^2 + 2*x^4)^4
AUTHORS:
• William Stein (2010): initial version
• Maarten Derickx (2011-09-14): fixed ideal_with_gens_over_base()
• Kwankyu Lee (2017-04-30): added ideals for global function fields
class [Link].function_field.[Link](ring)
Bases: Element
Base class of fractional ideals of function fields.
INPUT:
• ring – ring of the ideal
EXAMPLES:
sage: K.<x> = FunctionField(GF(7))
sage: O = K.equation_order()
sage: [Link](x^3 + 1)
Ideal (x^3 + 1) of Maximal order of Rational function field in x over Finite␣
˓→Field of size 7
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.equation_order()
>>> [Link](x**Integer(3) + Integer(1))
Ideal (x^3 + 1) of Maximal order of Rational function field in x over Finite␣
˓→Field of size 7
172 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
base_ring()
Return the base ring of this ideal.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = [Link](x^2 + 1)
sage: I.base_ring()
Order in Function field in y defined by y^2 - x^3 - 1
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = [Link](x**Integer(2) + Integer(1))
>>> I.base_ring()
Order in Function field in y defined by y^2 - x^3 - 1
divisor()
Return the divisor corresponding to the ideal.
EXAMPLES:
sage: # needs [Link] [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x*(x + 1)^2/(x^2 + x + 1))
sage: [Link]()
Place (x) + 2*Place (x + 1) - Place (x + z2) - Place (x + z2 + 1)
sage: # needs [Link] [Link].finite_rings
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x + 1)/(x^3 + 1))
sage: [Link]()
2*Place (1/x)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<T> = PolynomialRing(K)
sage: F.<y> = [Link](T^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [Link]()
2*Place (x, (1/(x^3 + x^2 + x))*y^2)
+ 2*Place (x^2 + x + 1, (1/(x^3 + x^2 + x))*y^2)
sage: # needs [Link].function_field
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](y)
sage: [Link]()
-2*Place (1/x, 1/x^4*y^2 + 1/x^2*y + 1)
- 2*Place (1/x, 1/x^2*y + 1)
(continues on next page)
173
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [Link]()
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
sage: # needs [Link].function_field
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](y)
sage: [Link]()
- Place (1/x, 1/x*y)
>>> from [Link] import *
>>> # needs [Link] [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x*(x + Integer(1))**Integer(2)/(x**Integer(2) + x +␣
˓→Integer(1)))
>>> [Link]()
Place (x) + 2*Place (x + 1) - Place (x + z2) - Place (x + z2 + 1)
>>> # needs [Link] [Link].finite_rings
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x + Integer(1))/(x**Integer(3) + Integer(1)))
>>> [Link]()
2*Place (1/x)
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = PolynomialRing(K, names=( T ,)); (T,) = _._first_ngens(1)
>>> F = [Link](T**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [Link]()
2*Place (x, (1/(x^3 + x^2 + x))*y^2)
+ 2*Place (x^2 + x + 1, (1/(x^3 + x^2 + x))*y^2)
>>> # needs [Link].function_field
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](y)
>>> [Link]()
-2*Place (1/x, 1/x^4*y^2 + 1/x^2*y + 1)
- 2*Place (1/x, 1/x^2*y + 1)
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [Link]()
(continues on next page)
174 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
- Place (x, x*y)
+ 2*Place (x + 1, x*y)
>>> # needs [Link].function_field
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](y)
>>> [Link]()
- Place (1/x, 1/x*y)
divisor_of_poles()
Return the divisor of poles corresponding to the ideal.
EXAMPLES:
sage: # needs [Link] [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x*(x + 1)^2/(x^2 + x + 1))
sage: I.divisor_of_poles()
Place (x + z2) + Place (x + z2 + 1)
sage: # needs [Link]
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x + 1)/(x^3 + 1))
sage: I.divisor_of_poles()
0
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: I.divisor_of_poles()
Place (x, x*y)
>>> from [Link] import *
>>> # needs [Link] [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x*(x + Integer(1))**Integer(2)/(x**Integer(2) + x +␣
˓→Integer(1)))
>>> I.divisor_of_poles()
Place (x + z2) + Place (x + z2 + 1)
>>> # needs [Link]
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x + Integer(1))/(x**Integer(3) + Integer(1)))
>>> I.divisor_of_poles()
0
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
(continues on next page)
175
Algebraic Function Fields, Release 10.4
(continued from previous page)
= L._first_ngens(1)
˓→
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> I.divisor_of_poles()
Place (x, x*y)
divisor_of_zeros()
Return the divisor of zeros corresponding to the ideal.
EXAMPLES:
sage: # needs [Link] [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x*(x + 1)^2/(x^2 + x + 1))
sage: I.divisor_of_zeros()
Place (x) + 2*Place (x + 1)
sage: # needs [Link]
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x + 1)/(x^3 + 1))
sage: I.divisor_of_zeros()
2*Place (1/x)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: I.divisor_of_zeros()
2*Place (x + 1, x*y)
>>> from [Link] import *
>>> # needs [Link] [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x*(x + Integer(1))**Integer(2)/(x**Integer(2) + x +␣
˓→Integer(1)))
>>> I.divisor_of_zeros()
Place (x) + 2*Place (x + 1)
>>> # needs [Link]
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x + Integer(1))/(x**Integer(3) + Integer(1)))
>>> I.divisor_of_zeros()
2*Place (1/x)
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
(continues on next page)
176 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> I.divisor_of_zeros()
2*Place (x + 1, x*y)
factor()
Return the factorization of this ideal.
Subclass of this class should define _factor() method that returns a list of prime ideal and multiplicity
pairs.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x^3*(x + 1)^2)
sage: [Link]()
(Ideal (x) of Maximal order of Rational function field in x
over Finite Field in z2 of size 2^2)^3 *
(Ideal (x + 1) of Maximal order of Rational function field in x
over Finite Field in z2 of size 2^2)^2
sage: # needs [Link].finite_rings
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x + 1)/(x^3 + 1))
sage: [Link]()
(Ideal (1/x) of Maximal infinite order of Rational function field in x
over Finite Field in z2 of size 2^2)^2
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<T> = PolynomialRing(K)
sage: F.<y> = [Link](T^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: I == [Link]().prod()
True
sage: # needs [Link].function_field
sage: Oinf = F.maximal_order_infinite()
sage: f= 1/x
sage: I = [Link](f)
sage: [Link]()
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1/x^2*y + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2) *
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: I == [Link]().prod()
True
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
(continues on next page)
177
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: I == [Link]().prod()
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(3)*(x + Integer(1))**Integer(2))
>>> [Link]()
(Ideal (x) of Maximal order of Rational function field in x
over Finite Field in z2 of size 2^2)^3 *
(Ideal (x + 1) of Maximal order of Rational function field in x
over Finite Field in z2 of size 2^2)^2
>>> # needs [Link].finite_rings
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x + Integer(1))/(x**Integer(3) + Integer(1)))
>>> [Link]()
(Ideal (1/x) of Maximal infinite order of Rational function field in x
over Finite Field in z2 of size 2^2)^2
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = PolynomialRing(K, names=( T ,)); (T,) = _._first_ngens(1)
>>> F = [Link](T**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> I == [Link]().prod()
True
>>> # needs [Link].function_field
>>> Oinf = F.maximal_order_infinite()
>>> f= Integer(1)/x
>>> I = [Link](f)
>>> [Link]()
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1/x^2*y + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2) *
(Ideal ((1/(x^4 + x^3 + x^2))*y^2 + 1) of Maximal infinite order
of Function field in y defined by y^3 + x^6 + x^4 + x^2)
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> I == [Link]().prod()
True
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
(continues on next page)
178 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> I == [Link]().prod()
True
gens_reduced()
Return reduced generators.
For now, this method just looks at the generators and sees if any can be removed without changing the ideal.
It prefers principal representations (a single generator) over all others, and otherwise picks the generator set
with the shortest print representation.
This method is provided so that ideals in function fields have the method gens_reduced(), just like ideals
of number fields. Sage linear algebra machinery sometimes requires this.
EXAMPLES:
sage: K.<x> = FunctionField(GF(7))
sage: O = K.equation_order()
sage: I = [Link](x, x^2, x^2 + x)
sage: I.gens_reduced()
(x,)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.equation_order()
>>> I = [Link](x, x**Integer(2), x**Integer(2) + x)
>>> I.gens_reduced()
(x,)
place()
Return the place associated with this prime ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x^2 + x + 1)
sage: [Link]()
Traceback (most recent call last):
...
TypeError: not a prime ideal
sage: I = [Link](x^3 + x + 1)
sage: [Link]()
Place (x^3 + x + 1)
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x + 1)/(x^3 + 1))
sage: p = [Link]()[0][0]
sage: [Link]()
Place (1/x)
sage: # needs [Link].function_field
(continues on next page)
179
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: K.<x> = FunctionField(GF(2)); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [[Link]() for f,_ in [Link]()]
[Place (x, (1/(x^3 + x^2 + x))*y^2),
Place (x^2 + x + 1, (1/(x^3 + x^2 + x))*y^2)]
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [[Link]() for f,_ in [Link]()]
[Place (x, x*y), Place (x + 1, x*y)]
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(3^2)); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](1/x)
sage: [Link]()
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4)^3
sage: J = [Link]()[0][0]
sage: J.is_prime()
True
sage: [Link]()
Place (1/x, 1/x^3*y^2)
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](1/x)
sage: [Link]()
(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x)^2
sage: J = [Link]()[0][0]
sage: J.is_prime()
True
sage: [Link]()
Place (1/x, 1/x*y)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) + x + Integer(1))
>>> [Link]()
Traceback (most recent call last):
...
TypeError: not a prime ideal
>>> I = [Link](x**Integer(3) + x + Integer(1))
>>> [Link]()
Place (x^3 + x + 1)
(continues on next page)
180 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x + Integer(1))/(x**Integer(3) + Integer(1)))
>>> p = [Link]()[Integer(0)][Integer(0)]
>>> [Link]()
Place (1/x)
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [[Link]() for f,_ in [Link]()]
[Place (x, (1/(x^3 + x^2 + x))*y^2),
Place (x^2 + x + 1, (1/(x^3 + x^2 + x))*y^2)]
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [[Link]() for f,_ in [Link]()]
[Place (x, x*y), Place (x + 1, x*y)]
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); R = PolynomialRing(K, names=( t ,)); (t,) = R._first_
˓→ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](Integer(1)/x)
>>> [Link]()
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4)^3
>>> J = [Link]()[Integer(0)][Integer(0)]
>>> J.is_prime()
True
>>> [Link]()
Place (1/x, 1/x^3*y^2)
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](Integer(1)/x)
>>> [Link]()
(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x)^2
(continues on next page)
181
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> J = [Link]()[Integer(0)][Integer(0)]
>>> J.is_prime()
True
>>> [Link]()
Place (1/x, 1/x*y)
ring()
Return the ring to which this ideal belongs.
EXAMPLES:
sage: K.<x> = FunctionField(GF(7))
sage: O = K.equation_order()
sage: I = [Link](x, x^2, x^2 + x)
sage: [Link]()
Maximal order of Rational function field in x over Finite Field of size 7
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.equation_order()
>>> I = [Link](x, x**Integer(2), x**Integer(2) + x)
>>> [Link]()
Maximal order of Rational function field in x over Finite Field of size 7
class [Link].function_field.[Link](ring)
Bases: FunctionFieldIdeal
Base class of ideals of maximal infinite orders
class [Link].function_field.ideal.FunctionFieldIdealInfinite_module(ring,
module)
Bases: FunctionFieldIdealInfinite, Ideal_generic
A fractional ideal specified by a finitely generated module over the integers of the base field.
INPUT:
• ring – order in a function field
• module – module
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: [Link](y)
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,)); (y,
˓→) = L._first_ngens(1)
>>> O = L.equation_order()
(continues on next page)
182 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link](y)
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
module()
Return the module over the maximal order of the base field that underlies this ideal.
The formation of the module is compatible with the vector space corresponding to the function field.
EXAMPLES:
sage: K.<x> = FunctionField(GF(7))
sage: O = K.maximal_order(); O
Maximal order of Rational function field in x over Finite Field of size 7
sage: K.polynomial_ring()
Univariate Polynomial Ring in x over
Rational function field in x over Finite Field of size 7
sage: I = [Link]([x^2 + 1, x*(x^2+1)])
sage: [Link]()
(x^2 + 1,)
sage: [Link]() #␣
˓→needs [Link]
Free module of degree 1 and rank 1 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[x^2 + 1]
sage: V, from_V, to_V = K.vector_space(); V #␣
˓→needs [Link]
Vector space of dimension 1 over
Rational function field in x over Finite Field of size 7
sage: [Link]().is_submodule(V) #␣
˓→needs [Link]
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order(); O
Maximal order of Rational function field in x over Finite Field of size 7
>>> K.polynomial_ring()
Univariate Polynomial Ring in x over
Rational function field in x over Finite Field of size 7
>>> I = [Link]([x**Integer(2) + Integer(1), x*(x**Integer(2)+Integer(1))])
>>> [Link]()
(x^2 + 1,)
>>> [Link]() #␣
˓→needs [Link]
Free module of degree 1 and rank 1 over
Maximal order of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[x^2 + 1]
>>> V, from_V, to_V = K.vector_space(); V #␣
˓→needs [Link]
Vector space of dimension 1 over
Rational function field in x over Finite Field of size 7
>>> [Link]().is_submodule(V) #␣
˓→needs [Link]
True
183
Algebraic Function Fields, Release 10.4
class [Link].function_field.ideal.FunctionFieldIdeal_module(ring, module)
Bases: FunctionFieldIdeal, Ideal_generic
A fractional ideal specified by a finitely generated module over the integers of the base field.
INPUT:
• ring – an order in a function field
• module – a module of the order
EXAMPLES:
An ideal in an extension of a rational function field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = [Link](y)
sage: I
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
sage: I^2
Ideal (x^3 + 1, (-x^3 - 1)*y) of Order in Function field in y defined by y^2 - x^
˓→3 - 1
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,)); (y,
˓→) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = [Link](y)
>>> I
Ideal (x^3 + 1, -y) of Order in Function field in y defined by y^2 - x^3 - 1
>>> I**Integer(2)
Ideal (x^3 + 1, (-x^3 - 1)*y) of Order in Function field in y defined by y^2 - x^
˓→3 - 1
gen(i)
Return the i-th generator in the current basis of this ideal.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = [Link](x^2 + 1)
sage: [Link](1)
(x^2 + 1)*y
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
(continues on next page)
184 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> O = L.equation_order()
>>> I = [Link](x**Integer(2) + Integer(1))
>>> [Link](Integer(1))
(x^2 + 1)*y
gens()
Return a set of generators of this ideal.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = [Link](x^2 + 1)
sage: [Link]()
(x^2 + 1, (x^2 + 1)*y)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = [Link](x**Integer(2) + Integer(1))
>>> [Link]()
(x^2 + 1, (x^2 + 1)*y)
intersection(other)
Return the intersection of this ideal and other.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = [Link](y^3); J = [Link](y^2)
sage: Z = [Link](J); Z
Ideal (x^6 + 2*x^3 + 1, (-x^3 - 1)*y) of Order in Function field in y defined␣
˓→by y^2 - x^3 - 1
sage: y^2 in Z
False
sage: y^3 in Z
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = [Link](y**Integer(3)); J = [Link](y**Integer(2))
>>> Z = [Link](J); Z
(continues on next page)
185
Algebraic Function Fields, Release 10.4
(continued from previous page)
Ideal (x^6 + 2*x^3 + 1, (-x^3 - 1)*y) of Order in Function field in y defined␣
˓→by y^2 - x^3 - 1
>>> y**Integer(2) in Z
False
>>> y**Integer(3) in Z
True
module()
Return the module over the maximal order of the base field that underlies this ideal.
The formation of the module is compatible with the vector space corresponding to the function field.
OUTPUT:
• a module over the maximal order of the base field of the ideal
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order(); O
Order in Function field in y defined by y^2 - x^3 - 1
sage: I = [Link](x^2 + 1)
sage: [Link]()
(x^2 + 1, (x^2 + 1)*y)
sage: [Link]()
Free module of degree 2 and rank 2 over Maximal order of Rational function␣
˓→field in x over Rational Field
Echelon basis matrix:
[x^2 + 1 0]
[ 0 x^2 + 1]
sage: V, from_V, to_V = L.vector_space(); V
Vector space of dimension 2 over Rational function field in x over Rational␣
˓→Field
sage: [Link]().is_submodule(V)
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order(); O
Order in Function field in y defined by y^2 - x^3 - 1
>>> I = [Link](x**Integer(2) + Integer(1))
>>> [Link]()
(x^2 + 1, (x^2 + 1)*y)
>>> [Link]()
Free module of degree 2 and rank 2 over Maximal order of Rational function␣
˓→field in x over Rational Field
Echelon basis matrix:
[x^2 + 1 0]
[ 0 x^2 + 1]
>>> V, from_V, to_V = L.vector_space(); V
Vector space of dimension 2 over Rational function field in x over Rational␣
(continues on next page)
186 Chapter 11. Ideals of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Field
˓→
>>> [Link]().is_submodule(V)
True
ngens()
Return the number of generators in the basis.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.equation_order()
sage: I = [Link](x^2 + 1)
sage: [Link]()
2
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.equation_order()
>>> I = [Link](x**Integer(2) + Integer(1))
>>> [Link]()
2
class [Link].function_field.[Link](R)
Bases: UniqueRepresentation, Parent
The monoid of ideals in orders of function fields.
INPUT:
• R – order
EXAMPLES:
sage: K.<x> = FunctionField(GF(2))
sage: O = K.maximal_order()
sage: M = O.ideal_monoid(); M
Monoid of ideals of Maximal order of Rational function field in x over Finite␣
˓→Field of size 2
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> M = O.ideal_monoid(); M
Monoid of ideals of Maximal order of Rational function field in x over Finite␣
˓→Field of size 2
ring()
Return the ring of which this is the ideal monoid.
EXAMPLES:
187
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(2))
sage: O = K.maximal_order()
sage: M = O.ideal_monoid(); [Link]() is O
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> M = O.ideal_monoid(); [Link]() is O
True
188 Chapter 11. Ideals of function fields
CHAPTER
TWELVE
IDEALS OF FUNCTION FIELDS: RATIONAL
class [Link].function_field.ideal_rational.FunctionFieldIdealInfinite_rational(ring,
gen)
Bases: FunctionFieldIdealInfinite
Fractional ideal of the maximal order of rational function field.
INPUT:
• ring – infinite maximal order
• gen – generator
Note that the infinite maximal order is a principal ideal domain.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: [Link](x)
Ideal (x) of Maximal infinite order of Rational function field in x over Finite␣
˓→Field of size 2
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> [Link](x)
Ideal (x) of Maximal infinite order of Rational function field in x over Finite␣
˓→Field of size 2
gen()
Return the generator of this principal ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x+1)/(x^3+x), (x^2+1)/x^4)
sage: [Link]()
1/x^2
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
(continues on next page)
189
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> I = [Link]((x+Integer(1))/(x**Integer(3)+x),␣
˓→(x**Integer(2)+Integer(1))/x**Integer(4))
>>> [Link]()
1/x^2
gens()
Return the generator of this principal ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x+1)/(x^3+x), (x^2+1)/x^4)
sage: [Link]()
(1/x^2,)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x+Integer(1))/(x**Integer(3)+x),␣
˓→(x**Integer(2)+Integer(1))/x**Integer(4))
>>> [Link]()
(1/x^2,)
gens_over_base()
Return the generator of this ideal as a rank one module over the infinite maximal order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link]((x+1)/(x^3+x), (x^2+1)/x^4)
sage: I.gens_over_base()
(1/x^2,)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link]((x+Integer(1))/(x**Integer(3)+x),␣
˓→(x**Integer(2)+Integer(1))/x**Integer(4))
>>> I.gens_over_base()
(1/x^2,)
is_prime()
Return True if this ideal is a prime ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2))
sage: Oinf = K.maximal_order_infinite()
sage: I = [Link](x/(x^2 + 1))
(continues on next page)
190 Chapter 12. Ideals of function fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: I.is_prime()
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> Oinf = K.maximal_order_infinite()
>>> I = [Link](x/(x**Integer(2) + Integer(1)))
>>> I.is_prime()
True
valuation(ideal)
Return the valuation of ideal at this prime ideal.
INPUT:
• ideal – fractional ideal
EXAMPLES:
sage: F.<x> = FunctionField(QQ)
sage: O = F.maximal_order_infinite()
sage: p = [Link](1/x)
sage: [Link]([Link](x/(x+1)))
0
sage: [Link]([Link](0))
+Infinity
>>> from [Link] import *
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> O = F.maximal_order_infinite()
>>> p = [Link](Integer(1)/x)
>>> [Link]([Link](x/(x+Integer(1))))
0
>>> [Link]([Link](Integer(0)))
+Infinity
class [Link].function_field.ideal_rational.FunctionFieldIdeal_rational(ring,
gen)
Bases: FunctionFieldIdeal
Fractional ideals of the maximal order of a rational function field.
INPUT:
• ring – the maximal order of the rational function field.
• gen – generator of the ideal, an element of the function field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link](1/(x^2+x)); I
Ideal (1/(x^2 + x)) of Maximal order of Rational function field in x over␣
˓→Rational Field
191
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](Integer(1)/(x**Integer(2)+x)); I
Ideal (1/(x^2 + x)) of Maximal order of Rational function field in x over␣
˓→Rational Field
denominator()
Return the denominator of this fractional ideal.
EXAMPLES:
sage: F.<x> = FunctionField(QQ)
sage: O = F.maximal_order()
sage: I = [Link](x/(x^2+1))
sage: [Link]()
x^2 + 1
>>> from [Link] import *
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x/(x**Integer(2)+Integer(1)))
>>> [Link]()
x^2 + 1
gen()
Return the unique generator of this ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x^2 + x)
sage: [Link]()
x^2 + x
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) + x)
>>> [Link]()
x^2 + x
gens()
Return the tuple of the unique generator of this ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x^2 + x)
sage: [Link]()
(x^2 + x,)
192 Chapter 12. Ideals of function fields: rational
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) + x)
>>> [Link]()
(x^2 + x,)
gens_over_base()
Return the generator of this ideal as a rank one module over the maximal order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4))
sage: O = K.maximal_order()
sage: I = [Link](x^2 + x)
sage: I.gens_over_base()
(x^2 + x,)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(2) + x)
>>> I.gens_over_base()
(x^2 + x,)
is_prime()
Return True if this is a prime ideal.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link](x^3 + x^2)
sage: [f.is_prime() for f,m in [Link]()] #␣
˓→needs [Link]
[True, True]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(3) + x**Integer(2))
>>> [f.is_prime() for f,m in [Link]()] #␣
˓→needs [Link]
[True, True]
module()
Return the module, that is the ideal viewed as a module over the ring.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: O = K.maximal_order()
sage: I = [Link](x^3 + x^2)
(continues on next page)
193
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: [Link]() ␣
˓→ # needs [Link]
Free module of degree 1 and rank 1 over Maximal order of Rational
function field in x over Rational Field
Echelon basis matrix:
[x^3 + x^2]
sage: J = 0*I
sage: [Link]() ␣
˓→ # needs [Link]
Free module of degree 1 and rank 0 over Maximal order of Rational
function field in x over Rational Field
Echelon basis matrix:
[]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> O = K.maximal_order()
>>> I = [Link](x**Integer(3) + x**Integer(2))
>>> [Link]() ␣
˓→ # needs [Link]
Free module of degree 1 and rank 1 over Maximal order of Rational
function field in x over Rational Field
Echelon basis matrix:
[x^3 + x^2]
>>> J = Integer(0)*I
>>> [Link]() ␣
˓→ # needs [Link]
Free module of degree 1 and rank 0 over Maximal order of Rational
function field in x over Rational Field
Echelon basis matrix:
[]
valuation(ideal)
Return the valuation of the ideal at this prime ideal.
INPUT:
• ideal – fractional ideal
EXAMPLES:
sage: F.<x> = FunctionField(QQ)
sage: O = F.maximal_order()
sage: I = [Link](x^2*(x^2+x+1)^3)
sage: [[Link](I) for f,_ in [Link]()] #␣
˓→needs [Link]
[2, 3]
>>> from [Link] import *
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(3))
>>> [[Link](I) for f,_ in [Link]()] #␣
˓→needs [Link]
[2, 3]
194 Chapter 12. Ideals of function fields: rational
CHAPTER
THIRTEEN
IDEALS OF FUNCTION FIELDS: EXTENSION
class [Link].function_field.ideal_polymod.FunctionFieldIdealInfinite_polymod(ring,
ideal)
Bases: FunctionFieldIdealInfinite
Ideals of the infinite maximal order of an algebraic function field.
INPUT:
• ring – infinite maximal order of the function field
• ideal – ideal in the inverted function field
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: [Link](1/y)
Ideal (1/x^4*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._first_
˓→ngens(1); R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,));␣
˓→(y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> [Link](Integer(1)/y)
Ideal (1/x^4*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4
gens()
Return a set of generators of this ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](x + y)
sage: [Link]()
(x, y, 1/x^2*y^2)
(continues on next page)
195
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](x + y)
sage: [Link]()
(x, y)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); R = PolynomialRing(K, names=( t ,)); (t,) = R._first_
˓→ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](x + y)
>>> [Link]()
(x, y, 1/x^2*y^2)
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](x + y)
>>> [Link]()
(x, y)
gens_over_base()
Return a set of generators of this ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](x + y)
sage: I.gens_over_base()
(x, y, 1/x^2*y^2)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](x + y)
>>> I.gens_over_base()
(x, y, 1/x^2*y^2)
gens_two()
196 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
Return a set of at most two generators of this ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](x + y)
sage: I.gens_two()
(x, y)
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](x + y)
sage: I.gens_two()
(x,)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); R = PolynomialRing(K, names=( t ,)); (t,) = R._first_
˓→ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](x + y)
>>> I.gens_two()
(x, y)
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](x + y)
>>> I.gens_two()
(x,)
ideal_below()
Return a set of generators of this ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](1/y^2)
sage: I.ideal_below()
Ideal (x^3) of Maximal order of Rational function field
in x over Finite Field in z2 of size 3^2
>>> from [Link] import *
>>> # needs [Link].finite_rings
(continues on next page)
197
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](Integer(1)/y**Integer(2))
>>> I.ideal_below()
Ideal (x^3) of Maximal order of Rational function field
in x over Finite Field in z2 of size 3^2
is_prime()
Return True if this ideal is a prime ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](1/x)
sage: [Link]()
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4)^3
sage: I.is_prime()
False
sage: J = [Link]()[0][0]
sage: J.is_prime()
True
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](1/x)
sage: [Link]()
(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x)^2
sage: I.is_prime()
False
sage: J = [Link]()[0][0]
sage: J.is_prime()
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); _ = PolynomialRing(K, names=( t ,)); (t,) = _._first_
˓→ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](Integer(1)/x)
>>> [Link]()
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4)^3
>>> I.is_prime()
(continues on next page)
198 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
False
>>> J = [Link]()[Integer(0)][Integer(0)]
>>> J.is_prime()
True
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](Integer(1)/x)
>>> [Link]()
(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x)^2
>>> I.is_prime()
False
>>> J = [Link]()[Integer(0)][Integer(0)]
>>> J.is_prime()
True
prime_below()
Return the prime of the base order that underlies this prime ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(3^2)); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 + t^2 - x^4)
sage: Oinf = F.maximal_order_infinite()
sage: I = [Link](1/x)
sage: [Link]()
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4)^3
sage: J = [Link]()[0][0]
sage: J.is_prime()
True
sage: J.prime_below()
Ideal (1/x) of Maximal infinite order of Rational function field
in x over Finite Field in z2 of size 3^2
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](1/x)
sage: [Link]()
(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x)^2
sage: J = [Link]()[0][0]
sage: J.is_prime()
True
sage: J.prime_below()
Ideal (1/x) of Maximal infinite order of Rational function field in x
over Finite Field of size 2
199
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(3)**Integer(2)), names=( x ,)); (x,) = K._
˓→first_ngens(1); _ = PolynomialRing(K, names=( t ,)); (t,) = _._first_
˓→ngens(1)
>>> F = [Link](t**Integer(3) + t**Integer(2) - x**Integer(4), names=( y ,
˓→)); (y,) = F._first_ngens(1)
>>> Oinf = F.maximal_order_infinite()
>>> I = [Link](Integer(1)/x)
>>> [Link]()
(Ideal (1/x^3*y^2) of Maximal infinite order of Function field
in y defined by y^3 + y^2 + 2*x^4)^3
>>> J = [Link]()[Integer(0)][Integer(0)]
>>> J.is_prime()
True
>>> J.prime_below()
Ideal (1/x) of Maximal infinite order of Rational function field
in x over Finite Field in z2 of size 3^2
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](Integer(1)/x)
>>> [Link]()
(Ideal (1/x*y) of Maximal infinite order of Function field in y
defined by y^2 + y + (x^2 + 1)/x)^2
>>> J = [Link]()[Integer(0)][Integer(0)]
>>> J.is_prime()
True
>>> J.prime_below()
Ideal (1/x) of Maximal infinite order of Rational function field in x
over Finite Field of size 2
valuation(ideal)
Return the valuation of ideal with respect to this prime ideal.
INPUT:
• ideal – fractional ideal
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: Oinf = L.maximal_order_infinite()
sage: I = [Link](y)
sage: [[Link](I) for f,_ in [Link]()]
[-1]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
(continues on next page)
200 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
= L._first_ngens(1)
˓→
>>> Oinf = L.maximal_order_infinite()
>>> I = [Link](y)
>>> [[Link](I) for f,_ in [Link]()]
[-1]
class [Link].function_field.ideal_polymod.FunctionFieldIdeal_global(ring, hnf,
denomi-
na-
tor=1)
Bases: FunctionFieldIdeal_polymod
Fractional ideals of canonical function fields
INPUT:
• ring – order in a function field
• hnf – matrix in hermite normal form
• denominator – denominator
The rows of hnf is a basis of the ideal, which itself is denominator times the fractional ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3*y - x)
sage: O = L.maximal_order()
sage: [Link](y)
Ideal (y) of Maximal order of Function field in y defined by y^2 + x^3*y + x
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3)*y - x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> O = L.maximal_order()
>>> [Link](y)
Ideal (y) of Maximal order of Function field in y defined by y^2 + x^3*y + x
gens()
Return a set of generators of this ideal.
This provides whatever set of generators as quickly as possible.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 - x^3*Y - x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: [Link]()
(x^4 + x^2 + x, y + x)
(continues on next page)
201
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: # needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: [Link]()
(x^3 + 1, y + x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x**Integer(3)*Y - x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> [Link]()
(x^4 + x^2 + x, y + x)
>>> # needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> [Link]()
(x^3 + 1, y + x)
gens_two()
Return two generators of this fractional ideal.
If the ideal is principal, one generator may be returned.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: I # indirect doctest
Ideal (y) of Maximal order of Function field
in y defined by y^3 + x^6 + x^4 + x^2
sage: ~I # indirect doctest
Ideal ((1/(x^6 + x^4 + x^2))*y^2) of Maximal order of Function field
in y defined by y^3 + x^6 + x^4 + x^2
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: I # indirect doctest
Ideal (y) of Maximal order of Function field in y
defined by y^2 + y + (x^2 + 1)/x
sage: ~I # indirect doctest
Ideal ((x/(x^2 + 1))*y + x/(x^2 + 1)) of Maximal order
of Function field in y defined by y^2 + y + (x^2 + 1)/x
202 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> I # indirect doctest
Ideal (y) of Maximal order of Function field
in y defined by y^3 + x^6 + x^4 + x^2
>>> ~I # indirect doctest
Ideal ((1/(x^6 + x^4 + x^2))*y^2) of Maximal order of Function field
in y defined by y^3 + x^6 + x^4 + x^2
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> I # indirect doctest
Ideal (y) of Maximal order of Function field in y
defined by y^2 + y + (x^2 + 1)/x
>>> ~I # indirect doctest
Ideal ((x/(x^2 + 1))*y + x/(x^2 + 1)) of Maximal order
of Function field in y defined by y^2 + y + (x^2 + 1)/x
class [Link].function_field.ideal_polymod.FunctionFieldIdeal_polymod(ring,
hnf,
denom-
ina-
tor=1)
Bases: FunctionFieldIdeal
Fractional ideals of algebraic function fields
INPUT:
• ring – order in a function field
• hnf – matrix in hermite normal form
• denominator – denominator
The rows of hnf is a basis of the ideal, which itself is denominator times the fractional ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3*y - x)
sage: O = L.maximal_order()
sage: [Link](y)
Ideal (y) of Maximal order of Function field in y defined by y^2 + x^3*y + x
>>> from [Link] import *
>>> # needs [Link].finite_rings
(continues on next page)
203
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3)*y - x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> O = L.maximal_order()
>>> [Link](y)
Ideal (y) of Maximal order of Function field in y defined by y^2 + x^3*y + x
basis_matrix()
Return the matrix of basis vectors of this ideal as a module.
The basis matrix is by definition the hermite norm form of the ideal divided by the denominator.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); R.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](x, 1/y)
sage: [Link]() * I.basis_matrix() == [Link]()
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = PolynomialRing(K, names=( t ,)); (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> [Link]() * I.basis_matrix() == [Link]()
True
denominator()
Return the denominator of this fractional ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.maximal_order()
sage: I = [Link](y/(y+1))
sage: d = [Link](); d
x^3
sage: d in O
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
(continues on next page)
204 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> O = L.maximal_order()
>>> I = [Link](y/(y+Integer(1)))
>>> d = [Link](); d
x^3
>>> d in O
True
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.maximal_order()
sage: I = [Link](y/(y+1))
sage: d = [Link](); d
x^3
sage: d in O
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y/(y+Integer(1)))
>>> d = [Link](); d
x^3
>>> d in O
True
gens()
Return a set of generators of this ideal.
This provides whatever set of generators as quickly as possible.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 - x^3*Y - x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: [Link]()
(x^4 + x^2 + x, y + x)
sage: # needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: [Link]()
(x^3 + 1, y + x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x**Integer(3)*Y - x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
(continues on next page)
205
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> [Link]()
(x^4 + x^2 + x, y + x)
>>> # needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> [Link]()
(x^3 + 1, y + x)
gens_over_base()
Return the generators of this ideal as a module over the maximal order of the base rational function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 - x^3*Y - x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: I.gens_over_base()
(x^4 + x^2 + x, y + x)
sage: # needs [Link].finite_rings
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: I.gens_over_base()
(x^3 + 1, y + x)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x**Integer(3)*Y - x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> I.gens_over_base()
(x^4 + x^2 + x, y + x)
>>> # needs [Link].finite_rings
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> I.gens_over_base()
(x^3 + 1, y + x)
hnf()
Return the matrix in hermite normal form representing this ideal.
See also denominator()
EXAMPLES:
206 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.maximal_order()
sage: I = [Link](y*(y+1)); [Link]()
[x^6 + x^3 0]
[ x^3 + 1 1]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y*(y+Integer(1))); [Link]()
[x^6 + x^3 0]
[ x^3 + 1 1]
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x^3 - 1)
sage: O = L.maximal_order()
sage: I = [Link](y*(y+1)); [Link]()
[x^6 + x^3 0]
[ x^3 + 1 1]
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y*(y+Integer(1))); [Link]()
[x^6 + x^3 0]
[ x^3 + 1 1]
ideal_below()
Return the ideal below this ideal.
This is defined only for integral ideals.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](x, 1/y)
sage: I.ideal_below()
Traceback (most recent call last):
...
TypeError: not an integral ideal
sage: J = [Link]() * I
sage: J.ideal_below()
Ideal (x^3 + x^2 + x) of Maximal order of Rational function field
in x over Finite Field of size 2
(continues on next page)
207
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](x, 1/y)
sage: I.ideal_below()
Traceback (most recent call last):
...
TypeError: not an integral ideal
sage: J = [Link]() * I
sage: J.ideal_below()
Ideal (x^3 + x) of Maximal order of Rational function field
in x over Finite Field of size 2
sage: K.<x> = FunctionField(QQ); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](x, 1/y)
sage: I.ideal_below()
Traceback (most recent call last):
...
TypeError: not an integral ideal
sage: J = [Link]() * I
sage: J.ideal_below()
Ideal (x^3 + x^2 + x) of Maximal order of Rational function field
in x over Rational Field
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> I.ideal_below()
Traceback (most recent call last):
...
TypeError: not an integral ideal
>>> J = [Link]() * I
>>> J.ideal_below()
Ideal (x^3 + x^2 + x) of Maximal order of Rational function field
in x over Finite Field of size 2
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> I.ideal_below()
Traceback (most recent call last):
...
TypeError: not an integral ideal
(continues on next page)
208 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> J = [Link]() * I
>>> J.ideal_below()
Ideal (x^3 + x) of Maximal order of Rational function field
in x over Finite Field of size 2
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ t ];
˓→ (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> I.ideal_below()
Traceback (most recent call last):
...
TypeError: not an integral ideal
>>> J = [Link]() * I
>>> J.ideal_below()
Ideal (x^3 + x^2 + x) of Maximal order of Rational function field
in x over Rational Field
intersect(other)
Intersect this ideal with the other ideal as fractional ideals.
INPUT:
• other – ideal
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 - x^3*Y - x)
sage: O = L.maximal_order()
sage: I = [Link](x + y)
sage: J = [Link](x)
sage: [Link](J) == I * J * (I + J)^-1
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) - x**Integer(3)*Y - x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x + y)
>>> J = [Link](x)
>>> [Link](J) == I * J * (I + J)**-Integer(1)
True
is_integral()
Return True if this is an integral ideal.
EXAMPLES:
209
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](x, 1/y)
sage: I.is_integral()
False
sage: J = [Link]() * I
sage: J.is_integral()
True
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](x, 1/y)
sage: I.is_integral()
False
sage: J = [Link]() * I
sage: J.is_integral()
True
sage: K.<x> = FunctionField(QQ); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](x, 1/y)
sage: I.is_integral()
False
sage: J = [Link]() * I
sage: J.is_integral()
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> I.is_integral()
False
>>> J = [Link]() * I
>>> J.is_integral()
True
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> I.is_integral()
False
>>> J = [Link]() * I
(continues on next page)
210 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> J.is_integral()
True
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ =␣
˓→PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> I.is_integral()
False
>>> J = [Link]() * I
>>> J.is_integral()
True
is_prime()
Return True if this ideal is a prime ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [f.is_prime() for f,_ in [Link]()]
[True, True]
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [f.is_prime() for f,_ in [Link]()]
[True, True]
sage: K.<x> = FunctionField(QQ); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [f.is_prime() for f,_ in [Link]()]
[True, True]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [f.is_prime() for f,_ in [Link]()]
[True, True]
(continues on next page)
211
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [f.is_prime() for f,_ in [Link]()]
[True, True]
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ =␣
˓→PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [f.is_prime() for f,_ in [Link]()]
[True, True]
module()
Return the module, that is the ideal viewed as a module over the base maximal order.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: F.<y> = [Link](y^2 - x^3 - 1)
sage: O = F.maximal_order()
sage: I = [Link](x, 1/y)
sage: [Link]()
Free module of degree 2 and rank 2 over Maximal order
of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[ 1 0]
[ 0 1/(x^3 + 1)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ y ]; (y,) = R._first_ngens(1)
>>> F = [Link](y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, Integer(1)/y)
>>> [Link]()
Free module of degree 2 and rank 2 over Maximal order
of Rational function field in x over Finite Field of size 7
Echelon basis matrix:
[ 1 0]
[ 0 1/(x^3 + 1)]
norm()
Return the norm of this fractional ideal.
EXAMPLES:
212 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = PolynomialRing(K)
sage: F.<y> = [Link](t^3 - x^2*(x^2+x+1)^2)
sage: O = F.maximal_order()
sage: i1 = [Link](x)
sage: i2 = [Link](y)
sage: i3 = i1 * i2
sage: [Link]() == [Link]() * [Link]()
True
sage: [Link]()
x^3
sage: [Link]() == x ** [Link]()
True
sage: [Link]()
x^6 + x^4 + x^2
sage: [Link]() == [Link]()
True
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: i1 = [Link](x)
sage: i2 = [Link](y)
sage: i3 = i1 * i2
sage: [Link]() == [Link]() * [Link]()
True
sage: [Link]()
x^2
sage: [Link]() == x ** [Link]()
True
sage: [Link]()
(x^2 + 1)/x
sage: [Link]() == [Link]()
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = PolynomialRing(K, names=( t ,)); (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) -␣
˓→x**Integer(2)*(x**Integer(2)+x+Integer(1))**Integer(2), names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> O = F.maximal_order()
>>> i1 = [Link](x)
>>> i2 = [Link](y)
>>> i3 = i1 * i2
>>> [Link]() == [Link]() * [Link]()
True
>>> [Link]()
x^3
>>> [Link]() == x ** [Link]()
True
>>> [Link]()
x^6 + x^4 + x^2
>>> [Link]() == [Link]()
True
(continues on next page)
213
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> i1 = [Link](x)
>>> i2 = [Link](y)
>>> i3 = i1 * i2
>>> [Link]() == [Link]() * [Link]()
True
>>> [Link]()
x^2
>>> [Link]() == x ** [Link]()
True
>>> [Link]()
(x^2 + 1)/x
>>> [Link]() == [Link]()
True
prime_below()
Return the prime lying below this prime ideal.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [f.prime_below() for f,_ in [Link]()]
[Ideal (x) of Maximal order of Rational function field in x
over Finite Field of size 2, Ideal (x^2 + x + 1) of Maximal order
of Rational function field in x over Finite Field of size 2]
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [f.prime_below() for f,_ in [Link]()]
[Ideal (x) of Maximal order of Rational function field in x over Finite Field␣
˓→of size 2,
Ideal (x + 1) of Maximal order of Rational function field in x over Finite␣
˓→Field of size 2]
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](y)
sage: [f.prime_below() for f,_ in [Link]()]
[Ideal (x) of Maximal order of Rational function field in x over Rational␣
˓→Field,
Ideal (x^2 + x + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field]
214 Chapter 13. Ideals of function fields: extension
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [f.prime_below() for f,_ in [Link]()]
[Ideal (x) of Maximal order of Rational function field in x
over Finite Field of size 2, Ideal (x^2 + x + 1) of Maximal order
of Rational function field in x over Finite Field of size 2]
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [f.prime_below() for f,_ in [Link]()]
[Ideal (x) of Maximal order of Rational function field in x over Finite Field␣
˓→of size 2,
Ideal (x + 1) of Maximal order of Rational function field in x over Finite␣
˓→Field of size 2]
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ];
˓→ (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](y)
>>> [f.prime_below() for f,_ in [Link]()]
[Ideal (x) of Maximal order of Rational function field in x over Rational␣
˓→Field,
Ideal (x^2 + x + 1) of Maximal order of Rational function field in x over␣
˓→Rational Field]
valuation(ideal)
Return the valuation of ideal at this prime ideal.
INPUT:
• ideal – fractional ideal
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: O = F.maximal_order()
sage: I = [Link](x, (1/(x^3 + x^2 + x))*y^2)
sage: I.is_prime()
True
sage: J = [Link](y)
sage: [Link](J)
2
(continues on next page)
215
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: O = L.maximal_order()
sage: I = [Link](y)
sage: [[Link](I) for f,_ in [Link]()]
[-1, 2]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ t ]; (t,) = _._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x, (Integer(1)/(x**Integer(3) + x**Integer(2) +␣
˓→x))*y**Integer(2))
>>> I.is_prime()
True
>>> J = [Link](y)
>>> [Link](J)
2
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> I = [Link](y)
>>> [[Link](I) for f,_ in [Link]()]
[-1, 2]
The method closely follows Algorithm 4.8.17 of [Coh1993].
216 Chapter 13. Ideals of function fields: extension
CHAPTER
FOURTEEN
PLACES OF FUNCTION FIELDS
The places of a function field correspond, one-to-one, to valuation rings of the function field, each of which defines a
discrete valuation for the elements of the function field. “Finite” places are in one-to-one correspondence with the prime
ideals of the finite maximal order while places “at infinity” are in one-to-one correspondence with the prime ideals of the
infinite maximal order.
EXAMPLES:
All rational places of a function field can be computed:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
[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)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
[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)]
The residue field associated with a place is given as an extension of the constant field:
sage: F.<x> = FunctionField(GF(2))
sage: O = F.maximal_order()
sage: p = [Link](x^2 + x + 1).place() #␣
˓→needs [Link]
sage: k, fr_k, to_k = p.residue_field() #␣
˓→needs [Link] [Link].function_field
sage: k #␣
˓→needs [Link] [Link].function_field
Finite Field in z2 of size 2^2
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> O = F.maximal_order()
(continues on next page)
217
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> p = [Link](x**Integer(2) + x + Integer(1)).place() ␣
˓→ # needs [Link]
>>> k, fr_k, to_k = p.residue_field() #␣
˓→needs [Link] [Link].function_field
>>> k #␣
˓→needs [Link] [Link].function_field
Finite Field in z2 of size 2^2
The homomorphisms are between the valuation ring and the residue field:
sage: fr_k #␣
˓→needs [Link] [Link].function_field
Ring morphism:
From: Finite Field in z2 of size 2^2
To: Valuation ring at Place (x^2 + x + 1)
sage: to_k #␣
˓→needs [Link] [Link].function_field
Ring morphism:
From: Valuation ring at Place (x^2 + x + 1)
To: Finite Field in z2 of size 2^2
>>> from [Link] import *
>>> fr_k #␣
˓→needs [Link] [Link].function_field
Ring morphism:
From: Finite Field in z2 of size 2^2
To: Valuation ring at Place (x^2 + x + 1)
>>> to_k #␣
˓→needs [Link] [Link].function_field
Ring morphism:
From: Valuation ring at Place (x^2 + x + 1)
To: Finite Field in z2 of size 2^2
AUTHORS:
• Kwankyu Lee (2017-04-30): initial version
• Brent Baccala (2019-12-20): function fields of characteristic zero
class [Link].function_field.[Link](parent, prime)
Bases: Element
Places of function fields.
INPUT:
• parent – place set of a function field
• prime – prime ideal associated with the place
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: L.places_finite()[0] #␣
˓→needs [Link].function_field
Place (x, y)
218 Chapter 14. Places of function fields
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> L.places_finite()[Integer(0)] ␣
˓→ # needs [Link].function_field
Place (x, y)
divisor(multiplicity=1)
Return the prime divisor corresponding to the place.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(5)); R.<Y> = PolynomialRing(K)
sage: F.<y> = [Link](Y^2 - x^3 - 1)
sage: O = F.maximal_order()
sage: I = [Link](x + 1, y)
sage: P = [Link]()
sage: [Link]()
Place (x + 1, y)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = PolynomialRing(K, names=( Y ,)); (Y,) = R._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x + Integer(1), y)
>>> P = [Link]()
>>> [Link]()
Place (x + 1, y)
function_field()
Return the function field to which the place belongs.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x) #␣
˓→needs [Link].function_field
sage: p = [Link]()[0] #␣
˓→needs [Link].function_field
sage: p.function_field() == L #␣
˓→needs [Link].function_field
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> p = [Link]()[Integer(0)] ␣
˓→ # needs [Link].function_field
>>> p.function_field() == L #␣
(continues on next page)
219
Algebraic Function Fields, Release 10.4
(continued from previous page)
needs [Link].function_field
˓→
True
prime_ideal()
Return the prime ideal associated with the place.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x) #␣
˓→needs [Link].function_field
sage: p = [Link]()[0] #␣
˓→needs [Link].function_field
sage: p.prime_ideal() #␣
˓→needs [Link].function_field
Ideal (1/x^3*y^2 + 1/x) of Maximal infinite order of Function field
in y defined by y^3 + x^3*y + x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> p = [Link]()[Integer(0)] ␣
˓→ # needs [Link].function_field
>>> p.prime_ideal() #␣
˓→needs [Link].function_field
Ideal (1/x^3*y^2 + 1/x) of Maximal infinite order of Function field
in y defined by y^3 + x^3*y + x
class [Link].function_field.[Link](field)
Bases: UniqueRepresentation, Parent
Sets of Places of function fields.
INPUT:
• field – function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x) #␣
˓→needs [Link].function_field
sage: L.place_set() #␣
˓→needs [Link].function_field
Set of places of Function field in y defined by y^3 + x^3*y + x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> L.place_set() #␣
˓→needs [Link].function_field
Set of places of Function field in y defined by y^3 + x^3*y + x
220 Chapter 14. Places of function fields
Algebraic Function Fields, Release 10.4
Element
alias of FunctionFieldPlace
function_field()
Return the function field to which this place set belongs.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: PS = L.place_set()
sage: PS.function_field() == L
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> PS = L.place_set()
>>> PS.function_field() == L
True
221
Algebraic Function Fields, Release 10.4
222 Chapter 14. Places of function fields
CHAPTER
FIFTEEN
PLACES OF FUNCTION FIELDS: RATIONAL
class [Link].function_field.place_rational.FunctionFieldPlace_rational(par-
ent,
prime)
Bases: FunctionFieldPlace
Places of rational function fields.
degree()
Return the degree of the place.
EXAMPLES:
sage: F.<x> = FunctionField(GF(2))
sage: O = F.maximal_order()
sage: i = [Link](x^2 + x + 1)
sage: p = [Link]()
sage: [Link]()
2
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> i = [Link](x**Integer(2) + x + Integer(1))
>>> p = [Link]()
>>> [Link]()
2
is_infinite_place()
Return True if the place is at infinite.
EXAMPLES:
sage: F.<x> = FunctionField(GF(2))
sage: [Link]()
[Place (1/x), Place (x), Place (x + 1)]
sage: [p.is_infinite_place() for p in [Link]()]
[True, False, False]
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> [Link]()
[Place (1/x), Place (x), Place (x + 1)]
>>> [p.is_infinite_place() for p in [Link]()]
[True, False, False]
223
Algebraic Function Fields, Release 10.4
local_uniformizer()
Return a local uniformizer of the place.
EXAMPLES:
sage: F.<x> = FunctionField(GF(2))
sage: [Link]()
[Place (1/x), Place (x), Place (x + 1)]
sage: [p.local_uniformizer() for p in [Link]()]
[1/x, x, x + 1]
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> [Link]()
[Place (1/x), Place (x), Place (x + 1)]
>>> [p.local_uniformizer() for p in [Link]()]
[1/x, x, x + 1]
residue_field(name=None)
Return the residue field of the place.
EXAMPLES:
sage: F.<x> = FunctionField(GF(2))
sage: O = F.maximal_order()
sage: p = [Link](x^2 + x + 1).place()
sage: k, fr_k, to_k = p.residue_field() #␣
˓→needs [Link].function_field
sage: k #␣
˓→needs [Link].function_field
Finite Field in z2 of size 2^2
sage: fr_k #␣
˓→needs [Link].function_field
Ring morphism:
From: Finite Field in z2 of size 2^2
To: Valuation ring at Place (x^2 + x + 1)
sage: to_k #␣
˓→needs [Link].function_field
Ring morphism:
From: Valuation ring at Place (x^2 + x + 1)
To: Finite Field in z2 of size 2^2
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> p = [Link](x**Integer(2) + x + Integer(1)).place()
>>> k, fr_k, to_k = p.residue_field() #␣
˓→needs [Link].function_field
>>> k #␣
˓→needs [Link].function_field
Finite Field in z2 of size 2^2
>>> fr_k #␣
˓→needs [Link].function_field
Ring morphism:
From: Finite Field in z2 of size 2^2
To: Valuation ring at Place (x^2 + x + 1)
>>> to_k #␣
(continues on next page)
224 Chapter 15. Places of function fields: rational
Algebraic Function Fields, Release 10.4
(continued from previous page)
needs [Link].function_field
˓→
Ring morphism:
From: Valuation ring at Place (x^2 + x + 1)
To: Finite Field in z2 of size 2^2
valuation_ring()
Return the valuation ring at the place.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x) #␣
˓→needs [Link].function_field
sage: p = L.places_finite()[0] #␣
˓→needs [Link].function_field
sage: p.valuation_ring() #␣
˓→needs [Link].function_field
Valuation ring at Place (x, x*y)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> p = L.places_finite()[Integer(0)] ␣
˓→ # needs [Link].function_field
>>> p.valuation_ring() #␣
˓→needs [Link].function_field
Valuation ring at Place (x, x*y)
225
Algebraic Function Fields, Release 10.4
226 Chapter 15. Places of function fields: rational
CHAPTER
SIXTEEN
PLACES OF FUNCTION FIELDS: EXTENSION
class [Link].function_field.place_polymod.FunctionFieldPlace_polymod(parent,
prime)
Bases: FunctionFieldPlace
Places of extensions of function fields.
degree()
Return the degree of the place.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: OK = K.maximal_order()
sage: OL = L.maximal_order()
sage: p = [Link](x^2 + x + 1)
sage: dec = [Link](p)
sage: q = dec[0][0].place()
sage: [Link]()
2
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> OK = K.maximal_order()
>>> OL = L.maximal_order()
>>> p = [Link](x**Integer(2) + x + Integer(1))
>>> dec = [Link](p)
>>> q = dec[Integer(0)][Integer(0)].place()
>>> [Link]()
2
gaps()
Return the gap sequence for the place.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
(continues on next page)
227
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: O = L.maximal_order()
sage: p = [Link](x,y).place()
sage: [Link]() # a Weierstrass place
[1, 2, 4]
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 + x^3 * Y + x) #␣
˓→needs [Link].finite_rings
sage: [[Link]() for p in [Link]()] #␣
˓→needs [Link].finite_rings
[[1, 2, 4], [1, 2, 4], [1, 2, 4]]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> O = L.maximal_order()
>>> p = [Link](x,y).place()
>>> [Link]() # a Weierstrass place
[1, 2, 4]
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) + x**Integer(3) * Y + x, names=( y ,)); (y,
˓→) = L._first_ngens(1)# needs [Link].finite_rings
>>> [[Link]() for p in [Link]()] #␣
˓→needs [Link].finite_rings
[[1, 2, 4], [1, 2, 4], [1, 2, 4]]
is_infinite_place()
Return True if the place is above the unique infinite place of the underlying rational function field.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: pls = [Link]()
sage: [p.is_infinite_place() for p in pls]
[True, True, False]
sage: [p.place_below() for p in pls]
[Place (1/x), Place (1/x), Place (x)]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> pls = [Link]()
>>> [p.is_infinite_place() for p in pls]
[True, True, False]
>>> [p.place_below() for p in pls]
(continues on next page)
228 Chapter 16. Places of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
[Place (1/x), Place (1/x), Place (x)]
local_uniformizer()
Return an element of the function field that has a simple zero at the place.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: pls = [Link]()
sage: [p.local_uniformizer().valuation(p) for p in pls]
[1, 1, 1, 1, 1]
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> pls = [Link]()
>>> [p.local_uniformizer().valuation(p) for p in pls]
[1, 1, 1, 1, 1]
place_below()
Return the place lying below the place.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: OK = K.maximal_order()
sage: OL = L.maximal_order()
sage: p = [Link](x^2 + x + 1)
sage: dec = [Link](p)
sage: q = dec[0][0].place()
sage: q.place_below()
Place (x^2 + x + 1)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> OK = K.maximal_order()
>>> OL = L.maximal_order()
>>> p = [Link](x**Integer(2) + x + Integer(1))
>>> dec = [Link](p)
>>> q = dec[Integer(0)][Integer(0)].place()
>>> q.place_below()
Place (x^2 + x + 1)
relative_degree()
Return the relative degree of the place.
229
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: OK = K.maximal_order()
sage: OL = L.maximal_order()
sage: p = [Link](x^2 + x + 1)
sage: dec = [Link](p)
sage: q = dec[0][0].place()
sage: q.relative_degree()
1
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> OK = K.maximal_order()
>>> OL = L.maximal_order()
>>> p = [Link](x**Integer(2) + x + Integer(1))
>>> dec = [Link](p)
>>> q = dec[Integer(0)][Integer(0)].place()
>>> q.relative_degree()
1
residue_field(name=None)
Return the residue field of the place.
INPUT:
• name – string; name of the generator of the residue field
OUTPUT:
• a field isomorphic to the residue field
• a ring homomorphism from the valuation ring to the field
• a ring homomorphism from the field to the valuation ring
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: k, fr_k, to_k = p.residue_field()
sage: k
Finite Field of size 2
sage: fr_k
Ring morphism:
From: Finite Field of size 2
To: Valuation ring at Place (x, x*y)
sage: to_k
Ring morphism:
From: Valuation ring at Place (x, x*y)
To: Finite Field of size 2
sage: to_k(y)
(continues on next page)
230 Chapter 16. Places of function fields: extension
Algebraic Function Fields, Release 10.4
(continued from previous page)
Traceback (most recent call last):
...
TypeError: y fails to convert into the map s domain
Valuation ring at Place (x, x*y)...
sage: to_k(1/y)
0
sage: to_k(y/(1+y))
1
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> k, fr_k, to_k = p.residue_field()
>>> k
Finite Field of size 2
>>> fr_k
Ring morphism:
From: Finite Field of size 2
To: Valuation ring at Place (x, x*y)
>>> to_k
Ring morphism:
From: Valuation ring at Place (x, x*y)
To: Finite Field of size 2
>>> to_k(y)
Traceback (most recent call last):
...
TypeError: y fails to convert into the map s domain
Valuation ring at Place (x, x*y)...
>>> to_k(Integer(1)/y)
0
>>> to_k(y/(Integer(1)+y))
1
valuation_ring()
Return the valuation ring at the place.
EXAMPLES:
sage: # needs [Link].finite_rings
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: p.valuation_ring()
Valuation ring at Place (x, x*y)
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
(continues on next page)
231
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> p.valuation_ring()
Valuation ring at Place (x, x*y)
232 Chapter 16. Places of function fields: extension
CHAPTER
SEVENTEEN
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> = [Link](t^3 + x^3*t + x)
sage: f = x/(y+1)
sage: [Link]()
- 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)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R = K[
˓→ t ]; (t,) = R._first_ngens(1)
>>> L = [Link](t**Integer(3) + x**Integer(3)*t + x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> f = x/(y+Integer(1))
>>> [Link]()
- 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]
>>> from [Link] import *
>>> p = L.places_finite()[Integer(0)]
>>> q = L.places_infinite()[Integer(0)]
>>> (Integer(3)*p + Integer(2)*q).basis_function_space()
[1/x*y^2 + x^2, 1, 1/x]
We verify the Riemann-Roch theorem:
233
Algebraic Function Fields, Release 10.4
sage: D = 3*p - q
sage: index_of_speciality = len(D.basis_differential_space())
sage: [Link]() == [Link]() - [Link]() + 1 + index_of_speciality
True
>>> from [Link] import *
>>> D = Integer(3)*p - q
>>> index_of_speciality = len(D.basis_differential_space())
>>> [Link]() == [Link]() - [Link]() + Integer(1) + index_of_speciality
True
AUTHORS:
• Kwankyu Lee (2017-04-30): initial version
class [Link].function_field.[Link](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> = [Link](Y^2 - x^3 - 1)
sage: F.divisor_group()
Divisor group of Function field in y defined by y^2 + 4*x^3 + 4
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,)); (y,
˓→) = F._first_ngens(1)
>>> 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> = [Link](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
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = F._first_ngens(1)
(continues on next page)
234 Chapter 17. Divisors of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> G = F.divisor_group()
>>> G.function_field()
Function field in y defined by y^2 + 4*x^3 + 4
class [Link].function_field.[Link](parent, data)
Bases: ModuleElement
Divisors of function fields.
INPUT:
• parent – divisor group
• data – dict of place and multiplicity pairs
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: f = x/(y + 1)
sage: [Link]()
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)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> f = x/(y + Integer(1))
>>> [Link]()
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 Ω(𝐷) for the divisor 𝐷.
EXAMPLES:
We check the Riemann-Roch theorem:
sage: K.<x>=FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y>=[Link](Y^3 + x^3*Y + x)
sage: d = 3*[Link]()[0]
sage: l = len(d.basis_function_space())
sage: i = len(d.basis_differential_space())
sage: l == [Link]() + 1 - [Link]() + i
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
(continues on next page)
235
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> d = Integer(3)*[Link]()[Integer(0)]
>>> l = len(d.basis_function_space())
>>> i = len(d.basis_differential_space())
>>> l == [Link]() + Integer(1) - [Link]() + 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> = [Link](Y^2 - x^3 - 1)
sage: O = F.maximal_order()
sage: I = [Link](x - 2)
sage: D = [Link]()
sage: D.basis_function_space()
[x/(x + 3), 1/(x + 3)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x - Integer(2))
>>> D = [Link]()
>>> 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> = [Link](Y^3 + x^3*Y + x)
sage: p1,p2 = [Link]()[:2]
sage: D = 2*p1 - 3*p2
sage: [Link]()
-1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p1,p2 = [Link]()[:Integer(2)]
>>> D = Integer(2)*p1 - Integer(3)*p2
>>> [Link]()
-1
denominator()
Return the denominator part of the divisor.
The denominator of a divisor is the negative of the negative part of the divisor.
236 Chapter 17. Divisors of function fields
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: p1,p2 = [Link]()[:2]
sage: D = 2*p1 - 3*p2
sage: [Link]()
3*Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p1,p2 = [Link]()[:Integer(2)]
>>> D = Integer(2)*p1 - Integer(3)*p2
>>> [Link]()
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> = [Link](Y^3 + x^3*Y + x)
sage: f = x/(y + 1)
sage: D = [Link]()
sage: [Link]()
{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}
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> f = x/(y + Integer(1))
>>> D = [Link]()
>>> [Link]()
{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 Ω(𝐷) of the divisor 𝐷.
OUTPUT:
• a vector space isomorphic to Ω(𝐷)
• an isomorphism from the vector space to the differential space
• the inverse of the isomorphism
EXAMPLES:
237
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 - x^3 - 1)
sage: O = F.maximal_order()
sage: I = [Link](x - 2)
sage: P1 = [Link]().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
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x - Integer(2))
>>> P1 = [Link]().support()[Integer(0)]
>>> Pinf = F.places_infinite()[Integer(0)]
>>> D = -Integer(3)*Pinf + P1
>>> V, from_V, to_V = D.differential_space()
>>> 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> = [Link](Y^2 - x^3 - 1)
sage: O = F.maximal_order()
sage: I = [Link](x - 2)
sage: P1 = [Link]().support()[0]
sage: Pinf = F.places_infinite()[0]
sage: D = 3*Pinf + 2*P1
sage: [Link]()
5
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(3) - Integer(1), names=( y ,));
˓→ (y,) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x - Integer(2))
>>> P1 = [Link]().support()[Integer(0)]
>>> Pinf = F.places_infinite()[Integer(0)]
>>> D = Integer(3)*Pinf + Integer(2)*P1
>>> [Link]()
5
function_space()
Return the vector space of the Riemann-Roch space of the divisor.
OUTPUT:
238 Chapter 17. Divisors of function fields
Algebraic Function Fields, Release 10.4
• 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> = [Link](Y^2-x^3-1)
sage: O = F.maximal_order()
sage: I = [Link](x - 2)
sage: D = [Link]()
sage: V, from_V, to_V = D.function_space()
sage: all(to_V(from_V(e)) == e for e in V)
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2)-x**Integer(3)-Integer(1), names=( y ,)); (y,
˓→) = F._first_ngens(1)
>>> O = F.maximal_order()
>>> I = [Link](x - Integer(2))
>>> D = [Link]()
>>> V, from_V, to_V = D.function_space()
>>> 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> = [Link](Y^3 + x^3*Y + x)
sage: p1, p2 = [Link]()[:2]
sage: D = 2*p1 + 3*p2
sage: D.is_effective()
True
sage: E = D - 4*p2
sage: E.is_effective()
False
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p1, p2 = [Link]()[:Integer(2)]
>>> D = Integer(2)*p1 + Integer(3)*p2
>>> D.is_effective()
True
>>> E = D - Integer(4)*p2
>>> E.is_effective()
False
list()
Return the list of place and multiplicity pairs of the divisor.
EXAMPLES:
239
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: f = x/(y + 1)
sage: D = [Link]()
sage: [Link]()
[(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)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> f = x/(y + Integer(1))
>>> D = [Link]()
>>> [Link]()
[(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> = [Link](Y^3 + x^3*Y + x)
sage: p1,p2 = [Link]()[:2]
sage: D = 2*p1 - 3*p2
sage: [Link](p1)
2
sage: [Link](p2)
-3
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p1,p2 = [Link]()[:Integer(2)]
>>> D = Integer(2)*p1 - Integer(3)*p2
>>> [Link](p1)
2
>>> [Link](p2)
-3
numerator()
Return the numerator part of the divisor.
The numerator of a divisor is the positive part of the divisor.
EXAMPLES:
240 Chapter 17. Divisors of function fields
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: p1,p2 = [Link]()[:2]
sage: D = 2*p1 - 3*p2
sage: [Link]()
2*Place (1/x, 1/x^3*y^2 + 1/x)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p1,p2 = [Link]()[:Integer(2)]
>>> D = Integer(2)*p1 - Integer(3)*p2
>>> [Link]()
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> = [Link](Y^3 + x^3*Y + x)
sage: f = x/(y + 1)
sage: D = [Link]()
sage: [Link]()
[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)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> f = x/(y + Integer(1))
>>> D = [Link]()
>>> [Link]()
[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> = [Link](Y^3 + x^3*Y + x)
sage: p1,p2 = [Link]()[:2]
(continues on next page)
241
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: D = 2*p1 - 3*p2
sage: [Link](p1)
2
sage: [Link](p2)
-3
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p1,p2 = [Link]()[:Integer(2)]
>>> D = Integer(2)*p1 - Integer(3)*p2
>>> [Link](p1)
2
>>> [Link](p2)
-3
[Link].function_field.[Link](field, data)
Construct a divisor from the data.
INPUT:
• field – function field
• data – dictionary of place and multiplicity pairs
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: from [Link].function_field.divisor import divisor
sage: p, q, r = [Link]()
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)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ t ]; (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> from [Link].function_field.divisor import divisor
>>> p, q, r = [Link]()
>>> divisor(F, {p: Integer(1), q: Integer(2), r: Integer(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)
[Link].function_field.divisor.prime_divisor(field, place, m=1)
Construct a prime divisor from the place.
INPUT:
• field – function field
• place – place of the function field
242 Chapter 17. Divisors of function fields
Algebraic Function Fields, Release 10.4
• m – (default: 1) a positive integer; multiplicity at the place
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); R.<t> = K[]
sage: F.<y> = [Link](t^3 - x^2*(x^2 + x + 1)^2)
sage: p = [Link]()[0]
sage: from [Link].function_field.divisor import prime_divisor
sage: d = prime_divisor(F, p)
sage: 3 * d == prime_divisor(F, p, 3)
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ t ]; (t,) = R._first_ngens(1)
>>> F = [Link](t**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> p = [Link]()[Integer(0)]
>>> from [Link].function_field.divisor import prime_divisor
>>> d = prime_divisor(F, p)
>>> Integer(3) * d == prime_divisor(F, p, Integer(3))
True
243
Algebraic Function Fields, Release 10.4
244 Chapter 17. Divisors of function fields
CHAPTER
EIGHTEEN
DIFFERENTIALS OF FUNCTION FIELDS
Sage provides arithmetic with differentials of function fields.
EXAMPLES:
The module of differentials on a function field forms an one-dimensional vector space over the function field:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y)
sage: f = x + y
sage: g = 1 / y
sage: df = [Link]()
sage: dg = [Link]()
sage: dfdg = [Link]() / [Link]()
sage: df == dfdg * dg
True
sage: df
(x*y^2 + 1/x*y + 1) d(x)
sage: [Link]()
Space of differentials of Function field in y defined by y^3 + x^3*y + x
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> f = x + y
>>> g = Integer(1) / y
>>> df = [Link]()
>>> dg = [Link]()
>>> dfdg = [Link]() / [Link]()
>>> df == dfdg * dg
True
>>> df
(x*y^2 + 1/x*y + 1) d(x)
>>> [Link]()
Space of differentials of Function field in y defined by y^3 + x^3*y + x
We can compute a canonical divisor:
sage: # needs [Link].finite_rings [Link].function_field
sage: k = [Link]()
sage: [Link]()
(continues on next page)
245
Algebraic Function Fields, Release 10.4
(continued from previous page)
4
sage: [Link]() == 2 * [Link]() - 2
True
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> k = [Link]()
>>> [Link]()
4
>>> [Link]() == Integer(2) * [Link]() - Integer(2)
True
Exact differentials vanish and logarithmic differentials are stable under the Cartier operation:
sage: # needs [Link].finite_rings [Link].function_field
sage: [Link]()
0
sage: w = 1/f * df
sage: [Link]() == w
True
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> [Link]()
0
>>> w = Integer(1)/f * df
>>> [Link]() == w
True
AUTHORS:
• Kwankyu Lee (2017-04-30): initial version
class [Link].function_field.[Link](field,
category=None)
Bases: UniqueRepresentation, Parent
Space of differentials of a function field.
INPUT:
• field – function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 + x^3*Y + x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: L.space_of_differentials() #␣
˓→needs [Link].finite_rings [Link].function_field
Space of differentials of Function field in y defined by y^3 + x^3*y + x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,) = L._
(continues on next page)
246 Chapter 18. Differentials of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> L.space_of_differentials() #␣
˓→needs [Link].finite_rings [Link].function_field
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: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(5))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^5 - 1/x)
sage: L(x).differential()
0
sage: [Link]()
d(y)
sage: (y^2).differential()
(2*y) d(y)
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(5) - Integer(1)/x, names=( y ,)); (y,) = L._first_
˓→ngens(1)
>>> L(x).differential()
0
>>> [Link]()
d(y)
>>> (y**Integer(2)).differential()
(2*y) d(y)
Element
alias of FunctionFieldDifferential
basis()
Return a basis.
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: S = L.space_of_differentials()
sage: [Link]()
Family (d(x),)
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> S = L.space_of_differentials()
(continues on next page)
247
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
Family (d(x),)
function_field()
Return the function field to which the space of differentials is attached.
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x^3*Y + x)
sage: S = L.space_of_differentials()
sage: S.function_field()
Function field in y defined by y^3 + x^3*y + x
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> S = L.space_of_differentials()
>>> S.function_field()
Function field in y defined by y^3 + x^3*y + x
class [Link].function_field.[Link]
Bases: Morphism
Inclusion morphisms for extensions of function fields.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3) #␣
˓→needs [Link].function_field
sage: OK = K.space_of_differentials()
sage: OL = L.space_of_differentials() #␣
˓→needs [Link].function_field
sage: OL.coerce_map_from(OK) #␣
˓→needs [Link].function_field
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
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y ,));
˓→ (y,) = L._first_ngens(1)# needs [Link].function_field
>>> OK = K.space_of_differentials()
>>> OL = L.space_of_differentials() #␣
˓→needs [Link].function_field
>>> OL.coerce_map_from(OK) #␣
˓→needs [Link].function_field
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
248 Chapter 18. Differentials of function fields
Algebraic Function Fields, Release 10.4
is_injective()
Return True, since the inclusion morphism is injective.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3) #␣
˓→needs [Link].function_field
sage: OK = K.space_of_differentials()
sage: OL = L.space_of_differentials() #␣
˓→needs [Link].function_field
sage: OL.coerce_map_from(OK).is_injective() #␣
˓→needs [Link].function_field
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)# needs [Link].function_field
>>> OK = K.space_of_differentials()
>>> OL = L.space_of_differentials() #␣
˓→needs [Link].function_field
>>> OL.coerce_map_from(OK).is_injective() #␣
˓→needs [Link].function_field
True
is_surjective()
Return True if the inclusion morphism is surjective.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](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> = [Link](z - 1)
sage: OM = M.space_of_differentials()
sage: OM.coerce_map_from(OL).is_surjective()
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> OK = K.space_of_differentials()
>>> OL = L.space_of_differentials()
>>> OL.coerce_map_from(OK).is_surjective()
False
>>> S = L[ z ]; (z,) = S._first_ngens(1)
>>> M = [Link](z - Integer(1), names=( z ,)); (z,) = M._first_ngens(1)
(continues on next page)
249
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> OM = M.space_of_differentials()
>>> OM.coerce_map_from(OL).is_surjective()
True
class [Link].function_field.differential.DifferentialsSpace_global(field, cate-
gory=None)
Bases: DifferentialsSpace
Space of differentials of a global function field.
INPUT:
• field – function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 + x^3*Y + x) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: L.space_of_differentials() #␣
˓→needs [Link].finite_rings [Link].function_field
Space of differentials of Function field in y defined by y^3 + x^3*y + x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) + x**Integer(3)*Y + x, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> L.space_of_differentials() #␣
˓→needs [Link].finite_rings [Link].function_field
Space of differentials of Function field in y defined by y^3 + x^3*y + x
Element
alias of FunctionFieldDifferential_global
class [Link].function_field.[Link](parent, f,
t=None)
Bases: ModuleElement
Base class for differentials on function fields.
INPUT:
• f – element of the function field
• t – element of the function field; if 𝑡 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: [Link]()
((-x^2 + 1)/(x^4 + 2*x^3 + 3*x^2 + 2*x + 1)) d(x)
>>> from [Link] import *
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> f = x/(x**Integer(2) + x + Integer(1))
(continues on next page)
250 Chapter 18. Differentials of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
((-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> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: L(x).differential() #␣
˓→needs [Link].function_field
d(x)
sage: [Link]() #␣
˓→needs [Link].function_field
((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)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ]; (Y,
˓→) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> L(x).differential() #␣
˓→needs [Link].function_field
d(x)
>>> [Link]() #␣
˓→needs [Link].function_field
((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> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: w = (1/y) * [Link]() #␣
˓→needs [Link].function_field
sage: [Link]() #␣
˓→needs [Link].function_field
- 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)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> w = (Integer(1)/y) * [Link]() ␣
˓→ # needs [Link].function_field
>>> [Link]() #␣
˓→needs [Link].function_field
- Place (1/x, 1/x^3*y^2 + 1/x)
- Place (1/x, 1/x^3*y^2 + 1/x^2*y + 1)
(continues on next page)
251
Algebraic Function Fields, Release 10.4
(continued from previous page)
- 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: [Link]() #␣
˓→needs [Link]
-2*Place (x)
>>> from [Link] import *
>>> F = FunctionField(QQ, names=( x ,)); (x,) = F._first_ngens(1)
>>> w = (Integer(1)/x).differential()
>>> [Link]() #␣
˓→needs [Link]
-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> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: d = [Link]() #␣
˓→needs [Link].function_field
sage: d #␣
˓→needs [Link].function_field
((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() #␣
˓→needs [Link].function_field
{0: (4*x/(x^7 + 3))*y^2 + ((4*x^7 + 1)/(x^8 + 3*x))*y + x^4/(x^7 + 3)}
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> d = [Link]() #␣
˓→needs [Link].function_field
>>> d #␣
˓→needs [Link].function_field
((4*x/(x^7 + 3))*y^2 + ((4*x^7 + 1)/(x^8 + 3*x))*y + x^4/(x^7 + 3)) d(x)
>>> d.monomial_coefficients() #␣
˓→needs [Link].function_field
{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 – a place of the function field
OUTPUT:
252 Chapter 18. Differentials of function fields
Algebraic Function Fields, Release 10.4
• an element of the residue field of the place
EXAMPLES:
We verify the residue theorem in a rational function field:
sage: # needs [Link].finite_rings
sage: F.<x> = FunctionField(GF(4))
sage: f = 0
sage: while f == 0:
....: f = F.random_element()
sage: w = 1/f * [Link]()
sage: d = [Link]()
sage: s = [Link]()
sage: sum([[Link](p).trace() for p in s]) #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = F._first_ngens(1)
>>> f = Integer(0)
>>> while f == Integer(0):
... f = F.random_element()
>>> w = Integer(1)/f * [Link]()
>>> d = [Link]()
>>> s = [Link]()
>>> sum([[Link](p).trace() for p in s]) #␣
˓→needs [Link].function_field
and in an extension field:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(GF(7)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y)
sage: f = 0
sage: while f == 0:
....: f = L.random_element()
sage: w = 1/f * [Link]()
sage: d = [Link]()
sage: s = [Link]()
sage: sum([[Link](p).trace() for p in s])
0
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> f = Integer(0)
>>> while f == Integer(0):
... f = L.random_element()
>>> w = Integer(1)/f * [Link]()
>>> d = [Link]()
>>> s = [Link]()
>>> sum([[Link](p).trace() for p in s])
(continues on next page)
253
Algebraic Function Fields, Release 10.4
(continued from previous page)
0
and also in a function field of characteristic zero:
sage: # needs [Link].function_field
sage: R.<x> = FunctionField(QQ)
sage: L.<Y> = R[]
sage: F.<y> = [Link](Y^2 - x^4 - 4*x^3 - 2*x^2 - 1)
sage: a = 6*x^2 + 5*x + 7
sage: b = 2*x^6 + 8*x^5 + 3*x^4 - 4*x^3 - 1
sage: w = y*a/b*[Link]()
sage: d = [Link]()
sage: sum([QQ([Link](p)) for p in [Link]()])
0
>>> from [Link] import *
>>> # needs [Link].function_field
>>> R = FunctionField(QQ, names=( x ,)); (x,) = R._first_ngens(1)
>>> L = R[ Y ]; (Y,) = L._first_ngens(1)
>>> F = [Link](Y**Integer(2) - x**Integer(4) - Integer(4)*x**Integer(3) -
˓→ Integer(2)*x**Integer(2) - Integer(1), names=( y ,)); (y,) = F._first_
˓→ngens(1)
>>> a = Integer(6)*x**Integer(2) + Integer(5)*x + Integer(7)
>>> b = Integer(2)*x**Integer(6) + Integer(8)*x**Integer(5) +␣
˓→Integer(3)*x**Integer(4) - Integer(4)*x**Integer(3) - Integer(1)
>>> w = y*a/b*[Link]()
>>> d = [Link]()
>>> sum([QQ([Link](p)) for p in [Link]()])
0
valuation(place)
Return the valuation of the differential at the place.
INPUT:
• place – a place of the function field
EXAMPLES:
sage: K.<x> = FunctionField(GF(5)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: w = (1/y) * [Link]() #␣
˓→needs [Link].function_field
sage: [[Link](p) for p in [Link]()] #␣
˓→needs [Link].function_field
[-1, -1, -1, 0, 1, 0]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(5)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)# needs [Link].function_field
>>> w = (Integer(1)/y) * [Link]() ␣
˓→ # needs [Link].function_field
>>> [[Link](p) for p in [Link]()] #␣
(continues on next page)
254 Chapter 18. Differentials of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
needs [Link].function_field
˓→
[-1, -1, -1, 0, 1, 0]
class [Link].function_field.differential.FunctionFieldDifferential_global(par-
ent,
f,
t=None)
Bases: FunctionFieldDifferential
Differentials on global function fields.
EXAMPLES:
sage: F.<x> = FunctionField(GF(7))
sage: f = x/(x^2 + x + 1)
sage: [Link]()
((6*x^2 + 1)/(x^4 + 2*x^3 + 3*x^2 + 2*x + 1)) d(x)
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = F._first_ngens(1)
>>> f = x/(x**Integer(2) + x + Integer(1))
>>> [Link]()
((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[] #␣
˓→needs [Link].finite_rings
sage: L.<y> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].finite_rings [Link].function_field
sage: [Link]() #␣
˓→needs [Link].finite_rings [Link].function_field
(x*y^2 + 1/x*y) d(x)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)# needs [Link].finite_rings
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].finite_rings [Link].function_field
>>> [Link]() #␣
˓→needs [Link].finite_rings [Link].function_field
(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 𝑥 be a separating element of the function field. If a
differential 𝜔 is written in prime-power representation 𝜔 = (𝑓0𝑝 + 𝑓1𝑝 𝑥 + · · · + 𝑓𝑝−1
𝑝
𝑥𝑝−1 )𝑑𝑥, then the
Cartier operator maps 𝜔 to 𝑓𝑝−1 𝑑𝑥. It is known that this definition does not depend on the choice of 𝑥.
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: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(4)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y)
(continues on next page)
255
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: f = x/y
sage: w = 1/f*[Link]()
sage: [Link]() == w
True
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> f = x/y
>>> w = Integer(1)/f*[Link]()
>>> [Link]() == w
True
sage: # needs [Link].finite_rings
sage: F.<x> = FunctionField(GF(4))
sage: f = x/(x^2 + x + 1)
sage: w = 1/f*[Link]()
sage: [Link]() == w #␣
˓→needs [Link].function_field
True
>>> from [Link] import *
>>> # needs [Link].finite_rings
>>> F = FunctionField(GF(Integer(4)), names=( x ,)); (x,) = F._first_ngens(1)
>>> f = x/(x**Integer(2) + x + Integer(1))
>>> w = Integer(1)/f*[Link]()
>>> [Link]() == w #␣
˓→needs [Link].function_field
True
256 Chapter 18. Differentials of function fields
CHAPTER
NINETEEN
VALUATION RINGS OF FUNCTION FIELDS
A valuation ring of a function field is associated with a place of the function field. The valuation ring consists of all
elements of the function field that have nonnegative valuation at the place.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: p
Place (x, x*y)
sage: R = p.valuation_ring()
sage: R
Valuation ring at Place (x, x*y)
sage: [Link]() == p
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> p
Place (x, x*y)
>>> R = p.valuation_ring()
>>> R
Valuation ring at Place (x, x*y)
>>> [Link]() == p
True
Thus any nonzero element or its inverse of the function field lies in the valuation ring, as shown in the following example:
sage: f = y/(1+y)
sage: f in R
True
sage: f not in R
False
sage: [Link](p)
0
>>> from [Link] import *
>>> f = y/(Integer(1)+y)
>>> f in R
(continues on next page)
257
Algebraic Function Fields, Release 10.4
(continued from previous page)
True
>>> f not in R
False
>>> [Link](p)
0
The residue field at the place is defined as the quotient ring of the valuation ring modulo its unique maximal ideal. The
method residue_field() of the valuation ring returns an extension field of the constant base field, isomorphic to
the residue field, along with lifting and evaluation homomorphisms:
sage: k,phi,psi = R.residue_field()
sage: k
Finite Field of size 2
sage: phi
Ring morphism:
From: Finite Field of size 2
To: Valuation ring at Place (x, x*y)
sage: psi
Ring morphism:
From: Valuation ring at Place (x, x*y)
To: Finite Field of size 2
sage: psi(f) in k
True
>>> from [Link] import *
>>> k,phi,psi = R.residue_field()
>>> k
Finite Field of size 2
>>> phi
Ring morphism:
From: Finite Field of size 2
To: Valuation ring at Place (x, x*y)
>>> psi
Ring morphism:
From: Valuation ring at Place (x, x*y)
To: Finite Field of size 2
>>> psi(f) in k
True
AUTHORS:
• Kwankyu Lee (2017-04-30): initial version
class [Link].function_field.valuation_ring.FunctionFieldValuationRing(field,
place,
cate-
gory=None)
Bases: UniqueRepresentation, Parent
Base class for valuation rings of function fields.
INPUT:
• field – function field
• place – place of the function field
EXAMPLES:
258 Chapter 19. Valuation rings of function fields
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: p.valuation_ring()
Valuation ring at Place (x, x*y)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L.
˓→_first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> p.valuation_ring()
Valuation ring at Place (x, x*y)
place()
Return the place associated with the valuation ring.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: R = p.valuation_ring()
sage: p == [Link]()
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> R = p.valuation_ring()
>>> p == [Link]()
True
residue_field(name=None)
Return the residue field of the valuation ring together with the maps from and to it.
INPUT:
• name – string; name of the generator of the field
OUTPUT:
• a field isomorphic to the residue field
• a ring homomorphism from the valuation ring to the field
• a ring homomorphism from the field to the valuation ring
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: R = p.valuation_ring()
sage: k, fr_k, to_k = R.residue_field()
(continues on next page)
259
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: k
Finite Field of size 2
sage: fr_k
Ring morphism:
From: Finite Field of size 2
To: Valuation ring at Place (x, x*y)
sage: to_k
Ring morphism:
From: Valuation ring at Place (x, x*y)
To: Finite Field of size 2
sage: to_k(1/y)
0
sage: to_k(y/(1+y))
1
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> R = p.valuation_ring()
>>> k, fr_k, to_k = R.residue_field()
>>> k
Finite Field of size 2
>>> fr_k
Ring morphism:
From: Finite Field of size 2
To: Valuation ring at Place (x, x*y)
>>> to_k
Ring morphism:
From: Valuation ring at Place (x, x*y)
To: Finite Field of size 2
>>> to_k(Integer(1)/y)
0
>>> to_k(y/(Integer(1)+y))
1
260 Chapter 19. Valuation rings of function fields
CHAPTER
TWENTY
DERIVATIONS OF FUNCTION FIELDS
For global function fields, which have positive characteristics, the higher derivation is available:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y) #␣
˓→needs [Link].function_field
sage: h = L.higher_derivation() #␣
˓→needs [Link].function_field
sage: h(y^2, 2) #␣
˓→needs [Link].function_field
((x^7 + 1)/x^2)*y^2 + x^3*y
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _ = K[
˓→ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)# needs [Link].function_field
>>> h = L.higher_derivation() #␣
˓→needs [Link].function_field
>>> h(y**Integer(2), Integer(2)) ␣
˓→ # needs [Link].function_field
((x^7 + 1)/x^2)*y^2 + x^3*y
AUTHORS:
• William Stein (2010): initial version
• Julian Rüth (2011-09-14, 2014-06-23, 2017-08-21): refactored class hierarchy; added derivation classes; mor-
phisms to/from fraction fields
• Kwankyu Lee (2017-04-30): added higher derivations and completions
class [Link].function_field.[Link](parent)
Bases: RingDerivationWithoutTwist
Base class for derivations on function fields.
A derivation on 𝑅 is a map 𝑅 → 𝑅 with 𝐷(𝛼 + 𝛽) = 𝐷(𝛼) + 𝐷(𝛽) and 𝐷(𝛼𝛽) = 𝛽𝐷(𝛼) + 𝛼𝐷(𝛽) for all
𝛼, 𝛽 ∈ 𝑅.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: d = [Link]()
sage: d
d/dx
261
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> d = [Link]()
>>> d
d/dx
is_injective()
Return False since a derivation is never injective.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: d = [Link]()
sage: d.is_injective()
False
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> d = [Link]()
>>> d.is_injective()
False
262 Chapter 20. Derivations of function fields
CHAPTER
TWENTYONE
DERIVATIONS OF FUNCTION FIELDS: RATIONAL
class [Link].function_field.derivations_rational.FunctionFieldDerivation_rational(par-
ent,
u=Non
Bases: FunctionFieldDerivation
Derivations on rational function fields.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: [Link]()
d/dx
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> [Link]()
d/dx
263
Algebraic Function Fields, Release 10.4
264 Chapter 21. Derivations of function fields: rational
CHAPTER
TWENTYTWO
DERIVATIONS OF FUNCTION FIELDS: EXTENSION
class [Link].function_field.derivations_polymod.FunctionFieldDerivation_inseparable(par-
ent,
u=N
Bases: FunctionFieldDerivation
Initialize this derivation.
INPUT:
• parent – the parent of this derivation
• u – a parameter describing the derivation
EXAMPLES:
sage: K.<x> = FunctionField(GF(2))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: d = [Link]()
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> d = [Link]()
This also works for iterated non-monic extensions:
sage: K.<x> = FunctionField(GF(2))
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - 1/x)
sage: R.<z> = L[]
sage: M.<z> = [Link](z^2*y - x^3)
sage: [Link]()
d/dz
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - Integer(1)/x, names=( y ,)); (y,) = L._first_
˓→ngens(1)
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(2)*y - x**Integer(3), names=( z ,)); (z,) = M._
˓→first_ngens(1)
(continues on next page)
265
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> [Link]()
d/dz
We can also create a multiple of the canonical derivation:
sage: [Link]([x])
x*d/dz
>>> from [Link] import *
>>> [Link]([x])
x*d/dz
class [Link].function_field.derivations_polymod.FunctionFieldDerivation_separable(par-
ent,
d)
Bases: FunctionFieldDerivation
Derivations of separable extensions.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<y> = [Link](y^2 - x)
sage: [Link]()
d/dx
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link]()
d/dx
class [Link].function_field.derivations_polymod.FunctionFieldHigherDerivation(field)
Bases: Map
Base class of higher derivations on function fields.
INPUT:
• field – function field on which the derivation operates
EXAMPLES:
sage: F.<x> = FunctionField(GF(2))
sage: F.higher_derivation()
Higher derivation map:
From: Rational function field in x over Finite Field of size 2
To: Rational function field in x over Finite Field of size 2
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> F.higher_derivation()
Higher derivation map:
From: Rational function field in x over Finite Field of size 2
To: Rational function field in x over Finite Field of size 2
266 Chapter 22. Derivations of function fields: extension
Algebraic Function Fields, Release 10.4
class [Link].function_field.derivations_polymod.FunctionFieldHigherDerivation_char_zero
Bases: FunctionFieldHigherDerivation
Higher derivations of function fields of characteristic zero.
INPUT:
• field – function field on which the derivation operates
EXAMPLES:
sage: K.<x> = FunctionField(QQ); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y)
sage: h = L.higher_derivation()
sage: h
Higher derivation map:
From: Function field in y defined by y^3 + x^3*y + x
To: Function field in y defined by y^3 + x^3*y + x
sage: h(y,1) == -(3*x^2*y+1)/(3*y^2+x^3)
True
sage: h(y^2,1) == -2*y*(3*x^2*y+1)/(3*y^2+x^3)
True
sage: e = L.random_element()
sage: h(h(e,1),1) == 2*h(e,2)
True
sage: h(h(h(e,1),1),1) == 3*2*h(e,3)
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); _ = K[ Y ]; (Y,
˓→) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> h = L.higher_derivation()
>>> h
Higher derivation map:
From: Function field in y defined by y^3 + x^3*y + x
To: Function field in y defined by y^3 + x^3*y + x
>>> h(y,Integer(1)) == -(Integer(3)*x**Integer(2)*y+Integer(1))/
˓→(Integer(3)*y**Integer(2)+x**Integer(3))
True
>>> h(y**Integer(2),Integer(1)) == -
˓→Integer(2)*y*(Integer(3)*x**Integer(2)*y+Integer(1))/
˓→(Integer(3)*y**Integer(2)+x**Integer(3))
True
>>> e = L.random_element()
>>> h(h(e,Integer(1)),Integer(1)) == Integer(2)*h(e,Integer(2))
True
>>> h(h(h(e,Integer(1)),Integer(1)),Integer(1)) == Integer(3)*Integer(2)*h(e,
˓→Integer(3))
True
class [Link].function_field.derivations_polymod.FunctionFieldHigherDerivation_global(fie
Bases: FunctionFieldHigherDerivation
Higher derivations of global function fields.
INPUT:
• field – function field on which the derivation operates
267
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^3 + x + x^3*Y)
sage: h = L.higher_derivation()
sage: h
Higher derivation map:
From: Function field in y defined by y^3 + x^3*y + x
To: Function field in y defined by y^3 + x^3*y + x
sage: h(y^2, 2)
((x^7 + 1)/x^2)*y^2 + x^3*y
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(3) + x + x**Integer(3)*Y, names=( y ,)); (y,) = L._
˓→first_ngens(1)
>>> h = L.higher_derivation()
>>> h
Higher derivation map:
From: Function field in y defined by y^3 + x^3*y + x
To: Function field in y defined by y^3 + x^3*y + x
>>> h(y**Integer(2), Integer(2))
((x^7 + 1)/x^2)*y^2 + x^3*y
class [Link].function_field.derivations_polymod.RationalFunctionFieldHigherDerivation_g
Bases: FunctionFieldHigherDerivation
Higher derivations of rational function fields over finite fields.
INPUT:
• field – function field on which the derivation operates
EXAMPLES:
sage: F.<x> = FunctionField(GF(2))
sage: h = F.higher_derivation()
sage: h
Higher derivation map:
From: Rational function field in x over Finite Field of size 2
To: Rational function field in x over Finite Field of size 2
sage: h(x^2, 2)
1
>>> from [Link] import *
>>> F = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = F._first_ngens(1)
>>> h = F.higher_derivation()
>>> h
Higher derivation map:
From: Rational function field in x over Finite Field of size 2
To: Rational function field in x over Finite Field of size 2
>>> h(x**Integer(2), Integer(2))
1
268 Chapter 22. Derivations of function fields: extension
CHAPTER
TWENTYTHREE
MORPHISMS OF FUNCTION FIELDS
Maps and morphisms useful for computations with function fields.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: [Link](1/x)
Function Field endomorphism of Rational function field in x over Rational Field
Defn: x |--> 1/x
sage: # needs [Link].function_field
sage: L.<y> = [Link](y^2 - x)
sage: [Link](y)
Function Field morphism:
From: Rational function field in x over Rational Field
To: Function field in y defined by y^2 - x
Defn: x |--> y
sage: [Link]([y,x])
Function Field endomorphism of Function field in y defined by y^2 - x
Defn: y |--> y
x |--> x
sage: [Link]([x,y])
Traceback (most recent call last):
...
ValueError: invalid morphism
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,) =␣
˓→R._first_ngens(1)
>>> [Link](Integer(1)/x)
Function Field endomorphism of Rational function field in x over Rational Field
Defn: x |--> 1/x
>>> # needs [Link].function_field
>>> L = [Link](y**Integer(2) - x, names=( y ,)); (y,) = L._first_ngens(1)
>>> [Link](y)
Function Field morphism:
From: Rational function field in x over Rational Field
To: Function field in y defined by y^2 - x
Defn: x |--> y
>>> [Link]([y,x])
Function Field endomorphism of Function field in y defined by y^2 - x
Defn: y |--> y
x |--> x
>>> [Link]([x,y])
(continues on next page)
269
Algebraic Function Fields, Release 10.4
(continued from previous page)
Traceback (most recent call last):
...
ValueError: invalid morphism
AUTHORS:
• William Stein (2010): initial version
• Julian Rüth (2011-09-14, 2014-06-23, 2017-08-21): refactored class hierarchy; added derivation classes; mor-
phisms to/from fraction fields
• Kwankyu Lee (2017-04-30): added higher derivations and completions
class [Link].function_field.[Link]
Bases: FunctionFieldVectorSpaceIsomorphism
Isomorphism from a fraction field of a polynomial ring to the isomorphic function field.
EXAMPLES:
sage: K = QQ[ x ].fraction_field()
sage: L = K.function_field()
sage: f = L.coerce_map_from(K); f
Isomorphism:
From: Fraction Field of Univariate Polynomial Ring in x over Rational Field
To: Rational function field in x over Rational Field
>>> from [Link] import *
>>> K = QQ[ x ].fraction_field()
>>> L = K.function_field()
>>> f = L.coerce_map_from(K); f
Isomorphism:
From: Fraction Field of Univariate Polynomial Ring in x over Rational Field
To: Rational function field in x over Rational Field
See also:
FunctionFieldToFractionField
section()
Return the inverse map of this isomorphism.
EXAMPLES:
sage: K = QQ[ x ].fraction_field()
sage: L = K.function_field()
sage: f = L.coerce_map_from(K)
sage: [Link]()
Isomorphism:
From: Rational function field in x over Rational Field
To: Fraction Field of Univariate Polynomial Ring in x over Rational␣
˓→Field
>>> from [Link] import *
>>> K = QQ[ x ].fraction_field()
>>> L = K.function_field()
>>> f = L.coerce_map_from(K)
>>> [Link]()
(continues on next page)
270 Chapter 23. Morphisms of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Isomorphism:
From: Rational function field in x over Rational Field
To: Fraction Field of Univariate Polynomial Ring in x over Rational␣
˓→Field
class [Link].function_field.[Link](field, place, name=None,
prec=None,
gen_name=None)
Bases: Map
Completions on function fields.
INPUT:
• field – function field
• place – place of the function field
• name – string for the name of the series variable
• prec – positive integer; default precision
• gen_name – string; name of the generator of the residue field; used only when place is non-rational
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: m = [Link](p)
sage: m
Completion map:
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
To: Laurent Series Ring in s over Finite Field of size 2
sage: m(x)
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + s^12 + s^13
+ s^15 + s^16 + s^17 + s^19 + O(s^22)
sage: m(y)
s^-1 + 1 + s^3 + s^5 + s^7 + s^9 + s^13 + s^15 + s^17 + O(s^19)
sage: m(x*y) == m(x) * m(y)
True
sage: m(x+y) == m(x) + m(y)
True
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = L.
˓→_first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> m = [Link](p)
>>> m
Completion map:
From: Function field in y defined by y^2 + y + (x^2 + 1)/x
To: Laurent Series Ring in s over Finite Field of size 2
>>> m(x)
(continues on next page)
271
Algebraic Function Fields, Release 10.4
(continued from previous page)
s^2 + s^3 + s^4 + s^5 + s^7 + s^8 + s^9 + s^10 + s^12 + s^13
+ s^15 + s^16 + s^17 + s^19 + O(s^22)
>>> m(y)
s^-1 + 1 + s^3 + s^5 + s^7 + s^9 + s^13 + s^15 + s^17 + O(s^19)
>>> m(x*y) == m(x) * m(y)
True
>>> m(x+y) == m(x) + m(y)
True
The variable name of the series can be supplied. If the place is not rational such that the residue field is a proper
extension of the constant field, you can also specify the generator name of the extension:
sage: # needs [Link].finite_rings [Link].function_field
sage: p2 = L.places_finite(2)[0]
sage: p2
Place (x^2 + x + 1, x*y + 1)
sage: m2 = [Link](p2, t , gen_name= b )
sage: m2(x)
(b + 1) + t + t^2 + t^4 + t^8 + t^16 + O(t^20)
sage: m2(y)
b + b*t + b*t^3 + b*t^4 + (b + 1)*t^5 + (b + 1)*t^7 + b*t^9 + b*t^11
+ b*t^12 + b*t^13 + b*t^15 + b*t^16 + (b + 1)*t^17 + (b + 1)*t^19 + O(t^20)
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> p2 = L.places_finite(Integer(2))[Integer(0)]
>>> p2
Place (x^2 + x + 1, x*y + 1)
>>> m2 = [Link](p2, t , gen_name= b )
>>> m2(x)
(b + 1) + t + t^2 + t^4 + t^8 + t^16 + O(t^20)
>>> m2(y)
b + b*t + b*t^3 + b*t^4 + (b + 1)*t^5 + (b + 1)*t^7 + b*t^9 + b*t^11
+ b*t^12 + b*t^13 + b*t^15 + b*t^16 + (b + 1)*t^17 + (b + 1)*t^19 + O(t^20)
default_precision()
Return the default precision.
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: L.<y> = [Link](Y^2 + Y + x + 1/x)
sage: p = L.places_finite()[0]
sage: m = [Link](p)
sage: m.default_precision()
20
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> L = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= L._first_ngens(1)
>>> p = L.places_finite()[Integer(0)]
>>> m = [Link](p)
(continues on next page)
272 Chapter 23. Morphisms of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> m.default_precision()
20
class [Link].function_field.[Link](par-
ent)
Bases: Map
Conversion map from the function field to its constant base field.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: QQ.convert_map_from(K)
Conversion map:
From: Rational function field in x over Rational Field
To: Rational Field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> QQ.convert_map_from(K)
Conversion map:
From: Rational function field in x over Rational Field
To: Rational Field
class [Link].function_field.[Link]
Bases: SetMorphism
Linear map to function fields.
class [Link].function_field.[Link]
Bases: SetMorphism
Section of linear map from function fields.
class [Link].function_field.[Link](parent, im_gen,
base_morphism)
Bases: RingHomomorphism
Base class for morphisms between function fields.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: f = [Link](1/x); f
Function Field endomorphism of Rational function field in x over Rational Field
Defn: x |--> 1/x
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> f = [Link](Integer(1)/x); f
Function Field endomorphism of Rational function field in x over Rational Field
Defn: x |--> 1/x
class [Link].function_field.maps.FunctionFieldMorphism_polymod(parent, im_gen,
base_morphism)
Bases: FunctionFieldMorphism
Morphism from a finite extension of a function field to a function field.
273
Algebraic Function Fields, Release 10.4
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(7)); R.<y> = K[]
sage: L.<y> = [Link](y^3 + 6*x^3 + x)
sage: f = [Link](y*2); f
Function Field endomorphism of Function field in y defined by y^3 + 6*x^3 + x
Defn: y |--> 2*y
sage: factor([Link]())
y^3 + 6*x^3 + x
sage: f(y).charpoly( y )
y^3 + 6*x^3 + x
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(7)), names=( x ,)); (x,) = K._first_ngens(1); R␣
˓→= K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(3) + Integer(6)*x**Integer(3) + x, names=( y ,));␣
˓→(y,) = L._first_ngens(1)
>>> f = [Link](y*Integer(2)); f
Function Field endomorphism of Function field in y defined by y^3 + 6*x^3 + x
Defn: y |--> 2*y
>>> factor([Link]())
y^3 + 6*x^3 + x
>>> f(y).charpoly( y )
y^3 + 6*x^3 + x
class [Link].function_field.maps.FunctionFieldMorphism_rational(parent, im_gen,
base_mor-
phism)
Bases: FunctionFieldMorphism
Morphism from a rational function field to a function field.
class [Link].function_field.[Link]
Bases: SetMorphism
Ring homomorphism.
class [Link].function_field.[Link]
Bases: FunctionFieldVectorSpaceIsomorphism
Isomorphism from rational function field to the isomorphic fraction field of a polynomial ring.
EXAMPLES:
sage: K = QQ[ x ].fraction_field()
sage: L = K.function_field()
sage: f = K.coerce_map_from(L); f
Isomorphism:
From: Rational function field in x over Rational Field
To: Fraction Field of Univariate Polynomial Ring in x over Rational Field
>>> from [Link] import *
>>> K = QQ[ x ].fraction_field()
>>> L = K.function_field()
>>> f = K.coerce_map_from(L); f
Isomorphism:
(continues on next page)
274 Chapter 23. Morphisms of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
From: Rational function field in x over Rational Field
To: Fraction Field of Univariate Polynomial Ring in x over Rational Field
See also:
FractionFieldToFunctionField
section()
Return the inverse map of this isomorphism.
EXAMPLES:
sage: K = QQ[ x ].fraction_field()
sage: L = K.function_field()
sage: f = K.coerce_map_from(L)
sage: [Link]()
Isomorphism:
From: Fraction Field of Univariate Polynomial Ring in x over Rational␣
˓→Field
To: Rational function field in x over Rational Field
>>> from [Link] import *
>>> K = QQ[ x ].fraction_field()
>>> L = K.function_field()
>>> f = K.coerce_map_from(L)
>>> [Link]()
Isomorphism:
From: Fraction Field of Univariate Polynomial Ring in x over Rational␣
˓→Field
To: Rational function field in x over Rational Field
class [Link].function_field.[Link]
Bases: Morphism
Base class for isomorphisms between function fields and vector spaces.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space()
sage: isinstance(f, [Link].function_field.maps.
˓→FunctionFieldVectorSpaceIsomorphism)
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space()
>>> isinstance(f, [Link].function_field.maps.
˓→FunctionFieldVectorSpaceIsomorphism)
True
275
Algebraic Function Fields, Release 10.4
is_injective()
Return True, since the isomorphism is injective.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space()
sage: f.is_injective()
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space()
>>> f.is_injective()
True
is_surjective()
Return True, since the isomorphism is surjective.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space()
sage: f.is_surjective()
True
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space()
>>> f.is_surjective()
True
class [Link].function_field.[Link](K, V)
Bases: FunctionFieldVectorSpaceIsomorphism
Isomorphism from a function field to a vector space.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space(); t
Isomorphism:
From: Function field in y defined by y^2 - x*y + 4*x^3
(continues on next page)
276 Chapter 23. Morphisms of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
To: Vector space of dimension 2 over Rational function field in x over␣
˓→Rational Field
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space(); t
Isomorphism:
From: Function field in y defined by y^2 - x*y + 4*x^3
To: Vector space of dimension 2 over Rational function field in x over␣
˓→Rational Field
class [Link].function_field.[Link](V, K)
Bases: FunctionFieldVectorSpaceIsomorphism
Isomorphism from a vector space to a function field.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space(); f
Isomorphism:
From: Vector space of dimension 2 over Rational function field in x over␣
˓→Rational Field
To: Function field in y defined by y^2 - x*y + 4*x^3
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ]; (y,
˓→) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y ,));
˓→ (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space(); f
Isomorphism:
From: Vector space of dimension 2 over Rational function field in x over␣
˓→Rational Field
To: Function field in y defined by y^2 - x*y + 4*x^3
codomain()
Return the function field which is the codomain of the isomorphism.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space()
sage: [Link]()
Function field in y defined by y^2 - x*y + 4*x^3
277
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space()
>>> [Link]()
Function field in y defined by y^2 - x*y + 4*x^3
domain()
Return the vector space which is the domain of the isomorphism.
EXAMPLES:
sage: # needs [Link].function_field
sage: K.<x> = FunctionField(QQ); R.<y> = K[]
sage: L.<y> = [Link](y^2 - x*y + 4*x^3)
sage: V, f, t = L.vector_space()
sage: [Link]()
Vector space of dimension 2 over Rational function field in x over Rational␣
˓→Field
>>> from [Link] import *
>>> # needs [Link].function_field
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); R = K[ y ];
˓→ (y,) = R._first_ngens(1)
>>> L = [Link](y**Integer(2) - x*y + Integer(4)*x**Integer(3), names=( y
˓→ ,)); (y,) = L._first_ngens(1)
>>> V, f, t = L.vector_space()
>>> [Link]()
Vector space of dimension 2 over Rational function field in x over Rational␣
˓→Field
278 Chapter 23. Morphisms of function fields
CHAPTER
TWENTYFOUR
SPECIAL EXTENSIONS OF FUNCTION FIELDS
This module currently implements only constant field extension.
24.1 Constant field extensions
EXAMPLES:
Constant field extension of the rational function field over rational numbers:
sage: K.<x> = FunctionField(QQ)
sage: N.<a> = QuadraticField(2) #␣
˓→needs [Link].number_field
sage: L = K.extension_constant_field(N) #␣
˓→needs [Link].number_field
sage: L #␣
˓→needs [Link].number_field
Rational function field in x over Number Field in a with defining
polynomial x^2 - 2 with a = 1.4142... over its base
sage: d = (x^2 - 2).divisor() #␣
˓→needs [Link] [Link]
sage: d #␣
˓→needs [Link] [Link]
-2*Place (1/x)
+ Place (x^2 - 2)
sage: L.conorm_divisor(d) #␣
˓→needs [Link] [Link] [Link].number_field
-2*Place (1/x)
+ Place (x - a)
+ Place (x + a)
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> N = QuadraticField(Integer(2), names=( a ,)); (a,) = N._first_ngens(1)# needs␣
˓→[Link].number_field
>>> L = K.extension_constant_field(N) #␣
˓→needs [Link].number_field
>>> L #␣
˓→needs [Link].number_field
Rational function field in x over Number Field in a with defining
polynomial x^2 - 2 with a = 1.4142... over its base
>>> d = (x**Integer(2) - Integer(2)).divisor() ␣
˓→ # needs [Link] [Link]
>>> d #␣
(continues on next page)
279
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ needs [Link] [Link]
-2*Place (1/x)
+ Place (x^2 - 2)
>>> L.conorm_divisor(d) #␣
˓→needs [Link] [Link] [Link].number_field
-2*Place (1/x)
+ Place (x - a)
+ Place (x + a)
Constant field extension of a function field over a finite field:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); R.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: E = F.extension_constant_field(GF(2^3))
sage: E
Function field in y defined by y^3 + x^6 + x^4 + x^2 over its base
sage: p = F.get_place(3)
sage: E.conorm_place(p) # random
Place (x + z3, y + z3^2 + z3)
+ Place (x + z3^2, y + z3)
+ Place (x + z3^2 + z3, y + z3^2)
sage: q = F.get_place(2)
sage: E.conorm_place(q) # random
Place (x + 1, y^2 + y + 1)
sage: E.conorm_divisor(p + q) # random
Place (x + 1, y^2 + y + 1)
+ Place (x + z3, y + z3^2 + z3)
+ Place (x + z3^2, y + z3)
+ Place (x + z3^2 + z3, y + z3^2)
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); R = K[
˓→ Y ]; (Y,) = R._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> E = F.extension_constant_field(GF(Integer(2)**Integer(3)))
>>> E
Function field in y defined by y^3 + x^6 + x^4 + x^2 over its base
>>> p = F.get_place(Integer(3))
>>> E.conorm_place(p) # random
Place (x + z3, y + z3^2 + z3)
+ Place (x + z3^2, y + z3)
+ Place (x + z3^2 + z3, y + z3^2)
>>> q = F.get_place(Integer(2))
>>> E.conorm_place(q) # random
Place (x + 1, y^2 + y + 1)
>>> E.conorm_divisor(p + q) # random
Place (x + 1, y^2 + y + 1)
+ Place (x + z3, y + z3^2 + z3)
+ Place (x + z3^2, y + z3)
+ Place (x + z3^2 + z3, y + z3^2)
AUTHORS:
• Kwankyu Lee (2021-12-24): added constant field extension
280 Chapter 24. Special extensions of function fields
Algebraic Function Fields, Release 10.4
class [Link].function_field.[Link](F, k_ext)
Bases: FunctionFieldExtension
Constant field extension.
INPUT:
• F – a function field whose constant field is 𝑘
• k_ext – an extension of 𝑘
conorm_divisor(d)
Return the conorm of the divisor d in this extension.
INPUT:
• d – divisor of the base function field
OUTPUT: a divisor of the top function field
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); R.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: E = F.extension_constant_field(GF(2^3))
sage: p1 = F.get_place(3)
sage: p2 = F.get_place(2)
sage: c = E.conorm_divisor(2*p1 + 3*p2)
sage: c1 = E.conorm_place(p1)
sage: c2 = E.conorm_place(p2)
sage: c == 2*c1 + 3*c2
True
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ Y ]; (Y,) = R._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> E = F.extension_constant_field(GF(Integer(2)**Integer(3)))
>>> p1 = F.get_place(Integer(3))
>>> p2 = F.get_place(Integer(2))
>>> c = E.conorm_divisor(Integer(2)*p1 + Integer(3)*p2)
>>> c1 = E.conorm_place(p1)
>>> c2 = E.conorm_place(p2)
>>> c == Integer(2)*c1 + Integer(3)*c2
True
conorm_place(p)
Return the conorm of the place 𝑝 in this extension.
INPUT:
• p – place of the base function field
OUTPUT: divisor of the top function field
EXAMPLES:
24.1. Constant field extensions 281
Algebraic Function Fields, Release 10.4
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); R.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: E = F.extension_constant_field(GF(2^3))
sage: p = F.get_place(3)
sage: d = E.conorm_place(p)
sage: [[Link]() for pl in [Link]()]
[1, 1, 1]
sage: p = F.get_place(2)
sage: d = E.conorm_place(p)
sage: [[Link]() for pl in [Link]()]
[2]
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ Y ]; (Y,) = R._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> E = F.extension_constant_field(GF(Integer(2)**Integer(3)))
>>> p = F.get_place(Integer(3))
>>> d = E.conorm_place(p)
>>> [[Link]() for pl in [Link]()]
[1, 1, 1]
>>> p = F.get_place(Integer(2))
>>> d = E.conorm_place(p)
>>> [[Link]() for pl in [Link]()]
[2]
defining_morphism()
Return the defining morphism of this extension.
This is the morphism from the base to the top.
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); R.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: E = F.extension_constant_field(GF(2^3))
sage: E.defining_morphism()
Function Field morphism:
From: Function field in y defined by y^3 + x^6 + x^4 + x^2
To: Function field in y defined by y^3 + x^6 + x^4 + x^2
Defn: y |--> y
x |--> x
1 |--> 1
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ Y ]; (Y,) = R._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> E = F.extension_constant_field(GF(Integer(2)**Integer(3)))
>>> E.defining_morphism()
Function Field morphism:
(continues on next page)
282 Chapter 24. Special extensions of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
From: Function field in y defined by y^3 + x^6 + x^4 + x^2
To: Function field in y defined by y^3 + x^6 + x^4 + x^2
Defn: y |--> y
x |--> x
1 |--> 1
top()
Return the top function field of this extension.
EXAMPLES:
sage: # needs [Link].finite_rings [Link].function_field
sage: K.<x> = FunctionField(GF(2)); R.<Y> = K[]
sage: F.<y> = [Link](Y^3 - x^2*(x^2 + x + 1)^2)
sage: E = F.extension_constant_field(GF(2^3))
sage: [Link]()
Function field in y defined by y^3 + x^6 + x^4 + x^2
>>> from [Link] import *
>>> # needs [Link].finite_rings [Link].function_field
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ R = K[ Y ]; (Y,) = R._first_ngens(1)
>>> F = [Link](Y**Integer(3) - x**Integer(2)*(x**Integer(2) + x +␣
˓→Integer(1))**Integer(2), names=( y ,)); (y,) = F._first_ngens(1)
>>> E = F.extension_constant_field(GF(Integer(2)**Integer(3)))
>>> [Link]()
Function field in y defined by y^3 + x^6 + x^4 + x^2
class [Link].function_field.[Link]
Bases: RingExtension_generic
Abstract base class of function field extensions.
24.1. Constant field extensions 283
Algebraic Function Fields, Release 10.4
284 Chapter 24. Special extensions of function fields
CHAPTER
TWENTYFIVE
FACTORIES TO CONSTRUCT FUNCTION FIELDS
This module provides factories to construct function fields. These factories are only for internal use.
EXAMPLES:
sage: K.<x> = FunctionField(QQ); K
Rational function field in x over Rational Field
sage: L.<x> = FunctionField(QQ); L
Rational function field in x over Rational Field
sage: K is L
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); K
Rational function field in x over Rational Field
>>> L = FunctionField(QQ, names=( x ,)); (x,) = L._first_ngens(1); L
Rational function field in x over Rational Field
>>> K is L
True
AUTHORS:
• William Stein (2010): initial version
• Maarten Derickx (2011-09-11): added FunctionField_polymod_Constructor, use
@cached_function
• Julian Rueth (2011-09-14): replaced @cached_function with UniqueFactory
class [Link].function_field.[Link]
Bases: UniqueFactory
Create a function field defined as an extension of another function field by adjoining a root of a univariate polynomial.
The returned function field is unique in the sense that if you call this function twice with an equal polynomial
and names it returns the same python object in both calls.
INPUT:
• polynomial – univariate polynomial over a function field
• names – variable names (as a tuple of length 1 or string)
• category – category (defaults to category of function fields)
EXAMPLES:
285
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: y2 = y*1
sage: y2 is y
False
sage: L.<w> = [Link](x - y^2) #␣
˓→needs [Link].function_field
sage: M.<w> = [Link](x - y2^2) #␣
˓→needs [Link].function_field
sage: L is M #␣
˓→needs [Link].function_field
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> y2 = y*Integer(1)
>>> y2 is y
False
>>> L = [Link](x - y**Integer(2), names=( w ,)); (w,) = L._first_ngens(1)#␣
˓→needs [Link].function_field
>>> M = [Link](x - y2**Integer(2), names=( w ,)); (w,) = M._first_ngens(1)#␣
˓→needs [Link].function_field
>>> L is M #␣
˓→needs [Link].function_field
True
create_key(polynomial, names)
Given the arguments and keywords, create a key that uniquely determines this object.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<w> = [Link](x - y^2) # indirect doctest #␣
˓→needs [Link].function_field
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](x - y**Integer(2), names=( w ,)); (w,) = L._first_ngens(1)
˓→# indirect doctest # needs [Link].function_field
create_object(version, key, **extra_args)
Create the object from the key and extra arguments. This is only called if the object was not found in the
cache.
EXAMPLES:
sage: K.<x> = FunctionField(QQ)
sage: R.<y> = K[]
sage: L.<w> = [Link](x - y^2) # indirect doctest #␣
˓→needs [Link].function_field
sage: y2 = y*1
sage: M.<w> = [Link](x - y2^2) # indirect doctest #␣
˓→needs [Link].function_field
(continues on next page)
286 Chapter 25. Factories to construct function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: L is M #␣
˓→needs [Link].function_field
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)
>>> R = K[ y ]; (y,) = R._first_ngens(1)
>>> L = [Link](x - y**Integer(2), names=( w ,)); (w,) = L._first_ngens(1)
˓→# indirect doctest # needs [Link].function_field
>>> y2 = y*Integer(1)
>>> M = [Link](x - y2**Integer(2), names=( w ,)); (w,) = M._first_
˓→ngens(1)# indirect doctest # needs [Link].function_
˓→field
>>> L is M #␣
˓→needs [Link].function_field
True
class [Link].function_field.[Link]
Bases: UniqueFactory
Return the function field in one variable with constant field F. The function field returned is unique in the sense that
if you call this function twice with the same base field and name then you get the same python object back.
INPUT:
• F – field
• names – name of variable as a string or a tuple containing a string
EXAMPLES:
sage: K.<x> = FunctionField(QQ); K
Rational function field in x over Rational Field
sage: L.<y> = FunctionField(GF(7)); L
Rational function field in y over Finite Field of size 7
sage: R.<z> = L[]
sage: M.<z> = [Link](z^7 - z - y); M #␣
˓→needs [Link].finite_rings [Link].function_field
Function field in z defined by z^7 + 6*z + 6*y
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1); K
Rational function field in x over Rational Field
>>> L = FunctionField(GF(Integer(7)), names=( y ,)); (y,) = L._first_ngens(1); L
Rational function field in y over Finite Field of size 7
>>> R = L[ z ]; (z,) = R._first_ngens(1)
>>> M = [Link](z**Integer(7) - z - y, names=( z ,)); (z,) = M._first_
˓→ngens(1); M # needs [Link].finite_
˓→rings [Link].function_field
Function field in z defined by z^7 + 6*z + 6*y
create_key(F, names)
Given the arguments and keywords, create a key that uniquely determines this object.
EXAMPLES:
sage: K.<x> = FunctionField(QQ) # indirect doctest
287
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)# indirect␣
˓→doctest
create_object(version, key, **extra_args)
Create the object from the key and extra arguments. This is only called if the object was not found in the
cache.
EXAMPLES:
sage: K.<x> = FunctionField(QQ) # indirect doctest
sage: L.<x> = FunctionField(QQ) # indirect doctest
sage: K is L
True
>>> from [Link] import *
>>> K = FunctionField(QQ, names=( x ,)); (x,) = K._first_ngens(1)# indirect␣
˓→doctest
>>> L = FunctionField(QQ, names=( x ,)); (x,) = L._first_ngens(1)# indirect␣
˓→doctest
>>> K is L
True
A basic reference for the theory of algebraic function fields is [Stich2009].
288 Chapter 25. Factories to construct function fields
CHAPTER
TWENTYSIX
JACOBIANS OF FUNCTION FIELDS
Arithmetic in Jacobians of function fields are available in two flavors.
26.1 Jacobians of function fields
This module provides base classes for Jacobians of function fields.
26.1.1 Jacobian
The Jacobian of a function field is created by default in the Hess model, with a base divisor of degree 𝑔 the genus of the
function field. The base divisor is automatically chosen if not given.
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: F = C.function_field()
sage: J = [Link]()
sage: J
Jacobian of Function field in z defined by z^3 + 23*y^2*z + 6 (Hess model)
sage: J.base_divisor().degree()
1
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,)); (x, y,␣
˓→z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> F = C.function_field()
>>> J = [Link]()
>>> J
Jacobian of Function field in z defined by z^3 + 23*y^2*z + 6 (Hess model)
>>> J.base_divisor().degree()
1
Explicitly specify a model if you want Jacobians in different models.
sage: J_km = [Link](model= km_large )
sage: J_km
Jacobian of Function field in z defined by z^3 + 23*y^2*z + 6 (Khuri-Makdisi large␣
˓→model)
289
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> J_km = [Link](model= km_large )
>>> J_km
Jacobian of Function field in z defined by z^3 + 23*y^2*z + 6 (Khuri-Makdisi large␣
˓→model)
26.1.2 Group of rational points
The group of rational points of a Jacobian is created from the Jacobian. A point of the Jacobian group is determined by
a divisor of degree zero. To represent the point, a divisor of the form 𝐷 − 𝐵 is selected where 𝐷 is an effective divisor
of the same degree with the base divisor 𝐵. Hence the point is simply represented by the divisor 𝐷.
sage: G = [Link]()
sage: [Link]()
30
sage: pl1 = C([1,8,1]).place()
sage: pl2 = C([2,10,1]).place()
sage: p1 = [Link](pl1 - pl2)
sage: p1
[Place (y + 1, z + 6)]
sage: p2 = [Link](pl2 - pl1)
sage: p2
[Place (y + 28, z + 6)]
sage: p1 + p2 == [Link]()
True
sage: [Link]()
5
>>> from [Link] import *
>>> G = [Link]()
>>> [Link]()
30
>>> pl1 = C([Integer(1),Integer(8),Integer(1)]).place()
>>> pl2 = C([Integer(2),Integer(10),Integer(1)]).place()
>>> p1 = [Link](pl1 - pl2)
>>> p1
[Place (y + 1, z + 6)]
>>> p2 = [Link](pl2 - pl1)
>>> p2
[Place (y + 28, z + 6)]
>>> p1 + p2 == [Link]()
True
>>> [Link]()
5
We can get the corresponding point in the Jacobian in a different model.
sage: p1km = J_km(p1)
sage: [Link]()
5
sage: p1km
Point of Jacobian determined by
[ 1 0 0 0 0 0 11 0 0]
[ 0 1 0 0 0 0 18 0 0]
[ 0 0 1 0 0 0 11 0 0]
(continues on next page)
290 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
[ 0 0 0 1 0 0 18 1 0]
[ 0 0 0 0 1 0 25 0 19]
[ 0 0 0 0 0 1 8 8 0]
>>> from [Link] import *
>>> p1km = J_km(p1)
>>> [Link]()
5
>>> p1km
Point of Jacobian determined by
[ 1 0 0 0 0 0 11 0 0]
[ 0 1 0 0 0 0 18 0 0]
[ 0 0 1 0 0 0 11 0 0]
[ 0 0 0 1 0 0 18 1 0]
[ 0 0 0 0 1 0 25 0 19]
[ 0 0 0 0 0 1 8 8 0]
AUTHORS:
• Kwankyu Lee (2022-01-24): initial version
class [Link].function_field.jacobian_base.JacobianGroupFunctor(base_field,
field)
Bases: ConstructionFunctor
A construction functor for Jacobian groups.
EXAMPLES:
sage: k = GF(7)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: J = [Link](model= hess )
sage: G = [Link]()
sage: F, obj = [Link]()
sage: F
JacobianGroupFunctor
>>> from [Link] import *
>>> k = GF(Integer(7))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) = P2._
˓→first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> J = [Link](model= hess )
>>> G = [Link]()
>>> F, obj = [Link]()
>>> F
JacobianGroupFunctor
merge(other)
Return the functor merging self and other
INPUT:
• other – a functor
EXAMPLES:
26.1. Jacobians of function fields 291
Algebraic Function Fields, Release 10.4
sage: k = GF(7)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: J = [Link](model= hess )
sage: K2 = [Link](2)
sage: G2 = [Link](K2)
sage: K3 = [Link](3)
sage: G3 = [Link](K3)
sage: [Link](G2, G3) # indirect doctest
Group of rational points of Jacobian over Finite Field in z6 of size 7^6␣
˓→(Hess model)
>>> from [Link] import *
>>> k = GF(Integer(7))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) =␣
˓→P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> J = [Link](model= hess )
>>> K2 = [Link](Integer(2))
>>> G2 = [Link](K2)
>>> K3 = [Link](Integer(3))
>>> G3 = [Link](K3)
>>> [Link](G2, G3) # indirect doctest
Group of rational points of Jacobian over Finite Field in z6 of size 7^6␣
˓→(Hess model)
rank = 20
class [Link].function_field.jacobian_base.JacobianGroup_base(parent,
function_field,
base_div)
Bases: Parent
Groups of rational points of Jacobians.
INPUT:
• parent – a Jacobian
• function_field – a function field
• base_div – an effective divisor of the function field
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: J = [Link](model= hess )
sage: [Link]()
Group of rational points of Jacobian over Finite Field of size 7 (Hess model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,)); (x,␣
˓→y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> J = [Link](model= hess )
>>> [Link]()
Group of rational points of Jacobian over Finite Field of size 7 (Hess model)
292 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
base_divisor()
Return the base divisor that is used to represent points of this group.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: G = [Link]()
sage: G.base_divisor()
Place (1/y, 1/y*z)
sage: _ == 1*b
True
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> G = [Link]()
>>> G.base_divisor()
Place (1/y, 1/y*z)
>>> _ == Integer(1)*b
True
The base divisor is the denominator (negative part) of the divisor of degree zero that represents a point.
sage: p = C([-1,2,1]).place()
sage: [Link](p - b).divisor()
- Place (1/y, 1/y*z)
+ Place (y + 2, z + 1)
>>> from [Link] import *
>>> p = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> [Link](p - b).divisor()
- Place (1/y, 1/y*z)
+ Place (y + 2, z + 1)
construction()
Return the data for a functorial construction of this Jacobian group.
EXAMPLES:
sage: k = GF(7)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: J = [Link](model= hess )
sage: K2 = [Link](2)
sage: G2 = [Link](K2)
sage: K3= [Link](3)
sage: G3 = [Link](K3)
sage: p1, p2 = G2.get_points(2)
sage: q1, q2 = G3.get_points(2)
sage: (p1 + q1).parent() is (p2 + q2).parent()
True
26.1. Jacobians of function fields 293
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> k = GF(Integer(7))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) =␣
˓→P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> J = [Link](model= hess )
>>> K2 = [Link](Integer(2))
>>> G2 = [Link](K2)
>>> K3= [Link](Integer(3))
>>> G3 = [Link](K3)
>>> p1, p2 = G2.get_points(Integer(2))
>>> q1, q2 = G3.get_points(Integer(2))
>>> (p1 + q1).parent() is (p2 + q2).parent()
True
function_field()
Return the function field to which this Jacobian group attached.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: J = [Link](model= hess )
sage: G = [Link]()
sage: G.function_field()
Function field in z defined by z^3 + 4*y^2*z + 3
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> J = [Link](model= hess )
>>> G = [Link]()
>>> G.function_field()
Function field in z defined by z^3 + 4*y^2*z + 3
parent()
Return the Jacobian to which this Jacobian group belongs.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: J = [Link](model= hess )
sage: G = [Link]()
sage: [Link]()
Jacobian of Projective Plane Curve over Finite Field of size 7
defined by x^3 - y^2*z - 2*z^3 (Hess model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> J = [Link](model= hess )
>>> G = [Link]()
>>> [Link]()
(continues on next page)
294 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Jacobian of Projective Plane Curve over Finite Field of size 7
defined by x^3 - y^2*z - 2*z^3 (Hess model)
class [Link].function_field.jacobian_base.JacobianGroup_finite_field_base(par-
ent,
func-
tion_field,
base_div)
Bases: JacobianGroup_base
Jacobian groups of function fields over finite fields.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: [Link]()
Group of rational points of Jacobian over Finite Field of size 7 (Hess model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,)); (x,␣
˓→y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> [Link]()
Group of rational points of Jacobian over Finite Field of size 7 (Hess model)
get_points(n)
Return 𝑛 points of the Jacobian group.
If 𝑛 is greater than the order of the group, then returns all points of the group.
INPUT:
• n – an integer
EXAMPLES:
sage: k = GF(7)
sage: A.<x,y> = AffineSpace(k,2)
sage: C = Curve(y^2 + x^3 + 2*x + 1).projective_closure()
sage: J = [Link](model= hess )
sage: G = [Link]()
sage: pts = G.get_points([Link]())
sage: len(pts)
11
>>> from [Link] import *
>>> k = GF(Integer(7))
>>> A = AffineSpace(k,Integer(2), names=( x , y ,)); (x, y,) = A._first_
˓→ngens(2)
>>> C = Curve(y**Integer(2) + x**Integer(3) + Integer(2)*x + Integer(1)).
˓→projective_closure()
>>> J = [Link](model= hess )
(continues on next page)
26.1. Jacobians of function fields 295
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> G = [Link]()
>>> pts = G.get_points([Link]())
>>> len(pts)
11
order(algorithm='numeric')
Return the order of the Jacobian group.
INPUT:
• algorithm – numeric (default) or algebraic
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: G = [Link]()
sage: [Link]()
7
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> G = [Link]()
>>> [Link]()
7
class [Link].function_field.jacobian_base.JacobianPoint_base
Bases: ModuleElement
Abstract base class of points of Jacobian groups.
class [Link].function_field.jacobian_base.JacobianPoint_finite_field_base
Bases: JacobianPoint_base
Points of Jacobians over finite fields.
frobenius()
Return the image of the point acted by the Frobenius automorphism.
EXAMPLES:
sage: k = GF(7)
sage: A.<x,y> = AffineSpace(k,2)
sage: C = Curve(y^2 + x^3 + 2*x + 1).projective_closure()
sage: J = [Link](model= hess )
sage: G1 = [Link]()
sage: [Link]()
11
sage: K = [Link](3)
sage: G3 = [Link](K)
sage: pts1 = G1.get_points(11)
sage: pts3 = G3.get_points(12)
(continues on next page)
296 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: pt = next(pt for pt in pts3 if pt not in pts1)
sage: [Link]() == pt
False
sage: [Link]().frobenius().frobenius() == pt
True
>>> from [Link] import *
>>> k = GF(Integer(7))
>>> A = AffineSpace(k,Integer(2), names=( x , y ,)); (x, y,) = A._first_
˓→ngens(2)
>>> C = Curve(y**Integer(2) + x**Integer(3) + Integer(2)*x + Integer(1)).
˓→projective_closure()
>>> J = [Link](model= hess )
>>> G1 = [Link]()
>>> [Link]()
11
>>> K = [Link](Integer(3))
>>> G3 = [Link](K)
>>> pts1 = G1.get_points(Integer(11))
>>> pts3 = G3.get_points(Integer(12))
>>> pt = next(pt for pt in pts3 if pt not in pts1)
>>> [Link]() == pt
False
>>> [Link]().frobenius().frobenius() == pt
True
order()
Return the order of this point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: F = C.function_field()
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: b = F.get_place(1)
sage: pl = C([-1,2,1]).place()
sage: p = [Link](pl - b)
sage: [Link]()
15
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> F = C.function_field()
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> b = F.get_place(Integer(1))
>>> pl = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> p = [Link](pl - b)
>>> [Link]()
15
26.1. Jacobians of function fields 297
Algebraic Function Fields, Release 10.4
ALGORITHM: Shanks’ Baby Step Giant Step
class [Link].function_field.jacobian_base.Jacobian_base(function_field, base_div,
**kwds)
Bases: Parent
Jacobians of function fields.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: [Link]()
Jacobian of Function field in y defined by y^2 + y + (x^2 + 1)/x (Hess model)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1); _␣
˓→= K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,) = F.
˓→_first_ngens(1)
>>> [Link]()
Jacobian of Function field in y defined by y^2 + y + (x^2 + 1)/x (Hess model)
base_curve()
Return the base curve or the function field that abstractly defines a curve.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: J = [Link]()
sage: J.base_curve()
Function field in y defined by y^2 + y + (x^2 + 1)/x
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> J = [Link]()
>>> J.base_curve()
Function field in y defined by y^2 + y + (x^2 + 1)/x
base_divisor()
Return the base divisor used to construct the Jacobian.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: b = F.get_place(1)
sage: J = [Link](base_div=b)
sage: J.base_divisor() == b
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
(continues on next page)
298 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> b = F.get_place(Integer(1))
>>> J = [Link](base_div=b)
>>> J.base_divisor() == b
True
curve()
Return the projective curve to which this Jacobian is attached.
If the Jacobian was constructed from a function field, then returns nothing.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: J = [Link]()
sage: [Link]()
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> J = [Link]()
>>> [Link]()
facade_for()
Return the system of groups that this Jacobian is a facade for.
The Jacobian can be seen as a facade for all groups of rational points over field extensions of the base constant
field of the function field. This method returns only the internally constructed system of such groups.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: J = [Link]()
sage: J.facade_for()
[Group of rational points of Jacobian over Finite Field of size 2 (Hess␣
˓→model)]
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> J = [Link]()
>>> J.facade_for()
[Group of rational points of Jacobian over Finite Field of size 2 (Hess␣
˓→model)]
group(k_ext=None)
Return the group of rational points of the Jacobian.
EXAMPLES:
26.1. Jacobians of function fields 299
Algebraic Function Fields, Release 10.4
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: b = F.get_place(1)
sage: J = [Link](base_div=b)
sage: [Link]()
Group of rational points of Jacobian over Finite Field of size 2 (Hess model)
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> b = F.get_place(Integer(1))
>>> J = [Link](base_div=b)
>>> [Link]()
Group of rational points of Jacobian over Finite Field of size 2 (Hess model)
set_base_place(place)
Set place as the base place.
INPUT:
• place – a rational place of the function field.
The base place 𝐵 is used to map a rational place 𝑃 of the function field to the point of the Jacobian defined
by the divisor 𝑃 − 𝐵.
EXAMPLES:
sage: K.<x> = FunctionField(GF(2)); _.<Y> = K[]
sage: F.<y> = [Link](Y^2 + Y + x + 1/x)
sage: J = [Link]()
sage: B = F.get_place(1)
sage: J.set_base_place(B)
sage: Q = [Link]()[-1]
sage: J(Q)
[Place (x + 1, x*y + 1)]
sage: J(Q).parent()
Group of rational points of Jacobian over Finite Field of size 2 (Hess model)
sage: J(B)
[Place (x, x*y)]
sage: J(B).is_zero()
True
>>> from [Link] import *
>>> K = FunctionField(GF(Integer(2)), names=( x ,)); (x,) = K._first_ngens(1);
˓→ _ = K[ Y ]; (Y,) = _._first_ngens(1)
>>> F = [Link](Y**Integer(2) + Y + x + Integer(1)/x, names=( y ,)); (y,)␣
˓→= F._first_ngens(1)
>>> J = [Link]()
>>> B = F.get_place(Integer(1))
>>> J.set_base_place(B)
>>> Q = [Link]()[-Integer(1)]
>>> J(Q)
[Place (x + 1, x*y + 1)]
>>> J(Q).parent()
Group of rational points of Jacobian over Finite Field of size 2 (Hess model)
>>> J(B)
(continues on next page)
300 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
[Place (x, x*y)]
>>> J(B).is_zero()
True
26.2 Jacobians in Hess model
This module implements Jacobian arithmetic based on divisor representation by ideals. This approach to Jacobian arith-
metic implementation is attributed to Hess [Hes2002].
26.2.1 Jacobian
To create a Jacobian in Hess model, specify hess model and provide a base divisor of degree 𝑔, which is the genus
of the function field:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: C.geometric_genus()
1
sage: B = C([0,1,0]).place()
sage: [Link]()
1
sage: J = [Link](model= hess , base_div=B)
sage: J
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Hess model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,)); (x, y,␣
˓→z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> C.geometric_genus()
1
>>> B = C([Integer(0),Integer(1),Integer(0)]).place()
>>> [Link]()
1
>>> J = [Link](model= hess , base_div=B)
>>> J
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Hess model)
26.2.2 Group of rational points
The group of rational points of a Jacobian is created from the Jacobian. A point of the Jacobian group is determined by a
divisor (of degree zero) of the form 𝐷 − 𝐵 where 𝐷 is an effective divisor of degree 𝑔 and 𝐵 is the base divisor. Hence
a point of the Jacobian group is represented by 𝐷.
sage: G = [Link]()
sage: P1 = C([1,8,1]).place()
sage: P2 = C([2,10,1]).place()
sage: p1 = G(P1)
(continues on next page)
26.2. Jacobians in Hess model 301
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: p2 = G(P2)
sage: p1
[Place (y + 21, z + 28)]
sage: p2
[Place (y + 24, z + 14)]
sage: p1 + p2
[Place (y + 8, z + 28)]
>>> from [Link] import *
>>> G = [Link]()
>>> P1 = C([Integer(1),Integer(8),Integer(1)]).place()
>>> P2 = C([Integer(2),Integer(10),Integer(1)]).place()
>>> p1 = G(P1)
>>> p2 = G(P2)
>>> p1
[Place (y + 21, z + 28)]
>>> p2
[Place (y + 24, z + 14)]
>>> p1 + p2
[Place (y + 8, z + 28)]
AUTHORS:
• Kwankyu Lee (2022-01-24): initial version
class [Link].function_field.jacobian_hess.Jacobian(function_field, base_div, **kwds)
Bases: Jacobian_base, UniqueRepresentation
Jacobians of function fields.
EXAMPLES:
sage: k = GF(17)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: [Link](model= hess , base_div=b)
Jacobian of Projective Plane Curve over Finite Field of size 17
defined by x^3 - y^2*z + 5*z^3 (Hess model)
>>> from [Link] import *
>>> k = GF(Integer(17))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) = P2._
˓→first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> [Link](model= hess , base_div=b)
Jacobian of Projective Plane Curve over Finite Field of size 17
defined by x^3 - y^2*z + 5*z^3 (Hess model)
class [Link].function_field.jacobian_hess.JacobianGroup(parent, function_field,
base_div)
Bases: UniqueRepresentation, JacobianGroup_base
Groups of rational points of a Jacobian.
INPUT:
302 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
• parent – a Jacobian
• function_field – a function field
• base_div – an effective divisor of the function field
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(17), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: [Link]()
Group of rational points of Jacobian
over Finite Field of size 17 (Hess model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(17)), Integer(2), names=( x , y , z ,)); (x,
˓→ y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> [Link]()
Group of rational points of Jacobian
over Finite Field of size 17 (Hess model)
Element
alias of JacobianPoint
point(divisor)
Return the point represented by the divisor of degree zero.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(17), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: G = [Link]()
sage: p = C([-1,2,1]).place()
sage: [Link](p - b)
[Place (y + 2, z + 1)]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(17)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> G = [Link]()
>>> p = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> [Link](p - b)
[Place (y + 2, z + 1)]
zero()
Return the zero element of this group.
EXAMPLES:
26.2. Jacobians in Hess model 303
Algebraic Function Fields, Release 10.4
sage: P2.<x,y,z> = ProjectiveSpace(GF(17), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: G = [Link]()
sage: [Link]()
[Place (1/y, 1/y*z)]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(17)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> G = [Link]()
>>> [Link]()
[Place (1/y, 1/y*z)]
class [Link].function_field.jacobian_hess.JacobianGroupEmbedding(base_group,
exten-
sion_group)
Bases: Map
Embeddings between Jacobian groups.
INPUT:
• base_group – Jacobian group over a base field
• extension_group – Jacobian group over an extension field
EXAMPLES:
sage: k = GF(17)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: G1 = [Link]()
sage: K = [Link](3)
sage: G3 = [Link](K)
sage: G3.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 17 (Hess model)
To: Group of rational points of Jacobian
over Finite Field in z3 of size 17^3 (Hess model)
>>> from [Link] import *
>>> k = GF(Integer(17))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) = P2._
˓→first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> G1 = [Link]()
>>> K = [Link](Integer(3))
>>> G3 = [Link](K)
(continues on next page)
304 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> G3.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 17 (Hess model)
To: Group of rational points of Jacobian
over Finite Field in z3 of size 17^3 (Hess model)
class [Link].function_field.jacobian_hess.JacobianGroup_finite_field(parent,
func-
tion_field,
base_div)
Bases: JacobianGroup, JacobianGroup_finite_field_base
Jacobian groups of function fields over finite fields
INPUT:
• parent – a Jacobian
• function_field – a function field
• base_div – an effective divisor of the function field
EXAMPLES:
sage: k = GF(17)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: J = [Link](model= hess , base_div=b)
sage: G1 = [Link]()
sage: K = [Link](3)
sage: G3 = [Link](K)
sage: G3.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 17 (Hess model)
To: Group of rational points of Jacobian
over Finite Field in z3 of size 17^3 (Hess model)
>>> from [Link] import *
>>> k = GF(Integer(17))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) = P2._
˓→first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> J = [Link](model= hess , base_div=b)
>>> G1 = [Link]()
>>> K = [Link](Integer(3))
>>> G3 = [Link](K)
>>> G3.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 17 (Hess model)
To: Group of rational points of Jacobian
over Finite Field in z3 of size 17^3 (Hess model)
Element
26.2. Jacobians in Hess model 305
Algebraic Function Fields, Release 10.4
alias of JacobianPoint_finite_field
class [Link].function_field.jacobian_hess.JacobianPoint(parent, dS, ds)
Bases: JacobianPoint_base
Points of Jacobians represented by a pair of ideals.
If a point of Jacobian is determined by 𝐷, then the divisor 𝐷 is represented by a pair of ideals in the finite maximal
order and the infinite maximal order of the function field.
For efficiency reasons, the actual ideals stored are the inverted ideals of the ideals representing the divisor 𝐷.
INPUT:
• parent – Jacobian group
• dS – an ideal of the finite maximal order of a function field
• ds – an ideal of infinite maximal order of a function field
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: G = [Link](model= hess , base_div=b).group()
sage: pl = C([1,8,1]).place()
sage: p = [Link](pl - b)
sage: dS, ds = p._data
sage: -([Link]() + [Link]()) == pl
True
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,)); (x,
˓→ y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> G = [Link](model= hess , base_div=b).group()
>>> pl = C([Integer(1),Integer(8),Integer(1)]).place()
>>> p = [Link](pl - b)
>>> dS, ds = p._data
>>> -([Link]() + [Link]()) == pl
True
addflip(other)
Return the addflip of this and other point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: G = [Link](model= hess , base_div=b).group()
sage: pl1 = C([-1,2,1]).place()
sage: pl2 = C([2,19,1]).place()
sage: p1 = [Link](pl1 - b)
sage: p2 = [Link](pl2 - b)
sage: [Link](p2)
[Place (y + 8, z + 27)]
(continues on next page)
306 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: _ == -(p1 + p2)
True
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> G = [Link](model= hess , base_div=b).group()
>>> pl1 = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> pl2 = C([Integer(2),Integer(19),Integer(1)]).place()
>>> p1 = [Link](pl1 - b)
>>> p2 = [Link](pl2 - b)
>>> [Link](p2)
[Place (y + 8, z + 27)]
>>> _ == -(p1 + p2)
True
defining_divisor()
Return the effective divisor that defines this point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: G = [Link](model= hess , base_div=b).group()
sage: pl = C([-1,2,1]).place()
sage: p = [Link](pl - b)
sage: p.defining_divisor() == pl
True
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> G = [Link](model= hess , base_div=b).group()
>>> pl = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> p = [Link](pl - b)
>>> p.defining_divisor() == pl
True
divisor()
Return the divisor representing this point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: G = [Link](model= hess , base_div=b).group()
sage: pl = C([-1,2,1]).place()
sage: p = [Link](pl - b)
sage: [Link]([Link]()) == p
True
26.2. Jacobians in Hess model 307
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> G = [Link](model= hess , base_div=b).group()
>>> pl = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> p = [Link](pl - b)
>>> [Link]([Link]()) == p
True
multiple(n)
Return the n-th multiple of this point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: G = [Link](model= hess , base_div=b).group()
sage: pl = C([-1,2,1]).place()
sage: p = [Link](pl - b)
sage: [Link](100)
[Place (1/y, 1/y*z + 8)]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> G = [Link](model= hess , base_div=b).group()
>>> pl = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> p = [Link](pl - b)
>>> [Link](Integer(100))
[Place (1/y, 1/y*z + 8)]
order(bound=None)
Return the order of this point.
ALGORITHM: Shanks’ Baby Step Giant Step
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: G = [Link](model= hess , base_div=b).group()
sage: p = C([-1,2,1]).place()
sage: pt = [Link](p - b)
sage: [Link]()
30
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,));
˓→ (x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
(continues on next page)
308 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> G = [Link](model= hess , base_div=b).group()
>>> p = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> pt = [Link](p - b)
>>> [Link]()
30
class [Link].function_field.jacobian_hess.JacobianPoint_finite_field(parent,
dS, ds)
Bases: JacobianPoint, JacobianPoint_finite_field_base
Points of Jacobians over finite fields
26.3 Jacobians in Khuri-Makdisi model
This module implements Jacobian arithmetic by Khuri-Makdisi’s algorithms [Khu2004] based on divisor representation
by linear spaces.
26.3.1 Jacobian
There are three models for Jacobian arithmetic by Khuri-Makdisi’s algorithms. For each of the models, one should provide
a base divisor satisfying certain degree condition. The following lists the names of the three models and the corresponding
conditions on base divisors. Let 𝑔 be the genus of the function field.
• km_large: large model; requires an effective divisor of degree at least 2𝑔 + 1
• km_medium: medium model; requires an effective divisor of degree at least 2𝑔 + 1
• km_small: small model; requires an effective divisor of degree at least 𝑔 + 1
To create a Jacobian in this model, specify km_[large|medium|small] as model and provide a base divisor
satisfying the degree condition.
EXAMPLES:
We construct a function field (of a projective curve) over a finite field:
sage: P2.<x,y,z> = ProjectiveSpace(GF(29), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: C.geometric_genus()
1
sage: H = [Link](y/x).divisor_of_poles()
sage: [Link]()
3
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(29)), Integer(2), names=( x , y , z ,)); (x, y,␣
˓→z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> C.geometric_genus()
1
>>> H = [Link](y/x).divisor_of_poles()
>>> [Link]()
3
Now we use 𝐻 as base divisor for the large and medium models:
26.3. Jacobians in Khuri-Makdisi model 309
Algebraic Function Fields, Release 10.4
sage: J_large = [Link](model= km_large , base_div=H)
sage: J_large
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi large model)
sage: J_medium = [Link](model= km_medium , base_div=H)
sage: J_medium
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi medium model)
>>> from [Link] import *
>>> J_large = [Link](model= km_large , base_div=H)
>>> J_large
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi large model)
>>> J_medium = [Link](model= km_medium , base_div=H)
>>> J_medium
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi medium model)
and for the small model, we construct an effective divisor of degree 2:
sage: B = sum([Link]()[:2])
sage: [Link]()
2
sage: J_small = [Link](model= km_small , base_div=B)
sage: J_small
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi small model)
>>> from [Link] import *
>>> B = sum([Link]()[:Integer(2)])
>>> [Link]()
2
>>> J_small = [Link](model= km_small , base_div=B)
>>> J_small
Jacobian of Projective Plane Curve over Finite Field of size 29
defined by x^3 - y^2*z + 5*z^3 (Khuri-Makdisi small model)
26.3.2 Group of rational points
The group of rational points of a Jacobian is created from the Jacobian. A point of the Jacobian group is represented
by a divisor 𝐷 − 𝐵 where 𝐷 is an effective divisor of the same degree with the base divisor 𝐵. The divisor 𝐷 in turn
is determined by a linear subspace of the Riemann-Roch space associated with certain multiple of 𝐵 (depending on the
model). This allows representing points of Jacobian as matrices once we fix a basis of the Riemann-Roch space.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(17), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: F = C.function_field()
sage: H = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=H)
sage: G = [Link]()
sage: D = C([0,1,0]).place()
sage: P1 = C([-1,2,1]).place()
(continues on next page)
310 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: P2 = C([3,7,1]).place()
sage: p1 = [Link](P1 - D)
sage: p2 = [Link](P2 - D)
sage: p1
Point of Jacobian determined by
[ 1 0 0 0 0 0 0 12 15]
[ 0 1 0 0 0 0 0 0 13]
[ 0 0 1 0 0 0 0 0 2]
[ 0 0 0 1 0 0 0 0 16]
[ 0 0 0 0 0 1 0 0 15]
[ 0 0 0 0 0 0 1 0 1]
sage: p2
Point of Jacobian determined by
[ 1 0 0 0 0 0 0 12 5]
[ 0 1 0 0 0 0 0 0 2]
[ 0 0 1 0 0 0 0 0 13]
[ 0 0 0 1 0 0 0 0 8]
[ 0 0 0 0 0 1 0 0 10]
[ 0 0 0 0 0 0 1 0 14]
sage: p1 + p2
Point of Jacobian determined by
[ 1 0 0 0 0 16 0 5 3]
[ 0 1 0 0 0 6 0 8 16]
[ 0 0 1 0 0 15 0 3 10]
[ 0 0 0 1 0 3 0 0 0]
[ 0 0 0 0 1 12 0 16 8]
[ 0 0 0 0 0 0 1 3 0]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(17)), Integer(2), names=( x , y , z ,)); (x, y,␣
˓→z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> F = C.function_field()
>>> H = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=H)
>>> G = [Link]()
>>> D = C([Integer(0),Integer(1),Integer(0)]).place()
>>> P1 = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> P2 = C([Integer(3),Integer(7),Integer(1)]).place()
>>> p1 = [Link](P1 - D)
>>> p2 = [Link](P2 - D)
>>> p1
Point of Jacobian determined by
[ 1 0 0 0 0 0 0 12 15]
[ 0 1 0 0 0 0 0 0 13]
[ 0 0 1 0 0 0 0 0 2]
[ 0 0 0 1 0 0 0 0 16]
[ 0 0 0 0 0 1 0 0 15]
[ 0 0 0 0 0 0 1 0 1]
>>> p2
Point of Jacobian determined by
[ 1 0 0 0 0 0 0 12 5]
[ 0 1 0 0 0 0 0 0 2]
[ 0 0 1 0 0 0 0 0 13]
[ 0 0 0 1 0 0 0 0 8]
[ 0 0 0 0 0 1 0 0 10]
(continues on next page)
26.3. Jacobians in Khuri-Makdisi model 311
Algebraic Function Fields, Release 10.4
(continued from previous page)
[ 0 0 0 0 0 0 1 0 14]
>>> p1 + p2
Point of Jacobian determined by
[ 1 0 0 0 0 16 0 5 3]
[ 0 1 0 0 0 6 0 8 16]
[ 0 0 1 0 0 15 0 3 10]
[ 0 0 0 1 0 3 0 0 0]
[ 0 0 0 0 1 12 0 16 8]
[ 0 0 0 0 0 0 1 3 0]
AUTHORS:
• Kwankyu Lee (2022-01-24): initial version
class [Link].function_field.jacobian_khuri_makdisi.Jacobian(function_field,
base_div, model,
**kwds)
Bases: UniqueRepresentation, Jacobian_base
Jacobians implemented by Khuri-Makdisi’s algorithms.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: [Link](model= km )
Jacobian of Projective Plane Curve over Finite Field of size 7
defined by x^3 - y^2*z - 2*z^3 (Khuri-Makdisi large model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,)); (x,␣
˓→y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> [Link](model= km )
Jacobian of Projective Plane Curve over Finite Field of size 7
defined by x^3 - y^2*z - 2*z^3 (Khuri-Makdisi large model)
class [Link].function_field.jacobian_khuri_makdisi.JacobianGroup(parent, func-
tion_field,
base_div)
Bases: UniqueRepresentation, JacobianGroup_base
Groups of rational points of a Jacobian.
INPUT:
• parent – a Jacobian
• function_field – a function field
• base_div – an effective divisor of the function field
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: [Link]()
(continues on next page)
312 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
Group of rational points of Jacobian
over Finite Field of size 7 (Khuri-Makdisi large model)
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,)); (x,␣
˓→y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> [Link]()
Group of rational points of Jacobian
over Finite Field of size 7 (Khuri-Makdisi large model)
Element
alias of JacobianPoint
point(divisor)
Return the point represented by the divisor.
INPUT:
• divisor – a divisor of degree zero
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: b = C([0,1,0]).place()
sage: p = C([-1,2,1]).place()
sage: [Link](p - b)
Point of Jacobian determined by
[1 0 0 0 0 0 0 2 5]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 2]
[0 0 0 1 0 0 0 0 6]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 1]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> p = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> [Link](p - b)
Point of Jacobian determined by
[1 0 0 0 0 0 0 2 5]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 2]
[0 0 0 1 0 0 0 0 6]
(continues on next page)
26.3. Jacobians in Khuri-Makdisi model 313
Algebraic Function Fields, Release 10.4
(continued from previous page)
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 1]
zero()
Return the zero element of this group.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: [Link]()
Point of Jacobian determined by
[1 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> [Link]()
Point of Jacobian determined by
[1 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0]
class [Link].function_field.jacobian_khuri_makdisi.JacobianGroupEmbedding(base_group,
ex-
ten-
sion_group)
Bases: Map
Embeddings between Jacobian groups.
INPUT:
• base_group – Jacobian group over a base field
• extension_group – Jacobian group over an extension field
EXAMPLES:
sage: k = GF(5)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + z^3 - y^2*z, P2)
(continues on next page)
314 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G1 = [Link]()
sage: K = [Link](2)
sage: G2 = [Link](K)
sage: G2.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 5 (Khuri-Makdisi large model)
To: Group of rational points of Jacobian
over Finite Field in z2 of size 5^2 (Khuri-Makdisi large model)
>>> from [Link] import *
>>> k = GF(Integer(5))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) = P2._
˓→first_ngens(3)
>>> C = Curve(x**Integer(3) + z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G1 = [Link]()
>>> K = [Link](Integer(2))
>>> G2 = [Link](K)
>>> G2.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 5 (Khuri-Makdisi large model)
To: Group of rational points of Jacobian
over Finite Field in z2 of size 5^2 (Khuri-Makdisi large model)
class [Link].function_field.jacobian_khuri_makdisi.JacobianGroup_finite_field(par-
ent,
func-
tion_field,
base_div)
Bases: JacobianGroup, JacobianGroup_finite_field_base
Jacobian groups of function fields over finite fields.
INPUT:
• parent – a Jacobian
• function_field – a function field
• base_div – an effective divisor of the function field
EXAMPLES:
sage: k = GF(7)
sage: P2.<x,y,z> = ProjectiveSpace(k, 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G1 = [Link]()
sage: K = [Link](2)
sage: G2 = [Link](K)
sage: G2.coerce_map_from(G1)
Jacobian group embedding map:
(continues on next page)
26.3. Jacobians in Khuri-Makdisi model 315
Algebraic Function Fields, Release 10.4
(continued from previous page)
From: Group of rational points of Jacobian
over Finite Field of size 7 (Khuri-Makdisi large model)
To: Group of rational points of Jacobian
over Finite Field in z2 of size 7^2 (Khuri-Makdisi large model)
>>> from [Link] import *
>>> k = GF(Integer(7))
>>> P2 = ProjectiveSpace(k, Integer(2), names=( x , y , z ,)); (x, y, z,) = P2._
˓→first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G1 = [Link]()
>>> K = [Link](Integer(2))
>>> G2 = [Link](K)
>>> G2.coerce_map_from(G1)
Jacobian group embedding map:
From: Group of rational points of Jacobian
over Finite Field of size 7 (Khuri-Makdisi large model)
To: Group of rational points of Jacobian
over Finite Field in z2 of size 7^2 (Khuri-Makdisi large model)
Element
alias of JacobianPoint_finite_field
class [Link].function_field.jacobian_khuri_makdisi.JacobianPoint(parent, w)
Bases: JacobianPoint_base
Points of a Jacobian group.
INPUT:
• parent – Jacobian group
• w – matrix
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: b = C([0,1,0]).place()
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: pl = C([3,2,1]).place()
sage: [Link](pl - b)
Point of Jacobian determined by
[1 0 0 0 0 0 0 2 3]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 1]
[0 0 0 1 0 0 0 0 5]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 4]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,)); (x,␣
˓→y, z,) = P2._first_ngens(3)
(continues on next page)
316 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> pl = C([Integer(3),Integer(2),Integer(1)]).place()
>>> [Link](pl - b)
Point of Jacobian determined by
[1 0 0 0 0 0 0 2 3]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 1]
[0 0 0 1 0 0 0 0 5]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 4]
addflip(other)
Return the addflip of this and other point.
The addflip of two points is by definition the negative of the sum of the points. This operation is faster than
addition in Jacobian arithmetic by Khuri-Makdisi algorithms.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: b = C([0,1,0]).place()
sage: pl1 = C([-1,2,1]).place()
sage: pl2 = C([3,2,1]).place()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: p1 = [Link](pl1 - b)
sage: p2 = [Link](pl2 - b)
sage: [Link](p2)
Point of Jacobian determined by
[1 0 0 0 0 0 0 2 6]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 4]
[0 0 0 1 0 0 0 0 3]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 2]
sage: _ == -(p1 + p2)
True
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> pl1 = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> pl2 = C([Integer(3),Integer(2),Integer(1)]).place()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> p1 = [Link](pl1 - b)
>>> p2 = [Link](pl2 - b)
>>> [Link](p2)
(continues on next page)
26.3. Jacobians in Khuri-Makdisi model 317
Algebraic Function Fields, Release 10.4
(continued from previous page)
Point of Jacobian determined by
[1 0 0 0 0 0 0 2 6]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 4]
[0 0 0 1 0 0 0 0 3]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 2]
>>> _ == -(p1 + p2)
True
defining_matrix()
Return the matrix whose row span determines the effective divisor representing this point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: b = C([0,1,0]).place()
sage: pl = C([-1,2,1]).place()
sage: p = [Link](pl - b)
sage: p.defining_matrix()
[1 0 0 0 0 0 0 2 5]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 2]
[0 0 0 1 0 0 0 0 6]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 1]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> pl = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> p = [Link](pl - b)
>>> p.defining_matrix()
[1 0 0 0 0 0 0 2 5]
[0 1 0 0 0 0 0 0 3]
[0 0 1 0 0 0 0 0 2]
[0 0 0 1 0 0 0 0 6]
[0 0 0 0 0 1 0 0 5]
[0 0 0 0 0 0 1 0 1]
divisor()
Return the divisor representing this point.
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
(continues on next page)
318 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
(continued from previous page)
sage: F = C.function_field()
sage: h = [Link](y/x).divisor_of_poles()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: b = F.get_place(1)
sage: p = C([-1,2,1]).place()
sage: pt = [Link](p - b)
sage: [Link]([Link]()) == pt
True
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> F = C.function_field()
>>> h = [Link](y/x).divisor_of_poles()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> b = F.get_place(Integer(1))
>>> p = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> pt = [Link](p - b)
>>> [Link]([Link]()) == pt
True
ALGORITHM: Lemma 2.1 of [Khu2004].
multiple(n)
Return the n-th multiple of this point.
INPUT:
• n – an integer
EXAMPLES:
sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2)
sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2)
sage: h = [Link](y/x).divisor_of_poles()
sage: b = C([0,1,0]).place()
sage: pl = C([-1,2,1]).place()
sage: J = [Link](model= km_large , base_div=h)
sage: G = [Link]()
sage: p = [Link](pl - b)
sage: [Link](100)
Point of Jacobian determined by
[1 0 0 0 0 2 0 1 1]
[0 1 0 0 0 5 0 1 6]
[0 0 1 0 0 2 0 6 3]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 1 5 0 1 4]
[0 0 0 0 0 0 1 1 0]
>>> from [Link] import *
>>> P2 = ProjectiveSpace(GF(Integer(7)), Integer(2), names=( x , y , z ,));␣
˓→(x, y, z,) = P2._first_ngens(3)
>>> C = Curve(x**Integer(3) + Integer(5)*z**Integer(3) - y**Integer(2)*z, P2)
>>> h = [Link](y/x).divisor_of_poles()
(continues on next page)
26.3. Jacobians in Khuri-Makdisi model 319
Algebraic Function Fields, Release 10.4
(continued from previous page)
>>> b = C([Integer(0),Integer(1),Integer(0)]).place()
>>> pl = C([-Integer(1),Integer(2),Integer(1)]).place()
>>> J = [Link](model= km_large , base_div=h)
>>> G = [Link]()
>>> p = [Link](pl - b)
>>> [Link](Integer(100))
Point of Jacobian determined by
[1 0 0 0 0 2 0 1 1]
[0 1 0 0 0 5 0 1 6]
[0 0 1 0 0 2 0 6 3]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 1 5 0 1 4]
[0 0 0 0 0 0 1 1 0]
class [Link].function_field.jacobian_khuri_makdisi.JacobianPoint_finite_field(par-
ent,
w)
Bases: JacobianPoint, JacobianPoint_finite_field_base
26.4 Khuri-Makdisi algorithms for arithmetic in Jacobians
This module implements Khuri-Makdisi’s algorithms of [Khu2004].
In the implementation, we use notations close to the ones used by Khuri-Makdisi. We describe them below for readers
of the code.
Let 𝐷0 be the base divisor of the Jacobian in Khuri-Makdisi model. So 𝐷0 is an effective divisor of appropriate degree 𝑑0
depending on the model. Let 𝑔 be the genus of the underlying function field. For large and medium models, 𝑑0 ≥ 2𝑔 + 1.
For small model 𝑑0 ≥ 𝑔 + 1. A point of the Jacobian is a divisor class containing a divisor 𝐷 − 𝐷0 of degree 0 with an
effective divisor 𝐷 of degree 𝑑0 .
Let 𝑉𝑛 denote the vector space 𝐻 0 (𝑂(𝑛𝐷0 )) with a chosen basis, and let 𝜇𝑛,𝑚 is a bilinear map from 𝑉𝑛 × 𝑉𝑚 → 𝑉𝑛+𝑚
defined by (𝑓, 𝑔) ↦→ 𝑓 𝑔. The map 𝜇𝑛,𝑚 can be represented by a 3-dimensional array as depicted below:
f
*------*
d /|e /|
*-|----* |
| *----|-*
|/ |/
*------*
where 𝑑 = dim 𝑉𝑛 , 𝑒 = dim 𝑉𝑚 , 𝑓 = dim 𝑉𝑛+𝑚 . In the implementation, we instead use a matrix of size 𝑑 × 𝑒𝑓 . Each
row of the matrix denotes a matrix of size 𝑒 × 𝑓 .
A point of the Jacobian is represented by an effective divisor 𝐷. In Khuri-Makdisi algorithms, the divisor 𝐷 is represented
by a subspace 𝑊𝐷 = 𝐻 0 (𝑂(𝑛0 𝐷0 − 𝐷)) of 𝑉𝑛0 with fixed 𝑛0 depending on the model. For large and small models,
𝑛0 = 3 and 𝐿 = 𝑂(3𝐷0 ), and for medium model, 𝑛0 = 2 and 𝐿 = 𝑂(2𝐷0 ).
The subspace 𝑊𝐷 is the row space of a matrix 𝑤𝐷 . Thus in the implementation, the matrix 𝑤𝐷 represents a point of the
Jacobian. The row space of the matrix 𝑤𝐿 is 𝑉𝑛0 = 𝐻 0 (𝑂(𝑛0 𝐷0 )).
The function mu_image(w_D, w_E, mu_mat_n_m, expected_dim) computes the image 𝜇𝑛,𝑚 (𝑊𝐷 , 𝑊𝐸 )
of the expected dimension.
320 Chapter 26. Jacobians of function fields
Algebraic Function Fields, Release 10.4
The function mu_preimage(w_E, w_F, mu_mat_n_m, expected_codim) computes the preimage 𝑊𝐷
such that 𝜇𝑛,𝑚 (𝑊𝐷 , 𝑊𝐸 ) = 𝑊𝐹 of the expected codimension dim 𝑉𝑛 − dim 𝑊𝐷 , which is a multiple of 𝑑0 .
AUTHORS:
• Kwankyu Lee (2022-01): initial version
class [Link].function_field.khuri_makdisi.KhuriMakdisi_base
Bases: object
add(wd1, wd2)
Theorem 4.5 (addition).
multiple(wd, n)
Compute multiple by additive square-and-multiply method.
negate(wd)
Theorem 4.4 (negation), first method.
subtract(wd1, wd2)
Theorem 4.6 (subtraction), first method.
zero_divisor()
Return the matrix 𝑤𝐿 representing zero divisor.
class [Link].function_field.khuri_makdisi.KhuriMakdisi_large
Bases: KhuriMakdisi_base
Khuri-Makdisi’s large model.
add_divisor(wd1, wd2, d1, d2)
Theorem 3.6 (addition of divisors, first method).
We assume that 𝑤𝐷1 , 𝑤𝐷2 represent divisors of degree at most 3𝑑0 − 2𝑔 − 1.
addflip(wd1, wd2)
Theorem 4.3 (addflip)
equal(wd, we)
Theorem 4.1, second method.
class [Link].function_field.khuri_makdisi.KhuriMakdisi_medium
Bases: KhuriMakdisi_base
Khuri-Makdisi’s medium model
add_divisor(wd1, wd2, d1, d2)
Theorem 3.6 (addition of divisors, first method).
We assume that 𝑤𝐷1 , 𝑤𝐷2 represent divisors of degree at most 4𝑑0 − 2𝑔 − 1.
addflip(wd1, wd2)
Theorem 5.1 (addflip in medium model).
equal(wd, we)
Theorem 4.1, second method.
class [Link].function_field.khuri_makdisi.KhuriMakdisi_small
Bases: KhuriMakdisi_base
Khuri-Makdisi’s small model
26.4. Khuri-Makdisi algorithms for arithmetic in Jacobians 321
Algebraic Function Fields, Release 10.4
add_divisor(wd1, wd2, d1, d2)
Theorem 3.6 (addition of divisors, first method).
We assume that 𝑤𝐷1 , 𝑤𝐷2 represent divisors of degree at most 6𝑑0 − 2𝑔 − 1.
addflip(wd1, wd2)
Theorem 5.3 (addflip in small model), second method.
equal(wd, we)
Theorem 4.1, second method.
negate(wd)
Theorem 5.4 (negation in small model).
322 Chapter 26. Jacobians of function fields
CHAPTER
TWENTYSEVEN
A SUPPORT MODULE
27.1 Hermite form computation for function fields
This module provides an optimized implementation of the algorithm computing Hermite forms of matrices over polyno-
mials. This is the workhorse of the function field machinery of Sage.
EXAMPLES:
sage: P.<x> = PolynomialRing(QQ)
sage: A = matrix(P,3,[-(x-1)^((i-j+1) % 3) for i in range(3) for j in range(3)])
sage: A
[ -x + 1 -1 -x^2 + 2*x - 1]
[-x^2 + 2*x - 1 -x + 1 -1]
[ -1 -x^2 + 2*x - 1 -x + 1]
sage: from [Link].function_field.hermite_form_polynomial import reversed_hermite_
˓→form
sage: B = copy(A)
sage: U = reversed_hermite_form(B, transformation=True)
sage: U * A == B
True
sage: B
[x^3 - 3*x^2 + 3*x - 2 0 0]
[ 0 x^3 - 3*x^2 + 3*x - 2 0]
[ x^2 - 2*x + 1 x - 1 1]
>>> from [Link] import *
>>> P = PolynomialRing(QQ, names=( x ,)); (x,) = P._first_ngens(1)
>>> A = matrix(P,Integer(3),[-(x-Integer(1))**((i-j+Integer(1)) % Integer(3)) for i␣
˓→in range(Integer(3)) for j in range(Integer(3))])
>>> A
[ -x + 1 -1 -x^2 + 2*x - 1]
[-x^2 + 2*x - 1 -x + 1 -1]
[ -1 -x^2 + 2*x - 1 -x + 1]
>>> from [Link].function_field.hermite_form_polynomial import reversed_hermite_
˓→form
>>> B = copy(A)
>>> U = reversed_hermite_form(B, transformation=True)
>>> U * A == B
True
>>> B
[x^3 - 3*x^2 + 3*x - 2 0 0]
[ 0 x^3 - 3*x^2 + 3*x - 2 0]
[ x^2 - 2*x + 1 x - 1 1]
323
Algebraic Function Fields, Release 10.4
The function reversed_hermite_form() computes the reversed hermite form, which is reversed both row-wise
and column-wise from the usual hermite form. Let us check it:
sage: A.reverse_rows_and_columns()
sage: C = copy(A.hermite_form())
sage: C.reverse_rows_and_columns()
sage: C
[x^3 - 3*x^2 + 3*x - 2 0 0]
[ 0 x^3 - 3*x^2 + 3*x - 2 0]
[ x^2 - 2*x + 1 x - 1 1]
sage: C == B
True
>>> from [Link] import *
>>> A.reverse_rows_and_columns()
>>> C = copy(A.hermite_form())
>>> C.reverse_rows_and_columns()
>>> C
[x^3 - 3*x^2 + 3*x - 2 0 0]
[ 0 x^3 - 3*x^2 + 3*x - 2 0]
[ x^2 - 2*x + 1 x - 1 1]
>>> C == B
True
AUTHORS:
• Kwankyu Lee (2021-05-21): initial version
[Link].function_field.hermite_form_polynomial.reversed_hermite_form(mat,
transfor-
ma-
tion=False)
Transform the matrix in place to reversed hermite normal form and optionally return the transformation matrix.
INPUT:
• transformation – boolean (default: False); if True, return the transformation matrix
EXAMPLES:
sage: from [Link].function_field.hermite_form_polynomial import reversed_
˓→hermite_form
sage: P.<x> = PolynomialRing(QQ)
sage: A = matrix(P,3,[-(x-1)^((i-2*j) % 4) for i in range(3) for j in range(3)])
sage: A
[ -1 -x^2 + 2*x - 1 -1]
[ -x + 1 -x^3 + 3*x^2 - 3*x + 1 -x + 1]
[ -x^2 + 2*x - 1 -1 -x^2 + 2*x - 1]
sage: B = copy(A)
sage: U = reversed_hermite_form(B, transformation=True)
sage: U * A == B
True
sage: B
[ 0 0 0]
[ 0 x^4 - 4*x^3 + 6*x^2 - 4*x 0]
[ 1 x^2 - 2*x + 1 1]
324 Chapter 27. A Support Module
Algebraic Function Fields, Release 10.4
>>> from [Link] import *
>>> from [Link].function_field.hermite_form_polynomial import reversed_
˓→hermite_form
>>> P = PolynomialRing(QQ, names=( x ,)); (x,) = P._first_ngens(1)
>>> A = matrix(P,Integer(3),[-(x-Integer(1))**((i-Integer(2)*j) % Integer(4)) for␣
˓→i in range(Integer(3)) for j in range(Integer(3))])
>>> A
[ -1 -x^2 + 2*x - 1 -1]
[ -x + 1 -x^3 + 3*x^2 - 3*x + 1 -x + 1]
[ -x^2 + 2*x - 1 -1 -x^2 + 2*x - 1]
>>> B = copy(A)
>>> U = reversed_hermite_form(B, transformation=True)
>>> U * A == B
True
>>> B
[ 0 0 0]
[ 0 x^4 - 4*x^3 + 6*x^2 - 4*x 0]
[ 1 x^2 - 2*x + 1 1]
27.1. Hermite form computation for function fields 325
Algebraic Function Fields, Release 10.4
326 Chapter 27. A Support Module
CHAPTER
TWENTYEIGHT
INDICES AND TABLES
• Index
• Module Index
• Search Page
327
Algebraic Function Fields, Release 10.4
328 Chapter 28. Indices and Tables
PYTHON MODULE INDEX
r [Link].function_field.order_basis,
[Link].function_field.constructor, 139
285 [Link].function_field.order_poly-
[Link].function_field.derivations, mod, 151
261 [Link].function_field.order_ratio-
[Link].function_field.deriva- nal, 133
tions_polymod, 265 [Link].function_field.place, 217
[Link].function_field.deriva- [Link].function_field.place_poly-
tions_rational, 263 mod, 227
[Link].function_field.differen- [Link].function_field.place_ratio-
tial, 245 nal, 223
[Link].function_field.divisor, 233 [Link].function_field.valua-
[Link].function_field.element, 97 tion_ring, 257
[Link].function_field.ele-
ment_polymod, 123
[Link].function_field.element_ra-
tional, 115
[Link].function_field.extensions,
279
[Link].function_field.func-
tion_field, 3
[Link].function_field.func-
tion_field_polymod, 53
[Link].function_field.func-
tion_field_rational, 37
[Link].function_field.her-
mite_form_polynomial, 323
[Link].function_field.ideal, 169
[Link].function_field.ideal_poly-
mod, 195
[Link].function_field.ideal_ratio-
nal, 189
[Link].function_field.jaco-
bian_base, 289
[Link].function_field.jaco-
bian_hess, 301
[Link].function_field.jaco-
bian_khuri_makdisi, 309
[Link].function_field.khuri_mak-
disi, 320
[Link].function_field.maps, 269
[Link].function_field.order, 127
329
Algebraic Function Fields, Release 10.4
330 Python Module Index
INDEX
A basis() ([Link].function_field.order_polymod.Func-
add() ([Link].function_field.khuri_makdisi.Khuri- tionFieldMaximalOrder_polymod method), 159
Makdisi_base method), 321 basis() ([Link].function_field.order_polymod.Func-
add_divisor() ([Link].function_field.khuri_mak- tionFieldMaximalOrderInfinite_polymod
disi.KhuriMakdisi_large method), 321 method), 152
add_divisor() ([Link].function_field.khuri_mak- basis() ([Link].function_field.order_rational.Func-
disi.KhuriMakdisi_medium method), 321 tionFieldMaximalOrder_rational method), 136
add_divisor() ([Link].function_field.khuri_mak- basis() ([Link].function_field.order_ratio-
disi.KhuriMakdisi_small method), 321 nal.FunctionFieldMaximalOrderInfinite_rational
addflip() ([Link].function_field.jacobian_hess.Ja- method), 133
cobianPoint method), 306 basis_differential_space() ([Link]-
addflip() ([Link].function_field.jaco- tion_field.[Link] method),
bian_khuri_makdisi.JacobianPoint method), 235
317 basis_function_space() ([Link]-
addflip() ([Link].function_field.khuri_mak- tion_field.[Link] method),
disi.KhuriMakdisi_large method), 321 236
addflip() ([Link].function_field.khuri_mak- basis_matrix() ([Link].function_field.ideal_poly-
disi.KhuriMakdisi_medium method), 321 mod.FunctionFieldIdeal_polymod method), 204
addflip() ([Link].function_field.khuri_mak- basis_of_differentials_of_first_kind()
disi.KhuriMakdisi_small method), 322 ([Link].function_field.function_field.Func-
tionField method), 10
B basis_of_holomorphic_differentials()
([Link].function_field.function_field.Func-
base_curve() ([Link].function_field.jaco-
tionField method), 10
bian_base.Jacobian_base method), 298
base_divisor() ([Link].function_field.jaco-
bian_base.Jacobian_base method), 298
C
base_divisor() ([Link].function_field.jaco- cartier() ([Link].function_field.[Link]-
bian_base.JacobianGroup_base method), 292 tionFieldDifferential_global method), 255
base_field() ([Link].function_field.func- change_variable_name() ([Link]-
tion_field_polymod.FunctionField_polymod tion_field.function_field_polymod.Function-
method), 64 Field_polymod method), 65
base_field() ([Link].function_field.func- change_variable_name() ([Link]-
tion_field_rational.RationalFunctionField tion_field.function_field_rational.RationalFunc-
method), 40 tionField method), 40
base_ring() ([Link].function_field.[Link]- characteristic() ([Link].function_field.func-
FieldIdeal method), 172 tion_field.FunctionField method), 11
basis() ([Link].function_field.[Link]- characteristic_polynomial() ([Link]-
tialsSpace method), 247 tion_field.[Link]
basis() ([Link].function_field.order_basis.Function- method), 98
FieldOrder_basis method), 146 charpoly() ([Link].function_field.[Link]-
basis() ([Link].function_field.order_basis.Function- tionFieldElement method), 99
FieldOrderInfinite_basis method), 140 codifferent() ([Link].function_field.order_poly-
331
Algebraic Function Fields, Release 10.4
mod.FunctionFieldMaximalOrder_polymod decomposition() ([Link].function_field.or-
method), 160 der_polymod.FunctionFieldMaximalOrder_poly-
codomain() ([Link].function_field.[Link]- mod method), 161
torSpaceToFunctionField method), 277 decomposition() ([Link].function_field.or-
completion() ([Link].function_field.func- der_polymod.FunctionFieldMaximalOrderInfi-
tion_field.FunctionField method), 12 nite_polymod method), 153
conorm_divisor() ([Link].function_field.exten- default_precision() ([Link]-
[Link] method), 281 tion_field.[Link]
conorm_place() ([Link].function_field.exten- method), 272
[Link] method), 281 defining_divisor() ([Link].function_field.ja-
constant_base_field() ([Link]- cobian_hess.JacobianPoint method), 307
tion_field.function_field_polymod.Function- defining_matrix() ([Link].function_field.jaco-
Field_polymod method), 67 bian_khuri_makdisi.JacobianPoint method), 318
constant_base_field() ([Link]-
defining_morphism() ([Link].function_field.ex-
tion_field.function_field_rational.Rational- [Link] method), 282
FunctionField method), 41 degree() ([Link].function_field.[Link]-
constant_field() ([Link].function_field.func- FieldDivisor method), 236
tion_field_polymod.FunctionField_polymod degree() ([Link].function_field.[Link]-
method), 67 FieldElement method), 100
constant_field() ([Link].function_field.func- degree() ([Link].function_field.function_field_poly-
tion_field_polymod.FunctionField_simple mod.FunctionField_polymod method), 68
method), 90 degree() ([Link].function_field.function_field_ra-
constant_field() ([Link].function_field.func- [Link] method), 41
tion_field_rational.RationalFunctionField degree() ([Link].function_field.place_poly-
method), 41 mod.FunctionFieldPlace_polymod method),
ConstantFieldExtension (class in [Link]- 227
tion_field.extensions), 280 degree() ([Link].function_field.place_ratio-
construction() ([Link].function_field.jaco- nal.FunctionFieldPlace_rational method),
bian_base.JacobianGroup_base method), 293 223
coordinate_vector() ([Link].function_field.or- denominator() ([Link].function_field.divi-
der_basis.FunctionFieldOrder_basis method), [Link] method), 236
146 denominator() ([Link].function_field.element_ra-
coordinate_vector() ([Link].function_field.or- tional.FunctionFieldElement_rational method),
der_polymod.FunctionFieldMaximalOrder_poly- 115
mod method), 160 denominator() ([Link].function_field.ideal_poly-
coordinate_vector() ([Link].function_field.or- mod.FunctionFieldIdeal_polymod method), 204
der_polymod.FunctionFieldMaximalOrderInfi- denominator() ([Link].function_field.ideal_ratio-
nite_polymod method), 152 nal.FunctionFieldIdeal_rational method), 192
create_key() ([Link].function_field.construc-
derivative() ([Link].function_field.[Link]-
[Link] method), tionFieldElement method), 100
286 dict() ([Link].function_field.[Link]-
create_key() ([Link].function_field.construc- Divisor method), 237
[Link] method), 287 different() ([Link].function_field.func-
create_object() ([Link].function_field.construc- tion_field_polymod.FunctionField_polymod
[Link] method), 286 method), 68
create_object() ([Link].function_field.construc- different() ([Link].function_field.func-
[Link] method), 288 tion_field_rational.RationalFunctionField
curve() ([Link].function_field.jacobian_base.Jaco- method), 42
bian_base method), 299 different() ([Link].function_field.order_poly-
mod.FunctionFieldMaximalOrder_polymod
D method), 162
decomposition() ([Link].function_field.or- different() ([Link].function_field.order_poly-
der_polymod.FunctionFieldMaxi- mod.FunctionFieldMaximalOrderInfinite_poly-
malOrder_global method), 158 mod method), 154
332 Index
Algebraic Function Fields, Release 10.4
differential() ([Link].function_field.ele-
Element ([Link].function_field.function_field_ratio-
[Link] method), 101 [Link] attribute), 40
differential_space() ([Link]-Element ([Link].function_field.jacobian_hess.Jaco-
tion_field.[Link] method), bianGroup attribute), 303
237 Element ([Link].function_field.jacobian_hess.Jaco-
DifferentialsSpace (class in [Link]- bianGroup_finite_field attribute), 305
tion_field.differential), 246 Element ([Link].function_field.jacobian_khuri_mak-
DifferentialsSpace_global (class in [Link] attribute), 313
[Link].function_field.differential), 250 Element ([Link].function_field.jacobian_khuri_mak-
DifferentialsSpaceInclusion (class in disi.JacobianGroup_finite_field attribute), 316
[Link].function_field.differential), 248 Element ([Link].function_field.[Link] at-
dimension() ([Link].function_field.[Link]- tribute), 220
tionFieldDivisor method), 238 element() ([Link].function_field.element_poly-
divisor() (in module [Link].function_field.divisor), mod.FunctionFieldElement_polymod method),
242 123
divisor() ([Link].function_field.[Link]- element() ([Link].function_field.element_ratio-
tionFieldDifferential method), 251 nal.FunctionFieldElement_rational method),
divisor() ([Link].function_field.[Link]- 115
FieldElement method), 101 equal() ([Link].function_field.khuri_makdisi.Khuri-
divisor() ([Link].function_field.[Link]- Makdisi_large method), 321
dIdeal method), 173 equal() ([Link].function_field.khuri_makdisi.Khuri-
divisor() ([Link].function_field.jacobian_hess.Ja- Makdisi_medium method), 321
cobianPoint method), 307 equal() ([Link].function_field.khuri_makdisi.Khuri-
divisor() ([Link].function_field.jaco- Makdisi_small method), 322
bian_khuri_makdisi.JacobianPoint method),equation_order() ([Link].function_field.func-
318 tion_field_polymod.FunctionField_integral
divisor() ([Link].function_field.[Link]- method), 60
FieldPlace method), 219 equation_order() ([Link].function_field.func-
divisor_group() ([Link].function_field.func- tion_field_polymod.FunctionField_polymod
tion_field.FunctionField method), 15 method), 69
divisor_of_poles() ([Link].function_field.ele- equation_order() ([Link].function_field.func-
[Link] method), 102 tion_field_rational.RationalFunctionField
divisor_of_poles() ([Link]- method), 42
tion_field.[Link] method),equation_order_infinite() ([Link]-
175 tion_field.function_field_polymod.Function-
divisor_of_zeros() ([Link].function_field.ele- Field_integral method), 61
[Link] method), 103 equation_order_infinite() ([Link]-
divisor_of_zeros() ([Link]- tion_field.function_field_rational.RationalFunc-
tion_field.[Link] method), tionField method), 42
176 evaluate() ([Link].function_field.[Link]-
DivisorGroup (class in [Link].function_field.divi- tionFieldElement method), 103
sor), 234 exact_constant_field() ([Link]-
domain() ([Link].function_field.[Link]- tion_field.function_field_polymod.Function-
torSpaceToFunctionField method), 278 Field_simple method), 90
extension() ([Link].function_field.func-
E tion_field_rational.RationalFunctionField
Element ([Link].function_field.[Link]- method), 43
tialsSpace attribute), 247 extension() ([Link].function_field.func-
Element ([Link].function_field.[Link]- tion_field.FunctionField method), 16
tialsSpace_global attribute), 250 extension_constant_field() ([Link]-
Element ([Link].function_field.[Link] tion_field.function_field.FunctionField method),
attribute), 234 17
Element ([Link].function_field.function_field_poly-
mod.FunctionField_polymod attribute), 64
Index 333
Algebraic Function Fields, Release 10.4
F mod), 54
facade_for() ([Link].function_field.jaco- FunctionField_global (class in [Link]-
bian_base.Jacobian_base method), 299 tion_field.function_field_polymod), 54
factor() ([Link].function_field.element_ratio- FunctionField_global_integral (class in
nal.FunctionFieldElement_rational method), [Link].function_field.function_field_poly-
116 mod), 60
factor() ([Link].function_field.[Link]- FunctionField_integral (class in [Link]-
Ideal method), 177 tion_field.function_field_polymod), 60
field() ([Link].function_field.function_field_ratio- FunctionField_polymod (class in [Link]-
[Link] method), 44 tion_field.function_field_polymod), 62
fraction_field() ([Link].function_field.or- FunctionField_simple (class in [Link]-
der.FunctionFieldOrder_base method), 131 tion_field.function_field_polymod), 90
FractionFieldToFunctionField (class in FunctionFieldCompletion (class in
[Link].function_field.maps), 270 [Link].function_field.maps), 271
free_module() ([Link].function_field.func- FunctionFieldConversionToConstantBase-
tion_field_polymod.FunctionField_polymod Field (class in [Link].function_field.maps),
method), 70 273
free_module() ([Link].function_field.func- FunctionFieldDerivation (class in
tion_field_rational.RationalFunctionField [Link].function_field.derivations), 261
method), 44 FunctionFieldDerivation_inseparable
free_module() ([Link].function_field.order_ba- (class in [Link].function_field.deriva-
sis.FunctionFieldOrder_basis method), 147 tions_polymod), 265
free_module() ([Link].function_field.order_ba- FunctionFieldDerivation_rational (class in
sis.FunctionFieldOrderInfinite_basis method), [Link].function_field.derivations_rational),
141 263
free_module() ([Link].function_field.order_poly- FunctionFieldDerivation_separable (class
mod.FunctionFieldMaximalOrder_polymod in [Link].function_field.derivations_poly-
method), 162 mod), 266
frobenius() ([Link].function_field.jaco- FunctionFieldDifferential (class in
bian_base.JacobianPoint_finite_field_base [Link].function_field.differential), 250
method), 296 FunctionFieldDifferential_global (class in
function_field() ([Link].function_field.differ- [Link].function_field.differential), 255
[Link] method), 248 FunctionFieldDivisor (class in [Link]-
function_field() ([Link].function_field.divi- tion_field.divisor), 235
[Link] method), 234 FunctionFieldElement (class in [Link]-
function_field() ([Link].function_field.ja- tion_field.element), 98
cobian_base.JacobianGroup_base method), FunctionFieldElement_polymod (class in
294 [Link].function_field.element_polymod), 123
function_field() ([Link].function_field.or- FunctionFieldElement_rational (class in
der.FunctionFieldOrder_base method), 131 [Link].function_field.element_rational), 115
function_field() ([Link]- FunctionFieldExtension (class in [Link]-
tion_field.[Link] method), tion_field.extensions), 283
219 FunctionFieldExtensionFactory (class in
function_field() ([Link]- [Link].function_field.constructor), 285
tion_field.[Link] method), 221 FunctionFieldFactory (class in [Link]-
function_space() ([Link].function_field.divi- tion_field.constructor), 287
[Link] method), 238 FunctionFieldHigherDerivation (class in
FunctionField (class in [Link]- [Link].function_field.derivations_polymod),
tion_field.function_field), 9 266
FunctionField_char_zero (class in FunctionFieldHigherDeriva-
[Link].function_field.function_field_poly- tion_char_zero (class in [Link]-
mod), 53 tion_field.derivations_polymod), 266
FunctionField_char_zero_integral (class FunctionFieldHigherDerivation_global
in [Link].function_field.function_field_poly- (class in [Link].function_field.deriva-
334 Index
Algebraic Function Fields, Release 10.4
tions_polymod), 267 FunctionFieldOrderInfinite_basis (class in
FunctionFieldIdeal (class in [Link]- [Link].function_field.order_basis), 139
tion_field.ideal), 172 FunctionFieldPlace (class in [Link]-
FunctionFieldIdeal_global (class in tion_field.place), 218
[Link].function_field.ideal_polymod), 201 FunctionFieldPlace_polymod (class in
FunctionFieldIdeal_module (class in [Link].function_field.place_polymod),
[Link].function_field.ideal), 183 227
FunctionFieldIdeal_polymod (class in FunctionFieldPlace_rational (class in
[Link].function_field.ideal_polymod), 203 [Link].function_field.place_rational), 223
FunctionFieldIdeal_rational (class in FunctionFieldRingMorphism (class in
[Link].function_field.ideal_rational), 191 [Link].function_field.maps), 274
FunctionFieldIdealInfinite (class in FunctionFieldToFractionField (class in
[Link].function_field.ideal), 182 [Link].function_field.maps), 274
FunctionFieldIdealInfinite_module (class FunctionFieldValuationRing (class in
in [Link].function_field.ideal), 182 [Link].function_field.valuation_ring), 258
FunctionFieldIdealInfinite_polymod (class FunctionFieldVectorSpaceIsomorphism
in [Link].function_field.ideal_polymod), 195 (class in [Link].function_field.maps), 275
FunctionFieldIdealInfinite_rational
(class in [Link].function_field.ideal_ratio- G
nal), 189 gaps() ([Link].function_field.function_field_poly-
FunctionFieldLinearMap (class in [Link]- mod.FunctionField_global method), 56
tion_field.maps), 273 gaps() ([Link].function_field.place_polymod.Func-
FunctionFieldLinearMapSection (class in tionFieldPlace_polymod method), 227
[Link].function_field.maps), 273 gen() ([Link].function_field.function_field_poly-
FunctionFieldMaximalOrder (class in mod.FunctionField_polymod method), 73
[Link].function_field.order), 129 gen() ([Link].function_field.function_field_ratio-
FunctionFieldMaximalOrder_global (class in [Link] method), 45
[Link].function_field.order_polymod), 157 gen() ([Link].function_field.ideal_rational.Function-
FunctionFieldMaximalOrder_polymod (class FieldIdeal_rational method), 192
in [Link].function_field.order_polymod), 159 gen() ([Link].function_field.ideal_rational.Function-
FunctionFieldMaximalOrder_rational (class FieldIdealInfinite_rational method), 189
in [Link].function_field.order_rational), 135 gen() ([Link].function_field.[Link]-
FunctionFieldMaximalOrderInfinite (class Ideal_module method), 184
in [Link].function_field.order), 130 gen() ([Link].function_field.order_polymod.Func-
FunctionFieldMaximalOrderInfi- tionFieldMaximalOrder_polymod method),
nite_polymod (class in [Link]- 163
tion_field.order_polymod), 151 gen() ([Link].function_field.order_polymod.Func-
FunctionFieldMaximalOrderInfinite_ra- tionFieldMaximalOrderInfinite_polymod
tional (class in [Link].function_field.or- method), 155
der_rational), 133 gen() ([Link].function_field.order_rational.Function-
FunctionFieldMorphism (class in [Link]- FieldMaximalOrder_rational method), 136
tion_field.maps), 273 gen() ([Link].function_field.order_rational.Function-
FunctionFieldMorphism_polymod (class in FieldMaximalOrderInfinite_rational method),
[Link].function_field.maps), 273 133
FunctionFieldMorphism_rational (class in gens() ([Link].function_field.ideal_polymod.Func-
[Link].function_field.maps), 274 tionFieldIdeal_global method), 201
FunctionFieldOrder (class in [Link]- gens() ([Link].function_field.ideal_polymod.Func-
tion_field.order), 130 tionFieldIdeal_polymod method), 205
FunctionFieldOrder_base (class in gens() ([Link].function_field.ideal_polymod.Func-
[Link].function_field.order), 130 tionFieldIdealInfinite_polymod method), 195
FunctionFieldOrder_basis (class in gens() ([Link].function_field.ideal_rational.Func-
[Link].function_field.order_basis), 144 tionFieldIdeal_rational method), 192
FunctionFieldOrderInfinite (class in gens() ([Link].function_field.ideal_rational.Func-
[Link].function_field.order), 130 tionFieldIdealInfinite_rational method), 190
Index 335
Algebraic Function Fields, Release 10.4
gens() ([Link].function_field.[Link]- higher_derivative() ([Link].function_field.el-
Ideal_module method), 185 [Link] method), 104
gens_over_base() ([Link]- hilbert_symbol() ([Link].function_field.func-
tion_field.ideal_polymod.FunctionField- tion_field.FunctionField method), 18
Ideal_polymod method), 206 hnf() ([Link].function_field.ideal_polymod.Function-
gens_over_base() ([Link]- FieldIdeal_polymod method), 206
tion_field.ideal_polymod.FunctionFieldIde- hom() ([Link].function_field.function_field_poly-
alInfinite_polymod method), 196 mod.FunctionField_polymod method), 74
gens_over_base() ([Link]- hom() ([Link].function_field.function_field_ratio-
tion_field.ideal_rational.FunctionFieldIdeal_ra- [Link] method), 45
tional method), 193
gens_over_base() ([Link]- I
tion_field.ideal_rational.FunctionFieldIdeal- ideal() ([Link].function_field.order_basis.Function-
Infinite_rational method), 190 FieldOrder_basis method), 147
gens_reduced() ([Link]- ideal() ([Link].function_field.order_basis.Function-
tion_field.[Link] method), FieldOrderInfinite_basis method), 141
179 ideal() ([Link].function_field.order_polymod.Func-
gens_two() ([Link].function_field.ideal_poly- tionFieldMaximalOrder_polymod method), 164
mod.FunctionFieldIdeal_global method), 202 ideal() ([Link].function_field.order_polymod.Func-
gens_two() ([Link].function_field.ideal_poly- tionFieldMaximalOrderInfinite_polymod
mod.FunctionFieldIdealInfinite_polymod method), 156
method), 196 ideal() ([Link].function_field.order_rational.Func-
genus() ([Link].function_field.function_field_poly- tionFieldMaximalOrder_rational method), 136
mod.FunctionField_polymod method), 73 ideal() ([Link].function_field.order_ratio-
genus() ([Link].function_field.function_field_poly- nal.FunctionFieldMaximalOrderInfinite_rational
mod.FunctionField_simple method), 91 method), 134
genus() ([Link].function_field.function_field_ratio- ideal_below() ([Link].function_field.ideal_poly-
[Link] method), 45 mod.FunctionFieldIdeal_polymod method), 207
get_place() ([Link].function_field.func- ideal_below() ([Link].function_field.ideal_poly-
tion_field_polymod.FunctionField_global mod.FunctionFieldIdealInfinite_polymod
method), 56 method), 197
get_place() ([Link].function_field.func- ideal_monoid() ([Link].function_field.or-
tion_field_rational.RationalFunction- der.FunctionFieldOrder_base method), 131
Field_global method), 50 ideal_with_gens_over_base() ([Link]-
get_points() ([Link].function_field.jaco- tion_field.order_basis.FunctionFieldOrder_basis
bian_base.JacobianGroup_finite_field_base method), 148
method), 295 ideal_with_gens_over_base() ([Link]-
group() ([Link].function_field.jacobian_base.Jaco- tion_field.order_basis.FunctionFieldOrderInfi-
bian_base method), 299 nite_basis method), 142
ideal_with_gens_over_base() ([Link]-
H tion_field.order_polymod.FunctionFieldMaxi-
higher_derivation() ([Link]- malOrder_polymod method), 165
tion_field.function_field_polymod.Function- ideal_with_gens_over_base() ([Link]-
Field_char_zero method), 53 tion_field.order_polymod.FunctionFieldMaxi-
higher_derivation() ([Link]- malOrderInfinite_polymod method), 156
tion_field.function_field_polymod.Function- ideal_with_gens_over_base() ([Link]-
Field_global method), 57 tion_field.order_rational.FunctionFieldMaxi-
higher_derivation() ([Link]- malOrder_rational method), 137
tion_field.function_field_rational.Rational- IdealMonoid (class in [Link].function_field.ideal),
FunctionField_char_zero method), 49 187
higher_derivation() ([Link]- intersect() ([Link].function_field.ideal_poly-
tion_field.function_field_rational.Rational- mod.FunctionFieldIdeal_polymod method),
FunctionField_global method), 50 209
336 Index
Algebraic Function Fields, Release 10.4
intersection() ([Link]- is_prime() ([Link].function_field.ideal_ratio-
tion_field.ideal.FunctionFieldIdeal_module nal.FunctionFieldIdeal_rational method), 193
method), 185 is_prime() ([Link].function_field.ideal_ratio-
inverse_mod() ([Link].function_field.element_ra- nal.FunctionFieldIdealInfinite_rational method),
tional.FunctionFieldElement_rational method), 190
117 is_separable() ([Link].function_field.func-
is_effective() ([Link].function_field.divi- tion_field_polymod.FunctionField_polymod
[Link] method), 239 method), 77
is_field() ([Link].function_field.[Link]- is_square() ([Link].function_field.element_ratio-
FieldOrder_base method), 131 nal.FunctionFieldElement_rational method), 118
is_finite() ([Link].function_field.func- is_subring() ([Link].function_field.[Link]-
tion_field.FunctionField method), 20 tionFieldOrder_base method), 132
is_FunctionField() (in module [Link]- is_surjective() ([Link].function_field.differen-
tion_field.function_field), 36 [Link] method), 249
is_FunctionFieldElement() (in module is_surjective() ([Link]-
[Link].function_field.element), 114 tion_field.[Link]-
is_global() ([Link].function_field.func- somorphism method), 276
tion_field.FunctionField method), 20
is_infinite_place() ([Link]- J
tion_field.place_polymod.FunctionField- Jacobian (class in [Link].function_field.jaco-
Place_polymod method), 228 bian_hess), 302
is_infinite_place() ([Link]- Jacobian (class in [Link].function_field.jaco-
tion_field.place_rational.FunctionFieldPlace_ra- bian_khuri_makdisi), 312
tional method), 223 jacobian() ([Link].function_field.func-
is_injective() ([Link].function_field.deriva- tion_field.FunctionField method), 21
[Link] method), 262 Jacobian_base (class in [Link].function_field.jaco-
is_injective() ([Link].function_field.differ- bian_base), 298
[Link] method), JacobianGroup (class in [Link].function_field.jaco-
248 bian_hess), 302
is_injective() ([Link]- JacobianGroup (class in [Link].function_field.jaco-
tion_field.[Link]- bian_khuri_makdisi), 312
somorphism method), 275 JacobianGroup_base (class in [Link]-
is_integral() ([Link].function_field.ele- tion_field.jacobian_base), 292
[Link] method), 105 JacobianGroup_finite_field (class in
is_integral() ([Link].function_field.ideal_poly- [Link].function_field.jacobian_hess), 305
mod.FunctionFieldIdeal_polymod method), 209 JacobianGroup_finite_field (class in
is_noetherian() ([Link].function_field.or- [Link].function_field.jacobian_khuri_mak-
der.FunctionFieldOrder_base method), 131 disi), 315
is_nth_power() ([Link].function_field.ele- JacobianGroup_finite_field_base (class in
ment_polymod.FunctionFieldElement_polymod [Link].function_field.jacobian_base), 295
method), 123 JacobianGroupEmbedding (class in [Link]-
is_nth_power() ([Link].function_field.ele- tion_field.jacobian_hess), 304
ment_rational.FunctionFieldElement_rational JacobianGroupEmbedding (class in [Link]-
method), 117 tion_field.jacobian_khuri_makdisi), 314
is_nth_power() ([Link].function_field.ele- JacobianGroupFunctor (class in [Link]-
[Link] method), 106 tion_field.jacobian_base), 291
is_perfect() ([Link].function_field.func- JacobianPoint (class in [Link].function_field.jaco-
tion_field.FunctionField method), 20 bian_hess), 306
is_prime() ([Link].function_field.ideal_poly- JacobianPoint (class in [Link].function_field.jaco-
mod.FunctionFieldIdeal_polymod method), bian_khuri_makdisi), 316
211 JacobianPoint_base (class in [Link]-
is_prime() ([Link].function_field.ideal_poly- tion_field.jacobian_base), 296
mod.FunctionFieldIdealInfinite_polymod JacobianPoint_finite_field (class in
method), 198 [Link].function_field.jacobian_hess), 309
Index 337
Algebraic Function Fields, Release 10.4
JacobianPoint_finite_field (class in maximal_order_infinite() ([Link]-
[Link].function_field.jacobian_khuri_mak- tion_field.function_field_polymod.Function-
disi), 320 Field_polymod method), 79
JacobianPoint_finite_field_base (class in maximal_order_infinite() ([Link]-
[Link].function_field.jacobian_base), 296 tion_field.function_field_rational.RationalFunc-
tionField method), 47
K merge() ([Link].function_field.jacobian_base.Jaco-
KhuriMakdisi_base (class in [Link]- bianGroupFunctor method), 291
tion_field.khuri_makdisi), 321 minimal_polynomial() ([Link]-
KhuriMakdisi_large (class in [Link]- tion_field.[Link]
tion_field.khuri_makdisi), 321 method), 109
KhuriMakdisi_medium (class in [Link]- minpoly() ([Link].function_field.[Link]-
tion_field.khuri_makdisi), 321 FieldElement method), 109
KhuriMakdisi_small (class in [Link]- module
tion_field.khuri_makdisi), 321 [Link].function_field.con-
structor, 285
L [Link].function_field.deriva-
L_polynomial() ([Link].function_field.func- tions, 261
tion_field_polymod.FunctionField_global [Link].function_field.deriva-
method), 55 tions_polymod, 265
list() ([Link].function_field.[Link]- [Link].function_field.deriva-
Divisor method), 239 tions_rational, 263
list() ([Link].function_field.element_poly- [Link].function_field.differ-
mod.FunctionFieldElement_polymod method), ential, 245
124 [Link].function_field.divisor,
list() ([Link].function_field.element_rational.Func- 233
tionFieldElement_rational method), 119 [Link].function_field.element,
local_uniformizer() ([Link]- 97
tion_field.place_polymod.FunctionField- [Link].function_field.ele-
Place_polymod method), 229 ment_polymod, 123
local_uniformizer() ([Link]- [Link].function_field.ele-
tion_field.place_rational.FunctionFieldPlace_ra- ment_rational, 115
tional method), 223 [Link].function_field.exten-
sions, 279
M [Link].function_field.func-
tion_field, 3
make_FunctionFieldElement() (in module
[Link].function_field.func-
[Link].function_field.element), 114
tion_field_polymod, 53
MapFunctionFieldToVectorSpace (class in
[Link].function_field.func-
[Link].function_field.maps), 276
tion_field_rational, 37
MapVectorSpaceToFunctionField (class in
[Link].function_field.her-
[Link].function_field.maps), 277
mite_form_polynomial, 323
matrix() ([Link].function_field.[Link]-
[Link].function_field.ideal, 169
FieldElement method), 106
[Link]-
maximal_order() ([Link].function_field.func-
tion_field.ideal_polymod, 195
tion_field_polymod.FunctionField_global
[Link]-
method), 58
tion_field.ideal_rational, 189
maximal_order() ([Link].function_field.func-
[Link].function_field.jaco-
tion_field_polymod.FunctionField_polymod
bian_base, 289
method), 78
[Link].function_field.jaco-
maximal_order() ([Link].function_field.func-
bian_hess, 301
tion_field_rational.RationalFunctionField
[Link].function_field.jaco-
method), 46
bian_khuri_makdisi, 309
[Link]-
338 Index
Algebraic Function Fields, Release 10.4
tion_field.khuri_makdisi, 320 ngens() ([Link].function_field.order_polymod.Func-
[Link].function_field.maps, 269 tionFieldMaximalOrder_polymod method), 166
[Link].function_field.order, 127 ngens() ([Link].function_field.order_polymod.Func-
[Link].function_field.or- tionFieldMaximalOrderInfinite_polymod
der_basis, 139 method), 157
[Link].function_field.or- ngens() ([Link].function_field.order_rational.Func-
der_polymod, 151 tionFieldMaximalOrder_rational method), 138
[Link].function_field.or- ngens() ([Link].function_field.order_ratio-
der_rational, 133 nal.FunctionFieldMaximalOrderInfinite_rational
[Link].function_field.place, 217 method), 135
[Link]- norm() ([Link].function_field.[Link]-
tion_field.place_polymod, 227 Element method), 110
[Link]- norm() ([Link].function_field.ideal_polymod.Func-
tion_field.place_rational, 223 tionFieldIdeal_polymod method), 212
[Link].function_field.valua- nth_root() ([Link].function_field.element_poly-
tion_ring, 257 mod.FunctionFieldElement_polymod method),
module() ([Link].function_field.ideal_poly- 125
mod.FunctionFieldIdeal_polymod method), nth_root() ([Link].function_field.element_ratio-
212 nal.FunctionFieldElement_rational method),
module() ([Link].function_field.ideal_ratio- 119
nal.FunctionFieldIdeal_rational method), nth_root() ([Link].function_field.[Link]-
193 tionFieldElement method), 111
module() ([Link].function_field.[Link]- number_of_rational_places() ([Link]-
Ideal_module method), 186 tion_field.function_field_polymod.Function-
module() ([Link].function_field.[Link]- Field_global method), 58
IdealInfinite_module method), 183 numerator() ([Link].function_field.[Link]-
monic_integral_model() ([Link]- tionFieldDivisor method), 240
tion_field.function_field_polymod.Function- numerator() ([Link].function_field.element_ratio-
Field_polymod method), 79 nal.FunctionFieldElement_rational method), 120
monomial_coefficients() ([Link]-
tion_field.[Link] O
method), 252 order() ([Link].function_field.function_field.Func-
multiple() ([Link].function_field.jaco- tionField method), 21
bian_hess.JacobianPoint method), 308 order() ([Link].function_field.jacobian_base.Jaco-
multiple() ([Link].function_field.jaco- bianGroup_finite_field_base method), 296
bian_khuri_makdisi.JacobianPoint method),order() ([Link].function_field.jacobian_base.Jaco-
319 bianPoint_finite_field_base method), 297
multiple() ([Link].function_field.khuri_mak- order() ([Link].function_field.jacobian_hess.Jaco-
disi.KhuriMakdisi_base method), 321 bianPoint method), 308
multiplicity() ([Link].function_field.divi-
order_infinite() ([Link].function_field.func-
[Link] method), 240 tion_field.FunctionField method), 22
order_infinite_with_basis() ([Link]-
N tion_field.function_field.FunctionField method),
negate() ([Link].function_field.khuri_mak- 23
disi.KhuriMakdisi_base method), 321 order_with_basis() ([Link]-
negate() ([Link].function_field.khuri_mak- tion_field.function_field.FunctionField method),
disi.KhuriMakdisi_small method), 322 25
ngens() ([Link].function_field.function_field_poly-
mod.FunctionField_polymod method), 81 P
ngens() ([Link].function_field.function_field_ratio- p_radical() ([Link].function_field.order_poly-
[Link] method), 47 mod.FunctionFieldMaximalOrder_global
ngens() ([Link].function_field.[Link]- method), 158
Ideal_module method), 187 parent() ([Link].function_field.jacobian_base.Jaco-
bianGroup_base method), 294
Index 339
Algebraic Function Fields, Release 10.4
place() ([Link].function_field.[Link]- prime_below() ([Link].function_field.ideal_poly-
Ideal method), 179 mod.FunctionFieldIdealInfinite_polymod
place() ([Link].function_field.valuation_ring.Func- method), 199
tionFieldValuationRing method), 259 prime_divisor() (in module [Link]-
place_below() ([Link].function_field.place_poly- tion_field.divisor), 242
mod.FunctionFieldPlace_polymod method), 229 prime_ideal() ([Link].function_field.order_ratio-
place_infinite() ([Link].function_field.func- nal.FunctionFieldMaximalOrderInfinite_rational
tion_field_rational.RationalFunction- method), 135
Field_global method), 51 prime_ideal() ([Link].function_field.[Link]-
place_set() ([Link].function_field.func- tionFieldPlace method), 220
tion_field.FunctionField method), 26 primitive_element() ([Link]-
places() ([Link].function_field.function_field_poly- tion_field.function_field_polymod.Function-
mod.FunctionField_global method), 58 Field_polymod method), 82
places() ([Link].function_field.function_field_ra- primitive_integal_element_infinite()
tional.RationalFunctionField_global method), ([Link].function_field.function_field_poly-
51 mod.FunctionField_integral method), 62
places_above() ([Link].function_field.func-
tion_field_polymod.FunctionField_simple R
method), 92 random_element() ([Link].function_field.func-
places_finite() ([Link].function_field.func- tion_field_polymod.FunctionField_polymod
tion_field_polymod.FunctionField_global method), 83
method), 59 random_element() ([Link].function_field.func-
places_finite() ([Link].function_field.func- tion_field_rational.RationalFunctionField
tion_field_rational.RationalFunction- method), 48
Field_global method), 52 rank ([Link].function_field.jacobian_base.Jacobian-
places_infinite() ([Link].function_field.func- GroupFunctor attribute), 292
tion_field_polymod.FunctionField_simple rational_function_field() ([Link]-
method), 93 tion_field.function_field.FunctionField method),
PlaceSet (class in [Link].function_field.place), 220 27
point() ([Link].function_field.jacobian_hess.Jaco- RationalFunctionField (class in [Link]-
bianGroup method), 303 tion_field.function_field_rational), 37
point() ([Link].function_field.jacobian_khuri_mak- RationalFunctionField_char_zero (class in
[Link] method), 313 [Link].function_field.function_field_ratio-
poles() ([Link].function_field.[Link]- nal), 49
FieldElement method), 111 RationalFunctionField_global (class in
polynomial() ([Link].function_field.func- [Link].function_field.function_field_ratio-
tion_field_polymod.FunctionField_polymod nal), 49
method), 82 RationalFunctionFieldHigherDeriva-
polynomial() ([Link].function_field.order_ba- tion_global (class in [Link]-
sis.FunctionFieldOrder_basis method), 150 tion_field.derivations_polymod), 268
polynomial() ([Link].function_field.order_ba- relative_degree() ([Link]-
sis.FunctionFieldOrderInfinite_basis method), tion_field.place_polymod.FunctionField-
144 Place_polymod method), 229
polynomial() ([Link].function_field.order_poly- residue() ([Link].function_field.[Link]-
mod.FunctionFieldMaximalOrder_polymod tionFieldDifferential method), 252
method), 167 residue_field() ([Link].function_field.func-
polynomial_ring() ([Link].function_field.func- tion_field_polymod.FunctionField_simple
tion_field_polymod.FunctionField_polymod method), 94
method), 82 residue_field() ([Link].function_field.func-
polynomial_ring() ([Link].function_field.func- tion_field_rational.RationalFunctionField
tion_field_rational.RationalFunctionField method), 48
method), 47 residue_field() ([Link]-
prime_below() ([Link].function_field.ideal_poly- tion_field.place_polymod.FunctionField-
mod.FunctionFieldIdeal_polymod method), 214 Place_polymod method), 230
340 Index
Algebraic Function Fields, Release 10.4
residue_field() ([Link].function_field.place_ra- module, 195
tional.FunctionFieldPlace_rational method), 224 [Link].function_field.ideal_ratio-
residue_field() ([Link].function_field.valua- nal
tion_ring.FunctionFieldValuationRing method), module, 189
259 [Link].function_field.jaco-
reversed_hermite_form() (in module bian_base
[Link].function_field.hermite_form_poly- module, 289
nomial), 324 [Link].function_field.jaco-
ring() ([Link].function_field.[Link]- bian_hess
Ideal method), 182 module, 301
ring() ([Link].function_field.[Link] [Link].function_field.jaco-
method), 187 bian_khuri_makdisi
module, 309
S [Link].function_field.khuri_mak-
[Link].function_field.constructor disi
module, 285 module, 320
[Link].function_field.derivations [Link].function_field.maps
module, 261 module, 269
[Link].function_field.deriva- [Link].function_field.order
tions_polymod module, 127
module, 265 [Link].function_field.order_basis
[Link].function_field.deriva- module, 139
tions_rational [Link].function_field.order_poly-
module, 263 mod
[Link].function_field.differential module, 151
module, 245 [Link].function_field.order_ratio-
[Link].function_field.divisor nal
module, 233 module, 133
[Link].function_field.element [Link].function_field.place
module, 97 module, 217
[Link].function_field.ele- [Link].function_field.place_poly-
ment_polymod mod
module, 123 module, 227
[Link].function_field.element_ra- [Link].function_field.place_ratio-
tional nal
module, 115 module, 223
[Link].function_field.extensions [Link].function_field.valua-
module, 279 tion_ring
[Link].function_field.func- module, 257
tion_field section() ([Link].function_field.[Link]-
module, 3 FieldToFunctionField method), 270
[Link].function_field.func- section() ([Link].function_field.[Link]-
tion_field_polymod FieldToFractionField method), 275
module, 53 separable_model() ([Link].function_field.func-
[Link].function_field.func- tion_field_polymod.FunctionField_polymod
tion_field_rational method), 84
module, 37 set_base_place() ([Link].function_field.jaco-
[Link].function_field.her- bian_base.Jacobian_base method), 300
mite_form_polynomial simple_model() ([Link].function_field.func-
module, 323 tion_field_polymod.FunctionField_polymod
[Link].function_field.ideal method), 86
module, 169 some_elements() ([Link].function_field.func-
[Link].function_field.ideal_poly- tion_field.FunctionField method), 28
mod space_of_differentials() ([Link]-
Index 341
Algebraic Function Fields, Release 10.4
tion_field.function_field.FunctionField method), Field_global method), 59
29
space_of_differentials_of_first_kind() Z
([Link].function_field.function_field.Func- zero() ([Link].function_field.jacobian_hess.Jaco-
tionField method), 30 bianGroup method), 303
space_of_holomorphic_differentials() zero() ([Link].function_field.jacobian_khuri_mak-
([Link].function_field.function_field.Func- [Link] method), 314
tionField method), 31 zero_divisor() ([Link]-
sqrt() ([Link].function_field.element_rational.Func- tion_field.khuri_makdisi.KhuriMakdisi_base
tionFieldElement_rational method), 120 method), 321
subtract() ([Link].function_field.khuri_mak- zeros() ([Link].function_field.[Link]-
disi.KhuriMakdisi_base method), 321 FieldElement method), 113
support() ([Link].function_field.[Link]-
FieldDivisor method), 241
T
top() ([Link].function_field.[Link]-
FieldExtension method), 283
trace() ([Link].function_field.[Link]-
FieldElement method), 112
V
valuation() ([Link].function_field.differen-
[Link] method), 254
valuation() ([Link].function_field.[Link]-
tionFieldDivisor method), 241
valuation() ([Link].function_field.element_ratio-
nal.FunctionFieldElement_rational method), 120
valuation() ([Link].function_field.[Link]-
tionFieldElement method), 112
valuation() ([Link].function_field.func-
tion_field.FunctionField method), 32
valuation() ([Link].function_field.ideal_poly-
mod.FunctionFieldIdeal_polymod method),
215
valuation() ([Link].function_field.ideal_poly-
mod.FunctionFieldIdealInfinite_polymod
method), 200
valuation() ([Link].function_field.ideal_ra-
tional.FunctionFieldIdeal_rational method),
194
valuation() ([Link].function_field.ideal_ratio-
nal.FunctionFieldIdealInfinite_rational method),
191
valuation_ring() ([Link]-
tion_field.place_polymod.FunctionField-
Place_polymod method), 231
valuation_ring() ([Link]-
tion_field.place_rational.FunctionFieldPlace_ra-
tional method), 225
W
weierstrass_places() ([Link]-
tion_field.function_field_polymod.Function-
342 Index