Skip to content
The Lumenary
First-year graduateGraduate 150 min

Riemann surfaces

Where the square root becomes a function — complex analysis on surfaces, and the meeting point of analysis, topology and algebraic geometry.

Formally verified · 7 LeanComputationally tested · 2 PythonAI-drafted · awaiting human reviewMathematically reviewed: Awaiting human review
MotivationH

Making multivalued functions single-valued

Every non-zero complex number has two square roots, and no continuous choice of one of them works on all of C∖{0}\C \setminus \{0\}: follow z\sqrt z once round the origin and it comes back as −z-\sqrt z. The logarithm is worse, with infinitely many values. For a century these "multivalued functions" were handled by cutting the plane and keeping track of branches. In his 1851 dissertation Bernhard Riemann proposed a radical alternative: do not change the function, change its domain. Build a surface lying over the plane, with one sheet for each value, glued so that walking round a branch point carries you from one sheet to the next. On that surface the square root is an honest, single-valued holomorphic function.

These Riemann surfaces turned out to be the natural home of an astonishing amount of mathematics. Compact Riemann surfaces are the same thing as complex algebraic curves (solution sets of polynomial equations F(z,w)=0F(z, w) = 0); their topology is a single number, the genus; the integrals of algebraic functions — elliptic integrals, which compute the arc length of an ellipse or the period of a pendulum — are integrals of 11-forms over loops on them; and the same equations studied over the rational numbers are the elliptic curves of number theory.

This lesson builds on complex analysis, the fundamental group and covering spaces, and the classification of surfaces by their Euler characteristic. It uses the language of manifolds, with holomorphic charts in place of smooth ones.

IntuitionH

Two sheets glued crosswise

Take two copies of the plane, cut each along the negative real axis, and glue the upper edge of the cut in sheet 1 to the lower edge of the cut in sheet 2, and vice versa. A path going once round 00 starts on sheet 1, crosses the cut and continues on sheet 2, and only after a second turn returns to its starting point. On this two-sheeted surface (completed by one point over 00 and one over ∞\infty) the function "z\sqrt z" takes the value z\sqrt z on sheet 1 and −z-\sqrt z on sheet 2, and is continuous. In fact the surface is just another copy of the plane, with coordinate ww, lying over the zz-plane by z=w2z = w^2: the "two sheets" are the two preimages of each z≠0z \ne 0.

sheet 1sheet 2
The Riemann surface of $\sqrt z$: two sheets over the $z$-plane, cut along the negative real axis and cross-glued. A loop round $0$ on the surface (gold) has to go round twice below before it closes. The point over $0$ is a branch point of order $2$.

The same recipe for w=z3−zw = \sqrt{z^3 - z} needs two cuts — say from −1-1 to 00 and from 11 to ∞\infty — because a loop round one of the branch points −1,0,1,∞-1, 0, 1, \infty swaps the sheets while a loop round two of them does not. Two cut spheres glued crosswise along two slits make a torus: the Riemann surface of z3−z\sqrt{z^3 - z} has genus 11. Counting branch points to find the genus is the Riemann–Hurwitz formula.

DefinitionsH

Riemann surfaces and holomorphic maps

Definition— Riemann surface

A Riemann surface is a connected, Hausdorff, second countable space XX with an atlas of charts φα:Uα→φα(Uα)⊆C\varphi_\alpha : U_\alpha \to \varphi_\alpha(U_\alpha) \subseteq \C whose transition maps φβ∘φα−1\varphi_\beta \circ \varphi_\alpha^{-1} are holomorphic (a maximal such atlas is a complex structure). Equivalently, a connected complex manifold of complex dimension 11. (Second countability is in fact automatic, by Radó's theorem.)

Definition— holomorphic and meromorphic maps

A continuous map f:X→Yf : X \to Y of Riemann surfaces is holomorphic if it is holomorphic in local coordinates. A meromorphic function on XX is a holomorphic map X→P1X \to \mathbb P^1 to the Riemann sphere not identically ∞\infty; equivalently, a function holomorphic outside a discrete set of poles. The meromorphic functions form a field M(X)\mathcal M(X).

Definition— ramification, degree, genus

By the local normal form (Theorem 1), a non-constant holomorphic ff is near each pp given in suitable coordinates by z↦zkz \mapsto z^k with k=ep≥1k = e_p \ge 1, the ramification index (or multiplicity) of ff at pp. Points with ep≥2e_p \ge 2 are ramification points, and their images branch points. For compact XX the degree of ff is deg⁡f=∑p∈f−1(q)ep\deg f = \sum_{p \in f^{-1}(q)} e_p (independent of qq, by Theorem 2). The genus of a compact Riemann surface is the genus of the underlying closed orientable surface, so χ(X)=2−2g\chi(X) = 2 - 2g.

Holomorphic maps preserve orientation (the Jacobian determinant of z↦f(z)z \mapsto f(z) is ∣f′(z)∣2≥0|f'(z)|^2 \ge 0), so every Riemann surface is orientable: the Klein bottle and the projective plane carry no complex structure. Conversely, every orientable surface carries one (for example from a Riemannian metric and isothermal coordinates).

Worked examplesH

Examples

Example— The plane, the sphere and their quotients

  • C\C, the unit disc D\mathbb D, and every connected open subset of C\C.
  • The Riemann sphere P1=C∪{∞}\mathbb P^1 = \C \cup \{\infty\} with the two charts zz on C\C and w=1/zw = 1/z on P1∖{0}\mathbb P^1 \setminus \{0\}; the transition z↦1/zz \mapsto 1/z is holomorphic on C∖{0}\C \setminus \{0\}. Rational functions are exactly the meromorphic functions on P1\mathbb P^1, and a rational function p/qp/q (in lowest terms) has degree max⁡(deg⁡p,deg⁡q)\max(\deg p, \deg q).
  • Complex tori. Let Λ=Zω1+Zω2\Lambda = \Z\omega_1 + \Z\omega_2 with ω1,ω2\omega_1, \omega_2 linearly independent over R\R. The quotient C/Λ\C/\Lambda is a compact Riemann surface of genus 11: charts are local inverses of the projection π:C→C/Λ\pi : \C \to \C/\Lambda on small discs, and transition maps are translations z↦z+ωz \mapsto z + \omega. Holomorphic functions on C/Λ\C/\Lambda are Λ\Lambda-periodic entire functions — hence constant (Liouville; formalised below) — while meromorphic functions on C/Λ\C/\Lambda are the elliptic functions, such as the Weierstrass function ℘(z)=1z2+∑ω∈Λ∖0(1(z−ω)2−1ω2)\wp(z) = \frac{1}{z^2} + \sum_{\omega \in \Lambda \setminus 0}\big(\frac{1}{(z - \omega)^2} - \frac{1}{\omega^2}\big).
  • Quotients of the disc. If Γ\Gamma is a group of Möbius transformations acting freely and properly discontinuously on D\mathbb D or on the upper half-plane H\mathbb H, then H/Γ\mathbb H/\Gamma is a Riemann surface. Modular curves H/Γ(N)\mathbb H/\Gamma(N) are of this kind (after removing elliptic fixed points or treating them as orbifold points).

Example— Algebraic curves

Let F(z,w)F(z, w) be a polynomial and C={(z,w)∈C2:F(z,w)=0}C = \{(z, w) \in \C^2 : F(z, w) = 0\}. At points where ∂F/∂w≠0\partial F/\partial w \ne 0 the implicit function theorem (holomorphic version) makes zz a local coordinate; where ∂F/∂z≠0\partial F/\partial z \ne 0, ww is one. So if CC is smooth (no common zeros of FF, FzF_z, FwF_w), it is a Riemann surface (if connected), and (z,w)↦z(z, w) \mapsto z is a holomorphic map whose ramification points are where Fw=0F_w = 0. Adding finitely many points at infinity (in P2\mathbb P^2, or by gluing in charts) gives a compact Riemann surface.

For w2=f(z)w^2 = f(z) with ff a squarefree polynomial of degree dd, the projection (z,w)↦z(z, w) \mapsto z has degree 22, ramified exactly over the roots of ff — and over ∞\infty when dd is odd. With d=3d = 3, f=z3−zf = z^3 - z, there are four branch points −1,0,1,∞-1, 0, 1, \infty, and the compact curve is a torus (Riemann–Hurwitz, below).

Example— z² as a branched double cover

f(w)=w2f(w) = w^2 from P1\mathbb P^1 to P1\mathbb P^1 has degree 22. Every z≠0,∞z \ne 0, \infty has two preimages ±z\pm\sqrt z; over 00 and ∞\infty there is one preimage, with e=2e = 2. Near w=0w = 0 angles at the origin are doubled — the conformal map z2z^2 fails to be conformal exactly at its critical point — and the visualization below shows this. The inverse of this map is the Riemann surface of z\sqrt z from the intuition section.

ProofH

Local structure of holomorphic maps

Theorem— Theorem 1 (local normal form)

Let f:X→Yf : X \to Y be a non-constant holomorphic map and p∈Xp \in X. There is a unique integer k≥1k \ge 1 and charts zz centred at pp and ww centred at f(p)f(p) in which ff is w=zkw = z^k.

Proof

Choose any charts centred at pp and f(p)f(p), so that ff becomes a holomorphic function FF near 00 with F(0)=0F(0) = 0. Since XX is connected and ff is not constant, FF is not identically 00 (identity theorem), so F(z)=zkg(z)F(z) = z^k g(z) with k≥1k \ge 1 and gg holomorphic, g(0)≠0g(0) \ne 0. On a small disc gg takes values in a disc not containing 00, on which a holomorphic logarithm exists; so g=hkg = h^k with h=exp⁡(1klog⁡g)h = \exp\big(\tfrac1k \log g\big) holomorphic and h(0)≠0h(0) \ne 0. Then ζ=z h(z)\zeta = z\,h(z) has ζ′(0)=h(0)≠0\zeta'(0) = h(0) \ne 0, so by the inverse function theorem it is a new coordinate near pp, and in it F=ζkF = \zeta^k. The integer kk is determined by ff: it is the number of preimages near pp of each point near (but not equal to) f(p)f(p). ∎

∎

Consequences: a non-constant holomorphic map is open (since z↦zkz \mapsto z^k is), its fibres are discrete, and it is a local biholomorphism exactly where ep=1e_p = 1, i.e. where its derivative in charts is non-zero. Ramification points are isolated, so on a compact surface there are finitely many.

Theorem— Theorem 2 (maps of compact surfaces are branched coverings)

Let f:X→Yf : X \to Y be a non-constant holomorphic map with XX compact. Then ff is surjective, YY is compact, every fibre is finite, and d=∑p∈f−1(q)epd = \sum_{p \in f^{-1}(q)} e_p is the same for all q∈Yq \in Y. Away from the finitely many branch points, ff is a dd-sheeted covering map.

Proof

f(X)f(X) is open (open mapping) and compact, hence closed; YY is connected, so f(X)=Yf(X) = Y, which is compact. Fibres are discrete and closed in the compact XX, hence finite. Fix qq with f−1(q)={p1,…,pr}f^{-1}(q) = \{p_1, \dots, p_r\} and normal-form charts z↦zeiz \mapsto z^{e_i} round each pip_i, on disjoint neighbourhoods UiU_i. Shrink a neighbourhood VV of qq so that f−1(V)⊆⋃Uif^{-1}(V) \subseteq \bigcup U_i (possible: f(X∖⋃Ui)f(X \setminus \bigcup U_i) is compact and misses qq). Then each q′∈V∖{q}q' \in V \setminus \{q\} has exactly eie_i preimages in UiU_i, all with multiplicity 11, so ∑p∈f−1(q′)ep=∑iei\sum_{p \in f^{-1}(q')} e_p = \sum_i e_i. Thus the function q↦∑f−1(q)epq \mapsto \sum_{f^{-1}(q)} e_p is locally constant, hence constant on the connected YY. ∎

