File: Mathlib/RingTheory/Artinian.lean

full_name: IsArtinian
code: /-- `IsArtinian R M` is the proposition that `M` is an Artinian `R`-module,
implemented as the well-foundedness of submodule inclusion. -/
class IsArtinian (R M) [Semiring R] [AddCommMonoid M] [Module R M] : Prop where
  wellFounded_submodule_lt' : WellFounded ((· < ·) : Submodule R M → Submodule R M → Prop)
goal: Prop

full_name: IsArtinian.wellFounded_submodule_lt'
code: /-- `IsArtinian R M` is the proposition that `M` is an Artinian `R`-module,
implemented as the well-foundedness of submodule inclusion. -/
class IsArtinian (R M) [Semiring R] [AddCommMonoid M] [Module R M] : Prop where
  wellFounded_submodule_lt' : WellFounded ((· < ·) : Submodule R M → Submodule R M → Prop)
goal: WellFounded fun x x_1 => x < x_1

full_name: IsArtinian.wellFounded_submodule_lt
code: theorem IsArtinian.wellFounded_submodule_lt (R M) [Semiring R] [AddCommMonoid M] [Module R M]
    [IsArtinian R M] : WellFounded ((· < ·) : Submodule R M → Submodule R M → Prop) 
goal: WellFounded fun x x_1 => x < x_1

full_name: isArtinian_of_injective
code: theorem isArtinian_of_injective (f : M →ₗ[R] P) (h : Function.Injective f) [IsArtinian R P] :
    IsArtinian R M 
goal: IsArtinian R M

full_name: isArtinian_submodule'
code: instance isArtinian_submodule' [IsArtinian R M] (N : Submodule R M) : IsArtinian R N 
goal: IsArtinian R ↥N

full_name: isArtinian_of_le
code: theorem isArtinian_of_le {s t : Submodule R M} [IsArtinian R t] (h : s ≤ t) : IsArtinian R s 
goal: IsArtinian R ↥s

full_name: isArtinian_of_surjective
code: theorem isArtinian_of_surjective (f : M →ₗ[R] P) (hf : Function.Surjective f) [IsArtinian R M] :
    IsArtinian R P 
goal: IsArtinian R P

full_name: isArtinian_of_linearEquiv
code: theorem isArtinian_of_linearEquiv (f : M ≃ₗ[R] P) [IsArtinian R M] : IsArtinian R P 
goal: IsArtinian R P

full_name: isArtinian_of_range_eq_ker
code: theorem isArtinian_of_range_eq_ker [IsArtinian R M] [IsArtinian R P] (f : M →ₗ[R] N) (g : N →ₗ[R] P)
    (hf : Function.Injective f) (hg : Function.Surjective g)
    (h : LinearMap.range f = LinearMap.ker g) : IsArtinian R N 
goal: IsArtinian R N

full_name: isArtinian_prod
code: instance isArtinian_prod [IsArtinian R M] [IsArtinian R P] : IsArtinian R (M × P) 
goal: IsArtinian R (M × P)

full_name: isArtinian_of_finite
code: instance (priority := 100) isArtinian_of_finite [Finite M] : IsArtinian R M 
goal: IsArtinian R M

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

