File: Mathlib/RingTheory/Noetherian.lean

full_name: IsNoetherian
code: /-- `IsNoetherian R M` is the proposition that `M` is a Noetherian `R`-module,
implemented as the predicate that all `R`-submodules of `M` are finitely generated.
-/
-- Porting note: should this be renamed to `Noetherian`?
class IsNoetherian (R M) [Semiring R] [AddCommMonoid M] [Module R M] : Prop where
  noetherian : ∀ s : Submodule R M, s.FG
goal: Prop

full_name: IsNoetherian.noetherian
code: /-- `IsNoetherian R M` is the proposition that `M` is a Noetherian `R`-module,
implemented as the predicate that all `R`-submodules of `M` are finitely generated.
-/
-- Porting note: should this be renamed to `Noetherian`?
class IsNoetherian (R M) [Semiring R] [AddCommMonoid M] [Module R M] : Prop where
  noetherian : ∀ s : Submodule R M, s.FG
goal: s.FG

full_name: isNoetherian_def
code: /-- An R-module is Noetherian iff all its submodules are finitely-generated. -/
theorem isNoetherian_def : IsNoetherian R M ↔ ∀ s : Submodule R M, s.FG 
goal: IsNoetherian R M ↔ ∀ (s : Submodule R M), s.FG

full_name: isNoetherian_submodule
code: theorem isNoetherian_submodule {N : Submodule R M} :
    IsNoetherian R N ↔ ∀ s : Submodule R M, s ≤ N → s.FG 
goal: IsNoetherian R ↥N ↔ ∀ s ≤ N, s.FG

full_name: isNoetherian_submodule_left
code: theorem isNoetherian_submodule_left {N : Submodule R M} :
    IsNoetherian R N ↔ ∀ s : Submodule R M, (N ⊓ s).FG 
goal: IsNoetherian R ↥N ↔ ∀ (s : Submodule R M), (N ⊓ s).FG

full_name: isNoetherian_submodule_right
code: theorem isNoetherian_submodule_right {N : Submodule R M} :
    IsNoetherian R N ↔ ∀ s : Submodule R M, (s ⊓ N).FG 
goal: IsNoetherian R ↥N ↔ ∀ (s : Submodule R M), (s ⊓ N).FG

full_name: isNoetherian_submodule'
code: instance isNoetherian_submodule' [IsNoetherian R M] (N : Submodule R M) : IsNoetherian R N 
goal: IsNoetherian R ↥N

full_name: isNoetherian_of_le
code: theorem isNoetherian_of_le {s t : Submodule R M} [ht : IsNoetherian R t] (h : s ≤ t) :
    IsNoetherian R s 
goal: IsNoetherian R ↥s

full_name: isNoetherian_of_surjective
code: theorem isNoetherian_of_surjective (f : M →ₗ[R] P) (hf : LinearMap.range f = ⊤) [IsNoetherian R M] :
    IsNoetherian R P 
goal: IsNoetherian R P

full_name: isNoetherian_quotient
code: instance isNoetherian_quotient {R} [Ring R] {M} [AddCommGroup M] [Module R M]
    (N : Submodule R M) [IsNoetherian R M] : IsNoetherian R (M ⧸ N) 
goal: IsNoetherian R (M ⧸ N)

full_name: isNoetherian_of_linearEquiv
code: theorem isNoetherian_of_linearEquiv (f : M ≃ₗ[R] P) [IsNoetherian R M] : IsNoetherian R P 
goal: IsNoetherian R P

full_name: isNoetherian_top_iff
code: theorem isNoetherian_top_iff : IsNoetherian R (⊤ : Submodule R M) ↔ IsNoetherian R M 
goal: IsNoetherian R ↥⊤ ↔ IsNoetherian R M

full_name: isNoetherian_of_injective
code: theorem isNoetherian_of_injective [IsNoetherian R P] (f : M →ₗ[R] P) (hf : Function.Injective f) :
    IsNoetherian R M 
goal: IsNoetherian R M

full_name: fg_of_injective
code: theorem fg_of_injective [IsNoetherian R P] {N : Submodule R M} (f : M →ₗ[R] P)
    (hf : Function.Injective f) : N.FG 
goal: N.FG

