A machine-checked solution to the Jacobians challenge

26.9. ProperDegree.MultiplicityPatchingConstruct🔗

Jacobians.ProperDegree.MultiplicityPatchingConstructsource

shiftMero

The shift f − c as a meromorphic function (built directly, independent of the Sub (MeromorphicFunction X) instance).

noncomputable def shiftMero {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X]
    (f : MeromorphicFunction X) (c : ℂ) : MeromorphicFunction X

localDeg_coe_eq_orderAtPoint_sub

localDeg at a finite value as an orderAtPoint of the shift f − c.

localDeg f (coe c) y = orderAtPoint (shiftMero f c) y. Both are (meromorphicOrderAt (z ↦ f(chart_y.symm z) − c) (chart_y y)).untop₀ — the order of vanishing of f − c at y, read in the chart at y. This is *definitional* (shiftMero plugs the constant c into the subtraction).

lemma localDeg_coe_eq_orderAtPoint_sub {X : Type*} [TopologicalSpace X] [ChartedSpace ℂ X]
    (f : MeromorphicFunction X) (c : ℂ) (y : X) :
    localDeg f ((c : ℂ) : RiemannSphere) y
      = MeromorphicFunction.orderAtPoint (shiftMero f c) y

localDeg_coe_eq_chartPullback_order

Chart-invariant reading of localDeg at a finite value.

For y in the source of *any* atlas chart e, the local degree of F over coe c at y is the order of z ↦ f(e.symm z) − c at e y. This is the proven chart-invariance orderAtPoint_chart_invariant applied to the shift shiftMero f c; it is what lets the chart-at-x order sum of the planar normal form be matched, preimage by preimage, against the intrinsic localDeg.

lemma localDeg_coe_eq_chartPullback_order {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) (c : ℂ) {y : X}
    (e : OpenPartialHomeomorph X ℂ) (he : e ∈ atlas ℂ X) (hy : y ∈ e.source) :
    localDeg f ((c : ℂ) : RiemannSphere) y
      = (meromorphicOrderAt (fun z => f.toFun (e.symm z) - c) (e y)).untop₀

fibreMult_infty_eq_polesCount

Special-fibre identity at : the genuine local-degree sum over the pole fibre F⁻¹(∞) equals polesCount f.

F⁻¹(∞) = {x | order x < 0} (the poles) and localDeg f ∞ x = −order x, so the sum is ∑_{x : order x < 0} (−order x). Reindexing this finite-set sum onto the divisor support (where the extra points all have order = 0, hence are excluded by the order < 0 filter) gives polesCount f verbatim.

lemma fibreMult_infty_eq_polesCount {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) :
    fibreMult f OnePoint.infty = polesCount f

fibreMult_zero_eq_zerosCount

Special-fibre identity at coe 0: the genuine local-degree sum over the zero fibre F⁻¹(coe 0) equals zerosCount f.

localDeg f (coe 0) x = orderAtPoint f x (localDeg_zero_eq_order), and the order function vanishes off {x | order x ≠ 0}. A point of the fibre F⁻¹(coe 0) is a non-pole (it maps to coe 0 ≠ ∞, so order ≥ 0), so on the support {order ≠ 0} membership in the fibre is equivalent to being a genuine zero {0 < order} (forward: order ≥ 0 and order ≠ 0; backward: zeros_subset_toRiemannSphere_preimage_zero). The finsum therefore collapses onto the zeros, reindexing to zerosCount f.

Note this needs *no* fibre-finiteness hypothesis: the summand's support is finite (⊆ {order ≠ 0}, finite on compact X), which is all finsum needs.

lemma fibreMult_zero_eq_zerosCount {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) :
    fibreMult f ((0 : ℂ) : RiemannSphere) = zerosCount f

N_eq_fibreMult_everywhere

N f is the genuine fibre-multiplicity function everywhere.

N f differs from fibreMult f only at the two special values coe 0, , where it plugs in zerosCount f, polesCount f respectively; the special-fibre identities (fibreMult_zero_eq_zerosCount, fibreMult_infty_eq_polesCount) prove those plugs *equal* the genuine multiplicity sums there. Hence N f w = fibreMult f w for every w.

lemma N_eq_fibreMult_everywhere {X : Type*} [TopologicalSpace X] [T2Space X] [CompactSpace X]
    [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X) (w : RiemannSphere) :
    N f w = fibreMult f w

MultiplicityPatchingData.ofGeometricData

Streamlined builder for MultiplicityPatchingData. Identical to the raw structure *except* the N_eq_fibreMult field is supplied automatically by the proven global identity N f = fibreMult f. The caller provides only the geometric conservation-of-number data (sheets, weights, per-sheet conservation, finite fibres, no-escape).

