A machine-checked solution to the Jacobians challenge

26.12. ProperDegree.ProperMapDegreeSheets🔗

Jacobians.ProperDegree.ProperMapDegreeSheetssource

meromorphicAt_toFun_chartPullback

The chart pullback f.toFun ∘ (chartAt x).symm is meromorphic at any target point z. At y₀ := (chartAt x).symm z the function is meromorphic at the centre of its own chart (f.meromorphic y₀); the chart transition (chartAt y₀) ∘ (chartAt x).symm is analytic at z (maximal-atlas coordinate change, ω), and MeromorphicAt.comp_analyticAt transports the order across the (locally invertible) transition.

theorem meromorphicAt_toFun_chartPullback {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X]
    [IsManifold 𝓘(ℂ) ω X] (f : MeromorphicFunction X) (x : X)
    {z : ℂ} (hz : z ∈ (chartAt (H := ℂ) x).target) :
    MeromorphicAt (f.toFun ∘ (chartAt (H := ℂ) x).symm) z

analyticAt_holoRepr_chartPullback_target

The chart pullback holoRepr ∘ (chartAt x).symm is analytic at a target point of a non-pole. The analytic analogue of meromorphicAt_toFun_chartPullback: at y₀ := (chartAt x).symm z, where f has nonnegative order, holoRepr ∘ (chartAt y₀).symm is analytic at its own chart centre (analyticAt_holoRepr_chartPullback_of_orderNonneg); the chart transition (chartAt y₀) ∘ (chartAt x).symm is analytic at z (maximal-atlas coordinate change, ω), so AnalyticAt.comp transports the analyticity across. This supplies the AnalyticAt ℂ G z hypothesis the reciprocal keystone meromorphicOrderAt_inv_sub_eq consumes at each fibre point.

theorem analyticAt_holoRepr_chartPullback_target {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) (x : X)
    {z : ℂ} (hz : z ∈ (chartAt (H := ℂ) x).target)
    (hnp : 0 ≤ f.orderAtPoint ((chartAt (H := ℂ) x).symm z)) :
    AnalyticAt ℂ (fun w => f.holoRepr ((chartAt (H := ℂ) x).symm w)) z

holoRepr_pullback_eventuallyEq_toFun

Off-center, holoRepr ∘ (chartAt x).symm agrees with f.toFun ∘ (chartAt x).symm. At any target point z, the raw pullback is analytic on the *punctured* neighbourhood (it is meromorphic there, meromorphicAt_toFun_chartPullback), so f.toFun carries no junk and its punctured limit holoRepr equals the analytic value. This generalises holoRepr_chartPullback_eventuallyEq_NFAt from the chart centre to any target point.

theorem holoRepr_pullback_eventuallyEq_toFun {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X]
    [IsManifold 𝓘(ℂ) ω X] (f : MeromorphicFunction X) (x : X)
    {z : ℂ} (hz : z ∈ (chartAt (H := ℂ) x).target) :
    f.holoRepr ∘ (chartAt (H := ℂ) x).symm =ᶠ[𝓝[≠] z]
      f.toFun ∘ (chartAt (H := ℂ) x).symm

meromorphicOrderAt_holoRepr_sub_eq

The chart-pullback order of localDeg can be read with holoRepr instead of f.toFun. Since holoRepr ∘ chart.symm and f.toFun ∘ chart.symm agree on 𝓝[≠] z (holoRepr_pullback_eventuallyEq_toFun) and meromorphicOrderAt is 𝓝[≠]-determined.

theorem meromorphicOrderAt_holoRepr_sub_eq {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X]
    [IsManifold 𝓘(ℂ) ω X] (f : MeromorphicFunction X) (x : X) (c : ℂ)
    {z : ℂ} (hz : z ∈ (chartAt (H := ℂ) x).target) :
    meromorphicOrderAt (fun w => f.holoRepr ((chartAt (H := ℂ) x).symm w) - c) z =
      meromorphicOrderAt (fun w => f.toFun ((chartAt (H := ℂ) x).symm w) - c) z