full_name: Module.IsNoetherian.finite
code: instance (priority := 100) IsNoetherian.finite [IsNoetherian R M] : Finite R M 
goal: Module.Finite R M

full_name: Module.instFiniteSubtypeMemIdealOfIsNoetherian
code: instance {R₁ S : Type*} [CommSemiring R₁] [Semiring S] [Algebra R₁ S]
    [IsNoetherian R₁ S] (I : Ideal S) : Finite R₁ I 
goal: Module.Finite R₁ ↥I

full_name: Module.Finite.of_injective
code: theorem Finite.of_injective [IsNoetherian R N] (f : M →ₗ[R] N) (hf : Function.Injective f) :
    Finite R M 
goal: Module.Finite R M

full_name: isNoetherian_of_ker_bot
code: theorem isNoetherian_of_ker_bot [IsNoetherian R P] (f : M →ₗ[R] P) (hf : LinearMap.ker f = ⊥) :
    IsNoetherian R M 
goal: IsNoetherian R M

full_name: fg_of_ker_bot
code: theorem fg_of_ker_bot [IsNoetherian R P] {N : Submodule R M} (f : M →ₗ[R] P)
    (hf : LinearMap.ker f = ⊥) : N.FG 
goal: N.FG

full_name: isNoetherian_prod
code: instance isNoetherian_prod [IsNoetherian R M] [IsNoetherian R P] : IsNoetherian R (M × P) 
goal: IsNoetherian R (M × P)

full_name: isNoetherian_pi
code: instance isNoetherian_pi {R ι : Type*} {M : ι → Type*}
    [Ring R] [∀ i, AddCommGroup (M i)] [∀ i, Module R (M i)] [Finite ι]
    [∀ i, IsNoetherian R (M i)] : IsNoetherian R (∀ i, M i) 
goal: IsNoetherian R ((i : ι) → M i)

