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
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)
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)
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: 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 *
>>> 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]
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)
- 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: 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 * >>> 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)
- Element[source]#
alias of
JacobianPoint
- point(divisor)[source]#
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 = 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 * >>> 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]
- zero()[source]#
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 = 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 * >>> 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]
- 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: 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 * >>> 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)
- 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: 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 * >>> 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)
- 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: 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 * >>> 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]
- 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: 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 * >>> 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
- defining_matrix()[source]#
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 = 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 * >>> 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]
- divisor()[source]#
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) 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 * >>> 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
ALGORITHM: Lemma 2.1 of [Khu2004].
- multiple(n)[source]#
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 = 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 * >>> 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]