Abel–Jacobi Map#

This section covers the construction of the Abel–Jacobi map for Riemann surfaces (intrinsic AbelJacobi). For a Riemann surface \(X\) and a base point \(P_0 \in X\) the Abel–Jacobi map is defined as

\[A : X \rightarrow J = {\bf C}^g / \Lambda,\ \ \; P \mapsto ( \int_{P_0}^P \omega_j )_{j = 1,..,g} \pmod \Lambda\]

The Abel–Jacobi map extends to divisors on \(X\) by linearity and is independent of the base point for divisors of degree \(0\). In particular, \(A(D) = 0\) if and only if \(D\) is a principal divisor.

AbelJacobi(P): RieSrfPt -> Mtrx#
AbelJacobi(DX): DivRieSrfElt -> Mtrx#
AbelJacobi(DF, X): DivFunElt, RieSrf -> Mtrx#
Reduction: MonStgElt                    Default: "Complex"
Method   : MonStgElt                    Default: "Swap"

Let \(X\) be a Riemann surface, let \(P\) be a point on \(X\) and let \(B\) be the base point returned by BasePoint. These intrinsics construct the Abel–Jacobi maps with respect to base point \(B\) given either a point \(P\), a divisor \(DX\) of \(X\), or a divisor \(DF\) of an associated function field of \(X\), respectively. The map is returned as a matrix.

