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

Commit 28443c8

Browse files
kbuzzardjohoelzl
authored andcommitted
feat(ring_theory/noetherian): zero ring (and finite rings) are Noetherian (closes #341)
1 parent 44b55e6 commit 28443c8

File tree

3 files changed

+45
-23
lines changed

3 files changed

+45
-23
lines changed

algebra/ring.lean

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ variable (α)
2121
lemma zero_ne_one_or_forall_eq_0 : (0 : α) ≠ 1 ∨ (∀a:α, a = 0) :=
2222
by haveI := classical.dec;
2323
refine not_or_of_imp (λ h a, _); simpa using congr_arg ((*) a) h.symm
24-
variable {α}
24+
25+
lemma eq_zero_of_zero_eq_one (h : (0 : α) = 1) : (∀a:α, a = 0) :=
26+
(zero_ne_one_or_forall_eq_0 α).neg_resolve_left h
27+
28+
theorem subsingleton_of_zero_eq_one (h : (0 : α) = 1) : subsingleton α :=
29+
⟨λa b, by rw [eq_zero_of_zero_eq_one α h a, eq_zero_of_zero_eq_one α h b]⟩
2530

2631
end
2732

data/polynomial.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,9 @@ calc degree (p + q) = ((p + q).support).sup some : rfl
463463
(not_not.2 h) (mem_of_max (degree_eq_nat_degree hp)),
464464
by simp {contextual := tt}⟩
465465

466+
lemma leading_coeff_eq_zero_iff_deg_eq_bot : leading_coeff p = 0 ↔ degree p = ⊥ :=
467+
by rw [leading_coeff_eq_zero, degree_eq_bot]
468+
466469
lemma degree_add_eq_of_degree_lt (h : degree p < degree q) : degree (p + q) = degree q :=
467470
le_antisymm (max_eq_right_of_lt h ▸ degree_add_le _ _) $ degree_le_degree $
468471
begin

ring_theory/noetherian.lean

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import tactic.tidy
1010
import linear_algebra.submodule
1111
import ring_theory.ideals
1212

13-
local attribute [instance] classical.dec
1413
open set lattice
1514

1615
def is_fg {α β} [ring α] [module α β]
@@ -67,36 +66,51 @@ theorem is_noetherian_iff_well_founded
6766
(hf ⟨x, h⟩) },
6867
exact not_le_of_lt (hN.1 (nat.lt_succ_self A))
6968
(le_trans (le_supr _ _) this)
70-
end,
71-
λ h N, begin
72-
suffices : ∀ M ≤ N, ∃ s, finite s ∧ M ⊔ submodule.span s = N,
73-
{ rcases this ⊥ bot_le with ⟨s, hs, e⟩,
74-
exact submodule.fg_def.2 ⟨s, hs, by simpa using e⟩ },
75-
refine λ M, h.induction M _, intros M IH MN,
76-
by_cases h : ∀ x, x ∈ N → x ∈ M,
77-
{ cases le_antisymm MN h, exact ⟨∅, by simp⟩ },
78-
{ simp [not_forall] at h,
79-
rcases h with ⟨x, h, h₂⟩,
80-
have : ¬M ⊔ submodule.span {x} ≤ M,
81-
{ intro hn, apply h₂,
82-
simpa using submodule.span_subset_iff.1 (le_trans le_sup_right hn) },
83-
rcases IH (M ⊔ submodule.span {x})
84-
⟨@le_sup_left _ _ M _, this
85-
(sup_le MN (submodule.span_subset_iff.2 (by simpa))) with ⟨s, hs, hs₂⟩,
86-
refine ⟨insert x s, finite_insert _ hs, _⟩,
87-
rw [← hs₂, sup_assoc, ← submodule.span_union], simp }
88-
end
69+
end,
70+
begin
71+
assume h N,
72+
suffices : ∀ M ≤ N, ∃ s, finite s ∧ M ⊔ submodule.span s = N,
73+
{ rcases this ⊥ bot_le with ⟨s, hs, e⟩,
74+
exact submodule.fg_def.2 ⟨s, hs, by simpa using e⟩ },
75+
refine λ M, h.induction M _, intros M IH MN,
76+
letI := classical.dec,
77+
by_cases h : ∀ x, x ∈ N → x ∈ M,
78+
{ cases le_antisymm MN h, exact ⟨∅, by simp⟩ },
79+
{ simp [not_forall] at h,
80+
rcases h with ⟨x, h, h₂⟩,
81+
have : ¬M ⊔ submodule.span {x} ≤ M,
82+
{ intro hn, apply h₂,
83+
simpa using submodule.span_subset_iff.1 (le_trans le_sup_right hn) },
84+
rcases IH (M ⊔ submodule.span {x})
85+
⟨@le_sup_left _ _ M _, this
86+
(sup_le MN (submodule.span_subset_iff.2 (by simpa))) with ⟨s, hs, hs₂⟩,
87+
refine ⟨insert x s, finite_insert _ hs, _⟩,
88+
rw [← hs₂, sup_assoc, ← submodule.span_union], simp }
89+
end
8990

9091
def is_noetherian_ring (α) [ring α] : Prop := is_noetherian α α
9192

93+
theorem ring.is_noetherian_of_fintype (R M) [ring R] [module R M] [fintype M] : is_noetherian R M :=
94+
by letI := classical.dec;
95+
from assume s, ⟨to_finset s, suffices span (s : set M) = s, by simpa, span_eq_of_is_submodule s.to_is_submodule⟩
96+
97+
instance fintype.of_subsingleton_ring {α} [ring α] [h : subsingleton α] : fintype α :=
98+
{ elems := {0},
99+
complete := assume x, suffices x = 0, by simpa, subsingleton.elim x 0 }
100+
101+
theorem ring.is_noetherian_of_zero_eq_one {R} [ring R] (h01 : (0 : R) = 1) : is_noetherian_ring R :=
102+
by haveI := subsingleton_of_zero_eq_one R h01; exact ring.is_noetherian_of_fintype R R
103+
92104
theorem is_noetherian_of_submodule_of_noetherian (R M) [ring R] [module R M] (N : set M) [is_submodule N]
93105
(h : is_noetherian R M) : is_noetherian R N :=
94106
begin
95107
rw is_noetherian_iff_well_founded at h ⊢,
96-
convert order_embedding.well_founded (order_embedding.rsymm (submodule.lt_order_embedding R M N)) h,end
108+
convert order_embedding.well_founded (order_embedding.rsymm (submodule.lt_order_embedding R M N)) h
109+
end
97110

98111
theorem is_noetherian_of_quotient_of_noetherian (R) [ring R] (M) [module R M] (N : set M) [is_submodule N]
99112
(h : is_noetherian R M) : is_noetherian R (quotient_module.quotient M N) :=
100113
begin
101114
rw is_noetherian_iff_well_founded at h ⊢,
102-
convert order_embedding.well_founded (order_embedding.rsymm (quotient_module.lt_order_embedding R M N)) h,end
115+
convert order_embedding.well_founded (order_embedding.rsymm (quotient_module.lt_order_embedding R M N)) h
116+
end

0 commit comments

Comments
 (0)