Jacobians in the Khuri-Makdisi model - Algebraic Function Fields

Skip to content
Back to top
View this page
Edit this page

# Jacobians in the 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

    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

Python

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

    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)

[Python]

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

    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)

Python

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

    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]

Python

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

  Bases: `UniqueRepresentation`, `Jacobian_base`

  Jacobians implemented by Khuri-Makdisi’s algorithms.

  EXAMPLES:

  Sage

      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)

  Python

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

  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

      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)

  Python

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

    alias of `JacobianPoint`

  point(divisor)

    Return the point represented by the divisor.

    INPUT:

    - `divisor` – a divisor of degree zero

    EXAMPLES:

    Sage

        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]

    Python

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

    Return the zero element of this group.

    EXAMPLES:

    Sage

        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]

    Python

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

  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

      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)

  Python

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

  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

      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)

  Python

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

    alias of `JacobianPoint_finite_field`

class sage.rings.function_field.jacobian_khuri_makdisi.JacobianPoint(parent, w)

  Bases: `JacobianPoint_base`

  Points of a Jacobian group.

  INPUT:

  - `parent` – Jacobian group

  - `w` – matrix

  EXAMPLES:

  Sage

      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]

  Python

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

    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

        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

    Python

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

    Return the matrix whose row span determines the effective divisor representing this point.

    EXAMPLES:

    Sage

        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]

    Python

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

    Return the divisor representing this point.

    EXAMPLES:

    Sage

        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

    Python

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

    Deprecated alias of `self * n`.

class sage.rings.function_field.jacobian_khuri_makdisi.JacobianPoint_finite_field(parent, w)

  Bases: `JacobianPoint`, `JacobianPoint_finite_field_base`