Analytic Jacobians of Hyperelliptic Curves

This section contains descriptions of functions pertaining to the creation and use of analytic Jacobians for hyperelliptic curves.

Suppose C is a curve of genus g defined over the complex numbers. The analytic Jacobian of the curve is an abelian torus and is constructed as follows: We view the complex points on the curve, C(C), as a compact Riemann surface of genus g. It is known that the dimension of the vector space of holomorphic differentials is equal to the genus of the curve. So let φi, i = 1, 2, ... , g be a basis for this vector space and set /line(φ) = ()t1, ..., φg), a vector of holomorphic 1-forms. For a hyperelliptic curve there is a natural choice of holomorphic differentials, namely φi = xi - 1dx/y. We can now define a mapping (Int) : C -> Cg by P |-> intP^∞/line(φ). To remove the dependency of this mapping on the path of integration, we define Λ to be the image of the map from the first homology group of C, H1(C, Z), to Cg which sends a closed path, σ ∈H1(C, Z), on the Riemann surface to intσ /line(φ). Then Λ turns out to be a lattice in Cg and so we get the complex torus Cg/Λ. We then see that (Int) is a well-defined mapping from C into Cg/Λ. We extend this mapping additively to the divisors of degree zero on C. The Abel part of the Abel-Jacobi theorem states that two divisors map to the same image under (Int) if and only if they are linearly equivalent. The Jacobi part of the theorem asserts that the map is onto. So there is a bijection between the points of Cg/Λ and the points of the (algebraic) Jacobian.

So far the analytic Jacobian Cg/Λ is just a torus, but it can be made into an abelian manifold by choosing a polarization. Let A1, ..., Ag, B1, ..., Bg be a symplectic homology basis. That is, the Ai and Bi are closed paths on the Riemann surface such that all intersection numbers are 0 except that Ai intersects Bi with intersection number 1 for each i. Let ω1 and ω2 be the g x g-matrices with entries (ω1)ij = intBj φi, and (ω2)ij = intAj φi. Then the columns of P = (ω1, ω2) form a Z-basis for the lattice Λ = P Z2g. The matrix P is called the (big) period matrix. The space of complex, symmetric g x g matrices with positive definite imaginary part is called the Siegel upper-half space of degree g. Because we chose a symplectic basis for the homology it follows that τ = ω2 - 1ω1 is an element of Siegel upper half-space. We will refer to τ as the small period matrix.

Set

J = (0 1_g)
    (-1_g 0).
If we define E(P x, P y) = ()tx J y, for any x, y ∈R2g, then E is a Riemann form for the torus Cg/Λ and so the torus acquires a polarization. The existence of a Riemann form on a torus is a necessary and sufficient condition for the torus to be embeddable into projective space. The image is isomorphic to the (algebraic) Jacobian.

In order for the theory describing the map from the analytic Jacobian to the algebraic Jacobian (see Mumford [Mum84]) to work we actually need a special symplectic basis linked to a particular ordering of the roots of the hyperelliptic polynomial. For an example of such a basis see Mumford [Mum84, Chap III.5]. The basis used can be obtained using the function HomologyBasis and the roots in the corresponding order are stored as the attribute A`Roots (where A is an analytic Jacobian).

Note: many of the function with analytic Jacobians use complex approximations, and indelicacies involving these can cause the functions to fail. One common remedy is to first transform the hyperelliptic curve before applying the analytic Jacobian machinery, either by translating or by inverting x -> 1/x. This can often have the effect of changing the internal computations sufficiently that any errors are avoided.

Contents

Creation and Access Functions

AnalyticJacobian(f) : RngUPolElt -> AnHcJac
Given f ∈C[x] where C is a complex field (see Chapter REAL AND COMPLEX FIELDS), this function returns the analytic Jacobian of the hyperelliptic curve defined by y2 = f(x). The polynomial must have degree at least 3 and the complex field precision at least 20 and, for the moment, less than 2000.
HyperellipticPolynomial(A) : AnHcJac -> RngUPolElt
Returns the polynomial defining the hyperelliptic curve whose Jacobian is A.
HomologyBasis(A) : AnHcJac -> SeqEnum, SeqEnum, Mtrx
The symplectic homology basis used for the computation of the period matrix of the Jacobian A. First assume that HyperellipticPolynomial(A) has odd degree. The function HomologyBasis(A) returns three values which we label basepoints, loops and S. Then basepoints is a list of points in the complex plane. The return valueloops is a list of 2g lists of indices into basepoints. So the list [i1, i2, i3, ...] corresponds to the loop consisting of joining the straight lines from basepoints[in] to basepoints[in+1] for i = 1, 2, .... These closed loops form a homology basis for the curve but probably not a symplectic basis. The third return value, S, is a matrix giving the linear combinations of the loops that were used to form a symplectic homology basis and to compute the period matrix.

If HyperellipticPolynomial(A) has even degree then the returned homology basis is not for the Riemann surface for this curve, but for the curve of odd degree obtained by sending a = A`InfiniteRoot to infinity through the linear fractional transformation given by x |-> 1/(x - a). So one needs to apply the inverse transformation to the returned basis in order to get the basis that was used to compute the period matrix.

