@@ -4,12 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Mario Carneiro, Kevin Buzzard
5
5
-/
6
6
7
- import algebra.module
8
- import order.order_iso
9
- import data.fintype data.polynomial
7
+ import data.equiv.algebra
8
+ import data.polynomial
10
9
import linear_algebra.lc
11
- import tactic.tidy
12
- import ring_theory.ideals
10
+ import ring_theory.ideal_operations
13
11
14
12
open set lattice
15
13
@@ -26,11 +24,172 @@ theorem fg_def {s : submodule α β} :
26
24
exact ⟨t, rfl⟩
27
25
end ⟩
28
26
27
+ theorem fg_bot : (⊥ : submodule α β).fg :=
28
+ ⟨∅, by rw [finset.coe_empty, span_empty]⟩
29
+
30
+ theorem fg_sup {s₁ s₂ : submodule α β}
31
+ (hs₁ : s₁.fg) (hs₂ : s₂.fg) : (s₁ ⊔ s₂).fg :=
32
+ let ⟨t₁, ht₁⟩ := fg_def.1 hs₁, ⟨t₂, ht₂⟩ := fg_def.1 hs₂ in
33
+ fg_def.2 ⟨t₁ ∪ t₂, finite_union ht₁.1 ht₂.1 , by rw [span_union, ht₁.2 , ht₂.2 ]⟩
34
+
35
+ variables {γ : Type *} [add_comm_group γ] [module α γ]
36
+ variables {f : β →ₗ γ}
37
+
38
+ theorem fg_map {s : submodule α β} (hs : s.fg) : (s.map f).fg :=
39
+ let ⟨t, ht⟩ := fg_def.1 hs in fg_def.2 ⟨f '' t, finite_image _ ht.1 , by rw [span_image, ht.2 ]⟩
40
+
41
+ theorem fg_prod {sb : submodule α β} {sc : submodule α γ}
42
+ (hsb : sb.fg) (hsc : sc.fg) : (sb.prod sc).fg :=
43
+ let ⟨tb, htb⟩ := fg_def.1 hsb, ⟨tc, htc⟩ := fg_def.1 hsc in
44
+ fg_def.2 ⟨prod.inl '' tb ∪ prod.inr '' tc,
45
+ finite_union (finite_image _ htb.1 ) (finite_image _ htc.1 ),
46
+ by rw [linear_map.span_inl_union_inr, htb.2 , htc.2 ]⟩
47
+
48
+ variable (f)
49
+ /-- If 0 → M' → M → M'' → 0 is exact and M' and M'' are
50
+ finitely generated then so is M. -/
51
+ theorem fg_of_fg_map_of_fg_inf_ker {s : submodule α β}
52
+ (hs1 : (s.map f).fg) (hs2 : (s ⊓ f.ker).fg) : s.fg :=
53
+ begin
54
+ haveI := classical.dec_eq β, haveI := classical.dec_eq γ,
55
+ cases hs1 with t1 ht1, cases hs2 with t2 ht2,
56
+ have : ∀ y ∈ t1, ∃ x ∈ s, f x = y,
57
+ { intros y hy,
58
+ have : y ∈ map f s, { rw ← ht1, exact subset_span hy },
59
+ rcases mem_map.1 this with ⟨x, hx1, hx2⟩,
60
+ exact ⟨x, hx1, hx2⟩ },
61
+ have : ∃ g : γ → β, ∀ y ∈ t1, g y ∈ s ∧ f (g y) = y,
62
+ { choose g hg1 hg2,
63
+ existsi λ y, if H : y ∈ t1 then g y H else 0 ,
64
+ intros y H, split,
65
+ { simp only [dif_pos H], apply hg1 },
66
+ { simp only [dif_pos H], apply hg2 } },
67
+ cases this with g hg, clear this ,
68
+ existsi t1.image g ∪ t2,
69
+ rw [finset.coe_union, span_union, finset.coe_image],
70
+ apply le_antisymm,
71
+ { refine sup_le (span_le.2 $ image_subset_iff.2 _) (span_le.2 _),
72
+ { intros y hy, exact (hg y hy).1 },
73
+ { intros x hx, have := subset_span hx,
74
+ rw ht2 at this ,
75
+ exact this.1 } },
76
+ intros x hx,
77
+ have : f x ∈ map f s, { rw mem_map, exact ⟨x, hx, rfl⟩ },
78
+ rw [← ht1, mem_span_iff_lc] at this ,
79
+ rcases this with ⟨l, hl1, hl2⟩,
80
+ refine mem_sup.2 ⟨lc.total β ((lc.map g : lc α γ → lc α β) l), _,
81
+ x - lc.total β ((lc.map g : lc α γ → lc α β) l), _, add_sub_cancel'_right _ _⟩,
82
+ { rw mem_span_iff_lc, refine ⟨_, _, rfl⟩,
83
+ rw [← lc.map_supported g, mem_map],
84
+ exact ⟨_, hl1, rfl⟩ },
85
+ rw [ht2, mem_inf], split,
86
+ { apply s.sub_mem hx,
87
+ rw [lc.total_apply, lc.map_apply, finsupp.sum_map_domain_index],
88
+ refine s.sum_mem _,
89
+ { intros y hy, exact s.smul_mem _ (hg y (hl1 hy)).1 },
90
+ { exact zero_smul }, { exact λ _ _ _, add_smul _ _ _ } },
91
+ { rw [linear_map.mem_ker, f.map_sub, ← hl2],
92
+ rw [lc.total_apply, lc.total_apply, lc.map_apply],
93
+ rw [finsupp.sum_map_domain_index, finsupp.sum, finsupp.sum, f.map_sum],
94
+ rw sub_eq_zero,
95
+ refine finset.sum_congr rfl (λ y hy, _),
96
+ rw [f.map_smul, (hg y (hl1 hy)).2 ],
97
+ { exact zero_smul }, { exact λ _ _ _, add_smul _ _ _ } }
98
+ end
99
+
29
100
end submodule
30
101
31
102
def is_noetherian (α β) [ring α] [add_comm_group β] [module α β] : Prop :=
32
103
∀ (s : submodule α β), s.fg
33
104
105
+ section
106
+ variables {α : Type *} {β : Type *} {γ : Type *}
107
+ variables [ring α] [add_comm_group β] [add_comm_group γ]
108
+ variables [module α β] [module α γ]
109
+ include α
110
+
111
+ theorem is_noetherian_submodule {N : submodule α β} :
112
+ is_noetherian α N ↔ ∀ s : submodule α β, s ≤ N → s.fg :=
113
+ ⟨λ hn s hs, have s ≤ N.subtype.range, from (N.range_subtype).symm ▸ hs,
114
+ linear_map.map_comap_eq_self this ▸ submodule.fg_map (hn _),
115
+ λ h s, submodule.fg_of_fg_map_of_fg_inf_ker N.subtype (h _ $ submodule.map_subtype_le _ _) $
116
+ by rw [submodule.ker_subtype, inf_bot_eq]; exact submodule.fg_bot⟩
117
+
118
+ theorem is_noetherian_submodule_left {N : submodule α β} :
119
+ is_noetherian α N ↔ ∀ s : submodule α β, (N ⊓ s).fg :=
120
+ is_noetherian_submodule.trans
121
+ ⟨λ H s, H _ inf_le_left, λ H s hs, (inf_of_le_right hs) ▸ H _⟩
122
+
123
+ theorem is_noetherian_submodule_right {N : submodule α β} :
124
+ is_noetherian α N ↔ ∀ s : submodule α β, (s ⊓ N).fg :=
125
+ is_noetherian_submodule.trans
126
+ ⟨λ H s, H _ inf_le_right, λ H s hs, (inf_of_le_left hs) ▸ H _⟩
127
+
128
+ variable (β)
129
+ theorem is_noetherian_of_surjective (f : β →ₗ γ) (hf : f.range = ⊤)
130
+ (hb : is_noetherian α β) : is_noetherian α γ :=
131
+ λ s, have (s.comap f).map f = s, from linear_map.map_comap_eq_self $ hf.symm ▸ le_top,
132
+ this ▸ submodule.fg_map $ hb _
133
+ variable {β}
134
+
135
+ theorem is_noetherian_of_linear_equiv (f : β ≃ₗ γ)
136
+ (hb : is_noetherian α β) : is_noetherian α γ :=
137
+ is_noetherian_of_surjective _ f.to_linear_map f.range hb
138
+
139
+ theorem is_noetherian_prod (hb : is_noetherian α β)
140
+ (hc : is_noetherian α γ) : is_noetherian α (β × γ) :=
141
+ λ s, submodule.fg_of_fg_map_of_fg_inf_ker (linear_map.snd β γ) (hc _) $
142
+ have s ⊓ linear_map.ker (linear_map.snd β γ) ≤ linear_map.range (linear_map.inl β γ),
143
+ from λ x ⟨hx1, hx2⟩, ⟨x.1 , trivial, prod.ext rfl $ eq.symm $ linear_map.mem_ker.1 hx2⟩,
144
+ linear_map.map_comap_eq_self this ▸ submodule.fg_map (hb _)
145
+
146
+ theorem is_noetherian_pi {α ι : Type *} {β : ι → Type *} [ring α]
147
+ [Π i, add_comm_group (β i)] [Π i, module α (β i)] [fintype ι]
148
+ (hb : ∀ i, is_noetherian α (β i)) : is_noetherian α (Π i, β i) :=
149
+ begin
150
+ haveI := classical.dec_eq ι,
151
+ suffices : ∀ s : finset ι, is_noetherian α (Π i : (↑s : set ι), β i),
152
+ { refine is_noetherian_of_linear_equiv ⟨_, _, _, _, _, _⟩ (this finset.univ),
153
+ { exact λ f i, f ⟨i, finset.mem_univ _⟩ },
154
+ { intros, ext, refl },
155
+ { intros, ext, refl },
156
+ { exact λ f i, f i.1 },
157
+ { intro, ext i, cases i, refl },
158
+ { intro, ext i, refl } },
159
+ intro s,
160
+ induction s using finset.induction with a s has ih,
161
+ { intro s, convert submodule.fg_bot, apply eq_bot_iff.2 ,
162
+ intros x hx, refine submodule.mem_bot.2 _, ext i, cases i.2 },
163
+ refine is_noetherian_of_linear_equiv ⟨_, _, _, _, _, _⟩ (is_noetherian_prod (hb a) ih),
164
+ { exact λ f i, or.by_cases (finset.mem_insert.1 i.2 )
165
+ (λ h : i.1 = a, show β i.1 , from (eq.rec_on h.symm f.1 ))
166
+ (λ h : i.1 ∈ s, show β i.1 , from f.2 ⟨i.1 , h⟩) },
167
+ { intros f g, ext i, unfold or.by_cases, cases i with i hi,
168
+ rcases finset.mem_insert.1 hi with rfl | h,
169
+ { change _ = _ + _, simp only [dif_pos], refl },
170
+ { change _ = _ + _, have : ¬i = a, { rintro rfl, exact has h },
171
+ simp only [dif_neg this , dif_pos h], refl } },
172
+ { intros c f, ext i, unfold or.by_cases, cases i with i hi,
173
+ rcases finset.mem_insert.1 hi with rfl | h,
174
+ { change _ = c • _, simp only [dif_pos], refl },
175
+ { change _ = c • _, have : ¬i = a, { rintro rfl, exact has h },
176
+ simp only [dif_neg this , dif_pos h], refl } },
177
+ { exact λ f, (f ⟨a, finset.mem_insert_self _ _⟩, λ i, f ⟨i.1 , finset.mem_insert_of_mem i.2 ⟩) },
178
+ { intro f, apply prod.ext,
179
+ { simp only [or.by_cases, dif_pos] },
180
+ { ext i, cases i with i his,
181
+ have : ¬i = a, { rintro rfl, exact has his },
182
+ dsimp only [or.by_cases], change i ∈ s at his,
183
+ rw [dif_neg this , dif_pos his] } },
184
+ { intro f, ext i, cases i with i hi,
185
+ rcases finset.mem_insert.1 hi with rfl | h,
186
+ { simp only [or.by_cases, dif_pos], refl },
187
+ { have : ¬i = a, { rintro rfl, exact has h },
188
+ simp only [or.by_cases, dif_neg this , dif_pos h], refl } }
189
+ end
190
+
191
+ end
192
+
34
193
theorem is_noetherian_iff_well_founded
35
194
{α β} [ring α] [add_comm_group β] [module α β] :
36
195
is_noetherian α β ↔ well_founded ((>) : submodule α β → submodule α β → Prop ) :=
@@ -107,3 +266,45 @@ begin
107
266
rw is_noetherian_iff_well_founded at h ⊢,
108
267
convert order_embedding.well_founded (order_embedding.rsymm (submodule.comap_mkq.lt_order_embedding N)) h
109
268
end
269
+
270
+ theorem is_noetherian_of_fg_of_noetherian {R M} [ring R] [add_comm_group M] [module R M] (N : submodule R M)
271
+ (h : is_noetherian_ring R) (hN : N.fg) : is_noetherian R N :=
272
+ let ⟨s, hs⟩ := hN in
273
+ begin
274
+ haveI := classical.dec_eq M,
275
+ have : ∀ x ∈ s, x ∈ N, from λ x hx, hs ▸ submodule.subset_span hx,
276
+ refine @@is_noetherian_of_surjective ((↑s : set M) → R) _ _ _ (pi.module _)
277
+ _ _ _ (is_noetherian_pi $ λ _, h),
278
+ { fapply linear_map.mk,
279
+ { exact λ f, ⟨s.attach.sum (λ i, f i • i.1 ), N.sum_mem (λ c _, N.smul_mem _ $ this _ c.2 )⟩ },
280
+ { intros f g, apply subtype.eq,
281
+ change s.attach.sum (λ i, (f i + g i) • _) = _,
282
+ simp only [add_smul, finset.sum_add_distrib], refl },
283
+ { intros c f, apply subtype.eq,
284
+ change s.attach.sum (λ i, (c • f i) • _) = _,
285
+ simp only [smul_eq_mul, mul_smul],
286
+ exact finset.sum_hom _ } },
287
+ rw linear_map.range_eq_top,
288
+ rintro ⟨n, hn⟩, change n ∈ N at hn,
289
+ rw [← hs, mem_span_iff_lc] at hn,
290
+ rcases hn with ⟨l, hl1, hl2⟩,
291
+ refine ⟨λ x, l x.1 , subtype.eq _⟩,
292
+ change s.attach.sum (λ i, l i.1 • i.1 ) = n,
293
+ rw [@finset.sum_attach M M s _ (λ i, l i • i), ← hl2,
294
+ lc.total_apply, finsupp.sum, eq_comm],
295
+ refine finset.sum_subset hl1 (λ x _ hx, _),
296
+ rw [finsupp.not_mem_support_iff.1 hx, zero_smul]
297
+ end
298
+
299
+ theorem is_noetherian_ring_of_surjective (R) [comm_ring R] (S) [comm_ring S]
300
+ (f : R → S) (hf : is_ring_hom f) (hf : function.surjective f)
301
+ (H : is_noetherian_ring R) : is_noetherian_ring S :=
302
+ begin
303
+ unfold is_noetherian_ring at H ⊢,
304
+ rw is_noetherian_iff_well_founded at H ⊢,
305
+ convert order_embedding.well_founded (order_embedding.rsymm (ideal.lt_order_embedding_of_surjective f hf)) H
306
+ end
307
+
308
+ theorem is_noetherian_ring_of_ring_equiv (R) [comm_ring R] {S} [comm_ring S]
309
+ (f : R ≃r S) (H : is_noetherian_ring R) : is_noetherian_ring S :=
310
+ is_noetherian_ring_of_surjective R S f.1 f.2 f.1 .bijective.2 H
0 commit comments