toRiemannSphere_not_isConstant_of_div_ne_zero

Non-constancy bridge. A meromorphic f with nontrivial divisor (f.div ≠ 0) has toRiemannSphere non-constant: f.div ≠ 0 means some point has nonzero order, and a function with a nonzero order somewhere is non-constant on the sphere (toRiemannSphere_not_isConstant, the compact-Liouville corollary).

theorem toRiemannSphere_not_isConstant_of_div_ne_zero {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X)
    (hnc : (f.div : Divisor X) ≠ 0) :
    ¬ Jacobians.Discharge.IsConstantMap f.toRiemannSphere

fibre_finite_of_div_ne_zero

All fibres of F = toRiemannSphere are finite for a non-constant f (f.div ≠ 0). Direct from the unconditional finite-fibres theorem (fibres_finite) applied to the ContMDiff sphere map (contMDiff_toRiemannSphere), using the non-constancy bridge.

theorem fibre_finite_of_div_ne_zero {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X)
    (hnc : (f.div : Divisor X) ≠ 0) (w : RiemannSphere) :
    (f.toRiemannSphere ⁻¹' {w}).Finite

orderSum_eq_of_analyticOrder_radiusBounded

Radius-bounded planar conservation of number. Identical to Planar.orderSum_eq_of_analyticOrder but with the counting radius ε bounded by a prescribed R_ext > 0 — the freedom we need to fit each sheet inside a pre-chosen disjoint neighbourhood.

theorem orderSum_eq_of_analyticOrder_radiusBounded
    {g : ℂ → ℂ} {x₀ w₀ : ℂ} {m : ℕ} {R_ext : ℝ} (hR_ext : 0 < R_ext)
    (hm : 1 ≤ m)
    (hg : AnalyticAt ℂ g x₀) (h_w₀ : g x₀ = w₀)
    (hord : analyticOrderAt (fun z => g z - w₀) x₀ = (m : ℕ∞)) :
    ∃ ε > (0 : ℝ), ε ≤ R_ext ∧ ∃ δ > (0 : ℝ),
      ∀ w ∈ ball w₀ δ, w ≠ w₀ →
        (∑ᶠ z ∈ {z ∈ ball x₀ ε | g z = w}, (meromorphicOrderAt (fun ζ => g ζ - w) z).untop₀)
          = (m : ℤ)

SheetDatum

Per-sheet local-conservation output at a fibre point, parametrised by the ambient value w₀ and a containing open set V (a disjoint-separating neighbourhood). Bundles the open sheet U ⊆ V containing x, an open value-neighbourhood W ∋ w₀, the integer weight m, and the per-sheet multiplicity conservation ∑_{y ∈ U ∩ F⁻¹(w)} localDeg = m for w ∈ W.

structure SheetDatum {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X] (f : MeromorphicFunction X)
    (w₀ : RiemannSphere) (x : X) (V : Set X) where

exists_sheetDatum_coe

The per-point construction at a finite value coe c. At a fibre point x of F⁻¹(coe c) (so holoRepr x = c, x a non-pole), with a clean separating neighbourhood V (open, containing x, inside the chart source and the non-pole locus), the radius-bounded planar normal form applied to g = holoRepr ∘ chart.symm produces a sheet U ⊆ V and a value-disc W = coe '' ball c δ on which the per-sheet multiplicity sum is the local order m = localDeg f (coe c) x. The generic rows (w = coe c', c' ≠ c) come from the engine; the central row (w = coe c) holds because the c-fibre in U is the single isolated point x.

theorem exists_sheetDatum_coe {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) (hnc : (f.div : Divisor X) ≠ 0)
    (c : ℂ) {x : X} (hx_fib : f.toRiemannSphere x = ((c : ℂ) : RiemannSphere))
    {V : Set X} (hV_open : IsOpen V) (hxV : x ∈ V)
    (hV_np : V ⊆ {y | 0 ≤ f.orderAtPoint y}) :
    Nonempty (SheetDatum f ((c : ℂ) : RiemannSphere) x V)

meromorphicOrderAt_inv_sub_eq

The reciprocal order-matching identity (the keystone for the case). At a point z where G is analytic with finite nonzero value G z = c', the order of 1/G − 1/c' equals the order of G − c': writing 1/G − 1/c' = −(c'·G)⁻¹ · (G − c') with −(c'·G)⁻¹ analytic and nonzero at z (meromorphicOrderAt_mul_of_ne_zero). This is what lets the planar engine applied to the reciprocal 1/G (a zero of order = the pole order at the pole) re-deliver the finite-value local degrees localDeg f (coe c') in the pole fibre's -neighbourhood.

theorem meromorphicOrderAt_inv_sub_eq (G : ℂ → ℂ) {z c' : ℂ} (hc' : c' ≠ 0) (hGz : G z = c')
    (hGanal : AnalyticAt ℂ G z) :
    meromorphicOrderAt (fun ζ => (G ζ)⁻¹ - c'⁻¹) z = meromorphicOrderAt (fun ζ => G ζ - c') z

meromorphicOrderAt_chartPullback_eq_orderAtPoint

The chart-pullback order of f.toFun at the chart centre equals orderAtPoint (as a WithTop ℤ, *finite*). At a pole (orderAtPoint x < 0) the order is not (else orderAtPoint would be the junk 0), so meromorphicOrderAt (f.toFun ∘ e.symm) (e x) = (orderAtPoint x : ℤ). This pins the negative order −m of the pullback G, whose reciprocal 1/G then has the positive order m that drives the reciprocal normal form.

theorem meromorphicOrderAt_chartPullback_eq_orderAtPoint {X : Type*} [TopologicalSpace X]
    [ChartedSpace ℂ X] (f : MeromorphicFunction X) {x : X}
    (hx_pole : f.orderAtPoint x < 0) :
    meromorphicOrderAt (fun z => f.toFun ((chartAt (H := ℂ) x).symm z)) ((chartAt (H := ℂ) x) x)
      = (f.orderAtPoint x : WithTop ℤ)

exists_reciprocal_NF

The repaired reciprocal at a pole. At a pole x (orderAtPoint x < 0), with g = f.holoRepr ∘ (chartAt x).symm the *junk-free* chart pullback (meromorphic, order −m; equal to f.toFun ∘ (chartAt x).symm off the centre, so it cuts the geometric value fibre F⁻¹(coe ·)), the normal-form representative h := toMeromorphicNFAt g⁻¹ (e x) of the reciprocal 1/g is analytic at e x, agrees with (g ·)⁻¹ on the punctured neighbourhood 𝓝[≠] (e x), vanishes at e x (h (e x) = 0), and has analytic order exactly m = (orderAtPoint x).natAbs ≥ 1 (meromorphicOrderAt g⁻¹ = −meromorphicOrderAt g = m, transported through the normal form, with AnalyticAt.meromorphicOrderAt_eq converting the meromorphic order to the analytic order). This is the analytic input the planar engine consumes at w₀ = 0.

theorem exists_reciprocal_NF {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X]
    [IsManifold 𝓘(ℂ) ω X] (f : MeromorphicFunction X) {x : X} (hx_pole : f.orderAtPoint x < 0) :
    ∃ (h : ℂ → ℂ) (m : ℕ), 1 ≤ m ∧ (m : ℤ) = -f.orderAtPoint x ∧
      AnalyticAt ℂ h ((chartAt (H := ℂ) x) x) ∧
      ((fun z => (f.holoRepr ((chartAt (H := ℂ) x).symm z))⁻¹)
        =ᶠ[𝓝[≠] ((chartAt (H := ℂ) x) x)] h) ∧
      h ((chartAt (H := ℂ) x) x) = 0 ∧
      analyticOrderAt h ((chartAt (H := ℂ) x) x) = (m : ℕ∞)

exists_sheetDatum_infty

The per-point construction at (the pole fibre). At a pole x (orderAtPoint x < 0, so F x = ∞), with a clean separating neighbourhood V, the same conservation-of-number content holds via the reciprocal normal form 1/g (a zero of order = the pole order at e x): a sheet U ⊆ V and an -neighbourhood W on which the per-sheet multiplicity sum is the pole order m = localDeg f ∞ x = −orderAtPoint x.

theorem exists_sheetDatum_infty {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) (_hnc : (f.div : Divisor X) ≠ 0)
    {x : X} (hx_pole : f.orderAtPoint x < 0)
    {V : Set X} (hV_open : IsOpen V) (hxV : x ∈ V)
    (_hV_src : V ⊆ (chartAt (H := ℂ) x).source) :
    Nonempty (SheetDatum f OnePoint.infty x V)

ofSheetData

Assembling LocalMultiplicitySheets from the per-sheet data. Given the finite fibre xs, pairwise-disjoint separating neighbourhoods V0 ⊇ V, and a per-point SheetDatum at each fibre point (in its sheet V x), this packages the full local conservation structure. The total per-point fields are read off as ⋃ (h : x ∈ xs), (D x h).U (= the datum on the fibre, off it), and disjointness descends from U ⊆ V ⊆ V0 with V0 pairwise disjoint.

def ofSheetData {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X] (f : MeromorphicFunction X)
    (w₀ : RiemannSphere) (xs : Finset X)
    (hxs_coe : (xs : Set X) = f.toRiemannSphere ⁻¹' {w₀})
    (V0 : X → Set X) (hV0disj : (f.toRiemannSphere ⁻¹' {w₀}).PairwiseDisjoint V0)
    (V : X → Set X) (hV_sub : ∀ x, V x ⊆ V0 x)
    (hfin : ∀ w : RiemannSphere, (f.toRiemannSphere ⁻¹' {w}).Finite)
    (hdatum : ∀ x ∈ xs, Nonempty (SheetDatum f w₀ x (V x))) :
    LocalMultiplicitySheets f w₀

localMultiplicitySheets_of_mem_range

The local conservation data at a value in the range (w₀ ∈ range F), for a *non-constant* f (f.div ≠ 0, ensuring finite fibres): the genuine §17.9 content, built per fibre point from the planar normal form. The finite fibre is enumerated by xs; pairwise-disjoint clean sheets are chosen by T2 separation (Set.Finite.t2_separation) intersected with the chart source and the non-pole locus, then the per-point datum (exists_sheetDatum_coe at a finite value, exists_sheetDatum_infty at ) supplies each sheet's conservation.

def localMultiplicitySheets_of_mem_range {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) (hnc : (f.div : Divisor X) ≠ 0)
    {w₀ : RiemannSphere} (hmem : w₀ ∈ Set.range f.toRiemannSphere) :
    LocalMultiplicitySheets f w₀

localMultiplicitySheets_of_nonconstant

Pointwise local-conservation supply for non-constant f. For every value w₀ : ℂℙ¹ there is a LocalMultiplicitySheets f w₀: the empty-fibre witness off the range, and the §17.9 construction on it. (Needs f.div ≠ 0: for a constant f the fibre over the constant value is all of X, which is infinite, so no finite xs enumerates it — that case is handled separately by exists_properMapDegree_of_div_eq_zero.)

def localMultiplicitySheets_of_nonconstant {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X)
    (hnc : (f.div : Divisor X) ≠ 0) (w₀ : RiemannSphere) :
    LocalMultiplicitySheets f w₀

exists_properMapDegree_proven

The proper-map-degree existential — ∃ d : ℕ with zerosCount f = d = polesCount f. For the trivial divisor (f.div = 0, the constant/germ-zero case) both counts vanish; otherwise it follows from the pointwise local-conservation supply via the connectedness globalization.

theorem exists_properMapDegree_proven {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) :
    ∃ d : ℕ, zerosCount f = (d : ℤ) ∧ polesCount f = (d : ℤ)