In the case of non-superelliptic Riemann surfaces two options are provided as to how the Abel–Jacobi map of ramification points should be handled. If the parameter Method is assigned the value “Swap” and \(P=(x,y)\) then \(A(P)\) is obtained by computing \(A'(y,x)\) where \(A'\) is the Abel–Jacobi map on \(X' : f(y,x)=0\); compare [Neurohr, 2018, §4.9.3]. This method is numerically robust and is the default option. However, if \(\deg(f,x) \gg \deg(f,y)\), it might be a bad choice. The other option is “Direct” which will try adaptive double-exponential integration as described in [Neurohr, 2018, §4.9.5]; it is completely heuristic and somewhat unstable but often returns the correct results.

We provide several options for reduction modulo the period lattice. These are selected by assigning one of the following three values to the parameter Reduction.

(i)

“None” : This will simply compute the vector of integrals in \({\bf C}^{g \times 1}\) and not reduce it at all. Note that this option is used internally and the results may not be mathematically correct.

(ii)

“Real” : Returns the image of the Abel–Jacobi map in the canonical torus \({\bf R}^{2g}/{\bf Z}^{2g}\) as described in [Neurohr, 2018, §4.9.6].

(iii)

“Complex” : The default value for Reduction. Returns the image of the Abel–Jacobi map in \({\bf C}^g / \Lambda\) where \(\Lambda = \langle 1, \tau \rangle\) and \(\tau\) is the small period matrix associated to \(X\).

AbelJacobi(P, Q): RieSrfPt, RieSrfPt -> Mtrx#
Reduction: MonStgElt                    Default: "Complex"
Method   : MonStgElt                    Default: "Swap"

Given points \(P\) and \(Q\) belonging to a Riemann surface \(X\), the Abel–Jacobi map for the divisor \([Q-P]\) on \(X\) is computed. The possible values for the parameters Reduction and Method are as given in the description of the previous Abel–Jacobi intrinsic.

AbelJacobi(D, P): DivRieSrfElt, RieSrfPt -> Mtrx#
Reduction: MonStgElt                    Default: "Complex"
Method   : MonStgElt                    Default: "Swap"

Let \(X\) be a Riemann surface with base point \(P\) and divisor \(D\). The Abel–Jacobi map is constructed on \(X\) with respect to the base point \(P\). The possible values for the parameters Reduction and Method are as given in the description of the previous Abel–Jacobi intrinsic.

Example: Abel Jacobi Sup (ex-909191)#

Using the Abel–Jacobi map for superelliptic curves of the form \(y^m = p(x)\) we can easily verify that the divisors are of the form \(D = P_k - P_j\) for \(m\)-torsion divisors for ramification points \(P_k\) and \(P_j\). We do this for the following genus \(16\) example with precision set to \(100\) almost instantaneously.

> Qx<x> := PolynomialRing(Rationals());
> p := &*[ x - k : k in [1..10] ];
> m := 4;
> X := RiemannSurface(p,m : Precision:=100);
> D := X![Random([1..5]),0] - X![Random([6..10]),0];
> A := m * AbelJacobi(D:Reduction:="Real");
> &and[ Abs(c-Round(c)) lt X`Error : c in Eltseq(A) ];
true

Run in calculator

or even more directly

> A := AbelJacobi(m * D : Reduction := "Complex");
> &and[ Abs(c) lt X`Error : c in Eltseq(A) ];
true

Run in calculator

Or that the divisor \(D = \sum_{k=1}^{\delta} P_{\infty}^{(k)}\) is a \(m/\delta\)-torsion divisor, where \(\delta = \gcd(m,\deg(p))\):

> D := Divisor( InfinitePoints(X), [1, 1] );
> E := X![1] + X![2];
> D eq E;
true
> AJ := AbelJacobi(D : Reduction:="Real");

Run in calculator

The projective coordinates of the points at infinity may be obtained by using the intrinsic Coordinates. However, in our example these coordinates define a singular point on the projective curve and so cannot be used to define a point on the Riemann surface:

> X!Coordinates(X![1]);
Runtime error in '!': Singular point of the projective closure.
> Coordinates(Random(InfinitePoints(X))) in SingularPoints(X);
true

Run in calculator

Whenever projective coordinates correspond one-to-one to points on the Riemann surface, i.e., they are non-singular points of the projective curve, they can be used to obtain the coordinates of the points at infinity on the Riemann surface:

> X := RiemannSurface(LegendrePolynomial(4),4);
> InfinitePoints(X);
[
    1st point at infinity,
    2nd point at infinity,
    3rd point at infinity,
    4th point at infinity
]
> [ X!Coordinates(P) : P in InfinitePoints(X) ] eq InfinitePoints(X);
true

Run in calculator

Example: Abel Jacobi Gen 1 (ex-860b42)#

Let us now consider how to use the Abel–Jacobi map for general Riemann surfaces defined over number fields. For example, we may verify that the Abel–Jacobi map of the principal divisor \((y-y_1)/(y-y_2)\) lies in the period lattice.

> Qxy<x, y> := PolynomialRing(Rationals(), 2);
> f := 2*x^3*y^5 + x^2*y^6 - 1;
> X := RiemannSurface(f);
> m := X`Degree[1];
> n := X`Degree[2];
> f := ComplexPolynomial(X);
> C<I> := BaseRing(Parent(f));

Run in calculator

We now generate two random complex numbers y1 and y2.

> Ht := 10^5;
> y1 := Random([-Ht..Ht])/Random([1..Ht]) + I*Random([-Ht..Ht])/Random([1..Ht]);
> y2 := Random([-Ht..Ht])/Random([1..Ht]) + I*Random([-Ht..Ht])/Random([1..Ht]);
> F1 := RootsNonExact(UnivariatePolynomial(Evaluate(f, [Parent(f).1, y1])));
> F2 := RootsNonExact(UnivariatePolynomial(Evaluate(f, [Parent(f).1, y2])));
> S1 := []; S2 := [];
> for j in [1..n] do
>   Append(~S1, X![F1[j], y1]);
>   Append(~S2, X![F2[j], y2]);
> end for;
> D := &+S1 - &+S2;
> A := AbelJacobi(D);
> &and[ Abs(c) lt X`Error : c in Eltseq(A) ];
true

Run in calculator

Example: Abel Jacobi Gen 2 (ex-3a3dc0)#

One of the highlights of the package is that one can directly compute the Abel–Jacobi map of function field divisors. We will illustrate this using a genus \(4\) example defined over a degree \(3\) number field:

> Qt<t> := PolynomialRing(Rationals());
> K<s> := NumberField(t^3 + 43274/61569*t^2 + 1024/6841*t + 9122/6841);
> Kxy<x, y> := PolynomialRing(K,2);
> f := 1/26116*(9985*s^2 + 49265*s - 17877)*x^3*y^4 + 1/34512*(26093*s^2 -
>    6604*s + 46087)*x*y^4 + 1/23026*(22829*s^2 + 2142*s - 18264)*x*y +
>    1/46947*(5011*s^2 + 5883*s - 39463)*x + 1/85753*(2423*s^2 - 21329*s
>    + 41637);
> sigma := InfinitePlaces(K)[1];
> X := RiemannSurface(f, sigma : Precision := 50);
> FF<v, w> := FunctionField(X);
/* Take all infinite places in the function field */
> D1 := &+SetToSequence(Set(Poles(v) cat Poles(w)));
/* Take all infinite points on the Riemann surface */
> D2 := &+InfinitePoints(X);
> A1 := AbelJacobi(D1, X);
> A2 := AbelJacobi(D2);
> &and[ Abs(c) lt X`Error : c in Eltseq(A1-A2) ];
true

Run in calculator

Another good test is to vereify that divisors of meromorphic functions always map to the period lattice under the Abel–Jacobi map.

> A1 := AbelJacobi(Divisor(v), X);
> &and[ Abs(c) lt X`Error : c in Eltseq(A1) ];
true
> A2 := AbelJacobi(Divisor(w), X);
> &and[ Abs(c) lt X`Error : c in Eltseq(A2) ];
true
> A3 := AbelJacobi(Divisor(s^2*v^2*w+v/w/3), X);
> &and[ Abs(c) lt X`Error : c in Eltseq(A3) ];
true

Run in calculator

One also might want to compute the Abel–Jacobi map of the canonical divisor, reduce it modulo the small period matrix and then compute its multi-dimensional Theta function.

> D := CanonicalDivisor(FF);
> A := AbelJacobi(D, X : Reduction := "Complex");

Run in calculator

Finally we define the desired characteristic and compute the Theta function!

> char := Transpose(Matrix([[ 1/2 : j in [1..2*Genus(X)]]]));
> Theta(char, A, SmallPeriodMatrix(X));
0.29810003713725582196195932655751593711064828563915 +
0.68480591255255827524715345957080419035255625041761*I

Run in calculator