∎

Theorem— Corollary 3

On a compact Riemann surface: (a) every holomorphic function is constant; (b) a non-constant meromorphic function has as many zeros as poles, counted with multiplicity; (c) if there is a meromorphic function of degree 11, then X≅P1X \cong \mathbb P^1.

Proof

(a) A holomorphic f:X→Cf : X \to \C composed with C⊂P1\C \subset \mathbb P^1 is a holomorphic map to P1\mathbb P^1 that misses ∞\infty; by Theorem 2 it must be constant. (b) A meromorphic f:X→P1f : X \to \mathbb P^1 has deg⁡f=∑f−1(0)ep=∑f−1(∞)ep\deg f = \sum_{f^{-1}(0)} e_p = \sum_{f^{-1}(\infty)} e_p. (c) A degree-11 map is a bijective holomorphic map, hence a biholomorphism (its inverse is holomorphic by the local normal form with k=1k = 1). ∎

∎

ProofH

The Riemann–Hurwitz formula

Theorem— Theorem 4 (Riemann–Hurwitz)

Let f:X→Yf : X \to Y be a non-constant holomorphic map of degree nn between compact Riemann surfaces of genera gXg_X and gYg_Y. Then

2gX−2=n (2gY−2)+∑p∈X(ep−1).2g_X - 2 = n\,(2g_Y - 2) + \sum_{p \in X}(e_p - 1).

Proof

The sum is finite (ramification points are isolated). Choose a triangulation of YY — with geodesic or smooth edges — whose vertices include all branch points, fine enough that each closed triangle lies in a disc over which ff is a trivial nn-sheeted covering away from its vertices. Its preimage is a triangulation of XX: each open face and open edge, avoiding branch points, has exactly nn preimages, so FX=nFYF_X = nF_Y and EX=nEYE_X = nE_Y. A vertex qq has ∑f−1(q)1=n−∑p∈f−1(q)(ep−1)\sum_{f^{-1}(q)} 1 = n - \sum_{p \in f^{-1}(q)}(e_p - 1) preimages, by Theorem 2. Hence VX=nVY−∑p(ep−1)V_X = nV_Y - \sum_p (e_p - 1), and

χ(X)=VX−EX+FX=n χ(Y)−∑p(ep−1).\chi(X) = V_X - E_X + F_X = n\,\chi(Y) - \sum_p (e_p - 1).

Substituting χ=2−2g\chi = 2 - 2g gives the formula. ∎

∎

Example— Genera from branched covers

  • w=znw = z^n on P1\mathbb P^1: e=ne = n at 00 and ∞\infty, so −2=n(−2)+2(n−1)-2 = n(-2) + 2(n - 1). ✓
  • Hyperelliptic curves w2=f(z)w^2 = f(z), ff squarefree of degree dd: a double cover of P1\mathbb P^1 with rr branch points, each with e=2e = 2, where r=dr = d for dd even and r=d+1r = d + 1 for dd odd. Then 2g−2=2(−2)+r2g - 2 = 2(-2) + r, so g=(r−2)/2g = (r - 2)/2: genus ⌊(d−1)/2⌋\lfloor (d - 1)/2\rfloor. For w2=z3−zw^2 = z^3 - z: r=4r = 4, g=1g = 1. In particular a double cover of the sphere has an even number of branch points.
  • Fermat curves xd+yd=1x^d + y^d = 1 (compactified in P2\mathbb P^2): (x,y)↦x(x, y) \mapsto x has degree dd, total ramification over the dd points xd=1x^d = 1 (where y=0y = 0, e=de = d), and is unramified at the dd points at infinity. So 2g−2=−2d+d(d−1)2g - 2 = -2d + d(d - 1) and g=(d−1)(d−2)/2g = (d-1)(d-2)/2, in agreement with the genus formula for smooth plane curves of degree dd.
  • Unramified covers of tori are tori: if gY=1g_Y = 1 and ff is unramified, then 2gX−2=02g_X - 2 = 0. And there is no non-constant holomorphic map from a torus to a surface of genus ≥2\ge 2, or from P1\mathbb P^1 to a torus: in both cases the right-hand side exceeds the left.
