Skip to content

Commit 0c7545e

Browse files
alreadydonejano-wol
authored andcommitted
feat(RingTheory): isotypic API and simple Wedderburn–Artin existence (#23963)
A replacement of #23583 with more meaningful intermediate results. Co-authored-by: Edison Xie @Whysoserioushah Co-authored-by: Jujian Zhang [jujian.zhang19@imperial.ac.uk](mailto:jujian.zhang19@imperial.ac.uk)
1 parent 2a7c39b commit 0c7545e

File tree

5 files changed

+417
-20
lines changed

5 files changed

+417
-20
lines changed

Mathlib.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5347,7 +5347,10 @@ import Mathlib.RingTheory.RootsOfUnity.Lemmas
53475347
import Mathlib.RingTheory.RootsOfUnity.Minpoly
53485348
import Mathlib.RingTheory.RootsOfUnity.PrimitiveRoots
53495349
import Mathlib.RingTheory.SimpleModule.Basic
5350+
import Mathlib.RingTheory.SimpleModule.IsAlgClosed
5351+
import Mathlib.RingTheory.SimpleModule.Isotypic
53505352
import Mathlib.RingTheory.SimpleModule.Rank
5353+
import Mathlib.RingTheory.SimpleModule.WedderburnArtin
53515354
import Mathlib.RingTheory.SimpleRing.Basic
53525355
import Mathlib.RingTheory.SimpleRing.Congr
53535356
import Mathlib.RingTheory.SimpleRing.Defs

Mathlib/RingTheory/SimpleModule/Basic.lean

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ Copyright (c) 2020 Aaron Anderson. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Aaron Anderson
55
-/
6-
import Mathlib.LinearAlgebra.DFinsupp
6+
import Mathlib.Algebra.DirectSum.Module
7+
import Mathlib.Data.Finite.Card
78
import Mathlib.Data.Matrix.Mul
9+
import Mathlib.LinearAlgebra.DFinsupp
810
import Mathlib.LinearAlgebra.Finsupp.Span
911
import Mathlib.LinearAlgebra.Isomorphisms
1012
import Mathlib.LinearAlgebra.Projection
@@ -70,7 +72,6 @@ variable {R S} in
7072
theorem RingEquiv.isSemisimpleRing_iff (e : R ≃+* S) : IsSemisimpleRing R ↔ IsSemisimpleRing S :=
7173
fun _ ↦ e.isSemisimpleRing, fun _ ↦ e.symm.isSemisimpleRing⟩
7274

73-
-- Making this an instance causes the linter to complain of "dangerous instances"
7475
theorem IsSimpleModule.nontrivial [IsSimpleModule R M] : Nontrivial M :=
7576
⟨⟨0, by
7677
have h : (⊥ : Submodule R M) ≠ ⊤ := bot_ne_top
@@ -86,8 +87,11 @@ theorem LinearMap.isSimpleModule_iff_of_bijective [Module S N] {σ : R →+* S}
8687

8788
variable [Module R N]
8889

89-
theorem IsSimpleModule.congr (l : M ≃ₗ[R] N) [IsSimpleModule R N] : IsSimpleModule R M :=
90-
(Submodule.orderIsoMapComap l).isSimpleOrder
90+
theorem IsSimpleModule.congr (e : M ≃ₗ[R] N) [IsSimpleModule R N] : IsSimpleModule R M :=
91+
(Submodule.orderIsoMapComap e).isSimpleOrder
92+
93+
theorem LinearEquiv.isSimpleModule_iff (e : M ≃ₗ[R] N) : IsSimpleModule R M ↔ IsSimpleModule R N :=
94+
⟨(·.congr e.symm), (·.congr e)⟩
9195

9296
theorem isSimpleModule_iff_isAtom : IsSimpleModule R m ↔ IsAtom m := by
9397
rw [← Set.isSimpleOrder_Iic_iff_isAtom]
@@ -182,6 +186,12 @@ namespace IsSemisimpleModule
182186

183187
variable [IsSemisimpleModule R M]
184188

189+
theorem extension_property {P} [AddCommGroup P] [Module R P] (f : N →ₗ[R] M)
190+
(hf : Function.Injective f) (g : N →ₗ[R] P) :
191+
∃ h : M →ₗ[R] P, h ∘ₗ f = g :=
192+
have ⟨m, compl⟩ := exists_isCompl (LinearMap.range f)
193+
⟨g ∘ₗ LinearMap.linearProjOfIsCompl _ f hf compl, by ext; simp⟩
194+
185195
theorem eq_bot_or_exists_simple_le (N : Submodule R M) : N = ⊥ ∨ ∃ m ≤ N, IsSimpleModule R m := by
186196
simpa only [isSimpleModule_iff_isAtom, and_comm] using eq_bot_or_exists_atom_le _
187197

@@ -261,6 +271,10 @@ end
261271

262272
end IsSemisimpleModule
263273

274+
theorem LinearEquiv.isSemisimpleModule_iff (e : M ≃ₗ[R] N) :
275+
IsSemisimpleModule R M ↔ IsSemisimpleModule R N :=
276+
⟨(·.congr e.symm), (·.congr e)⟩
277+
264278
/-- A module is semisimple iff it is generated by its simple submodules. -/
265279
theorem sSup_simples_eq_top_iff_isSemisimpleModule :
266280
sSup { m : Submodule R M | IsSimpleModule R m } = ⊤ ↔ IsSemisimpleModule R M :=
@@ -273,21 +287,14 @@ lemma isSemisimpleModule_of_isSemisimpleModule_submodule {s : Set ι} {p : ι
273287
refine complementedLattice_of_complementedLattice_Iic (fun i hi ↦ ?_) hp'
274288
simpa only [← (p i).mapIic.complementedLattice_iff] using hp i hi
275289

290+
open Submodule in
276291
lemma isSemisimpleModule_biSup_of_isSemisimpleModule_submodule {s : Set ι} {p : ι → Submodule R M}
277292
(hp : ∀ i ∈ s, IsSemisimpleModule R (p i)) :
278293
IsSemisimpleModule R ↥(⨆ i ∈ s, p i) := by
279-
let q := ⨆ i ∈ s, p i
280-
let p' : ι → Submodule R q := fun i ↦ (p i).comap q.subtype
281-
have hp₀ : ∀ i ∈ s, p i ≤ LinearMap.range q.subtype := fun i hi ↦ by
282-
simpa only [Submodule.range_subtype] using le_biSup _ hi
283-
have hp₁ : ∀ i ∈ s, IsSemisimpleModule R (p' i) := fun i hi ↦ by
284-
let e : p' i ≃ₗ[R] p i := (p i).comap_equiv_self_of_inj_of_le q.injective_subtype (hp₀ i hi)
285-
exact (Submodule.orderIsoMapComap e).complementedLattice_iff.mpr <| hp i hi
286-
have hp₂ : ⨆ i ∈ s, p' i = ⊤ := by
287-
apply Submodule.map_injective_of_injective q.injective_subtype
288-
simp_rw [Submodule.map_top, Submodule.range_subtype, Submodule.map_iSup]
289-
exact biSup_congr fun i hi ↦ Submodule.map_comap_eq_of_le (hp₀ i hi)
290-
exact isSemisimpleModule_of_isSemisimpleModule_submodule hp₁ hp₂
294+
refine isSemisimpleModule_of_isSemisimpleModule_submodule
295+
((comap_equiv_self_of_inj_of_le (injective_subtype _) ?_).isSemisimpleModule_iff.mpr <| hp · ·)
296+
(biSup_comap_subtype_eq_top ..)
297+
simp_rw [range_subtype, le_biSup p ‹_›]
291298

292299
lemma isSemisimpleModule_of_isSemisimpleModule_submodule' {p : ι → Submodule R M}
293300
(hp : ∀ i, IsSemisimpleModule R (p i)) (hp' : ⨆ i, p i = ⊤) :
@@ -300,16 +307,32 @@ instance {ι} (M : ι → Type*) [∀ i, AddCommGroup (M i)] [∀ i, Module R (M
300307
exact isSemisimpleModule_of_isSemisimpleModule_submodule'
301308
(fun _ ↦ .range _) DFinsupp.iSup_range_lsingle
302309

303-
theorem isSemisimpleModule_iff_exists_linearEquiv_dfinsupp : IsSemisimpleModule R M ↔
304-
∃ (s : Set (Submodule R M)) (_ : M ≃ₗ[R] Π₀ m : s, m.1), ∀ m : s, IsSimpleModule R m.1 := by
305-
refine ⟨fun _ ↦ ?_, fun ⟨s, e, h⟩ ↦ .congr e⟩
310+
variable (R M) in
311+
theorem IsSemisimpleModule.exists_linearEquiv_dfinsupp [IsSemisimpleModule R M] :
312+
∃ (s : Set (Submodule R M)) (_ : M ≃ₗ[R] Π₀ m : s, m.1),
313+
sSupIndep s ∧ ∀ m : s, IsSimpleModule R m.1 := by
306314
have ⟨s, ind, sSup, simple⟩ := IsSemisimpleModule.exists_sSupIndep_sSup_simples_eq_top R M
315+
refine ⟨s, ?_, ind, SetCoe.forall.mpr simple⟩
307316
rw [sSupIndep_iff] at ind
308-
refine ⟨s, ?_, SetCoe.forall.mpr simple⟩
309317
classical
310318
exact .symm <| .trans (.ofInjective _ ind.dfinsupp_lsum_injective) <| .trans (.ofEq _ ⊤ <|
311319
by rw [← Submodule.iSup_eq_range_dfinsupp_lsum, ← sSup, sSup_eq_iSup']) Submodule.topEquiv
312320

321+
theorem isSemisimpleModule_iff_exists_linearEquiv_dfinsupp : IsSemisimpleModule R M ↔
322+
∃ (s : Set (Submodule R M)) (_ : M ≃ₗ[R] Π₀ m : s, m.1), ∀ m : s, IsSimpleModule R m.1 := by
323+
refine ⟨fun _ ↦ ?_, fun ⟨s, e, h⟩ ↦ .congr e⟩
324+
have ⟨s, e, h⟩ := IsSemisimpleModule.exists_linearEquiv_dfinsupp R M
325+
exact ⟨s, e, h.2
326+
327+
variable (R M) in
328+
theorem IsSemisimpleModule.exists_linearEquiv_fin_dfinsupp [IsSemisimpleModule R M]
329+
[Module.Finite R M] : ∃ (n : ℕ) (S : Fin n → Submodule R M)
330+
(_ : M ≃ₗ[R] Π₀ i : Fin n, S i), ∀ i, IsSimpleModule R (S i) :=
331+
have ⟨s, e, h, simple⟩ := IsSemisimpleModule.exists_linearEquiv_dfinsupp R M
332+
have := WellFoundedGT.finite_of_iSupIndep ((sSupIndep_iff _).mp h)
333+
fun S ↦ (S.1.nontrivial_iff_ne_bot).mp <| IsSimpleModule.nontrivial R S
334+
⟨_, _, e.trans <| DirectSum.lequivCongrLeft R (Finite.equivFin s), fun _ ↦ simple _⟩
335+
313336
open LinearMap in
314337
instance {ι} [Finite ι] (M : ι → Type*) [∀ i, AddCommGroup (M i)] [∀ i, Module R (M i)]
315338
[∀ i, IsSemisimpleModule R (M i)] : IsSemisimpleModule R (Π i, M i) := by
@@ -429,6 +452,12 @@ theorem isCoatom_ker_of_surjective [IsSimpleModule R N] {f : M →ₗ[R] N}
429452
rw [← isSimpleModule_iff_isCoatom]
430453
exact IsSimpleModule.congr (f.quotKerEquivOfSurjective hf)
431454

455+
theorem linearEquiv_of_ne_zero [IsSemisimpleModule R M] [IsSimpleModule R N]
456+
{f : M →ₗ[R] N} (h : f ≠ 0) : ∃ S : Submodule R M, Nonempty (N ≃ₗ[R] S) :=
457+
have ⟨m, (_ : IsSimpleModule R m), ne⟩ :=
458+
exists_ne_zero_of_sSup_eq_top h _ (IsSemisimpleModule.sSup_simples_eq_top ..)
459+
⟨m, ⟨.symm <| .ofBijective _ ((bijective_or_eq_zero _).resolve_right ne)⟩⟩
460+
432461
/-- Schur's Lemma makes the endomorphism ring of a simple module a division ring. -/
433462
noncomputable instance _root_.Module.End.instDivisionRing
434463
[DecidableEq (Module.End R M)] [IsSimpleModule R M] : DivisionRing (Module.End R M) where
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/-
2+
Copyright (c) 2025 Junyan Xu. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Junyan Xu
5+
-/
6+
import Mathlib.FieldTheory.IsAlgClosed.Basic
7+
import Mathlib.RingTheory.SimpleModule.WedderburnArtin
8+
9+
/-!
10+
# Wedderburn-Artin Theorem over an algebraically closed field
11+
-/
12+
13+
theorem IsSimpleRing.exists_algEquiv_matrix_of_isAlgClosed (F R) [Field F] [IsAlgClosed F]
14+
[Ring R] [IsSimpleRing R] [Algebra F R] [FiniteDimensional F R] :
15+
∃ (n : ℕ) (_ : NeZero n), Nonempty (R ≃ₐ[F] Matrix (Fin n) (Fin n) F) :=
16+
have := IsArtinianRing.of_finite F R
17+
have ⟨n, hn, D, _, _, _, ⟨e⟩⟩ := exists_algEquiv_matrix_divisionRing_finite F R
18+
⟨n, hn, ⟨e.trans <| .mapMatrix <| .symm <| .ofBijective (Algebra.ofId F D)
19+
IsAlgClosed.algebraMap_bijective_of_isIntegral⟩⟩

0 commit comments

Comments
 (0)