Lean sources / SurfaceBlowup / Surfaces / ChartCompletions.lean

Completions of the blow-up charts of the concrete surface

894 lines · 7 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.CurveOrders7import SurfaceBlowup.Surfaces.Regularity8 9/-!10# Completions of the blow-up charts of the concrete surface11 12Let `R = O[[T,X]]/(π - u T^a X^b)` be the concrete surface and `R[x/t]`, `R[t/x]` the two charts13of its blow-up at the closed point. We show that the completed local rings of these charts at14the closed points of the exceptional divisor are again concrete surfaces (over `O` at rational15points, over the unramified extension `O[θ]` at non-rational points).16 17## Main results18 19* `chart_child_completion_equiv`: the general completion isomorphism for a chart map.20* `t_chart_nonrational_point_completion_equiv`, `t_chart_origin_completion_equiv`,21  `t_chart_unit_point_completion_equiv`, `x_chart_infinity_completion_equiv`.22* `concrete_residue_ideal_chart_exists`: lifting curves of the special fiber.23 24Provenance: `chart_child_{completion_equiv, map_exists}`, `concrete_residue_ideal_chart_exists`,25`chart_point_quotient_adjoinRoot_equiv`, `chart_{nonrational,rational}_point_span_eq_comap`,26`nonrational_point_{derivative_isUnit_mod, hensel_root}`,27`t_chart_{nonrational_point, origin, unit_point}_completion_equiv`,28`x_chart_infinity_completion_equiv`.29-/30 31 32namespace SurfaceBlowup33 34/-! ### Notation35 36Local notations for the charts of the blow-up of `R = ConcreteSurface O pi u a b` at its37closed point, taking the surface data as explicit arguments. -/38 39/-- The `t`-chart `R[x/t]` of the blow-up of the concrete surface `R` at `(t, x)`. -/40local notation:max "tChart" O:max pi:max u:max a:max b:max =>41  BlowupChart (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b)42 43/-- The structure map `R → R[x/t]` of the `t`-chart. -/44local notation:max "tBase" O:max pi:max u:max a:max b:max =>45  chartBase (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b)46 47/-- The slope `x/t` in the `t`-chart. -/48local notation:max "tSlope" O:max pi:max u:max a:max b:max =>49  chartSlope (ConcreteSurface O pi u a b) (surfaceT O pi u a b) (surfaceX O pi u a b)50 51/-- The `x`-chart `R[t/x]` of the blow-up of the concrete surface `R` at `(t, x)`. -/52local notation:max "xChart" O:max pi:max u:max a:max b:max =>53  BlowupChart (ConcreteSurface O pi u a b) (surfaceX O pi u a b) (surfaceT O pi u a b)54 55/-- The structure map `R → R[t/x]` of the `x`-chart. -/56local notation:max "xBase" O:max pi:max u:max a:max b:max =>57  chartBase (ConcreteSurface O pi u a b) (surfaceX O pi u a b) (surfaceT O pi u a b)58 59/-- The slope `t/x` in the `x`-chart. -/60local notation:max "xSlope" O:max pi:max u:max a:max b:max =>61  chartSlope (ConcreteSurface O pi u a b) (surfaceX O pi u a b) (surfaceT O pi u a b)62 63/-- The chart `R[f/e]` of the concrete surface `R`, where `e, f` are the images of `E, F`. -/64local notation:max "efChart" O:max pi:max u:max a:max b:max E:max F:max =>65  BlowupChart (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)66 67/-- The structure map `R → R[f/e]`. -/68local notation:max "efBase" O:max pi:max u:max a:max b:max E:max F:max =>69  chartBase (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)70 71/-- The slope `f/e` in the chart `R[f/e]`. -/72local notation:max "efSlope" O:max pi:max u:max a:max b:max E:max F:max =>73  chartSlope (ConcreteSurface O pi u a b) (surfaceMk O pi u a b E) (surfaceMk O pi u a b F)74 75/-- The child surface over `O[θ] = O[X]/(Φ)` at a non-rational point of the exceptional divisor. -/76local notation:max "childSurface" O:max pi:max u:max a:max b:max Φ:max hθ:max =>77  ConcreteSurface (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)78      (substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)79        (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)80        (AdjoinRoot.root Φ) hθ ^ b) (a + b) 081 82/-- The unit of the child surface over `O[θ] = O[X]/(Φ)` at a non-rational point. -/83local notation:max "childUnit" O:max u:max b:max Φ:max hθ:max =>84  substUnit (AdjoinRoot Φ) (AdjoinRoot.root Φ)85      (baseChangeUnit O (algebraMap O (AdjoinRoot Φ)) u) * shiftUnit (AdjoinRoot Φ)86      (AdjoinRoot.root Φ) hθ ^ b87 88/-! ### Completions of charts at closed points -/89 90/-- An endomorphism of the completed local ring of a noetherian ring `A` at a maximal ideal `P`91that fixes the image of `A` and preserves the maximal ideal is the identity. -/92private theorem completedLocalAt_ringHom_eq_id (A : Type) [CommRing A] [IsNoetherianRing A]93    (P : Ideal A) [P.IsMaximal] (φ : CompletedLocalAt A P →+* CompletedLocalAt A P)94    (hφ : φ.comp (completedPointMap A P) = completedPointMap A P)95    (hle : IsLocalRing.maximalIdeal (CompletedLocalAt A P) ≤96      (IsLocalRing.maximalIdeal (CompletedLocalAt A P)).comap φ) :97    φ = RingHom.id _ := by98  have : IsNoetherianRing (Localization.AtPrime P) :=99    IsLocalization.isNoetherianRing P.primeCompl _ inferInstance100  set M := IsLocalRing.maximalIdeal (CompletedLocalAt A P)101  have hmhat : M = (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map102      (localCompletionMap (Localization.AtPrime P)) := AdicCompletion.maximalIdeal_eq_map103  refine RingHom.ext <| congrFun <| IsHausdorff.funext' M (f := fun y => φ y)104    (g := fun y => y) fun n y => ?_105  obtain ⟨x, hx⟩ := finite_completed_point_quotient_surjective A P n (M ^ n) (by rw [hmhat])106    (Ideal.Quotient.mk _ y)107  rw [RingHom.comp_apply] at hx108  have h : φ (completedPointMap A P x - y) ∈ M ^ n :=109    (Ideal.pow_right_mono hle n).trans (Ideal.le_comap_pow φ n) (Ideal.Quotient.eq.mp hx)110  rw [map_sub, ← RingHom.comp_apply φ, hφ] at h111  exact (Ideal.Quotient.eq.mpr h).symm.trans hx112 113/-- Let `Λ : R[f/e] → R'` be a chart map to a concrete surface `R'` over `O'`, compatible with a114substitution `s : O[[T,X]] → O'[[T,X]]` (`E ↦ T`, `F ↦ T (X + α)`), and surjective modulo the115parameter ideal. Then the completion of `R[f/e]` at `P = Λ⁻¹(t', x')` is isomorphic to `R'`. -/116theorem chart_child_completion_equiv (O O' : Type) [CommRing O] [IsNoetherianRing O] [CommRing O']117    [IsDomain O'] [IsDiscreteValuationRing O'] (pi : O) (u : (TwoSeries O)ˣ) (a b : ℕ) (pi' : O')118    (hpi' : Irreducible pi') (u' : (TwoSeries O')ˣ) (a' b' : ℕ) (ha' : 0 < a') (E F : TwoSeries O)119    (hEF : (E = axisT O ∧ F = axisX O) ∨ (E = axisX O ∧ F = axisT O)) (ρ : O →+* O') (α : O')120    (s : TwoSeries O →+* TwoSeries O')121    (hsC : ∀ c : O, s (MvPowerSeries.C c) = MvPowerSeries.C (ρ c)) (hsE : s E = axisT O')122    (hsF : s F = axisT O' * (axisX O' + MvPowerSeries.C α))123    (hs : s (surfaceRelation O pi u a b) = surfaceRelation O' pi' u' a' b')124    (Λ : efChart O pi u a b E F →+* ConcreteSurface O' pi' u' a' b')125    (hΛ : ∀ g : TwoSeries O, Λ (efBase O pi u a b E F (surfaceMk O pi u a b g)) =126        surfaceMk O' pi' u' a' b' (s g))127    (hΛZ : Λ (efSlope O pi u a b E F) = surfaceX O' pi' u' a' b' + algebraMap O'128        (ConcreteSurface O' pi' u' a' b') α)129    (P : Ideal (efChart O pi u a b E F)) [P.IsPrime] (hP : ∀ x, x ∈ P ↔ Λ x ∈ surfaceParameterIdeal130        O' pi' u' a' b')131    (hsurj : ∀ y : ConcreteSurface O' pi' u' a' b', ∃ x : efChart O pi u a b E F,132      Λ x - y ∈ surfaceParameterIdeal O' pi' u' a' b')133    (Λ' : CompletedLocalAt (efChart O pi u a b E F) P →+* ConcreteSurface O' pi' u' a' b')134    (hΛ' : ∀ x, Λ' (completedPointMap (efChart O pi u a b E F) P x) = Λ x)135        (κ : O' →+* CompletedLocalAt (efChart O pi u a b E F) P)136    (hκ : ∀ c : O', Λ' (κ c) = algebraMap O' (ConcreteSurface O' pi' u' a' b') c)137    (hκρ : ∀ c : O,138      κ (ρ c) = completedPointMap (efChart O pi u a b E F) P139      (efBase O pi u a b E F (algebraMap O (ConcreteSurface O pi u a b) c))) :140    ∃ Eq : CompletedLocalAt (efChart O pi u a b E F) P ≃+* ConcreteSurface O' pi' u' a' b',141      (∀ y, Eq y = Λ' y) ∧ ∀ c : O',142      Eq.symm (algebraMap O' (ConcreteSurface O' pi' u' a' b') c) = κ c := by143  have : IsNoetherianRing (efChart O pi u a b E F) :=144    blowupChart_concrete_isNoetherianRing O pi u a b _ _145  have : IsNoetherianRing (Localization.AtPrime P) :=146    IsLocalization.isNoetherianRing P.primeCompl _ inferInstance147  have : IsLocalRing (ConcreteSurface O' pi' u' a' b') :=148    concrete_surface_isLocalRing O' pi' u' a' b' hpi'.not_isUnit ha'149  have hm := concrete_surface_maximalIdeal_eq O' pi' hpi' u' a' b' ha'150  have := concrete_surface_isAdicComplete_maximalIdeal O' pi' hpi' u' a' b' ha'151  set M := IsLocalRing.maximalIdeal (CompletedLocalAt (efChart O pi u a b E F) P) with hM152  have hmhat : M = (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map153      (localCompletionMap (Localization.AtPrime P)) := AdicCompletion.maximalIdeal_eq_map154  have hmem : ∀ y, y ∈ M ↔ Λ' y ∈ surfaceParameterIdeal O' pi' u' a' b' := by155    rw [hmhat]; exact chart_child_completion_map_local _ O' pi' hpi' u' a' b' ha' Λ P hP Λ' hΛ'156  have hTmem : surfaceT O' pi' u' a' b' ∈ surfaceParameterIdeal O' pi' u' a' b' :=157    Ideal.subset_span (by simp)158  have hXmem : surfaceX O' pi' u' a' b' ∈ surfaceParameterIdeal O' pi' u' a' b' :=159    Ideal.subset_span (by simp)160  -- The images `e` of `E` and `z = f/e - α` in the completion lie in its maximal ideal `M`.161  set e := completedPointMap _ P (efBase O pi u a b E F (surfaceMk O pi u a b E)) with he_def162  set z := completedPointMap _ P (efSlope O pi u a b E F) - κ α with hz_def163  have hΛE : Λ (efBase O pi u a b E F (surfaceMk O pi u a b E)) = surfaceT O' pi' u' a' b' := by164    rw [hΛ, hsE]; rfl165  have hΛ'e : Λ' e = surfaceT O' pi' u' a' b' := by rw [hΛ', hΛE]166  have hΛ'z : Λ' z = surfaceX O' pi' u' a' b' := by rw [map_sub, hΛ', hΛZ, hκ]; ring167  have he : e ∈ M := by rw [hmem, hΛ'e]; exact hTmem168  have hz : z ∈ M := by rw [hmem, hΛ'z]; exact hXmem169  -- Evaluating `T ↦ e`, `X ↦ z` gives an inverse candidate `Θ : R' → completion`.170  obtain ⟨Θt, hΘC, hΘT, hΘX⟩ := twoSeries_eval_exists_of_isAdicComplete _ M O' κ _ _ he hz171  have hcomp : ∀ g,172      Θt (s g) = completedPointMap _ P (efBase O pi u a b E F (surfaceMk O pi u a b g)) :=173    congrFun <| congrArg DFunLike.coe <| child_series_eval_comp_chart_subst O O' pi u a b E F hEF174      P (by rw [hP, hΛE]; exact hTmem)175      (by rw [hP, hΛ, hsF, map_mul]; exact Ideal.mul_mem_right _ _ hTmem) ρ α s hsC hsE hsF κ hκρ176      Θt hΘC hΘT hΘX177  have hrel : Θt (surfaceRelation O' pi' u' a' b') = 0 := by178    have : surfaceMk O pi u a b (surfaceRelation O pi u a b) = 0 :=179      Ideal.Quotient.eq_zero_iff_mem.2 (Ideal.mem_span_singleton_self _)180    rw [← hs, hcomp, this, map_zero, map_zero]181  let Θ : ConcreteSurface O' pi' u' a' b' →+* CompletedLocalAt (efChart O pi u a b E F) P :=182    Ideal.Quotient.lift (surfaceIdeal O' pi' u' a' b') Θt fun r hr => by183      obtain ⟨q, rfl⟩ := Ideal.mem_span_singleton'.1 hr184      rw [map_mul, hrel, mul_zero]185  have hΘmk : ∀ g, Θ (surfaceMk O' pi' u' a' b' g) = Θt g := fun g => Ideal.Quotient.lift_mk _ _ _186  have hΘalg : ∀ c : O', Θ (algebraMap O' (ConcreteSurface O' pi' u' a' b') c) = κ c :=187    fun c => (hΘmk _).trans (hΘC c)188  have hΘT' : Θ (surfaceT O' pi' u' a' b') = e := (hΘmk _).trans hΘT189  have hΘX' : Θ (surfaceX O' pi' u' a' b') = z := (hΘmk _).trans hΘX190  -- `Λ' ∘ Θ = id`, checked modulo each power of the maximal ideal of `R'`.191  have h5 : Λ'.comp Θ = RingHom.id _ := by192    refine RingHom.ext <| congrFun <| IsHausdorff.funext' (IsLocalRing.maximalIdeal _)193      (f := fun r => Λ' (Θ r)) (g := fun r => r) fun n r => ?_194    let Q := IsLocalRing.maximalIdeal (ConcreteSurface O' pi' u' a' b') ^ n195    refine DFunLike.congr_fun (concrete_surface_ringHom_ext_of_isNilpotent O'196      (ConcreteSurface O' pi' u' a' b' ⧸ Q) pi' u' a' b' ((Ideal.Quotient.mk Q).comp (Λ'.comp Θ))197      (Ideal.Quotient.mk Q) ?_ ?_ ?_ ?_ ?_) r198    all_goals simp only [RingHom.comp_apply, hΘalg, hκ, hΘT', hΘX', hΛ'e, hΛ'z, implies_true]199    all_goals refine ⟨n, ?_⟩200    all_goals rw [← map_pow, Ideal.Quotient.eq_zero_iff_mem]201    exacts [Ideal.pow_mem_pow (hm ▸ hTmem) n, Ideal.pow_mem_pow (hm ▸ hXmem) n]202  -- `Θ ∘ Λ' = id`, checked modulo each power of `M`, using that `P` is maximal.203  have hPe : (IsLocalRing.maximalIdeal _).comap Λ = P := by ext x; rw [Ideal.mem_comap, hm, hP]204  have : P.IsMaximal := by205    rw [← hPe]; exact chart_point_isMaximal_of_residue_surjective _ _ Λ (hm ▸ hsurj)206  have hfix : Θ.comp Λ = completedPointMap _ P := by207    apply blowup_chart_ringHom_ext208    · intro r209      obtain ⟨g, rfl⟩ := Ideal.Quotient.mk_surjective r210      change Θ (Λ (chartBase _ _ _ (surfaceMk O pi u a b g))) = _211      rw [hΛ, hΘmk, hcomp]; rfl212    · change Θ (Λ _) = _213      rw [hΛZ, map_add, hΘalg, hΘX', hz_def]; ring214  have hle : M ≤ M.comap (Θ.comp Λ') := fun y hy => by215    refine (Ideal.span_le (I := M.comap Θ)).2 ?_ ((hmem y).1 hy)216    rintro w (rfl | rfl) <;> simp only [SetLike.mem_coe, Ideal.mem_comap, hΘT', hΘX', he, hz]217  have h6 : Θ.comp Λ' = RingHom.id _ :=218    completedLocalAt_ringHom_eq_id _ P _ (RingHom.ext fun x => by219      simp only [RingHom.comp_apply, hΛ' x]; exact DFunLike.congr_fun hfix x) hle220  exact ⟨RingEquiv.ofRingHom Λ' Θ h5 h6, fun y => rfl, hΘalg⟩221 222/-- A substitution `s : O[[T,X]] → O'[[T,X]]` with `E ↦ T`, `F ↦ T (X + α)` that maps the223relation of `R` into the relation ideal of `R'` induces a chart map `R[f/e] → R'` with224`f/e ↦ x' + α`. -/225private theorem chart_child_map_exists (O O' : Type) [CommRing O] [CommRing O'] (pi : O)226    (u : (TwoSeries O)ˣ) (a b : ℕ) (pi' : O') (u' : (TwoSeries O')ˣ) (a' b' : ℕ) (E F : TwoSeries O)227    (s : TwoSeries O →+* TwoSeries O')228    (hs : s (surfaceRelation O pi u a b) ∈ surfaceIdeal O' pi' u' a' b') (α : O')229    (hE : s E = axisT O') (hF : s F = axisT O' * (axisX O' + MvPowerSeries.C α)) :230    ∃ Λ : efChart O pi u a b E F →+* ConcreteSurface O' pi' u' a' b',231      (∀ g : TwoSeries O, Λ (efBase O pi u a b E F (surfaceMk O pi u a b g)) =232          surfaceMk O' pi' u' a' b' (s g)) ∧233      Λ (efSlope O pi u a b E F) = surfaceX O' pi' u' a' b' + algebraMap O'234          (ConcreteSurface O' pi' u' a' b') α := by235  have hk : ∀ x ∈ surfaceIdeal O pi u a b, (surfaceMk O' pi' u' a' b') (s x) = 0 := by236    intro x hx237    obtain ⟨h, rfl⟩ := Ideal.mem_span_singleton.mp hx238    rw [map_mul, map_mul]239    have : (surfaceMk O' pi' u' a' b') (s (surfaceRelation O pi u a b)) = 0 :=240      Ideal.Quotient.eq_zero_iff_mem.mpr hs241    rw [this, zero_mul]242  let σ : ConcreteSurface O pi u a b →+* ConcreteSurface O' pi' u' a' b' :=243    Ideal.Quotient.lift _ ((surfaceMk O' pi' u' a' b').comp s) hk244  have hσ : ∀ g, σ (surfaceMk O pi u a b g) = surfaceMk O' pi' u' a' b' (s g) := fun g =>245    Ideal.Quotient.lift_mk _ _ _246  have hC : surfaceMk O' pi' u' a' b' (MvPowerSeries.C α) = algebraMap O'247      (ConcreteSurface O' pi' u' a' b') α := rfl248  obtain ⟨psi, h1, h2⟩ := blowup_chart_universal (ConcreteSurface O pi u a b)249      (ConcreteSurface O' pi' u' a' b')250    (surfaceMk O pi u a b E) (surfaceMk O pi u a b F) σ251    (surfaceX O' pi' u' a' b' + algebraMap O' (ConcreteSurface O' pi' u' a' b') α) (by252      rw [hσ, hσ, hE, hF, map_mul, map_add, hC]; rfl)253  exact ⟨psi, fun g => by rw [h1, hσ], h2⟩254 255/-- Every non-unit, non-zero-divisor `f̄` of the special fiber lifts to an ideal chart of the256concrete surface whose reduction generates the same ideal as `f̄`. -/257theorem concrete_residue_ideal_chart_exists (O : Type) [CommRing O] [IsDomain O]258    [IsDiscreteValuationRing O] [IsAdicComplete (IsLocalRing.maximalIdeal O) O] (pi : O)259    (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ) (ha : 0 < a)260    (e : (ConcreteSurface O pi u a b ⧸ Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi})261      ≃+* SpecialFiber (IsLocalRing.ResidueField O) a b)262    (fbar : SpecialFiber (IsLocalRing.ResidueField O) a b) (hunit : ¬ IsUnit fbar)263    (hreg : Function.Injective (fun w : SpecialFiber (IsLocalRing.ResidueField O) a b => fbar * w))264    (N : ℕ) (hN : Module.length (SpecialFiber (IsLocalRing.ResidueField O) a b)265      (SpecialFiber (IsLocalRing.ResidueField O) a b ⧸ Ideal.span {fbar}) = N) :266    ∃ ch : IdealChart O (ConcreteSurface O pi u a b) pi N,267      Ideal.span268      {e ((Ideal.Quotient.mk (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi})) ch.f)} =269      Ideal.span {fbar} := by270  obtain ⟨q, hq⟩ := e.surjective fbar271  obtain ⟨f, rfl⟩ := Ideal.Quotient.mk_surjective q272  have hfu : ¬ IsUnit f := fun h => hunit273      (hq ▸ (h.map274        (Ideal.Quotient.mk (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi}))).map e)275  have hreg' : Function.Injective (fun w : SpecialFiber (IsLocalRing.ResidueField O) a b =>276      e (Ideal.Quotient.mk (Ideal.span {algebraMap O (ConcreteSurface O pi u a b) pi}) f) * w) := by277          rw [hq]; exact hreg278  have hregR := concrete_surface_residue_regular_of_special_fiber O pi u a b f e hreg'279  have hlen := concrete_surface_special_fiber_length_transport O pi u a b f e280  rw [hq, hN] at hlen281  obtain ⟨hfree, hfin, hrank⟩ :=282    concrete_surface_curve_free_of_length O pi hpi u a b ha f hregR N hlen283  have := concrete_surface_isDomain O pi hpi u a b ha284  have hf0 : f ≠ 0 := by285    rintro rfl286    have : Subsingleton (SpecialFiber (IsLocalRing.ResidueField O) a b) :=287      ⟨fun x y => hreg (by simp only [← hq, map_zero, zero_mul])⟩288    exact hunit (Subsingleton.elim 1 fbar ▸ isUnit_one)289  let B0 := Module.Free.chooseBasis O (ConcreteSurface O pi u a b ⧸ Ideal.span {f})290  have hcard : Fintype.card291      (Module.Free.ChooseBasisIndex O (ConcreteSurface O pi u a b ⧸ Ideal.span {f})) = N := by292    rw [← hrank, Module.finrank_eq_card_chooseBasisIndex]293  let B : Module.Basis (Fin N) O (ConcreteSurface O pi u a b ⧸ Ideal.span {f}) :=294    B0.reindex ((Fintype.equivFin _).trans (finCongr hcard))295  choose bb hbb using fun i => Ideal.Quotient.mk_surjective (B i)296  obtain ⟨E, hE⟩ := division_linear_equivalence O (ConcreteSurface O pi u a b) N f B bb hbb hf0297  refine ⟨⟨f, bb, E, hE, ?_⟩, ?_⟩298  · intro x y hxy299    apply hregR300    simp only at hxy ⊢301    exact (mul_comm _ _).trans (hxy.trans (mul_comm _ _))302  · exact congrArg (fun z => Ideal.span {z}) hq303 304/-! ### Closed points of the exceptional divisor -/305 306/-- For a polynomial `Φ` over `R`, the quotient of the chart `R[f/e]` by `(e, Φ(f/e))` is307`(R/(e, f))[X]/(Φ̄)`. -/308private theorem chart_point_quotient_adjoinRoot_equiv (R : Type) [CommRing R] (e f : R)309    (Φ : Polynomial R) :310    ∃ q : (BlowupChart R e f ⧸ Ideal.span311        {chartBase R e f e, Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) Φ}) ≃+* AdjoinRoot312      (Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)))),313      (∀ r : R, q (Ideal.Quotient.mk _ (chartBase R e f r)) = AdjoinRoot.of _314        (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)) r)) ∧ q315      (Ideal.Quotient.mk _ (chartSlope R e f)) = AdjoinRoot.root _ := by316  obtain ⟨ε, hεb, hεs⟩ := exceptional_chart_is_affine_line R e f317  set P := Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) Φ with hP318  set J := exceptionalLevelIdeal R e f 1 with hJ319  have hsup : Ideal.span {chartBase R e f e, P} = J ⊔ Ideal.span {P} := by320    rw [hJ, exceptionalLevelIdeal, pow_one, ← Ideal.span_insert]321  have hεP : ε (Ideal.Quotient.mk J P) =322      Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R))) := by323    rw [hP, Polynomial.hom_eval₂]324    change (ε.toRingHom) _ = _325    rw [Polynomial.hom_eval₂]326    have h1 : ε.toRingHom.comp ((Ideal.Quotient.mk J).comp (chartBase R e f)) =327        Polynomial.C.comp (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R))) := by328      exact RingHom.ext hεb329    have h2 : ε.toRingHom (Ideal.Quotient.mk J (chartSlope R e f)) = Polynomial.X := hεs330    rw [h1, h2]331    rfl332  have hK : Ideal.span {Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)))} =333      (Ideal.map (Ideal.Quotient.mk J) (Ideal.span {P})).map ε.toRingHom := by334    rw [Ideal.map_span, Ideal.map_span, Set.image_singleton, Set.image_singleton]335    simp [hεP]336  let E1 := Ideal.quotEquivOfEq hsup337  let E2 := (DoubleQuot.quotQuotEquivQuotSup J (Ideal.span {P})).symm338  let E3 : ((BlowupChart R e f ⧸ J) ⧸ (Ideal.map (Ideal.Quotient.mk J) (Ideal.span {P}))) ≃+*339      AdjoinRoot (Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)))) :=340    Ideal.quotientEquiv _ _ ε hK341  refine ⟨(E1.trans E2).trans E3, ?_, ?_⟩342  · intro r343    change Ideal.Quotient.mk _ (ε (Ideal.Quotient.mk J (chartBase R e f r))) = _344    rw [show Ideal.Quotient.mk J (chartBase R e f r) = levelBase R e f 1 r from rfl, hεb]345    rfl346  · change Ideal.Quotient.mk _ (ε (Ideal.Quotient.mk J (chartSlope R e f))) = _347    rw [show Ideal.Quotient.mk J (chartSlope R e f) = levelSlope R e f 1 from rfl, hεs]348    rfl349 350/-- If `Φ̄` is irreducible over the field `R/(e, f)`, then `(e, Φ(f/e))` is a maximal ideal of the351chart, equal to the preimage of the maximal ideal under any local map `Λ` killing it. -/352theorem chart_nonrational_point_span_eq_comap (R : Type) [CommRing R] (e f : R)353    [(Ideal.span ({e, f} : Set R)).IsMaximal] (Φ : Polynomial R)354    (hΦ : Irreducible (Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R))))) (S : Type)355    [CommRing S] [IsLocalRing S] (Λ : BlowupChart R e f →+* S)356    (he : Λ (chartBase R e f e) ∈ IsLocalRing.maximalIdeal S)357    (hΦZ : Λ (Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) Φ)358      ∈ IsLocalRing.maximalIdeal S) :359    (Ideal.span360        {chartBase R e f e, Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) Φ}).IsMaximal ∧361      Ideal.span {chartBase R e f e, Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) Φ} =362      (IsLocalRing.maximalIdeal S).comap Λ := by363  obtain ⟨q, -, -⟩ := chart_point_quotient_adjoinRoot_equiv R e f Φ364  let _ := Ideal.Quotient.field (Ideal.span ({e, f} : Set R))365  have : Fact (Irreducible (Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R))))) := ⟨hΦ⟩366  have hF : IsField (AdjoinRoot (Φ.map (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R))))) :=367    Field.toIsField _368  have hmax :369      (Ideal.span370        {chartBase R e f e, Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) Φ}).IsMaximal :=371    Ideal.Quotient.maximal_of_isField _ (MulEquiv.isField hF q.toMulEquiv)372  refine ⟨hmax,373        hmax.eq_of_le (Ideal.comap_ne_top _ (IsLocalRing.maximalIdeal.isMaximal S).ne_top) ?_⟩374  rw [Ideal.span_le]375  rintro x (rfl | rfl)376  exacts [he, hΦZ]377 378/-- `(e, f/e - r)` is a maximal ideal of the chart `R[f/e]`, equal to the preimage of the maximal379ideal under any local map `Λ` killing it. -/380private theorem chart_rational_point_span_eq_comap (R : Type) [CommRing R] (e f : R)381    [(Ideal.span ({e, f} : Set R)).IsMaximal] (S : Type) [CommRing S] [IsLocalRing S]382    (Λ : BlowupChart R e f →+* S) (r : R) (he : Λ (chartBase R e f e) ∈ IsLocalRing.maximalIdeal S)383    (hr : Λ (chartSlope R e f) - Λ (chartBase R e f r) ∈ IsLocalRing.maximalIdeal S) :384    (Ideal.span {chartBase R e f e, chartSlope R e f - chartBase R e f r}).IsMaximal ∧ Ideal.span385      {chartBase R e f e, chartSlope R e f - chartBase R e f r} =386      (IsLocalRing.maximalIdeal S).comap Λ := by387  have hmax : (Ideal.span {chartBase R e f e, chartSlope R e f - chartBase R e f r}).IsMaximal := by388    obtain ⟨q, -, -⟩ := chart_point_quotient_adjoinRoot_equiv R e f389      (Polynomial.X - Polynomial.C r)390    have hev : Polynomial.eval₂ (chartBase R e f) (chartSlope R e f) (Polynomial.X - Polynomial.C r)391        = chartSlope R e f - chartBase R e f r := by392      simp [Polynomial.eval₂_sub]393    rw [hev] at q394    have hmap : (Polynomial.X - Polynomial.C r).map395        (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)))396        = Polynomial.X - Polynomial.C (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)) r) := by397      simp398    rw [hmap] at q399    let : Field (R ⧸ Ideal.span ({e, f} : Set R)) := Ideal.Quotient.field _400    let q2 := (Polynomial.quotientSpanXSubCAlgEquiv401      (Ideal.Quotient.mk (Ideal.span ({e, f} : Set R)) r)).toRingEquiv402    apply Ideal.Quotient.maximal_of_isField403    exact MulEquiv.isField (Field.toIsField (R ⧸ Ideal.span ({e, f} : Set R)))404      (q.trans q2).toMulEquiv405  refine ⟨hmax,406        hmax.eq_of_le (Ideal.comap_ne_top _ (IsLocalRing.maximalIdeal.isMaximal S).ne_top) ?_⟩407  rw [Ideal.span_le]408  rintro x (rfl | rfl)409  exacts [he, by simpa [map_sub] using hr]410 411/-- For an unramified lift `Φ`, the derivative `Φ'(x/t)` is invertible modulo the non-rational412point `(t, Φ(x/t))` of the `t`-chart. -/413private theorem nonrational_point_derivative_isUnit_mod (O : Type) [CommRing O] [IsDomain O]414    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)415    (ha : 0 < a) [Finite (IsLocalRing.ResidueField O)] (Φ : Polynomial O)416    (hΦ : IsUnramifiedLift O Φ) :417    ∃ w : tChart O pi u a b,418      Polynomial.eval₂ ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))419          (tSlope O pi u a b)420      (Polynomial.derivative Φ) * w - 1 ∈ Ideal.span421      {tBase O pi u a b (surfaceT O pi u a b),422        Polynomial.eval₂ ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))423            (tSlope O pi u a b) Φ} := by424  set R := ConcreteSurface O pi u a b425  set t := surfaceT O pi u a b426  set x := surfaceX O pi u a b427  set I : Ideal R := Ideal.span ({t, x} : Set R) with hI428  have hmax : I.IsMaximal := concrete_surface_parameterIdeal_isMaximal O pi hpi u a b ha429  let _ : Field (R ⧸ I) := Ideal.Quotient.field I430  obtain ⟨e, -⟩ := concrete_surface_quotient_parameters_equiv O pi hpi u a b ha431  have : Finite (R ⧸ I) := Finite.of_equiv _ e.toEquiv.symm432  set ψ : Polynomial (R ⧸ I) := (Φ.map (algebraMap O R)).map (Ideal.Quotient.mk I) with hψ433  have hirr : Irreducible ψ := by434    rw [hψ, Polynomial.map_map]435    exact unramified_lift_map_parameter_quotient_irreducible O pi hpi u a b ha Φ hΦ436  have : Fact (Irreducible ψ) := ⟨hirr⟩437  have hder : Polynomial.derivative ψ ≠ 0 :=438    (Polynomial.separable_iff_derivative_ne_zero hirr).1439        (PerfectField.separable_of_irreducible hirr)440  rw [← Polynomial.eval₂_map, ← Polynomial.eval₂_map, ← Polynomial.derivative_map]441  set J := Ideal.span442      {chartBase R t x t,443        Polynomial.eval₂ (chartBase R t x) (chartSlope R t x) (Φ.map (algebraMap O R))} with hJ444  obtain ⟨q, hqb, hqs⟩ := chart_point_quotient_adjoinRoot_equiv R t x (Φ.map (algebraMap O R))445  have hcomp : ((q : _ →+* AdjoinRoot ψ).comp (Ideal.Quotient.mk J)).comp (chartBase R t x)446      = (AdjoinRoot.of ψ).comp (Ideal.Quotient.mk I) := RingHom.ext hqb447  have heval : ∀ P : Polynomial R,448      q (Ideal.Quotient.mk J (Polynomial.eval₂ (chartBase R t x) (chartSlope R t x) P))449      = AdjoinRoot.mk ψ (P.map (Ideal.Quotient.mk I)) := by450    intro P451    change ((q : _ →+* AdjoinRoot ψ).comp (Ideal.Quotient.mk J))452        (Polynomial.eval₂ (chartBase R t x) (chartSlope R t x) P) = _453    rw [Polynomial.hom_eval₂, hcomp, RingHom.comp_apply]454    erw [hqs]455    rw [← Polynomial.eval₂_map, ← AdjoinRoot.aeval_eq, Polynomial.aeval_def]456    rfl457  set D := Polynomial.eval₂ (chartBase R t x) (chartSlope R t x)458      (Polynomial.derivative (Φ.map (algebraMap O R)))459  have hD : q (Ideal.Quotient.mk J D) = AdjoinRoot.mk ψ (Polynomial.derivative ψ) := by460    rw [heval]461    simp only [hψ, Polynomial.derivative_map]462  have hne : AdjoinRoot.mk ψ (Polynomial.derivative ψ) ≠ 0 := by463    rw [Ne, AdjoinRoot.mk_eq_zero]464    exact fun hdvd => hder465      (Polynomial.eq_zero_of_dvd_of_degree_lt hdvd (Polynomial.degree_derivative_lt hirr.ne_zero))466  obtain ⟨w, hw⟩ := Ideal.Quotient.mk_surjective467      (q.symm (AdjoinRoot.mk ψ (Polynomial.derivative ψ))⁻¹)468  refine ⟨w, ?_⟩469  rw [← Ideal.Quotient.eq_zero_iff_mem]470  have hsplit : Ideal.Quotient.mk J (D * w - 1) =471      Ideal.Quotient.mk J D * Ideal.Quotient.mk J w - 1 := rfl472  apply q.injective473  rw [hsplit, RingEquiv.map_zero]474  erw [map_sub q, map_mul q, map_one q, hD, hw, RingEquiv.apply_symm_apply, mul_inv_cancel₀ hne,475        sub_self]476 477/-- Hensel's lemma at a non-rational point `P = (t, Φ(x/t))` of the `t`-chart: `Φ` has a root in478the completion at `P` congruent to `x/t` modulo the maximal ideal. -/479private theorem nonrational_point_hensel_root (O : Type) [CommRing O] [IsDomain O]480    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)481    (ha : 0 < a) [Finite (IsLocalRing.ResidueField O)] (Φ : Polynomial O)482    (hΦ : IsUnramifiedLift O Φ) (P : Ideal (tChart O pi u a b)) [P.IsPrime]483    (hP : P = Ideal.span484      {tBase O pi u a b (surfaceT O pi u a b),485      Polynomial.eval₂ ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))486          (tSlope O pi u a b) Φ}) :487    ∃ θ' : CompletedLocalAt (tChart O pi u a b) P,488      Polynomial.eval₂489      ((completedPointMap (tChart O pi u a b) P).comp ((tBase O pi u a b).comp490          (algebraMap O (ConcreteSurface O pi u a b))))491      θ' Φ = 0 ∧ θ' - completedPointMap (tChart O pi u a b) P (tSlope O pi u a b) ∈492      (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map493      (localCompletionMap (Localization.AtPrime P)) := by494  set A := tChart O pi u a b495  set φ := (tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)) with hφ496  set Z := tSlope O pi u a b497  obtain ⟨w, hw⟩ := nonrational_point_derivative_isUnit_mod O pi hpi u a b ha Φ hΦ498  rw [← hP] at hw499  have : IsNoetherianRing A := blowupChart_concrete_isNoetherianRing O pi u a b _ _500  have : IsNoetherianRing (Localization.AtPrime P) :=501    IsLocalization.isNoetherianRing P.primeCompl _ inferInstance502  set L := Localization.AtPrime P503  set c := completedPointMap A P504  have hmap : (IsLocalRing.maximalIdeal L).map (localCompletionMap L)505      = IsLocalRing.maximalIdeal (CompletedLocalAt A P) :=506    (AdicCompletion.maximalIdeal_eq_map (R := L)).symm507  have hPm : ∀ x ∈ P, c x ∈ IsLocalRing.maximalIdeal (CompletedLocalAt A P) := by508    intro x hx509    rw [← hmap]510    apply Ideal.mem_map_of_mem511    rw [← IsLocalization.AtPrime.map_eq_maximalIdeal P L]512    exact Ideal.mem_map_of_mem _ hx513  have hmem : Polynomial.eval₂ φ Z Φ ∈ P := by514    rw [hP]; exact Ideal.subset_span (by simp)515  have key : ∀ q : Polynomial O, (q.map (c.comp φ)).eval (c Z) = c (q.eval₂ φ Z) := fun q => by516    rw [Polynomial.eval_map, Polynomial.hom_eval₂]517  obtain ⟨θ, hθ, hθZ⟩ := HenselianRing.is_henselian518      (I := IsLocalRing.maximalIdeal (CompletedLocalAt A P))519    (Φ.map (c.comp φ)) (hΦ.1.map _) (c Z) (by rw [key]; exact hPm _ hmem) (by520      rw [Polynomial.derivative_map, key]521      refine IsUnit.of_mul_eq_one (Ideal.Quotient.mk _ (c w)) ?_522      rw [← map_mul, ← map_mul, ← map_one (Ideal.Quotient.mk _), Ideal.Quotient.eq, ← map_one c,523        ← map_sub]524      exact hPm _ hw)525  refine ⟨θ, by rwa [Polynomial.IsRoot, Polynomial.eval_map] at hθ, ?_⟩526  rw [hmap]; exact hθZ527 528/-- Let `Λ' : Â_P → R'` map the completion at a non-rational point `P` to the child surface529over `O[θ]`, compatibly with `O`, with `Λ'(x/t) = x' + θ`. Then `Λ'` sends a Hensel root `θ'` of530`Φ` near `x/t` to `θ`, so the lift `κ : O[θ] → Â_P`, `θ ↦ θ'`, is a section of `Λ'` on `O[θ]`. -/531private theorem nonrational_point_root_lift (O : Type) [CommRing O] [IsDomain O]532    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)533    (ha : 0 < a) [IsAdicComplete (IsLocalRing.maximalIdeal O) O]534    [Finite (IsLocalRing.ResidueField O)] (Φ : Polynomial O)535    (hΦ : IsUnramifiedLift O Φ) (hθ : IsUnit (AdjoinRoot.root Φ))536    (P : Ideal (tChart O pi u a b)) [P.IsPrime]537    (Λ' : CompletedLocalAt (tChart O pi u a b) P →+* childSurface O pi u a b Φ hθ)538    (hΛ'O : Λ'.comp ((completedPointMap (tChart O pi u a b) P).comp539        ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))) =540      (algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)).comp541        (algebraMap O (AdjoinRoot Φ)))542    (hΛ'Z : Λ' (completedPointMap (tChart O pi u a b) P (tSlope O pi u a b)) =543      surfaceX (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi) (childUnit O u b Φ hθ) (a + b) 0 +544        algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ))545    (θ' : CompletedLocalAt (tChart O pi u a b) P)546    (hroot : Polynomial.eval₂ ((completedPointMap (tChart O pi u a b) P).comp547      ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))) θ' Φ = 0)548    (hcong : Λ' (θ' - completedPointMap (tChart O pi u a b) P (tSlope O pi u a b)) ∈549      surfaceParameterIdeal (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)550        (childUnit O u b Φ hθ) (a + b) 0) (c : AdjoinRoot Φ) :551    Λ' (AdjoinRoot.lift ((completedPointMap (tChart O pi u a b) P).comp552      ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))) θ' hroot c) =553      algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) c := by554  obtain ⟨_, _, hdvr, -, hirr, -, -, -⟩ := unramified_is_dvr O Φ hΦ555  have := hdvr556  have hpiδ : Irreducible (algebraMap O (AdjoinRoot Φ) pi) := hirr pi hpi557  have hab : 0 < a + b := by omega558  have : IsLocalRing (childSurface O pi u a b Φ hθ) :=559    concrete_surface_isLocalRing _ _ _ _ _ hpiδ.not_isUnit hab560  have hmax := concrete_surface_maximalIdeal_eq _ _ hpiδ (childUnit O u b Φ hθ) (a + b) 0 hab561  have hρθ : Φ.eval₂ (algebraMap O (AdjoinRoot Φ)) (AdjoinRoot.root Φ) = 0 :=562    AdjoinRoot.eval₂_root Φ563  -- `Λ' θ'` and `θ` are roots of `Φ` congruent modulo the maximal ideal, and `θ` is simple.564  have hθ' : Λ' θ' = algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)565      (AdjoinRoot.root Φ) := by566    refine polynomial_root_unique_of_derivative_isUnit _ (Φ.map ((algebraMap (AdjoinRoot Φ)567      (childSurface O pi u a b Φ hθ)).comp (algebraMap O (AdjoinRoot Φ)))) _ (Λ' θ') ?_ ?_ ?_ ?_568    · rw [Polynomial.eval_map, ← Polynomial.hom_eval₂, hρθ, map_zero]569    · rw [Polynomial.eval_map, ← hΛ'O, ← Polynomial.hom_eval₂, hroot, map_zero]570    · rw [hmax, ← sub_add_cancel (Λ' θ') (Λ' (completedPointMap _ P (tSlope O pi u a b))),571        ← map_sub, hΛ'Z, add_sub_assoc, add_sub_cancel_right]572      exact Ideal.add_mem _ hcong (Ideal.subset_span (Set.mem_insert_of_mem _ rfl))573    · have hu := (simple_root_derivative_unit O Φ hΦ (AdjoinRoot.root Φ) (by574        rw [Polynomial.eval_map]; exact (congrArg _ hρθ).trans (map_zero _))).2575      have h2 : Polynomial.eval (algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)576          (AdjoinRoot.root Φ)) (Polynomial.derivative (Φ.map ((algebraMap (AdjoinRoot Φ)577            (childSurface O pi u a b Φ hθ)).comp (algebraMap O (AdjoinRoot Φ))))) =578          algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)579            ((Φ.map (AdjoinRoot.of Φ)).derivative.eval (AdjoinRoot.root Φ)) := by580        rw [Polynomial.derivative_map, Polynomial.derivative_map, Polynomial.eval_map,581          Polynomial.eval_map, Polynomial.hom_eval₂]582        rfl583      rw [h2]; exact hu.map _584  induction c using AdjoinRoot.induction_on with585  | ih p =>586    rw [AdjoinRoot.lift_mk, Polynomial.hom_eval₂, hΛ'O, hθ', ← Polynomial.hom_eval₂,587      ← AdjoinRoot.aeval_eq, Polynomial.aeval_def]588 589/-- A chart map `Λ : R[x/t] → R'` to the child surface over `O[θ]`, compatible with `O`, with590`Λ(t) = t'` and `Λ(x/t) = x' + θ`, contracts the maximal ideal of `R'` to the non-rational point591`P = (t, Φ(x/t))`. -/592private theorem nonrational_point_mem_iff (O : Type) [CommRing O] [IsDomain O]593    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)594    (ha : 0 < a) [IsAdicComplete (IsLocalRing.maximalIdeal O) O]595    [Finite (IsLocalRing.ResidueField O)] (Φ : Polynomial O) (hΦ : IsUnramifiedLift O Φ)596    (hθ : IsUnit (AdjoinRoot.root Φ)) (P : Ideal (tChart O pi u a b))597    (hP : P = Ideal.span598      {tBase O pi u a b (surfaceT O pi u a b),599      Polynomial.eval₂ ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))600          (tSlope O pi u a b) Φ})601    (Λ : tChart O pi u a b →+* childSurface O pi u a b Φ hθ)602    (hΛT : Λ (tBase O pi u a b (surfaceT O pi u a b)) =603      surfaceT (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi) (childUnit O u b Φ hθ) (a + b) 0)604    (hΛO : Λ.comp ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b))) =605      (algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)).comp606        (algebraMap O (AdjoinRoot Φ)))607    (hΛZ : Λ (tSlope O pi u a b) =608      surfaceX (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi) (childUnit O u b Φ hθ) (a + b) 0 +609        algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ))610    (x : tChart O pi u a b) :611    x ∈ P ↔ Λ x ∈ surfaceParameterIdeal (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi)612      (childUnit O u b Φ hθ) (a + b) 0 := by613  obtain ⟨_, _, hdvr, -, hirr, -, -, -⟩ := unramified_is_dvr O Φ hΦ614  have := hdvr615  have hpiδ : Irreducible (algebraMap O (AdjoinRoot Φ) pi) := hirr pi hpi616  have hab : 0 < a + b := by omega617  have : IsLocalRing (childSurface O pi u a b Φ hθ) :=618    concrete_surface_isLocalRing _ _ _ _ _ hpiδ.not_isUnit hab619  have hmax := concrete_surface_maximalIdeal_eq _ _ hpiδ (childUnit O u b Φ hθ) (a + b) 0 hab620  have : (Ideal.span ({surfaceT O pi u a b, surfaceX O pi u a b} :621      Set (ConcreteSurface O pi u a b))).IsMaximal :=622    concrete_surface_parameterIdeal_isMaximal O pi hpi u a b ha623  have hirrR := unramified_lift_map_parameter_quotient_irreducible O pi hpi u a b ha Φ hΦ624  rw [← Polynomial.map_map] at hirrR625  obtain ⟨-, hspan⟩ := chart_nonrational_point_span_eq_comap _ _ _626    (Φ.map (algebraMap O (ConcreteSurface O pi u a b))) hirrR _ Λ627    (by rw [hΛT, hmax]; exact Ideal.subset_span (Set.mem_insert _ _)) (by628      -- `Φ(x' + θ) ≡ Φ(θ) = 0` modulo `x'`629      rw [Polynomial.eval₂_map, Polynomial.hom_eval₂, hΛO, hΛZ, hmax]630      obtain ⟨k, hk⟩ := Polynomial.sub_dvd_eval_sub (surfaceX (AdjoinRoot Φ)631        (algebraMap O (AdjoinRoot Φ) pi) (childUnit O u b Φ hθ) (a + b) 0 + algebraMap632          (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ))633        (algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ))634        (Φ.map ((algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)).comp635          (algebraMap O (AdjoinRoot Φ))))636      have hF0 : Φ.eval₂ ((algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)).comp637          (algebraMap O (AdjoinRoot Φ))) (algebraMap (AdjoinRoot Φ)638            (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ)) = 0 := by639        rw [← Polynomial.hom_eval₂, show Φ.eval₂ (algebraMap O (AdjoinRoot Φ))640          (AdjoinRoot.root Φ) = 0 from AdjoinRoot.eval₂_root Φ, map_zero]641      rw [Polynomial.eval_map, Polynomial.eval_map, hF0, sub_zero, add_sub_cancel_right] at hk642      rw [hk]; exact Ideal.mul_mem_right _ _ (Ideal.subset_span (Set.mem_insert_of_mem _ rfl)))643  rw [← hmax, ← Ideal.mem_comap, ← hspan, hP, Polynomial.eval₂_map]644 645/-! ### The completion isomorphisms -/646 647/-- The completion of the `t`-chart at a non-rational point `(t, Φ(x/t))` is isomorphic to the648child surface over `O[θ] = O[X]/(Φ)`, compatibly with the chart substitution, and the image of649`θ` is the Hensel root of `Φ`. -/650theorem t_chart_nonrational_point_completion_equiv (O : Type) [CommRing O] [IsDomain O]651    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)652    (ha : 0 < a) [IsAdicComplete (IsLocalRing.maximalIdeal O) O]653    [Finite (IsLocalRing.ResidueField O)] (Φ : Polynomial O) (hΦ : IsUnramifiedLift O Φ)654    (hθ : IsUnit (AdjoinRoot.root Φ)) (P : Ideal (tChart O pi u a b)) [P.IsPrime]655    (hP : P = Ideal.span656      {tBase O pi u a b (surfaceT O pi u a b),657      Polynomial.eval₂ ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b)))658          (tSlope O pi u a b) Φ}) :659    ∃ Eq : CompletedLocalAt (tChart O pi u a b) P ≃+* childSurface O pi u a b Φ hθ,660      (∀ s : TwoSeries O,661        Eq (completedPointMap (tChart O pi u a b) P (tBase O pi u a b (surfaceMk O pi u a b s))) =662          surfaceMk (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi) (childUnit O u b Φ hθ) (a + b) 0663            (chartSubst (AdjoinRoot Φ) (AdjoinRoot.root Φ)664              (MvPowerSeries.map (algebraMap O (AdjoinRoot Φ)) s))) ∧665      Eq (completedPointMap (tChart O pi u a b) P (tSlope O pi u a b)) =666        surfaceX (AdjoinRoot Φ) (algebraMap O (AdjoinRoot Φ) pi) (childUnit O u b Φ hθ) (a + b) 0 +667          algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ) ∧668      (∀ c : O,669        Eq (completedPointMap (tChart O pi u a b) P670            (tBase O pi u a b (algebraMap O (ConcreteSurface O pi u a b) c))) =671          algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ)672            (algebraMap O (AdjoinRoot Φ) c)) ∧673      Polynomial.eval₂ ((completedPointMap (tChart O pi u a b) P).comp674          ((tBase O pi u a b).comp (algebraMap O (ConcreteSurface O pi u a b))))675        (Eq.symm (algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ)))676        Φ = 0 ∧677      Eq.symm (algebraMap (AdjoinRoot Φ) (childSurface O pi u a b Φ hθ) (AdjoinRoot.root Φ)) -678          completedPointMap (tChart O pi u a b) P (tSlope O pi u a b) ∈679        (IsLocalRing.maximalIdeal (Localization.AtPrime P)).map680          (localCompletionMap (Localization.AtPrime P)) := by681  obtain ⟨_, _, hdvr, -, hirr, -, -, -⟩ := unramified_is_dvr O Φ hΦ682  have := hdvr683  set θ := AdjoinRoot.root Φ684  set ρ := algebraMap O (AdjoinRoot Φ)685  set uδ := substUnit (AdjoinRoot Φ) θ (baseChangeUnit O ρ u) * shiftUnit (AdjoinRoot Φ) θ hθ ^ b686  set R := ConcreteSurface O pi u a b687  set Rδ := ConcreteSurface (AdjoinRoot Φ) (ρ pi) uδ (a + b) 0688  set A := BlowupChart R (surfaceT O pi u a b) (surfaceX O pi u a b)689  set cb := chartBase R (surfaceT O pi u a b) (surfaceX O pi u a b)690  set Z := chartSlope R (surfaceT O pi u a b) (surfaceX O pi u a b)691  set cpm := completedPointMap A P692  set aδ := algebraMap (AdjoinRoot Φ) Rδ693  set Xδ := surfaceX (AdjoinRoot Φ) (ρ pi) uδ (a + b) 0694  have hpiδ : Irreducible (ρ pi) := hirr pi hpi695  have hab : 0 < a + b := by omega696  have : IsLocalRing Rδ := concrete_surface_isLocalRing _ _ _ _ _ hpiδ.not_isUnit hab697  have : IsNoetherianRing A := blowupChart_concrete_isNoetherianRing O pi u a b _ _698  -- The chart substitution `s = chartSubst θ ∘ map ρ` and the chart map `Λ : A → Rδ` it induces.699  obtain ⟨hsC0, hsT0, hsX0, -⟩ := chartSubst_apply_generators (AdjoinRoot Φ) θ700  set s := (chartSubst (AdjoinRoot Φ) θ).toRingHom.comp (MvPowerSeries.map ρ)701  have hsC : ∀ c : O, s (MvPowerSeries.C c) = MvPowerSeries.C (ρ c) := fun c =>702    (congrArg (chartSubst (AdjoinRoot Φ) θ) (MvPowerSeries.map_C _ _)).trans (hsC0 _)703  have hsE : s (axisT O) = axisT (AdjoinRoot Φ) :=704    (congrArg (chartSubst (AdjoinRoot Φ) θ) (MvPowerSeries.map_X _ _)).trans hsT0705  have hsF : s (axisX O) = axisT (AdjoinRoot Φ) * (axisX (AdjoinRoot Φ) + MvPowerSeries.C θ) :=706    (congrArg (chartSubst (AdjoinRoot Φ) θ) (MvPowerSeries.map_X _ _)).trans hsX0707  have hs : s (surfaceRelation O pi u a b) = surfaceRelation (AdjoinRoot Φ) (ρ pi) uδ (a + b) 0 :=708    (chartSubst_surfaceRelation_base_change_and_x_chart O (AdjoinRoot Φ) ρ pi u a b).1 θ hθ709  obtain ⟨Λ, hΛ, hΛZ⟩ : ∃ Λ : A →+* Rδ, (∀ g : TwoSeries O,710      Λ (cb (surfaceMk O pi u a b g)) = surfaceMk (AdjoinRoot Φ) (ρ pi) uδ (a + b) 0 (s g)) ∧711      Λ Z = Xδ + aδ θ := chart_child_map_exists O (AdjoinRoot Φ) pi u a b (ρ pi) uδ (a + b) 0712    (axisT O) (axisX O) s (hs ▸ Ideal.mem_span_singleton_self _) θ hsE hsF713  have hΛC : ∀ c : O, Λ (cb (algebraMap O R c)) = aδ (ρ c) :=714    fun c ↦ (hΛ (MvPowerSeries.C c)).trans (congrArg _ (hsC c))715  have hΛCc : Λ.comp (cb.comp (algebraMap O R)) = aδ.comp ρ := RingHom.ext hΛC716  -- `P` is the preimage of the maximal ideal of `Rδ`; pass to the completion.717  have hP' := nonrational_point_mem_iff O pi hpi u a b ha Φ hΦ hθ P hP Λ718    (by have := hΛ (axisT O); rw [hsE] at this; exact this) hΛCc hΛZ719  obtain ⟨Λ', hΛ'⟩ := chart_child_completion_map_exists A (AdjoinRoot Φ) (ρ pi) hpiδ uδ720    (a + b) 0 hab Λ P hP'721  have hloc' := chart_child_completion_map_local A (AdjoinRoot Φ) (ρ pi) hpiδ uδ722    (a + b) 0 hab Λ P hP' Λ' hΛ'723  -- The Hensel root `θ'` of `Φ` maps to `θ`, so `θ ↦ θ'` extends `O → completion` to `κ`.724  obtain ⟨θ', hroot, hcong⟩ := nonrational_point_hensel_root O pi hpi u a b ha Φ hΦ P hP725  set κO := cpm.comp (cb.comp (algebraMap O R))726  have hΛ'κO : Λ'.comp κO = aδ.comp ρ := by rw [← hΛCc]; ext c; exact hΛ' _727  set κ := AdjoinRoot.lift κO θ' hroot with hκdef728  have hκ := nonrational_point_root_lift O pi hpi u a b ha Φ hΦ hθ P Λ' hΛ'κO729    ((hΛ' _).trans hΛZ) θ' hroot ((hloc' _).1 hcong)730  obtain ⟨E, hE, hEs⟩ : ∃ E : CompletedLocalAt A P ≃+* Rδ,731      (∀ y, E y = Λ' y) ∧ ∀ c, E.symm (aδ c) = κ c :=732    @chart_child_completion_equiv O (AdjoinRoot Φ) _ _ _ _ _ pi u a b (ρ pi)733    hpiδ uδ (a + b) 0 hab (axisT O) (axisX O) (Or.inl ⟨rfl, rfl⟩) ρ θ s hsC hsE hsF hs Λ hΛ hΛZ P734    ‹_› hP'735    (nonrational_point_residue_surjective O pi u a b Φ hθ Λ hΛ hΛZ) Λ' hΛ' κ hκ736    fun c => AdjoinRoot.lift_of (h := hroot)737  have hEθ : E.symm (aδ (AdjoinRoot.root Φ)) = θ' := by738    rw [hEs]; exact AdjoinRoot.lift_root (h := hroot)739  refine ⟨E, fun g => ((hE _).trans (hΛ' _)).trans (hΛ g), ((hE _).trans (hΛ' _)).trans hΛZ,740    fun c => ((hE _).trans (hΛ' _)).trans (hΛC c), ?_, ?_⟩741  · rw [hEθ]; exact hroot742  · rw [hEθ]; exact hcong743 744/-- Common form of the completion isomorphisms at the rational points of the exceptional745divisor: if `s : O[[T,X]] → O[[T,X]]` fixes constants, sends `E ↦ T`, `F ↦ T (X + α)` and the746relation to a child relation, then the completed local ring of `R[f/e]` at747`P = (e, f/e - α)` is isomorphic to the child surface, compatibly with `s`. -/748private theorem rational_point_completion_equiv (O : Type) [CommRing O] [IsDomain O]749    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)750    (u' : (TwoSeries O)ˣ) (a' b' : ℕ) (ha' : 0 < a') (E F : TwoSeries O)751    (hEF : (E = axisT O ∧ F = axisX O) ∨ (E = axisX O ∧ F = axisT O))752    (hEFmax : (Ideal.span ({surfaceMk O pi u a b E, surfaceMk O pi u a b F} :753      Set (ConcreteSurface O pi u a b))).IsMaximal)754    (α : O) (s : TwoSeries O →+* TwoSeries O)755    (hsC : ∀ c : O, s (MvPowerSeries.C c) = MvPowerSeries.C c) (hsE : s E = axisT O)756    (hsF : s F = axisT O * (axisX O + MvPowerSeries.C α))757    (hrel : s (surfaceRelation O pi u a b) = surfaceRelation O pi u' a' b')758    (P : Ideal (efChart O pi u a b E F)) (hPp : P.IsPrime)759    (hP : P = Ideal.span {efBase O pi u a b E F (surfaceMk O pi u a b E),760      efSlope O pi u a b E F - efBase O pi u a b E F (algebraMap O (ConcreteSurface O pi u a b)761          α)}) :762    ∃ Eq : CompletedLocalAt (efChart O pi u a b E F) P ≃+* ConcreteSurface O pi u' a' b',763      (∀ g : TwoSeries O, Eq (completedPointMap (efChart O pi u a b E F) P764          (efBase O pi u a b E F (surfaceMk O pi u a b g))) =765        surfaceMk O pi u' a' b' (s g)) ∧766      Eq (completedPointMap (efChart O pi u a b E F) P (efSlope O pi u a b E F)) =767        surfaceX O pi u' a' b' + algebraMap O (ConcreteSurface O pi u' a' b') α ∧768      ∀ c : O, Eq769        (completedPointMap (efChart O pi u a b E F) P (efBase O pi u a b E F770            (algebraMap O (ConcreteSurface O pi u a b) c))) =771        algebraMap O (ConcreteSurface O pi u' a' b') c := by772  have : IsLocalRing (ConcreteSurface O pi u' a' b') :=773    concrete_surface_isLocalRing O pi _ _ _ hpi.not_isUnit ha'774  have : IsNoetherianRing (efChart O pi u a b E F) := blowupChart_concrete_isNoetherianRing O pi u a775      b _ _776  have hmax := concrete_surface_maximalIdeal_eq O pi hpi u' a' b' ha'777  obtain ⟨Λ, hΛ, hΛZ⟩ := chart_child_map_exists O O pi u a b pi u' a' b' E F s778    (hrel ▸ Ideal.mem_span_singleton_self _) α hsE hsF779  set R0 := ConcreteSurface O pi u' a' b'780  have hT : surfaceMk O pi u' a' b' (axisT O) ∈ IsLocalRing.maximalIdeal R0 := by781    rw [hmax]; exact Ideal.subset_span (Set.mem_insert _ _)782  have hXm : surfaceX O pi u' a' b' ∈ IsLocalRing.maximalIdeal R0 := by783    rw [hmax]; exact Ideal.subset_span (Set.mem_insert_of_mem _ rfl)784  have hΛC : ∀ c : O,785      Λ (efBase O pi u a b E F (algebraMap O (ConcreteSurface O pi u a b) c)) = algebraMap O R0 c :=786    fun c ↦ (hΛ (MvPowerSeries.C c)).trans (congrArg _ (hsC c))787  have := hEFmax788  have := hPp789  obtain ⟨-, hspan⟩ := chart_rational_point_span_eq_comap (ConcreteSurface O pi u a b)790    (surfaceMk O pi u a b E) (surfaceMk O pi u a b F) R0 Λ (algebraMap O _ α)791    (by rw [hΛ, hsE]; exact hT) (by rw [hΛZ, hΛC, add_sub_cancel_right]; exact hXm)792  have hP' : ∀ x, x ∈ P ↔ Λ x ∈ surfaceParameterIdeal O pi u' a' b' := fun x ↦ by793    rw [← hmax, ← Ideal.mem_comap, ← hspan, hP]794  have hsurj : ∀ y : R0, ∃ x, Λ x - y ∈ surfaceParameterIdeal O pi u' a' b' := by795    intro y796    obtain ⟨s', rfl⟩ := Ideal.Quotient.mk_surjective y797    refine ⟨efBase O pi u a b E F (algebraMap O (ConcreteSurface O pi u a b)798        (MvPowerSeries.constantCoeff s')), ?_⟩799    rw [hΛC, ← neg_sub]800    exact (Ideal.neg_mem_iff _).mpr801      (concrete_surface_sub_constantCoeff_mem_parameterIdeal O pi u' a' b' s')802  obtain ⟨Λ', hΛ'⟩ := chart_child_completion_map_exists _ O pi hpi u' a' b' ha' Λ P hP'803  obtain ⟨e, he, -⟩ := chart_child_completion_equiv O O pi u a b pi hpi u' a' b' ha' E F hEF804    (RingHom.id O) α s hsC hsE hsF hrel Λ hΛ hΛZ P hP' hsurj Λ' hΛ'805    ((completedPointMap (efChart O pi u a b E F) P).comp ((efBase O pi u a b E F).comp806        (algebraMap O _)))807    (fun c ↦ by808      change Λ' (completedPointMap _ P (efBase O pi u a b E F (algebraMap O _ c))) = _809      rw [hΛ', hΛC]) fun c ↦ rfl810  exact ⟨e, fun g ↦ ((he _).trans (hΛ' _)).trans (hΛ g), ((he _).trans (hΛ' _)).trans hΛZ,811    fun c ↦ ((he _).trans (hΛ' _)).trans (hΛC c)⟩812 813/-- The completion of the `t`-chart at its origin `(t, x/t)` is the concrete surface814with unit `substUnit O 0 u` and exponents `(a + b, b)`, compatibly with the chart substitution. -/815theorem t_chart_origin_completion_equiv (O : Type) [CommRing O] [IsDomain O]816    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)817    (ha : 0 < a) (P : Ideal (tChart O pi u a b)) [P.IsPrime]818    (hP : P = Ideal.span {tBase O pi u a b (surfaceT O pi u a b), tSlope O pi u a b}) :819    ∃ Eq : CompletedLocalAt (tChart O pi u a b) P ≃+* ConcreteSurface O pi (substUnit O 0 u) (a + b)820        b,821      (∀ s : TwoSeries O,822        Eq (completedPointMap (tChart O pi u a b) P (tBase O pi u a b (surfaceMk O pi u a b s))) =823            surfaceMk O pi824        (substUnit O 0 u) (a + b) b (chartSubst O 0 s)) ∧ Eq (completedPointMap (tChart O pi u a b)825            P (tSlope O pi u a b)) =826      surfaceX O pi (substUnit O 0 u) (a + b) b ∧ ∀ c : O,827      Eq (completedPointMap (tChart O pi u a b) P (tBase O pi u a b828          (algebraMap O (ConcreteSurface O pi u a b) c))) =829      algebraMap O (ConcreteSurface O pi (substUnit O 0 u) (a + b) b) c := by830  obtain ⟨hsC, hsT, hsX, -⟩ := chartSubst_apply_generators O 0831  obtain ⟨e, h1, h2, h3⟩ := rational_point_completion_equiv O pi hpi u a b (substUnit O 0 u)832    (a + b) b (by omega) (axisT O) (axisX O) (Or.inl ⟨rfl, rfl⟩)833    (concrete_surface_parameterIdeal_isMaximal O pi hpi u a b ha) 0 (chartSubst O 0).toRingHom834    hsC hsT hsX (chartSubst_surfaceRelation_origin_and_unit_point O pi u a b).1 P ‹_›835    (by rw [hP]; simp only [map_zero, sub_zero]; rfl)836  rw [map_zero, add_zero] at h2837  exact ⟨e, h1, h2, h3⟩838 839/-- The completion of the `t`-chart at a rational point `(t, x/t - α)` with `α` a unit is the840child concrete surface with exponents `(a + b, 0)`, compatibly with the chart substitution. -/841theorem t_chart_unit_point_completion_equiv (O : Type) [CommRing O] [IsDomain O]842    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)843    (ha : 0 < a) (α : O) (hα : IsUnit α) (P : Ideal (tChart O pi u a b)) [P.IsPrime]844    (hP : P = Ideal.span845      {tBase O pi u a b (surfaceT O pi u a b), tSlope O pi u a b - tBase O pi u a b846          (algebraMap O (ConcreteSurface O pi u a b) α)}) :847    ∃ Eq : CompletedLocalAt (tChart O pi u a b) P ≃+* ConcreteSurface O pi848      (substUnit O α u * shiftUnit O α hα ^ b) (a + b) 0,849      (∀ s : TwoSeries O,850        Eq (completedPointMap (tChart O pi u a b) P (tBase O pi u a b (surfaceMk O pi u a b s))) =851            surfaceMk O pi852        (substUnit O α u * shiftUnit O α hα ^ b) (a + b) 0 (chartSubst O α s)) ∧ Eq853      (completedPointMap (tChart O pi u a b) P (tSlope O pi u a b)) =854          surfaceX O pi (substUnit O α u * shiftUnit O α hα ^ b)855      (a + b) 0 + algebraMap O856      (ConcreteSurface O pi (substUnit O α u * shiftUnit O α hα ^ b) (a + b) 0) α ∧ ∀ c : O,857      Eq (completedPointMap (tChart O pi u a b) P (tBase O pi u a b858          (algebraMap O (ConcreteSurface O pi u a b) c))) =859      algebraMap O (ConcreteSurface O pi (substUnit O α u * shiftUnit O α hα ^ b) (a + b) 0) c := by860  obtain ⟨hsC, hsT, hsX, -⟩ := chartSubst_apply_generators O α861  exact rational_point_completion_equiv O pi hpi u a b _ (a + b) 0 (by omega) (axisT O) (axisX O)862    (Or.inl ⟨rfl, rfl⟩) (concrete_surface_parameterIdeal_isMaximal O pi hpi u a b ha) α863    (chartSubst O α).toRingHom hsC hsT hsX864    ((chartSubst_surfaceRelation_origin_and_unit_point O pi u a b).2 α hα) P ‹_› hP865 866/-- The completion of the `x`-chart at its origin `(x, t/x)` is the child concrete surface with867exponents `(a + b, a)`, compatibly with the `x`-chart substitution. -/868theorem x_chart_infinity_completion_equiv (O : Type) [CommRing O] [IsDomain O]869    [IsDiscreteValuationRing O] (pi : O) (hpi : Irreducible pi) (u : (TwoSeries O)ˣ) (a b : ℕ)870    (ha : 0 < a) (P : Ideal (xChart O pi u a b)) [P.IsPrime]871    (hP : P = Ideal.span {xBase O pi u a b (surfaceX O pi u a b), xSlope O pi u a b}) :872    ∃ Eq : CompletedLocalAt (xChart O pi u a b) P ≃+* ConcreteSurface O pi (xSubstUnit O u) (a + b)873        a,874      (∀ s : TwoSeries O,875        Eq (completedPointMap (xChart O pi u a b) P (xBase O pi u a b (surfaceMk O pi u a b s))) =876            surfaceMk O pi877        (xSubstUnit O u) (a + b) a (xChartSubst O s)) ∧ Eq (completedPointMap (xChart O pi u a b) P878            (xSlope O pi u a b)) =879      surfaceX O pi (xSubstUnit O u) (a + b) a ∧ ∀ c : O,880      Eq (completedPointMap (xChart O pi u a b) P (xBase O pi u a b881          (algebraMap O (ConcreteSurface O pi u a b) c))) =882      algebraMap O (ConcreteSurface O pi (xSubstUnit O u) (a + b) a) c := by883  obtain ⟨-, -, -, hsC, hsT, hsX, -⟩ := chartSubst_apply_generators O 0884  obtain ⟨e, h1, h2, h3⟩ := rational_point_completion_equiv O pi hpi u a b (xSubstUnit O u)885    (a + b) a (by omega) (axisX O) (axisT O) (Or.inr ⟨rfl, rfl⟩)886    (by rw [Ideal.span_pair_comm]; exact concrete_surface_parameterIdeal_isMaximal O pi hpi u a b887          ha)888    0 (xChartSubst O).toRingHom hsC hsX (by rw [map_zero, add_zero]; exact hsT)889    (chartSubst_surfaceRelation_base_change_and_x_chart O O (RingHom.id O) pi u a b).2 P ‹_›890    (by rw [hP]; simp only [map_zero, sub_zero]; rfl)891  rw [map_zero, add_zero] at h2892  exact ⟨e, h1, h2, h3⟩893 894end SurfaceBlowup