A machine-checked solution to the Jacobians challenge

10.3. ProjectiveLine🔗

Jacobians.ProjectiveLinesource

RiemannSphere

The Riemann sphere ℂℙ¹, modelled as the one-point compactification OnePoint ℂ = ℂ ∪ {∞}.

abbrev RiemannSphere : Type

invMap

The underlying point map of the inversion: ∞ ↦ 0, 0 ↦ ∞, and z ↦ z⁻¹ otherwise.

def invMap : RiemannSphere → RiemannSphere

invMap_infty

@[simp] lemma invMap_infty : invMap OnePoint.infty = (((0 : ℂ)) : RiemannSphere)

invMap_coe

lemma invMap_coe (z : ℂ) :
    invMap (z : RiemannSphere) =
      if z = 0 then (OnePoint.infty) else ((z⁻¹ : ℂ) : RiemannSphere)

invMap_coe_zero

@[simp] lemma invMap_coe_zero : invMap ((0 : ℂ) : RiemannSphere) = OnePoint.infty

invMap_coe_of_ne

lemma invMap_coe_of_ne {z : ℂ} (hz : z ≠ 0) :
    invMap (z : RiemannSphere) = ((z⁻¹ : ℂ) : RiemannSphere)

involutive_invMap

lemma involutive_invMap : Function.Involutive invMap

tendsto_coe_cobounded_infty

The coercion ℂ → OnePoint ℂ tends to along cobounded ℂ (i.e. as |z| → ∞).

lemma tendsto_coe_cobounded_infty :
    Tendsto ((↑) : ℂ → RiemannSphere) (cobounded ℂ) (𝓝 OnePoint.infty)

tendsto_invMap_infty

lemma tendsto_invMap_infty :
    Tendsto (fun z : ℂ => invMap (z : RiemannSphere)) (coclosedCompact ℂ)
      (𝓝 (invMap OnePoint.infty))

continuous_invMap_coe

The affine restriction z ↦ invMap z : ℂ → OnePoint ℂ is continuous.

lemma continuous_invMap_coe : Continuous (fun z : ℂ => invMap (z : RiemannSphere))

continuous_invMap

lemma continuous_invMap : Continuous invMap

inversionHomeomorph

Inversion z ↦ z⁻¹ as a self-homeomorphism of the Riemann sphere, swapping 0 ↔ ∞. This is the change of coordinates between the two standard charts.

def inversionHomeomorph : RiemannSphere ≃ₜ RiemannSphere where

inversionHomeomorph_apply

@[simp] lemma inversionHomeomorph_apply (p : RiemannSphere) :
    inversionHomeomorph p = invMap p

inversionHomeomorph_symm_apply

@[simp] lemma inversionHomeomorph_symm_apply (p : RiemannSphere) :
    inversionHomeomorph.symm p = invMap p

chartCoe

The affine chart ℂℙ¹ ⊇ {∞}ᶜ ≃ ℂ: the inverse of the open embedding ℂ ↪ OnePoint ℂ.

def chartCoe : OpenPartialHomeomorph RiemannSphere ℂ

chartCoe_source

@[simp] lemma chartCoe_source : chartCoe.source = {OnePoint.infty}ᶜ

chartCoe_target

@[simp] lemma chartCoe_target : chartCoe.target = Set.univ

chartCoe_apply_coe

lemma chartCoe_apply_coe (z : ℂ) : chartCoe (z : RiemannSphere) = z

chartCoe_symm_apply

@[simp] lemma chartCoe_symm_apply (z : ℂ) : chartCoe.symm z = (z : RiemannSphere)

chartInfty

The chart at : pre-compose the affine chart with the inversion z ↦ z⁻¹.

def chartInfty : OpenPartialHomeomorph RiemannSphere ℂ

chartInfty_source

@[simp] lemma chartInfty_source : chartInfty.source = {((0 : ℂ) : RiemannSphere)}ᶜ

chartInfty_apply_infty

lemma chartInfty_apply_infty : chartInfty OnePoint.infty = 0