Dimension(A) : AnHcJac -> RngIntElt
Genus(A) : AnHcJac -> RngIntElt
The dimension of the Jacobian A as a complex abelian variety. This is equal to the genus of the curve C for which A is the Jacobian.
BaseField(A) : JacHyp -> Fld
BaseRing(A) : JacHyp -> Rng
CoefficientRing(A) : JacHyp -> Rng
The base field of the Jacobian A.

Period Matrices

SmallPeriodMatrix(A) : AnHcJac -> AlgMatElt
The small period matrix of the analytic Jacobian A. If A has dimension g or equivalently the hyperelliptic curve has genus g, then this is a symmetric g x g matrix with positive definite imaginary part. If P = (ω1, ω2) is the full period matrix (see BigPeriodMatrix) then the small period matrix is defined by ω2 - 1 ω1.
BigPeriodMatrix(A) : AnHcJac -> AlgMatElt
The full period matrix of the hyperelliptic curve of the Jacobian A. If A has dimension g or equivalently the hyperelliptic curve has genus g, then this is a g x 2g matrix. The analytic Jacobian as a torus equals Cg/Λ, where Λ is the Z-lattice spanned by the columns of the period matrix. The period matrix is computed with respect to the holomorphic differentials φi = xi - 1dx/y and a symplectic basis for the homology that can be retrieved using HomologyBasis.
PeriodMapping(A, n) : ModSym, RngIntElt -> Map
    Precision: RngIntElt                Default: 0
The complex period mapping to precision Precision, computed using n terms of q-expansion and complex precision 30 if the optional parameter Precision is 0 (default) or using an appropriate number of terms if Precision is non-zero. The period map is a homomorphism M -> Cd, where d is the dimension of A.

The period mapping attached to the space of modular symbols A, computed using n terms of the q-expansions of modular forms associated to A. If the parameter Precision is set to some positive integer, the parameter n is ignored. Instead, the number of terms of the q-expansions needed to have a result of complex precision Precision (i.e., < 10^(-(Precision))) is computed. The period mapping is a homomorphism from AmbientSpace(A) to a complex vector space of dimension equal to the number of newform conjugates.

Periods(M, n) : ModSym, RngIntElt -> SeqEnum
    Precision: RngIntElt                Default: 0
The complex period lattice associated to M using n terms of the q-expansions and complex precision 30 if the optional parameter Precision is 0 (default) or using an appropriate number of terms is Precision is non-zero.

The complex period lattice associated to the space of modular symbols M, computed using Precision terms of the q-expansions of modular forms associated to M. If the parameter Precision is set to some positive integer, the parameter n is ignored. Instead, the number of terms of the q-expansions needed to have a result of complex precision Precision (i.e., < 10^(-(Precision))) is computed.

Maps between Jacobians