ProofH

Complex tori: a one-parameter family

All complex tori C/Λ\C/\Lambda are homeomorphic (to S1×S1S^1 \times S^1) and even diffeomorphic. They are not all biholomorphic.

Theorem— Theorem 5 (classification of tori)

C/Λ≅C/Λ′\C/\Lambda \cong \C/\Lambda' (biholomorphically) if and only if Λ′=aΛ\Lambda' = a\Lambda for some a∈C×a \in \C^\times. Every lattice is homothetic to Λτ=Z+Zτ\Lambda_\tau = \Z + \Z\tau with Im⁡τ>0\operatorname{Im}\tau > 0, and Λτ\Lambda_\tau, Λτ′\Lambda_{\tau'} are homothetic exactly when τ′=aτ+bcτ+d\tau' = \frac{a\tau + b}{c\tau + d} for some (abcd)∈SL(2,Z)\begin{pmatrix} a & b \\ c & d\end{pmatrix} \in SL(2, \Z).

Proof

If Λ′=aΛ\Lambda' = a\Lambda, then z↦azz \mapsto az descends to a biholomorphism. Conversely, let ϕ:C/Λ→C/Λ′\phi : \C/\Lambda \to \C/\Lambda' be a biholomorphism; composing with a translation we may assume ϕ(0)=0\phi(0) = 0. Since C\C is simply connected, ϕ∘π\phi \circ \pi lifts through the covering π′:C→C/Λ′\pi' : \C \to \C/\Lambda' to a holomorphic F:C→CF : \C \to \C with F(0)=0F(0) = 0. For each ω∈Λ\omega \in \Lambda, F(z+ω)−F(z)∈Λ′F(z + \omega) - F(z) \in \Lambda' depends continuously on zz and Λ′\Lambda' is discrete, so it is a constant cωc_\omega. Hence F′F' is Λ\Lambda-periodic and entire, so constant (Liouville), and F(z)=azF(z) = az. Applying the same to ϕ−1\phi^{-1} shows a≠0a \ne 0 and aΛ=Λ′a\Lambda = \Lambda'.

For the second part: rotating and scaling, any lattice Zω1+Zω2\Z\omega_1 + \Z\omega_2 (ordered so that Im⁡(ω2/ω1)>0\operatorname{Im}(\omega_2/\omega_1) > 0) is homothetic to Z+Zτ\Z + \Z\tau with τ=ω2/ω1\tau = \omega_2/\omega_1. Two oriented bases of the same lattice differ by a matrix in SL(2,Z)SL(2, \Z), (ω2′,ω1′)=(aω2+bω1,cω2+dω1)(\omega_2', \omega_1') = (a\omega_2 + b\omega_1, c\omega_2 + d\omega_1), which changes τ\tau to (aτ+b)/(cτ+d)(a\tau + b)/(c\tau + d). ∎

∎

So the isomorphism classes of tori correspond to points of H/SL(2,Z)\mathbb H/SL(2, \Z), whose standard fundamental domain is {∣Re⁡τ∣≤12,∣τ∣≥1}\{|\operatorname{Re}\tau| \le \frac12, |\tau| \ge 1\}; the jj-invariant j:H/SL(2,Z)→Cj : \mathbb H/SL(2, \Z) \to \C is a bijection. Tori form a family with one complex parameter: the square torus (τ=i\tau = i, j=1728j = 1728) and the hexagonal torus (τ=e2πi/3\tau = e^{2\pi i/3}, j=0j = 0) are different Riemann surfaces, and they have more automorphisms fixing 00 than other tori (Z/4\Z/4 and Z/6\Z/6 instead of Z/2\Z/2). This is the first moduli space; for genus g≥2g \ge 2, the moduli space Mg\mathcal M_g has complex dimension 3g−33g - 3.

Theorem— Theorem 6 (tori are cubic curves; stated)

The Weierstrass function satisfies ℘′(z)2=4℘(z)3−g2℘(z)−g3\wp'(z)^2 = 4\wp(z)^3 - g_2\wp(z) - g_3, with g2=60∑ω≠0ω−4g_2 = 60\sum_{\omega \ne 0}\omega^{-4}, g3=140∑ω≠0ω−6g_3 = 140\sum_{\omega \ne 0}\omega^{-6}, and the map z↦[℘(z):℘′(z):1]z \mapsto [\wp(z) : \wp'(z) : 1] (with 0↦[0:1:0]0 \mapsto [0 : 1 : 0]) is a biholomorphism from C/Λ\C/\Lambda onto the smooth projective cubic y2=4x3−g2x−g3y^2 = 4x^3 - g_2x - g_3. Conversely, every smooth cubic arises this way.

The differential equation is proved by noting that ℘′2−4℘3+g2℘+g3\wp'^2 - 4\wp^3 + g_2\wp + g_3 is an elliptic function whose Laurent expansion at 00 has no pole and vanishing constant term, so by Corollary 3(a) it is identically 00. Mathlib proves exactly this, and we cite it below. One more consequence of Corollary 3: no elliptic function has a single simple pole (per fundamental parallelogram). Indeed, the integral of ff round the boundary of a fundamental parallelogram PP (shifted to avoid poles) vanishes, because opposite sides cancel by periodicity; by the residue theorem it equals 2πi2\pi i times the sum of residues in PP. So the residues of an elliptic function sum to 00, and a single simple pole is impossible — which also follows from Corollary 3(c), since a function of degree 11 would make the torus a sphere.

ProofH

Uniformisation and Riemann–Roch

Theorem— Theorem 7 (uniformisation; Koebe and Poincaré, 1907; stated)

Every simply connected Riemann surface is biholomorphic to exactly one of P1\mathbb P^1, C\C and the unit disc D\mathbb D.

Since the universal cover of a Riemann surface is a simply connected Riemann surface on which π1\pi_1 acts by biholomorphisms, every Riemann surface is P1\mathbb P^1, or C\C, C×\C^\times or a torus C/Λ\C/\Lambda, or a quotient D/Γ\mathbb D/\Gamma by a discrete group of Möbius transformations. For compact surfaces this is decided by the genus: g=0g = 0 gives P1\mathbb P^1, g=1g = 1 gives a torus, g≥2g \ge 2 gives D/Γ\mathbb D/\Gamma with Γ\Gamma a cocompact Fuchsian group. Geometrically: every compact Riemann surface carries a conformal metric of constant curvature +1+1, 00 or −1-1, matching the sign of χ\chi — and by Gauss–Bonnet, a hyperbolic surface of genus gg has area −2πχ=4π(g−1)-2\pi\chi = 4\pi(g - 1). See Riemannian geometry.

A divisor on a compact Riemann surface is a finite formal sum D=∑np pD = \sum n_p\, p of points, of degree ∑np\sum n_p. Let L(D)L(D) be the space of meromorphic functions ff with div⁡(f)+D≥0\operatorname{div}(f) + D \ge 0 (poles allowed only where DD permits) together with 00, and ℓ(D)=dim⁡L(D)\ell(D) = \dim L(D). Let KK be the divisor of any non-zero meromorphic 11-form (a canonical divisor).

Theorem— Theorem 8 (Riemann–Roch; Riemann 1857, Roch 1865; stated)

For every divisor DD on a compact Riemann surface of genus gg,

ℓ(D)−ℓ(K−D)=deg⁡D+1−g.\ell(D) - \ell(K - D) = \deg D + 1 - g .

