Properties of Riemann Surfaces#

Basic Invariants#

In this section functions that access information about a Riemann surface are described. While most of these functions apply to both types of Riemann surface, some only apply to non-superelliptic Riemann surfaces.

BasePoint(X): RieSrf -> RieSrfPt#

The base point of the Riemann surface \(X\).

Genus(X): RieSrf -> RngIntElt#

The genus of the Riemann surface \(X\).

Degree(X): RieSrf -> RngIntElt#

The degree of the holomorphic map to the projective line that is used to construct the Riemann surface \(X\).

Precision(X): RieSrf -> RngIntElt#

The precision to which the Riemann surface \(X\) has been constructed.

Embedding(X): RieSrf -> PlcNumElt#

The complex embedding \(\sigma\) that is used to define the Riemann surface \(X\).

BigPeriodMatrix(X): RieSrf -> Mtrx#

The big period matrix associated to the Riemann surface \(X\).

SmallPeriodMatrix(X): RieSrf -> Mtrx#
Check: BoolElt                    Default: true

The small period matrix associated with the Riemann surface \(X\). If parameter Check is set to true, the small period matrix is checked to be a symmetric matrix (up to the prescribed precision) with a positive definite imaginary part.

FunctionField(X): RieSrf -> FldFun#

The function field of the defining polynomial of the Riemann surface \(X\). This is only available for non-superelliptic Riemann surfaces.

Example: invariants (ex-1117c8)#

Some of these intrinsics will be demonstrated. Note that while the computation of the Riemann surface invariants has used a precision of 100 decimal digits, for reasons of brevity the period matrices are printed to just 12 decimal digits.

>  Qt<t> := PolynomialRing(Rationals());
>  K<s> := NumberField(t^2 + 1);
>  y<x,y> := PolynomialRing(K,2);
>  f := -s^2*x^7 + 2*s*x^3*y + y^3;
>  sigma := InfinitePlaces(K)[1];
>  X := RiemannSurface(f,sigma : Precision:=100);
>
>  BasePoint(X);

(-2.000000000, -3.424546085 - 4.898716927*I)
>
>  Genus(X);
2
>
>  BigPeriodMatrix(X);

[ 1.57333990636 - 1.14309835298*I, -2.91713261396 + 0.706473634625*I,
-1.34379270760 + 1.84957198760*I, -0.371415169614 - 1.14309835298*I ]
[ -1.15879743459 - 0.376516110443*I, -1.87497363525 - 1.82764759203*I,
-0.716176200654 - 2.20416370247*I, -1.15879743459 - 1.59494783846*I ]