ToAnalyticJacobian(x, y, A) : FldComElt, FldComElt, AnHcJac -> Mtrx
Let A be the analytic Jacobian of y2 = f(x). This function maps the point (x, y) on the curve to the analytic Jacobian. More precisely, let a = ∞ when HyperellipticPolynomial has odd degree and a = A`InfiniteRoot otherwise. Then it maps the divisor (x, y) - (a, 0) to the analytic Jacobian. As any point on the algebraic Jacobian is simply a sum of such divisors, we can get its image by linearity of the map. The function returns a g x 1 matrix. This should be thought of as an element of Cg / Λ where Λ is the Z-lattice generated by the columns of the BigPeriodMatrix.
FromAnalyticJacobian(z, A) : Mtrx, AnHcJac -> SeqEnum
Let A be an analytic Jacobian of y2 = f(x), with small period matrix τ. Let z be a g x 1 complex matrix (thought of as an element of Cg / Λ where Λ is the Z-lattice generated by the columns of the BigPeriodMatrix). This function returns a list of g (the dimension of A), or fewer, pairs Pi = < xi, yi > satisfying y2 = f(x). This is an element of the algebraic Jacobian when interpreted as the divisor ∑i=1g Pi - g∞.

Example CrvHyp_Analytic_Jacobian_Addition (H134E43)

We give an example of moving between the algebraic and analytic Jacobians. We take two points on an algebraic Jacobian, map them to the analytic Jacobian, add them there and map the answer back to the algebraic Jacobian. We check that the answer corresponds to adding the points on the algebraic Jacobian.
> P<x> := PolynomialRing(RationalField());
> f := -8*x^5 - 14*x^4 + 28*x^3 - 30*x^2 + 6*x;
> C := HyperellipticCurve(f);
> J := Jacobian(C);
> pts := ReducedBasis(RationalPoints(J:Bound:=500)); pts;
[ (x^2 + 1, -3*x + 5, 2), (x^2 - 4/9*x + 1/9, -55/27*x + 43/27, 2) ]
This Jacobian has rank 2 and these are two generators. We will use them as our two points.
> P1 := pts[1]; P2 := pts[2];
> C<I> := ComplexField(50);
> K<x> := PolynomialRing(C);
> f2 := Evaluate(f,x);
> div1 := [r[1] : r in Roots(Evaluate(ElementToSequence(P1)[1],x))];
> div1 := [<d1,Evaluate(ElementToSequence(P1)[2],d1)> : d1 in div1];
> div2 := [r[1] : r in Roots(Evaluate(ElementToSequence(P2)[1],x))];
> div2 := [<d1,Evaluate(ElementToSequence(P2)[2],d1)> : d1 in div2];
> A := AnalyticJacobian(f2);
We are working with 50 decimal places. The sequences div1 and div2 are the two points on the algebraic Jacobian represented as pairs of < x, y > coordinates.
> pt1 := &+[ToAnalyticJacobian(d[1],d[2],A) : d in div1];
> pt2 := &+[ToAnalyticJacobian(d[1],d[2],A) : d in div2];
Now pt1 and pt2 are the images of the two points P1 and P2 on the analytic Jacobian (two 2 x 1 matrices).
> sum := FromAnalyticJacobian(pt1+pt2,A);
> sum;
[ <0.62500000000000000000000000000000000000000000000024 +
-1.4999999999999999999999999999999999999999999999992*I,
1.7343750000000000000000000000000000000000000000053 +
-11.718749999999999999999999999999999999999999999985*I>,
<0.62500000000000000000000000000000000000000000000036 +
1.4999999999999999999999999999999999999999999999992*I,
1.7343750000000000000000000000000000000000000000075 +
11.718749999999999999999999999999999999999999999986*I> ]

Now we have mapped sum back to the algebraic Jacobian where it is given as a sequence of two < x, y > coordinates. We compare the polynomial having these two x-coordinates as roots, with the algebraic sum of P1 and P2.

> clst := Coefficients((x-sum[1][1])*(x-sum[2][1]));
> xpol := P![BestApproximation(Re(c),1000) : c in clst];
> xpol;
x^2 - 5/4*x + 169/64
> P1+P2;
(x^2 - 5/4*x + 169/64, 125/16*x - 403/128, 2)
Isomorphisms, Isogenies and Endomorphism Rings of Analytic Jacobians

In this section we discuss the functionality provided for finding isomorphisms and isogenies between different analytic Jacobians and also for computing the endomorphism ring of an analytic Jacobian.

Suppose we have two abelian varieties A1 = Cg1 and A2 = Cg2 with a morphism φ : A1 |-> A2. This map lifts to a map Cg |-> Cg, given by some complex g x g matrix, α. This is called the complex representation of φ. Suppose Λi is spanned by the columns of the g x 2g matrix Pi. As φ(Λ1) ⊂Λ2, we see that there must exist an integral 2g x 2g matrix M such that α P1 = P2 M. M is called the rational representation of φ. If A1 and A2 are isomorphic and P1 and P2 are Frobenius bases, that is, they provide a basis with respect to which the polarization is given by the matrix J = (0 1_g; -1_g 0), then it follows that M must be a symplectic matrix. That is, M must be such that MJ()tM = J. The symplectic matrices act on Siegel upper half-space. If M = (a b; c d) is a symplectic matrix and τ an element of Siegel upper half-space, then the action is given by τ |-> (a τ + b)(c τ + d) - 1. Note that if there is an isomorphism from A1 to A2 with rational representation M then τ1 equals the result of letting ()tM (not M) act on τ2.

In the case of finding isomorphisms between abelian surfaces, the code makes use of a fundamental domain for 2-dimensional upper half-space (see [Got59]). This often works well even with relatively low precision. The other functions all rely on the function LinearRelation and work with greater reliability if a high precision is chosen. This also means that it can happen that these functions miss finding a map. Even if a map is reported it might be an artifact of insufficient precision causing LinearRelation to identify a relation that disappears at higher precision. Of course, every effort was made to make these functions work as well as possible and no cases are known where sufficient precision fails to give correct results.

To2DUpperHalfSpaceFundamentalDomain(z) : Mtrx -> Mtrx, Mtrx
Given a complex matrix in 2-dimensional Siegel upper half-space (that is a symmetric matrix with positive definite imaginary part), this function returns two matrices. The first is an element of the fundamental domain for 2-dimensional Siegel upper half-space described by Gottschling in [Got59] and the second is a symplectic matrix that takes the input to the first return value. Note that if the input is equivalent to an element on the border of the fundamental domain the returned value might depend heavily on the least significant digits of the input.
AnalyticHomomorphisms(t1, t2) : Mtrx, Mtrx -> SeqEnum
Given two small period matrices t1 and t2, this function returns a basis for the Z-module of 2g x 2g integer matrices M such that there exists a complex g x g matrix α such that α (t1, 1) = (t2, 1) M.
IsIsomorphicSmallPeriodMatrices(t1,t2) : Mtrx, Mtrx -> Bool, Mtrx
For two small period matrices t1 and t2, this function finds a 2g x 2g symplectic integer matrix M such that there exists a complex g x g matrix α such that α (t1, 1) = (t2, 1) M. Such matrices define isomorphisms between the corresponding analytic Jacobians. The first return value is true if such a matrix is found, false otherwise. The second return value is the matrix, if found. Zero matrix otherwise.
IsIsomorphicBigPeriodMatrices(P1, P2) : Mtrx, Mtrx -> Bool, Mtrx, Mtrx
For two big period matrices P1 and P2, this function finds a 2g x 2g symplectic integer matrix M such that there exists a complex g x g matrix α such that α P1 = P2 M. Such matrices define isomorphisms between the corresponding analytic Jacobians. The first return value is true if such a matrix is found, false otherwise. The second and third return values are M and α, if found.
IsIsomorphic(A1, A2) : AnHcJac, AnHcJac -> Bool, Mtrx, Mtrx
For two analytic Jacobians A1 and A2 with big period matrices P1 and P2, this function finds a 2g x 2g symplectic integer matrix M such that there exists a complex g x g matrix α such that α P1 = P2 M. Such matrices define isomorphisms between the analytic Jacobians. The first return value is true if such a matrix is found, false otherwise. The second and third return values are M and α, if found.
IsIsogenousPeriodMatrices(P1, P2) : Mtrx, Mtrx -> Bool, Mtrx
For two period matrices (small or big) P1 and P2, this function finds a nonsingular 2g x 2g integer matrix M such that there exists a complex g x g matrix α such that α (P1, 1) = (P2, 1) M, in case of small period matrices, or α P1 = P2 M for big period matrices. Such a matrix defines an isogeny between the corresponding analytic Jacobians. The first return value is true if such a matrix is found, false otherwise. The second return value is M, if found. In the case of big period matrices α is the third return value.
IsIsogenous(A1, A2) : AnHcJac, AnHcJac -> Bool, Mtrx, Mtrx
For two analytic Jacobians A1 and A2 with big period matrices P1 and P2, this function finds a nonsingular 2g x 2g integer matrix M such that there exists a complex g x g matrix α such that α P1 = P2 M. Such a matrix defines an isogeny between the analytic Jacobians. The first return value is true if such a matrix is found, false otherwise. The second and third return values are M and α, if found.
EndomorphismRing(P) : Mtrx -> AlgMat
This function returns the endomorphism ring, as a matrix algebra, of the analytic Jacobian associated to the given period matrix P. If a big period matrix, P, is given then it also returns a list of α-matrices such that α P = P M, for each generator, M, of the matrix algebra.
EndomorphismRing(A) : AnHcJac -> AlgMat, SeqEnum
This function returns the endomorphism ring, as a matrix algebra, of the given analytic Jacobian A. Suppose the analytic Jacobian has big period matrix P. The second return value is a list of α-matrices such that α P = P M, for each generator, M, of the matrix algebra.

Example CrvHyp_Find_Rational_Isogeny (H134E44)

We give an example of how magma can be used to find rational isogenies between the Jacobians of genus 2 curves. Let us consider the two curves y2 = x5 - 4x4 + 8x2 - 4x, and y2 = x5 + 4x4 + 10x3 + 12x2 + x. These are curves 1 and 3 in the twenty second isogeny class of Smart [Sma97]. We compute their analytic Jacobians to 100 decimal places.
> K<x> := PolynomialRing(RationalField());
> C<i> := ComplexField(100);
> KC<xc> := PolynomialRing(C);
> f1 := x^5 - 4*x^4 + 8*x^2 - 4*x;
> f1C := Evaluate(f1,xc);
> A1 := AnalyticJacobian(f1C);
> f2 := x^5 + 4*x^4 + 10*x^3 + 12*x^2 + x;
> f2C := Evaluate(f2,xc);
> A2 := AnalyticJacobian(f2C);
We now get a basis for the Z-module of isogenies from A1 to A2. Note that IsIsogenous returns true for these two Jacobians, but it does not return an isogeny defined over Q.
> Mlst := AnalyticHomomorphisms(SmallPeriodMatrix(A1),SmallPeriodMatrix(A2));
> Mlst;
[
  [ 1  0 -1  0]
  [ 0  1  0  0]
  [ 1  1  1  0]
  [ 1  1 -1  2],
  [ 1  0  1  0]
  [ 0  0  0 -1]
  [-1  0  1 -1]
  [ 1  2  1 -1],
  [ 0  1  0 -1]
  [ 1  0  0  0]
  [ 1  1  0  1]
  [ 1  1  2 -1],
  [ 0  1  0  1]
  [ 0  0 -1  0]
  [ 0 -1 -1  1]
  [ 2  1 -1  1]
]
>
For each of these four "M" matrices let us find the corresponding α matrices.
> P1 := BigPeriodMatrix(A1);
> P2 := BigPeriodMatrix(A2);
> alst := [Submatrix(P2*Matrix(C,M),1,1,2,2)
>          *Submatrix(P1,1,1,2,2)^-1 : M in Mlst];
> alst[1][1,1];
9.49857267318279326916448048991143479789137754919824276557860348643797948105949
8481543257426864218501E-101 + -1.4142135623730950488016887242096980785696718753
76948073176679737990732478462107038850387534327641573*i
>
So at least alst[1] does not correspond to a rational isogeny. In general none of the four α-matrices might correspond to a rational isogeny. But it is possible that some Z-linear combination of them is defined over the rationals and we want to know whether this actually happens. We can find out by recognizing the entries of the α-matrices as algebraic numbers. This can be done using the PowerRelation function.
> SetDefaultRealFieldPrecision(100);
> pol := PowerRelation(C!alst[4][1,1],8:Al:="LLL");
> Evaluate(pol,x);
x^4 + 2*x^2 - 1
It turns out that every entry of each of the alst matrices is in the number field defined by the polynomial x8 + 12x6 + 34x4 + 52x2 + 1. We can use LinearRelation to write each entry as a linear combination of the elements of a power basis for this number field. For example:
> aroot := C!Roots(Evaluate(x^8 + 12*x^6 + 34*x^4 + 52*x^2 + 1,xc))[1][1];
> basis := [aroot^i : i in [0..7]];
> LinearRelation(Append(basis,alst[1][1,1]));
[ 0, 411, 0, 293, 0, 107, 0, 9, -40 ]
So we can write each α-matrix as an algebraic number in the number field defined by x8 + 12x6 + 34x4 + 52x2 + 1. It is then a simple matter to find a linear combination of the α-matrices that is defined over Q. In this particular case we get lucky and alst[3] itself is already rational:
> alpha := alst[3];
> alpha;
[1.1429873912822749822157835483053409594519099948227986612151258432276326359067
  38195675448021860172030E-100 + 1.23928539763340698646676489320756860362798512
  5201250666217517621001351893530963357790883492962362769E-100*i
  -0.99999999999999999999999999999999999999999999999999999999999999999999999999
  99999999999999999999999999 + -1.186746029522145753827915120679934647863639129
  872566393745293697438092777106745249196918175632802507E-100*i]
[-2.000000000000000000000000000000000000000000000000000000000000000000000000000
  000000000000000000000000 + 8.334710799700090834903499884806428065464872993741
  227568734726305245439778438567887663105063271942125E-101*i
  1.000000000000000000000000000000000000000000000000000000000000000000000000000
  000000000000000000000000 + -1.29064186778300376477121365149925086148800581946
  5331943514008039451662739730964143625816137036994307E-100*i]
> Matrix(2,2,[Round(Real(x)) : x in Eltseq(alpha)]);
[ 0  1]
[ 2 -1]
So the two Jacobians are Q-isogenous. We can use alpha to map points from the one Jacobian to the other. We check that it maps rational points to rational points.
> C1 := HyperellipticCurve(f1);
> J1 := Jacobian(C1);
> pts1 := RationalPoints(J1:Bound:=500);
> pts1;
{@ (1, 0, 0), (x^2 - 2*x + 1, 1/2*x + 1/2, 2), (x^2 - 2*x + 1, -1/2*x - 1/2, 2),
(x, 0, 1), (x - 1, 1, 1), (x - 1, -1, 1), (x^2 - 2, 0, 2), (x^2 + 2, 4*x, 2),
(x^2 + 2, -4*x, 2), (x^2 - x, x, 2), (x^2 - x, -x, 2), (x^2 - 4*x - 2, 4*x, 2),
(x^2 - 4*x - 2, -4*x, 2), (x^2 - 4*x + 2, 0, 2), (x^2 - 9/4*x - 4, 3/8*x - 2,
2), (x^2 - 9/4*x - 4, -3/8*x + 2, 2), (x^2 - 52/9*x + 50/9, 152/27*x - 160/27,
2), (x^2 - 52/9*x + 50/9, -152/27*x + 160/27, 2), (x^2 + 16/25*x - 18/25,
  152/125*x - 96/125, 2), (x^2 + 16/25*x - 18/25, -152/125*x + 96/125, 2) @}
> P1 := pts1[8]; P1;
(x^2 + 2, 4*x, 2)
> div1 := [r[1] : r in Roots(Evaluate(ElementToSequence(P1)[1],xc))];
> div1 := [<d1,Evaluate(ElementToSequence(P1)[2],d1)> : d1 in div1];
> pt1 := &+[ToAnalyticJacobian(d[1],d[2],A1) : d in div1];
> P2 := FromAnalyticJacobian(alpha*pt1,A2);
> clst := Coefficients((xc-P2[1][1])*(xc-P2[2][1]));
> xpol := K![BestApproximation(Re(c),10^50) : c in clst];
> xpol;
x^2 + x + 1
> C2 := HyperellipticCurve(f2);
> J2 := Jacobian(C2);
> pts2 := RationalPoints(J2:Bound:=500);
> pts2;
{@ (1, 0, 0), (x^2 + 2*x + 1, x - 1, 2), (x^2 + 2*x + 1, -x + 1, 2), (x + 1, 2,
1), (x + 1, -2, 1), (x, 0, 1), (x^2 + x, 2*x, 2), (x^2 + x, -2*x, 2), (x^2 + x +
  1, 2*x - 1, 2), (x^2 + x + 1, -2*x + 1, 2), (x^2 - 23*x - 16, 122*x + 84, 2),
(x^2 - 23*x - 16, -122*x - 84, 2), (x^2 + 23/4*x + 9, 59/8*x + 57/2, 2), (x^2 +
  23/4*x + 9, -59/8*x - 57/2, 2), (x^2 - 106/9*x + 1/9, 2599/54*x - 19/54, 2),
(x^2 - 106/9*x + 1/9, -2599/54*x + 19/54, 2), (x^2 - 9/16*x - 1/16, 269/64*x +
  21/64, 2), (x^2 - 9/16*x - 1/16, -269/64*x - 21/64, 2) @}
ToAnalyticJacobianMumford(pt, AJ) : JacHypPt, AnHcJac-> Mtrx
Given a point pt on the Jacobian of a hyperelliptic curve over Q with Analytic Jacobian AJ, return the image of pt under the Abel-Jacobi map of AJ, i.e., a complex (g x 1)-column vector representing a point on the complex torus associated to AJ.
ToAnalyticJacobianMumford(pt, AJ, conj) : JacHypPt, AnHcJac, RngIntElt -> Mtrx
Map the point on the Jacobian over a number field K to the analytic Jacobian using the conj'th embedding of K into the complex numbers. This function is the same as the previous one, except that the hyperelliptic curve can be defined over a number field K and that the third parameter gives the index of the embedding of K into the complex numbers.
FromAnalyticJacobianProjective(z, A) : Mtrx[FldCom], AnHcJac -> SeqEnum
This returns a divisor consisting of points on the projective curve over the complex numbers with coordinates (x:y:z) corresponding to z. This function is the same as FromAnalyticJacobian except that it returns points in weighted projective space (P)1, g + 1, 1 where g is the genus of the hyperelliptic curve X. In contrast to FromAnalyticJacobian, it also works if the divisor on X representing the point has a point lying on the line at infinity, i.e., z != 1.

From Period Matrix to Curve

RosenhainInvariants(t) : Mtrx -> Set
Given a small period matrix t corresponding to an analytic Jacobian A of genus g, this function returns a set S of 2g - 1 complex numbers such that the hyperelliptic curve y2 = x(x - 1) ∏s ∈S (x - s) has Jacobian isomorphic to A. The name of the function comes from the fact that a hyperelliptic curve in the form y2 = x(x - 1)(x - λ1)...(x - λ2g - 1) is said to be in Rosenhain normal form.

Example CrvHyp_Find_CM_Curve (H134E45)

We give an example of how magma can be used to find the equation of a genus 2 curve whose Jacobian has Complex Multiplication by a given field. We use the field Q(Sqrt( - 2 + √(2))).
> SetSeed(1);
> Q := RationalField();
> P<x> := PolynomialRing(Q);
> R<s> := NumberField(x^2-2);
> PP<x> := PolynomialRing(R);
> RF := NumberField(x^2-(-2+s));
> CMF<t> := AbsoluteField(RF);
> O := MaximalOrder(CMF);
Now, for a CM type Φ, and O the ring of integers, C2/Φ((O)) is a torus with Complex Multiplication by the maximal order of our field Q(Sqrt( - 2 + √(2))). In order for this to be an abelian variety we have to find a principal polarization. This can be done using Algorithm 1 in [Wam99]. In this case it turns out that a principal polarization is essentially given by a generator of the inverse different.
> D := Different(O);
> IsPrincipal(D);
true
> xi := -1/8*O.2; // a chosen generator of D^-1
> xi*O eq D^-1;
true
> auts := Automorphisms(CMF : Abelian := true);
> cc := auts[3];
> cc(cc(t)) eq t;
true
> cc(xi^2) eq xi^2;
true
So cc is complex multiplication and xi squared is in the real subfield. By Theorem 3 of [Wam99] we see that this gives a principal polarization. We now find a Frobenius basis for our lattice with respect to the non-degenerate Riemann form given by xi.
> Z := IntegerRing();
> E := Matrix(Z,4,4,[Trace(xi*cc(a)*b) : b in Basis(O), a in Basis(O)]);
> D, C := FrobeniusFormAlternating(E); D;
[ 0  0  1  0]
[ 0  0  0  1]
[-1  0  0  0]
[ 0 -1  0  0]
> newb := ElementToSequence(Matrix(O,C)*Matrix(O,4,1,Basis(O)));
> SetKantPrecision(O,100);
> Abs(Re(Conjugate(xi,2))) lt 10^-10 and Im(Conjugate(xi,2)) gt 0;
true
> Abs(Re(Conjugate(xi,4))) lt 10^-10 and Im(Conjugate(xi,4)) gt 0;
true
The CM type Φ is given by the second and fourth complex embeddings. We can finally write down a big period matrix and find the element in the Siegel upper half-space corresponding to our CM Jacobian:
> C := ComplexField(100);
> BigPM := Matrix(C,2,4,[Conjugate(b,2) : b in newb] cat
>                       [Conjugate(b,4) : b in newb]);
> tau := Submatrix(BigPM,1,3,2,2)^-1*Submatrix(BigPM,1,1,2,2);
We can use EndomorphismRing to check that the analytic Jacobian corresponding to tau does have CM by the correct field:
> MA := EndomorphismRing(tau); Dimension(MA);
4
> MAGens := SetToSequence(Generators(MA)); MAGens;
[
    [-1  0  0  0]
    [ 0 -1  0  0]
    [ 0  0 -1  0]
    [ 0  0  0 -1],
    [  0   0 -17  -7]
    [  0   0  -7  -3]
    [  5 -12   0   0]
    [-12  29   0   0]
]
> MP := [MinimalPolynomial(g): g in MAGens];
> IsIsomorphic(NumberField(rep{f: f in MP | Degree(f) gt 1}), CMF);
true
Now let us find a curve with this Jacobian.
> S := RosenhainInvariants(tau);
> P<x> := PolynomialRing(C);
> f := x*(x-1)*&*{x-a : a in S};
> IC := IgusaClebschInvariants(f);
> ICp := [BestApproximation(Re(r),10^50) : r in
>          [IC[1]/IC[1], IC[2]/IC[1]^2, IC[3]/IC[1]^3, IC[4]/IC[1]^5]];
> ICp;
[ 1, 5/324, 31/5832, 1/1836660096 ]
> C1 := HyperellipticCurveFromIgusaClebsch(ICp);
> C2 := ReducedWamelenModel(C1);
> C2;
Hyperelliptic Curve defined by y^2 = -x^5 - 3*x^4 + 2*x^3 + 6*x^2 - 3*x - 1
over Rational Field
Let's check that this curve's analytic Jacobian is isomorphic to the one corresponding to tau.
> P<x> := PolynomialRing(C);
> f := -x^5 - 3*x^4 + 2*x^3 + 6*x^2 - 3*x - 1;
> A := AnalyticJacobian(f);
> IsIsomorphicSmallPeriodMatrices(tau,SmallPeriodMatrix(A));
true
[ 1 -2  0  0]
[ 0  0  2  1]
[ 1 -2  5  2]
[ 2 -5  4  2]

Voronoi Cells

This section describes two functions that are concerned with the computation of Voronoi cells.

Delaunay(sites) : SeqEnum -> SeqEnum
This function computes the Delaunay triangulation for the sites given by sites. The argument sites should be a sequence of pairs (of type Tup) of real numbers. The real numbers should all belong to the same real field. For n sites, a sequence of n sequences is returned. The ith sequence contains the list of indices of the sites to which site i should be joined to form the triangulation.
Voronoi(sites) : SeqEnum -> SeqEnum, SeqEnum, SeqEnum
This function computes the Voronoi cells for the sites given by sites. A Voronoi cell of a site consists of all those points in the plane closer to that site than to any other. The argument sites should be a sequence of pairs (of type Tup) of real numbers. The real numbers can be either fixed precision or free reals, but they should all be in the same real field.

Three sequences, siteedges, dualsites and cells are returned. The sequence siteedges is what the intrinsic Delaunay would have returned (so it defines the Delaunay triangulation). The sequence dualsites is a sequence of triples <x, y, m>, interpreted as follows: If m is zero the triple represents the point x, y. If m is non-zero the triple represents a point "at infinity" in the direction of the vector x, y. For n sites, cells is a sequence of n sequences. The ith sequence is a list [i1, i2, i3, ..., im] such that the cell around site i is formed by connecting dualsites[i1] to dualsites[i2], ... If a cell is infinite the first and last indices in the sequence point to infinite points. That is, the two infinite sides are given by the lines (x0, y0) + t (x1, y1), for t ≥0 where (x0, y0) equals dualsites[i2][1], dualsites[i2][2] and (x1, y1) equals dualsites[i1][1], dualsites[i1][2] or (x0, y0) equals dualsites[i{m-1][1], dualsites[i{m-1}][2]} and (x1, y1) equals dualsites[im][1], dualsites[im][2].

V2.28, 13 July 2023