Skip to content

Commit d066138

Browse files
committed
feat(RingTheory): Hopkins–Levitzki theorem (#21451)
**RingTheory/HopkinsLevitzki.lean** (new file): the Hopkins--Levitzki theorem says a module over a semiprimary ring is Noetherian iff it's Artinian (iff it's of finite length). As a consequence, a (left) Artinian ring is also (left) Noetherian, and a commutative ring is Artinian iff it's Noetherian and has Krull dimension 0. **RingTheory/Jacobson/Semiprimary.lean** (new file): contains the definition of semiprimary rings, and connections between Jacobson radicals of modules and semisimplicity. **RingTheory/Jacobson/Radical.lean** (new file): develop the theory of Jacobson radicals of modules, including versions of Nakayama's lemma over noncommutative rings. **RingTheory/Artinian/Module.lean**: show an Artinian module or ring is semisimple iff it has trivial radical; show that an Artinian ring is semiprimary.
1 parent 4bc5329 commit d066138

File tree

12 files changed

+475
-75
lines changed

12 files changed

+475
-75
lines changed

Mathlib.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4636,6 +4636,7 @@ import Mathlib.RingTheory.HahnSeries.Summable
46364636
import Mathlib.RingTheory.HahnSeries.Valuation
46374637
import Mathlib.RingTheory.Henselian
46384638
import Mathlib.RingTheory.HopfAlgebra
4639+
import Mathlib.RingTheory.HopkinsLevitzki
46394640
import Mathlib.RingTheory.Ideal.AssociatedPrime
46404641
import Mathlib.RingTheory.Ideal.Basic
46414642
import Mathlib.RingTheory.Ideal.Basis
@@ -4686,7 +4687,9 @@ import Mathlib.RingTheory.IsPrimary
46864687
import Mathlib.RingTheory.IsTensorProduct
46874688
import Mathlib.RingTheory.Jacobson.Ideal
46884689
import Mathlib.RingTheory.Jacobson.Polynomial
4690+
import Mathlib.RingTheory.Jacobson.Radical
46894691
import Mathlib.RingTheory.Jacobson.Ring
4692+
import Mathlib.RingTheory.Jacobson.Semiprimary
46904693
import Mathlib.RingTheory.Kaehler.Basic
46914694
import Mathlib.RingTheory.Kaehler.CotangentComplex
46924695
import Mathlib.RingTheory.Kaehler.JacobiZariski

