Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit d7cea06

Browse files
kckennylaudigama0
authored andcommitted
feat (ring_theory/noetherian) various lemmas (#548)
1 parent 3762d96 commit d7cea06

File tree

1 file changed

+206
-5
lines changed

1 file changed

+206
-5
lines changed

ring_theory/noetherian.lean

Lines changed: 206 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Mario Carneiro, Kevin Buzzard
55
-/
66

7-
import algebra.module
8-
import order.order_iso
9-
import data.fintype data.polynomial
7+
import data.equiv.algebra
8+
import data.polynomial
109
import linear_algebra.lc
11-
import tactic.tidy
12-
import ring_theory.ideals
10+
import ring_theory.ideal_operations
1311

1412
open set lattice
1513

@@ -26,11 +24,172 @@ theorem fg_def {s : submodule α β} :
2624
exact ⟨t, rfl⟩
2725
end
2826

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+
29100
end submodule
30101

31102
def is_noetherian (α β) [ring α] [add_comm_group β] [module α β] : Prop :=
32103
∀ (s : submodule α β), s.fg
33104

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+
34193
theorem is_noetherian_iff_well_founded
35194
{α β} [ring α] [add_comm_group β] [module α β] :
36195
is_noetherian α β ↔ well_founded ((>) : submodule α β → submodule α β → Prop) :=
@@ -107,3 +266,45 @@ begin
107266
rw is_noetherian_iff_well_founded at h ⊢,
108267
convert order_embedding.well_founded (order_embedding.rsymm (submodule.comap_mkq.lt_order_embedding N)) h
109268
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

Comments
 (0)