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({\mathbb{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 \(\phi_i\), \(i = 1,2,\dots ,g\) be a basis for this vector space and set \(\overline{\phi} = {}^t(\phi_1,\dots,\phi_g)\), a vector of holomorphic 1-forms. For a hyperelliptic curve there is a natural choice of holomorphic differentials, namely \(\phi_i = x^{i-1}dx/y.\) We can now define a mapping \({\rm Int} : C \rightarrow {\mathbb{C}}^g\) by \(P \mapsto \int_P^\infty \overline{\phi}.\) To remove the dependency of this mapping on the path of integration, we define \(\Lambda\) to be the image of the map from the first homology group of \(C\), \(H_1(C,{\mathbb{Z}})\), to \({\mathbb{C}}^g\) which sends a closed path, \(\sigma \in H_1(C,{\mathbb{Z}})\), on the Riemann surface to \(\int_\sigma \overline{\phi}\). Then \(\Lambda\) turns out to be a lattice in \({\mathbb{C}}^g\) and so we get the complex torus \({\mathbb{C}}^g/\Lambda\). We then see that \({\rm Int}\) is a well-defined mapping from \(C\) into \({\mathbb{C}}^g/\Lambda\). 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 \({\rm 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 \({\mathbb{C}}^g/\Lambda\) and the points of the (algebraic) Jacobian.

So far the analytic Jacobian \({\mathbb{C}}^g/\Lambda\) is just a torus, but it can be made into an abelian manifold by choosing a polarization. Let \(A_1,\dots,A_g,B_1,\dots,B_g\) be a symplectic homology basis. That is, the \(A_i\) and \(B_i\) are closed paths on the Riemann surface such that all intersection numbers are \(0\) except that \(A_i\) intersects \(B_i\) with intersection number \(1\) for each \(i\). Let \(\omega_1\) and \(\omega_2\) be the \(g \times g\)-matrices with entries

\[{\omega_1}_{ij} = \int_{B_j} \phi_i,\]

and

\[{\omega_2}_{ij} = \int_{A_j} \phi_i.\]

Then the columns of \(P = (\omega_1, \omega_2)\) form a \({\mathbb{Z}}\)-basis for the lattice \(\Lambda = P {\mathbb{Z}}^{2g}\). The matrix \(P\) is called the (big) period matrix. The space of complex, symmetric \(g \times 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 \(\tau = \omega_2^{-1}\omega_1\) is an element of Siegel upper half-space. We will refer to \(\tau\) as the small period matrix.

Set

\[\begin{split}J = \left(\begin{matrix}0 & {\bf 1}_g \\ -{\bf 1}_g & 0\end{matrix}\right).\end{split}\]

If we define \(E(P x, P y) = {}^tx J y,\) for any \(x,y \in {\mathbb{R}}^{2g}\), then \(E\) is a Riemann form for the torus \({\mathbb{C}}^g/\Lambda\) 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 [Mumford, 1984]) 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 [Mumford, 1984, 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\rightarrow 1/x\). This can often have the effect of changing the internal computations sufficiently that any errors are avoided.

Creation and Access Functions#

AnalyticJacobian(f): RngUPolElt -> AnHcJac#

Given \(f \in {\mathbb{C}}[x]\) where \({\mathbb{C}}\) is a complex field (see Chapter Real and Complex Fields), this function returns the analytic Jacobian of the hyperelliptic curve defined by \(y^2 = 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 \mapsto 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 \times g\) matrix with positive definite imaginary part. If \(P = (\omega_1, \omega_2)\) is the full period matrix (see BigPeriodMatrix) then the small period matrix is defined by \(\omega_2^{-1} \omega_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 \times 2g\) matrix. The analytic Jacobian as a torus equals \({\mathbb{C}}^g/\Lambda\), where \(\Lambda\) is the \({\mathbb{Z}}\)-lattice spanned by the columns of the period matrix. The period matrix is computed with respect to the holomorphic differentials \(\phi_i = x^{i-1}dx/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 \rightarrow C^d\), 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^{-\rm{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^{-\rm{Precision}}\)) is computed.

Maps between Jacobians#

ToAnalyticJacobian(x, y, A): FldComElt, FldComElt, AnHcJac -> Mtrx#

Let \(A\) be the analytic Jacobian of \(y^2 = f(x)\). This function maps the point \((x,y)\) on the curve to the analytic Jacobian. More precisely, let \(a = \infty\) 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 \times 1\) matrix. This should be thought of as an element of \({\mathbb{C}}^g / \Lambda\) where \(\Lambda\) is the \({\mathbb{Z}}\)-lattice generated by the columns of the BigPeriodMatrix.

FromAnalyticJacobian(z, A): Mtrx, AnHcJac -> SeqEnum#

Let \(A\) be an analytic Jacobian of \(y^2 = f(x)\), with small period matrix \(\tau\). Let \(z\) be a \(g \times 1\) complex matrix (thought of as an element of \({\mathbb{C}}^g / \Lambda\) where \(\Lambda\) is the \({\mathbb{Z}}\)-lattice generated by the columns of the BigPeriodMatrix). This function returns a list of \(g\) (the dimension of \(A\)), or fewer, pairs \(P_i = \langle x_i,y_i\rangle\) satisfying \(y^2 = f(x)\). This is an element of the algebraic Jacobian when interpreted as the divisor \(\sum_{i=1}^g P_i - g\infty\).

Example: Analytic Jacobian Addition (ex-56e605)#

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

Run in calculator

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

Run in calculator

We are working with \(50\) decimal places. The sequences div1 and div2 are the two points on the algebraic Jacobian represented as pairs of \(\langle x,y \rangle\) coordinates.

> pt1 := &+[ToAnalyticJacobian(d[1],d[2],A) : d in div1];
> pt2 := &+[ToAnalyticJacobian(d[1],d[2],A) : d in div2];

Run in calculator

Now pt1 and pt2 are the images of the two points P1 and P2 on the analytic Jacobian (two \(2\times 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> ]

Run in calculator

Now we have mapped sum back to the algebraic Jacobian where it is given as a sequence of two \(\langle x,y \rangle\) 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)

Run in calculator

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 \(A_1 = {\mathbb{C}}^g/\Lambda_1\) and \(A_2 = C^g/\Lambda_2\) with a morphism \(\phi : A_1 \mapsto A_2\). This map lifts to a map \({\mathbb{C}}^g \mapsto {\mathbb{C}}^g\), given by some complex \(g \times g\) matrix, \(\alpha\). This is called the complex representation of \(\phi\). Suppose \(\Lambda_i\) is spanned by the columns of the \(g \times 2g\) matrix \(P_i\). As \(\phi(\Lambda_1) \subset \Lambda_2\), we see that there must exist an integral \(2g \times 2g\) matrix \(M\) such that \(\alpha P_1 = P_2 M\). \(M\) is called the rational representation of \(\phi\). If \(A_1\) and \(A_2\) are isomorphic and \(P_1\) and \(P_2\) are Frobenius bases, that is, they provide a basis with respect to which the polarization is given by the matrix \(J = \left(\begin{matrix}0 & {\bf 1}_g \\ -{\bf 1}_g & 0\end{matrix}\right),\) 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 = \left(\begin{matrix}a & b \\ c & d\end{matrix}\right)\) is a symplectic matrix and \(\tau\) an element of Siegel upper half-space, then the action is given by \(\tau \mapsto (a \tau + b)(c \tau + d)^{-1}\). Note that if there is an isomorphism from \(A_1\) to \(A_2\) with rational representation \(M\) then \(\tau_1\) equals the result of letting \({}^tM\) (not \(M\)) act on \(\tau_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 [Gottschling, 1959]). 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 [Gottschling, 1959] 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 \(t_1\) and \(t_2\), this function returns a basis for the \({\mathbb{Z}}\)-module of \(2g \times 2g\) integer matrices \(M\) such that there exists a complex \(g \times g\) matrix \(\alpha\) such that \(\alpha (t_1, 1) = (t_2, 1) M\).

IsIsomorphicSmallPeriodMatrices(t1, t2): Mtrx, Mtrx -> Bool, Mtrx#

For two small period matrices \(t_1\) and \(t_2\), this function finds a \(2g \times 2g\) symplectic integer matrix \(M\) such that there exists a complex \(g \times g\) matrix \(\alpha\) such that \(\alpha (t_1, 1) = (t_2, 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 \(P_1\) and \(P_2\), this function finds a \(2g \times 2g\) symplectic integer matrix \(M\) such that there exists a complex \(g \times g\) matrix \(\alpha\) such that \(\alpha P_1 = P_2 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 \(\alpha\), if found.

IsIsomorphic(A1, A2): AnHcJac, AnHcJac -> Bool, Mtrx, Mtrx#

For two analytic Jacobians \(A_1\) and \(A_2\) with big period matrices \(P_1\) and \(P_2\), this function finds a \(2g \times 2g\) symplectic integer matrix \(M\) such that there exists a complex \(g \times g\) matrix \(\alpha\) such that \(\alpha P_1 = P_2 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 \(\alpha\), if found.

IsIsogenousPeriodMatrices(P1, P2): Mtrx, Mtrx -> Bool, Mtrx#

For two period matrices (small or big) \(P_1\) and \(P_2\), this function finds a nonsingular \(2g \times 2g\) integer matrix \(M\) such that there exists a complex \(g \times g\) matrix \(\alpha\) such that \(\alpha (P_1, 1) = (P_2, 1) M\), in case of small period matrices, or \(\alpha P_1 = P_2 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 \(\alpha\) is the third return value.

IsIsogenous(A1, A2): AnHcJac, AnHcJac -> Bool, Mtrx, Mtrx#

For two analytic Jacobians \(A_1\) and \(A_2\) with big period matrices \(P_1\) and \(P_2\), this function finds a nonsingular \(2g \times 2g\) integer matrix \(M\) such that there exists a complex \(g \times g\) matrix \(\alpha\) such that \(\alpha P_1 = P_2 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 \(\alpha\), 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 \(\alpha\)-matrices such that \(\alpha 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 \(\alpha\)-matrices such that \(\alpha P = P M\), for each generator, \(M\), of the matrix algebra.

Example: Find Rational Isogeny (ex-e44b74)#

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

\[y^2 = x^5 - 4x^4 + 8x^2 - 4x,\]

and

\[y^2 = x^5 + 4x^4 + 10x^3 + 12x^2 + x.\]

These are curves 1 and 3 in the twenty second isogeny class of Smart [Smart, 1997]. 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);

Run in calculator

We now get a basis for the \({\mathbb{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 \({\mathbb{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]
]
>

Run in calculator

For each of these four “\(M\)” matrices let us find the corresponding \(\alpha\) 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
>

Run in calculator

So at least alst[1] does not correspond to a rational isogeny. In general none of the four \(\alpha\)-matrices might correspond to a rational isogeny. But it is possible that some \({\mathbb{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 \(\alpha\)-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

Run in calculator

It turns out that every entry of each of the alst matrices is in the number field defined by the polynomial \(x^8 + 12x^6 + 34x^4 + 52x^2 + 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 ]

Run in calculator

So we can write each \(\alpha\)-matrix as an algebraic number in the number field defined by \(x^8 + 12x^6 + 34x^4 + 52x^2 + 1\). It is then a simple matter to find a linear combination of the \(\alpha\)-matrices that is defined over \({\mathbb{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]

Run in calculator

So the two Jacobians are \({\mathbb{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) @}

Run in calculator

ToAnalyticJacobianMumford(pt, AJ): JacHypPt, AnHcJac -> Mtrx#

Given a point \(pt\) on the Jacobian of a hyperelliptic curve over \({\mathbb{Q}}\) with Analytic Jacobian \(AJ\), return the image of \(pt\) under the Abel-Jacobi map of \(AJ\), i.e., a complex \((g \times 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 \(\bf{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 \neq 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 \(y^2 = x(x-1) \prod_{s \in S} (x-s)\) has Jacobian isomorphic to A. The name of the function comes from the fact that a hyperelliptic curve in the form \(y^2 = x(x-1)(x-\lambda_1)...(x-\lambda_{2g-1})\) is said to be in Rosenhain normal form.

Example: Find CM Curve (ex-3d7636)#

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 \({\mathbb{Q}}(\sqrt{-2+\sqrt{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);

Run in calculator

Now, for a CM type \(\Phi\), and \(\cal O\) the ring of integers, \({\mathbb{C}}^2/\Phi({\cal O})\) is a torus with Complex Multiplication by the maximal order of our field \({\mathbb{Q}}(\sqrt{-2+\sqrt{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 [Wamelen, 1999]. 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

Run in calculator

So cc is complex multiplication and xi squared is in the real subfield. By Theorem 3 of [Wamelen, 1999] 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

Run in calculator

The CM type \(\Phi\) 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);

Run in calculator

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

Run in calculator

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

Run in calculator

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]

Run in calculator

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 \(i\)th 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 \(\left<x,y,m\right>\), 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 \(i\)th 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 \((x_0, y_0) + t (x_1,y_1)\), for \(t \ge 0\) where \((x_0, y_0)\) equals dualsites[i2][1], dualsites[i2][2] and \((x_1,y_1)\) equals dualsites[i1][1], dualsites[i1][2] or \((x_0, y_0)\) equals dualsites[im-1][1], dualsites[im-1][2] and \((x_1,y_1)\) equals dualsites[im][1], dualsites[im][2].