mathlib documentation

ring_theory.noetherian

Noetherian rings and modules #

The following are equivalent for a module M over a ring R:

  1. Every increasing chain of submodules M₁ ⊆ M₂ ⊆ M₃ ⊆ ⋯ eventually stabilises.
  2. Every submodule is finitely generated.

A module satisfying these equivalent conditions is said to be a Noetherian R-module. A ring is a Noetherian ring if it is Noetherian as a module over itself.

(Note that we do not assume yet that our rings are commutative, so perhaps this should be called "left Noetherian". To avoid cumbersome names once we specialize to the commutative case, we don't make this explicit in the declaration names.)

Main definitions #

Let R be a ring and let M and P be R-modules. Let N be an R-submodule of M.

Main statements #

Note that the Hilbert basis theorem, that if a commutative ring R is Noetherian then so is R[X], is proved in ring_theory.polynomial.

References #

Tags #

Noetherian, noetherian, Noetherian ring, Noetherian module, noetherian ring, noetherian module

def submodule.fg {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] (N : submodule R M) :
Prop

A submodule of M is finitely generated if it is the span of a finite subset of M.

Equations
theorem submodule.fg_def {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {N : submodule R M} :
N.fg ∃ (S : set M), S.finite submodule.span R S = N
theorem submodule.fg_iff_exists_fin_generating_family {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {N : submodule R M} :
N.fg ∃ (n : ) (s : fin n → M), submodule.span R (set.range s) = N
theorem submodule.exists_sub_one_mem_and_smul_eq_zero_of_fg_of_le_smul {R : Type u_1} [comm_ring R] {M : Type u_2} [add_comm_group M] [module R M] (I : ideal R) (N : submodule R M) (hn : N.fg) (hin : N I N) :
∃ (r : R), r - 1 I ∀ (n : M), n Nr n = 0

Nakayama's Lemma. Atiyah-Macdonald 2.5, Eisenbud 4.7, Matsumura 2.2, Stacks 00DV

theorem submodule.exists_mem_and_smul_eq_self_of_fg_of_le_smul {R : Type u_1} [comm_ring R] {M : Type u_2} [add_comm_group M] [module R M] (I : ideal R) (N : submodule R M) (hn : N.fg) (hin : N I N) :
∃ (r : R) (H : r I), ∀ (n : M), n Nr n = n
theorem submodule.fg_bot {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
theorem subalgebra.fg_bot_to_submodule {R : Type u_1} {A : Type u_2} [comm_semiring R] [semiring A] [algebra R A] :
theorem submodule.fg_span {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {s : set M} (hs : s.finite) :
theorem submodule.fg_span_singleton {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] (x : M) :
theorem submodule.fg.sup {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {N₁ N₂ : submodule R M} (hN₁ : N₁.fg) (hN₂ : N₂.fg) :
(N₁ N₂).fg
theorem submodule.fg_finset_sup {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {ι : Type u_3} (s : finset ι) (N : ι → submodule R M) (h : ∀ (i : ι), i s(N i).fg) :
(s.sup N).fg
theorem submodule.fg_bsupr {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {ι : Type u_3} (s : finset ι) (N : ι → submodule R M) (h : ∀ (i : ι), i s(N i).fg) :
(⨆ (i : ι) (H : i s), N i).fg
theorem submodule.fg_supr {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {ι : Type u_3} [finite ι] (N : ι → submodule R M) (h : ∀ (i : ι), (N i).fg) :
(supr N).fg
theorem submodule.fg.map {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {P : Type u_3} [add_comm_monoid P] [module R P] (f : M →ₗ[R] P) {N : submodule R M} (hs : N.fg) :
theorem submodule.fg_of_fg_map_injective {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {P : Type u_3} [add_comm_monoid P] [module R P] (f : M →ₗ[R] P) (hf : function.injective f) {N : submodule R M} (hfn : (submodule.map f N).fg) :
N.fg
theorem submodule.fg_of_fg_map {R : Type u_1} {M : Type u_2} {P : Type u_3} [ring R] [add_comm_group M] [module R M] [add_comm_group P] [module R P] (f : M →ₗ[R] P) (hf : linear_map.ker f = ) {N : submodule R M} (hfn : (submodule.map f N).fg) :
N.fg
theorem submodule.fg_top {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] (N : submodule R M) :
theorem submodule.fg_of_linear_equiv {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {P : Type u_3} [add_comm_monoid P] [module R P] (e : M ≃ₗ[R] P) (h : .fg) :
theorem submodule.fg.prod {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {P : Type u_3} [add_comm_monoid P] [module R P] {sb : submodule R M} {sc : submodule R P} (hsb : sb.fg) (hsc : sc.fg) :
(sb.prod sc).fg
theorem submodule.fg_pi {R : Type u_1} [semiring R] {ι : Type u_2} {M : ι → Type u_3} [finite ι] [Π (i : ι), add_comm_monoid (M i)] [Π (i : ι), module R (M i)] {p : Π (i : ι), submodule R (M i)} (hsb : ∀ (i : ι), (p i).fg) :
theorem submodule.fg_of_fg_map_of_fg_inf_ker {R : Type u_1} {M : Type u_2} {P : Type u_3} [ring R] [add_comm_group M] [module R M] [add_comm_group P] [module R P] (f : M →ₗ[R] P) {s : submodule R M} (hs1 : (submodule.map f s).fg) (hs2 : (s linear_map.ker f).fg) :
s.fg

If 0 → M' → M → M'' → 0 is exact and M' and M'' are finitely generated then so is M.

theorem submodule.fg_induction (R : Type u_1) (M : Type u_2) [semiring R] [add_comm_monoid M] [module R M] (P : submodule R M → Prop) (h₁ : ∀ (x : M), P (submodule.span R {x})) (h₂ : ∀ (M₁ M₂ : submodule R M), P M₁P M₂P (M₁ M₂)) (N : submodule R M) (hN : N.fg) :
P N
theorem submodule.fg_ker_comp {R : Type u_1} {M : Type u_2} {N : Type u_3} {P : Type u_4} [ring R] [add_comm_group M] [module R M] [add_comm_group N] [module R N] [add_comm_group P] [module R P] (f : M →ₗ[R] N) (g : N →ₗ[R] P) (hf1 : (linear_map.ker f).fg) (hf2 : (linear_map.ker g).fg) (hsur : function.surjective f) :

The kernel of the composition of two linear maps is finitely generated if both kernels are and the first morphism is surjective.

theorem submodule.fg_restrict_scalars {R : Type u_1} {S : Type u_2} {M : Type u_3} [comm_semiring R] [semiring S] [algebra R S] [add_comm_group M] [module S M] [module R M] [is_scalar_tower R S M] (N : submodule S M) (hfin : N.fg) (h : function.surjective (algebra_map R S)) :
theorem submodule.fg_iff_compact {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] (s : submodule R M) :

Finitely generated submodules are precisely compact elements in the submodule lattice.

def ideal.fg {R : Type u_1} [semiring R] (I : ideal R) :
Prop

An ideal of R is finitely generated if it is the span of a finite subset of R.

This is defeq to submodule.fg, but unfolds more nicely.

Equations
theorem ideal.fg.map {R : Type u_1} {S : Type u_2} [semiring R] [semiring S] {I : ideal R} (h : I.fg) (f : R →+* S) :

The image of a finitely generated ideal is finitely generated.

This is the ideal version of submodule.fg.map.

theorem ideal.fg_ker_comp {R : Type u_1} {S : Type u_2} {A : Type u_3} [comm_ring R] [comm_ring S] [comm_ring A] (f : R →+* S) (g : S →+* A) (hf : (ring_hom.ker f).fg) (hg : (ring_hom.ker g).fg) (hsur : function.surjective f) :
theorem ideal.is_idempotent_elem_iff_of_fg {R : Type u_1} [comm_ring R] (I : ideal R) (h : I.fg) :

A finitely generated idempotent ideal is generated by an idempotent element

theorem ideal.is_idempotent_elem_iff_eq_bot_or_top {R : Type u_1} [comm_ring R] [is_domain R] (I : ideal R) (h : I.fg) :
theorem is_noetherian_def {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
is_noetherian R M ∀ (s : submodule R M), s.fg

An R-module is Noetherian iff all its submodules are finitely-generated.

theorem is_noetherian_submodule {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {N : submodule R M} :
is_noetherian R N ∀ (s : submodule R M), s N → s.fg
theorem is_noetherian_submodule_left {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {N : submodule R M} :
is_noetherian R N ∀ (s : submodule R M), (N s).fg
theorem is_noetherian_submodule_right {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {N : submodule R M} :
is_noetherian R N ∀ (s : submodule R M), (s N).fg
@[protected, instance]
def is_noetherian_submodule' {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] [is_noetherian R M] (N : submodule R M) :
theorem is_noetherian_of_le {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] {s t : submodule R M} [ht : is_noetherian R t] (h : s t) :
theorem is_noetherian_of_surjective {R : Type u_1} (M : Type u_2) {P : Type u_3} [semiring R] [add_comm_monoid M] [add_comm_monoid P] [module R M] [module R P] (f : M →ₗ[R] P) (hf : linear_map.range f = ) [is_noetherian R M] :
theorem is_noetherian_of_linear_equiv {R : Type u_1} {M : Type u_2} {P : Type u_3} [semiring R] [add_comm_monoid M] [add_comm_monoid P] [module R M] [module R P] (f : M ≃ₗ[R] P) [is_noetherian R M] :
theorem is_noetherian_top_iff {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
theorem is_noetherian_of_injective {R : Type u_1} {M : Type u_2} {P : Type u_3} [semiring R] [add_comm_monoid M] [add_comm_monoid P] [module R M] [module R P] [is_noetherian R P] (f : M →ₗ[R] P) (hf : function.injective f) :
theorem fg_of_injective {R : Type u_1} {M : Type u_2} {P : Type u_3} [semiring R] [add_comm_monoid M] [add_comm_monoid P] [module R M] [module R P] [is_noetherian R P] {N : submodule R M} (f : M →ₗ[R] P) (hf : function.injective f) :
N.fg
theorem is_noetherian_of_ker_bot {R : Type u_1} {M : Type u_2} {P : Type u_3} [ring R] [add_comm_group M] [add_comm_group P] [module R M] [module R P] [is_noetherian R P] (f : M →ₗ[R] P) (hf : linear_map.ker f = ) :
theorem fg_of_ker_bot {R : Type u_1} {M : Type u_2} {P : Type u_3} [ring R] [add_comm_group M] [add_comm_group P] [module R M] [module R P] [is_noetherian R P] {N : submodule R M} (f : M →ₗ[R] P) (hf : linear_map.ker f = ) :
N.fg
@[protected, instance]
def is_noetherian_prod {R : Type u_1} {M : Type u_2} {P : Type u_3} [ring R] [add_comm_group M] [add_comm_group P] [module R M] [module R P] [is_noetherian R M] [is_noetherian R P] :
@[protected, instance]
def is_noetherian_pi {R : Type u_1} {ι : Type u_2} {M : ι → Type u_3} [ring R] [Π (i : ι), add_comm_group (M i)] [Π (i : ι), module R (M i)] [finite ι] [∀ (i : ι), is_noetherian R (M i)] :
is_noetherian R (Π (i : ι), M i)
@[protected, instance]
def is_noetherian_pi' {R : Type u_1} {ι : Type u_2} {M : Type u_3} [ring R] [add_comm_group M] [module R M] [finite ι] [is_noetherian R M] :
is_noetherian R (ι → M)

A version of is_noetherian_pi for non-dependent functions. We need this instance because sometimes Lean fails to apply the dependent version in non-dependent settings (e.g., it fails to prove that ι → ℝ is finite dimensional over ).

theorem is_noetherian_iff_well_founded {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
theorem is_noetherian_iff_fg_well_founded {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
theorem well_founded_submodule_gt (R : Type u_1) (M : Type u_2) [semiring R] [add_comm_monoid M] [module R M] [is_noetherian R M] :
theorem set_has_maximal_iff_noetherian {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
(∀ (a : set (submodule R M)), a.nonempty(∃ (M' : submodule R M) (H : M' a), ∀ (I : submodule R M), I aM' II = M')) is_noetherian R M

A module is Noetherian iff every nonempty set of submodules has a maximal submodule among them.

theorem monotone_stabilizes_iff_noetherian {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] :
(∀ (f : →o submodule R M), ∃ (n : ), ∀ (m : ), n mf n = f m) is_noetherian R M

A module is Noetherian iff every increasing chain of submodules stabilizes.

theorem is_noetherian.induction {R : Type u_1} {M : Type u_2} [semiring R] [add_comm_monoid M] [module R M] [is_noetherian R M] {P : submodule R M → Prop} (hgt : ∀ (I : submodule R M), (∀ (J : submodule R M), J > IP J)P I) (I : submodule R M) :
P I

If ∀ I > J, P I implies P J, then P holds for all submodules.

theorem finite_of_linear_independent {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] [nontrivial R] [is_noetherian R M] {s : set M} (hs : linear_independent R coe) :
theorem is_noetherian_of_range_eq_ker {R : Type u_1} {M : Type u_2} {P : Type u_3} {N : Type w} [ring R] [add_comm_group M] [module R M] [add_comm_group N] [module R N] [add_comm_group P] [module R P] [is_noetherian R M] [is_noetherian R P] (f : M →ₗ[R] N) (g : N →ₗ[R] P) (hf : function.injective f) (hg : function.surjective g) (h : linear_map.range f = linear_map.ker g) :

If the first and final modules in a short exact sequence are noetherian, then the middle module is also noetherian.

theorem is_noetherian.exists_endomorphism_iterate_ker_inf_range_eq_bot {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] [I : is_noetherian R M] (f : M →ₗ[R] M) :
∃ (n : ), n 0 linear_map.ker (f ^ n) linear_map.range (f ^ n) =

For any endomorphism of a Noetherian module, there is some nontrivial iterate with disjoint kernel and range.

Any surjective endomorphism of a Noetherian module is injective.

Any surjective endomorphism of a Noetherian module is bijective.

theorem is_noetherian.disjoint_partial_sups_eventually_bot {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] [I : is_noetherian R M] (f : submodule R M) (h : ∀ (n : ), disjoint ((partial_sups f) n) (f (n + 1))) :
∃ (n : ), ∀ (m : ), n mf m =

A sequence f of submodules of a noetherian module, with f (n+1) disjoint from the supremum of f 0, ..., f n, is eventually zero.

noncomputable def is_noetherian.equiv_punit_of_prod_injective {R : Type u_1} {M : Type u_2} {N : Type w} [ring R] [add_comm_group M] [module R M] [add_comm_group N] [module R N] [is_noetherian R M] (f : M × N →ₗ[R] M) (i : function.injective f) :

If M ⊕ N embeds into M, for M noetherian over R, then N is trivial.

Equations
@[reducible]
def is_noetherian_ring (R : Type u_1) [semiring R] :
Prop

A (semi)ring is Noetherian if it is Noetherian as a module over itself, i.e. all its ideals are finitely generated.

Equations
theorem is_noetherian_ring_iff_ideal_fg (R : Type u_1) [semiring R] :
is_noetherian_ring R ∀ (I : ideal R), I.fg

A ring is Noetherian if and only if all its ideals are finitely-generated.

@[protected, instance]
def is_noetherian_of_finite (R : Type u_1) (M : Type u_2) [finite M] [semiring R] [add_comm_monoid M] [module R M] :
@[protected, instance]
def is_noetherian_of_subsingleton (R : Type u_1) (M : Type u_2) [subsingleton R] [semiring R] [add_comm_monoid M] [module R M] :

Modules over the trivial ring are Noetherian.

theorem is_noetherian_of_submodule_of_noetherian (R : Type u_1) (M : Type u_2) [semiring R] [add_comm_monoid M] [module R M] (N : submodule R M) (h : is_noetherian R M) :
@[protected, instance]
def submodule.quotient.is_noetherian {R : Type u_1} [ring R] {M : Type u_2} [add_comm_group M] [module R M] (N : submodule R M) [h : is_noetherian R M] :
theorem is_noetherian_of_tower (R : Type u_1) {S : Type u_2} {M : Type u_3} [semiring R] [semiring S] [add_comm_monoid M] [has_smul R S] [module S M] [module R M] [is_scalar_tower R S M] (h : is_noetherian R M) :

If M / S / R is a scalar tower, and M / R is Noetherian, then M / S is also noetherian.

@[protected, instance]
theorem is_noetherian_of_fg_of_noetherian {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] (N : submodule R M) [is_noetherian_ring R] (hN : N.fg) :
theorem is_noetherian_of_fg_of_noetherian' {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] [is_noetherian_ring R] (h : .fg) :
theorem is_noetherian_span_of_finite (R : Type u_1) {M : Type u_2} [ring R] [add_comm_group M] [module R M] [is_noetherian_ring R] {A : set M} (hA : A.finite) :

In a module over a noetherian ring, the submodule generated by finitely many vectors is noetherian.

theorem is_noetherian_ring_of_surjective (R : Type u_1) [ring R] (S : Type u_2) [ring S] (f : R →+* S) (hf : function.surjective f) [H : is_noetherian_ring R] :
@[protected, instance]
def is_noetherian_ring_range {R : Type u_1} [ring R] {S : Type u_2} [ring S] (f : R →+* S) [is_noetherian_ring R] :
theorem is_noetherian_ring_of_ring_equiv (R : Type u_1) [ring R] {S : Type u_2} [ring S] (f : R ≃+* S) [is_noetherian_ring R] :
theorem submodule.fg.map₂ {R : Type u_1} {M : Type u_2} {N : Type u_3} {P : Type u_4} [comm_semiring R] [add_comm_monoid M] [add_comm_monoid N] [add_comm_monoid P] [module R M] [module R N] [module R P] (f : M →ₗ[R] N →ₗ[R] P) {p : submodule R M} {q : submodule R N} (hp : p.fg) (hq : q.fg) :
theorem submodule.fg.mul {R : Type u_1} {A : Type u_2} [comm_semiring R] [semiring A] [algebra R A] {M N : submodule R A} (hm : M.fg) (hn : N.fg) :
(M * N).fg
theorem submodule.fg.pow {R : Type u_1} {A : Type u_2} [comm_semiring R] [semiring A] [algebra R A] {M : submodule R A} (h : M.fg) (n : ) :
(M ^ n).fg