Skip to content

Commit 45368db

Browse files
committed
feat(RingTheory/SimpleModule): kill 4 proof_wanted on semisimple rings (#31672)
Prove that + the opposite of a semisimple ring is semisimple, + the endomorphism ring of a finite semisimple module is semisimple, + matrix rings over a semisimple ring are semisimple (these are opposites of endomorphism rings of finite free modules); + finite products of matrix rings over division rings are semisimple (the easy direction of Wedderburn–Artin; the hard direction was already in mathlib).
1 parent 6238886 commit 45368db

File tree

6 files changed

+194
-34
lines changed

6 files changed

+194
-34
lines changed

Mathlib/Data/Matrix/Basic.lean

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,42 @@ open Matrix
790790

791791
namespace Matrix
792792

793+
section Pi
794+
795+
variable {ι : Type*} {β : ι → Type*}
796+
797+
/-- Matrices over a Pi type are in canonical bijection with tuples of matrices. -/
798+
@[simps] def piEquiv : Matrix m n (Π i, β i) ≃ Π i, Matrix m n (β i) where
799+
toFun f i := f.map (· i)
800+
invFun f := .of fun j k i ↦ f i j k
801+
left_inv _ := rfl
802+
right_inv _ := rfl
803+
804+
/-- `piEquiv` as an `AddEquiv`. -/
805+
@[simps!] def piAddEquiv [∀ i, Add (β i)] : Matrix m n (Π i, β i) ≃+ Π i, Matrix m n (β i) where
806+
__ := piEquiv
807+
map_add' _ _ := rfl
808+
809+
/-- `piEquiv` as a `LinearEquiv`. -/
810+
@[simps] def piLinearEquiv (R) [Semiring R] [∀ i, AddCommMonoid (β i)] [∀ i, Module R (β i)] :
811+
Matrix m n (Π i, β i) ≃ₗ[R] Π i, Matrix m n (β i) where
812+
__ := piAddEquiv
813+
map_smul' _ _ := rfl
814+
815+
/-- `piEquiv` as a `RingEquiv`. -/
816+
@[simps!] def piRingEquiv [∀ i, AddCommMonoid (β i)] [∀ i, Mul (β i)] [Fintype n] :
817+
Matrix n n (Π i, β i) ≃+* Π i, Matrix n n (β i) where
818+
__ := piAddEquiv
819+
map_mul' _ _ := by ext; simp [Matrix.mul_apply]
820+
821+
/-- `piEquiv` as an `AlgEquiv`. -/
822+
@[simps!] def piAlgEquiv (R) [CommSemiring R] [∀ i, Semiring (β i)] [∀ i, Algebra R (β i)]
823+
[Fintype n] [DecidableEq n] : Matrix n n (Π i, β i) ≃ₐ[R] Π i, Matrix n n (β i) where
824+
__ := piRingEquiv
825+
commutes' := (AlgHom.mk' (piRingEquiv (β := β) (n := n)).toRingHom fun _ _ ↦ rfl).commutes
826+
827+
end Pi
828+
793829
section Transpose
794830

795831
open Matrix

Mathlib/LinearAlgebra/Finsupp/Defs.lean

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Johannes Hölzl
55
-/
66
import Mathlib.Algebra.Module.Equiv.Defs
7+
import Mathlib.Algebra.Module.LinearMap.End
78
import Mathlib.Algebra.Module.Pi
89
import Mathlib.Data.Finsupp.SMul
910

