/- Copyright (c) 2026 LANA Project. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: LANA Project -/ import Iut.Tower.SerreCore /-! # Serre's bound on the different of a Dedekind extension (IUT IV, Proposition 1.3) For Dedekind domains `A βŠ† B` with `B` finite over `A` and separable fraction fields, a maximal ideal `𝔓` of `B` over `𝔭` of `A` with finite residue field, `e = e(𝔓/𝔭)` and `ΞΊ` with `e βˆ‰ 𝔭^{ΞΊ+1}`: `𝔓^{e(ΞΊ+1)} ∀ 𝔇_{B/A}` (`Iut.Serre.not_pow_dvd_differentIdeal`), i.e. `ord_𝔓(𝔇_{B/A}) ≀ e βˆ’ 1 + eΒ·ΞΊ`; with `ΞΊ = ord_𝔭(e)` this is Serre's `ord_𝔓(𝔇) ≀ e βˆ’ 1 + ord_𝔓(e)` (*Local Fields*, III Β§6, Remark after Proposition 13). The proof: by Mathlib's `not_dvd_differentIdeal_of_intTrace_not_mem` it suffices to find `x ∈ J^{ΞΊ+1}` (`𝔭B = 𝔓^eΒ·J`) with `Tr_{B/A}(x) βˆ‰ 𝔭^{ΞΊ+1}`. After localizing at `𝔭` (`Bβ‚š` is free over the discrete valuation ring `Aβ‚š`) the trace modulo `𝔭^{ΞΊ+1}` is the trace of `Bβ‚š/𝔭^{ΞΊ+1}Bβ‚š = Bβ‚š/𝔓^{e(ΞΊ+1)} Γ— Bβ‚š/J^{ΞΊ+1}` over `Aβ‚š/𝔭^{ΞΊ+1}`, and the trace of the first factor is not identically zero (`Iut.Serre.free_and_exists_trace_ne_zero`). -/ namespace Iut.Serre open IsLocalRing nonZeroDivisors attribute [local instance] FractionRing.liftAlgebra FractionRing.isScalarTower_liftAlgebra section Elementary variable {A : Type*} [CommRing A] (𝔭 : Ideal A) [𝔭.IsMaximal] /-- `𝔭 + (s) = 1` for `s βˆ‰ 𝔭`. -/ lemma sup_span_singleton_eq_top {s : A} (hs : s βˆ‰ 𝔭) : 𝔭 βŠ” Ideal.span {s} = ⊀ := by by_contra h have := Ideal.IsMaximal.eq_of_le ‹𝔭.IsMaximalβ€Ί h le_sup_left exact hs (this β–Έ Ideal.mem_sup_right (Ideal.mem_span_singleton_self s)) /-- `s βˆ‰ 𝔭`, `sΒ·a ∈ 𝔭^n` ⟹ `a ∈ 𝔭^n`. -/ lemma mem_pow_of_mul_mem_pow {s a : A} (hs : s βˆ‰ 𝔭) (n : β„•) (h : s * a ∈ 𝔭 ^ n) : a ∈ 𝔭 ^ n := by have hcop : IsCoprime (𝔭 ^ n) (Ideal.span {s}) := (Ideal.isCoprime_iff_sup_eq.mpr (sup_span_singleton_eq_top 𝔭 hs)).pow_left obtain ⟨x, hx, y, hy, hxy⟩ := hcop.exists obtain ⟨c, rfl⟩ := Ideal.mem_span_singleton'.mp hy have : a = a * x + c * (s * a) := by calc a = a * (x + c * s) := by rw [hxy, mul_one] _ = a * x + c * (s * a) := by ring rw [this] exact Ideal.add_mem _ (Ideal.mul_mem_left _ _ hx) (Ideal.mul_mem_left _ _ h) /-- For coprime ideals `I`, `J` there is `w ∈ J` with `1 βˆ’ w ∈ I`. -/ lemma exists_mem_and_one_sub_mem {R : Type*} [CommRing R] {I J : Ideal R} (h : IsCoprime I J) : βˆƒ w ∈ J, 1 - w ∈ I := by obtain ⟨x, hx, y, hy, hxy⟩ := h.exists exact ⟨y, hy, by rw [← hxy, add_sub_cancel_right]; exact hx⟩ end Elementary section Localized variable {A B : Type*} [CommRing A] [CommRing B] [IsDedekindDomain A] [IsDedekindDomain B] [Algebra A B] [Module.Finite A B] [Module.IsTorsionFree A B] variable (𝔭 : Ideal A) [𝔭.IsMaximal] [Finite (A β§Έ 𝔭)] (𝔓 : Ideal B) [𝔓.IsMaximal] [𝔓.LiesOver 𝔭] variable (Rβ‚š Sβ‚š : Type*) [CommRing Rβ‚š] [CommRing Sβ‚š] [Algebra A Rβ‚š] [IsLocalization.AtPrime Rβ‚š 𝔭] [IsLocalRing Rβ‚š] [Algebra B Sβ‚š] [Algebra A Sβ‚š] [Algebra Rβ‚š Sβ‚š] [IsLocalization (Algebra.algebraMapSubmonoid B 𝔭.primeCompl) Sβ‚š] [IsScalarTower A B Sβ‚š] [IsScalarTower A Rβ‚š Sβ‚š] [IsDedekindDomain Rβ‚š] [IsDedekindDomain Sβ‚š] [Module.Finite Rβ‚š Sβ‚š] [Module.Free Rβ‚š Sβ‚š] [Module.IsTorsionFree Rβ‚š Sβ‚š] include Rβ‚š Sβ‚š in /-- **The trace of an element supported at `𝔓` is not divisible by `𝔭^{ΞΊ+1}`**: for `𝔭B = 𝔓^eΒ·J`, `𝔓 + J = 1` and `e βˆ‰ 𝔭^{ΞΊ+1}` there is `x ∈ J^{ΞΊ+1}` with `Tr_{B/A}(x) βˆ‰ 𝔭^{ΞΊ+1}`, computed in the localization `Sβ‚š/Rβ‚š` at `𝔭`. -/ theorem exists_mem_pow_intTrace_notMem (h𝔭 : 𝔭 β‰  βŠ₯) (e ΞΊ : β„•) (J : Ideal B) (he : e β‰  0) (hpB : 𝔭.map (algebraMap A B) = 𝔓 ^ e * J) (hJ : 𝔓 βŠ” J = ⊀) (hΞΊ : ((e : β„•) : A) βˆ‰ 𝔭 ^ (ΞΊ + 1)) : βˆƒ x ∈ J ^ (ΞΊ + 1), Algebra.intTrace A B x βˆ‰ 𝔭 ^ (ΞΊ + 1) := by classical have hinj : Function.Injective (algebraMap A B) := FaithfulSMul.algebraMap_injective A B have h𝔓 : 𝔓 β‰  βŠ₯ := Ideal.ne_bot_of_liesOver_of_ne_bot h𝔭 𝔓 set N := e * (ΞΊ + 1) with hN have hM : Algebra.algebraMapSubmonoid B 𝔭.primeCompl ≀ B⁰ := Submonoid.map_le_of_le_comap _ <| 𝔭.primeCompl_le_nonZeroDivisors.trans (nonZeroDivisors_le_comap_nonZeroDivisors_of_injective _ hinj) have hinjA : Function.Injective (algebraMap A Rβ‚š) := IsLocalization.injective Rβ‚š 𝔭.primeCompl_le_nonZeroDivisors have hinjB : Function.Injective (algebraMap B Sβ‚š) := IsLocalization.injective Sβ‚š hM -- the ideals `π”ͺ = 𝔭Rβ‚š`, `π”“β‚š`, `Jβ‚š` have hπ”ͺ : 𝔭.map (algebraMap A Rβ‚š) = maximalIdeal Rβ‚š := IsLocalization.AtPrime.map_eq_maximalIdeal 𝔭 Rβ‚š have hπ”ͺ0 : maximalIdeal Rβ‚š β‰  βŠ₯ := by rw [← hπ”ͺ] exact (Ideal.map_eq_bot_iff_of_injective hinjA).not.mpr h𝔭 set π”“β‚š : Ideal Sβ‚š := 𝔓.map (algebraMap B Sβ‚š) with hπ”“β‚š set Jβ‚š : Ideal Sβ‚š := J.map (algebraMap B Sβ‚š) with hJβ‚š have hdisj : Disjoint (Algebra.algebraMapSubmonoid B 𝔭.primeCompl : Set B) (𝔓 : Set B) := by rw [Set.disjoint_left] rintro _ ⟨s, hs, rfl⟩ hs𝔓 exact hs (by rw [𝔓.over_def 𝔭]; exact hs𝔓) haveI : π”“β‚š.IsPrime := IsLocalization.isPrime_of_isPrime_disjoint _ Sβ‚š 𝔓 inferInstance hdisj have hπ”“β‚š0 : π”“β‚š β‰  βŠ₯ := (Ideal.map_eq_bot_iff_of_injective hinjB).not.mpr h𝔓 haveI : π”“β‚š.IsMaximal := Ideal.IsPrime.isMaximal inferInstance hπ”“β‚š0 have hpSβ‚š : (maximalIdeal Rβ‚š).map (algebraMap Rβ‚š Sβ‚š) = π”“β‚š ^ e * Jβ‚š := by rw [← hπ”ͺ, Ideal.map_map, ← IsScalarTower.algebraMap_eq, IsScalarTower.algebraMap_eq A B Sβ‚š, ← Ideal.map_map, hpB, Ideal.map_mul, Ideal.map_pow] have hJβ‚š' : π”“β‚š βŠ” Jβ‚š = ⊀ := by rw [hπ”“β‚š, hJβ‚š, ← Ideal.map_sup, hJ, Ideal.map_top] haveI : π”“β‚š.LiesOver (maximalIdeal Rβ‚š) := by constructor refine Ideal.IsMaximal.eq_of_le inferInstance (Ideal.IsPrime.ne_top inferInstance) ?_ change maximalIdeal Rβ‚š ≀ π”“β‚š.comap (algebraMap Rβ‚š Sβ‚š) rw [← Ideal.map_le_iff_le_comap, hpSβ‚š] exact Ideal.mul_le_right.trans (Ideal.pow_le_self he) haveI : Finite (Rβ‚š β§Έ maximalIdeal Rβ‚š) := Finite.of_equiv _ (IsLocalization.AtPrime.equivQuotMaximalIdeal 𝔭 Rβ‚š).toEquiv -- the contraction of `π”ͺ^n` to `A` is `𝔭^n` have hcontr : βˆ€ (n : β„•) (a : A), algebraMap A Rβ‚š a ∈ maximalIdeal Rβ‚š ^ n β†’ a ∈ 𝔭 ^ n := by intro n a ha rw [← hπ”ͺ, ← Ideal.map_pow, IsLocalization.mem_map_algebraMap_iff 𝔭.primeCompl] at ha obtain ⟨⟨x, s⟩, hx⟩ := ha rw [← map_mul] at hx have hx' := hinjA hx exact mem_pow_of_mul_mem_pow 𝔭 s.2 n (by rw [mul_comm, hx']; exact x.2) have hΞΊ' : ((e : β„•) : Rβ‚š) βˆ‰ maximalIdeal Rβ‚š ^ (ΞΊ + 1) := by rw [← map_natCast (algebraMap A Rβ‚š)] exact fun h => hΞΊ (hcontr _ _ h) -- the core: the trace of `Sβ‚š/π”“β‚š^N` over `Rβ‚š/π”ͺ^{ΞΊ+1}` is nonzero letI := quotAlgebra (maximalIdeal Rβ‚š) π”“β‚š e ΞΊ Jβ‚š hpSβ‚š haveI := quotAlgebra_isScalarTower (maximalIdeal Rβ‚š) π”“β‚š e ΞΊ Jβ‚š hpSβ‚š obtain ⟨hfree1, y, hy⟩ := free_and_exists_trace_ne_zero (maximalIdeal Rβ‚š) π”“β‚š e ΞΊ Jβ‚š he hπ”ͺ0 hπ”“β‚š0 hpSβ‚š hJβ‚š' hΞΊ' -- `B β†’ Sβ‚š/π”“β‚š^N` is surjective have hsurjB : βˆ€ z : Sβ‚š β§Έ π”“β‚š ^ N, βˆƒ b : B, Ideal.Quotient.mk (π”“β‚š ^ N) (algebraMap B Sβ‚š b) = z := by intro z obtain ⟨z, rfl⟩ := Ideal.Quotient.mk_surjective z obtain ⟨⟨b, s⟩, rfl⟩ := IsLocalization.mk'_surjective (Algebra.algebraMapSubmonoid B 𝔭.primeCompl) z obtain ⟨sβ‚€, hsβ‚€, hsβ‚€s⟩ := s.2 have hs𝔓 : (s : B) βˆ‰ 𝔓 := by rw [← hsβ‚€s] intro h exact hsβ‚€ (by rw [𝔓.over_def 𝔭]; exact h) have hcop : IsCoprime (𝔓 ^ N) (Ideal.span {(s : B)}) := (Ideal.isCoprime_iff_sup_eq.mpr (sup_span_singleton_eq_top 𝔓 hs𝔓)).pow_left obtain ⟨w, hw, hw1⟩ := exists_mem_and_one_sub_mem hcop obtain ⟨c, rfl⟩ := Ideal.mem_span_singleton'.mp hw refine ⟨b * c, ?_⟩ rw [Ideal.Quotient.eq] have hspec := IsLocalization.mk'_spec Sβ‚š b s have hrel : algebraMap B Sβ‚š (b * c) - IsLocalization.mk' Sβ‚š b s = -(IsLocalization.mk' Sβ‚š b s * algebraMap B Sβ‚š (1 - c * s)) := by simp only [map_mul, map_sub, map_one] linear_combination (-(algebraMap B Sβ‚š c)) * hspec rw [hrel, Ideal.neg_mem_iff] refine Ideal.mul_mem_left _ _ ?_ rw [hπ”“β‚š, ← Ideal.map_pow] exact Ideal.mem_map_of_mem _ hw1 obtain ⟨b, hb⟩ := hsurjB y -- `x ≑ b mod 𝔓^N`, `x ∈ J^{ΞΊ+1}` have hcopB : IsCoprime (𝔓 ^ N) (J ^ (ΞΊ + 1)) := ((Ideal.isCoprime_iff_sup_eq.mpr hJ).pow_left).pow_right obtain ⟨w, hw, hw1⟩ := exists_mem_and_one_sub_mem hcopB set x := b * w with hx have hxQ : x ∈ J ^ (ΞΊ + 1) := Ideal.mul_mem_left _ _ hw have hxb : x - b ∈ 𝔓 ^ N := by have : x - b = -(b * (1 - w)) := by rw [hx]; ring rw [this, Ideal.neg_mem_iff] exact Ideal.mul_mem_left _ _ hw1 have hx1 : Ideal.Quotient.mk (π”“β‚š ^ N) (algebraMap B Sβ‚š x) = y := by rw [← hb, Ideal.Quotient.eq, ← map_sub, hπ”“β‚š, ← Ideal.map_pow] exact Ideal.mem_map_of_mem _ hxb have hx2 : Ideal.Quotient.mk (Jβ‚š ^ (ΞΊ + 1)) (algebraMap B Sβ‚š x) = 0 := by rw [Ideal.Quotient.eq_zero_iff_mem, hJβ‚š, ← Ideal.map_pow] exact Ideal.mem_map_of_mem _ hxQ -- the Chinese remainder decomposition of `Sβ‚š/π”ͺ^{ΞΊ+1}Sβ‚š` have hprod : (maximalIdeal Rβ‚š ^ (ΞΊ + 1)).map (algebraMap Rβ‚š Sβ‚š) = π”“β‚š ^ N * Jβ‚š ^ (ΞΊ + 1) := by rw [Ideal.map_pow, hpSβ‚š, mul_pow, ← pow_mul, hN] have hcopβ‚š : IsCoprime (π”“β‚š ^ N) (Jβ‚š ^ (ΞΊ + 1)) := ((Ideal.isCoprime_iff_sup_eq.mpr hJβ‚š').pow_left).pow_right letI : Algebra (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ Jβ‚š ^ (ΞΊ + 1)) := Ideal.Quotient.algebraQuotientOfLEComap (by rw [← Ideal.map_le_iff_le_comap, hprod]; exact Ideal.mul_le_left) haveI : IsScalarTower Rβ‚š (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ Jβ‚š ^ (ΞΊ + 1)) := IsScalarTower.of_algebraMap_eq' rfl haveI : IsScalarTower Rβ‚š (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ (maximalIdeal Rβ‚š ^ (ΞΊ + 1)).map (algebraMap Rβ‚š Sβ‚š)) := IsScalarTower.of_algebraMap_eq' rfl let E : (Sβ‚š β§Έ (maximalIdeal Rβ‚š ^ (ΞΊ + 1)).map (algebraMap Rβ‚š Sβ‚š)) ≃ₐ[Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)] ((Sβ‚š β§Έ π”“β‚š ^ N) Γ— Sβ‚š β§Έ Jβ‚š ^ (ΞΊ + 1)) := { __ := (Ideal.quotEquivOfEq hprod).trans (Ideal.quotientMulEquivQuotientProd _ _ hcopβ‚š), commutes' := Quotient.ind fun _ ↦ rfl } -- finiteness and freeness of the factors have hfin : βˆ€ (I : Ideal Sβ‚š) [Algebra (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ I)] [IsScalarTower Rβ‚š (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ I)], Module.Finite (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ I) := by intro I _ _ haveI : Module.Finite Rβ‚š (Sβ‚š β§Έ I) := Module.Finite.of_surjective (Ideal.Quotient.mkₐ Rβ‚š I).toLinearMap Ideal.Quotient.mk_surjective exact Module.Finite.of_restrictScalars_finite Rβ‚š _ _ haveI := hfin ((maximalIdeal Rβ‚š ^ (ΞΊ + 1)).map (algebraMap Rβ‚š Sβ‚š)) haveI := hfin (π”“β‚š ^ N) haveI := hfin (Jβ‚š ^ (ΞΊ + 1)) haveI : Nontrivial (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) := Ideal.Quotient.nontrivial_iff.mpr (fun h => Ideal.IsMaximal.ne_top (inferInstance : (maximalIdeal Rβ‚š).IsMaximal) (top_le_iff.mp (h β–Έ Ideal.pow_le_self (Nat.succ_ne_zero ΞΊ)))) haveI : IsLocalRing (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) := IsLocalRing.of_surjective' _ Ideal.Quotient.mk_surjective haveI : Module.Projective (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ Jβ‚š ^ (ΞΊ + 1)) := Module.Projective.of_split (E.symm.toLinearMap βˆ˜β‚— LinearMap.inr _ _ _) (LinearMap.snd _ _ _ βˆ˜β‚— E.toLinearMap) (LinearMap.ext fun z => by simp only [LinearMap.comp_apply, LinearMap.inr_apply, LinearMap.snd_apply, AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, LinearMap.id_apply]) haveI : Module.Free (Rβ‚š β§Έ maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Sβ‚š β§Έ Jβ‚š ^ (ΞΊ + 1)) := Module.free_of_flat_of_isLocalRing -- the trace of `x` modulo `π”ͺ^{ΞΊ+1}` is nonzero have hkey : Ideal.Quotient.mk (maximalIdeal Rβ‚š ^ (ΞΊ + 1)) (Algebra.trace Rβ‚š Sβ‚š (algebraMap B Sβ‚š x)) β‰  0 := by rw [← trace_quotient_mk_map, ← Algebra.trace_eq_of_algEquiv E, Algebra.trace_prod_apply] have hE : E (Ideal.Quotient.mk _ (algebraMap B Sβ‚š x)) = (y, 0) := by ext Β· rw [← hx1] exact Ideal.quotientMulEquivQuotientProd_fst _ _ hcopβ‚š _ Β· rw [← hx2] exact Ideal.quotientMulEquivQuotientProd_snd _ _ hcopβ‚š _ rw [hE, map_zero, add_zero] exact hy refine ⟨x, hxQ, fun hmem => hkey ?_⟩ rw [Ideal.Quotient.eq_zero_iff_mem, ← Algebra.intTrace_eq_trace, ← Algebra.intTrace_eq_of_isLocalization A B 𝔭.primeCompl (Aβ‚˜ := Rβ‚š) (Bβ‚˜ := Sβ‚š) x, ← hπ”ͺ, ← Ideal.map_pow] exact Ideal.mem_map_of_mem _ hmem end Localized section Main variable {A B : Type*} [CommRing A] [CommRing B] [IsDedekindDomain A] [IsDedekindDomain B] [Algebra A B] [Module.Finite A B] [Module.IsTorsionFree A B] [Algebra.IsSeparable (FractionRing A) (FractionRing B)] variable (𝔭 : Ideal A) [𝔭.IsMaximal] [Finite (A β§Έ 𝔭)] (𝔓 : Ideal B) [𝔓.IsMaximal] [𝔓.LiesOver 𝔭] /-- **Serre's bound**: `𝔓^{e(ΞΊ+1)} ∀ 𝔇_{B/A}` for `e = e(𝔓/𝔭)` and `e βˆ‰ 𝔭^{ΞΊ+1}`. -/ theorem not_pow_dvd_differentIdeal (h𝔭 : 𝔭 β‰  βŠ₯) (ΞΊ : β„•) (hΞΊ : ((𝔭.ramificationIdx' 𝔓 : β„•) : A) βˆ‰ 𝔭 ^ (ΞΊ + 1)) : Β¬ 𝔓 ^ (𝔭.ramificationIdx' 𝔓 * (ΞΊ + 1)) ∣ differentIdeal A B := by classical -- the factorization `𝔭B = 𝔓^eΒ·J` have hinj : Function.Injective (algebraMap A B) := FaithfulSMul.algebraMap_injective A B have hpB0 : 𝔭.map (algebraMap A B) β‰  βŠ₯ := (Ideal.map_eq_bot_iff_of_injective hinj).not.mpr h𝔭 have h𝔓 : 𝔓 β‰  βŠ₯ := Ideal.ne_bot_of_liesOver_of_ne_bot h𝔭 𝔓 set e := 𝔭.ramificationIdx' 𝔓 with he_def obtain ⟨J, hJ, hpB⟩ := Ideal.eq_prime_pow_mul_coprime hpB0 𝔓 rw [← Ideal.IsDedekindDomain.ramificationIdx'_eq_normalizedFactors_count hpB0 inferInstance h𝔓, ← he_def] at hpB have he : e β‰  0 := by intro he0 rw [he0, pow_zero, one_mul] at hpB have h1 : 𝔭.map (algebraMap A B) ≀ 𝔓 := Ideal.map_le_iff_le_comap.mpr (𝔓.over_def 𝔭).le rw [hpB] at h1 rw [sup_eq_left.mpr h1] at hJ exact Ideal.IsMaximal.ne_top ‹𝔓.IsMaximalβ€Ί hJ -- the localization at `𝔭` let Rβ‚š := Localization.AtPrime 𝔭 let Sβ‚š := Localization (Algebra.algebraMapSubmonoid B 𝔭.primeCompl) letI : Algebra Rβ‚š Sβ‚š := localizationAlgebra 𝔭.primeCompl B haveI : IsScalarTower A Rβ‚š Sβ‚š := IsScalarTower.of_algebraMap_eq' (by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, ← IsScalarTower.algebraMap_eq]) haveI : IsLocalization (Submonoid.map (algebraMap A B) (Ideal.primeCompl 𝔭)) Sβ‚š := inferInstanceAs (IsLocalization (Algebra.algebraMapSubmonoid B 𝔭.primeCompl) Sβ‚š) have hM : Algebra.algebraMapSubmonoid B 𝔭.primeCompl ≀ B⁰ := Submonoid.map_le_of_le_comap _ <| 𝔭.primeCompl_le_nonZeroDivisors.trans (nonZeroDivisors_le_comap_nonZeroDivisors_of_injective _ hinj) haveI : IsDomain Sβ‚š := IsLocalization.isDomain_of_le_nonZeroDivisors _ hM haveI : Module.IsTorsionFree Rβ‚š Sβ‚š := by rw [Module.isTorsionFree_iff_algebraMap_injective, RingHom.injective_iff_ker_eq_bot, RingHom.ker_eq_bot_iff_eq_zero] simp haveI : Module.Finite Rβ‚š Sβ‚š := .of_isLocalization A B 𝔭.primeCompl haveI : IsIntegrallyClosed Sβ‚š := isIntegrallyClosed_of_isLocalization _ _ hM haveI : IsDiscreteValuationRing Rβ‚š := IsLocalization.AtPrime.isDiscreteValuationRing_of_dedekind_domain A h𝔭 Rβ‚š haveI : Module.Free Rβ‚š Sβ‚š := Module.free_of_finite_type_torsion_free' haveI : IsDedekindDomain Sβ‚š := IsLocalization.isDedekindDomain B hM Sβ‚š obtain ⟨x, hxQ, hint⟩ := exists_mem_pow_intTrace_notMem 𝔭 𝔓 Rβ‚š Sβ‚š h𝔭 e ΞΊ J he hpB hJ hΞΊ have hPQ : 𝔓 ^ (e * (ΞΊ + 1)) * J ^ (ΞΊ + 1) = (𝔭 ^ (ΞΊ + 1)).map (algebraMap A B) := by rw [Ideal.map_pow, hpB, mul_pow, ← pow_mul] exact not_dvd_differentIdeal_of_intTrace_not_mem A (𝔓 ^ (e * (ΞΊ + 1))) (J ^ (ΞΊ + 1)) hPQ x hxQ hint end Main end Iut.Serre