Lean sources / SurfaceBlowup / Surfaces / Regularity.lean

Regularity of the concrete surface

691 lines · 15 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.Charts7import SurfaceBlowup.Surfaces.Completeness8import Mathlib.RingTheory.AdicCompletion.LocalRing9import Mathlib.RingTheory.KrullDimension.NonZeroDivisors10 11/-!12# Regularity of the concrete surface13 14The concrete surface `R = O[[T,X]] / (π - u T^a X^b)` is a two-dimensional regular local15domain, `(t, x)` and `(x, t)` are regular parameter pairs, and quotients `R/(f)` by suitable16non-units are free `O`-modules of rank `length R/(π, f)`. We also construct the maps from17completed local rings of blow-up charts to child surfaces.18 19## Main results20 21* `concrete_surface_isDomain`, `concrete_surface_isRegularLocalRing`,22  `concrete_surface_ringKrullDim_eq_two`, `concrete_surface_data_exists_unconditional`.23* `concrete_surface_regular_pair_tx`, `concrete_surface_equiv_regular_pair`.24* `concrete_surface_curve_free_of_length`.25* `chart_child_completion_map_exists`, `chart_child_completion_map_local`,26  `child_series_eval_comp_chart_subst`.27 28Provenance: `blowupChart_concrete_isNoetherianRing`, `nonrational_point_residue_surjective`,29`chart_child_completion_map_{exists,local}`, `concrete_surface_{regular_pair_tx, regular_pair_xt,30isDomain, equiv_instances, equiv_regular_pair, two_le_ringKrullDim, isRegularLocalRing,31ringKrullDim_eq_two, data_exists, data_exists_unconditional, pi_regular_mod_curve, curve_basis,32curve_free_finrank, curve_free_of_length}`, `regular_pair_first_regular_mod_second`,33`child_series_eval_comp_chart_subst`.34-/35 36namespace SurfaceBlowup37 38/-! ### Blow-up charts and their completions -/39 40/-- Every blow-up chart of the concrete surface is noetherian. -/41theorem blowupChart_concrete_isNoetherianRing (O : Type) [CommRing O] [IsNoetherianRing O] (pi : O)42    (u : (TwoSeries O)ˣ) (a b : ℕ) (e f : ConcreteSurface O pi u a b) :43    IsNoetherianRing (BlowupChart (ConcreteSurface O pi u a b) e f) := by44  have := concrete_surface_isNoetherianRing O pi u a b45  unfold BlowupChart46  infer_instance47 48/-- For the chart map `Λ` to the concrete surface over `O[θ] = O[X]/(Φ)` attached to a49non-rational point, every element of the target is congruent modulo the parameter ideal to an50element in the image of `Λ`. -/51theorem nonrational_point_residue_surjective (O : Type) [CommRing O] [IsDomain O]52    [IsDiscreteValuationRing O] (pi : O) (u : (TwoSeries O)ˣ) (a b : ℕ)53    [IsAdicComplete (IsLocalRing.maximalIdeal O) O]54    [Finite (IsLocalRing.ResidueField O)] (Φ : Polynomial O)55    (hθ : IsUnit (AdjoinRoot.root Φ))56    (Λ : BlowupChart (ConcreteSurface O pi u a b) (surfaceT O pi u a b)57      (surfaceX O pi u a b) →+* ConcreteSurface (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)58      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)59      (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)60      (AdjoinRoot.root Φ) hθ ^ b) (a + b) 0)61    (hΛ : ∀ g : TwoSeries O,62      Λ (chartBase (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b)63      (surfaceMk O pi u a b g)) = surfaceMk (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)64      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)65      (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)66      (AdjoinRoot.root Φ) hθ ^ b) (a + b) 067      (chartSubst (AdjoinRoot Φ) (AdjoinRoot.root Φ)68      (MvPowerSeries.map (algebraMap O (AdjoinRoot Φ)) g)))69    (hΛZ : Λ (chartSlope (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b)) =70      surfaceX (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)71      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)72      (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)73      (AdjoinRoot.root Φ) hθ ^ b) (a + b) 0 + algebraMap (AdjoinRoot Φ)74      (ConcreteSurface (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)75      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)76      (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)77      (AdjoinRoot.root Φ) hθ ^ b) (a + b) 0) (AdjoinRoot.root Φ)) :78    ∀ y : ConcreteSurface (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)79      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)80        (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)81        (AdjoinRoot.root Φ) hθ ^ b) (a + b) 0,82      ∃ x : BlowupChart (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b),83      Λ x - y ∈ surfaceParameterIdeal (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)84      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)85        (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)86        (AdjoinRoot.root Φ) hθ ^ b) (a + b) 0 := by87  intro y88  obtain ⟨s', rfl⟩ := Ideal.Quotient.mk_surjective y89  set B := chartBase (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b)90  set I := surfaceParameterIdeal (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)91    (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)92      (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)93      (AdjoinRoot.root Φ) hθ ^ b) (a + b) 094  have hXI : surfaceX _ _ _ _ _ ∈ I := Ideal.subset_span (Set.mem_insert_of_mem _ rfl)95  obtain ⟨p, hp⟩ : ∃ p, AdjoinRoot.mk Φ p = MvPowerSeries.constantCoeff s' :=96    Ideal.Quotient.mk_surjective _97  refine ⟨p.eval₂ (B.comp (algebraMap O _)) (chartSlope _ _ _), ?_⟩98  -- `Λ (p(θ)) ≡ p(θ) ≡ s'(0, 0) ≡ s'` modulo the parameter ideal99  have key : Λ (p.eval₂ (B.comp (algebraMap O _)) (chartSlope _ _ _)) -100      algebraMap (AdjoinRoot Φ) _ (MvPowerSeries.constantCoeff s') ∈ I := by101    rw [← Ideal.Quotient.eq, Polynomial.hom_eval₂, hΛZ, ← hp, ← AdjoinRoot.aeval_eq,102      Polynomial.aeval_def, Polynomial.hom_eval₂, Polynomial.hom_eval₂, map_add,103      Ideal.Quotient.eq_zero_iff_mem.mpr hXI, zero_add, Polynomial.hom_eval₂]104    congr 1105    refine RingHom.ext fun c₀ ↦ ?_106    change Ideal.Quotient.mk I (Λ (B (surfaceMk O pi u a b (MvPowerSeries.C c₀)))) = _107    rw [hΛ, MvPowerSeries.map_C,108      (chartSubst_apply_generators (AdjoinRoot Φ) (AdjoinRoot.root Φ)).1]109    rfl110  have := I.sub_mem key (concrete_surface_sub_constantCoeff_mem_parameterIdeal _ _ _ _ _ s')111  rwa [sub_sub_sub_cancel_right] at this112 113/-- A ring map `Λ : A → R'` to a concrete surface, under which `P` is the preimage of the114parameter ideal, extends to the completed local ring of `A` at `P`. -/115theorem chart_child_completion_map_exists (A : Type) [CommRing A] [IsNoetherianRing A] (O' : Type)116    [CommRing O'] [IsDomain O'] [IsDiscreteValuationRing O'] (pi' : O') (hpi' : Irreducible pi')117    (u' : (TwoSeries O')ˣ) (a' b' : ℕ) (ha' : 0 < a') (Λ : A →+* ConcreteSurface O' pi' u' a' b')118    (P : Ideal A) [P.IsPrime] (hP : ∀ x : A, x ∈ P ↔ Λ x ∈ surfaceParameterIdeal O' pi' u' a' b') :119    ∃ Λ' : CompletedLocalAt A P →+* ConcreteSurface O' pi' u' a' b', ∀ x : A,120      Λ' (completedPointMap A P x) = Λ x := by121  have hloc : IsLocalRing (ConcreteSurface O' pi' u' a' b') :=122    concrete_surface_isLocalRing O' pi' u' a' b' hpi'.not_isUnit ha'123  set R := ConcreteSurface O' pi' u' a' b'124  have hmax : IsLocalRing.maximalIdeal R = surfaceParameterIdeal O' pi' u' a' b' :=125    concrete_surface_maximalIdeal_eq O' pi' hpi' u' a' b' ha'126  have hcomp : IsAdicComplete (IsLocalRing.maximalIdeal R) R :=127    concrete_surface_isAdicComplete_maximalIdeal O' pi' hpi' u' a' b' ha'128  set m' := IsLocalRing.maximalIdeal R129  -- Step 1: localize130  have hunit (y : P.primeCompl) : IsUnit (Λ y) := by131    by_contra h132    exact y.2 ((hP y).2 (hmax ▸ (IsLocalRing.mem_maximalIdeal _).2 h))133  let ΛP : (Localization.AtPrime P) →+* R := IsLocalization.lift (M := P.primeCompl) hunit134  have hΛP : ∀ x : A,135      ΛP (algebraMap A (Localization.AtPrime P) x) = Λ x := fun x ↦ IsLocalization.lift_eq _ _136  -- Step 2137  have hle : (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map ΛP ≤ m' := by138    rw [← IsLocalization.AtPrime.map_eq_maximalIdeal P (Localization.AtPrime P), Ideal.map_map,139          Ideal.map_le_iff_le_comap]140    intro x hx141    simp only [Ideal.mem_comap, RingHom.coe_comp, Function.comp_apply]142    rw [hΛP, hmax]; exact (hP x).1 hx143  have hlen (n : ℕ) :144      (IsLocalRing.maximalIdeal (Localization.AtPrime P)) ^ n ≤ (m' ^ n).comap ΛP := by145    rw [← Ideal.map_le_iff_le_comap, Ideal.map_pow]146    exact Ideal.pow_right_mono hle n147  -- Step 3148  let f : (n : ℕ) → CompletedLocalAt A P →+* R ⧸ m' ^ n := fun n ↦149    (Ideal.quotientMap (m' ^ n) ΛP (hlen n)).comp150        (AdicCompletion.evalₐ (IsLocalRing.maximalIdeal (Localization.AtPrime P)) n).toRingHom151  have hf : ∀ {m n : ℕ} (hmn : m ≤ n), (Ideal.Quotient.factorPow m' hmn).comp (f n) = f m := by152    intro m n hmn153    ext y154    induction y using AdicCompletion.induction_on with155    | h s =>156      simp only [f, RingHom.coe_comp, Function.comp_apply, AlgHom.toRingHom_eq_coe,157        RingHom.coe_coe, AdicCompletion.evalₐ_mk, Ideal.quotientMap_mk,158        Ideal.Quotient.factorPow, Ideal.Quotient.factor_mk]159      rw [Ideal.Quotient.eq, ← map_sub]160      apply Ideal.mem_comap.mp (hlen m _)161      have := (s.property hmn)162      rw [SModEq.comm, SModEq.sub_mem] at this163      simpa [smul_eq_mul, Ideal.mul_top] using this164  refine ⟨IsAdicComplete.liftRingHom m' f hf, fun x ↦ ?_⟩165  rw [← sub_eq_zero]166  apply IsHausdorff.haus hcomp.toIsHausdorff167  intro n168  rw [SModEq.sub_mem, sub_zero, smul_eq_mul, Ideal.mul_top, ← Ideal.Quotient.eq_zero_iff_mem,169    map_sub, IsAdicComplete.mk_liftRingHom, sub_eq_zero]170  simp only [f, completedPointMap, localCompletionMap, RingHom.coe_comp, Function.comp_apply,171    AlgHom.toRingHom_eq_coe, RingHom.coe_coe]172  rw [AdicCompletion.algebraMap_apply, AdicCompletion.evalₐ_of, Ideal.quotientMap_mk,173        Algebra.algebraMap_self, RingHom.id_apply, hΛP]174 175/-- The extension `Λ'` of `chart_child_completion_map_exists` is local: the maximal ideal of176the completion is exactly the preimage of the parameter ideal. -/177theorem chart_child_completion_map_local (A : Type) [CommRing A] [IsNoetherianRing A] (O' : Type)178    [CommRing O'] [IsDomain O'] [IsDiscreteValuationRing O'] (pi' : O') (hpi' : Irreducible pi')179    (u' : (TwoSeries O')ˣ) (a' b' : ℕ) (ha' : 0 < a') (Λ : A →+* ConcreteSurface O' pi' u' a' b')180    (P : Ideal A) [P.IsPrime] (hP : ∀ x : A, x ∈ P ↔ Λ x ∈ surfaceParameterIdeal O' pi' u' a' b')181    (Λ' : CompletedLocalAt A P →+* ConcreteSurface O' pi' u' a' b')182    (hΛ' : ∀ x : A, Λ' (completedPointMap A P x) = Λ x) :183    ∀ y : CompletedLocalAt A P,184      y ∈ (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map185      (localCompletionMap (Localization.AtPrime P)) ↔186      Λ' y ∈ surfaceParameterIdeal O' pi' u' a' b' := by187  have : IsLocalRing (ConcreteSurface O' pi' u' a' b') :=188    concrete_surface_isLocalRing O' pi' u' a' b' hpi'.not_isUnit ha'189  have e2 : (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map190      (localCompletionMap (Localization.AtPrime P)) = P.map (completedPointMap A P) :=191    (congrArg (Ideal.map (localCompletionMap (Localization.AtPrime P)))192      (IsLocalization.AtPrime.map_eq_maximalIdeal P (Localization.AtPrime P)).symm).trans193      (Ideal.map_map _ _)194  intro y195  rw [e2]196  constructor197  · refine fun hy ↦ (Ideal.map_le_iff_le_comap.2 fun x hx ↦ ?_ :198      P.map (completedPointMap A P) ≤ (surfaceParameterIdeal O' pi' u' a' b').comap Λ') hy199    change Λ' (completedPointMap A P x) ∈ surfaceParameterIdeal O' pi' u' a' b'200    rw [hΛ']201    exact (hP x).1 hx202  · refine fun hy ↦ by_contra fun hn ↦ ?_203    have : IsNoetherianRing (Localization.AtPrime P) :=204      IsLocalization.isNoetherianRing P.primeCompl _ inferInstance205    have hu : IsUnit y := by_contra fun hnu ↦ hn <|206      AdicCompletion.maximalIdeal_eq_map.trans e2 ▸ (IsLocalRing.mem_maximalIdeal _).2 hnu207    rw [← concrete_surface_maximalIdeal_eq O' pi' hpi' u' a' b' ha'] at hy208    exact (IsLocalRing.mem_maximalIdeal _).1 hy (hu.map Λ')209 210/-! ### Regularity and dimension -/211 212/-- `(t, x)` is a regular parameter pair of the concrete surface. -/213theorem concrete_surface_regular_pair_tx (O : Type) [CommRing O] [IsDomain O] (pi : O)214    (hpi : pi ≠ 0) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a) :215    RegularParameterPair (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b) :=216      by217  have hP : MvPowerSeries.constantCoeff (surfaceRelation O pi u a b) ≠ 0 := by218    rw [surfaceRelation_constantCoeff O pi u a b ha]; exact hpi219  exact ⟨mvPowerSeries_quotient_var_regular (Fin 2) O 0 _ hP,220    mvPowerSeries_fin_two_quotient_var_regular_mod_var O 0 1 (by decide) _ hP⟩221 222/-- The concrete surface over a discrete valuation ring is a domain. -/223theorem concrete_surface_isDomain (O : Type) [CommRing O] [IsDomain O] [IsDiscreteValuationRing O]224    (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a) :225    IsDomain (ConcreteSurface O pi u a b) := by226  have : Nontrivial (ConcreteSurface O pi u a b) :=227    Ideal.Quotient.nontrivial_iff.mpr (surfaceIdeal_ne_top O pi u a b hpi.not_isUnit ha)228  have := concrete_surface_isNoetherianRing O pi u a b229  have := concrete_surface_isLocalRing O pi u a b hpi.not_isUnit ha230  have hp := concrete_surface_span_T_isPrime O pi hpi u a b ha231  exact isDomain_of_regular_prime_element _ (surfaceT O pi u a b)232    (concrete_surface_regular_pair_tx O pi hpi.ne_zero u a b ha).1 hp233    (Ideal.iInf_pow_eq_bot_of_isLocalRing _ hp.ne_top)234 235/-- A ring isomorphic to a concrete surface is a noetherian complete local domain. -/236theorem concrete_surface_equiv_instances (S : Type) [CommRing S] (O' : Type) [CommRing O']237    [IsDomain O'] [IsDiscreteValuationRing O'] (pi' : O') (hpi' : Irreducible pi')238    (u' : (TwoSeries O')ˣ) (a' b' : ℕ) (ha' : 0 < a') (Eq : S ≃+* ConcreteSurface O' pi' u' a' b') :239    IsNoetherianRing S ∧ IsDomain S ∧ ∃ _ : IsLocalRing S,240      IsAdicComplete (IsLocalRing.maximalIdeal S) S := by241  have := concrete_surface_isNoetherianRing O' pi' u' a' b'242  have := concrete_surface_isDomain O' pi' hpi' u' a' b' ha'243  have := concrete_surface_isLocalRing O' pi' u' a' b' hpi'.not_isUnit ha'244  have hC := concrete_surface_isAdicComplete_maximalIdeal O' pi' hpi' u' a' b' ha'245  refine ⟨isNoetherianRing_of_ringEquiv _ Eq.symm, Eq.toMulEquiv.isDomain, ?_⟩246  have : Nontrivial S := Eq.toEquiv.nontrivial247  have hLS : IsLocalRing S :=248    IsLocalRing.of_surjective' (Eq.symm : ConcreteSurface O' pi' u' a' b' →+* S) Eq.symm.surjective249  refine ⟨hLS, ?_⟩250  have : ((IsLocalRing.maximalIdeal (ConcreteSurface O' pi' u' a' b')).comap251      (Eq : S →+* _)).IsMaximal := Ideal.comap_isMaximal_of_surjective _ Eq.surjective252  have hm : (IsLocalRing.maximalIdeal (ConcreteSurface O' pi' u' a' b')).map Eq.symm =253      IsLocalRing.maximalIdeal S := by254    rw [← IsLocalRing.eq_maximalIdeal this]; exact Ideal.map_symm Eq255  rw [← hm]256  exact (IsAdicComplete.congr_ringEquiv257    (I := IsLocalRing.maximalIdeal (ConcreteSurface O' pi' u' a' b')) Eq.symm).mpr hC258 259/-- `(x, t)` is a regular parameter pair of the concrete surface. -/260theorem concrete_surface_regular_pair_xt (O : Type) [CommRing O] [IsDomain O] (pi : O)261    (hpi : pi ≠ 0) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a) :262    RegularParameterPair (ConcreteSurface O pi u a b) (surfaceX O pi u a b) (surfaceT O pi u a b) :=263      by264  have hP : MvPowerSeries.constantCoeff (surfaceRelation O pi u a b) ≠ 0 := by265    rw [surfaceRelation_constantCoeff O pi u a b ha]; exact hpi266  exact ⟨mvPowerSeries_quotient_var_regular (Fin 2) O 1 _ hP,267    mvPowerSeries_fin_two_quotient_var_regular_mod_var O 1 0 (by decide) _ hP⟩268 269/-- Regular parameter pairs transport along ring isomorphisms. -/270private theorem regularParameterPair_transport {S R : Type} [CommRing S] [CommRing R] (e : S ≃+* R)271    (t x : R)272    (h : RegularParameterPair R t x) :273    RegularParameterPair S (e.symm t) (e.symm x) := by274  obtain ⟨h1, h2⟩ := h275  refine ⟨fun a b hab ↦ ?_, ?_⟩276  · apply e.injective277    apply h1278    simpa using congrArg e hab279  · have hJ : Ideal.span {t} = (Ideal.span {e.symm t}).map e := by280      rw [Ideal.map_span]; simp281    let Q := Ideal.quotientEquiv (Ideal.span {e.symm t}) (Ideal.span {t}) e hJ282    intro a b hab283    apply Q.injective284    apply h2285    obtain ⟨a', rfl⟩ := Ideal.Quotient.mk_surjective a286    obtain ⟨b', rfl⟩ := Ideal.Quotient.mk_surjective b287    have hx : Q (Ideal.Quotient.mk (Ideal.span {e.symm t}) (e.symm x)) =288        Ideal.Quotient.mk (Ideal.span {t}) x := by289      change Ideal.Quotient.mk _ (e (e.symm x)) = _290      simp291    have hab' : Ideal.Quotient.mk (Ideal.span {e.symm t}) (e.symm x * a') =292        Ideal.Quotient.mk (Ideal.span {e.symm t}) (e.symm x * b') := by293      simpa only [map_mul] using hab294    change _ * Q _ = _ * Q _295    rw [← hx, ← map_mul, ← map_mul, hab']296    simp only [map_mul]297 298/-- In a ring isomorphic to a concrete surface, the images of `(t, x)` and `(x, t)` are regular299parameter pairs; in particular `t` is a non-zero-divisor. -/300theorem concrete_surface_equiv_regular_pair (S : Type) [CommRing S] (O' : Type) [CommRing O']301    [IsDomain O'] [IsDiscreteValuationRing O'] (pi' : O') (hpi' : Irreducible pi')302    (u' : (TwoSeries O')ˣ) (a' b' : ℕ) (ha' : 0 < a') (Eq : S ≃+* ConcreteSurface O' pi' u' a' b') :303    RegularParameterPair S (Eq.symm (surfaceT O' pi' u' a' b'))304      (Eq.symm (surfaceX O' pi' u' a' b')) ∧ RegularParameterPair S305      (Eq.symm (surfaceX O' pi' u' a' b')) (Eq.symm (surfaceT O' pi' u' a' b')) ∧ Function.Injective306      (fun y : S ↦ Eq.symm (surfaceT O' pi' u' a' b') * y) := by307  have h1 := regularParameterPair_transport Eq _ _308    (concrete_surface_regular_pair_tx O' pi' hpi'.ne_zero u' a' b' ha')309  exact ⟨h1, regularParameterPair_transport Eq _ _310    (concrete_surface_regular_pair_xt O' pi' hpi'.ne_zero u' a' b' ha'), h1.1⟩311 312/-- A regular sequence `t, x` with `R/(t, x)` nontrivial forces `2 ≤ dim R`. -/313private theorem two_le_ringKrullDim_of_regular_pair {R : Type} [CommRing R] (t x : R)314    (h1 : Function.Injective (fun a : R ↦ t*a))315    (h2 : Function.Injective316        (fun a : R ⧸ Ideal.span {t} ↦ Ideal.Quotient.mk (Ideal.span {t}) x * a))317    (hP : Nontrivial (R ⧸ Ideal.span {t, x})) :318    (2 : WithBot ℕ∞) ≤ ringKrullDim R := by319  have ht : t ∈ nonZeroDivisors R := mem_nonZeroDivisors_iff_right.2 fun z hz ↦320    h1 (by simp only [mul_zero]; rw [mul_comm]; exact hz)321  have hx : Ideal.Quotient.mk (Ideal.span {t}) x ∈ nonZeroDivisors (R ⧸ Ideal.span {t}) :=322    mem_nonZeroDivisors_iff_right.2 fun z hz ↦323      h2 (by simp only [mul_zero]; rw [mul_comm]; exact hz)324  let f1 : R ⧸ Ideal.span {t} →+* R ⧸ Ideal.span {t, x} :=325    Ideal.Quotient.factor (Ideal.span_mono (by simp))326  let f2 : (R ⧸ Ideal.span {t}) ⧸ Ideal.span {Ideal.Quotient.mk (Ideal.span {t}) x} →+*327      R ⧸ Ideal.span {t, x} :=328    Ideal.Quotient.lift _ f1 fun z hz ↦ by329      obtain ⟨c, rfl⟩ := Ideal.mem_span_singleton'.mp hz330      rw [map_mul, show f1 (Ideal.Quotient.mk (Ideal.span {t}) x) = 0 from331        Ideal.Quotient.eq_zero_iff_mem.2 (Ideal.subset_span (by simp)), mul_zero]332  have := f2.domain_nontrivial333  have k1 := ringKrullDim_quotient_succ_le_of_nonZeroDivisor ht334  have k2 := ringKrullDim_quotient_succ_le_of_nonZeroDivisor hx335  have k0 := ringKrullDim_nonneg_of_nontrivial336    (R := (R ⧸ Ideal.span {t}) ⧸ Ideal.span {Ideal.Quotient.mk (Ideal.span {t}) x})337  calc (2 : WithBot ℕ∞) = 0 + 1 + 1 := by norm_num338    _ ≤ ringKrullDim ((R ⧸ Ideal.span {t}) ⧸ Ideal.span {Ideal.Quotient.mk (Ideal.span {t}) x})339        + 1 + 1 := by gcongr340    _ ≤ ringKrullDim (R ⧸ Ideal.span {t}) + 1 := by gcongr341    _ ≤ _ := k1342 343/-- The concrete surface has Krull dimension at least `2`. -/344private theorem concrete_surface_two_le_ringKrullDim (O : Type) [CommRing O] [IsDomain O]345    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)346    (ha : 0 < a) :347    (2 : WithBot ℕ∞) ≤ ringKrullDim (ConcreteSurface O pi u a b) := by348  obtain ⟨h1, h2⟩ := concrete_surface_regular_pair_tx O pi hpi.ne_zero u a b ha349  obtain ⟨e, -⟩ := concrete_surface_quotient_parameters_equiv O pi hpi u a b ha350  exact two_le_ringKrullDim_of_regular_pair _ _ h1 h2 e.toRingHom.domain_nontrivial351 352/-- The concrete surface is a regular local ring. -/353theorem concrete_surface_isRegularLocalRing (O : Type) [CommRing O] [IsDomain O]354    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)355    (ha : 0 < a) :356    IsRegularLocalRing (ConcreteSurface O pi u a b) := by357  have : IsLocalRing (ConcreteSurface O pi u a b) :=358    concrete_surface_isLocalRing O pi u a b hpi.not_isUnit ha359  have := concrete_surface_isNoetherianRing O pi u a b360  apply IsRegularLocalRing.of_spanFinrank_maximalIdeal_le361  exact le_trans (by exact_mod_cast concrete_surface_spanFinrank_le_two O pi hpi u a b ha)362    (concrete_surface_two_le_ringKrullDim O pi hpi u a b ha)363 364/-- The concrete surface has Krull dimension `2`. -/365theorem concrete_surface_ringKrullDim_eq_two (O : Type) [CommRing O] [IsDomain O]366    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)367    (ha : 0 < a) :368    ringKrullDim (ConcreteSurface O pi u a b) = 2 := by369  have : IsLocalRing (ConcreteSurface O pi u a b) :=370    concrete_surface_isLocalRing O pi u a b hpi.not_isUnit ha371  refine le_antisymm ((ringKrullDim_le_spanFinrank_maximalIdeal _).trans ?_)372    (concrete_surface_two_le_ringKrullDim O pi hpi u a b ha)373  exact_mod_cast concrete_surface_spanFinrank_le_two O pi hpi u a b ha374 375/-- The concrete surface carries `SurfaceData` with uniformizer `π`, parameters `t, x`, unit376`u` and exponents `a, b`. -/377private theorem concrete_surface_data_exists (O : Type) [CommRing O] [IsDomain O]378    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)379    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a)380    [IsDomain (ConcreteSurface O pi u a b)] [IsRegularLocalRing (ConcreteSurface O pi u a b)] :381    ∃ S : SurfaceData O (ConcreteSurface O pi u a b),382      S.pi = pi ∧ S.t = surfaceT O pi u a b ∧ S.x = surfaceX O pi u a b ∧ S.unit =383      surfaceUnit O pi u a b ∧ S.a = a ∧ S.b = b := by384  obtain ⟨e, he⟩ := concrete_surface_residueField_equiv O pi hpi u a b ha385  exact ⟨{386    pi := pi387    pi_irreducible := hpi388    t := surfaceT O pi u a b389    x := surfaceX O pi u a b390    unit := surfaceUnit O pi u a b391    a := a392    b := b393    a_pos := ha394    parameters := (concrete_surface_maximalIdeal_eq O pi hpi u a b ha).symm395    dimension := concrete_surface_ringKrullDim_eq_two O pi hpi u a b ha396    complete := concrete_surface_isAdicComplete_maximalIdeal O pi hpi u a b ha397    base_injective := concrete_surface_base_injective O pi hpi u a b ha398    residueEquiv := e399    residue_compat := he400    vertical := concrete_surface_vertical O pi u a b }, rfl, rfl, rfl, rfl, rfl, rfl⟩401 402/-- The concrete surface is a regular local domain carrying `SurfaceData` with uniformizer `π`,403parameters `t, x`, unit `u` and exponents `a, b`. -/404theorem concrete_surface_data_exists_unconditional (O : Type) [CommRing O] [IsDomain O]405    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)406    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a) :407    ∃ (_ : IsDomain (ConcreteSurface O pi u a b))408      (_ : IsRegularLocalRing (ConcreteSurface O pi u a b)),409      ∃ D : SurfaceData O (ConcreteSurface O pi u a b),410      D.pi = pi ∧ D.t = surfaceT O pi u a b ∧ D.x = surfaceX O pi u a b ∧ D.unit =411      surfaceUnit O pi u a b ∧ D.a = a ∧ D.b = b := by412  have := concrete_surface_isDomain O pi hpi u a b ha413  have := concrete_surface_isRegularLocalRing O pi hpi u a b ha414  exact ⟨‹_›, ‹_›, concrete_surface_data_exists O pi hpi u a b ha⟩415 416/-! ### Curves on the concrete surface -/417 418/-- If `(p, f)` is a regular parameter pair, then `p` is a non-zero-divisor modulo `f`. -/419private theorem regular_pair_first_regular_mod_second (A : Type) [CommRing A] (p f : A)420    (h : RegularParameterPair A p f) :421    Function.Injective (fun v : A ⧸ Ideal.span {f} ↦ Ideal.Quotient.mk (Ideal.span {f}) p * v) :=422      by423  obtain ⟨h1, h2⟩ := h424  intro a b hab425  obtain ⟨a', rfl⟩ := Ideal.Quotient.mk_surjective a426  obtain ⟨b', rfl⟩ := Ideal.Quotient.mk_surjective b427  simp only at hab428  rw [← map_mul, ← map_mul, Ideal.Quotient.eq, ← mul_sub, Ideal.mem_span_singleton] at hab429  obtain ⟨w, hw⟩ := hab430  have hw0 : Ideal.Quotient.mk (Ideal.span {p}) f * Ideal.Quotient.mk (Ideal.span {p}) w431      = Ideal.Quotient.mk (Ideal.span {p}) f * 0 := by432    rw [mul_zero, ← map_mul, ← hw, Ideal.Quotient.eq_zero_iff_mem]433    exact Ideal.mem_span_singleton.2 (dvd_mul_right _ _)434  have := h2 hw0435  rw [Ideal.Quotient.eq_zero_iff_mem, Ideal.mem_span_singleton] at this436  obtain ⟨w1, rfl⟩ := this437  have : a' - b' = f * w1 := h1 (by simp only; rw [hw]; ring)438  rw [Ideal.Quotient.eq, this, Ideal.mem_span_singleton]439  exact dvd_mul_right _ _440 441/-- If `f` is a non-zero-divisor modulo `π` on the concrete surface, then `π` is a442non-zero-divisor modulo `f`. -/443private theorem concrete_surface_pi_regular_mod_curve (O : Type) [CommRing O] [IsDomain O]444    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)445    (f : ConcreteSurface O pi u a b)446    (hf : Function.Injective447      (fun w : ConcreteSurface O pi u a b ⧸ Ideal.span448      {algebraMap O (ConcreteSurface O pi u a b) pi} => Ideal.Quotient.mk449      (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi}) f * w)) :450    Function.Injective451      (fun v : ConcreteSurface O pi u a b ⧸ Ideal.span {f} ↦ Ideal.Quotient.mk (Ideal.span {f})452        (algebraMap O (ConcreteSurface O pi u a b) pi) * v) :=453  regular_pair_first_regular_mod_second _ _ _454    ⟨concrete_surface_pi_regular O pi hpi u a b, hf⟩455 456/-- For `f` regular modulo `π`, a family that is a basis modulo `π` lifts to an457`O`-basis of the curve ring `R/(f)`. -/458theorem concrete_surface_curve_basis (O : Type) [CommRing O] [IsDomain O]459    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)460    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a)461    (f : ConcreteSurface O pi u a b)462    (hf : Function.Injective463      (fun w : ConcreteSurface O pi u a b ⧸ Ideal.span464      {algebraMap O (ConcreteSurface O pi u a b) pi} => Ideal.Quotient.mk465      (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi}) f * w)) {N : ℕ}466    (β : Fin N → ConcreteSurface O pi u a b)467    (hβ : ResidueBasisFamily pi (fun i ↦ Ideal.Quotient.mk (Ideal.span {f}) (β i))) :468    ∃ B : Module.Basis (Fin N) O (ConcreteSurface O pi u a b ⧸ Ideal.span {f}), ∀ i,469      B i = Ideal.Quotient.mk (Ideal.span {f}) (β i) := by470  have := dvr_isAdicComplete_span_uniformizer O pi hpi471  have := concrete_surface_curve_isAdicComplete O pi hpi u a b ha f472  have hinj := concrete_surface_pi_regular_mod_curve O pi hpi u a b f hf473  refine residue_basis_family_basis O _ pi (fun m hm ↦ ?_) _ hβ474  have h2 : (Ideal.Quotient.mk (Ideal.span {f}))475      ((algebraMap O (ConcreteSurface O pi u a b)) pi) * m = 0 :=476    (Algebra.smul_def pi m).symm.trans hm477  exact hinj (h2.trans (mul_zero (M₀ := ConcreteSurface O pi u a b ⧸ Ideal.span {f}) _).symm)478 479/-- For `f` regular modulo `π`, a residue basis family of size `N` shows that480`R/(f)` is free of rank `N` over `O`. -/481private theorem concrete_surface_curve_free_finrank (O : Type) [CommRing O] [IsDomain O]482    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)483    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a)484    (f : ConcreteSurface O pi u a b)485    (hf : Function.Injective486      (fun w : ConcreteSurface O pi u a b ⧸ Ideal.span487      {algebraMap O (ConcreteSurface O pi u a b) pi} => Ideal.Quotient.mk488      (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi}) f * w)) {N : ℕ}489    (β : Fin N → ConcreteSurface O pi u a b)490    (hβ : ResidueBasisFamily pi (fun i ↦ Ideal.Quotient.mk (Ideal.span {f}) (β i))) :491    Module.Free O (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) ∧ Module.Finite O492      (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) ∧ Module.finrank O493      (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) = N := by494  obtain ⟨B, _⟩ := concrete_surface_curve_basis O pi hpi u a b ha f hf β hβ495  exact ⟨Module.Free.of_basis B, Module.Finite.of_basis B, by simp [Module.finrank_eq_card_basis B]⟩496 497/-- Over an `O`-algebra `R`, the kernel of the reduction `R/(f) → R/(π, f)` consists of the498multiples of `π`. -/499private theorem factor_span_pair_eq_zero_iff {O R : Type} [CommRing O] [CommRing R] [Algebra O R]500    (pi : O) (f : R) (hle : Ideal.span {f} ≤ Ideal.span {algebraMap O R pi, f})501    (m : R ⧸ Ideal.span {f}) :502    Ideal.Quotient.factorₐ O hle m = 0 ↔ ∃ w, m = pi • w := by503  have hsm (I : Ideal R) (r : R) : pi • Ideal.Quotient.mk I r =504      Ideal.Quotient.mk I (algebraMap O _ pi * r) :=505    congrArg (Ideal.Quotient.mk I) (Algebra.smul_def pi r)506  obtain ⟨r, rfl⟩ := Ideal.Quotient.mk_surjective m507  change Ideal.Quotient.mk _ r = 0 ↔ _508  rw [Ideal.Quotient.eq_zero_iff_mem, Ideal.mem_span_pair]509  constructor510  · rintro ⟨α, g, hr⟩511    refine ⟨Ideal.Quotient.mk _ α, ?_⟩512    rw [hsm, Ideal.Quotient.eq, ← hr]513    exact Ideal.mem_span_singleton.mpr ⟨g, by ring⟩514  · rintro ⟨w, hw⟩515    obtain ⟨α, rfl⟩ := Ideal.Quotient.mk_surjective w516    rw [hsm, Ideal.Quotient.eq, Ideal.mem_span_singleton'] at hw517    obtain ⟨g, hg⟩ := hw518    exact ⟨α, g, by rw [hg]; ring⟩519 520/-- For `f` regular modulo `π`, the curve ring `R/(f)` is free over `O` of rank521equal to the length of `R/(π, f)`. -/522theorem concrete_surface_curve_free_of_length (O : Type) [CommRing O] [IsDomain O]Lemma 2.1523    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)524    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a)525    (f : ConcreteSurface O pi u a b)526    (hf : Function.Injective527      (fun w : ConcreteSurface O pi u a b ⧸ Ideal.span528      {algebraMap O (ConcreteSurface O pi u a b) pi} => Ideal.Quotient.mk529      (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi}) f * w)) (N : ℕ)530    (hN : Module.length (ConcreteSurface O pi u a b)531      (ConcreteSurface O pi u a b ⧸ Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi, f}) =532      N) :533    Module.Free O (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) ∧ Module.Finite O534      (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) ∧ Module.finrank O535      (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) = N := by536  have : IsLocalRing (ConcreteSurface O pi u a b) :=537      concrete_surface_isLocalRing O pi u a b hpi.not_isUnit ha538  obtain ⟨e, he⟩ := concrete_surface_residueField_equiv O pi hpi u a b ha539  have hsurj : ∀ r : (ConcreteSurface O pi u a b), ∃ c : O,540      r - algebraMap O (ConcreteSurface O pi u a b) c ∈ IsLocalRing.maximalIdeal541      (ConcreteSurface O pi u a b) := by542    intro r543    obtain ⟨k, hk⟩ := e.surjective (IsLocalRing.residue (ConcreteSurface O pi u a b) r)544    obtain ⟨c, rfl⟩ := IsLocalRing.residue_surjective k545    exact ⟨c, by rw [← IsLocalRing.residue_eq_zero_iff, map_sub, ← he, hk, sub_self]⟩546  have hker : ∀ c : O,547      algebraMap O (ConcreteSurface O pi u a b) c ∈ IsLocalRing.maximalIdeal548      (ConcreteSurface O pi u a b) → pi ∣ c := by549    intro c hc550    rwa [← IsLocalRing.residue_eq_zero_iff, ← he, map_eq_zero_iff e e.injective,551      IsLocalRing.residue_eq_zero_iff, hpi.maximalIdeal_eq, Ideal.mem_span_singleton] at hc552  have hsm : ∀ (I : Ideal (ConcreteSurface O pi u a b)) (r : ConcreteSurface O pi u a b),553      pi • Ideal.Quotient.mk I r = Ideal.Quotient.mk I (algebraMap O _ pi * r) :=554    fun I r ↦ congrArg (Ideal.Quotient.mk I) (Algebra.smul_def pi r)555  have hpiM : ∀ m :556      (ConcreteSurface O pi u a b ⧸ Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi, f}),557      pi • m = 0 := by558    intro m559    obtain ⟨r, rfl⟩ := Ideal.Quotient.mk_surjective m560    rw [hsm, Ideal.Quotient.eq_zero_iff_mem]561    exact Ideal.mul_mem_right _ _ (Ideal.subset_span (Set.mem_insert _ _))562  obtain ⟨γ, hγ⟩ := residue_basis_family_of_length O (ConcreteSurface O pi u a b)563      ((ConcreteSurface O pi u a b ⧸ Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi, f}))564      pi hsurj hker hpiM N hN565  have hle : Ideal.span {f} ≤ Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi, f} :=566      Ideal.span_mono (by simp)567  let q : ((ConcreteSurface O pi u a b) ⧸ Ideal.span {f}) →ₗ[O]568      ((ConcreteSurface O pi u a b ⧸ Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi, f}))569      := (Ideal.Quotient.factorₐ O hle).toLinearMap570  have hq : Function.Surjective q := Ideal.Quotient.factor_surjective hle571  obtain ⟨β₀, -, hβ₀⟩ :=572    residue_basis_family_lift_along_reduction O ((ConcreteSurface O pi u a b) ⧸ Ideal.span {f})573        ((ConcreteSurface O pi u a b ⧸ Ideal.span574          {algebraMap O (ConcreteSurface O pi u a b) pi, f})) pi q hq575          (factor_span_pair_eq_zero_iff pi f hle) γ hγ576  choose β hβ using fun i ↦ Ideal.Quotient.mk_surjective (β₀ i)577  have hfun : (fun i ↦ Ideal.Quotient.mk (Ideal.span {f}) (β i)) = β₀ := funext hβ578  exact concrete_surface_curve_free_finrank O pi hpi u a b ha f hf β (hfun ▸ hβ₀)579 580/-! ### Evaluation on completed charts -/581 582/-- Elements of `P` map into the maximal ideal of the completion at `P`. -/583private theorem completedPointMap_mem_maximalIdeal (A : Type) [CommRing A] [IsNoetherianRing A]584    (P : Ideal A) [P.IsPrime] (x : A) (hx : x ∈ P) :585    completedPointMap A P x ∈ IsLocalRing.maximalIdeal (CompletedLocalAt A P) := by586  have h1 : algebraMap A (Localization.AtPrime P) x ∈587      IsLocalRing.maximalIdeal (Localization.AtPrime P) := by588    rw [← IsLocalization.AtPrime.map_eq_maximalIdeal P (Localization.AtPrime P)]589    exact Ideal.mem_map_of_mem _ hx590  rw [IsLocalRing.mem_maximalIdeal, mem_nonunits_iff] at h1 ⊢591  intro hu592  exact h1 ((isUnit_map_iff (algebraMap (Localization.AtPrime P)593    (AdicCompletion (IsLocalRing.maximalIdeal (Localization.AtPrime P))594      (Localization.AtPrime P))) _).mp hu)595 596/-- Elements of `I` are nilpotent modulo `I ^ n`. -/597private theorem isNilpotent_mk_pow_of_mem (S : Type) [CommRing S] (I : Ideal S) (n : ℕ) (y : S)598    (hy : y ∈ I) : IsNilpotent (Ideal.Quotient.mk (I ^ n) y) :=599  ⟨n, by rw [← map_pow, Ideal.Quotient.eq_zero_iff_mem]; exact Ideal.pow_mem_pow hy n⟩600 601/-- General form of `child_series_eval_comp_chart_subst` for an arbitrary quotient map602`sm : O[[T,X]] → R`. -/603private theorem eval_comp_chart_eq (O O' R : Type) [CommRing O] [CommRing O'] [CommRing R]604    (sm : TwoSeries O →+* R) (E F : TwoSeries O)605    (hEF : (E = axisT O ∧ F = axisX O) ∨ (E = axisX O ∧ F = axisT O))606    (P : Ideal (BlowupChart R (sm E) (sm F))) [P.IsPrime]607    [IsNoetherianRing (BlowupChart R (sm E) (sm F))]608    (hE : chartBase R (sm E) (sm F) (sm E) ∈ P) (hF : chartBase R (sm E) (sm F) (sm F) ∈ P)609    (ρ : O →+* O') (α : O') (s : TwoSeries O →+* TwoSeries O')610    (hsC : ∀ c : O, s (MvPowerSeries.C c) = MvPowerSeries.C (ρ c)) (hsE : s E = axisT O')611    (hsF : s F = axisT O' * (axisX O' + MvPowerSeries.C α))612    (κ : O' →+* CompletedLocalAt (BlowupChart R (sm E) (sm F)) P)613    (hκ : ∀ c : O, κ (ρ c) = completedPointMap (BlowupChart R (sm E) (sm F)) P614      (chartBase R (sm E) (sm F) (sm (MvPowerSeries.C c))))615    (Θ : TwoSeries O' →+* CompletedLocalAt (BlowupChart R (sm E) (sm F)) P)616    (hΘC : ∀ c : O', Θ (MvPowerSeries.C c) = κ c)617    (hΘT : Θ (axisT O') = completedPointMap (BlowupChart R (sm E) (sm F)) P618      (chartBase R (sm E) (sm F) (sm E)))619    (hΘX : Θ (axisX O') = completedPointMap (BlowupChart R (sm E) (sm F)) P620      (chartSlope R (sm E) (sm F)) - κ α) :621    Θ.comp s = (completedPointMap (BlowupChart R (sm E) (sm F)) P).comp622      ((chartBase R (sm E) (sm F)).comp sm) := by623  set A := BlowupChart R (sm E) (sm F)624  set cb := chartBase R (sm E) (sm F)625  set cp := completedPointMap A P626  set m := IsLocalRing.maximalIdeal (CompletedLocalAt A P)627  have gC (c : O) : Θ (s (.C c)) = cp (cb (sm (.C c))) := by rw [hsC, hΘC, hκ]628  have gE : Θ (s E) = cp (cb (sm E)) := by rw [hsE, hΘT]629  have gF : Θ (s F) = cp (cb (sm F)) := by630    rw [hsF, map_mul, map_add, hΘT, hΘX, hΘC, sub_add_cancel, ← map_mul, blowup_chart_relation]631  -- the variables `T, X` are `E, F` in some order632  have hG (G : TwoSeries O) (hG : G = E ∨ G = F) :633      Θ (s G) = cp (cb (sm G)) ∧ cp (cb (sm G)) ∈ m := by634    rcases hG with rfl | rfl635    exacts [⟨gE, completedPointMap_mem_maximalIdeal A P _ hE⟩,636      ⟨gF, completedPointMap_mem_maximalIdeal A P _ hF⟩]637  obtain ⟨gT, nT⟩ := hG (axisT O) (by rcases hEF with ⟨h1, h2⟩ | ⟨h1, h2⟩ <;> simp [h1, h2])638  obtain ⟨gX, nX⟩ := hG (axisX O) (by rcases hEF with ⟨h1, h2⟩ | ⟨h1, h2⟩ <;> simp [h1, h2])639  refine DFunLike.coe_injective (IsHausdorff.funext' m fun n r ↦ ?_)640  have key := twoSeries_ringHom_ext_of_isNilpotent O _641    ((Ideal.Quotient.mk (m ^ n)).comp (Θ.comp s))642    ((Ideal.Quotient.mk (m ^ n)).comp (cp.comp (cb.comp sm))) (fun c ↦ congrArg _ (gC c))643    (congrArg _ gT) (congrArg _ gX)644    (by simpa only [RingHom.comp_apply, gT] using isNilpotent_mk_pow_of_mem _ m n _ nT)645    (by simpa only [RingHom.comp_apply, gX] using isNilpotent_mk_pow_of_mem _ m n _ nX)646  exact congrArg (· r) key647 648/-- The evaluation `Θ` of the child power series, composed with the chart substitution `s`,649agrees with the canonical map from `O[[T,X]]` through the chart to its completion at `P`. -/650theorem child_series_eval_comp_chart_subst (O O' : Type) [CommRing O] [IsNoetherianRing O]651    [CommRing O'] (pi : O) (u : (TwoSeries O)ˣ) (a b : ℕ) (E F : TwoSeries O)652    (hEF : (E = axisT O ∧ F = axisX O) ∨ (E = axisX O ∧ F = axisT O))653    (P : Ideal654      (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)))655    [P.IsPrime]656    (hE : chartBase (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)657      (surfaceMk O pi u a b E) ∈ P)658    (hF : chartBase (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)659      (surfaceMk O pi u a b F) ∈ P) (ρ : O →+* O') (α : O') (s : TwoSeries O →+* TwoSeries O')660    (hsC : ∀ c : O, s (MvPowerSeries.C c) = MvPowerSeries.C (ρ c)) (hsE : s E = axisT O')661    (hsF : s F = axisT O' * (axisX O' + MvPowerSeries.C α))662    (κ : O' →+* CompletedLocalAt663      (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F))664      P) (hκ : ∀ c : O,665      κ (ρ c) = completedPointMap666      (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)) P667      (chartBase (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)668      (algebraMap O (ConcreteSurface O pi u a b) c)))669    (Θ : TwoSeries O' →+* CompletedLocalAt670      (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F))671      P) (hΘC : ∀ c : O', Θ (MvPowerSeries.C c) = κ c)672    (hΘT : Θ (axisT O') = completedPointMap673      (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)) P674      (chartBase (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)675      (surfaceMk O pi u a b E)))676    (hΘX : Θ (axisX O') = completedPointMap677      (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)) P678      (chartSlope (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F))679      - κ α) :680    Θ.comp s =681      (completedPointMap682        (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F))683        P).comp ((chartBase (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E)684        (surfaceMk O pi u a b F)).comp (surfaceMk O pi u a b)) := by685  have : IsNoetherianRing (BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E)686      (surfaceMk O pi u a b F)) :=687    blowupChart_concrete_isNoetherianRing O pi u a b _ _688  exact eval_comp_chart_eq O O' _ (surfaceMk O pi u a b) E F hEF P hE hF ρ α s hsC hsE hsF κ689    (fun c ↦ (hκ c).trans rfl) Θ hΘC hΘT hΘX690 691end SurfaceBlowup