Example— Riemann–Roch at work

  • Consequences for KK. D=0D = 0 gives ℓ(K)=g\ell(K) = g: there are exactly gg independent holomorphic 11-forms. D=KD = K then gives deg⁡K=2g−2\deg K = 2g - 2, matching Riemann–Hurwitz.
  • Genus 00. On P1\mathbb P^1, L(n⋅∞)L(n\cdot\infty) is the space of polynomials of degree ≤n\le n, of dimension n+1=n+1−0n + 1 = n + 1 - 0 (and ℓ(K−n∞)=0\ell(K - n\infty) = 0 since deg⁡K=−2\deg K = -2). In general, on a surface of genus 00, ℓ(p)=2\ell(p) = 2 for any point pp, so there is a meromorphic function with a single simple pole: a degree-11 map to P1\mathbb P^1, and X≅P1X \cong \mathbb P^1 by Corollary 3(c).
  • Genus 11. For n≥1n \ge 1, ℓ(n⋅0)=n\ell(n\cdot 0) = n: on C/Λ\C/\Lambda, L(0)=CL(0) = \C, L(1⋅0)=CL(1\cdot 0) = \C (no function with one simple pole), L(2⋅0)=⟨1,℘⟩L(2\cdot 0) = \langle 1, \wp\rangle, L(3⋅0)=⟨1,℘,℘′⟩L(3\cdot 0) = \langle 1, \wp, \wp'\rangle. The seven functions 1,℘,℘′,℘2,℘℘′,℘3,℘′21, \wp, \wp', \wp^2, \wp\wp', \wp^3, \wp'^2 lie in the 66-dimensional L(6⋅0)L(6\cdot 0), so they satisfy a linear relation — the Weierstrass cubic. Every compact surface of genus 11 is a cubic curve, hence a torus.
  • Genus 22. ℓ(K)=2\ell(K) = 2 and deg⁡K=2\deg K = 2, so the quotient of two holomorphic 11-forms is a meromorphic function of degree 22: every surface of genus 22 is hyperelliptic, w2=f(z)w^2 = f(z) with deg⁡f=5\deg f = 5 or 66.

Riemann–Roch also shows that every compact Riemann surface has enough meromorphic functions to embed it in some PN\mathbb P^N (for deg⁡D≥2g+1\deg D \ge 2g + 1, the functions in L(D)L(D) give an embedding), and Chow's theorem then makes the image algebraic: every compact Riemann surface is a smooth projective algebraic curve. The hard analytic input is the existence of non-constant meromorphic functions, proved via harmonic functions (the Dirichlet principle) or Hodge theory; the proofs are in Forster, Chapters 2–3, and Miranda, Chapter VI.

Formal mathematicsF

Riemann surfaces in Lean and Mathlib

Mathlib's complex manifolds are manifolds modelled on Cn\C^n with holomorphic transition maps; a Riemann surface is the case n=1n = 1. The theory of branched coverings, Riemann–Hurwitz, uniformisation and Riemann–Roch is not yet formalised. What we can do is prove the analytic facts on which the lesson's examples rest.

First, the starting point of the whole subject: there is no continuous square root on C∖{0}\C \setminus \{0\}. The proof uses connectedness of [0,2π][0, 2\pi] in the form "two continuous functions with the same square and no zeros agree up to a global sign":

no_continuous_sqrtLean 4Proved here from basic factsFormally verified
/-- **There is no continuous square root on `ℂ ∖ {0}`.** Suppose `g` were one. Along the circle,
`f(t) = g(e^{it})` and `h(t) = e^{it/2}` are continuous on `[0, 2π]` with `f² = h²` and `h ≠ 0`;
since `[0, 2π]` is connected, `f = h` or `f = -h` throughout. But `f(0) = f(2π) = g(1)`, while
`h(0) = 1` and `h(2π) = e^{iπ} = -1`: contradiction in both cases. The square root becomes a
single-valued continuous (indeed holomorphic) function only on its two-sheeted Riemann surface. -/
theorem no_continuous_sqrt :
    ¬ ∃ g : ℂ → ℂ, ContinuousOn g {z | z ≠ 0} ∧ ∀ z, z ≠ 0 → g z ^ 2 = z := by
  rintro ⟨g, hg, hsq⟩
  set S : Set ℝ := Set.Icc 0 (2 * Real.pi)
  let f : ℝ → ℂ := fun t => g (exp (t * I))
  let h : ℝ → ℂ := fun t => exp (t * I / 2)
  have hexp_ne : ∀ t : ℝ, exp (t * I) ≠ 0 := fun t => exp_ne_zero _
  have hf : ContinuousOn f S := by
    refine hg.comp (Continuous.continuousOn (by fun_prop)) ?_
    intro t _
    exact hexp_ne t
  have hh : ContinuousOn h S := Continuous.continuousOn (by fun_prop)
  have hfh : Set.EqOn (f ^ 2) (h ^ 2) S := by
    intro t _
    simp only [Pi.pow_apply, f, h]
    rw [hsq _ (hexp_ne t), ← exp_nat_mul]
    congr 1
    push_cast
    ring
  have hne : ∀ {t}, t ∈ S → h t ≠ 0 := fun {t} _ => exp_ne_zero _
  have h0 : (0 : ℝ) ∈ S := ⟨le_rfl, by positivity⟩
  have h2 : 2 * Real.pi ∈ S := ⟨by positivity, le_rfl⟩
  have hf0 : f 0 = g 1 := by simp [f]
  have hf2 : f (2 * Real.pi) = g 1 := by
    simp only [f]
    congr 1
    push_cast
    exact exp_two_pi_mul_I
  have hh0 : h 0 = 1 := by simp [h]
  have hh2 : h (2 * Real.pi) = -1 := by
    simp only [h]
    rw [show ((2 * Real.pi : ℝ) : ℂ) * I / 2 = Real.pi * I by push_cast; ring]
    exact exp_pi_mul_I
  rcases (isPreconnected_Icc).eq_or_eq_neg_of_sq_eq hf hh hfh hne with heq | heq
  · have a := heq h0
    have b := heq h2
    rw [hf0, hh0] at a
    rw [hf2, hh2, a] at b
    norm_num at b
  · have a := heq h0
    have b := heq h2
    simp only [Pi.neg_apply] at a b
    rw [hf0, hh0] at a
    rw [hf2, hh2, a] at b
    norm_num at b
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor

Corollary 3(a), from Mathlib, for any compact connected complex manifold:

holomorphic_constant_compactLean 4Applies a library theoremFormally verified
/-- **On a compact connected Riemann surface every holomorphic function is constant** (maximum
modulus). So the interesting functions on a compact Riemann surface are *meromorphic*. Mathlib's
`MDifferentiable.apply_eq_of_compactSpace`, stated for any compact connected complex manifold
without boundary. -/
theorem holomorphic_constant_compact {E : Type*} [NormedAddCommGroup E] [NormedSpace ℂ E]
    {H : Type*} [TopologicalSpace H] {I : ModelWithCorners ℂ E H} [I.Boundaryless]
    {M : Type*} [TopologicalSpace M] [ChartedSpace H M] [IsManifold I 1 M]
    [CompactSpace M] [PreconnectedSpace M] {f : M → ℂ}
    (hf : MDifferentiable I (modelWithCornersSelf ℂ ℂ) f) (a b : M) : f a = f b :=
  hf.apply_eq_of_compactSpace a b
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor

For complex tori we work with Mathlib's PeriodPair (a pair of R\R-independent periods and the lattice they span). A function with both periods is invariant under the whole lattice; a doubly periodic entire function is constant (Liouville); and — the key step of Theorem 5 — a holomorphic map that commutes with the lattice up to constants is affine:

