Skip to content

Commit 65da8aa

Browse files
feat: generalize Ideal.spanNorm to allow non free extensions (#19244)
We generalize [Ideal.spanNorm](https://leanprover-community.github.io/mathlib4_docs/Mathlib/RingTheory/Ideal/Norm/RelNorm.html#Ideal.spanNorm) to allow non-free extensions. Currently, `spanNorm`, is defined as ```lean def spanNorm (R : Type*) [CommRing R] {S : Type*} [CommRing S] [Algebra R S] (I : Ideal S) : Ideal R := Ideal.span (Algebra.norm R '' (I : Set S)) ``` but the definition is mathematically meaningless unless `[Module.Finite R S]` and `[Module.Free R S]`. We change this to ```lean def spanNorm (R : Type*) [CommRing R] [IsDomain R] {S : Type*} [CommRing S] [IsDomain S] [IsIntegrallyClosed R] [IsIntegrallyClosed S] [Algebra R S] [Module.Finite R S] [NoZeroSMulDivisors R S] [Algebra.IsSeparable (FractionRing R) (FractionRing S)] (I : Ideal S) : Ideal R := Ideal.span (Algebra.intNorm R S '' (I : Set S)) ``` that is the mathematically correct definition, notably in the case `R` and `S` are the rings of integers in an extension of number fields. From flt-regular Co-authored-by: Andrew Yang <a.yang24@imperial.ac.uk>
1 parent 4eafc86 commit 65da8aa

File tree

4 files changed

+161
-73
lines changed

4 files changed

+161
-73
lines changed

Mathlib/RingTheory/DedekindDomain/IntegralClosure.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,4 +247,9 @@ instance integralClosure.isDedekindDomain_fractionRing [IsDedekindDomain A] :
247247
IsDedekindDomain (integralClosure A L) :=
248248
integralClosure.isDedekindDomain A (FractionRing A) L
249249

250+
attribute [local instance] FractionRing.liftAlgebra in
251+
instance [NoZeroSMulDivisors A C] [Module.Finite A C] [IsIntegrallyClosed C] :
252+
IsLocalization (Algebra.algebraMapSubmonoid C A⁰) (FractionRing C) :=
253+
IsIntegralClosure.isLocalization _ (FractionRing A) _ _
254+
250255
end IsIntegralClosure

Mathlib/RingTheory/DedekindDomain/PID.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ theorem IsPrincipalIdealRing.of_finite_primes [IsDedekindDomain R]
183183

184184
variable [IsDedekindDomain R]
185185
variable (S : Type*) [CommRing S]
186-
variable [Algebra R S] [Module.Free R S] [Module.Finite R S]
186+
variable [Algebra R S] [NoZeroSMulDivisors R S] [Module.Finite R S]
187187
variable (p : Ideal R) (hp0 : p ≠ ⊥) [IsPrime p]
188188
variable {Sₚ : Type*} [CommRing Sₚ] [Algebra S Sₚ]
189189
variable [IsLocalization (Algebra.algebraMapSubmonoid S p.primeCompl) Sₚ]

Mathlib/RingTheory/Ideal/Norm/RelNorm.lean

Lines changed: 128 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Anne Baanen, Alex J. Best
66
import Mathlib.LinearAlgebra.FreeModule.PID
77
import Mathlib.RingTheory.DedekindDomain.PID
88
import Mathlib.RingTheory.Localization.NormTrace
9+
import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
910

1011
/-!
1112
@@ -34,153 +35,206 @@ namespace Ideal
3435

3536
open Submodule
3637

37-
variable (R : Type*) [CommRing R] {S : Type*} [CommRing S] [Algebra R S]
38+
attribute [local instance] FractionRing.liftAlgebra
3839

39-
/-- `Ideal.spanNorm R (I : Ideal S)` is the ideal generated by mapping `Algebra.norm R` over `I`.
40+
variable (R S : Type*) [CommRing R] [IsDomain R] {S : Type*} [CommRing S] [IsDomain S]
41+
variable [IsIntegrallyClosed R] [IsIntegrallyClosed S] [Algebra R S] [Module.Finite R S]
42+
variable [NoZeroSMulDivisors R S] [Algebra.IsSeparable (FractionRing R) (FractionRing S)]
43+
44+
/-- `Ideal.spanNorm R (I : Ideal S)` is the ideal generated by mapping `Algebra.intNorm R S`
45+
over `I`.
4046
4147
See also `Ideal.relNorm`.
4248
-/
4349
def spanNorm (I : Ideal S) : Ideal R :=
44-
Ideal.span (Algebra.norm R '' (I : Set S))
50+
Ideal.map (Algebra.intNorm R S) I
4551

4652
@[simp]
47-
theorem spanNorm_bot [Nontrivial S] [Module.Free R S] [Module.Finite R S] :
53+
theorem spanNorm_bot :
4854
spanNorm R (⊥ : Ideal S) = ⊥ := span_eq_bot.mpr fun x hx => by simpa using hx
4955

5056
variable {R}
5157

5258
@[simp]
53-
theorem spanNorm_eq_bot_iff [IsDomain R] [IsDomain S] [Module.Free R S] [Module.Finite R S]
54-
{I : Ideal S} : spanNorm R I = ⊥ ↔ I = ⊥ := by
55-
simp only [spanNorm, Ideal.span_eq_bot, Set.mem_image, SetLike.mem_coe, forall_exists_index,
56-
and_imp, forall_apply_eq_imp_iff₂,
57-
Algebra.norm_eq_zero_iff_of_basis (Module.Free.chooseBasis R S), @eq_bot_iff _ _ _ I,
58-
SetLike.le_def]
59+
theorem spanNorm_eq_bot_iff {I : Ideal S} : spanNorm R I = ⊥ ↔ I = ⊥ := by
60+
simp only [spanNorm, span_eq_bot, Set.mem_image, SetLike.mem_coe, forall_exists_index, and_imp,
61+
forall_apply_eq_imp_iff₂, Algebra.intNorm_eq_zero, @eq_bot_iff _ _ _ I, SetLike.le_def, map]
5962
rfl
6063

6164
variable (R)
6265

63-
theorem norm_mem_spanNorm {I : Ideal S} (x : S) (hx : x ∈ I) : Algebra.norm R x ∈ I.spanNorm R :=
66+
theorem intNorm_mem_spanNorm {I : Ideal S} {x : S} (hx : x ∈ I) :
67+
Algebra.intNorm R S x ∈ I.spanNorm R :=
6468
subset_span (Set.mem_image_of_mem _ hx)
6569

70+
theorem norm_mem_spanNorm [Module.Free R S] {I : Ideal S} (x : S) (hx : x ∈ I) :
71+
Algebra.norm R x ∈ I.spanNorm R := by
72+
refine subset_span ⟨x, hx, ?_⟩
73+
rw [Algebra.intNorm_eq_norm]
74+
6675
@[simp]
67-
theorem spanNorm_singleton {r : S} : spanNorm R (span ({r} : Set S)) = span {Algebra.norm R r} :=
76+
theorem spanNorm_singleton {r : S} :
77+
spanNorm R (span ({r} : Set S)) = span {Algebra.intNorm R S r} :=
6878
le_antisymm
6979
(span_le.mpr fun x hx =>
7080
mem_span_singleton.mpr
7181
(by
7282
obtain ⟨x, hx', rfl⟩ := (Set.mem_image _ _ _).mp hx
7383
exact map_dvd _ (mem_span_singleton.mp hx')))
74-
((span_singleton_le_iff_mem _).mpr (norm_mem_spanNorm _ _ (mem_span_singleton_self _)))
84+
((span_singleton_le_iff_mem _).mpr (intNorm_mem_spanNorm _ (mem_span_singleton_self _)))
7585

7686
@[simp]
7787
theorem spanNorm_top : spanNorm R (⊤ : Ideal S) = ⊤ := by
78-
-- Porting note: was
79-
-- simp [← Ideal.span_singleton_one]
80-
rw [← Ideal.span_singleton_one, spanNorm_singleton]
81-
simp
82-
83-
theorem map_spanNorm (I : Ideal S) {T : Type*} [CommRing T] (f : R →+* T) :
84-
map f (spanNorm R I) = span (f ∘ Algebra.norm R '' (I : Set S)) := by
85-
rw [spanNorm, map_span, Set.image_image]
86-
-- Porting note: `Function.comp` reducibility
87-
rfl
88+
simp [← Ideal.span_singleton_one]
89+
90+
theorem map_spanIntNorm (I : Ideal S) {T : Type*} [CommRing T] (f : R →+* T) :
91+
map f (spanNorm R I) = span (f ∘ Algebra.intNorm R S '' (I : Set S)) := by
92+
rw [spanNorm]
93+
nth_rw 2 [map]
94+
simp [map_span, Set.image_image]
8895

8996
@[mono]
9097
theorem spanNorm_mono {I J : Ideal S} (h : I ≤ J) : spanNorm R I ≤ spanNorm R J :=
9198
Ideal.span_mono (Set.monotone_image h)
9299

93-
theorem spanNorm_localization (I : Ideal S) [Module.Finite R S] [Module.Free R S] (M : Submonoid R)
100+
theorem spanIntNorm_localization (I : Ideal S) (M : Submonoid R) (hM : M ≤ R⁰)
94101
{Rₘ : Type*} (Sₘ : Type*) [CommRing Rₘ] [Algebra R Rₘ] [CommRing Sₘ] [Algebra S Sₘ]
95102
[Algebra Rₘ Sₘ] [Algebra R Sₘ] [IsScalarTower R Rₘ Sₘ] [IsScalarTower R S Sₘ]
96-
[IsLocalization M Rₘ] [IsLocalization (Algebra.algebraMapSubmonoid S M) Sₘ] :
103+
[IsLocalization M Rₘ] [IsLocalization (Algebra.algebraMapSubmonoid S M) Sₘ]
104+
[IsIntegrallyClosed Rₘ] [IsDomain Rₘ] [IsDomain Sₘ] [NoZeroSMulDivisors Rₘ Sₘ]
105+
[Module.Finite Rₘ Sₘ] [IsIntegrallyClosed Sₘ]
106+
[Algebra.IsSeparable (FractionRing Rₘ) (FractionRing Sₘ)] :
97107
spanNorm Rₘ (I.map (algebraMap S Sₘ)) = (spanNorm R I).map (algebraMap R Rₘ) := by
98-
cases subsingleton_or_nontrivial R
99-
· haveI := IsLocalization.unique R Rₘ M
100-
simp [eq_iff_true_of_subsingleton]
101-
let b := Module.Free.chooseBasis R S
102-
rw [map_spanNorm]
108+
let K := FractionRing R
109+
let f : Rₘ →+* K := IsLocalization.map _ (T := R⁰) (RingHom.id R) hM
110+
let L := FractionRing S
111+
let g : Sₘ →+* L := IsLocalization.map _ (M := Algebra.algebraMapSubmonoid S M) (T := S⁰)
112+
(RingHom.id S) (Submonoid.map_le_of_le_comap _ <| hM.trans
113+
(nonZeroDivisors_le_comap_nonZeroDivisors_of_injective _
114+
(NoZeroSMulDivisors.algebraMap_injective _ _)))
115+
algebraize [f, g, (algebraMap K L).comp f]
116+
have : IsScalarTower R Rₘ K := IsScalarTower.of_algebraMap_eq'
117+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHomCompTriple.comp_eq])
118+
let _ := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization M Rₘ K
119+
have : IsScalarTower S Sₘ L := IsScalarTower.of_algebraMap_eq'
120+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHomCompTriple.comp_eq])
121+
have : IsScalarTower Rₘ Sₘ L := by
122+
apply IsScalarTower.of_algebraMap_eq'
123+
apply IsLocalization.ringHom_ext M
124+
rw [RingHom.algebraMap_toAlgebra, RingHom.algebraMap_toAlgebra (R := Sₘ), RingHom.comp_assoc,
125+
RingHom.comp_assoc, ← IsScalarTower.algebraMap_eq, IsScalarTower.algebraMap_eq R S Sₘ,
126+
IsLocalization.map_comp, RingHom.comp_id, ← RingHom.comp_assoc, IsLocalization.map_comp,
127+
RingHom.comp_id, ← IsScalarTower.algebraMap_eq, ← IsScalarTower.algebraMap_eq]
128+
let _ := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization
129+
(Algebra.algebraMapSubmonoid S M) Sₘ L
130+
have : IsIntegralClosure Sₘ Rₘ L :=
131+
IsIntegralClosure.of_isIntegrallyClosed _ _ _
132+
rw [map_spanIntNorm]
103133
refine span_eq_span (Set.image_subset_iff.mpr ?_) (Set.image_subset_iff.mpr ?_)
104-
· rintro a' ha'
105-
simp only [Set.mem_preimage, submodule_span_eq, ← map_spanNorm, SetLike.mem_coe,
134+
· intro a' ha'
135+
simp only [Set.mem_preimage, submodule_span_eq, ← map_spanIntNorm, SetLike.mem_coe,
106136
IsLocalization.mem_map_algebraMap_iff (Algebra.algebraMapSubmonoid S M) Sₘ,
107137
IsLocalization.mem_map_algebraMap_iff M Rₘ, Prod.exists] at ha' ⊢
108138
obtain ⟨⟨a, ha⟩, ⟨_, ⟨s, hs, rfl⟩⟩, has⟩ := ha'
109-
refine ⟨⟨Algebra.norm R a, norm_mem_spanNorm _ _ ha⟩,
110-
⟨s ^ Fintype.card (Module.Free.ChooseBasisIndex R S), pow_mem hs _⟩, ?_⟩
139+
refine ⟨⟨Algebra.intNorm R S a, intNorm_mem_spanNorm _ ha⟩,
140+
⟨s ^ Module.finrank K L, pow_mem hs _⟩, ?_⟩
111141
simp only [Submodule.coe_mk, Subtype.coe_mk, map_pow] at has ⊢
112-
apply_fun Algebra.norm Rₘ at has
113-
rwa [_root_.map_mul, ← IsScalarTower.algebraMap_apply, IsScalarTower.algebraMap_apply R Rₘ,
114-
Algebra.norm_algebraMap_of_basis (b.localizationLocalization Rₘ M Sₘ),
115-
Algebra.norm_localization R M a] at has
142+
apply_fun algebraMap _ L at has
143+
apply_fun Algebra.norm K at has
144+
simp only [_root_.map_mul, IsScalarTower.algebraMap_apply R Rₘ Sₘ] at has
145+
rw [← IsScalarTower.algebraMap_apply, ← IsScalarTower.algebraMap_apply,
146+
← IsScalarTower.algebraMap_apply,
147+
IsScalarTower.algebraMap_apply R K L,
148+
Algebra.norm_algebraMap] at has
149+
apply IsFractionRing.injective Rₘ K
150+
simp only [_root_.map_mul, map_pow]
151+
have : FiniteDimensional K L := Module.Finite_of_isLocalization R S _ _ R⁰
152+
rwa [Algebra.algebraMap_intNorm (L := L), ← IsScalarTower.algebraMap_apply,
153+
← IsScalarTower.algebraMap_apply, Algebra.algebraMap_intNorm (L := L)]
116154
· intro a ha
117-
rw [Set.mem_preimage, Function.comp_apply, ← Algebra.norm_localization (Sₘ := Sₘ) R M a]
155+
rw [Set.mem_preimage, Function.comp_apply, Algebra.intNorm_eq_of_isLocalization
156+
(A := R) (B := S) M (Aₘ := Rₘ) (Bₘ := Sₘ)]
118157
exact subset_span (Set.mem_image_of_mem _ (mem_map_of_mem _ ha))
119158

120159
theorem spanNorm_mul_spanNorm_le (I J : Ideal S) :
121160
spanNorm R I * spanNorm R J ≤ spanNorm R (I * J) := by
122-
rw [spanNorm, spanNorm, spanNorm, Ideal.span_mul_span', ← Set.image_mul]
161+
rw [spanNorm, spanNorm, spanNorm]
162+
nth_rw 1 [map]; nth_rw 1 [map]
163+
rw [Ideal.span_mul_span', ← Set.image_mul]
123164
refine Ideal.span_mono (Set.monotone_image ?_)
124165
rintro _ ⟨x, hxI, y, hyJ, rfl⟩
125166
exact Ideal.mul_mem_mul hxI hyJ
126167

127168
/-- This condition `eq_bot_or_top` is equivalent to being a field.
128169
However, `Ideal.spanNorm_mul_of_field` is harder to apply since we'd need to upgrade a `CommRing R`
129170
instance to a `Field R` instance. -/
130-
theorem spanNorm_mul_of_bot_or_top [IsDomain R] [IsDomain S] [Module.Free R S] [Module.Finite R S]
131-
(eq_bot_or_top : ∀ I : Ideal R, I = ⊥ ∨ I = ⊤) (I J : Ideal S) :
171+
theorem spanNorm_mul_of_bot_or_top (eq_bot_or_top : ∀ I : Ideal R, I = ⊥ ∨ I = ⊤) (I J : Ideal S) :
132172
spanNorm R (I * J) = spanNorm R I * spanNorm R J := by
133173
refine le_antisymm ?_ (spanNorm_mul_spanNorm_le R _ _)
134-
cases' eq_bot_or_top (spanNorm R I) with hI hI
174+
rcases eq_bot_or_top (spanNorm R I) with hI | hI
135175
· rw [hI, spanNorm_eq_bot_iff.mp hI, bot_mul, spanNorm_bot]
136176
exact bot_le
137177
rw [hI, Ideal.top_mul]
138-
cases' eq_bot_or_top (spanNorm R J) with hJ hJ
178+
rcases eq_bot_or_top (spanNorm R J) with hJ | hJ
139179
· rw [hJ, spanNorm_eq_bot_iff.mp hJ, mul_bot, spanNorm_bot]
140180
rw [hJ]
141181
exact le_top
142182

143-
@[simp]
144-
theorem spanNorm_mul_of_field {K : Type*} [Field K] [Algebra K S] [IsDomain S] [Module.Finite K S]
145-
(I J : Ideal S) : spanNorm K (I * J) = spanNorm K I * spanNorm K J :=
146-
spanNorm_mul_of_bot_or_top K eq_bot_or_top I J
147-
148-
variable [IsDomain R] [IsDomain S] [IsDedekindDomain R] [IsDedekindDomain S]
149-
variable [Module.Finite R S] [Module.Free R S]
183+
variable [IsDedekindDomain R] [IsDedekindDomain S]
150184

151185
/-- Multiplicativity of `Ideal.spanNorm`. simp-normal form is `map_mul (Ideal.relNorm R)`. -/
152186
theorem spanNorm_mul (I J : Ideal S) : spanNorm R (I * J) = spanNorm R I * spanNorm R J := by
153187
nontriviality R
154188
cases subsingleton_or_nontrivial S
155-
· have : ∀ I : Ideal S, I = ⊤ := fun I => Subsingleton.elim I ⊤
189+
· have : ∀ I : Ideal S, I = ⊤ := fun I Subsingleton.elim I ⊤
156190
simp [this I, this J, this (I * J)]
157-
refine eq_of_localization_maximal ?_
158-
intro P hP
191+
refine eq_of_localization_maximal (fun P hP ↦ ?_)
159192
by_cases hP0 : P = ⊥
160193
· subst hP0
161194
rw [spanNorm_mul_of_bot_or_top]
162195
intro I
163-
refine or_iff_not_imp_right.mpr fun hI => ?_
164-
exact (hP.eq_of_le hI bot_le).symm
196+
exact or_iff_not_imp_right.mpr fun hI ↦ (hP.eq_of_le hI bot_le).symm
165197
let P' := Algebra.algebraMapSubmonoid S P.primeCompl
166-
letI : Algebra (Localization.AtPrime P) (Localization P') := localizationAlgebra P.primeCompl S
167-
haveI : IsScalarTower R (Localization.AtPrime P) (Localization P') :=
198+
let Rₚ := Localization.AtPrime P
199+
let Sₚ := Localization P'
200+
let _ : Algebra Rₚ Sₚ := localizationAlgebra P.primeCompl S
201+
have : IsScalarTower R Rₚ Sₚ :=
168202
IsScalarTower.of_algebraMap_eq (fun x =>
169203
(IsLocalization.map_eq (T := P') (Q := Localization P') P.primeCompl.le_comap_map x).symm)
170204
have h : P' ≤ S⁰ :=
171205
map_le_nonZeroDivisors_of_injective _ (NoZeroSMulDivisors.algebraMap_injective _ _)
172206
P.primeCompl_le_nonZeroDivisors
173-
haveI : IsDomain (Localization P') := IsLocalization.isDomain_localization h
174-
haveI : IsDedekindDomain (Localization P') := IsLocalization.isDedekindDomain S h _
175-
letI := Classical.decEq (Ideal (Localization P'))
176-
haveI : IsPrincipalIdealRing (Localization P') :=
207+
have : IsDomain Sₚ := IsLocalization.isDomain_localization h
208+
have : IsDedekindDomain Sₚ := IsLocalization.isDedekindDomain S h _
209+
have : IsPrincipalIdealRing Sₚ :=
177210
IsDedekindDomain.isPrincipalIdealRing_localization_over_prime S P hP0
178-
rw [Ideal.map_mul, ← spanNorm_localization R I P.primeCompl (Localization P'),
179-
← spanNorm_localization R J P.primeCompl (Localization P'),
180-
← spanNorm_localization R (I * J) P.primeCompl (Localization P'), Ideal.map_mul,
181-
← (I.map _).span_singleton_generator, ← (J.map _).span_singleton_generator,
211+
have := NoZeroSMulDivisors_of_isLocalization R S Rₚ Sₚ P.primeCompl_le_nonZeroDivisors
212+
have := Module.Finite_of_isLocalization R S Rₚ Sₚ P.primeCompl
213+
let L := FractionRing S
214+
let g : Sₚ →+* L := IsLocalization.map _ (M := P') (T := S⁰) (RingHom.id S) h
215+
algebraize [g]
216+
have : IsScalarTower S Sₚ (FractionRing S) := IsScalarTower.of_algebraMap_eq'
217+
(by rw [RingHom.algebraMap_toAlgebra, IsLocalization.map_comp, RingHom.comp_id])
218+
have := IsFractionRing.isFractionRing_of_isDomain_of_isLocalization P' Sₚ (FractionRing S)
219+
have : Algebra.IsSeparable (FractionRing Rₚ) (FractionRing Sₚ) := by
220+
apply Algebra.IsSeparable.of_equiv_equiv
221+
(FractionRing.algEquiv Rₚ (FractionRing R)).symm.toRingEquiv
222+
(FractionRing.algEquiv Sₚ (FractionRing S)).symm.toRingEquiv
223+
apply IsLocalization.ringHom_ext R⁰
224+
ext
225+
simp only [AlgEquiv.toRingEquiv_eq_coe, RingHom.coe_comp,
226+
RingHom.coe_coe, Function.comp_apply, ← IsScalarTower.algebraMap_apply]
227+
rw [IsScalarTower.algebraMap_apply R Rₚ (FractionRing R), AlgEquiv.coe_ringEquiv,
228+
AlgEquiv.commutes, IsScalarTower.algebraMap_apply R S L,
229+
IsScalarTower.algebraMap_apply S Sₚ L, AlgEquiv.coe_ringEquiv, AlgEquiv.commutes]
230+
simp only [← IsScalarTower.algebraMap_apply]
231+
rw [IsScalarTower.algebraMap_apply R Rₚ (FractionRing Rₚ),
232+
← IsScalarTower.algebraMap_apply Rₚ, ← IsScalarTower.algebraMap_apply]
233+
simp only [Ideal.map_mul, ← spanIntNorm_localization (R := R) (S := S)
234+
(Rₘ := Localization.AtPrime P) (Sₘ := Localization P') _ _ P.primeCompl_le_nonZeroDivisors]
235+
rw [← (I.map _).span_singleton_generator, ← (J.map _).span_singleton_generator,
182236
span_singleton_mul_span_singleton, spanNorm_singleton, spanNorm_singleton,
183-
spanNorm_singleton, span_singleton_mul_span_singleton, _root_.map_mul]
237+
spanNorm_singleton, span_singleton_mul_span_singleton, _root_.map_mul]
184238

185239
/-- The relative norm `Ideal.relNorm R (I : Ideal S)`, where `R` and `S` are Dedekind domains,
186240
and `S` is an extension of `R` that is finite and free as a module. -/
@@ -190,7 +244,8 @@ def relNorm : Ideal S →*₀ Ideal R where
190244
map_one' := by dsimp only; rw [one_eq_top, spanNorm_top R, one_eq_top]
191245
map_mul' := spanNorm_mul R
192246

193-
theorem relNorm_apply (I : Ideal S) : relNorm R I = span (Algebra.norm R '' (I : Set S) : Set R) :=
247+
theorem relNorm_apply (I : Ideal S) :
248+
relNorm R I = span (Algebra.intNorm R S '' (I : Set S) : Set R) :=
194249
rfl
195250

196251
@[simp]
@@ -212,16 +267,17 @@ theorem relNorm_eq_bot_iff {I : Ideal S} : relNorm R I = ⊥ ↔ I = ⊥ :=
212267

213268
variable (R)
214269

215-
theorem norm_mem_relNorm (I : Ideal S) {x : S} (hx : x ∈ I) : Algebra.norm R x ∈ relNorm R I :=
270+
theorem norm_mem_relNorm [Module.Free R S] (I : Ideal S) {x : S} (hx : x ∈ I) :
271+
Algebra.norm R x ∈ relNorm R I :=
216272
norm_mem_spanNorm R x hx
217273

218274
@[simp]
219-
theorem relNorm_singleton (r : S) : relNorm R (span ({r} : Set S)) = span {Algebra.norm R r} :=
275+
theorem relNorm_singleton (r : S) : relNorm R (span ({r} : Set S)) = span {Algebra.intNorm R S r} :=
220276
spanNorm_singleton R
221277

222278
theorem map_relNorm (I : Ideal S) {T : Type*} [CommRing T] (f : R →+* T) :
223-
map f (relNorm R I) = span (f ∘ Algebra.norm R '' (I : Set S)) :=
224-
map_spanNorm R I f
279+
map f (relNorm R I) = span (f ∘ Algebra.intNorm R S '' (I : Set S)) :=
280+
map_spanIntNorm R I f
225281

226282
@[mono]
227283
theorem relNorm_mono {I J : Ideal S} (h : I ≤ J) : relNorm R I ≤ relNorm R J :=

Mathlib/RingTheory/Localization/Ideal.lean

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Kenny Lau, Mario Carneiro, Johan Commelin, Amelia Livingston, Anne Baan
66
import Mathlib.GroupTheory.MonoidLocalization.Away
77
import Mathlib.RingTheory.Ideal.Quotient.Operations
88
import Mathlib.RingTheory.Localization.Defs
9+
import Mathlib.Algebra.Algebra.Tower
910

1011
/-!
1112
# Ideals in localizations of commutative rings
@@ -253,6 +254,32 @@ theorem ideal_eq_iInf_comap_map_away {S : Finset R} (hS : Ideal.span (α := R) S
253254
rw [pow_add, mul_assoc, ← mul_comm x, e]
254255
exact I.mul_mem_left _ y.2
255256

257+
variable (R) in
258+
lemma _root_.NoZeroSMulDivisors_of_isLocalization (Rₚ Sₚ : Type*) [CommRing Rₚ] [CommRing Sₚ]
259+
[Algebra R Rₚ] [Algebra R Sₚ] [Algebra S Sₚ] [Algebra Rₚ Sₚ] [IsScalarTower R S Sₚ]
260+
[IsScalarTower R Rₚ Sₚ] {M : Submonoid R} (hM : M ≤ R⁰) [IsLocalization M Rₚ]
261+
[IsLocalization (Algebra.algebraMapSubmonoid S M) Sₚ] [NoZeroSMulDivisors R S] [IsDomain S] :
262+
NoZeroSMulDivisors Rₚ Sₚ := by
263+
have e : Algebra.algebraMapSubmonoid S M ≤ S⁰ :=
264+
Submonoid.map_le_of_le_comap _ <| hM.trans
265+
(nonZeroDivisors_le_comap_nonZeroDivisors_of_injective _
266+
(NoZeroSMulDivisors.algebraMap_injective _ _))
267+
have : IsDomain Sₚ := IsLocalization.isDomain_of_le_nonZeroDivisors S e
268+
have : algebraMap Rₚ Sₚ = IsLocalization.map (T := Algebra.algebraMapSubmonoid S M) Sₚ
269+
(algebraMap R S) (Submonoid.le_comap_map M) := by
270+
apply IsLocalization.ringHom_ext M
271+
simp only [IsLocalization.map_comp, ← IsScalarTower.algebraMap_eq]
272+
rw [NoZeroSMulDivisors.iff_algebraMap_injective, RingHom.injective_iff_ker_eq_bot,
273+
RingHom.ker_eq_bot_iff_eq_zero]
274+
intro x hx
275+
obtain ⟨x, s, rfl⟩ := IsLocalization.mk'_surjective M x
276+
simp only [RingHom.algebraMap_toAlgebra, IsLocalization.map_mk', IsLocalization.mk'_eq_zero_iff,
277+
Subtype.exists, exists_prop, this] at hx ⊢
278+
obtain ⟨_, ⟨a, ha, rfl⟩, H⟩ := hx
279+
simp only [← _root_.map_mul,
280+
(injective_iff_map_eq_zero' _).mp (NoZeroSMulDivisors.algebraMap_injective R S)] at H
281+
exact ⟨a, ha, H⟩
282+
256283
end CommRing
257284

258285
end IsLocalization

0 commit comments

Comments
 (0)