A machine-checked solution to the Jacobians challenge

11.5. Meromorphic.LinearSystem🔗

Jacobians.Meromorphic.LinearSystemsource

ext

Two meromorphic functions are equal iff their underlying maps agree (the meromorphy field is a Prop, hence proof-irrelevant).

@[ext] theorem ext {f g : MeromorphicFunction X} (h : f.toFun = g.toFun) : f = g

toFun_injective

theorem toFun_injective :
    Function.Injective (MeromorphicFunction.toFun : MeromorphicFunction X → (X → ℂ))

IsMeromorphic.add

theorem IsMeromorphic.add {f g : X → ℂ} (hf : IsMeromorphic X f) (hg : IsMeromorphic X g) :
    IsMeromorphic X (f + g)

IsMeromorphic.neg

theorem IsMeromorphic.neg {f : X → ℂ} (hf : IsMeromorphic X f) :
    IsMeromorphic X (-f)

IsMeromorphic.sub

theorem IsMeromorphic.sub {f g : X → ℂ} (hf : IsMeromorphic X f) (hg : IsMeromorphic X g) :
    IsMeromorphic X (f - g)

IsMeromorphic.const_smul

theorem IsMeromorphic.const_smul (c : ℂ) {f : X → ℂ} (hf : IsMeromorphic X f) :
    IsMeromorphic X (c • f)

IsMeromorphic.nsmul

theorem IsMeromorphic.nsmul (n : ℕ) {f : X → ℂ} (hf : IsMeromorphic X f) :
    IsMeromorphic X (n • f)

IsMeromorphic.zsmul

theorem IsMeromorphic.zsmul (n : ℤ) {f : X → ℂ} (hf : IsMeromorphic X f) :
    IsMeromorphic X (n • f)

add_toFun

@[simp] theorem add_toFun (f g : MeromorphicFunction X) :
    (f + g).toFun = f.toFun + g.toFun

sub_toFun

@[simp] theorem sub_toFun (f g : MeromorphicFunction X) :
    (f - g).toFun = f.toFun - g.toFun

smul_toFun

@[simp] theorem smul_toFun (c : ℂ) (f : MeromorphicFunction X) :
    (c • f).toFun = c • f.toFun

toFunHom

The underlying-map homomorphism, used to transport the Module structure.

def toFunHom : MeromorphicFunction X →+ (X → ℂ) where

orderW

The order of f at x as WithTop ℤ — the meromorphic order *before* the untop₀ that defines orderAtPoint. It is exactly when f vanishes in a punctured neighbourhood of x; phrasing L(D) on this order makes the zero function a member of every L(D) automatically.

noncomputable def orderW (f : MeromorphicFunction X) (x : X) : WithTop ℤ

orderW_zero

theorem orderW_zero (x : X) : (0 : MeromorphicFunction X).orderW x = ⊤

eventually_comp_chart_iff

The chart is a local homeomorphism near y, so an eventually-property of g on the punctured neighbourhood 𝓝[≠] y transfers to the chart-pulled-back function on 𝓝[≠] (chart y).

theorem eventually_comp_chart_iff (g : X → ℂ) (y : X) (P : ℂ → Prop) :
    (∀ᶠ w in 𝓝[≠] ((chartAt (H := ℂ) y) y), P ((g ∘ (chartAt (H := ℂ) y).symm) w))
      ↔ ∀ᶠ z in 𝓝[≠] y, P (g z)

orderW_eq_top_iff

orderW f y = ⊤ (the germ vanishes) iff f.toFun vanishes throughout a punctured neighbourhood of y (intrinsic — the chart drops out).

theorem orderW_eq_top_iff (f : MeromorphicFunction X) (y : X) :
    f.orderW y = ⊤ ↔ ∀ᶠ z in 𝓝[≠] y, f.toFun z = 0

orderW_ne_top_iff

orderW f y ≠ ⊤ (the germ is nonzero) iff f.toFun is eventually nonzero on a punctured neighbourhood of y.

theorem orderW_ne_top_iff (f : MeromorphicFunction X) (y : X) :
    f.orderW y ≠ ⊤ ↔ ∀ᶠ z in 𝓝[≠] y, f.toFun z ≠ 0

orderW_ne_top_of_exists

Faithfulness / identity theorem. If the germ of f is nonzero at even one point, it is nonzero (orderW ≠ ⊤) at *every* point. The set {y | orderW f y = ⊤} and its complement are both open (via the two intrinsic characterizations above), so on the connected X it is empty.

theorem orderW_ne_top_of_exists [T2Space X] [ConnectedSpace X] (f : MeromorphicFunction X)
    (h₀ : ∃ x₀, f.orderW x₀ ≠ ⊤) (x : X) : f.orderW x ≠ ⊤

linearSystem

The complete linear system L(D) = meromorphic functions with div f ≥ −D, phrased on the WithTop ℤ order (so the zero function, order , is automatically a member). A Submodule ℂ.

noncomputable def linearSystem (D : Divisor X) : Submodule ℂ (MeromorphicFunction X) where

germZeroSubmodule

Germ-zero "junk" functions. MeromorphicFunction.toFun carries removable-singularity junk (cf. the toSphere note): e.g. the indicator of a single point is a *nonzero* meromorphic function whose germ is 0 everywhere (orderW ≡ ⊤). Such functions lie in *every* L(D), and point-indicators are linearly independent, so the naive finrank ℂ (L(D)) is wrong (the space is infinite-dimensional, forcing finrank = 0 for all D, which makes RR false). We quotient them out so l(D) is the genuine, finite dimension.

noncomputable def germZeroSubmodule : Submodule ℂ (MeromorphicFunction X) where

lDim

l(D) = dim_ℂ (L(D) ⧸ germ-zero junk) (Forster's h⁰(X, O_D)) — the genuine dimension of the linear system, with the toFun-junk quotiented out.

noncomputable def lDim (D : Divisor X) : ℕ

germ_eq_const_of_mem_linearSystem_zero

A function in L(0) is germ-constant (Liouville). With no pole (orderW ≥ 0), the limit-repair holoRepr is holomorphic (mdifferentiable_holoRepr), hence constant on the compact connected X (exists_eq_const_of_compactSpace); off-center the chart pullback equals that constant, so f.toFun agrees with it on every punctured neighbourhood (MeromorphicLiouville).

theorem germ_eq_const_of_mem_linearSystem_zero [T2Space X] [CompactSpace X] [ConnectedSpace X]
    [IsManifold 𝓘(ℂ) ω X] (f : MeromorphicFunction X)
    (hf : f ∈ linearSystem (X := X) 0) : ∃ c : ℂ, ∀ x, ∀ᶠ z in 𝓝[≠] x, f.toFun z = c

lDim_zero_eq_one

l(0) = 1: L(0)/germZero ≅ ℂ (the constants). Spanned by the class of the constant 1 (nonzero, since its order is 0 ≠ ⊤), and every member is germ-constant by Liouville, hence a scalar multiple of it.

theorem lDim_zero_eq_one [T2Space X] [CompactSpace X] [ConnectedSpace X] [IsManifold 𝓘(ℂ) ω X] :
    lDim (X := X) 0 = 1