periodic_latticeLean 4Proved here from basic factsFormally verified
/-- A function with periods `ω₁` and `ω₂` is invariant under the whole lattice
`Λ = ℤω₁ + ℤω₂`: every `w = mω₁ + nω₂ ∈ Λ` is a period. So it is a function on the torus `ℂ/Λ`. -/
theorem periodic_lattice (L : PeriodPair) {f : ℂ → ℂ} (h₁ : ∀ z, f (z + L.ω₁) = f z)
    (h₂ : ∀ z, f (z + L.ω₂) = f z) : ∀ z w, w ∈ L.lattice → f (z + w) = f z := by
  intro z w hw
  obtain ⟨m, n, rfl⟩ := PeriodPair.mem_lattice.mp hw
  have p₁ : Function.Periodic f L.ω₁ := h₁
  have p₂ : Function.Periodic f L.ω₂ := h₂
  have hm := (p₁.int_mul m) z
  have hn := (p₂.int_mul n) (z + m * L.ω₁)
  rw [← add_assoc, hn, hm]
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor
doubly_periodic_constantLean 4Proved here from basic factsFormally verified
/-- **A doubly periodic entire function is constant.** It is continuous and invariant under the
lattice, so its range is the image of a compact fundamental parallelogram, hence bounded; by
Liouville's theorem it is constant. Equivalently: every holomorphic function on the compact
Riemann surface `ℂ/Λ` is constant. -/
theorem doubly_periodic_constant (L : PeriodPair) {f : ℂ → ℂ} (hf : Differentiable ℂ f)
    (h₁ : ∀ z, f (z + L.ω₁) = f z) (h₂ : ∀ z, f (z + L.ω₂) = f z) (z w : ℂ) : f z = f w := by
  have hc : IsCompact (Set.range f) :=
    IsZLattice.isCompact_range_of_periodic L.lattice f hf.continuous (periodic_lattice L h₁ h₂)
  exact hf.apply_eq_apply_of_bounded hc.isBounded z w
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor
lift_affineLean 4Proved here from basic factsFormally verified
/-- **Holomorphic maps between tori lift to affine maps.** Let `F : ℂ → ℂ` be entire and suppose
`F(z + ω₁) - F(z)` and `F(z + ω₂) - F(z)` do not depend on `z` (this holds for a lift of a
holomorphic map `ℂ/Λ → ℂ/Λ'`, the differences lying in the discrete set `Λ'`). Then `F' ` is
doubly periodic, hence constant `= a`, and `F(z) = a z + F(0)`. This is the key step in the
classification of complex tori: `ℂ/Λ ≅ ℂ/Λ'` iff `Λ' = aΛ` for some `a ∈ ℂ^×`. -/
theorem lift_affine (L : PeriodPair) {F : ℂ → ℂ} (hF : Differentiable ℂ F) {c₁ c₂ : ℂ}
    (h₁ : ∀ z, F (z + L.ω₁) = F z + c₁) (h₂ : ∀ z, F (z + L.ω₂) = F z + c₂) :
    ∃ a : ℂ, ∀ z, F z = a * z + F 0 := by
  have hd : Differentiable ℂ (deriv F) := fun z =>
    ((hF.differentiableOn.deriv isOpen_univ) z (Set.mem_univ z)).differentiableAt
      (isOpen_univ.mem_nhds (Set.mem_univ z))
  have per : ∀ (c ω : ℂ), (∀ z, F (z + ω) = F z + c) → ∀ z, deriv F (z + ω) = deriv F z := by
    intro c ω h z
    have e1 : deriv (fun z => F (z + ω)) z = deriv F (z + ω) := deriv_comp_add_const _ _ _
    have e2 : (fun z => F (z + ω)) = fun z => F z + c := funext h
    rw [← e1, e2, deriv_add_const]
  obtain ⟨a, ha⟩ : ∃ a, ∀ z, deriv F z = a :=
    ⟨deriv F 0, fun z => doubly_periodic_constant L hd (per c₁ _ h₁) (per c₂ _ h₂) z 0⟩
  refine ⟨a, fun z => ?_⟩
  have hG : Differentiable ℂ (fun z => F z - a * z) := hF.sub (differentiable_id.const_mul a)
  have hG' : ∀ z, deriv (fun z => F z - a * z) z = 0 := by
    intro z
    have hz : HasDerivAt (fun z => F z - a * z) (deriv F z - a * 1) z :=
      (hF z).hasDerivAt.sub ((hasDerivAt_id' z).const_mul a)
    rw [hz.deriv, ha]
    ring
  have := is_const_of_deriv_eq_zero hG hG' z 0
  simp only [mul_zero, sub_zero] at this
  linear_combination this
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor

Finally, Theorem 6's differential equation, which Mathlib has recently formalised along with the Weierstrass function itself:

weierstrass_periodicLean 4Applies a library theoremFormally verified
/-- The **Weierstrass function** `℘(z) = 1/z² + Σ_{w ∈ Λ ∖ 0} (1/(z - w)² - 1/w²)` is periodic
for the lattice `Λ`, so it is a meromorphic function on the torus `ℂ/Λ` (with a double pole at
`0`). Mathlib's `PeriodPair.weierstrassP_add_coe`. -/
theorem weierstrass_periodic (L : PeriodPair) (z : ℂ) (w : L.lattice) :
    L.weierstrassP (z + w) = L.weierstrassP z :=
  L.weierstrassP_add_coe z w
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor
weierstrass_cubicLean 4Applies a library theoremFormally verified
/-- **The torus is a cubic curve.** Away from the lattice, `℘'(z)² = 4℘(z)³ - g₂℘(z) - g₃`, so
`z ↦ (℘(z), ℘'(z))` maps `ℂ/Λ` minus a point into the affine curve `y² = 4x³ - g₂x - g₃`; sending
`0` to the point at infinity gives a biholomorphism onto the projective cubic. Mathlib's
`PeriodPair.derivWeierstrassP_sq`. -/
theorem weierstrass_cubic (L : PeriodPair) (z : ℂ) (hz : z ∉ L.lattice) :
    L.derivWeierstrassP z ^ 2 = 4 * L.weierstrassP z ^ 3 - L.g₂ * L.weierstrassP z - L.g₃ :=
  L.derivWeierstrassP_sq z hz
Axioms used: propext, Classical.choice, Quot.soundformal/Lumenary/RiemannSurfaces.leanTry it in the Lean web editor

What is and is not formalised. Proved here: the non-existence of a continuous square root on C∖{0}\C \setminus \{0\}, lattice invariance, Liouville for doubly periodic functions, and the affine-lift lemma of Theorem 5. Cited from Mathlib: constancy of holomorphic functions on compact complex manifolds, the periodicity of ℘\wp and the equation ℘′2=4℘3−g2℘−g3\wp'^2 = 4\wp^3 - g_2\wp - g_3. Not formalised: Theorems 1, 2 and 4 (Mathlib has the analytic ingredients — the identity theorem, the open mapping theorem, local inverses — but not holomorphic maps between Riemann surfaces as branched coverings), the full classification of tori (the lifting step uses covering space theory on the quotient C/Λ\C/\Lambda), uniformisation, and Riemann–Roch.

ComputationC

Branch points, genera and the j-invariant

The first program checks Riemann–Hurwitz for rational maps of the sphere, measuring each ramification index numerically (as the number of solutions of f(z)=f(p)+εf(z) = f(p) + \varepsilon near pp); computes genera of hyperelliptic and Fermat curves from their branch data; and continues square roots along loops, recording whether they come back with the same sign.

Riemann-Hurwitz and the monodromy of square rootsPythonNumerical approximationExact computationComputationally tested
"""Branched covers: Riemann-Hurwitz and the monodromy of square roots.

Part 1 checks the Riemann-Hurwitz formula 2g_X - 2 = n(2g_Y - 2) + sum(e_p - 1)
for rational maps of the Riemann sphere to itself (g_X = g_Y = 0). The
ramification index e_p at each critical point is measured numerically, by
counting how many solutions of f(z) = f(p) + eps lie close to p.

Part 2 computes genera of curves from branched covers of the sphere: the
hyperelliptic curves w^2 = f(z), branched over the roots of f (and over
infinity when deg f is odd), and the Fermat curves x^d + y^d = 1, branched
over the d-th roots of unity.

Part 3 continues a square root along loops numerically: w^2 = z flips sign
round the origin; w^2 = z^3 - z flips sign round a loop enclosing one branch
point but not round a loop enclosing two.
"""

import cmath
import math

import numpy as np

def critical_points(num, den, tol=1e-3):
    """Distinct finite critical points of f = num/den: roots of num' den - num den'."""
    p, q = np.poly1d(num), np.poly1d(den)
    wronskian = np.polyder(p) * q - p * np.polyder(q)
    points = []
    for r in np.roots(wronskian.coeffs):
        if all(abs(r - c) > tol for c in points):
            points.append(complex(r))
    return points

def local_degree(num, den, c, eps=1e-12, radius=0.05):
    """e_c: the number of solutions of f(z) = f(c) + eps lying close to c."""
    p, q = np.poly1d(num), np.poly1d(den)
    target = p(c) / q(c) + eps
    roots = np.roots((p - target * q).coeffs)
    return sum(1 for r in roots if abs(r - c) < radius)

def total_ramification(num, den):
    """R = sum of (e_p - 1): local degrees counted numerically at the finite
    critical points, plus the ramification at infinity, |deg num - deg den| - 1."""
    finite = sum(local_degree(num, den, c) - 1 for c in critical_points(num, den))
    gap = abs(len(num) - len(den))
    return finite + max(gap - 1, 0)

def riemann_hurwitz_genus(degree, genus_y, total_ramification):
    """Solve 2g_X - 2 = n(2g_Y - 2) + R for g_X."""
    twice = degree * (2 * genus_y - 2) + total_ramification + 2
    if twice % 2:
        raise ValueError("Riemann-Hurwitz gives a half-integer genus")
    return twice // 2

def hyperelliptic_genus(deg_f):
    """Genus of w^2 = f(z), f squarefree of degree deg_f >= 1."""
    branch_points = deg_f if deg_f % 2 == 0 else deg_f + 1
    return riemann_hurwitz_genus(2, 0, branch_points)

def fermat_genus(d):
    """Genus of x^d + y^d = 1 via (x, y) -> x: degree d, d points with e = d."""
    return riemann_hurwitz_genus(d, 0, d * (d - 1))

def continue_sqrt(f, centre, radius, turns=1, steps=2000):
    """Follow a continuous branch of sqrt(f(z)) round a circle; return end/start."""
    z0 = centre + radius
    w = cmath.sqrt(f(z0))
    start = w
    for k in range(1, turns * steps + 1):
        z = centre + radius * cmath.exp(2j * math.pi * k / steps)
        root = cmath.sqrt(f(z))
        w = root if abs(root - w) <= abs(root + w) else -root
    return w / start

def main():
    print("1. Riemann-Hurwitz for maps P^1 -> P^1: -2 = n(-2) + R")
    cases = [("z^3 - 3z", 3, total_ramification([1, 0, -3, 0], [1])),
             ("z^4", 4, total_ramification([1, 0, 0, 0, 0], [1])),
             ("(z^2 + 1)/(z - 2)", 2, total_ramification([1, 0, 1], [1, -2])),
             ("(z^3 - 1)/(z^2 + 3)", 3,
              total_ramification([1, 0, 0, -1], [1, 0, 3]))]
    for name, n, r in cases:
        print(f"   {name:<20} degree {n}: R = {r}, n(-2) + R = {-2 * n + r}")
    print("2. Genus from branch data")
    for deg in [3, 4, 5, 6]:
        print(f"   w^2 = f(z), deg f = {deg}: genus {hyperelliptic_genus(deg)}")
    for d in [2, 3, 4, 5]:
        print(f"   Fermat x^{d} + y^{d} = 1: genus {fermat_genus(d)}"
              f" (plane curve formula (d-1)(d-2)/2 = {(d - 1) * (d - 2) // 2})")
    print("3. Continuing a square root once round a loop (end / start):")
    loops = [("sqrt(z), circle round 0", lambda z: z, 0, 1.0, 1),
             ("sqrt(z), twice round 0", lambda z: z, 0, 1.0, 2),
             ("sqrt(z^3 - z), round 1 only", lambda z: z**3 - z, 1, 0.5, 1),
             ("sqrt(z^3 - z), round 0 and 1", lambda z: z**3 - z, 0.5, 0.8, 1),
             ("sqrt(z^3 - z), round all three", lambda z: z**3 - z, 0, 2.0, 1)]
    for name, f, c, r, turns in loops:
        ratio = continue_sqrt(f, c, r, turns)
        print(f"   {name:<32} {ratio.real:+.6f}")
    print()
    print("Epistemic status: numerical root-finding and path-following for a few")
    print("maps and loops, plus exact integer arithmetic for the genus formulas.")
    print("Evidence for Riemann-Hurwitz and for the monodromy of branch points;")
    print("the proofs are in the lesson.")

if __name__ == "__main__":
    main()
Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

The last block is the intuition section made numerical: z3−z\sqrt{z^3 - z} changes sign round a loop enclosing one branch point or three (the fourth branch point, ∞\infty, is then also "inside" from the other side), and not round a loop enclosing two.

The second program computes the jj-invariant of C/(Z+Zτ)\C/(\Z + \Z\tau) from the qq-expansions of the Eisenstein series, j=1728E43/(E43−E62)j = 1728E_4^3/(E_4^3 - E_6^2), and reduces points of the upper half-plane to the fundamental domain.

Complex tori, the modular group and the j-invariantPythonNumerical approximationComputationally tested
"""Complex tori and the j-invariant.

Every complex torus is C / (Z + tau Z) with tau in the upper half-plane, and
two tori are biholomorphic exactly when their tau's differ by an element of
SL(2, Z) acting by Mobius transformations. The j-invariant is a complete
invariant. We compute j(tau) = 1728 E4^3 / (E4^3 - E6^2) from the
q-expansions of the Eisenstein series (q = exp(2 pi i tau)), check that
j(tau + 1) = j(-1/tau) = j(tau), compute j(i) = 1728 and j(exp(2 pi i/3)) = 0,
reduce points to the standard fundamental domain, and show that tori of the
same shape but different size have the same j while the square and the
hexagonal tori are different. Numerical evidence from truncated series.
"""

import cmath
import math

def sigma(k, n):
    """Sum of the k-th powers of the divisors of n."""
    return sum(d**k for d in range(1, n + 1) if n % d == 0)

def eisenstein(tau, terms=60):
    """(E4, E6) at tau via E4 = 1 + 240 sum s3(n) q^n, E6 = 1 - 504 sum s5(n) q^n."""
    q = cmath.exp(2j * math.pi * tau)
    e4, e6, qn = 1 + 0j, 1 + 0j, 1 + 0j
    for n in range(1, terms + 1):
        qn *= q
        e4 += 240 * sigma(3, n) * qn
        e6 -= 504 * sigma(5, n) * qn
    return e4, e6

def j_invariant(tau, terms=60):
    """j(tau) = 1728 E4^3 / (E4^3 - E6^2)."""
    e4, e6 = eisenstein(tau, terms)
    return 1728 * e4**3 / (e4**3 - e6**2)

def reduce_to_fundamental_domain(tau, max_steps=100):
    """Apply T: tau -> tau + n and S: tau -> -1/tau until |Re| <= 1/2, |tau| >= 1."""
    steps = []
    for _ in range(max_steps):
        n = round(tau.real)
        if n:
            tau -= n
            steps.append(f"T^{-n}")
        if abs(tau) < 1 - 1e-12:
            tau = -1 / tau
            steps.append("S")
        else:
            return tau, steps
    raise RuntimeError("did not converge")

def lattice_tau(w1, w2):
    """The tau of the lattice Z w1 + Z w2, normalised to the upper half-plane."""
    tau = w2 / w1
    return tau if tau.imag > 0 else -tau

def main():
    i = 1j
    rho = cmath.exp(2j * math.pi / 3)
    print(f"j(i)       = {j_invariant(i).real:12.4f}   (square torus; exact 1728)")
    print(f"j(rho)     = {abs(j_invariant(rho + 1)):12.4e}   (hexagonal torus; exact 0)")
    tau = 0.3 + 1.1j
    print(f"j(tau)     = {j_invariant(tau):.6f}   for tau = 0.3 + 1.1i")
    print(f"j(tau + 1) = {j_invariant(tau + 1):.6f}")
    print(f"j(-1/tau)  = {j_invariant(-1 / tau, terms=120):.6f}")
    print()
    print("Reducing tau to the fundamental domain |Re tau| <= 1/2, |tau| >= 1:")
    for start in [3.7 + 0.2j, -0.45 + 0.05j, 0.1 + 0.6j]:
        end, steps = reduce_to_fundamental_domain(start)
        moves = " ".join(steps) if steps else "(already reduced)"
        x, y = round(end.real, 4) + 0.0, round(end.imag, 4)
        print(f"  {start}: {moves} -> {x:+.4f}{y:+.4f}i")
        print(f"     j before {j_invariant(start, 400):.2f}")
        print(f"     j after  {j_invariant(end):.2f}")
    print()
    t1 = lattice_tau(1 + 0j, 1j)
    t2 = lattice_tau(2 + 2j, -2 + 2j)
    print("Same shape, different size: lattices Z + iZ and (2+2i)Z + (-2+2i)Z")
    print(f"  j = {j_invariant(t1).real:.4f} and {j_invariant(t2).real:.4f}")
    print()
    print("Epistemic status: floating-point evaluation of truncated q-series, so")
    print("evidence only. The invariance of j under SL(2, Z) and the fact that j")
    print("classifies tori up to biholomorphism are theorems (see the lesson).")

if __name__ == "__main__":
    main()
Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.

j(τ+1)j(\tau + 1), j(−1/τ)j(-1/\tau) and j(τ)j(\tau) agree, the reduced point has the same jj as the original, and homothetic lattices have the same jj — all numerical evidence for Theorem 5 and the invariance of jj.

Explore

Explore: a branched double cover and a torus

The map w=z2w = z^2 is the projection of the Riemann surface of w\sqrt w onto the plane. Move the probe: the little right-angled cross stays right-angled (the map is conformal) everywhere except at z=0z = 0, the ramification point, where angles are doubled and the cross opens to 180∘180^\circ. Each image point other than 00 is hit twice, by ±z\pm z.

w = z²: a branched double cover

Conformal everywhere except at the branch point 0, where angles double.

Function
Grid
z-plane
z₀
w-plane · w = z²
f(z₀)
  • horizontal lines and their images
  • vertical lines and their images
  • small cross at z₀ and its image

Drag the points, or focus one with Tab and use the arrow keys (hold Shift for small steps).

z₀ =+i
z₀
1 + 0.5i
w₀ = f(z₀)
0.75 + i
f′(z₀)
2 + i
Local scale factor |f′(z₀)|
2.236
Local rotation arg f′(z₀)
26.6°
Angle between the image curves
90°

Conformal at z₀: the little right angle is turned by 26.6° and scaled by 2.236, and it stays a right angle.

Squaring doubles every argument: the right half-plane opens out to the whole plane, and the grid lines become parabolas that still cross at right angles.

A complex torus is the plane modulo a lattice. In the tiling view, copies of a fundamental parallelogram (here a square, τ=i\tau = i) tile the plane; the plane is the universal cover of the torus, and the deck transformations are the lattice translations. Walking off one edge of the square brings you back on the opposite edge — exactly the identification z∼z+1∼z+τz \sim z + 1 \sim z + \tau.

The torus ℂ/(ℤ + iℤ) and its universal cover

Lattice translations are the deck transformations of ℂ → ℂ/Λ.

Keys: ↑ forward, ↓ back, ← and → turn, Space walks or stops. You can also drag it.

Torusa b a⁻¹ b⁻¹
Orientable
Yes
Euler characteristic
χ = 0

Gluing turns the 4 corners into V = 1, the 4 sides into E = 2 and the square into F = 1: V − E + F = 1 − 2 + 1 = 0

Same way round as at the start.

Sides crossed so far: 0

Opposite sides are glued with arrows pointing the same way. Walk off the right side and you come back on the left, the same way round. However it walks, the flatlander is never mirrored: the torus is orientable.

Copies of the square tile the plane, and the trail runs on smoothly from copy to copy. This plane is the universal cover of the torus.

Exercises

Exercises

1. Riemann surfaces

Warm-upHuman

What is the genus of the compact Riemann surface of w2=z7−zw^2 = z^7 - z?

2. Riemann surfaces

CoreHuman

A compact Riemann surface XX of genus 22 admits a holomorphic map of degree 33 onto a torus YY. What is the total ramification ∑p(ep−1)\sum_{p}(e_p - 1)?

3. Riemann surfaces

CoreHuman

A compact Riemann surface of genus 44 is a double cover of the Riemann sphere. How many branch points does the cover have?

4. Riemann surfaces

CoreHuman

Which of these surfaces admit the structure of a Riemann surface? (Choose all that apply.)

Choose all that apply

5. Riemann surfaces

CoreHuman

Are the tori C/(Z+iZ)\C/(\Z + i\Z) and C/(Z+2iZ)\C/(\Z + 2i\Z) biholomorphic?

Choose one

6. Riemann surfaces

CoreHuman

On which of these domains is there a continuous function gg with g(z)2=zg(z)^2 = z for all zz in the domain? (Choose all that apply.)

Choose all that apply

7. Riemann surfaces

CoreHuman

In the proof of the local normal form we write F(z)=zkg(z)F(z) = z^k g(z) with g(0)≠0g(0) \ne 0 and need a holomorphic hh near 00 with hk=gh^k = g. Why does hh exist?

Choose one

8. Riemann surfaces

StretchFormal

Which Lean statement says exactly that there is no continuous square root on C∖{0}\C \setminus \{0\}?

Choose one

9. Riemann surfaces

StretchComputational

Write reduce_tau(tau) that takes a complex number with positive imaginary part and returns the equivalent point of the fundamental domain {∣Re⁡τ∣≤12, ∣τ∣≥1}\{|\operatorname{Re}\tau| \le \frac12,\ |\tau| \ge 1\}, by repeating: translate by an integer to make ∣Re⁡τ∣≤12|\operatorname{Re}\tau| \le \frac12; if ∣τ∣<1|\tau| < 1, replace τ\tau by −1/τ-1/\tau.

Runs entirely in your browser, in an isolated worker. Nothing is sent to a server.
Common misconceptionsH

Common misconceptions

Misconception

"All tori are biholomorphic." They are all homeomorphic, even diffeomorphic, but the complex structure carries one complex parameter: C/Λ≅C/Λ′\C/\Lambda \cong \C/\Lambda' exactly when Λ′=aΛ\Lambda' = a\Lambda, i.e. when the τ\tau's are related by SL(2,Z)SL(2, \Z), i.e. when the jj-invariants agree. The square torus (j=1728j = 1728) and the hexagonal torus (j=0j = 0) are different Riemann surfaces, and so are C/(Z+iZ)\C/(\Z + i\Z) and C/(Z+2iZ)\C/(\Z + 2i\Z).

Misconception

"The square root is a function on C∖{0}\C \setminus \{0\}, if we just choose carefully." Any choice of square roots is discontinuous somewhere on every loop round 00 (formalised above). Continuous branches exist on simply connected regions avoiding 00, such as C∖(−∞,0]\C \setminus (-\infty, 0], and the square root becomes a single-valued holomorphic function on its Riemann surface {(z,w):w2=z}\{(z, w) : w^2 = z\}, the two-sheeted cover branched at 00 and ∞\infty.

Misconception

"A Riemann surface is a surface in C2\C^2 or R3\R^3." A Riemann surface is an abstract one-dimensional complex manifold; algebraic curves in C2\C^2 or P2\mathbb P^2 are important examples, but tori C/Λ\C/\Lambda and quotients D/Γ\mathbb D/\Gamma are defined intrinsically. It is a theorem (Riemann–Roch plus Chow) that every compact Riemann surface embeds in projective space as an algebraic curve.

Misconception

"Complex dimension one means real dimension one." A Riemann surface is a curve to an algebraic geometer (complex dimension 11) and a surface to a topologist (real dimension 22). The "complex line" C\C is a real plane, and the "projective line" P1\mathbb P^1 is a sphere.

Misconception

"Every holomorphic function on a Riemann surface is constant." Only on compact ones (Corollary 3). Non-compact Riemann surfaces have many holomorphic functions — in fact every non-compact Riemann surface is a Stein manifold, with holomorphic functions separating points (Behnke–Stein, 1949). On compact surfaces one works with meromorphic functions and 11-forms instead.

ViewpointsH

Many ways of seeing

Topology— Coverings, monodromy and moduli

Away from its branch points, a degree-nn map X→YX \to Y is an nn-sheeted covering of Y∖BY \setminus B, so it is described by its monodromy: a homomorphism π1(Y∖B)→Sn\pi_1(Y \setminus B) \to S_n recording how loops permute the sheets. For z3−z\sqrt{z^3 - z}, every small loop round a branch point maps to the transposition (1 2)(1\,2). Conversely (the Riemann existence theorem), any such homomorphism with transitive image comes from a unique compact Riemann surface with a branched cover of YY — so topology produces algebraic curves. The space of all complex structures on a closed surface of genus g≥2g \ge 2, modulo isotopy, is Teichmüller space, a complex manifold of dimension 3g−33g - 3 homeomorphic to a ball; dividing by the mapping class group gives the moduli space Mg\mathcal M_g. See the fundamental group and low-dimensional topology.

Geometry— Conformal structures and constant curvature

On an oriented surface, a complex structure is the same thing as a conformal structure — a Riemannian metric up to multiplication by positive functions — because holomorphic maps are exactly the orientation-preserving conformal maps (and isothermal coordinates exist for every metric). Uniformisation is then a statement in Riemannian geometry: every conformal class contains a metric of constant curvature, spherical, flat or hyperbolic according to the sign of χ\chi. A compact Riemann surface of genus g≥2g \ge 2 "is" a closed hyperbolic surface, obtained by gluing the sides of a hyperbolic 4g4g-gon, and its geodesics and their lengths are a central object of study. See non-Euclidean geometry.

Algebra— Curves and their function fields

For a compact Riemann surface XX, the field M(X)\mathcal M(X) of meromorphic functions is a finitely generated extension of C\C of transcendence degree 11 — for w2=z3−zw^2 = z^3 - z it is C(z)[w]/(w2−z3+z)\C(z)[w]/(w^2 - z^3 + z) — and X↦M(X)X \mapsto \mathcal M(X) is an equivalence (contravariant) between compact Riemann surfaces with non-constant holomorphic maps and such fields with C\C-embeddings. A branched cover X→YX \to Y of degree nn corresponds to a field extension M(X)⊇M(Y)\mathcal M(X) \supseteq \mathcal M(Y) of degree nn, and Galois coverings to Galois extensions — the analogue, in geometry, of the Galois correspondence between subgroups and intermediate fields, now with the fundamental group of the punctured surface in the role of the Galois group. See algebraic geometry and Galois theory.

Number theory— Elliptic curves and Belyi's theorem

The torus C/Λ\C/\Lambda is the cubic curve y2=4x3−g2x−g3y^2 = 4x^3 - g_2x - g_3, and the group law of C/Λ\C/\Lambda (addition of complex numbers) becomes the chord-and-tangent law on the cubic. When the coefficients are rational, the same equation defines an elliptic curve over Q\Q, whose rational points form a finitely generated abelian group (Mordell, 1922) — the subject of the Birch–Swinnerton-Dyer conjecture and of Wiles's proof of Fermat's Last Theorem, which hinges on the parametrisation of elliptic curves over Q\Q by modular curves H/Γ0(N)\mathbb H/\Gamma_0(N). The jj-function is itself a modular function, j(τ)=q−1+744+196884q+⋯j(\tau) = q^{-1} + 744 + 196884q + \cdots, and its values at imaginary quadratic τ\tau are algebraic integers (complex multiplication): eπ163e^{\pi\sqrt{163}} is within 10−1210^{-12} of an integer because j(1+i1632)=−6403203j\big(\frac{1 + i\sqrt{163}}{2}\big) = -640320^3. Belyi's theorem (1979) says a compact Riemann surface can be defined by equations with algebraic coefficients exactly when it admits a meromorphic function branched over only three points. See arithmetic geometry.

Analysis— Harmonic functions and Hodge theory

Riemann's own approach was analytic: he constructed meromorphic functions and differentials by solving the Laplace equation with prescribed singularities, using the Dirichlet principle (later made rigorous by Hilbert, 1900). In modern terms, the Hodge decomposition H1(X;C)=H1,0⊕H0,1H^1(X; \C) = H^{1,0} \oplus H^{0,1} splits the 2g2g-dimensional cohomology into holomorphic and antiholomorphic 11-forms, gg dimensions each — the analytic meaning of the genus. Integrating the gg holomorphic forms over the 2g2g loops of a basis of H1H_1 gives the period matrix, and X↦Jac⁡(X)=Cg/periodsX \mapsto \operatorname{Jac}(X) = \C^g/\text{periods} is the Abel–Jacobi construction; Torelli's theorem says the polarised Jacobian determines XX. For a torus, the period matrix is (1,τ)(1, \tau), recovering Theorem 5.

Physics— Potential flow and worldsheets

Two-dimensional potential theory lives naturally on Riemann surfaces: a steady, irrotational, incompressible planar flow has a holomorphic complex potential, and conformal maps transport flows from one region to another (the Joukowski map z+1/zz + 1/z turns flow round a cylinder into flow round an aerofoil). In string theory, the trajectory of a string sweeps out a two-dimensional "worldsheet", and perturbative amplitudes are (heuristically) integrals over moduli spaces of Riemann surfaces, one genus at a time; this physical intuition has led to deep, rigorously proved results about the cohomology of Mg\mathcal M_g (Witten's conjecture, proved by Kontsevich, 1992). The physics is a guide, not a proof.

History & global context

History and global context

  • Elliptic functions. Integrals such as ∫dx/1−x4\int dx/\sqrt{1 - x^4} (the lemniscate) were studied by Fagnano and Euler in the eighteenth century. Carl Friedrich Gauss (unpublished, around 1800), Niels Henrik Abel (1827) and Carl Jacobi (1829) inverted elliptic integrals and discovered that the resulting functions are doubly periodic. Karl Weierstrass's lectures in Berlin (from the 1860s) introduced ℘\wp and its differential equation.
  • Riemann. Bernhard Riemann's dissertation (1851) introduced Riemann surfaces and conformal mapping; his Theorie der Abel'schen Functionen (1857) used them to study integrals of algebraic functions, introduced the genus, and proved the inequality ℓ(D)≥deg⁡D+1−g\ell(D) \ge \deg D + 1 - g that his student Gustav Roch completed to the Riemann–Roch theorem (1865). Adolf Hurwitz proved the ramification formula (1891).
  • Rigour and uniformisation. Felix Klein popularised Riemann's ideas (1882), and with Henri Poincaré developed the theory of Fuchsian groups in the early 1880s. The uniformisation theorem was proved independently by Paul Koebe and Poincaré in 1907. Hermann Weyl's Die Idee der Riemannschen Fläche (1913) gave the first rigorous definition of a Riemann surface by charts, a model for the definition of manifolds.
  • Modern developments. Srinivasa Ramanujan's work on the Eisenstein series PP, QQ, RR (1916) and on singular moduli fed into the arithmetic of the jj-function. Oswald Teichmüller (1930s–1940s), Lars Ahlfors and Lipman Bers founded the theory of moduli of Riemann surfaces; David Mumford and Pierre Deligne studied Mg\mathcal M_g algebraically (1969). Gennadi Belyi's theorem (1979) inspired Alexander Grothendieck's dessins d'enfants (1984).
Further reading

Further reading

  • Rick Miranda, Algebraic Curves and Riemann Surfaces (1995) — concrete and example-driven: Riemann–Hurwitz, divisors, Riemann–Roch, algebraic curves.
  • Otto Forster, Lectures on Riemann Surfaces (1981) — covering spaces, sheaf cohomology, Riemann–Roch, Abel's theorem and uniformisation, in complete detail.
  • Simon Donaldson, Riemann Surfaces (2011) — a modern, analytic route to uniformisation and Riemann–Roch.
  • Hershel M. Farkas and Irwin Kra, Riemann Surfaces (2nd edition, 1992) — the classical function theory, including Weierstrass points and theta functions.
  • Joseph H. Silverman, The Arithmetic of Elliptic Curves (2nd edition, 2009) — Chapter VI for complex tori and the Weierstrass function, then the arithmetic.