def MultiplicityPatchingData.ofGeometricData {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X)
    (w₀ : RiemannSphere)
    (xs : Finset X)
    (xs_coe : (xs : Set X) = f.toRiemannSphere ⁻¹' {w₀})
    (U : X → Set X)
    (U_open : ∀ x ∈ xs, IsOpen (U x))
    (mem_U_self : ∀ x ∈ xs, x ∈ U x)
    (U_pairwiseDisjoint : ∀ x ∈ xs, ∀ x' ∈ xs, x ≠ x' → Disjoint (U x) (U x'))
    (m : X → ℤ)
    (W : Set RiemannSphere)
    (W_open : IsOpen W)
    (w₀_mem_W : w₀ ∈ W)
    (sheetMult_eq : ∀ x ∈ xs, ∀ w ∈ W,
      (∑ᶠ y ∈ U x ∩ f.toRiemannSphere ⁻¹' {w}, localDeg f w y) = m x)
    (fibre_finite : ∀ w ∈ W, (f.toRiemannSphere ⁻¹' {w}).Finite)
    (preimage_W_subset : f.toRiemannSphere ⁻¹' W ⊆ ⋃ x ∈ xs, U x) :
    MultiplicityPatchingData f w₀ where

MultiplicityPatchingData.ofDisjointSheets

No-escape skeleton for MultiplicityPatchingData.

From pairwise-disjoint open sheets U x (one per fibre point x ∈ xs, where ↑xs = F⁻¹{w₀}), each carrying an open value-neighbourhood Wsheet x ∋ w₀ on which the per-sheet multiplicity conservation holds, together with an open value-neighbourhood Wfin ∋ w₀ over which every fibre is finite, this builds a MultiplicityPatchingData f w₀.

The no-escape (preimage_W_subset) and the shrinking of the value-neighbourhood to a common W := (f '' K)ᶜ ∩ ⋂ Wsheet x ∩ Wfin are discharged via the proper-map compactness argument; the N_eq_fibreMult field is the global identity N = fibreMult. Conservation persists from Wsheet x to the smaller W by monotonicity (the sheets U x are *not* shrunk, so no preimage is lost); fibre finiteness persists from Wfin. Supplying Wfin *separately* (rather than deriving it as ⋂ Wsheet x) keeps the empty-fibre case sound (xs = ∅ makes ⋂ Wsheet x = univ, but Wfin can be a genuine finiteness neighbourhood).

def MultiplicityPatchingData.ofDisjointSheets {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X)
    (w₀ : RiemannSphere)
    (xs : Finset X)
    (xs_coe : (xs : Set X) = f.toRiemannSphere ⁻¹' {w₀})
    (U : X → Set X)
    (U_open : ∀ x ∈ xs, IsOpen (U x))
    (mem_U_self : ∀ x ∈ xs, x ∈ U x)
    (U_pairwiseDisjoint : ∀ x ∈ xs, ∀ x' ∈ xs, x ≠ x' → Disjoint (U x) (U x'))
    (m : X → ℤ)
    (Wsheet : X → Set RiemannSphere)
    (Wsheet_open : ∀ x ∈ xs, IsOpen (Wsheet x))
    (w₀_mem_Wsheet : ∀ x ∈ xs, w₀ ∈ Wsheet x)
    (sheetMult_eq : ∀ x ∈ xs, ∀ w ∈ Wsheet x,
      (∑ᶠ y ∈ U x ∩ f.toRiemannSphere ⁻¹' {w}, localDeg f w y) = m x)
    (Wfin : Set RiemannSphere) (Wfin_open : IsOpen Wfin) (w₀_mem_Wfin : w₀ ∈ Wfin)
    (fibre_finite_Wfin : ∀ w ∈ Wfin, (f.toRiemannSphere ⁻¹' {w}).Finite) :
    MultiplicityPatchingData f w₀

LocalMultiplicitySheets

The irreducible local conservation data at a value w₀ : ℂℙ¹: the geometric inputs to MultiplicityPatchingData.ofDisjointSheets. Bundles the finite fibre enumeration, the pairwise-disjoint sheets, the per-sheet weights and value-neighbourhoods, the per-sheet multiplicity conservation, and fibre finiteness over the common value-neighbourhood.

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

LocalMultiplicitySheets.toPatchingData

From the local data to the patching datum.

def LocalMultiplicitySheets.toPatchingData {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    {f : MeromorphicFunction X}
    {w₀ : RiemannSphere} (s : LocalMultiplicitySheets f w₀) :
    MultiplicityPatchingData f w₀

LocalMultiplicitySheets.ofNotMemRange

Empty-fibre witness. At w₀ ∉ range F, the empty local-sheet datum satisfies LocalMultiplicitySheets f w₀: the fibre over w₀ is empty, and on the open neighbourhood Wfin := (range F)ᶜ every fibre is empty (hence finite). Since F is proper its range is closed, so (range F)ᶜ is open and contains w₀. Hence the structure's obligations are satisfiable, not a disguised False.

def LocalMultiplicitySheets.ofNotMemRange {X : Type*} [TopologicalSpace X] [T2Space X]
    [CompactSpace X] [ConnectedSpace X] [Nonempty X] [ChartedSpace ℂ X] [IsManifold 𝓘(ℂ) ω X]
    (f : MeromorphicFunction X)
    {w₀ : RiemannSphere} (h_notmem : w₀ ∉ Set.range f.toRiemannSphere) :
    LocalMultiplicitySheets f w₀ where

exists_properMapDegree_of_localSheets

The proper-map-degree existential (a common d : ℕ with zerosCount f = d = polesCount f) from a pointwise local-conservation supply.

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