# 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]#

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]#

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 = 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 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)
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]#

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 = 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]#
class sage.rings.function_field.jacobian_khuri_makdisi.JacobianPoint(parent, w)[source]#

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 = 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]


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

class sage.rings.function_field.jacobian_khuri_makdisi.JacobianPoint_finite_field(parent, w)[source]#