chartInfty_apply_coe

lemma chartInfty_apply_coe {z : ℂ} (hz : z ≠ 0) :
    chartInfty (z : RiemannSphere) = z⁻¹

chartAtRS

chartAt for the Riemann sphere: the chart at for the point , the affine chart on every finite point. Defined by the OnePoint eliminator to avoid a decidability instance.

def chartAtRS (p : RiemannSphere) : OpenPartialHomeomorph RiemannSphere ℂ

chartAtRS_infty

@[simp] lemma chartAtRS_infty : chartAtRS OnePoint.infty = chartInfty

chartAtRS_coe

@[simp] lemma chartAtRS_coe (z : ℂ) : chartAtRS (z : RiemannSphere) = chartCoe

mem_chartAtRS_source

lemma mem_chartAtRS_source (p : RiemannSphere) : p ∈ (chartAtRS p).source

chartInfty_symm_apply

chartInfty.symm z = invMap (z : RiemannSphere): on the affine part it is z ↦ z⁻¹, matching the inversion.

lemma chartInfty_symm_apply (z : ℂ) :
    chartInfty.symm z = invMap (z : RiemannSphere)

homeoSphere

The Riemann sphere is homeomorphic to the unit 2-sphere S² ⊆ ℝ³ (stereographic projection).

def homeoSphere : RiemannSphere ≃ₜ Metric.sphere (0 : EuclideanSpace ℝ (Fin 3)) 1

affineCoeff

The affine coefficient f(z) of the form s: the dz-coefficient read in the affine chart chartCoe, i.e. the local representative based at the finite point 0, evaluated at the finite point z. By localRep_analyticOn_chartTarget (with chartCoe.target = univ) this is entire.

noncomputable def affineCoeff (z : ℂ) : ℂ

inftyCoeff

The coefficient at , g(w): the local representative based at , read in the -chart chartInfty. Analytic on chartInfty.target (a neighbourhood of 0), in particular continuous at 0.

noncomputable def inftyCoeff (w : ℂ) : ℂ

chartAt_coe

lemma chartAt_coe (z : ℂ) : chartAt ℂ (z : RiemannSphere) = chartCoe

chartAt_infty

lemma chartAt_infty : chartAt ℂ (OnePoint.infty : RiemannSphere) = chartInfty

affineCoeff_analyticOnNhd

affineCoeff s is entire (analytic on all of ).

lemma affineCoeff_analyticOnNhd : AnalyticOnNhd ℂ (affineCoeff s) Set.univ

affineCoeff_differentiable

lemma affineCoeff_differentiable : Differentiable ℂ (affineCoeff s)

inftyCoeff_continuousAt_zero

inftyCoeff s is analytic on chartInfty.target, hence continuous at 0 (since 0 = chartInfty ∞ ∈ chartInfty.target).

lemma inftyCoeff_continuousAt_zero : ContinuousAt (inftyCoeff s) 0

trivAt_zero_symmL_one

The affine-frame unit tangent at a finite point z is just 1 ∈ ℂ: the chart transition chartCoe ∘ chartCoe.symm is the identity, so its derivative is 1.

lemma trivAt_zero_symmL_one (z : ℂ) :
    (trivializationAt ℂ (TangentSpace 𝓘(ℂ, ℂ) (M := RiemannSphere)) ((0 : ℂ) : RiemannSphere)).symmL
        ℂ (z : RiemannSphere) (1 : ℂ) = (1 : ℂ)

trivAt_infty_symmL_one

The -frame unit tangent at a finite point z ≠ 0 is -z²: the chart transition chartCoe ∘ chartInfty.symm is w ↦ w⁻¹ near chartInfty (z:RS) = z⁻¹, with derivative -(z⁻¹)⁻² = -z². This is the dz = -w⁻² dw Jacobian of the inversion.

lemma trivAt_infty_symmL_one {z : ℂ} (hz : z ≠ 0) :
    (trivializationAt ℂ (TangentSpace 𝓘(ℂ, ℂ) (M := RiemannSphere)) (OnePoint.infty)).symmL
        ℂ (z : RiemannSphere) (1 : ℂ) = -z ^ 2

