Lean sources / SurfaceBlowup / Blowup / CechStability.lean

Stability of the finite Čech coefficients

312 lines · 4 public declarations · raw file · declaration index

1/-2Copyright (c) 2026 Asvin G, Claude (Anthropic), GPT-6-Astra (OpenAI). All rights reserved.3Released under Apache 2.0 license as described in the file LICENSE.4Authors: Asvin G, Claude (Anthropic), GPT-6-Astra (OpenAI)5-/6import SurfaceBlowup.Blowup.TwoChartCurveData7 8/-!9# Stability of the finite Čech coefficients10 11For a regular parameter pair `(t, x)` of `R`, the finite Čech complexes of the two-chart cover12of the blow-up compute, level by level, the cokernel of the twisted Čech differential. This file13shows that the reduction maps between consecutive cokernels are bijective once the level exceeds14the twist `d`, computes the length of the level-`n` cokernel as `∑_{j < n} (d - j - 1)`, and hence15identifies it with `chooseTwo d` in the stable range. As an application, threads of the curve16order limit that are approximable at one stable level lie in the image of the surface.17 18## Main results19 20* `SurfaceBlowup.actual_twisted_coker_reduction_bijective`: for `d ≤ j + 1` the reduction map21  between the cokernels at levels `j + 1` and `j` is bijective.22* `SurfaceBlowup.actual_finite_cech_coefficient_length`: the length of the level-`n` cokernel.23* `SurfaceBlowup.actual_finite_cech_coefficient_triangular`: in the stable range `d - 1 ≤ n`24  this length is `chooseTwo d`.25* `SurfaceBlowup.curve_limit_range_of_stable_level`: a thread approximable by a surface function at26  a stable level is in the range of any section of the surface-to-curve map.27 28Provenance: `Thm_SurfaceBlowupV2_{actual_twisted_coker_reduction_bijective,29actual_finite_cech_coefficient_length, actual_finite_cech_coefficient_triangular,30curve_limit_range_of_stable_level}`.31-/32 33namespace SurfaceBlowup34 35/-! ### The cokernel tower -/36 37/-- In the stable range `d ≤ j + 1`, the map induced by reduction between the cokernels of the38twisted finite Čech differentials at levels `j + 1` and `j` is a bijection. -/39theorem actual_twisted_coker_reduction_bijective (R : Type) [CommRing R] (t x : R)Lemma 4.1Appendix A40    (hreg : RegularParameterPair R t x) (beta : BlowupRestriction R t x) (d j : ℕ) (hd : d ≤ j + 1)41    (hnext : cechInputLattice R t x (j + 1) ≤42      (cechOutputLattice R t x (j + 1)).comap (fullCechDifferential R t x beta d))43    (hnow : cechInputLattice R t x j ≤44      (cechOutputLattice R t x j).comap (fullCechDifferential R t x beta d))45    (hcomm : (cechOutputReduction R t x j).comp46        (finiteCechDifferential R t x beta d (j + 1) hnext) =47      (finiteCechDifferential R t x beta d j hnow).comp (cechInputReduction R t x j)) :48    Function.Bijective (twoTermCokerMap (finiteCechDifferential R t x beta d (j+1) hnext)49      (finiteCechDifferential R t x beta d j hnow) (cechInputReduction R t x j)50      (cechOutputReduction R t x j) hcomm) := by51  refine ⟨?_, two_term_coker_map_surjective R _ _ _ _ _ _ _ _ hcomm52    (actual_cech_reductions_surjective R t x j).2⟩53  rw [← LinearMap.ker_eq_bot, Submodule.eq_bot_iff]54  intro q hq55  obtain ⟨wbar, rfl⟩ := Submodule.Quotient.mk_surjective _ q56  obtain ⟨w, rfl⟩ := Submodule.Quotient.mk_surjective _ wbar57  obtain ⟨abar, ha⟩ := (Submodule.Quotient.mk_eq_zero _).1 hq58  obtain ⟨a, rfl⟩ := Submodule.Quotient.mk_surjective _ abar59  replace ha := (Submodule.Quotient.eq _).1 ha60  have hbase : ∀ r : R, (beta.right : BlowupChart R x t →+* BlowupOverlap R t x) (chartBase R x t r)61      = (algebraMap (BlowupChart R t x) (BlowupOverlap R t x)) (chartBase R t x r) := fun r =>62    (beta.right.commutes r).trans (IsScalarTower.algebraMap_apply R _ _ r)63  obtain ⟨a', b', -, -, hc⟩ := two_chart_layer_correction R t x hreg64    (beta.right : BlowupChart R x t →+* BlowupOverlap R t x) hbase beta.slope j d hd65    (w - fullCechDifferential R t x beta d a) (by simpa [cechOutputLattice] using neg_mem ha)66  refine (Submodule.Quotient.mk_eq_zero _).267    ⟨Submodule.Quotient.mk (a + (a', b')), (Submodule.Quotient.eq _).2 ?_⟩68  have : fullCechDifferential R t x beta d (a + (a', b')) - w =69      -(w - fullCechDifferential R t x beta d a - ((algebraMap (BlowupChart R t x)70        (BlowupOverlap R t x)) a' - (IsLocalization.Away.invSelf (chartSlope R t x))^d *71          beta.right b')) := by72    rw [map_add]73    change _ + ((IsScalarTower.toAlgHom R (BlowupChart R t x) (BlowupOverlap R t x)) a' - _ *74      beta.right b') - w = _75    simp only [IsScalarTower.coe_toAlgHom']76    ring77  rw [this]78  exact neg_mem hc79 80/-- The length of the cokernel of the twisted finite Čech differential at level `n` is81`∑_{j < n} (d - j - 1)`. -/82theorem actual_finite_cech_coefficient_length (O R : Type) [CommRing O] [CommRing R] [Algebra O R]Lemma 4.283    (t x : R) (hreg : RegularParameterPair R t x) (beta : BlowupRestriction R t x)84    (hregSwap : RegularParameterPair R x t) [(Ideal.span ({t,x} : Set R)).IsMaximal]85    (hres : Function.Surjective (algebraMap O (R ⧸ Ideal.span {t,x}))) (d n : ℕ)86    (hpres : ∀ j : ℕ, cechInputLattice R t x j ≤87      (cechOutputLattice R t x j).comap (fullCechDifferential R t x beta d)) :88    Module.length O89      (CechLevelOutput R t x n ⧸ LinearMap.range (finiteCechDifferential R t x beta d n (hpres n)))90      = ((∑ j ∈ Finset.range n, (d-j-1) : ℕ) : ℕ∞) := by91  induction n with92  | zero =>93    simp only [Finset.range_zero, Finset.sum_empty, Nat.cast_zero]94    apply Module.length_eq_zero_iff.mpr95    have : Subsingleton (CechLevelOutput R t x 0) := by96      constructor97      intro a b98      induction a using Submodule.Quotient.induction_on99      induction b using Submodule.Quotient.induction_on100      rw [Submodule.Quotient.eq]101      simp [cechOutputLattice]102    infer_instance103  | succ j ih =>104    have hcomm := actual_cech_differentials_commute_with_reduction R t x beta d j (hpres (j+1))105      (hpres j)106    have hsurj := two_term_coker_map_surjective R _ _ _ _ _ _ _ _ hcomm107      (actual_cech_reductions_surjective R t x j).2108    rw [Finset.sum_range_succ, Nat.cast_add, ← ih]109    by_cases hj : j < d110    · obtain ⟨i, hi, hex⟩ := actual_negative_layer_coker_exact R t x hreg beta hregSwap d j hj111        (hpres (j+1)) (hpres j) hcomm112      rw [Module.length_eq_add_of_exact (i.restrictScalars O)113        ((twoTermCokerMap _ _ _ _ hcomm).restrictScalars O) hi hsurj hex, add_comm]114      congr 1115      rw [Module.length_eq_of_surjective hres]116      let _ := Ideal.Quotient.field (Ideal.span ({t,x} : Set R))117      exact (Module.length_eq_finrank _ _).trans (by simp)118    · have hbij := actual_twisted_coker_reduction_bijective R t x hreg beta d j (by omega)119        (hpres (j+1)) (hpres j) hcomm120      rw [(LinearEquiv.ofBijective ((twoTermCokerMap _ _ _ _ hcomm).restrictScalars O)121        hbij).length_eq]122      simp [show d - j - 1 = 0 by omega]123 124private theorem sum_range_sub_sub_one_eq_chooseTwo (d n : ℕ) (hn : d - 1 ≤ n) :125    (∑ j ∈ Finset.range n, (d-j-1) : ℕ) = chooseTwo d := by126  have h1 : ∀ m, (∑ j ∈ Finset.range (d-1+m), (d-j-1) : ℕ)127      = ∑ j ∈ Finset.range (d-1), (d-j-1) := by128    intro m129    induction m with130    | zero => rfl131    | succ m ih =>132      rw [← add_assoc, Finset.sum_range_succ, ih]133      omega134  obtain ⟨m, rfl⟩ := Nat.exists_eq_add_of_le hn135  rw [h1]136  have h2 : (∑ j ∈ Finset.range (d-1), (d-j-1) : ℕ) = ∑ j ∈ Finset.range d, (d-1-j) := by137    rcases d with _ | d138    · rfl139    · rw [Finset.sum_range_succ]140      simp only [Nat.add_sub_cancel]141      rw [show d - d = 0 by omega, add_zero]142      exact Finset.sum_congr rfl fun j _ => by omega143  rw [h2, Finset.sum_range_reflect (fun j => j) d, Finset.sum_range_id]144  rfl145 146/-- In the stable range `d - 1 ≤ n`, the cokernel of the twisted finite Čech differential at147level `n` has length `chooseTwo d`. -/148theorem actual_finite_cech_coefficient_triangular (O R : Type) [CommRing O] [CommRing R]Lemma 4.2149    [Algebra O R] (t x : R) (hreg : RegularParameterPair R t x) (beta : BlowupRestriction R t x)150    (hregSwap : RegularParameterPair R x t) [(Ideal.span ({t,x} : Set R)).IsMaximal]151    (hres : Function.Surjective (algebraMap O (R ⧸ Ideal.span {t,x}))) (d n : ℕ) (hn : d - 1 ≤ n)152    (hpres : ∀ j : ℕ, cechInputLattice R t x j ≤153      (cechOutputLattice R t x j).comap (fullCechDifferential R t x beta d)) :154    Module.length O155      (CechLevelOutput R t x n ⧸ LinearMap.range (finiteCechDifferential R t x beta d n (hpres n)))156      = (chooseTwo d : ℕ∞) := by157  rw [actual_finite_cech_coefficient_length O R t x hreg beta hregSwap hres d n hpres,158    sum_range_sub_sub_one_eq_chooseTwo d n hn]159 160/-! ### Threads of the curve order limit -/161 162section Threads163 164variable {R : Type} [CommRing R] {t x : R} {beta : BlowupRestriction R t x} {d : ℕ}165  (G : GluedGenerators R t x beta d)166 167private theorem curveIdealLattice_le_of_le {j k : ℕ} (hjk : j ≤ k) :168    curveIdealLattice R t x beta G k ≤ curveIdealLattice R t x beta G j := by169  induction k, hjk using Nat.le_induction with170  | base => exact le_rfl171  | succ k _ ih => exact le_trans (curve_lattices_antitone R t x beta d G k).1 ih172 173private theorem thread_sub_succ_mem (p : curveThreads R t x beta G) (j : ℕ) :174    p.val j - p.val (j+1) ∈ curveIdealLattice R t x beta G j := by175  have h := (Submodule.mem_inf.mp p.2).2176  rw [Submodule.mem_comap, Submodule.mem_pi] at h177  exact h j (Set.mem_univ _)178 179private theorem thread_mem_curveSections (p : curveThreads R t x beta G) (j : ℕ) :180    p.val j ∈ curveSections R t x beta G j :=181  Submodule.mem_pi.mp (Submodule.mem_inf.mp p.2).1 j (Set.mem_univ _)182 183private theorem thread_sub_mem (p : curveThreads R t x beta G) {j k : ℕ} (hjk : j ≤ k) :184    p.val j - p.val k ∈ curveIdealLattice R t x beta G j := by185  induction k, hjk using Nat.le_induction with186  | base => simp187  | succ k hk ih =>188    simpa only [sub_add_sub_cancel] using189      add_mem ih (curveIdealLattice_le_of_le G hk (thread_sub_succ_mem G p k))190 191end Threads192 193/-- A curve thread that is approximable by surface functions modulo the curve lattice at one194stable level `J ≥ d - 1` is approximable at every level: going up uses the bijectivity of the195cokernel reduction maps, going down the antitonicity of the curve lattices. -/196private theorem exists_surface_approx_of_stable_level {R : Type} [CommRing R] {t x : R}197    {beta : BlowupRestriction R t x} {d : ℕ} (G : GluedGenerators R t x beta d)198    (hreg : RegularParameterPair R t x) (hregSwap : RegularParameterPair R x t)199    (hregF : ∀ j : ℕ, Function.Injective (fun c : BlowupOverlap R t x ⧸200      (Ideal.span {overlapException R t x})^j =>201      Ideal.Quotient.mk ((Ideal.span {overlapException R t x})^j)202      ((algebraMap (BlowupChart R t x) (BlowupOverlap R t x)) (G.left j)) * c))203    {J : ℕ} (hJ : d - 1 ≤ J) (p : curveThreads R t x beta G)204    (hp : ∃ r : R, p.val J - surfaceToChartPair R t x r ∈ curveIdealLattice R t x beta G J)205    (j : ℕ) : ∃ r : R, p.val j - surfaceToChartPair R t x r ∈ curveIdealLattice R t x beta G j := by206  -- Step 1: `p` is approximable by surface functions at every level `≥ J`.207  have step1 : ∀ n : ℕ, ∃ r : R, p.val (J+n) - surfaceToChartPair R t x r ∈208      curveIdealLattice R t x beta G (J+n) := by209    intro n210    induction n with211    | zero => simpa using hp212    | succ n ih =>213      obtain ⟨r0, hr0⟩ := ih214      rw [← add_assoc]215      generalize hj : J + n = j at hr0 ⊢216      have hsec := thread_mem_curveSections G p (j+1)217      obtain ⟨_, hyy, zz, hzz, hyz⟩ := Submodule.mem_sup.mp hsec218      obtain ⟨a, rfl⟩ := Ideal.mem_span_singleton'.mp hyy219      have hc : fullCechDifferential R t x beta 0 (p.val (j+1)) -220          (algebraMap (BlowupChart R t x) (BlowupOverlap R t x)) (G.left (j+1)) * a ∈221          (Ideal.span {overlapException R t x})^(j+1) := by222        rw [← hyz, mul_comm a, add_sub_cancel_left]; exact hzz223      have hnow := actual_cech_preserves_exceptional_lattices R t x beta d j224      have hnext := actual_cech_preserves_exceptional_lattices R t x beta d (j+1)225      have hbij := actual_twisted_coker_reduction_bijective R t x hreg beta d j (by omega) hnext226        hnow (actual_cech_differentials_commute_with_reduction R t x beta d j hnext hnow)227      refine (curve_section_connecting_class_zero_iff R t x beta d G hreg hregSwap (j+1) hnext228        (hregF (j+1)) (p.val (j+1)) hsec a hc).mp (hbij.1 ?_)229      rw [map_zero]230      have hcj : fullCechDifferential R t x beta 0 (p.val (j+1)) -231          (algebraMap (BlowupChart R t x) (BlowupOverlap R t x)) (G.left j) * a ∈232          (Ideal.span {overlapException R t x})^j := by233        have hm := Ideal.mem_map_of_mem (algebraMap (BlowupChart R t x) (BlowupOverlap R t x))234          (G.left_compat j)235        rw [chartExceptional, Ideal.map_pow, Ideal.map_span, Set.image_singleton] at hm236        convert add_mem (Ideal.pow_le_pow_right (Nat.le_succ j) hc) (Ideal.mul_mem_right a _ hm)237          using 1238        rw [map_sub]; ring239      refine (curve_section_connecting_class_zero_iff R t x beta d G hreg hregSwap j hnow240        (hregF j) (p.val (j+1)) ((curve_lattices_antitone R t x beta d G j).2 hsec) a hcj).mpr241        ⟨r0, ?_⟩242      convert sub_mem hr0 (thread_sub_succ_mem G p j) using 1; abel243  -- Step 2: hence at every level.244  obtain ⟨r, hr⟩ := step1 j245  refine ⟨r, ?_⟩246  simpa only [sub_add_sub_cancel] using add_mem (thread_sub_mem G p (k := J + j) (by omega))247    (curveIdealLattice_le_of_le G (j := j) (by omega) hr)248 249/-- Let `σ` be a section of the surface-to-curve-limit map that sends a surface function to its250constant thread. If a thread `p` of the curve order limit agrees with a surface function modulo the251curve lattice at a single stable level `J ≥ d - 1`, then its class lies in the range of `σ`. -/252theorem curve_limit_range_of_stable_level (R : Type) [CommRing R] (t x : R)253    (beta : BlowupRestriction R t x) (d : ℕ) (G : GluedGenerators R t x beta d)254    (hreg : RegularParameterPair R t x) (hregSwap : RegularParameterPair R x t)255    (hregF : ∀ j : ℕ, Function.Injective (fun c : BlowupOverlap R t x ⧸256      (Ideal.span {overlapException R t x})^j =>257      Ideal.Quotient.mk ((Ideal.span {overlapException R t x})^j)258      ((algebraMap (BlowupChart R t x) (BlowupOverlap R t x)) (G.left j)) * c))259    (f : R)260    (hf : ∀ j : ℕ, surfaceToCechInput R t x j f =261      (cechInputLattice R t x j).mkQ (gluedFunctionPair R t x G j))262    [IsAdicComplete (Ideal.span {t,x}) R] (J : ℕ) (hJ : d - 1 ≤ J)263    (σ : R →ₗ[R] CurveOrderLimit R t x beta G)264    (hσ : ∀ r : R, ∃ p : curveThreads R t x beta G, σ r = curveLimitMk R t x beta G p ∧ ∀ j : ℕ,265      p.val j = surfaceToChartPair R t x r)266    (p : curveThreads R t x beta G)267    (hp : ∃ r : R, p.val J - surfaceToChartPair R t x r ∈ curveIdealLattice R t x beta G J) :268    curveLimitMk R t x beta G p ∈ LinearMap.range σ := by269  -- Approximate `p` at every level, correct the approximants into an adically Cauchy sequence270  -- of surface functions, and take its limit.271  choose r hr using exists_surface_approx_of_stable_level G hreg hregSwap hregF hJ p hp272  have hker : ∀ (j : ℕ) (a : R), surfaceToChartPair R t x a ∈ curveIdealLattice R t x beta G j ↔273      a ∈ Ideal.span {f} ⊔ (Ideal.span {t,x})^j := fun j a ↦274    surface_to_curve_quotient_kernel R t x beta d G hreg hregSwap j (hregF j) f hf a275  have hdiff : ∀ j, r (j+1) - r j ∈ Ideal.span {f} ⊔ (Ideal.span {t,x})^j := fun j ↦ by276    rw [← hker]277    convert sub_mem (sub_mem (hr j) (thread_sub_succ_mem G p j))278      ((curve_lattices_antitone R t x beta d G j).1 (hr (j+1))) using 1279    rw [map_sub]; abel280  choose y hy z hz hyz using fun j ↦ Submodule.mem_sup.mp (hdiff j)281  set r' : ℕ → R := fun j ↦ r j - ∑ i ∈ Finset.range j, y i with hr'282  have hcauchy : ∀ m n, m ≤ n → r' m - r' n ∈ (Ideal.span {t,x})^m := by283    intro m n hmn284    induction n, hmn using Nat.le_induction with285    | base => simp286    | succ n hn ih =>287      have h2 : r' n - r' (n+1) = -z n := by288        simp only [hr', Finset.sum_range_succ]; linear_combination hyz n289      simpa only [← h2, sub_add_sub_cancel] using290        add_mem ih (neg_mem (Ideal.pow_le_pow_right hn (hz n)))291  obtain ⟨Lim, hLim⟩ := IsPrecomplete.prec (I := Ideal.span {t,x}) (M := R) inferInstance292    (f := r') fun {m n} hmn ↦ by293      rw [SModEq.sub_mem, smul_eq_mul, Ideal.mul_top]294      exact hcauchy m n hmn295  have hLim' : ∀ j, p.val j - surfaceToChartPair R t x Lim ∈ curveIdealLattice R t x beta G j :=296    fun j ↦ by297      have h := hLim j298      rw [SModEq.sub_mem, smul_eq_mul, Ideal.mul_top] at h299      have h1 := (hker j (Lim - r j)).2 <| by300        convert sub_mem301          (Ideal.mem_sup_left (neg_mem (sum_mem fun i (_ : i ∈ Finset.range j) ↦ hy i)))302          (Ideal.mem_sup_right h) using 1303        simp only [hr']; abel304      convert sub_mem (hr j) h1 using 1305      rw [map_sub]; abel306  obtain ⟨q, hq1, hq2⟩ := hσ Lim307  refine ⟨Lim, hq1.trans ((Submodule.Quotient.eq _).2 (Submodule.mem_pi.2 fun j _ ↦ ?_))⟩308  change q.val j - p.val j ∈ curveIdealLattice R t x beta G j309  rw [hq2 j, ← neg_sub]310  exact neg_mem (hLim' j)311 312end SurfaceBlowup