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 P0 ∈X the Abel--Jacobi map is defined as A : X -> J = Cg / Λ, P |-> ( intP0P ωj )j = 1, .., g mod Λ

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 [Neu18, Para 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 [Neu18, Para 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 Cg x 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 R2g/Z2g as described in [Neu18, Para 4.9.6].

(iii)
"Complex" : The default value for Reduction. Returns the image of the Abel--Jacobi map in Cg / Λ where Λ = < 1, τ > and τ 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 RieSrf_abel-jacobi-sup (H124E13)

Using the Abel--Jacobi map for superelliptic curves of the form ym = p(x) we can easily verify that the divisors are of the form D = Pk - Pj for m-torsion divisors for ramification points Pk and Pj. 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
or even more directly
> A := AbelJacobi(m * D : Reduction := "Complex");
> &and[ Abs(c) lt X`Error : c in Eltseq(A) ];
true
Or that the divisor D = ∑k=1δ P(k) is a m/δ-torsion divisor, where δ = gcd(m, deg(p)):
> D := Divisor( InfinitePoints(X), [1, 1] );
> E := X![1] + X![2];
> D eq E;
true
> AJ := AbelJacobi(D : Reduction:="Real");
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
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

Example RieSrf_abel-jacobi-gen-1 (H124E14)

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 - y1)/(y - y2) 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));
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

Example RieSrf_abel-jacobi-gen-2 (H124E15)

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

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

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

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
V2.28, 13 July 2023