full_name: isNoetherian_pi'
code: /-- A version of `isNoetherian_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 `ℝ`). -/
instance isNoetherian_pi' {R ι M : Type*} [Ring R] [AddCommGroup M] [Module R M] [Finite ι]
    [IsNoetherian R M] : IsNoetherian R (ι → M) 
goal: IsNoetherian R (ι → M)

full_name: isNoetherian_linearMap_pi
code: instance isNoetherian_linearMap_pi {ι : Type*} [Finite ι] : IsNoetherian R ((ι → R) →ₗ[R] M) 
goal: IsNoetherian R ((ι → R) →ₗ[R] M)

full_name: isNoetherian_linearMap
code: instance isNoetherian_linearMap : IsNoetherian R (N →ₗ[R] M) 
goal: IsNoetherian R (N →ₗ[R] M)

full_name: isNoetherian_iff_wellFounded
code: theorem isNoetherian_iff_wellFounded :
    IsNoetherian R M ↔ WellFounded ((· > ·) : Submodule R M → Submodule R M → Prop) 
goal: IsNoetherian R M ↔ WellFounded fun x x_1 => x > x_1

full_name: isNoetherian_iff_fg_wellFounded
code: theorem isNoetherian_iff_fg_wellFounded :
    IsNoetherian R M ↔
      WellFounded
        ((· > ·) : { N : Submodule R M // N.FG } → { N : Submodule R M // N.FG } → Prop) 
goal: IsNoetherian R M ↔ WellFounded fun x x_1 => x > x_1

full_name: wellFounded_submodule_gt
code: theorem wellFounded_submodule_gt (R M) [Semiring R] [AddCommMonoid M] [Module R M] :
    ∀ [IsNoetherian R M], WellFounded ((· > ·) : Submodule R M → Submodule R M → Prop) 
goal: WellFounded fun x x_1 => x > x_1

full_name: set_has_maximal_iff_noetherian
code: /-- A module is Noetherian iff every nonempty set of submodules has a maximal submodule among them.
-/
theorem set_has_maximal_iff_noetherian :
    (∀ a : Set <| Submodule R M, a.Nonempty → ∃ M' ∈ a, ∀ I ∈ a, ¬M' < I) ↔ IsNoetherian R M 
goal: (∀ (a : Set (Submodule R M)), a.Nonempty → ∃ M' ∈ a, ∀ I ∈ a, ¬M' < I) ↔ IsNoetherian R M

full_name: monotone_stabilizes_iff_noetherian
code: /-- A module is Noetherian iff every increasing chain of submodules stabilizes. -/
theorem monotone_stabilizes_iff_noetherian :
    (∀ f : ℕ →o Submodule R M, ∃ n, ∀ m, n ≤ m → f n = f m) ↔ IsNoetherian R M 
goal: (∀ (f : ℕ →o Submodule R M), ∃ n, ∀ (m : ℕ), n ≤ m → f n = f m) ↔ IsNoetherian R M

full_name: eventuallyConst_of_isNoetherian
code: theorem eventuallyConst_of_isNoetherian [IsNoetherian R M] (f : ℕ →o Submodule R M) :
    atTop.EventuallyConst f 
goal: Filter.EventuallyConst (⇑f) Filter.atTop

full_name: IsNoetherian.induction
code: /-- If `∀ I > J, P I` implies `P J`, then `P` holds for all submodules. -/
theorem IsNoetherian.induction [IsNoetherian R M] {P : Submodule R M → Prop}
    (hgt : ∀ I, (∀ J > I, P J) → P I) (I : Submodule R M) : P I 
goal: P I

full_name: Submodule.finite_ne_bot_of_independent
code: lemma Submodule.finite_ne_bot_of_independent {ι : Type*} {N : ι → Submodule R M}
    (h : CompleteLattice.Independent N) :
    Set.Finite {i | N i ≠ ⊥} 
goal: {i | N i ≠ ⊥}.Finite

full_name: LinearIndependent.finite_of_isNoetherian
code: /-- A linearly-independent family of vectors in a module over a non-trivial ring must be finite if
the module is Noetherian. -/
theorem LinearIndependent.finite_of_isNoetherian [Nontrivial R] {ι} {v : ι → M}
    (hv : LinearIndependent R v) : Finite ι 
goal: Finite ι

full_name: LinearIndependent.set_finite_of_isNoetherian
code: theorem LinearIndependent.set_finite_of_isNoetherian [Nontrivial R] {s : Set M}
    (hi : LinearIndependent R ((↑) : s → M)) : s.Finite 
goal: s.Finite

full_name: isNoetherian_of_range_eq_ker
code: /-- If the first and final modules in an exact sequence are Noetherian,
  then the middle module is also Noetherian. -/
theorem isNoetherian_of_range_eq_ker [IsNoetherian R P]
    (f : M →ₗ[R] N) (g : N →ₗ[R] P) (h : LinearMap.range f = LinearMap.ker g) :
    IsNoetherian R N 
goal: IsNoetherian R N

full_name: LinearMap.eventually_disjoint_ker_pow_range_pow
code: /-- For an endomorphism of a Noetherian module, any sufficiently large iterate has disjoint kernel
and range. -/
theorem LinearMap.eventually_disjoint_ker_pow_range_pow (f : M →ₗ[R] M) :
    ∀ᶠ n in atTop, Disjoint (LinearMap.ker (f ^ n)) (LinearMap.range (f ^ n)) 
goal: ∀ᶠ (n : ℕ) in Filter.atTop, Disjoint (LinearMap.ker (f ^ n)) (LinearMap.range (f ^ n))

full_name: LinearMap.eventually_iSup_ker_pow_eq
code: lemma LinearMap.eventually_iSup_ker_pow_eq (f : M →ₗ[R] M) :
    ∀ᶠ n in atTop, ⨆ m, LinearMap.ker (f ^ m) = LinearMap.ker (f ^ n) 
goal: ∀ᶠ (n : ℕ) in Filter.atTop, ⨆ m, LinearMap.ker (f ^ m) = LinearMap.ker (f ^ n)

full_name: IsNoetherian.injective_of_surjective_of_injective
code: /-- **Orzech's theorem** for Noetherian module: if `R` is a ring (not necessarily commutative),
`M` and `N` are `R`-modules, `M` is Noetherian, `i : N →ₗ[R] M` is injective,
`f : N →ₗ[R] M` is surjective, then `f` is also injective. The proof here is adapted from
Djoković's paper *Epimorphisms of modules which must be isomorphisms* [djokovic1973],
utilizing `LinearMap.iterateMapComap`.
See also Orzech's original paper: *Onto endomorphisms are isomorphisms* [orzech1971]. -/
theorem IsNoetherian.injective_of_surjective_of_injective (i f : N →ₗ[R] M)
    (hi : Injective i) (hf : Surjective f) : Injective f 
goal: Function.Injective ⇑f

full_name: IsNoetherian.injective_of_surjective_of_submodule
code: /-- **Orzech's theorem** for Noetherian module: if `R` is a ring (not necessarily commutative),
`M` is a Noetherian `R`-module, `N` is a submodule, `f : N →ₗ[R] M` is surjective, then `f` is also
injective. -/
theorem IsNoetherian.injective_of_surjective_of_submodule
    {N : Submodule R M} (f : N →ₗ[R] M) (hf : Surjective f) : Injective f 
goal: Function.Injective ⇑f

full_name: IsNoetherian.injective_of_surjective_endomorphism
code: /-- Any surjective endomorphism of a Noetherian module is injective. -/
theorem IsNoetherian.injective_of_surjective_endomorphism (f : M →ₗ[R] M)
    (s : Surjective f) : Injective f 
goal: Function.Injective ⇑f

full_name: IsNoetherian.bijective_of_surjective_endomorphism
code: /-- Any surjective endomorphism of a Noetherian module is bijective. -/
theorem IsNoetherian.bijective_of_surjective_endomorphism (f : M →ₗ[R] M)
    (s : Surjective f) : Bijective f 
goal: Function.Bijective ⇑f

full_name: IsNoetherian.disjoint_partialSups_eventually_bot
code: /-- 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.
-/
theorem IsNoetherian.disjoint_partialSups_eventually_bot
    (f : ℕ → Submodule R M) (h : ∀ n, Disjoint (partialSups f n) (f (n + 1))) :
    ∃ n : ℕ, ∀ m, n ≤ m → f m = ⊥ 
goal: ∃ n, ∀ (m : ℕ), n ≤ m → f m = ⊥

full_name: IsNoetherian.subsingleton_of_prod_injective
code: /-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial. -/
theorem IsNoetherian.subsingleton_of_prod_injective (f : M × N →ₗ[R] M)
    (i : Injective f) : Subsingleton N 
goal: Subsingleton N

full_name: IsNoetherian.equivPUnitOfProdInjective_apply
code: /-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial. -/
@[simps!]
def IsNoetherian.equivPUnitOfProdInjective (f : M × N →ₗ[R] M)
    (i : Injective f) : N ≃ₗ[R] PUnit.{w + 1} 
goal: ∀ (x : N), (IsNoetherian.equivPUnitOfProdInjective f i) x = 0

full_name: IsNoetherian.equivPUnitOfProdInjective
code: /-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial. -/
@[simps!]
def IsNoetherian.equivPUnitOfProdInjective (f : M × N →ₗ[R] M)
    (i : Injective f) : N ≃ₗ[R] PUnit.{w + 1} 
goal: N ≃ₗ[R] PUnit.{w + 1}

full_name: IsNoetherian.equivPUnitOfProdInjective_symm_apply
code: /-- If `M ⊕ N` embeds into `M`, for `M` noetherian over `R`, then `N` is trivial. -/
@[simps!]
def IsNoetherian.equivPUnitOfProdInjective (f : M × N →ₗ[R] M)
    (i : Injective f) : N ≃ₗ[R] PUnit.{w + 1} 
goal: ∀ (x : PUnit.{w + 1}), (IsNoetherian.equivPUnitOfProdInjective f i).symm x = 0

full_name: IsNoetherianRing
code: /-- A (semi)ring is Noetherian if it is Noetherian as a module over itself,
i.e. all its ideals are finitely generated.
-/
abbrev IsNoetherianRing (R) [Semiring R] 
goal: Prop

full_name: isNoetherianRing_iff
code: theorem isNoetherianRing_iff {R} [Semiring R] : IsNoetherianRing R ↔ IsNoetherian R R 
goal: IsNoetherianRing R ↔ IsNoetherian R R

full_name: isNoetherianRing_iff_ideal_fg
code: /-- A ring is Noetherian if and only if all its ideals are finitely-generated. -/
theorem isNoetherianRing_iff_ideal_fg (R : Type*) [Semiring R] :
    IsNoetherianRing R ↔ ∀ I : Ideal R, I.FG 
goal: IsNoetherianRing R ↔ ∀ (I : Ideal R), I.FG

full_name: isNoetherian_of_finite
code: instance (priority := 80) isNoetherian_of_finite (R M) [Finite M] [Semiring R] [AddCommMonoid M]
    [Module R M] : IsNoetherian R M 
goal: IsNoetherian R M

full_name: isNoetherian_of_subsingleton
code: /-- Modules over the trivial ring are Noetherian. -/
instance (priority := 100) isNoetherian_of_subsingleton (R M) [Subsingleton R] [Semiring R]
    [AddCommMonoid M] [Module R M] : IsNoetherian R M 
goal: IsNoetherian R M

full_name: isNoetherian_of_submodule_of_noetherian
code: theorem isNoetherian_of_submodule_of_noetherian (R M) [Semiring R] [AddCommMonoid M] [Module R M]
    (N : Submodule R M) (h : IsNoetherian R M) : IsNoetherian R N 
goal: IsNoetherian R ↥N

full_name: isNoetherian_of_tower
code: /-- If `M / S / R` is a scalar tower, and `M / R` is Noetherian, then `M / S` is
also noetherian. -/
theorem isNoetherian_of_tower (R) {S M} [Semiring R] [Semiring S] [AddCommMonoid M] [SMul R S]
    [Module S M] [Module R M] [IsScalarTower R S M] (h : IsNoetherian R M) : IsNoetherian S M 
goal: IsNoetherian S M

full_name: isNoetherian_of_fg_of_noetherian
code: theorem isNoetherian_of_fg_of_noetherian {R M} [Ring R] [AddCommGroup M] [Module R M]
    (N : Submodule R M) [I : IsNoetherianRing R] (hN : N.FG) : IsNoetherian R N 
goal: IsNoetherian R ↥N

full_name: isNoetherian_of_isNoetherianRing_of_finite
code: instance isNoetherian_of_isNoetherianRing_of_finite (R M : Type*)
    [Ring R] [AddCommGroup M] [Module R M] [IsNoetherianRing R] [Module.Finite R M] :
    IsNoetherian R M 
goal: IsNoetherian R M

full_name: isNoetherian_span_of_finite
code: /-- In a module over a Noetherian ring, the submodule generated by finitely many vectors is
Noetherian. -/
theorem isNoetherian_span_of_finite (R) {M} [Ring R] [AddCommGroup M] [Module R M]
    [IsNoetherianRing R] {A : Set M} (hA : A.Finite) : IsNoetherian R (Submodule.span R A) 
goal: IsNoetherian R ↥(Submodule.span R A)

full_name: isNoetherianRing_of_surjective
code: theorem isNoetherianRing_of_surjective (R) [Ring R] (S) [Ring S] (f : R →+* S)
    (hf : Function.Surjective f) [H : IsNoetherianRing R] : IsNoetherianRing S 
goal: IsNoetherianRing S

full_name: isNoetherianRing_range
code: instance isNoetherianRing_range {R} [Ring R] {S} [Ring S] (f : R →+* S) [IsNoetherianRing R] :
    IsNoetherianRing f.range 
goal: IsNoetherianRing ↥f.range

full_name: isNoetherianRing_of_ringEquiv
code: theorem isNoetherianRing_of_ringEquiv (R) [Ring R] {S} [Ring S] (f : R ≃+* S) [IsNoetherianRing R] :
    IsNoetherianRing S 
goal: IsNoetherianRing S

full_name: IsNoetherianRing.isNilpotent_nilradical
code: theorem IsNoetherianRing.isNilpotent_nilradical (R : Type*) [CommRing R] [IsNoetherianRing R] :
    IsNilpotent (nilradical R) 
goal: IsNilpotent (nilradical R)

full_name: IsNoetherianRing.orzechProperty
code: /-- Any Noetherian ring satisfies Orzech property.
See also `IsNoetherian.injective_of_surjective_of_submodule` and
`IsNoetherian.injective_of_surjective_of_injective`. -/
instance (priority := 100) IsNoetherianRing.orzechProperty
    (R) [Ring R] [IsNoetherianRing R] : OrzechProperty R 
goal: OrzechProperty R