@@ -309,3 +310,49 @@ def Module.subsingletonEquiv (R M ι : Type*) [Semiring R] [Subsingleton R] [Add
309310
map_smul' r _ := (smul_zero r).symm
310311

311312
end
313+
314+
namespace Module.End
315+
316+
variable (ι : Type*) {R M : Type*} [Semiring R] [AddCommMonoid M] [Module R M]
317+
318+
/-- If `M` is an `R`-module and `ι` is a type, then an additive endomorphism of `M` that
319+
commutes with all `R`-endomorphisms of `M` gives rise to an additive endomorphism of `ι →₀ M`
320+
that commutes with all `R`-endomorphisms of `ι →₀ M`. -/
321+
@[simps] noncomputable def ringHomEndFinsupp :
322+
End (End R M) M →+* End (End R (ι →₀ M)) (ι →₀ M) where
323+
toFun f :=
324+
{ toFun := Finsupp.mapRange.addMonoidHom f
325+
map_add' := map_add _
326+
map_smul' g x := x.induction_linear (by simp)
327+
(fun _ _ h h' ↦ by rw [smul_add, map_add, h, h', map_add, smul_add]) fun i m ↦ by
328+
ext j
329+
change f (Finsupp.lapply j ∘ₗ g ∘ₗ Finsupp.lsingle i • m) = _
330+
rw [map_smul]
331+
simp }
332+
map_one' := by ext; simp
333+
map_mul' _ _ := by ext; simp
334+
map_zero' := by ext; simp
335+
map_add' _ _ := by ext; simp
336+
337+
variable {ι}
338+
339+
/-- If `M` is an `R`-module and `ι` is an nonempty type, then every additive endomorphism
340+
of `ι →₀ M` that commutes with all `R`-endomorphisms of `ι →₀ M` comes from an additive
341+
endomorphism of `M` that commutes with all `R`-endomorphisms of `M`.
342+
See (15) in F4 of §28 on p.131 of [Lorenz2008]. -/
343+
@[simps!] noncomputable def ringEquivEndFinsupp (i : ι) :
344+
End (End R M) M ≃+* End (End R (ι →₀ M)) (ι →₀ M) where
345+
__ := ringHomEndFinsupp ι
346+
invFun f :=
347+
{ toFun m := f (Finsupp.single i m) i
348+
map_add' _ _ := by simp
349+
map_smul' g m := let g := Finsupp.mapRange.linearMap g
350+
show _ = g _ i by rw [← End.smul_def g, ← map_smul]; simp [g] }
351+
left_inv _ := by ext; simp
352+
right_inv f := by
353+
ext x j
354+
change f (Finsupp.lsingle (R := R) (M := M) i ∘ₗ Finsupp.lapply j • x) i = _
355+
rw [map_smul]
356+
simp
357+
358+
end Module.End

