Jacobians in Khuri-Makdisi model¶
This module implements Jacobian arithmetic by Khuri-Makdisi’s algorithms [Khu2004] based on divisor representation by linear spaces.
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 \(g\) be the genus of the function field.
km_large
: large model; requires an effective divisor of degree at least \(2g + 1\)km_medium
: medium model; requires an effective divisor of degree at least \(2g + 1\)km_small
: small model; requires an effective divisor of degree at least \(g + 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 = C.function(y/x).divisor_of_poles()
sage: H.degree()
3
>>> from sage.all 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 = C.function(y/x).divisor_of_poles()
>>> H.degree()
3
P2.<x,y,z> = ProjectiveSpace(GF(29), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) C.geometric_genus() H = C.function(y/x).divisor_of_poles() H.degree()
Now we use \(H\) as base divisor for the large and medium models:
sage: J_large = C.jacobian(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 = C.jacobian(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 sage.all import *
>>> J_large = C.jacobian(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 = C.jacobian(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)
J_large = C.jacobian(model='km_large', base_div=H) J_large J_medium = C.jacobian(model='km_medium', base_div=H) J_medium
and for the small model, we construct an effective divisor of degree 2:
sage: B = sum(H.support()[:2])
sage: B.degree()
2
sage: J_small = C.jacobian(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 sage.all import *
>>> B = sum(H.support()[:Integer(2)])
>>> B.degree()
2
>>> J_small = C.jacobian(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)
B = sum(H.support()[:2]) B.degree() J_small = C.jacobian(model='km_small', base_div=B) J_small
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 \(D - B\) where \(D\) is an effective divisor of the same degree with the base divisor \(B\). The divisor \(D\) in turn is determined by a linear subspace of the Riemann-Roch space associated with certain multiple of \(B\) (depending on the model). This allows representing points of Jacobian as matrices once we fix a basis of the Riemann-Roch space.
EXAMPLES:
sage: # long time
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 = C.function(y/x).divisor_of_poles()
sage: J = C.jacobian(model='km_large', base_div=H)
sage: G = J.group()
sage: D = C([0,1,0]).place()
sage: P1 = C([-1,2,1]).place()
sage: P2 = C([3,7,1]).place()
sage: p1 = G.point(P1 - D)
sage: p2 = G.point(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 sage.all import *
>>> # long time
>>> 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 = C.function(y/x).divisor_of_poles()
>>> J = C.jacobian(model='km_large', base_div=H)
>>> G = J.group()
>>> 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 = G.point(P1 - D)
>>> p2 = G.point(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]
[ 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]
# long time P2.<x,y,z> = ProjectiveSpace(GF(17), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) F = C.function_field() H = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=H) G = J.group() D = C([0,1,0]).place() P1 = C([-1,2,1]).place() P2 = C([3,7,1]).place() p1 = G.point(P1 - D) p2 = G.point(P2 - D) p1 p2 p1 + p2
AUTHORS:
Kwankyu Lee (2022-01-24): initial version
- class sage.rings.function_field.jacobian_khuri_makdisi.Jacobian(function_field, base_div, model, **kwds)[source]¶
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: C.jacobian(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 sage.all 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) >>> C.jacobian(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)
P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) C.jacobian(model='km')
- class sage.rings.function_field.jacobian_khuri_makdisi.JacobianGroup(parent, function_field, base_div)[source]¶
Bases:
UniqueRepresentation
,JacobianGroup_base
Groups of rational points of a Jacobian.
INPUT:
parent
– a Jacobianfunction_field
– a function fieldbase_div
– an effective divisor of the function field
EXAMPLES:
sage: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: h = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: J.group() Group of rational points of Jacobian over Finite Field of size 7 (Khuri-Makdisi large model)
>>> from sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> J.group() Group of rational points of Jacobian over Finite Field of size 7 (Khuri-Makdisi large model)
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) J.group()
- Element[source]¶
alias of
JacobianPoint
- point(divisor)[source]¶
Return the point represented by the divisor.
INPUT:
divisor
– a divisor of degree zero
EXAMPLES:
sage: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: h = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: b = C([0,1,0]).place() sage: p = C([-1,2,1]).place() sage: G.point(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 sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> b = C([Integer(0),Integer(1),Integer(0)]).place() >>> p = C([-Integer(1),Integer(2),Integer(1)]).place() >>> G.point(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]
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G = J.group() b = C([0,1,0]).place() p = C([-1,2,1]).place() G.point(p - b)
- zero()[source]¶
Return the zero element of this group.
EXAMPLES:
sage: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: h = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: G.zero() 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 sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> G.zero() 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]
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G = J.group() G.zero()
- class sage.rings.function_field.jacobian_khuri_makdisi.JacobianGroupEmbedding(base_group, extension_group)[source]¶
Bases:
Map
Embeddings between Jacobian groups.
INPUT:
base_group
– Jacobian group over a base fieldextension_group
– Jacobian group over an extension field
EXAMPLES:
sage: # long time sage: k = GF(5) sage: P2.<x,y,z> = ProjectiveSpace(k, 2) sage: C = Curve(x^3 + z^3 - y^2*z, P2) sage: h = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G1 = J.group() sage: K = k.extension(2) sage: G2 = J.group(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 sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G1 = J.group() >>> K = k.extension(Integer(2)) >>> G2 = J.group(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)
# long time k = GF(5) P2.<x,y,z> = ProjectiveSpace(k, 2) C = Curve(x^3 + z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G1 = J.group() K = k.extension(2) G2 = J.group(K) G2.coerce_map_from(G1)
- class sage.rings.function_field.jacobian_khuri_makdisi.JacobianGroup_finite_field(parent, function_field, base_div)[source]¶
Bases:
JacobianGroup
,JacobianGroup_finite_field_base
Jacobian groups of function fields over finite fields.
INPUT:
parent
– a Jacobianfunction_field
– a function fieldbase_div
– an effective divisor of the function field
EXAMPLES:
sage: # long time 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 = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G1 = J.group() sage: K = k.extension(2) sage: G2 = J.group(K) sage: 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)
>>> from sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G1 = J.group() >>> K = k.extension(Integer(2)) >>> G2 = J.group(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)
# long time k = GF(7) P2.<x,y,z> = ProjectiveSpace(k, 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G1 = J.group() K = k.extension(2) G2 = J.group(K) G2.coerce_map_from(G1)
- Element[source]¶
alias of
JacobianPoint_finite_field
- class sage.rings.function_field.jacobian_khuri_makdisi.JacobianPoint(parent, w)[source]¶
Bases:
JacobianPoint_base
Points of a Jacobian group.
INPUT:
parent
– Jacobian groupw
– matrix
EXAMPLES:
sage: # long time 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 = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: pl = C([3,2,1]).place() sage: G.point(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 sage.all import * >>> # long time >>> 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() >>> h = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> pl = C([Integer(3),Integer(2),Integer(1)]).place() >>> G.point(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]
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) b = C([0,1,0]).place() h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G = J.group() pl = C([3,2,1]).place() G.point(pl - b)
- addflip(other)[source]¶
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: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: h = C.function(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 = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: p1 = G.point(pl1 - b) sage: p2 = G.point(pl2 - b) sage: p1.addflip(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 sage.all import * >>> # long time >>> 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 = C.function(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 = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> p1 = G.point(pl1 - b) >>> p2 = G.point(pl2 - b) >>> p1.addflip(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] >>> _ == -(p1 + p2) True
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() b = C([0,1,0]).place() pl1 = C([-1,2,1]).place() pl2 = C([3,2,1]).place() J = C.jacobian(model='km_large', base_div=h) G = J.group() p1 = G.point(pl1 - b) p2 = G.point(pl2 - b) p1.addflip(p2) _ == -(p1 + p2)
- defining_matrix()[source]¶
Return the matrix whose row span determines the effective divisor representing this point.
EXAMPLES:
sage: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: h = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: b = C([0,1,0]).place() sage: pl = C([-1,2,1]).place() sage: p = G.point(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 sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> b = C([Integer(0),Integer(1),Integer(0)]).place() >>> pl = C([-Integer(1),Integer(2),Integer(1)]).place() >>> p = G.point(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]
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G = J.group() b = C([0,1,0]).place() pl = C([-1,2,1]).place() p = G.point(pl - b) p.defining_matrix()
- divisor()[source]¶
Return the divisor representing this point.
EXAMPLES:
sage: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: F = C.function_field() sage: h = C.function(y/x).divisor_of_poles() sage: J = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: b = F.get_place(1) sage: p = C([-1,2,1]).place() sage: pt = G.point(p - b) sage: G.point(pt.divisor()) == pt True
>>> from sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> J = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> b = F.get_place(Integer(1)) >>> p = C([-Integer(1),Integer(2),Integer(1)]).place() >>> pt = G.point(p - b) >>> G.point(pt.divisor()) == pt True
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) F = C.function_field() h = C.function(y/x).divisor_of_poles() J = C.jacobian(model='km_large', base_div=h) G = J.group() b = F.get_place(1) p = C([-1,2,1]).place() pt = G.point(p - b) G.point(pt.divisor()) == pt
ALGORITHM: Lemma 2.1 of [Khu2004].
- multiple(n)[source]¶
Return the
n
-th multiple of this point.INPUT:
n
– integer
EXAMPLES:
sage: # long time sage: P2.<x,y,z> = ProjectiveSpace(GF(7), 2) sage: C = Curve(x^3 + 5*z^3 - y^2*z, P2) sage: h = C.function(y/x).divisor_of_poles() sage: b = C([0,1,0]).place() sage: pl = C([-1,2,1]).place() sage: J = C.jacobian(model='km_large', base_div=h) sage: G = J.group() sage: p = G.point(pl - b) sage: p.multiple(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 sage.all import * >>> # long time >>> 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 = C.function(y/x).divisor_of_poles() >>> b = C([Integer(0),Integer(1),Integer(0)]).place() >>> pl = C([-Integer(1),Integer(2),Integer(1)]).place() >>> J = C.jacobian(model='km_large', base_div=h) >>> G = J.group() >>> p = G.point(pl - b) >>> p.multiple(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]
# long time P2.<x,y,z> = ProjectiveSpace(GF(7), 2) C = Curve(x^3 + 5*z^3 - y^2*z, P2) h = C.function(y/x).divisor_of_poles() b = C([0,1,0]).place() pl = C([-1,2,1]).place() J = C.jacobian(model='km_large', base_div=h) G = J.group() p = G.point(pl - b) p.multiple(100)