inftyCoeff_eq_transition

The transition law (dz-w⁻² dw). For a finite point z ≠ 0, the affine coefficient and the -coefficient (read at the *same* sphere point z, i.e. at chart coordinate w = z⁻¹ in the -chart) satisfy g(z⁻¹) = -z² · f(z). Equivalently f(z) = -z⁻² · g(z⁻¹).

lemma inftyCoeff_eq_transition {z : ℂ} (hz : z ≠ 0) :
    inftyCoeff s z⁻¹ = -z ^ 2 * affineCoeff s z

affineCoeff_tendsto_cobounded

O(z⁻²) decay at . The affine coefficient tends to 0 along cobounded (|z| → ∞): f(z) = -z⁻² g(z⁻¹) with g(z⁻¹) → g(0) bounded and z⁻² → 0.

lemma affineCoeff_tendsto_cobounded :
    Filter.Tendsto (affineCoeff s) (Bornology.cobounded ℂ) (𝓝 0)

affineCoeff_eq_zero

The affine coefficient vanishes identically. f is entire and tends to 0 at (Liouville: a bounded entire function tending to a limit at infinity is that constant).

lemma affineCoeff_eq_zero : affineCoeff s = 0

affineCoeff_eq_toFun_one

At a finite point z, the affine coefficient is s.toFun (z:RS) applied to the affine-frame unit 1.

lemma affineCoeff_eq_toFun_one (z : ℂ) :
    affineCoeff s z = s.toFun (z : RiemannSphere) (1 : ℂ)

section_apply_eq_zero_coe

The section vanishes at every finite point: s.toFun (z:RS) = 0. The affine-frame unit 1 spans the 1-dimensional fibre , and s.toFun (z:RS) 1 = f(z) = 0.

lemma section_apply_eq_zero_coe (z : ℂ) : s.toFun (z : RiemannSphere) = 0

trivAt_infty_symmL_one_at_infty

The -frame unit tangent at the point is 1 ∈ ℂ: the chart transition chartInfty ∘ chartInfty.symm is the identity, so its derivative is 1.

lemma trivAt_infty_symmL_one_at_infty :
    (trivializationAt ℂ (TangentSpace 𝓘(ℂ, ℂ) (M := RiemannSphere)) (OnePoint.infty)).symmL
        ℂ (OnePoint.infty : RiemannSphere) (1 : ℂ) = (1 : ℂ)

inftyCoeff_eq_zero_of_ne

inftyCoeff s vanishes on the punctured chart target: for w ≠ 0, chartInfty.symm w = (w⁻¹ : RS) is a finite point, where s.toFun is 0.

lemma inftyCoeff_eq_zero_of_ne {w : ℂ} (hw : w ≠ 0) : inftyCoeff s w = 0

inftyCoeff_zero_eq_zero

inftyCoeff s 0 = 0: continuity at 0 plus vanishing on the punctured neighbourhood.

lemma inftyCoeff_zero_eq_zero : inftyCoeff s 0 = 0

section_apply_eq_zero_infty

The section vanishes at : s.toFun ∞ = 0. The -frame unit at is 1, and s.toFun ∞ 1 = inftyCoeff s 0 = 0; then ext_ring.

lemma section_apply_eq_zero_infty : s.toFun (OnePoint.infty : RiemannSphere) = 0

holomorphicOneForm_eq_zero

Liouville vanishing. Every global holomorphic 1-form on ℂℙ¹ is zero.

See the section docstring for the proof outline (chart pull-back → entire coefficient → O(z⁻²) decay at → bounded → constant by Liouville → constant = 0).

theorem holomorphicOneForm_eq_zero (s : HolomorphicOneForms RiemannSphere) : s = 0

genus_eq_zero

The Riemann sphere ℂℙ¹ has genus 0.

theorem genus_eq_zero : genus RiemannSphere = 0