Mathlib/AlgebraicGeometry/Fiber.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ instance (f : X ⟶ Y) (y : Y) [LocallyOfFiniteType f] : JacobsonSpace (f.fiber
101101
instance (f : X ⟶ Y) (y : Y) [IsFinite f] : Finite (f.fiber y) := by
102102
have H : IsFinite (f.fiberToSpecResidueField y) := MorphismProperty.pullback_snd _ _ inferInstance
103103
have : IsArtinianRing Γ(f.fiber y, ⊤) :=
104-
@IsArtinianRing.of_finite (Y.residueField y) Γ(f.fiber y, ⊤) _ _ (show _ from _) _
104+
@IsArtinianRing.of_finite (Y.residueField y) Γ(f.fiber y, ⊤) _ _ (show _ from _) _ _
105105
((HasAffineProperty.iff_of_isAffine.mp H).2.comp (.of_surjective _ (Scheme.ΓSpecIso
106106
(Y.residueField y)).commRingCatIsoToRingEquiv.symm.surjective))
107107
exact .of_injective (β := PrimeSpectrum _) _ (f.fiber y).isoSpec.hom.homeomorph.injective

Mathlib/RingTheory/Artinian/Instances.lean

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ Authors: Junyan Xu
66
import Mathlib.Algebra.Divisibility.Prod
77
import Mathlib.Algebra.Polynomial.FieldDivision
88
import Mathlib.RingTheory.Artinian.Module
9-
import Mathlib.RingTheory.SimpleModule.Basic
109

1110
/-!
1211
# Instances related to Artinian rings
@@ -26,6 +25,4 @@ instance : DecompositionMonoid R := MulEquiv.decompositionMonoid (equivPi R)
2625
instance : DecompositionMonoid (Polynomial R) :=
2726
MulEquiv.decompositionMonoid <| (Polynomial.mapEquiv <| equivPi R).trans (Polynomial.piEquiv _)
2827

29-
theorem isSemisimpleRing_of_isReduced : IsSemisimpleRing R := (equivPi R).symm.isSemisimpleRing
30-
3128
end IsArtinianRing

Mathlib/RingTheory/Artinian/Module.lean

Lines changed: 79 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Mathlib.Data.SetLike.Fintype
77
import Mathlib.Order.Filter.EventuallyConst
88
import Mathlib.RingTheory.Ideal.Prod
99
import Mathlib.RingTheory.Ideal.Quotient.Operations
10+
import Mathlib.RingTheory.Jacobson.Semiprimary
1011
import Mathlib.RingTheory.Nilpotent.Lemmas
1112
import Mathlib.RingTheory.Noetherian.Defs
1213
import Mathlib.RingTheory.Spectrum.Maximal.Basic
@@ -39,6 +40,11 @@ Let `R` be a ring and let `M` and `P` be `R`-modules. Let `N` be an `R`-submodul
3940
product of fields (and therefore is a semisimple ring and a decomposition monoid; moreover
4041
`R[X]` is also a decomposition monoid).
4142
43+
* `IsArtinian.isSemisimpleModule_iff_jacobson`: an Artinian module is semisimple
44+
iff its Jacobson radical is zero.
45+
46+
* `instIsSemiprimaryRingOfIsArtinianRing`: an Artinian ring `R` is semiprimary, in particular
47+
the Jacobson radical of `R` is a nilpotent ideal (`IsArtinianRing.isNilpotent_jacobson_bot`).
4248
4349
## References
4450
@@ -68,6 +74,12 @@ variable {R M P N : Type*}
6874
variable [Semiring R] [AddCommMonoid M] [AddCommMonoid P] [AddCommMonoid N]
6975
variable [Module R M] [Module R P] [Module R N]
7076

77+
theorem LinearMap.isArtinian_iff_of_bijective {S P} [Ring S] [AddCommGroup P] [Module S P]
78+
{σ : R →+* S} [RingHomSurjective σ] (l : M →ₛₗ[σ] P) (hl : Function.Bijective l) :
79+
IsArtinian R M ↔ IsArtinian S P :=
80+
let e := Submodule.orderIsoMapComapOfBijective l hl
81+
fun _ ↦ e.symm.strictMono.wellFoundedLT, fun _ ↦ e.strictMono.wellFoundedLT⟩
82+
7183
theorem isArtinian_of_injective (f : M →ₗ[R] P) (h : Function.Injective f) [IsArtinian R P] :
7284
IsArtinian R M :=
7385
⟨Subrelation.wf
@@ -273,6 +285,18 @@ instance isArtinian_iSup :
273285
· intros; rw [iSup_of_empty]; infer_instance
274286
· intro _ _ ih _ _; rw [iSup_option]; infer_instance
275287

288+
variable (R M) in
289+
theorem IsArtinian.isSemisimpleModule_iff_jacobson [IsArtinian R M] :
290+
IsSemisimpleModule R M ↔ Module.jacobson R M = ⊥ :=
291+
fun _ ↦ IsSemisimpleModule.jacobson_eq_bot R M, fun h ↦
292+
have ⟨s, hs⟩ := Finset.exists_inf_le (Subtype.val (p := fun m : Submodule R M ↦ IsCoatom m))
293+
have _ (m : s) : IsSimpleModule R (M ⧸ m.1.1) := isSimpleModule_iff_isCoatom.mpr m.1.2
294+
let f : M →ₗ[R] ∀ m : s, M ⧸ m.1.1 := LinearMap.pi fun m ↦ m.1.1.mkQ
295+
.of_injective f <| LinearMap.ker_eq_bot.mp <| le_bot_iff.mp fun x hx ↦ by
296+
rw [← h, Module.jacobson, Submodule.mem_sInf]
297+
exact fun m hm ↦ hs ⟨m, hm⟩ <| Submodule.mem_finset_inf.mpr fun i hi ↦
298+
(Submodule.Quotient.mk_eq_zero i.1).mp <| congr_fun hx ⟨i, hi⟩⟩
299+
276300
open Submodule Function
277301

278302
namespace LinearMap
@@ -380,34 +404,21 @@ theorem Ring.isArtinian_of_zero_eq_one {R} [Semiring R] (h01 : (0 : R) = 1) : Is
380404
have := subsingleton_of_zero_eq_one h01
381405
inferInstance
382406

383-
instance (R) [CommRing R] [IsArtinianRing R] (I : Ideal R) : IsArtinianRing (R ⧸ I) :=
407+
instance (R) [Ring R] [IsArtinianRing R] (I : Ideal R) [I.IsTwoSided] : IsArtinianRing (R ⧸ I) :=
384408
isArtinian_of_tower R inferInstance
385409

386410
open Submodule Function
387411

388-
theorem isArtinian_of_fg_of_artinian {R M} [Ring R] [AddCommGroup M] [Module R M]
389-
(N : Submodule R M) [IsArtinianRing R] (hN : N.FG) : IsArtinian R N := by
390-
let ⟨s, hs⟩ := hN
391-
haveI := Classical.decEq M
392-
haveI := Classical.decEq R
393-
have : ∀ x ∈ s, x ∈ N := fun x hx => hs ▸ Submodule.subset_span hx
394-
refine @isArtinian_of_surjective _ ((↑s : Set M) →₀ R) N _ _ _ _ _ ?_ ?_ isArtinian_finsupp
395-
· exact Finsupp.linearCombination R (fun i => ⟨i, hs ▸ subset_span i.2⟩)
396-
· rw [← LinearMap.range_eq_top, eq_top_iff,
397-
← map_le_map_iff_of_injective (show Injective (Submodule.subtype N)
398-
from Subtype.val_injective), Submodule.map_top, range_subtype,
399-
← Submodule.map_top, ← Submodule.map_comp, Submodule.map_top]
400-
subst N
401-
refine span_le.2 (fun i hi => ?_)
402-
use Finsupp.single ⟨i, hi⟩ 1
403-
simp
404-
405412
instance isArtinian_of_fg_of_artinian' {R M} [Ring R] [AddCommGroup M] [Module R M]
406413
[IsArtinianRing R] [Module.Finite R M] : IsArtinian R M :=
407-
have : IsArtinian R (⊤ : Submodule R M) := isArtinian_of_fg_of_artinian _ Module.Finite.fg_top
408-
isArtinian_of_linearEquiv (LinearEquiv.ofTop (⊤ : Submodule R M) rfl)
414+
have ⟨_, _, h⟩ := Module.Finite.exists_fin' R M
415+
isArtinian_of_surjective _ _ h
416+
417+
theorem isArtinian_of_fg_of_artinian {R M} [Ring R] [AddCommGroup M] [Module R M]
418+
(N : Submodule R M) [IsArtinianRing R] (hN : N.FG) : IsArtinian R N := by
419+
rw [← Module.Finite.iff_fg] at hN; infer_instance
409420

410-
theorem IsArtinianRing.of_finite (R S) [CommRing R] [Ring S] [Algebra R S]
421+
theorem IsArtinianRing.of_finite (R S) [Ring R] [Ring S] [Module R S] [IsScalarTower R S S]
411422
[IsArtinianRing R] [Module.Finite R S] : IsArtinianRing S :=
412423
isArtinian_of_tower R isArtinian_of_fg_of_artinian'
413424

@@ -454,13 +465,9 @@ variable (R : Type*) [CommSemiring R] [IsArtinianRing R]
454465

455466
@[stacks 00J7]
456467
lemma setOf_isMaximal_finite : {I : Ideal R | I.IsMaximal}.Finite := by
457-
set Spec := {I : Ideal R | I.IsMaximal}
458-
obtain ⟨_, ⟨s, rfl⟩, H⟩ := IsArtinian.set_has_minimal
459-
(range (Finset.inf · Subtype.val : Finset Spec → Ideal R)) ⟨⊤, ∅, by simp⟩
468+
have ⟨s, H⟩ := Finset.exists_inf_le (Subtype.val (p := fun I : Ideal R ↦ I.IsMaximal))
460469
refine Set.finite_def.2 ⟨s, fun p ↦ ?_⟩
461-
classical
462-
obtain ⟨q, hq1, hq2⟩ := p.2.isPrime.inf_le'.mp <| inf_eq_right.mp <|
463-
inf_le_right.eq_of_not_lt (H (p ⊓ s.inf Subtype.val) ⟨insert p s, by simp⟩)
470+
have ⟨q, hq1, hq2⟩ := p.2.isPrime.inf_le'.mp (H p)
464471
rwa [← Subtype.ext <| q.2.eq_of_le p.2.ne_top hq2]
465472

466473
instance : Finite (MaximalSpectrum R) :=
@@ -469,6 +476,8 @@ instance : Finite (MaximalSpectrum R) :=
469476

470477
end CommSemiring
471478

479+
section CommRing
480+
472481
variable {R : Type*} [CommRing R] [IsArtinianRing R]
473482

474483
variable (R) in
@@ -546,4 +555,47 @@ noncomputable def equivPi [IsReduced R] : R ≃+* ∀ I : MaximalSpectrum R, R
546555
.trans (.symm <| .quotientBot R) <| .trans
547556
(Ideal.quotEquivOfEq (nilradical_eq_zero R).symm) (quotNilradicalEquivPi R)
548557

558+
theorem isSemisimpleRing_of_isReduced [IsReduced R] : IsSemisimpleRing R :=
559+
(equivPi R).symm.isSemisimpleRing
560+
561+
end CommRing
562+
563+
section Ring
564+
565+
variable {R : Type*} [Ring R] [IsArtinianRing R]
566+
567+
theorem isSemisimpleRing_iff_jacobson : IsSemisimpleRing R ↔ Ring.jacobson R = ⊥ :=
568+
IsArtinian.isSemisimpleModule_iff_jacobson R R
569+
570+
instance : IsSemiprimaryRing R where
571+
isSemisimpleRing :=
572+
IsArtinianRing.isSemisimpleRing_iff_jacobson.mpr (Ring.jacobson_quotient_jacobson R)
573+
isNilpotent := by
574+
let Jac := Ring.jacobson R
575+
have ⟨n, hn⟩ := IsArtinian.monotone_stabilizes ⟨(Jac ^ ·), @Ideal.pow_le_pow_right _ _ _⟩
576+
have hn : Jac * Jac ^ n = Jac ^ n := by
577+
rw [← Ideal.IsTwoSided.pow_succ]; exact (hn _ n.le_succ).symm
578+
use n; by_contra ne
579+
have ⟨N, ⟨eq, ne⟩, min⟩ := wellFounded_lt.has_min {N | Jac * N = N ∧ N ≠ ⊥} ⟨_, hn, ne⟩
580+
have : Jac ^ n * N = N := n.rec (by rw [Jac.pow_zero, N.one_mul])
581+
fun n hn ↦ by rwa [Jac.pow_succ, mul_assoc, eq]
582+
let I x := Submodule.map (LinearMap.toSpanSingleton R R x) (Jac ^ n)
583+
have hI x : I x ≤ Ideal.span {x} := by
584+
rw [Ideal.span, LinearMap.span_singleton_eq_range]; exact LinearMap.map_le_range
585+
have ⟨x, hx⟩ : ∃ x ∈ N, I x ≠ ⊥ := by
586+
contrapose! ne
587+
rw [← this, ← le_bot_iff, Ideal.mul_le]
588+
refine fun ri hi rn hn ↦ ?_
589+
rw [← ne rn hn]
590+
exact ⟨ri, hi, rfl⟩
591+
rw [← Ideal.span_singleton_le_iff_mem] at hx
592+
have : I x = N := by
593+
refine ((hI x).trans hx.1).eq_of_not_lt (min _ ⟨?_, hx.2⟩)
594+
rw [← smul_eq_mul, ← Submodule.map_smul'', smul_eq_mul, hn]
595+
have : Ideal.span {x} = N := le_antisymm hx.1 (this.symm.trans_le <| hI x)
596+
refine (this ▸ ne) ((Submodule.fg_span <| Set.finite_singleton x).eq_bot_of_le_jacobson_smul ?_)
597+
rw [← Ideal.span, this, smul_eq_mul, eq]
598+
599+
end Ring
600+
549601
end IsArtinianRing

Mathlib/RingTheory/Artinian/Ring.lean

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Mathlib.Algebra.Field.Equiv
77
import Mathlib.RingTheory.Artinian.Module
88
import Mathlib.RingTheory.Localization.Defs
99
import Mathlib.RingTheory.LocalRing.MaximalIdeal.Basic
10-
import Mathlib.RingTheory.Nakayama
1110

1211
/-!
1312
# Artinian rings
@@ -25,7 +24,7 @@ itself, or simply Artinian if it is both left and right Artinian.
2524
ring to any localization of itself is surjective.
2625
2726
* `IsArtinianRing.isNilpotent_jacobson_bot`: the Jacobson radical of a commutative artinian ring
28-
is a nilpotent ideal. (TODO: generalize to noncommutative rings.)
27+
is a nilpotent ideal.
2928
3029
## Implementation Details
3130
@@ -47,43 +46,12 @@ open Set Submodule IsArtinian
4746

4847
namespace IsArtinianRing
4948

50-
variable {R : Type*} [CommRing R] [IsArtinianRing R]
51-
5249
@[stacks 00J8]
53-
theorem isNilpotent_jacobson_bot : IsNilpotent (Ideal.jacobson (⊥ : Ideal R)) := by
54-
let Jac := Ideal.jacobson (⊥ : Ideal R)
55-
let f : ℕ →o (Ideal R)ᵒᵈ := ⟨fun n => Jac ^ n, fun _ _ h => Ideal.pow_le_pow_right h⟩
56-
obtain ⟨n, hn⟩ : ∃ n, ∀ m, n ≤ m → Jac ^ n = Jac ^ m := IsArtinian.monotone_stabilizes f
57-
refine ⟨n, ?_⟩
58-
let J : Ideal R := annihilator (Jac ^ n)
59-
suffices J = ⊤ by
60-
have hJ : J • Jac ^ n = ⊥ := annihilator_smul (Jac ^ n)
61-
simpa only [this, top_smul, Ideal.zero_eq_bot] using hJ
62-
by_contra hJ
63-
change J ≠ ⊤ at hJ
64-
rcases IsArtinian.set_has_minimal { J' : Ideal R | J < J' } ⟨⊤, hJ.lt_top⟩ with
65-
⟨J', hJJ' : J < J', hJ' : ∀ I, J < I → ¬I < J'⟩
66-
rcases SetLike.exists_of_lt hJJ' with ⟨x, hxJ', hxJ⟩
67-
obtain rfl : J ⊔ Ideal.span {x} = J' := by
68-
apply eq_of_le_of_not_lt _ (hJ' (J ⊔ Ideal.span {x}) _)
69-
· exact sup_le hJJ'.le (span_le.2 (singleton_subset_iff.2 hxJ'))
70-
· rw [SetLike.lt_iff_le_and_exists]
71-
exact ⟨le_sup_left, ⟨x, mem_sup_right (mem_span_singleton_self x), hxJ⟩⟩
72-
have : J ⊔ Jac • Ideal.span {x} ≤ J ⊔ Ideal.span {x} :=
73-
sup_le_sup_left (smul_le.2 fun _ _ _ => Submodule.smul_mem _ _) _
74-
have : Jac * Ideal.span {x} ≤ J := by -- Need version 4 of Nakayama's lemma on Stacks
75-
by_contra H
76-
refine H (Ideal.mul_le_left.trans (le_of_le_smul_of_le_jacobson_bot (fg_span_singleton _) le_rfl
77-
(le_sup_right.trans_eq (this.eq_of_not_lt (hJ' _ ?_)).symm)))
78-
exact lt_of_le_of_ne le_sup_left fun h => H <| h.symm ▸ le_sup_right
79-
have : Ideal.span {x} * Jac ^ (n + 1) ≤ ⊥ := calc
80-
Ideal.span {x} * Jac ^ (n + 1) = Ideal.span {x} * Jac * Jac ^ n := by
81-
rw [pow_succ', ← mul_assoc]
82-
_ ≤ J * Jac ^ n := mul_le_mul (by rwa [mul_comm]) le_rfl
83-
_ = ⊥ := by simp [J]
84-
refine hxJ (mem_annihilator.2 fun y hy => (mem_bot R).1 ?_)
85-
refine this (mul_mem_mul (mem_span_singleton_self x) ?_)
86-
rwa [← hn (n + 1) (Nat.le_succ _)]
50+
theorem isNilpotent_jacobson_bot {R} [Ring R] [IsArtinianRing R] :
51+
IsNilpotent (Ideal.jacobson (⊥ : Ideal R)) :=
52+
Ideal.jacobson_bot (R := R) ▸ IsSemiprimaryRing.isNilpotent
53+
54+
variable {R : Type*} [CommRing R] [IsArtinianRing R]
8755

8856
lemma jacobson_eq_radical (I : Ideal R) : I.jacobson = I.radical := by
8957
simp_rw [Ideal.jacobson, Ideal.radical_eq_sInf, IsArtinianRing.isPrime_iff_isMaximal]

Mathlib/RingTheory/FiniteLength.lean

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,26 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Junyan Xu
55
-/
66
import Mathlib.RingTheory.Artinian.Module
7-
import Mathlib.RingTheory.SimpleModule.Basic
87

98
/-!
109
# Modules of finite length
1110
1211
We define modules of finite length (`IsFiniteLength`) to be finite iterated extensions of
1312
simple modules, and show that a module is of finite length iff it is both Noetherian and Artinian,
1413
iff it admits a composition series.
14+
1515
We do not make `IsFiniteLength` a class, instead we use `[IsNoetherian R M] [IsArtinian R M]`.
1616
17-
## Tag
17+
## Tags
1818
1919
Finite length, Composition series
2020
-/
2121

22-
universe u
23-
2422
variable (R : Type*) [Ring R]
2523

2624
/-- A module of finite length is either trivial or a simple extension of a module known
2725
to be of finite length. -/
28-
inductive IsFiniteLength : ∀ (M : Type u) [AddCommGroup M] [Module R M], Prop
26+
inductive IsFiniteLength : ∀ (M : Type*) [AddCommGroup M] [Module R M], Prop
2927
| of_subsingleton {M} [AddCommGroup M] [Module R M] [Subsingleton M] : IsFiniteLength M
3028
| of_simple_quotient {M} [AddCommGroup M] [Module R M] {N : Submodule R M}
3129
[IsSimpleModule R (M ⧸ N)] : IsFiniteLength N → IsFiniteLength M

0 commit comments

Comments
 (0)