@@ -6,6 +6,7 @@ Authors: Anne Baanen, Alex J. Best
6
6
import Mathlib.LinearAlgebra.FreeModule.PID
7
7
import Mathlib.RingTheory.DedekindDomain.PID
8
8
import Mathlib.RingTheory.Localization.NormTrace
9
+ import Mathlib.RingTheory.IntegralClosure.IntegralRestrict
9
10
10
11
/-!
11
12
@@ -34,153 +35,206 @@ namespace Ideal
34
35
35
36
open Submodule
36
37
37
- variable (R : Type *) [CommRing R] {S : Type *} [CommRing S] [Algebra R S]
38
+ attribute [local instance] FractionRing.liftAlgebra
38
39
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`.
40
46
41
47
See also `Ideal.relNorm`.
42
48
-/
43
49
def spanNorm (I : Ideal S) : Ideal R :=
44
- Ideal.span (Algebra.norm R '' (I : Set S))
50
+ Ideal.map (Algebra.intNorm R S) I
45
51
46
52
@[simp]
47
- theorem spanNorm_bot [Nontrivial S] [Module.Free R S] [Module.Finite R S] :
53
+ theorem spanNorm_bot :
48
54
spanNorm R (⊥ : Ideal S) = ⊥ := span_eq_bot.mpr fun x hx => by simpa using hx
49
55
50
56
variable {R}
51
57
52
58
@[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]
59
62
rfl
60
63
61
64
variable (R)
62
65
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 :=
64
68
subset_span (Set.mem_image_of_mem _ hx)
65
69
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
+
66
75
@[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} :=
68
78
le_antisymm
69
79
(span_le.mpr fun x hx =>
70
80
mem_span_singleton.mpr
71
81
(by
72
82
obtain ⟨x, hx', rfl⟩ := (Set.mem_image _ _ _).mp hx
73
83
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 _)))
75
85
76
86
@[simp]
77
87
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]
88
95
89
96
@[mono]
90
97
theorem spanNorm_mono {I J : Ideal S} (h : I ≤ J) : spanNorm R I ≤ spanNorm R J :=
91
98
Ideal.span_mono (Set.monotone_image h)
92
99
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⁰ )
94
101
{Rₘ : Type *} (Sₘ : Type *) [CommRing Rₘ] [Algebra R Rₘ] [CommRing Sₘ] [Algebra S Sₘ]
95
102
[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ₘ)] :
97
107
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]
103
133
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,
106
136
IsLocalization.mem_map_algebraMap_iff (Algebra.algebraMapSubmonoid S M) Sₘ,
107
137
IsLocalization.mem_map_algebraMap_iff M Rₘ, Prod.exists] at ha' ⊢
108
138
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 _⟩, ?_⟩
111
141
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)]
116
154
· 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ₘ)]
118
157
exact subset_span (Set.mem_image_of_mem _ (mem_map_of_mem _ ha))
119
158
120
159
theorem spanNorm_mul_spanNorm_le (I J : Ideal S) :
121
160
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]
123
164
refine Ideal.span_mono (Set.monotone_image ?_)
124
165
rintro _ ⟨x, hxI, y, hyJ, rfl⟩
125
166
exact Ideal.mul_mem_mul hxI hyJ
126
167
127
168
/-- This condition `eq_bot_or_top` is equivalent to being a field.
128
169
However, `Ideal.spanNorm_mul_of_field` is harder to apply since we'd need to upgrade a `CommRing R`
129
170
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) :
132
172
spanNorm R (I * J) = spanNorm R I * spanNorm R J := by
133
173
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
135
175
· rw [hI, spanNorm_eq_bot_iff.mp hI, bot_mul, spanNorm_bot]
136
176
exact bot_le
137
177
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
139
179
· rw [hJ, spanNorm_eq_bot_iff.mp hJ, mul_bot, spanNorm_bot]
140
180
rw [hJ]
141
181
exact le_top
142
182
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]
150
184
151
185
/-- Multiplicativity of `Ideal.spanNorm`. simp-normal form is `map_mul (Ideal.relNorm R)`. -/
152
186
theorem spanNorm_mul (I J : Ideal S) : spanNorm R (I * J) = spanNorm R I * spanNorm R J := by
153
187
nontriviality R
154
188
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 ⊤
156
190
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 ↦ ?_)
159
192
by_cases hP0 : P = ⊥
160
193
· subst hP0
161
194
rw [spanNorm_mul_of_bot_or_top]
162
195
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
165
197
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ₚ :=
168
202
IsScalarTower.of_algebraMap_eq (fun x =>
169
203
(IsLocalization.map_eq (T := P') (Q := Localization P') P.primeCompl.le_comap_map x).symm)
170
204
have h : P' ≤ S⁰ :=
171
205
map_le_nonZeroDivisors_of_injective _ (NoZeroSMulDivisors.algebraMap_injective _ _)
172
206
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ₚ :=
177
210
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,
182
236
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]
184
238
185
239
/-- The relative norm `Ideal.relNorm R (I : Ideal S)`, where `R` and `S` are Dedekind domains,
186
240
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
190
244
map_one' := by dsimp only; rw [one_eq_top, spanNorm_top R, one_eq_top]
191
245
map_mul' := spanNorm_mul R
192
246
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) :=
194
249
rfl
195
250
196
251
@[simp]
@@ -212,16 +267,17 @@ theorem relNorm_eq_bot_iff {I : Ideal S} : relNorm R I = ⊥ ↔ I = ⊥ :=
212
267
213
268
variable (R)
214
269
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 :=
216
272
norm_mem_spanNorm R x hx
217
273
218
274
@[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} :=
220
276
spanNorm_singleton R
221
277
222
278
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
225
281
226
282
@[mono]
227
283
theorem relNorm_mono {I J : Ideal S} (h : I ≤ J) : relNorm R I ≤ relNorm R J :=
0 commit comments