full_name: isArtinian_pi'
code: /-- A version of `isArtinian_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 isArtinian_pi' {R ι M : Type*} [Ring R] [AddCommGroup M] [Module R M] [Finite ι]
    [IsArtinian R M] : IsArtinian R (ι → M) 
goal: IsArtinian R (ι → M)

full_name: isArtinian_finsupp
code: instance isArtinian_finsupp {R ι M : Type*} [Ring R] [AddCommGroup M] [Module R M] [Finite ι]
    [IsArtinian R M] : IsArtinian R (ι →₀ M) 
goal: IsArtinian R (ι →₀ M)

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

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

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

full_name: IsArtinian.set_has_minimal
code: theorem IsArtinian.set_has_minimal [IsArtinian R M] (a : Set <| Submodule R M) (ha : a.Nonempty) :
    ∃ M' ∈ a, ∀ I ∈ a, ¬I < M' 
goal: ∃ M' ∈ a, ∀ I ∈ a, ¬I < M'

full_name: monotone_stabilizes_iff_artinian
code: /-- A module is Artinian iff every decreasing chain of submodules stabilizes. -/
theorem monotone_stabilizes_iff_artinian :
    (∀ f : ℕ →o (Submodule R M)ᵒᵈ, ∃ n, ∀ m, n ≤ m → f n = f m) ↔ IsArtinian R M 
goal: (∀ (f : ℕ →o (Submodule R M)ᵒᵈ), ∃ n, ∀ (m : ℕ), n ≤ m → f n = f m) ↔ IsArtinian R M

full_name: IsArtinian.monotone_stabilizes
code: theorem monotone_stabilizes (f : ℕ →o (Submodule R M)ᵒᵈ) : ∃ n, ∀ m, n ≤ m → f n = f m 
goal: ∃ n, ∀ (m : ℕ), n ≤ m → f n = f m

full_name: IsArtinian.eventuallyConst_of_isArtinian
code: theorem eventuallyConst_of_isArtinian (f : ℕ →o (Submodule R M)ᵒᵈ) :
    atTop.EventuallyConst f 
goal: Filter.EventuallyConst (⇑f) Filter.atTop

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

full_name: LinearMap.eventually_codisjoint_ker_pow_range_pow
code: /-- For any endomorphism of an Artinian module, any sufficiently high iterate has codisjoint kernel
and range. -/
theorem eventually_codisjoint_ker_pow_range_pow (f : M →ₗ[R] M) :
    ∀ᶠ n in atTop, Codisjoint (LinearMap.ker (f ^ n)) (LinearMap.range (f ^ n)) 
goal: ∀ᶠ (n : ℕ) in Filter.atTop, Codisjoint (LinearMap.ker (f ^ n)) (LinearMap.range (f ^ n))

full_name: LinearMap.eventually_iInf_range_pow_eq
code: lemma eventually_iInf_range_pow_eq (f : Module.End R M) :
    ∀ᶠ n in atTop, ⨅ m, LinearMap.range (f ^ m) = LinearMap.range (f ^ n) 
goal: ∀ᶠ (n : ℕ) in Filter.atTop, ⨅ m, LinearMap.range (f ^ m) = LinearMap.range (f ^ n)

full_name: LinearMap.eventually_isCompl_ker_pow_range_pow
code: /-- This is the Fitting decomposition of the module `M` with respect to the endomorphism `f`.

See also `LinearMap.isCompl_iSup_ker_pow_iInf_range_pow` for an alternative spelling. -/
theorem eventually_isCompl_ker_pow_range_pow [IsNoetherian R M] (f : M →ₗ[R] M) :
    ∀ᶠ n in atTop, IsCompl (LinearMap.ker (f ^ n)) (LinearMap.range (f ^ n)) 
goal: ∀ᶠ (n : ℕ) in Filter.atTop, IsCompl (LinearMap.ker (f ^ n)) (LinearMap.range (f ^ n))

full_name: LinearMap.isCompl_iSup_ker_pow_iInf_range_pow
code: /-- This is the Fitting decomposition of the module `M` with respect to the endomorphism `f`.

See also `LinearMap.eventually_isCompl_ker_pow_range_pow` for an alternative spelling. -/
theorem isCompl_iSup_ker_pow_iInf_range_pow [IsNoetherian R M] (f : M →ₗ[R] M) :
    IsCompl (⨆ n, LinearMap.ker (f ^ n)) (⨅ n, LinearMap.range (f ^ n)) 
goal: IsCompl (⨆ n, LinearMap.ker (f ^ n)) (⨅ n, LinearMap.range (f ^ n))

full_name: IsArtinian.surjective_of_injective_endomorphism
code: /-- Any injective endomorphism of an Artinian module is surjective. -/
theorem surjective_of_injective_endomorphism (f : M →ₗ[R] M) (s : Injective f) : Surjective f 
goal: Function.Surjective ⇑f

full_name: IsArtinian.bijective_of_injective_endomorphism
code: /-- Any injective endomorphism of an Artinian module is bijective. -/
theorem bijective_of_injective_endomorphism (f : M →ₗ[R] M) (s : Injective f) : Bijective f 
goal: Function.Bijective ⇑f

full_name: IsArtinian.disjoint_partial_infs_eventually_top
code: /-- A sequence `f` of submodules of an artinian module,
with the supremum `f (n+1)` and the infimum of `f 0`, ..., `f n` being ⊤,
is eventually ⊤. -/
theorem disjoint_partial_infs_eventually_top (f : ℕ → Submodule R M)
    (h : ∀ n, Disjoint (partialSups (OrderDual.toDual ∘ f) n) (OrderDual.toDual (f (n + 1)))) :
    ∃ n : ℕ, ∀ m, n ≤ m → f m = ⊤ 
goal: ∃ n, ∀ (m : ℕ), n ≤ m → f m = ⊤

full_name: IsArtinian.range_smul_pow_stabilizes
code: theorem range_smul_pow_stabilizes (r : R) :
    ∃ n : ℕ, ∀ m, n ≤ m →
      LinearMap.range (r ^ n • LinearMap.id : M →ₗ[R] M) =
      LinearMap.range (r ^ m • LinearMap.id : M →ₗ[R] M) 
goal: ∃ n, ∀ (m : ℕ), n ≤ m → LinearMap.range (r ^ n • LinearMap.id) = LinearMap.range (r ^ m • LinearMap.id)

full_name: IsArtinian.exists_pow_succ_smul_dvd
code: theorem exists_pow_succ_smul_dvd (r : R) (x : M) :
    ∃ (n : ℕ) (y : M), r ^ n.succ • y = r ^ n • x 
goal: ∃ n y, r ^ n.succ • y = r ^ n • x

full_name: IsArtinianRing
code: /-- A ring is Artinian if it is Artinian as a module over itself.

Strictly speaking, this should be called `IsLeftArtinianRing` but we omit the `Left` for
convenience in the commutative case. For a right Artinian ring, use `IsArtinian Rᵐᵒᵖ R`. -/
abbrev IsArtinianRing (R) [Ring R] 
goal: Prop

full_name: isArtinianRing_iff
code: theorem isArtinianRing_iff {R} [Ring R] : IsArtinianRing R ↔ IsArtinian R R 
goal: IsArtinianRing R ↔ IsArtinian R R

full_name: DivisionRing.instIsArtinianRing
code: instance DivisionRing.instIsArtinianRing {K : Type*} [DivisionRing K] : IsArtinianRing K 
goal: IsArtinianRing K

full_name: Ring.isArtinian_of_zero_eq_one
code: theorem Ring.isArtinian_of_zero_eq_one {R} [Ring R] (h01 : (0 : R) = 1) : IsArtinianRing R 
goal: IsArtinianRing R

full_name: isArtinian_of_submodule_of_artinian
code: theorem isArtinian_of_submodule_of_artinian (R M) [Ring R] [AddCommGroup M] [Module R M]
    (N : Submodule R M) (_ : IsArtinian R M) : IsArtinian R N 
goal: IsArtinian R M → IsArtinian R ↥N

full_name: isArtinian_of_quotient_of_artinian
code: instance isArtinian_of_quotient_of_artinian (R) [Ring R] (M) [AddCommGroup M] [Module R M]
    (N : Submodule R M) [IsArtinian R M] : IsArtinian R (M ⧸ N) 
goal: IsArtinian R (M ⧸ N)

full_name: isArtinian_of_tower
code: /-- If `M / S / R` is a scalar tower, and `M / R` is Artinian, then `M / S` is also Artinian. -/
theorem isArtinian_of_tower (R) {S M} [CommRing R] [Ring S] [AddCommGroup M] [Algebra R S]
    [Module S M] [Module R M] [IsScalarTower R S M] (h : IsArtinian R M) : IsArtinian S M 
goal: IsArtinian S M

full_name: instIsArtinianRingQuotientIdeal
code: instance (R) [CommRing R] [IsArtinianRing R] (I : Ideal R) : IsArtinianRing (R ⧸ I) 
goal: IsArtinianRing (R ⧸ I)

full_name: isArtinian_of_fg_of_artinian
code: theorem isArtinian_of_fg_of_artinian {R M} [Ring R] [AddCommGroup M] [Module R M]
    (N : Submodule R M) [IsArtinianRing R] (hN : N.FG) : IsArtinian R N 
goal: IsArtinian R ↥N

full_name: isArtinian_of_fg_of_artinian'
code: instance isArtinian_of_fg_of_artinian' {R M} [Ring R] [AddCommGroup M] [Module R M]
    [IsArtinianRing R] [Module.Finite R M] : IsArtinian R M 
goal: IsArtinian R M

full_name: IsArtinianRing.of_finite
code: theorem IsArtinianRing.of_finite (R S) [CommRing R] [Ring S] [Algebra R S]
    [IsArtinianRing R] [Module.Finite R S] : IsArtinianRing S 
goal: IsArtinianRing S

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

full_name: Function.Surjective.isArtinianRing
code: theorem Function.Surjective.isArtinianRing {R} [Ring R] {S} [Ring S] {F}
    [FunLike F R S] [RingHomClass F R S]
    {f : F} (hf : Function.Surjective f) [H : IsArtinianRing R] : IsArtinianRing S 
goal: IsArtinianRing S

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

full_name: IsArtinianRing.isNilpotent_jacobson_bot
code: theorem isNilpotent_jacobson_bot : IsNilpotent (Ideal.jacobson (⊥ : Ideal R)) 
goal: IsNilpotent ⊥.jacobson

full_name: IsArtinianRing.localization_surjective
code: /-- Localizing an artinian ring can only reduce the amount of elements. -/
theorem localization_surjective : Function.Surjective (algebraMap R L) 
goal: Function.Surjective ⇑(algebraMap R L)

full_name: IsArtinianRing.localization_artinian
code: theorem localization_artinian : IsArtinianRing L 
goal: IsArtinianRing L

full_name: IsArtinianRing.instLocalization
code: /-- `IsArtinianRing.localization_artinian` can't be made an instance, as it would make `S` + `R`
into metavariables. However, this is safe. -/
instance : IsArtinianRing (Localization S) 
goal: IsArtinianRing (Localization S)

full_name: IsArtinianRing.isMaximal_of_isPrime
code: instance isMaximal_of_isPrime (p : Ideal R) [p.IsPrime] : p.IsMaximal 
goal: p.IsMaximal

full_name: IsArtinianRing.isPrime_iff_isMaximal
code: lemma isPrime_iff_isMaximal (p : Ideal R) : p.IsPrime ↔ p.IsMaximal 
goal: p.IsPrime ↔ p.IsMaximal

full_name: IsArtinianRing.primeSpectrum_finite
code: lemma primeSpectrum_finite : {I : Ideal R | I.IsPrime}.Finite 
goal: {I | I.IsPrime}.Finite

full_name: IsArtinianRing.maximal_ideals_finite
code: /--
[Stacks Lemma 00J7](https://stacks.math.columbia.edu/tag/00J7)
-/
lemma maximal_ideals_finite : {I : Ideal R | I.IsMaximal}.Finite 
goal: {I | I.IsMaximal}.Finite

full_name: IsArtinianRing.subtype_isMaximal_finite
code: @[local instance] lemma subtype_isMaximal_finite : Finite {I : Ideal R | I.IsMaximal} 
goal: Finite ↑{I | I.IsMaximal}

full_name: IsArtinianRing.fieldOfSubtypeIsMaximal
code: /-- A temporary field instance on the quotients by maximal ideals. -/
@[local instance] noncomputable def fieldOfSubtypeIsMaximal
    (I : {I : Ideal R | I.IsMaximal}) : Field (R ⧸ I.1) 
goal: Field (R ⧸ ↑I)

full_name: IsArtinianRing.quotNilradicalEquivPi
code: /-- The quotient of a commutative artinian ring by its nilradical is isomorphic to
a finite product of fields, namely the quotients by the maximal ideals. -/
noncomputable def quotNilradicalEquivPi :
    R ⧸ nilradical R ≃+* ∀ I : {I : Ideal R | I.IsMaximal}, R ⧸ I.1 
goal: R ⧸ nilradical R ≃+* ((I : ↑{I | I.IsMaximal}) → R ⧸ ↑I)

full_name: IsArtinianRing.equivPi
code: /-- A reduced commutative artinian ring is isomorphic to a finite product of fields,
namely the quotients by the maximal ideals. -/
noncomputable def equivPi [IsReduced R] : R ≃+* ∀ I : {I : Ideal R | I.IsMaximal}, R ⧸ I.1 
goal: R ≃+* ((I : ↑{I | I.IsMaximal}) → R ⧸ ↑I)

full_name: IsArtinianRing.instDecompositionMonoidOfIsReduced
code: instance [IsReduced R] : DecompositionMonoid R 
goal: DecompositionMonoid R

full_name: IsArtinianRing.instDecompositionMonoidPolynomialOfIsReduced
code: instance [IsReduced R] : DecompositionMonoid (Polynomial R) 
goal: DecompositionMonoid (Polynomial R)

full_name: IsArtinianRing.isSemisimpleRing_of_isReduced
code: theorem isSemisimpleRing_of_isReduced [IsReduced R] : IsSemisimpleRing R 
goal: IsSemisimpleRing R