A point on the Jacobian J of a hyperelliptic curve C of genus g is given by a list of three elements:
The identity element on the Jacobian J.
The point on the Jacobian J defined by the polynomials a and b and the positive integer d; if not specified then d is taken to be deg(a).
For points P and Q on a hyperelliptic curve, this constructs the image of the divisor class [P - Q] as a point on its Jacobian J.
Given two sequences S = [P_i] and T = [Q_i] of points on the hyperelliptic curve with Jacobian J, each of length n, returns the image of the divisor class sum_i [P_i] - sum_i [Q_i] as a point on the Jacobian J.
Given a point P on a Jacobian J', construct the image of P on J, where J is a base extension of J'.
A random point on a Jacobian J of a hyperelliptic curve defined over a finite field.
For each of the following functions, P and Q are points on the Jacobian of a hyperelliptic curve.
Returns true if and only if the points P and Q on the same Jacobian are equal.
Returns false if and only if the two points P and Q on the same Jacobian are equal.
Returns true if and only if P is the zero element of the Jacobian.
Given an integer 1 <= i <= 2, returns the i-th defining polynomial for the Jacobian point P, or for i = 3 returns the degree d of the associated reduced divisor.
Given a point P on the Jacobian J of a hyperelliptic curve, the function returns firstly, a sequence containing the two defining polynomials for the divisor associated to P and secondly, the degree of the divisor.
For each of the following functions, P and Q are points on the Jacobian of a hyperelliptic curve.
The additive inverse of the point P on the Jacobian.
The sum of the points P and Q on the same Jacobian.
Given two points P and Q on the same Jacobian, set P equal to their sum.
The difference of the points P and Q on the same Jacobian.
Given two points P and Q on the same Jacobian, set P equal to the difference P - Q.
The n-th multiple of P in the group of rational points on the Jacobian.
Set P equal to the n-th multiple of itself.
Returns the order of the point P on the Jacobian J of a hyperelliptic curve defined over a finite field or the rationals, or 0 if P has infinite order. This first computes #J when J is defined over a finite field.
Alg: MonStg Default: "Shanks"
UseInversion: BoolElt Default: true
Returns the order of the point P where u and l are bounds for the order of P or for the order of J the parent of P. This does not compute #J.
If the parameter Alg is set to "Shanks" then the generic Shanks algorithm is used, otherwise, when Alg is "PollardRho", a Pollard-Rho variant is used (see [GH00]).
If UseInversion is true the search space is halved by using point negation.
Alg: MonStg Default: "Shanks"
UseInversion: BoolElt Default: true
Returns the order of the point P where u and l are bounds for the order of P or for the order of J the parent of P and where some modular information is known about that order. This does not compute #J.
The two parameters Alg and UseInversion have the same functions as in the previous function.
Given a point P on the Jacobian J of a hyperelliptic curve and a positive integer n, returns true if the order of the point is n.
Check: BoolElt Default: true
Given a point P that lies on the Jacobian J of a hyperelliptic curve that is defined over the finite field k=F_q, determine the image of P under the Frobenius map x -> x^(q). If Check is true, Magma verifies that the Jacobian of P is defined over k.
Computes the Weil pairing of P and Q, where P and Q are m-torsion points on the 2-dimensional Jacobian J defined over a finite field. Note that a trivial result does not mean that the points are dependent.
The following illustrates the use of the Weil Pairing in the MOV-reduction of the discrete logarithm problem on a Jacobian.
> PP<x>:=PolynomialRing(GF(2)); > h := PP!1; > f := x^5 + x^4 + x^3 + 1; > J := Jacobian(HyperellipticCurve(h,f)); // a supersingular curve > Jext := BaseExtend(J, 41); > Factorization(#Jext); [ <7, 1>, <3887047, 1>, <177722253954175633, 1> ] > m := 177722253954175633; // some big subgroup order > cofact := 3887047*7; > P := cofact*Random(Jext); > Q := 876213876263897634*P; // Q in <P>
Say we want to recompute the logarithm of Q in base P.
> Jext2 := BaseExtend(Jext, 6); // go to an ext of deg 6 > NJ := #Jext2; > > R := Random(Jext2); > R *:= NJ div m^Valuation(NJ, m); > > eP := WeilPairing(Jext2!P, R, m); > eQ := WeilPairing(Jext2!Q, R, m); > assert eP^876213876263897634 eq eQ;
So the discrete log problem on the Jacobian has been reduced to a discrete log problem in a finite field.