Mathlib/RingTheory/Artinian/Module.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Authors: Chris Hughes
66
import Mathlib.Algebra.Group.Units.Opposite
77
import Mathlib.Algebra.Regular.Opposite
88
import Mathlib.Data.SetLike.Fintype
9+
import Mathlib.LinearAlgebra.FreeModule.Finite.Basic
910
import Mathlib.Order.Filter.EventuallyConst
1011
import Mathlib.RingTheory.Ideal.Prod
1112
import Mathlib.RingTheory.Ideal.Quotient.Operations
@@ -440,6 +441,12 @@ theorem IsArtinianRing.of_finite (R S) [Ring R] [Ring S] [Module R S] [IsScalarT
440441
[IsArtinianRing R] [Module.Finite R S] : IsArtinianRing S :=
441442
isArtinian_of_tower R isArtinian_of_fg_of_artinian'
442443

444+
instance (n R) [Fintype n] [DecidableEq n] [Ring R] [IsNoetherianRing R] :
445+
IsNoetherianRing (Matrix n n R) := .of_finite R _
446+
447+
instance (n R) [Fintype n] [DecidableEq n] [Ring R] [IsArtinianRing R] :
448+
IsArtinianRing (Matrix n n R) := .of_finite R _
449+
443450
/-- In a module over an Artinian ring, the submodule generated by finitely many vectors is
444451
Artinian. -/
445452
theorem isArtinian_span_of_finite (R) {M} [Ring R] [AddCommGroup M] [Module R M] [IsArtinianRing R]

Mathlib/RingTheory/SimpleModule/Basic.lean

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ instance (R) [DivisionRing R] : IsSimpleModule R R where
6868
/-- A ring is semisimple if it is semisimple as a module over itself. -/
6969
abbrev IsSemisimpleRing := IsSemisimpleModule R R
7070

71+
instance (priority := low) [Subsingleton R] : IsSemisimpleRing R :=
72+
(isSemisimpleModule_iff R R).mpr Subsingleton.instComplementedLattice
73+
7174
variable {R S} in
7275
theorem RingEquiv.isSemisimpleRing (e : R ≃+* S) [IsSemisimpleRing R] : IsSemisimpleRing S where
7376
__ := (Submodule.orderIsoMapComap e.toSemilinearEquiv).complementedLattice
@@ -229,6 +232,14 @@ theorem eq_bot_or_exists_simple_le (N : Submodule R M) [IsSemisimpleModule R N]
229232

230233
variable [IsSemisimpleModule R M]
231234

235+
theorem exists_submodule_linearEquiv_quotient (N : Submodule R M) :
236+
∃ (P : Submodule R M), Nonempty (P ≃ₗ[R] M ⧸ N) :=
237+
have ⟨P, compl⟩ := exists_isCompl N; ⟨P, ⟨(N.quotientEquivOfIsCompl P compl).symm⟩⟩
238+
239+
theorem exists_quotient_linearEquiv_submodule (N : Submodule R M) :
240+
∃ (P : Submodule R M), Nonempty (N ≃ₗ[R] M ⧸ P) :=
241+
have ⟨P, compl⟩ := exists_isCompl N; ⟨P, ⟨(P.quotientEquivOfIsCompl N compl.symm).symm⟩⟩
242+
232243
theorem extension_property {P} [AddCommGroup P] [Module R P] (f : N →ₗ[R] M)
233244
(hf : Function.Injective f) (g : N →ₗ[R] P) :
234245
∃ h : M →ₗ[R] P, h ∘ₗ f = g :=
@@ -282,12 +293,12 @@ theorem of_injective (f : N →ₗ[R] M) (hf : Function.Injective f) : IsSemisim
282293
congr (Submodule.topEquiv.symm.trans <| Submodule.equivMapOfInjective f hf _)
283294

284295
instance quotient : IsSemisimpleModule R (M ⧸ m) :=
285-
haveP, compl⟩ := exists_isCompl m
286-
.congr (m.quotientEquivOfIsCompl P compl)
296+
have_, ⟨e⟩⟩ := exists_submodule_linearEquiv_quotient m
297+
.congr e.symm
287298

288299
instance (priority := low) [Module.Finite R M] : IsNoetherian R M where
289-
noetherian m := haveP, compl⟩ := exists_isCompl m
290-
Module.Finite.iff_fg.mp (Module.Finite.equiv <| P.quotientEquivOfIsCompl m compl.symm)
300+
noetherian m := have_, ⟨e⟩⟩ := exists_quotient_linearEquiv_submodule m
301+
Module.Finite.iff_fg.mp (Module.Finite.equiv e.symm)
291302

292303
-- does not work as an instance, not sure why
293304
protected theorem range (f : M →ₗ[R] N) : IsSemisimpleModule R (range f) :=
@@ -397,6 +408,13 @@ theorem IsSemisimpleModule.sup {p q : Submodule R M}
397408
exact isSemisimpleModule_biSup_of_isSemisimpleModule_submodule
398409
(by rintro (_ | _) _ <;> assumption)
399410

411+
variable (R M) in
412+
theorem IsSemisimpleRing.exists_linearEquiv_ideal_of_isSimpleModule [IsSemisimpleRing R]
413+
[h : IsSimpleModule R M] : ∃ I : Ideal R, Nonempty (M ≃ₗ[R] I) :=
414+
have ⟨J, _, ⟨e⟩⟩ := isSimpleModule_iff_quot_maximal.mp h
415+
have ⟨I, ⟨e'⟩⟩ := IsSemisimpleModule.exists_submodule_linearEquiv_quotient J
416+
⟨I, ⟨e.trans e'.symm⟩⟩
417+
400418
instance IsSemisimpleRing.isSemisimpleModule [IsSemisimpleRing R] : IsSemisimpleModule R M :=
401419
have : IsSemisimpleModule R (M →₀ R) := isSemisimpleModule_of_isSemisimpleModule_submodule'
402420
(fun _ ↦ .congr (LinearMap.quotKerEquivRange _).symm) Finsupp.iSup_lsingle_range
@@ -449,25 +467,6 @@ theorem IsSemisimpleRing.ideal_eq_span_idempotent [IsSemisimpleRing R] (I : Idea
449467
instance [IsSemisimpleRing R] : IsPrincipalIdealRing R where
450468
principal I := have ⟨e, _, he⟩ := IsSemisimpleRing.ideal_eq_span_idempotent I; ⟨e, he⟩
451469

452-
variable (ι R)
453-
454-
proof_wanted IsSemisimpleRing.mulOpposite [IsSemisimpleRing R] : IsSemisimpleRing Rᵐᵒᵖ
455-
456-
proof_wanted IsSemisimpleRing.module_end [IsSemisimpleModule R M] [Module.Finite R M] :
457-
IsSemisimpleRing (Module.End R M)
458-
459-
proof_wanted IsSemisimpleRing.matrix [Fintype ι] [DecidableEq ι] [IsSemisimpleRing R] :
460-
IsSemisimpleRing (Matrix ι ι R)
461-
462-
universe u in
463-
/-- The existence part of the Artin–Wedderburn theorem. -/
464-
proof_wanted isSemisimpleRing_iff_pi_matrix_divisionRing {R : Type u} [Ring R] :
465-
IsSemisimpleRing R ↔
466-
∃ (n : ℕ) (S : Fin n → Type u) (d : Fin n → ℕ) (_ : Π i, DivisionRing (S i)),
467-
Nonempty (R ≃+* Π i, Matrix (Fin (d i)) (Fin (d i)) (S i))
468-
469-
variable {ι R}
470-
471470
namespace LinearMap
472471

473472
theorem injective_or_eq_zero [IsSimpleModule R M] (f : M →ₗ[R] N) :
@@ -522,6 +521,12 @@ noncomputable instance _root_.Module.End.instDivisionRing
522521
qsmul := _
523522
qsmul_def := fun _ _ => rfl
524523

524+
instance (R) [DivisionRing R] [Module R M] [Nontrivial M] : IsSimpleModule (Module.End R M) M :=
525+
isSimpleModule_iff_toSpanSingleton_surjective.mpr <| .intro ‹_› fun v hv w ↦
526+
have ⟨f, eq⟩ := IsSemisimpleModule.extension_property _
527+
(ker_eq_bot.mp (ker_toSpanSingleton R M hv)) (toSpanSingleton R M w)
528+
⟨f, by simpa using congr($eq 1)⟩
529+
525530
end LinearMap
526531

527532
namespace JordanHolderModule

Mathlib/RingTheory/SimpleModule/Isotypic.lean

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,17 @@ theorem IsIsotypicOfType.of_isSimpleModule [IsSimpleModule R M] : IsIsotypicOfTy
7171
rw [isSimpleModule_iff_isAtom, isAtom_iff_eq_top] at hS
7272
exact ⟨.trans (.ofEq _ _ hS) Submodule.topEquiv⟩
7373

74-
variable {R M N S}
74+
variable {R}
75+
76+
theorem IsIsotypic.of_self [IsSemisimpleRing R] (h : IsIsotypic R R) : IsIsotypic R M :=
77+
fun m _ m' _ ↦
78+
have ⟨_, ⟨e⟩⟩ := IsSemisimpleRing.exists_linearEquiv_ideal_of_isSimpleModule R m
79+
have ⟨_, ⟨e'⟩⟩ := IsSemisimpleRing.exists_linearEquiv_ideal_of_isSimpleModule R m'
80+
have := IsSimpleModule.congr e.symm
81+
have := IsSimpleModule.congr e'.symm
82+
⟨e'.trans <| (h _ _).some.trans e.symm⟩
83+
84+
variable {M N S}
7585

7686
theorem IsIsotypicOfType.of_linearEquiv_type (h : IsIsotypicOfType R M S) (e : S ≃ₗ[R] N) :
7787
IsIsotypicOfType R M N := fun m _ ↦ ⟨(h m).some.trans e⟩

Mathlib/RingTheory/SimpleModule/WedderburnArtin.lean

Lines changed: 65 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ Copyright (c) 2025 Junyan Xu. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Junyan Xu
55
-/
6+
import Mathlib.LinearAlgebra.FreeModule.Finite.Basic
67
import Mathlib.RingTheory.FiniteLength
78
import Mathlib.RingTheory.SimpleModule.Isotypic
89
import Mathlib.RingTheory.SimpleRing.Congr
10+
import Mathlib.RingTheory.SimpleRing.Matrix
911

1012
/-!
1113
# Wedderburn–Artin Theorem
@@ -70,18 +72,18 @@ namespace IsSimpleRing
7072

7173
variable (R) [IsSimpleRing R] [IsArtinianRing R]
7274

73-
theorem isIsotypic : IsIsotypic R R :=
74-
(isSimpleRing_isArtinianRing_iff.mp ⟨‹_›, ‹_›⟩).2.1
75-
7675
instance (priority := low) : IsSemisimpleRing R :=
7776
(isSimpleRing_isArtinianRing_iff.mp ⟨‹_›, ‹_›⟩).1
7877

78+
theorem isIsotypic (M) [AddCommGroup M] [Module R M] : IsIsotypic R M :=
79+
(isSimpleRing_isArtinianRing_iff.mp ⟨‹_›, ‹_›⟩).2.1.of_self M
80+
7981
/-- The **Wedderburn–Artin Theorem**: an Artinian simple ring is isomorphic to a matrix
8082
ring over the opposite of the endomorphism ring of its simple module. -/
8183
theorem exists_ringEquiv_matrix_end_mulOpposite :
8284
∃ (n : ℕ) (_ : NeZero n) (I : Ideal R) (_ : IsSimpleModule R I),
8385
Nonempty (R ≃+* Matrix (Fin n) (Fin n) (Module.End R I)ᵐᵒᵖ) := by
84-
have ⟨n, hn, S, hS, ⟨e⟩⟩ := (isIsotypic R).linearEquiv_fun
86+
have ⟨n, hn, S, hS, ⟨e⟩⟩ := (isIsotypic R R).linearEquiv_fun
8587
refine ⟨n, hn, S, hS, ⟨.trans (.opOp R) <| .trans (.op ?_) (.symm .mopMatrix)⟩⟩
8688
exact .trans (.moduleEndSelf R) <| .trans e.conjRingEquiv (endVecRingEquivMatrixEnd ..)
8789

@@ -98,7 +100,7 @@ to a matrix algebra over the opposite of the endomorphism algebra of its simple
98100
theorem exists_algEquiv_matrix_end_mulOpposite :
99101
∃ (n : ℕ) (_ : NeZero n) (I : Ideal R) (_ : IsSimpleModule R I),
100102
Nonempty (R ≃ₐ[R₀] Matrix (Fin n) (Fin n) (Module.End R I)ᵐᵒᵖ) := by
101-
have ⟨n, hn, S, hS, ⟨e⟩⟩ := (isIsotypic R).linearEquiv_fun
103+
have ⟨n, hn, S, hS, ⟨e⟩⟩ := (isIsotypic R R).linearEquiv_fun
102104
refine ⟨n, hn, S, hS, ⟨.trans (.opOp R₀ R) <| .trans (.op ?_) (.symm .mopMatrix)⟩⟩
103105
exact .trans (.moduleEndSelf R₀) <| .trans (e.algConj R₀) (endVecAlgEquivMatrixEnd ..)
104106

@@ -126,10 +128,11 @@ namespace IsSemisimpleModule
126128

127129
open Module (End)
128130

129-
variable (R) (M : Type*) [AddCommGroup M] [Module R₀ M] [Module R M] [IsScalarTower R₀ R M]
131+
universe v
132+
variable (R) (M : Type v) [AddCommGroup M] [Module R₀ M] [Module R M] [IsScalarTower R₀ R M]
130133
[IsSemisimpleModule R M] [Module.Finite R M]
131134

132-
theorem exists_end_algEquiv :
135+
theorem exists_end_algEquiv_pi_matrix_end :
133136
∃ (n : ℕ) (S : Fin n → Submodule R M) (d : Fin n → ℕ),
134137
(∀ i, IsSimpleModule R (S i)) ∧ (∀ i, NeZero (d i)) ∧
135138
Nonempty (End R M ≃ₐ[R₀] Π i, Matrix (Fin (d i)) (Fin (d i)) (End R (S i))) := by
@@ -139,11 +142,33 @@ theorem exists_end_algEquiv :
139142
(.piCongrRight fun c ↦ ((e c).some.algConj R₀).trans (endVecAlgEquivMatrixEnd ..)) <|
140143
(.piCongrLeft' R₀ _ (Finite.equivFin _))⟩⟩
141144

142-
theorem exists_end_ringEquiv :
145+
theorem exists_end_ringEquiv_pi_matrix_end :
143146
∃ (n : ℕ) (S : Fin n → Submodule R M) (d : Fin n → ℕ),
144147
(∀ i, IsSimpleModule R (S i)) ∧ (∀ i, NeZero (d i)) ∧
145148
Nonempty (End R M ≃+* Π i, Matrix (Fin (d i)) (Fin (d i)) (End R (S i))) :=
146-
have ⟨n, S, d, hS, hd, ⟨e⟩⟩ := exists_end_algEquiv ℕ R M; ⟨n, S, d, hS, hd, ⟨e⟩⟩
149+
have ⟨n, S, d, hS, hd, ⟨e⟩⟩ := exists_end_algEquiv_pi_matrix_end ℕ R M; ⟨n, S, d, hS, hd, ⟨e⟩⟩
150+
151+
@[deprecated (since := "2025-11-16")] alias exists_end_algEquiv := exists_end_algEquiv_pi_matrix_end
152+
@[deprecated (since := "2025-11-16")]
153+
alias exists_end_ringEquiv := exists_end_ringEquiv_pi_matrix_end
154+
155+
-- TODO: can also require D be in `Type u`, since every simple module is the quotient by an ideal.
156+
theorem exists_end_algEquiv_pi_matrix_divisionRing :
157+
∃ (n : ℕ) (D : Fin n → Type v) (d : Fin n → ℕ) (_ : ∀ i, DivisionRing (D i))
158+
(_ : ∀ i, Algebra R₀ (D i)), (∀ i, NeZero (d i)) ∧
159+
Nonempty (End R M ≃ₐ[R₀] Π i, Matrix (Fin (d i)) (Fin (d i)) (D i)) := by
160+
have ⟨n, S, d, _, hd, ⟨e⟩⟩ := exists_end_algEquiv_pi_matrix_end R₀ R M
161+
classical exact ⟨n, _, d, inferInstance, inferInstance, hd, ⟨e⟩⟩
162+
163+
theorem exists_end_ringEquiv_pi_matrix_divisionRing :
164+
∃ (n : ℕ) (D : Fin n → Type v) (d : Fin n → ℕ) (_ : ∀ i, DivisionRing (D i)),
165+
(∀ i, NeZero (d i)) ∧ Nonempty (End R M ≃+* Π i, Matrix (Fin (d i)) (Fin (d i)) (D i)) :=
166+
have ⟨n, D, d, _, _, hd, ⟨e⟩⟩ := exists_end_algEquiv_pi_matrix_divisionRing ℕ R M
167+
⟨n, D, d, _, hd, ⟨e⟩⟩
168+
169+
theorem _root_.IsSemisimpleRing.moduleEnd : IsSemisimpleRing (Module.End R M) :=
170+
have ⟨_, _, _, _, _, ⟨e⟩⟩ := exists_end_ringEquiv_pi_matrix_divisionRing R M
171+
e.symm.isSemisimpleRing
147172

148173
end IsSemisimpleModule
149174

@@ -157,7 +182,7 @@ theorem exists_algEquiv_pi_matrix_end_mulOpposite :
157182
∃ (n : ℕ) (S : Fin n → Ideal R) (d : Fin n → ℕ),
158183
(∀ i, IsSimpleModule R (S i)) ∧ (∀ i, NeZero (d i)) ∧
159184
Nonempty (R ≃ₐ[R₀] Π i, Matrix (Fin (d i)) (Fin (d i)) (Module.End R (S i))ᵐᵒᵖ) :=
160-
have ⟨n, S, d, hS, hd, ⟨e⟩⟩ := IsSemisimpleModule.exists_end_algEquiv R₀ R R
185+
have ⟨n, S, d, hS, hd, ⟨e⟩⟩ := IsSemisimpleModule.exists_end_algEquiv_pi_matrix_end R₀ R R
161186
⟨n, S, d, hS, hd, ⟨.trans (.opOp R₀ R) <| .trans (.op <| .trans (.moduleEndSelf R₀) e) <|
162187
.trans (.piMulOpposite _ _) (.piCongrRight fun _ ↦ .symm .mopMatrix)⟩⟩
163188

@@ -200,4 +225,34 @@ theorem exists_ringEquiv_pi_matrix_divisionRing :
200225
have ⟨n, D, d, _, _, hd, ⟨e⟩⟩ := exists_algEquiv_pi_matrix_divisionRing ℕ R
201226
⟨n, D, d, _, hd, ⟨e⟩⟩
202227

228+
instance (n) [Fintype n] [DecidableEq n] : IsSemisimpleRing (Matrix n n R) :=
229+
(isEmpty_or_nonempty n).elim (fun _ ↦ inferInstance) fun _ ↦
230+
have ⟨_, _, _, _, _, ⟨e⟩⟩ := exists_ringEquiv_pi_matrix_divisionRing R
231+
(e.mapMatrix (m := n).trans Matrix.piRingEquiv).symm.isSemisimpleRing
232+
233+
instance [IsSemisimpleRing R] : IsSemisimpleRing Rᵐᵒᵖ :=
234+
have ⟨_, _, _, _, _, ⟨e⟩⟩ := exists_ringEquiv_pi_matrix_divisionRing R
235+
((e.op.trans (.piMulOpposite _)).trans (.piCongrRight fun _ ↦ .symm .mopMatrix)).symm
236+
|>.isSemisimpleRing
237+
203238
end IsSemisimpleRing
239+
240+
theorem isSemisimpleRing_mulOpposite_iff : IsSemisimpleRing Rᵐᵒᵖ ↔ IsSemisimpleRing R :=
241+
fun _ ↦ (RingEquiv.opOp R).symm.isSemisimpleRing, fun _ ↦ inferInstance⟩
242+
243+
/-- The existence part of the Artin–Wedderburn theorem. -/
244+
theorem isSemisimpleRing_iff_pi_matrix_divisionRing : IsSemisimpleRing R ↔
245+
∃ (n : ℕ) (D : Fin n → Type u) (d : Fin n → ℕ) (_ : Π i, DivisionRing (D i)),
246+
Nonempty (R ≃+* Π i, Matrix (Fin (d i)) (Fin (d i)) (D i)) where
247+
mp _ := have ⟨n, D, d, _, _, e⟩ := IsSemisimpleRing.exists_ringEquiv_pi_matrix_divisionRing R
248+
⟨n, D, d, _, e⟩
249+
mpr := fun ⟨_, _, _, _, ⟨e⟩⟩ ↦ e.symm.isSemisimpleRing
250+
251+
-- Need left-right symmetry of Jacobson radical
252+
proof_wanted IsSemiprimaryRing.mulOpposite [IsSemiprimaryRing R] : IsSemiprimaryRing Rᵐᵒᵖ
253+
254+
proof_wanted isSemiprimaryRing_mulOpposite_iff : IsSemiprimaryRing Rᵐᵒᵖ ↔ IsSemiprimaryRing R
255+
256+
-- A left Artinian ring is right Noetherian iff it is right Artinian. To be left as an `example`.
257+
proof_wanted IsArtinianRing.isNoetherianRing_iff_isArtinianRing_mulOpposite
258+
[IsArtinianRing R] : IsNoetherianRing Rᵐᵒᵖ ↔ IsArtinianRing Rᵐᵒᵖ

0 commit comments

Comments
 (0)