>
>  SmallPeriodMatrix(X);
[ -0.164199030444 + 0.817677768561*I, 0.683580096956 + 0.0368649791982*I ]
[ 0.683580096956 + 0.0368649791982*I, 0.449259709133 + 0.252676326408*I
>

Run in calculator

Fundamental Group#

Intrinsics for constructing the branch points and fundamental group are described. While most of these functions apply to both types of Riemann surface, some only apply to non-superelliptic Riemann surfaces.

DiscriminantPoints(f): RngMPolElt -> SeqEnum[FldComElt]#
DiscriminantPoints(f, sigma): RngMPolElt, PlcNumElt -> SeqEnum[FldComElt]#
DiscriminantPoints(X): RieSrf -> SeqEnum[FldComElt]#

The discriminant points of the defining polynomial with respect to the second variable embedded into \({\bf C}\) using an infinite place.

BranchPoints(X): RieSrf -> Tup#

The projections of the ramification points of the Riemann surface \(X\) to the projective line.

RamificationPoints(X): RieSrf -> SeqEnum[RieSrfPt]#

The ramification points of the ramified holomorphic map to the projective line used for the construction of \(X\).

SingularPoints(X): RieSrf -> SeqEnum#

While the Riemann surface itself is non-singular, this function returns the projective coordinates of the singular points of the projective closure of the underlying affine curve.

FundamentalGroup(P): SeqEnum[FldComElt] -> FldComElt, SeqEnum[FldComElt], SeqEnum[CPath], SeqEnum[SeqEnum[RngIntElt]]#
BasePoint: MonStgElt                    Default: "Clever"

Given a set \(P\) of discriminant points this intrinsic returns a description of the fundamental group \(\pi_1({\bf C}\setminus P,\ x_0)\) of the punctured complex plane with base point \(x_0\). The paths are constructed by modifying an euclidean spanning tree between the discriminant points by adding arcs and circles around the points. Options for BasePoint are "Clever" (positions the base point in the middle of the longest line segment), "Left" (base point on the negative real axis, left of all discriminant points) or a complex number specified by the user.

FundamentalGroup(X): RieSrf -> SeqEnum[CChain]#
Extended: BoolElt                    Default: true

Given a Riemann surface \(X\) with discriminant points \(D = \lbrace x_1 \ldots x_k \rbrace\) and punctured surface S = \({\bf C}~\setminus~D\) return the chains of paths in the complex plane that generate the fundamental group \(\pi_1(S,x_0)\), where \(x_0\) is the \(x\)-coordinate of the base point of \(X\). If the parameter Extended is set to true, a chain around infinity is returned as well, therefore generating \(\pi_1({\bf P}^1({\bf C}) \setminus (S \cup \lbrace \infty \rbrace),x_0)\). The lifts of these chains represent a homology basis for \(X\). This intrinsic is only available for non-superelliptic Riemann surfaces.

MonodromyRepresentation(X): RieSrf -> SeqEnum#

A description of the monodromy of the Riemann surface \(X\) is returned.

Example: Riesrf Ex 1 (ex-447d32)#
> Qxy<x,y> := PolynomialRing(Rationals(),2);
> f := -x^7 + 2*x^3*y + y^3;
> X := RiemannSurface(f);
> FG := FundamentalGroup(X);
> FG;
[
    Closed chain consisting of 4 paths starting at -2.000000000 around
    -1.034563716
    Permutation: (2, 3)
    Integrals: true
    ,
    Closed chain consisting of 11 paths starting at -2.000000000 around
    0.0000000000
    Permutation: (1, 3)
    Integrals: true
    ,
    Closed chain consisting of 17 paths starting at -2.000000000 around
    -0.3196977700 - 0.9839285636*I
    Permutation: (2, 3)
    Integrals: true
    ,
    Closed chain consisting of 15 paths starting at -2.000000000 around
    0.8369796280 - 0.6081012948*I
    Permutation: (1, 2)
    Integrals: true
    ,
    Closed chain consisting of 13 paths starting at -2.000000000 around
    0.8369796280 + 0.6081012948*I
    Permutation: (2, 3)
    Integrals: true
    ,
    Closed chain consisting of 11 paths starting at -2.000000000 around
    -0.3196977700 + 0.9839285636*I
    Permutation: (1, 2)
    Integrals: true
    ,
    Closed chain consisting of 71 paths starting at -2.000000000 around Infinity
    Permutation: (1, 3, 2)
    Integrals: true

]
> d := #FG;
> &*[ FG[k] : k in [1..d-1] ]^(-1) eq FG[d];
true
> [ FG[k]`Center : k in [1..d-1] ] eq DiscriminantPoints(X);
true

> M := MonodromyRepresentation(X);
> M;
[
    (2, 3),
    (1, 3),
    (2, 3),
    (1, 2),
    (2, 3),
    (1, 2),
    (1, 3, 2)
]

> #M eq #[ Chain`Permutation : Chain in FG | Order(Chain`Permutation) ne 1 ];
true
> &and[ Chain`StartPt eq Representation(BasePoint(X))[1] : Chain in FG ];
true

Run in calculator

Basis for Period Matrix#

HolomorphicDifferentials(X): RieSrf -> Tup#

This intrinsic computes the basis of holomorphic differentials used for the computation of the period matrix and the Abel–Jacobi map. The actual information returned depends upon whether \(X\) is superelliptic or not. The general (non-superelliptic) case will be considered first. If the genus \(g\) of \(X\) equals the number of integral points on the interior of the Newton polygon associated with its defining polynomial, the basis used consists of \(\omega = x^i y^j dx / d_y f(x,y)\) where \((i,j) \in {\bf Z}^{2}\) consists of aforementioned integral points. In this case a tuple is returned that contains a list of the pairs \([i,j]\) as first entry and \(d_y f(x,y)\) as second entry.

In the case where the genus is not equal to the number of integral interior points if, for example, the projective curve is singular outside \(\{(0:0:1),(0:1:0),(1:0:0)\}\), the basis used is that computed by the function field machinery, and embedded into \({\bf C}\) using the mapping \(\sigma\). Let FFX denote FunctionField(X). Specifically, this intrinsic returns the basis calculated by the intrinsic BasisOfDifferentialsFirstKind(FFX) represented as products of irreducible factors: a list of irreducible factors \([ a_1, \dots, a_k ]\) for some \(k > 0\) and a \((k \times g)\) integer matrix of multiplicities \((b_{i,j})\) such that a basis is given by \(\omega_j = \prod_{i=1}^k a_i^{b_{i,j}},\ j = 1,..,g.\)

Example: Riesrf Ex 1 (ex-86f032)#

In the following example the projective closure of the affine curve is singular at (0:0:1) and (0:1:0), so that the first basis described above can be used.

> Qxy<x,y> := PolynomialRing(Rationals(),2);
> f := -x^7 + 2*x^3*y + y^3;
> X := RiemannSurface(f);
> HolomorphicDifferentials(X);
<[ [ 2, 2 ], [ 4, 1 ] ], 2*x^3 + 3*y^2>

Run in calculator

However, if the singularity is moved to \((-1:0:1)\), the basis as provided by the function field machinery is used. In the following example it can be easily seen that this function returns the corresponding product representation.

> f_trans := Evaluate(f,[x+1,y]);
> X_trans := RiemannSurface(f_trans);
> HolomorphicDifferentials(X_trans);
 < [ y, 2/3*x^3 + 2*x^2 + 2*x + y^2 + 2/3, x + 1 ],
    [ 1  0]
    [-1 -1]
    [ 1  3] >
> BasisOfDifferentialsFirstKind(FunctionField(X));
[ ((x) * (y) * (2/3*x^3 + y^2)^-1) d(x), ((x)^3 * (2/3*x^3 + y^2)^-1) d(x) ]

Run in calculator

In the case of a superelliptic Riemann surface, a basis of the form \(\omega_{i,j} = x^i dx / y^j\) is used. The condition on the pair \((i,j) \in {\bf Z}^2\) is provided by [Neurohr, 2018, Proposition 5.18]. Hence in this case, a tuple containing all the pairs \([i,j]\) corresponding to such differentials is returned.

Example: Riesrf Ex 1 (ex-784cd3)#

The holomorphic differentials of the superelliptic Riemann surface of genus \(21\) defined by \(y^8 = B(8)\) where \(B(n)\) is the \(n\)-th Bernoulli polynomial will be computed.

> p<x> := BernoulliPolynomial(8);
> p;
x^8 - 4*x^7 + 14/3*x^6 - 7/3*x^4 + 2/3*x^2 - 1/30
> X := RiemannSurface(BernoulliPolynomial(8),8);
> Genus(X);
21
> HolomorphicDifferentials(X);
<[ 0, 2 ], [ 0, 3 ], [ 1, 3 ], [ 0, 4 ], [ 1, 4 ], [ 2, 4 ], [ 0, 5 ],
 [ 1, 5 ], [ 2, 5 ], [ 3, 5 ], [ 0, 6 ], [ 1, 6 ], [ 2, 6 ], [ 3, 6 ],
 [ 4, 6 ], [ 0, 7 ], [ 1, 7 ], [ 2, 7 ], [ 3, 7 ], [ 4, 7 ], [ 5, 7 ]>
> Genus(X) eq #HolomorphicDifferentials(X);
true

Run in calculator

HomologyBasis(L): SeqEnum[GrpPermElt] -> SeqEnum[SeqEnum[RngIntElt]], Mtrx, Mtrx#
Check: BoolElt                    Default: true

Given a sequence \(L\) containing permutation generators of the monodromy group, the homology basis used for computing the period matrix is returned. Two objects are returned: a sequence of integer sequences each of which defines an element of the homology group and an intersection matrix. If the parameter Check is set true, several tests for correctness are performed.

HomologyBasis(X): RieSrf -> SeqEnum[SeqEnum[RngIntElt]], Mtrx, Mtrx#
Check: BoolElt                    Default: true

Given a Riemann surface \(X\) the homology basis used for computing the period matrix is returned. Three objects are returned: a sequence of integer sequences each of which defines an element of the homology group, an intersection matrix and the symplectic base change matrix that has been used for the computation of the big period matrix. If the parameterCheck is set true several tests for correctness are performed.

Example: Homology Basis1 (ex-701b67)#

In this example the homology basis will be computed from the monodromy representation.

> Qxy<x,y> := PolynomialRing(Rationals(),2);
> f := x^4*y^8 - x - y^8 + y^2 + 1;
> Chains := MonodromyRepresentation(f);
> MonRep := [ Ch`Permutation : Ch in Chains ];
> MonRep;
[
    (1, 2, 6, 8, 7, 3),
    (3, 5)(4, 6),
    (2, 4)(5, 7),
    (1, 2, 6, 8, 7, 3),
    (2, 4)(5, 7),
    (1, 2, 6, 8, 7, 3)(4, 5),
    (2, 5)(4, 7),
    (1, 5)(4, 8),
    (3, 5)(4, 6),
    (1, 2, 6, 8, 7, 3),
    (3, 5)(4, 6),
    (1, 7, 4, 3, 8, 2, 5, 6)
]

Run in calculator

Using the permutation generators the monodromy group will be constructed.

> MonGroup := PermutationGroup< Degree(f,2) | MonRep >;
> IsTransitive(MonGroup);
true
> #MonGroup;
384

> Cycles, IntersectionMatrix := HomologyBasis(MonRep);
> Cycles[20];
[ 1, 4, 8, 1, 1 ]

Run in calculator

The sequence of integers Cycles[20] above defines a non-trivial element of the homology group in the following way. It encodes a path starting on sheet \(1\), circling discriminant point \(d4\) until one arrives at sheet \(8\), then continues circling discriminant point \(d1\) until it returns to sheet \(1\). More explicitly, it can be expressed as the analytic continuation of the chain Chains[4]\(^3\) * Chains[1]\(^3\), starting and ending on the first sheet. Indeed, the permutation associated with the concatenation of chains turns out to be the identity:

> Chains[4]^3 * Chains[1]^3;
Closed chain consisting of 36 paths starting at
                              -0.5034246870 - 0.4967763264*I
Permutation: Id($)

Run in calculator

In the case of a Riemann surface, the function HomologyBasis returns a third value, namely the symplectic base change matrix that has been used for the computation of the big period matrix. The Riemann surface package always uses the canonical basis of the form

\[\begin{split}J = \left(\begin{matrix}0 & I_g \\ -I_g & 0\end{matrix}\right).\end{split}\]
Example: Homology Basis2 (ex-8af6bb)#

The homology basis for the big period matrix will be computed for the Riemann surface \(X\) defined by the polynomial \(y^2 + x^3 - 1\).

> Qxy<x,y> := PolynomialRing(Rationals(),2);
> X := RiemannSurface(y^2 + x^3 - 1);

> Cycles, IntersectionMat, SymplecticTransform := HomologyBasis(X);

Run in calculator

The canonical homology basis is now found by matrix multiplication.

> SymplecticTransform * IntersectionMat * Transpose(SymplecticTransform);

[ 0  1  0]
[-1  0  0]
[ 0  0  0]

Run in calculator