Lean sources / SurfaceBlowup / Surfaces / Completeness.lean

Completeness of the concrete surface

414 lines · 14 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.Surfaces.PowerSeries7import SurfaceBlowup.Unramified.FrobeniusDescent8import Mathlib.Algebra.Azumaya.Basic9import Mathlib.RingTheory.AdicCompletion.Completeness10import Mathlib.RingTheory.AdicCompletion.RingHom11import Mathlib.RingTheory.TotallySplit12 13/-!14# Completeness of the concrete surface15 16We study the concrete surface `O[[T,X]] / (π - u T^a X^b)` over a discrete valuation ring `O`:17the quotient by `t` is the power series ring over the residue field, ring maps out of18`O[[T,X]]` are determined by their values on constants and on nilpotent images of `T`, `X`,19and the surface (as well as its curve quotients) is adically complete for the parameter20ideal, the maximal ideal and the ideal `(π)`.21 22## Main results23 24* `concrete_surface_quotient_T_equiv`: `R / (t) ≃+* k[[X]]`.25* `concrete_surface_span_T_isPrime`: `(t)` is a prime ideal of the surface.26* `transverse_of_reduction_ne_zero`: a criterion for `g, e` to form a transverse pair.27* `twoSeries_ringHom_ext_of_isNilpotent`, `twoSeries_eval_exists_of_isAdicComplete`:28  uniqueness and existence of evaluations of two-variable power series.29* `concrete_surface_isAdicComplete_maximalIdeal`, `concrete_surface_isAdicComplete_span_pi`,30  `division_coordinate_module_isAdicComplete`: adic completeness statements.31 32Provenance: `surfaceRelation_span_axisT_{eq,isPrime}`, `concrete_surface_{quotient_T_equiv,33span_T_isPrime, ringHom_ext_of_isNilpotent, curve_isAdicComplete}`,34`transverse_of_reduction_ne_zero`, `twoSeries_{mem_variableIdeal_pow_of_coeff_eq_zero,35ringHom_ext_of_isNilpotent, eval_exists_of_isAdicComplete, isAdicComplete_variableIdeal}`,36`unramified_{lift_map_parameter_quotient_irreducible, root_isUnit_of_two_le_natDegree}`,37`variableIdeal_{eq_span_range_X, ne_top}`, `concrete_surface_isAdicComplete_{parameterIdeal,38maximalIdeal, span_pi, span_pi_base}`, `division_coordinate_module_isAdicComplete`.39-/40 41namespace SurfaceBlowup42 43/-! ### The quotient by `t` -/44 45/-- For `0 < a`, the ideals `(π - u T^a X^b, T)` and `(π, T)` of `O[[T,X]]` coincide. -/46private theorem surfaceRelation_span_axisT_eq (O : Type) [CommRing O] (pi : O) (u : (TwoSeries O)ˣ)47    (a b : ℕ) (ha : 0 < a) :48    Ideal.span {surfaceRelation O pi u a b, axisT O} =49      Ideal.span {(MvPowerSeries.C pi : TwoSeries O), axisT O} := by50  obtain ⟨a', rfl⟩ : ∃ a', a = a' + 1 := ⟨a - 1, by omega⟩51  rw [show surfaceRelation O pi u (a' + 1) b = MvPowerSeries.C pi +52      -((u : TwoSeries O) * axisT O ^ a' * axisX O ^ b) * axisT O by rw [surfaceRelation]; ring,53    Ideal.span_pair_add_mul_right]54 55/-- The quotient of the concrete surface by `t` is the power series ring `k[[X]]` over the56residue field, compatibly with `residueKillT`. -/57theorem concrete_surface_quotient_T_equiv (O : Type) [CommRing O] [IsDomain O]58    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)59    (ha : 0 < a) :60    ∃ q : (ConcreteSurface O pi u a b ⧸ Ideal.span {surfaceT O pi u a b}) ≃+*61        PowerSeries (IsLocalRing.ResidueField O),62      ∀ s : TwoSeries O, q (Ideal.Quotient.mk (Ideal.span {surfaceT O pi u a b})63        (surfaceMk O pi u a b s)) = residueKillT O s := by64  obtain ⟨-, -, -, hsurj, hker⟩ := residueKillT_apply_ker O pi hpi65  set I := surfaceIdeal O pi u a b66  set J : Ideal (TwoSeries O) := Ideal.span {axisT O}67  have h1 : Ideal.span {surfaceT O pi u a b} = J.map (Ideal.Quotient.mk I) := by68    rw [Ideal.map_span, Set.image_singleton]; rfl69  have h2 : I ⊔ J = RingHom.ker (residueKillT O) := by70    rw [hker, ← surfaceRelation_span_axisT_eq O pi u a b ha, Ideal.span_insert]; rfl71  exact ⟨((Ideal.quotEquivOfEq h1).trans (DoubleQuot.quotQuotEquivQuotSup I J)).trans72    ((Ideal.quotEquivOfEq h2).trans (RingHom.quotientKerEquivOfSurjective hsurj)), fun _ ↦ rfl⟩73 74/-- The ideal `(π - u T^a X^b, T)` of `O[[T,X]]` is prime when `π` is a uniformizer. -/75private theorem surfaceRelation_span_axisT_isPrime (O : Type) [CommRing O] [IsDomain O]76    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)77    (ha : 0 < a) :78    (Ideal.span {surfaceRelation O pi u a b, axisT O}).IsPrime := by79  rw [surfaceRelation_span_axisT_eq O pi u a b ha]80  simpa [axisT] using mvPowerSeries_fin_two_span_C_var_isPrime O pi81    (by rw [← hpi.maximalIdeal_eq]; infer_instance) 082 83/-- The ideal `(t)` of the concrete surface is prime. -/84theorem concrete_surface_span_T_isPrime (O : Type) [CommRing O] [IsDomain O]85    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)86    (ha : 0 < a) :87    (Ideal.span {surfaceT O pi u a b}).IsPrime := by88  have := surfaceRelation_span_axisT_isPrime O pi hpi u a b ha89  have hker : RingHom.ker (surfaceMk O pi u a b) ≤90      Ideal.span {surfaceRelation O pi u a b, axisT O} := by91    rw [surfaceMk, Ideal.mk_ker]92    exact Ideal.span_mono (by simp)93  have h0 : surfaceMk O pi u a b (surfaceRelation O pi u a b) = 0 :=94    Ideal.Quotient.eq_zero_iff_mem.2 (Ideal.subset_span rfl)95  have himg : (Ideal.span {surfaceRelation O pi u a b, axisT O}).map (surfaceMk O pi u a b) =96      Ideal.span {surfaceT O pi u a b} := by97    rw [Ideal.map_span, Set.image_pair, h0, Ideal.span_insert_zero]; rfl98  exact himg ▸ Ideal.map_isPrime_of_surjective Ideal.Quotient.mk_surjective hker99 100/-- Let `e` be a non-zero-divisor of a noetherian local ring `S` with `S / (e) ≃ k[[X]]`, and101let `g` have nonzero image in `k[[X]]`. Then `e` is a non-zero-divisor modulo `g`, `g` is a102non-zero-divisor modulo `e`, and `(g, e)` contains a power of the maximal ideal. -/103theorem transverse_of_reduction_ne_zero (S : Type) [CommRing S] [IsLocalRing S]104    [IsNoetherianRing S] (e g : S) (hereg : Function.Injective (fun y : S ↦ e * y)) (k : Type)105    [Field k] (q : (S ⧸ Ideal.span {e}) ≃+* PowerSeries k)106    (hg : q (Ideal.Quotient.mk (Ideal.span {e}) g) ≠ 0) :107    Function.Injective (fun a : S ⧸ Ideal.span {g} ↦ Ideal.Quotient.mk (Ideal.span {g}) e * a) ∧108      Function.Injective109        (fun a : S ⧸ Ideal.span {e} ↦ Ideal.Quotient.mk (Ideal.span {e}) g * a) ∧110      ∃ L : ℕ, (IsLocalRing.maximalIdeal S)^L ≤ Ideal.span {g, e} := by111  set π := Ideal.Quotient.mk (Ideal.span {e})112  have hker : ∀ x : S, q (π x) = 0 ↔ ∃ c, x = e * c := fun x ↦ by113    rw [map_eq_zero_iff q q.injective, Ideal.Quotient.eq_zero_iff_mem, Ideal.mem_span_singleton]114    exact Iff.rfl115  refine ⟨fun a a' h ↦ ?_, fun a a' h ↦ q.injective (mul_left_cancel₀ hg (by116    simpa only [map_mul] using congrArg q h)), ?_⟩117  · induction a using Quotient.inductionOn' with | h a => ?_118    induction a' using Quotient.inductionOn' with | h a' => ?_119    change Ideal.Quotient.mk _ e * Ideal.Quotient.mk _ a =120      Ideal.Quotient.mk _ e * Ideal.Quotient.mk _ a' at h121    change Ideal.Quotient.mk _ a = Ideal.Quotient.mk _ a'122    rw [← map_mul, ← map_mul, Ideal.Quotient.eq, Ideal.mem_span_singleton'] at h123    obtain ⟨b, hb⟩ := h124    have h0 : q (π g) * q (π b) = 0 := by125      rw [← map_mul, ← map_mul, mul_comm, hb, ← mul_sub]126      exact (hker _).2 ⟨_, rfl⟩127    obtain ⟨c, rfl⟩ := (hker b).1 ((mul_eq_zero.1 h0).resolve_left hg)128    rw [Ideal.Quotient.eq, Ideal.mem_span_singleton']129    exact ⟨c, hereg (by simp only; rw [mul_sub, ← hb]; ring)⟩130  · -- `(g, e)` contains `𝔪^L` with `L = ord_X (q ḡ)`: `𝔪^L` maps into `(X^L) = (q ḡ)` in `k[[X]]`.131    set p := q (π g)132    have hu : IsUnit p.divXPowOrder := by133      rw [PowerSeries.isUnit_iff_constantCoeff, isUnit_iff_ne_zero]134      exact fun h ↦ hg (PowerSeries.constantCoeff_divXPowOrder_eq_zero_iff.1 h)135    let f : S →+* PowerSeries k := (q : (S ⧸ Ideal.span {e}) →+* PowerSeries k).comp π136    have hfs : Function.Surjective f := q.surjective.comp Ideal.Quotient.mk_surjective137    refine ⟨p.order.toNat, fun x hx ↦ ?_⟩138    have hx' := Ideal.mem_map_of_mem f hx139    rw [Ideal.map_pow, IsLocalRing.map_maximalIdeal_of_surjective f hfs,140      PowerSeries.maximalIdeal_eq_span_X, Ideal.span_singleton_pow,141      Ideal.mem_span_singleton] at hx'142    obtain ⟨y, hy⟩ : f g ∣ f x := dvd_trans ⟨↑hu.unit⁻¹, by143      change _ = p * _144      rw [← mul_one (_ ^ _), ← hu.mul_val_inv, ← mul_assoc,145        PowerSeries.X_pow_order_mul_divXPowOrder]⟩ hx'146    obtain ⟨y, rfl⟩ := hfs y147    obtain ⟨c, hc⟩ := (hker _).1 (by148      change f (x - g * y) = 0149      rw [map_sub, map_mul, hy, sub_self])150    exact Ideal.mem_span_pair.2 ⟨y, c, by linear_combination -hc⟩151 152/-! ### Ring maps out of `O[[T,X]]` -/153 154/-- A two-variable power series all of whose coefficients of total degree `< N` vanish lies in155`(T, X)^N`. -/156private theorem twoSeries_mem_variableIdeal_pow_of_coeff_eq_zero (O : Type) [CommRing O] (N : ℕ)157    (g : TwoSeries O) (hg : ∀ m : Fin 2 →₀ ℕ, m 0 + m 1 < N → MvPowerSeries.coeff m g = 0) :158    g ∈ variableIdeal O ^ N :=159  (axis_ideal_pow_mem_iff O N g).2 hg160 161/-- Two ring maps out of `O[[T,X]]` that agree on constants, `T` and `X`, and send `T` and162`X` to nilpotent elements, are equal. -/163theorem twoSeries_ringHom_ext_of_isNilpotent (O S : Type) [CommRing O] [CommRing S]164    (φ ψ : TwoSeries O →+* S) (hC : ∀ c : O, φ (MvPowerSeries.C c) = ψ (MvPowerSeries.C c))165    (hT : φ (axisT O) = ψ (axisT O)) (hX : φ (axisX O) = ψ (axisX O))166    (hTn : IsNilpotent (φ (axisT O))) (hXn : IsNilpotent (φ (axisX O))) :167    φ = ψ := by168  obtain ⟨N, hN⟩ : IsNilpotent (Ideal.span {φ (axisT O), φ (axisX O)}) := by169    rw [Ideal.FG.isNilpotent_iff_le_nilradical (Submodule.fg_span (Set.toFinite _)),170      Ideal.span_le]171    rintro x (rfl | rfl)172    exacts [hTn, hXn]173  -- both maps kill `(T, X)^N`, whose image is generated by powers of `φ T, φ X`174  have kill (χ : TwoSeries O →+* S) (hχT : χ (axisT O) = φ (axisT O))175      (hχX : χ (axisX O) = φ (axisX O)) (g) (hg : g ∈ variableIdeal O ^ N) : χ g = 0 := by176    have : χ g ∈ ((variableIdeal O) ^ N).map χ := Ideal.mem_map_of_mem _ hg177    rw [Ideal.map_pow, variableIdeal, Ideal.map_span, Set.image_pair, hχT, hχX, hN] at this178    simpa using this179  have hpoly : φ.comp (MvPolynomial.coeToMvPowerSeries.ringHom (σ := Fin 2) (R := O)) =180      ψ.comp (MvPolynomial.coeToMvPowerSeries.ringHom) := by181    apply MvPolynomial.ringHom_ext182    · intro c183      simpa using hC c184    · intro s185      fin_cases s186      · simpa [axisT] using hT187      · simpa [axisX] using hX188  ext f189  set p := MvPowerSeries.truncTotal N f190  have hg : f - (p : TwoSeries O) ∈ variableIdeal O ^ N := by191    apply twoSeries_mem_variableIdeal_pow_of_coeff_eq_zero192    intro m hm193    rw [map_sub, MvPolynomial.coeff_coe, MvPowerSeries.coeff_truncTotal, sub_self]194    simpa [Finsupp.degree_eq_sum, Fin.sum_univ_two] using hm195  have h1 := kill φ rfl rfl _ hg196  have h2 := kill ψ hT.symm hX.symm _ hg197  rw [map_sub, sub_eq_zero] at h1 h2198  rw [h1, h2]199  exact congrArg (fun F ↦ F p) hpoly200 201/-- Two ring maps out of the concrete surface that agree on constants, `t` and `x`, and send202`t` and `x` to nilpotent elements, are equal. -/203theorem concrete_surface_ringHom_ext_of_isNilpotent (O S : Type) [CommRing O] [CommRing S]204    (pi : O) (u : (TwoSeries O)ˣ) (a b : ℕ) (φ ψ : ConcreteSurface O pi u a b →+* S)205    (hC : ∀ c : O, φ (algebraMap O (ConcreteSurface O pi u a b) c) =206      ψ (algebraMap O (ConcreteSurface O pi u a b) c))207    (hT : φ (surfaceT O pi u a b) = ψ (surfaceT O pi u a b))208    (hX : φ (surfaceX O pi u a b) = ψ (surfaceX O pi u a b))209    (hTn : IsNilpotent (φ (surfaceT O pi u a b))) (hXn : IsNilpotent (φ (surfaceX O pi u a b))) :210    φ = ψ :=211  Ideal.Quotient.ringHom_ext212    (twoSeries_ringHom_ext_of_isNilpotent O S _ _ (fun c ↦ hC c) hT hX hTn hXn)213 214/-- Over a ring `S` complete for an ideal `I`, any ring map `O' → S` extends to an evaluation215`O'[[T,X]] → S` sending `T ↦ e` and `X ↦ z` for given `e, z ∈ I`. -/216theorem twoSeries_eval_exists_of_isAdicComplete (S : Type) [CommRing S] (I : Ideal S)217    [IsAdicComplete I S] (O' : Type) [CommRing O'] (κ : O' →+* S) (e z : S) (he : e ∈ I)218    (hz : z ∈ I) :219    ∃ Θ : TwoSeries O' →+* S,220      (∀ c : O', Θ (MvPowerSeries.C c) = κ c) ∧ Θ (axisT O') = e ∧ Θ (axisX O') = z := by221  have nil : ∀ (n : ℕ) (a : S), a ∈ I → IsNilpotent (Ideal.Quotient.mk (I ^ n) a) :=222    fun n a ha ↦ ⟨n, by223      rw [← map_pow, Ideal.Quotient.eq_zero_iff_mem]; exact Ideal.pow_mem_pow ha n⟩224  let f : (n : ℕ) → TwoSeries O' →+* S ⧸ I ^ n := fun n ↦225    nilpotentEval ((Ideal.Quotient.mk (I ^ n)).comp κ) (Ideal.Quotient.mk (I ^ n) e)226      (Ideal.Quotient.mk (I ^ n) z) (nil n e he) (nil n z hz)227  have hgen := fun n ↦ nilpotentEval_apply_generators O' (S ⧸ I ^ n)228      ((Ideal.Quotient.mk (I ^ n)).comp κ) (Ideal.Quotient.mk (I ^ n) e)229      (Ideal.Quotient.mk (I ^ n) z) (nil n e he) (nil n z hz)230  have hf : ∀ {m n : ℕ} (hle : m ≤ n), (Ideal.Quotient.factorPow I hle).comp (f n) = f m := by231    intro m n hle232    obtain ⟨hC, hT, hX⟩ := hgen n233    obtain ⟨hC', hT', hX'⟩ := hgen m234    apply twoSeries_ringHom_ext_of_isNilpotent235    · intro c; simp only [RingHom.comp_apply, f, hC, hC']; rfl236    · simp only [RingHom.comp_apply, f, hT, hT']; rfl237    · simp only [RingHom.comp_apply, f, hX, hX']; rfl238    · simp only [RingHom.comp_apply, f, hT]; exact (nil n e he).map _239    · simp only [RingHom.comp_apply, f, hX]; exact (nil n z hz).map _240  have hsep : ∀ a b : S, (∀ n : ℕ, Ideal.Quotient.mk (I ^ n) a = Ideal.Quotient.mk (I ^ n) b) →241      a = b := by242    intro a b h243    rw [IsHausdorff.eq_iff_smodEq (I := I)]244    intro n245    rw [SModEq.sub_mem, smul_eq_mul, Ideal.mul_top, ← Ideal.Quotient.eq]246    exact h n247  refine ⟨IsAdicComplete.liftRingHom I f hf, fun c ↦ hsep _ _ fun n ↦ ?_,248    hsep _ _ fun n ↦ ?_, hsep _ _ fun n ↦ ?_⟩ <;> rw [IsAdicComplete.mk_liftRingHom]249  exacts [(hgen n).1 c, (hgen n).2.1, (hgen n).2.2]250 251/-! ### Unramified extensions -/252 253/-- The reduction of an unramified lift `Φ` to the quotient of the concrete surface by its254parameter ideal `(t, x)` is irreducible. -/255theorem unramified_lift_map_parameter_quotient_irreducible (O : Type) [CommRing O] [IsDomain O]256    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)257    (ha : 0 < a) (Φ : Polynomial O) (hΦ : IsUnramifiedLift O Φ) :258    Irreducible (Φ.map ((Ideal.Quotient.mk (Ideal.span ({surfaceT O pi u a b,259      surfaceX O pi u a b} : Set (ConcreteSurface O pi u a b)))).comp260        (algebraMap O (ConcreteSurface O pi u a b)))) := by261  have key : ∀ (R : Type) [CommRing R] (alg : O →+* R) (I : Ideal R)262      (e : R ⧸ I ≃+* IsLocalRing.ResidueField O),263      (∀ c, e (Ideal.Quotient.mk I (alg c)) = IsLocalRing.residue O c) →264      Irreducible (Φ.map ((Ideal.Quotient.mk I).comp alg)) := by265    intro R _ alg I e hc266    have hc' : e.toRingHom.comp ((Ideal.Quotient.mk I).comp alg) = IsLocalRing.residue O := by267      ext c; exact hc c268    have h := hΦ.2269    rw [residuePoly, ← hc', ← Polynomial.map_map] at h270    exact (MulEquiv.irreducible_iff (Polynomial.mapEquiv e).toMulEquiv).mp (by simpa using h)271  obtain ⟨e, he⟩ := concrete_surface_quotient_parameters_equiv O pi hpi u a b ha272  exact key _ _ _ e fun c ↦ (he (.C c)).trans (congrArg _ (MvPowerSeries.constantCoeff_C ..))273 274/-- If `Φ` is an unramified lift of degree at least `2` over a complete local ring with finite275residue field, then the root of `Φ` in `O[X]/(Φ)` is a unit. -/276theorem unramified_root_isUnit_of_two_le_natDegree (O : Type) [CommRing O] [IsLocalRing O]277    [IsAdicComplete (IsLocalRing.maximalIdeal O) O] [Finite (IsLocalRing.ResidueField O)]278    (Φ : Polynomial O) (hΦ : IsUnramifiedLift O Φ) (h2 : 2 ≤ Φ.natDegree) :279    IsUnit (AdjoinRoot.root Φ) := by280  obtain ⟨_, hunit, _⟩ := base_ideal_maximal_local O Φ hΦ281  apply hunit282  obtain ⟨hfield, _, _⟩ := residue_extension_field O Φ hΦ283  obtain ⟨e, he, _⟩ := residue_extension_equiv O Φ284  have hne : baseReduce O Φ (AdjoinRoot.root Φ) ≠ 0 := by285    intro h0286    have h1 : e (baseReduce O Φ (AdjoinRoot.mk Φ Polynomial.X)) = 0 := by287      rw [AdjoinRoot.mk_X, h0]; simp288    rw [he, Polynomial.map_X, AdjoinRoot.mk_eq_zero] at h1289    exact Polynomial.X_ne_zero (Polynomial.eq_zero_of_dvd_of_natDegree_lt h1290      (by rw [Polynomial.natDegree_X, hΦ.1.natDegree_map]; omega))291  let := hfield.toField292  exact isUnit_iff_ne_zero.mpr hne293 294/-! ### Adic completeness -/295 296/-- The ideal `(T, X)` is the span of the two variables of `O[[T,X]]`. -/297private theorem variableIdeal_eq_span_range_X (O : Type) [CommRing O] :298    variableIdeal O = Ideal.span (Set.range (MvPowerSeries.X : Fin 2 → TwoSeries O)) := by299  unfold variableIdeal300  congr 1301  ext x302  simp [axisT, axisX, Fin.exists_fin_two, eq_comm]303 304/-- `O[[T,X]]` is complete for the ideal `(T, X)`. -/305private theorem twoSeries_isAdicComplete_variableIdeal (O : Type) [CommRing O] :306    IsAdicComplete (variableIdeal O) (TwoSeries O) := by307  rw [variableIdeal_eq_span_range_X]308  infer_instance309 310/-- Over a nontrivial ring, `(T, X)` is a proper ideal of `O[[T,X]]`. -/311private theorem variableIdeal_ne_top (O : Type) [CommRing O] [Nontrivial O] :312    variableIdeal O ≠ ⊤ := by313  intro h314  have h1 : (1 : TwoSeries O) ∈ variableIdeal O := h ▸ Submodule.mem_top315  rw [variableIdeal, axisT, axisX, mvPowerSeries_fin_two_mem_variableIdeal_iff] at h1316  simp at h1317 318/-- The concrete surface is complete for its parameter ideal `(t, x)`. -/319theorem concrete_surface_isAdicComplete_parameterIdeal (O : Type) [CommRing O] [IsLocalRing O]320    [IsNoetherianRing O] (pi : O) (u : (TwoSeries O)ˣ) (a b : ℕ) :321    IsAdicComplete (surfaceParameterIdeal O pi u a b) (ConcreteSurface O pi u a b) := by322  have := twoSeries_isAdicComplete_variableIdeal O323  have e : surfaceParameterIdeal O pi u a b =324      (variableIdeal O).map (Ideal.Quotient.mk (surfaceIdeal O pi u a b)) := by325    unfold surfaceParameterIdeal variableIdeal326    rw [Ideal.map_span, Set.image_pair]327    rfl328  exact e ▸ isAdicComplete_quotient_of_iInf_sup_pow (TwoSeries O) (variableIdeal O)329    (surfaceIdeal O pi u a b)330    (iInf_sup_pow_eq_of_isLocalRing (TwoSeries O) _ _ (variableIdeal_ne_top O))331 332/-- The concrete surface is complete for its maximal ideal. -/333theorem concrete_surface_isAdicComplete_maximalIdeal (O : Type) [CommRing O] [IsDomain O]334    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)335    (ha : 0 < a) [IsLocalRing (ConcreteSurface O pi u a b)] :336    IsAdicComplete (IsLocalRing.maximalIdeal (ConcreteSurface O pi u a b))337      (ConcreteSurface O pi u a b) := by338  rw [concrete_surface_maximalIdeal_eq O pi hpi u a b ha]339  exact concrete_surface_isAdicComplete_parameterIdeal O pi u a b340 341/-- The concrete surface is complete for the ideal generated by the image of `π`. -/342theorem concrete_surface_isAdicComplete_span_pi (O : Type) [CommRing O] [IsDomain O]343    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)344    (ha : 0 < a) :345    IsAdicComplete (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi})346      (ConcreteSurface O pi u a b) := by347  have : IsLocalRing (ConcreteSurface O pi u a b) :=348    concrete_surface_isLocalRing O pi u a b hpi.not_isUnit ha349  have : IsNoetherianRing (ConcreteSurface O pi u a b) :=350    concrete_surface_isNoetherianRing O pi u a b351  have := concrete_surface_isAdicComplete_maximalIdeal O pi hpi u a b ha352  apply isAdicComplete_of_isAdicComplete_maximalIdeal353  have hle : Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi} ≤354      IsLocalRing.maximalIdeal (ConcreteSurface O pi u a b) := by355    rw [Ideal.span_singleton_le_iff_mem, concrete_surface_maximalIdeal_eq O pi hpi u a b ha]356    have h2 : surfaceMk O pi u a b (surfaceRelation O pi u a b) = 0 :=357      Ideal.Quotient.eq_zero_iff_mem.mpr (Ideal.subset_span rfl)358    have h3 : surfaceMk O pi u a b (MvPowerSeries.C pi) =359        (surfaceUnit O pi u a b : ConcreteSurface O pi u a b) * surfaceT O pi u a b ^ a *360          surfaceX O pi u a b ^ b := by361      have := sub_eq_zero.mp (by simpa [surfaceRelation, map_sub, map_mul, map_pow] using h2)362      simpa [surfaceUnit, surfaceT, surfaceX, map_mul, map_pow] using this363    rw [show algebraMap O (ConcreteSurface O pi u a b) pi =364      surfaceMk O pi u a b (MvPowerSeries.C pi) from rfl, h3]365    exact Ideal.mul_mem_right _ _ (Ideal.mul_mem_left _ _366      (Ideal.pow_mem_of_mem _ (Ideal.subset_span (by simp)) a ha))367  exact ne_top_of_le_ne_top (IsLocalRing.maximalIdeal.isMaximal _).ne_top hle368 369/-- Every principal quotient of the concrete surface is `π`-adically complete. -/370theorem concrete_surface_curve_isAdicComplete (O : Type) [CommRing O] [IsDomain O]371    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)372    (ha : 0 < a) (f : ConcreteSurface O pi u a b) :373    IsAdicComplete (Ideal.span {pi} : Ideal O) (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) := by374  have : IsLocalRing (ConcreteSurface O pi u a b) :=375    concrete_surface_isLocalRing O pi u a b hpi.not_isUnit ha376  have : IsNoetherianRing (ConcreteSurface O pi u a b) :=377    concrete_surface_isNoetherianRing O pi u a b378  have hI := concrete_surface_isAdicComplete_span_pi O pi hpi u a b ha379  have hItop : Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi} ≠ ⊤ := fun h ↦ by380    have hH := hI.toIsHausdorff381    rw [h] at hH382    exact not_subsingleton _ hH.subsingleton383  have hc := isAdicComplete_quotient_of_iInf_sup_pow _ _ (Ideal.span {f})384    (iInf_sup_pow_eq_of_isLocalRing _ _ (Ideal.span {f}) hItop)385  rw [← IsAdicComplete.map_algebraMap_iff (S := ConcreteSurface O pi u a b ⧸ Ideal.span {f}),386    Ideal.map_span]387  rw [Ideal.map_span] at hc388  simp only [Set.image_singleton] at hc ⊢389  convert hc using 2390  rfl391 392/-- The concrete surface is `π`-adically complete as an `O`-module. -/393theorem concrete_surface_isAdicComplete_span_pi_base (O : Type) [CommRing O] [IsDomain O]394    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)395    (ha : 0 < a) :396    IsAdicComplete (Ideal.span {pi} : Ideal O) (ConcreteSurface O pi u a b) :=397  (IsAdicComplete.map_algebraMap_iff (S := ConcreteSurface O pi u a b) _ _).1 <| by398    rw [Ideal.map_span, Set.image_singleton]399    exact concrete_surface_isAdicComplete_span_pi O pi hpi u a b ha400 401/-- Over a complete discrete valuation ring, `Oⁿ × R` is `π`-adically complete, where `R` is the402concrete surface. -/403theorem division_coordinate_module_isAdicComplete (O : Type) [CommRing O] [IsDomain O]404    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)405    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a) (n : ℕ) :406    IsAdicComplete (Ideal.span {pi} : Ideal O) ((Fin n → O) × ConcreteSurface O pi u a b) := by407  have : IsAdicComplete (Ideal.span {pi} : Ideal O) O :=408    dvr_isAdicComplete_span_uniformizer O pi hpi409  have : IsAdicComplete (Ideal.span {pi} : Ideal O) (Fin n → O) :=410    finite_free_adic_complete O (Fin n → O) _411  have := concrete_surface_isAdicComplete_span_pi_base O pi hpi u a b ha412  exact isAdicComplete_prod O _ _ _413 414end SurfaceBlowup