@@ -3,8 +3,10 @@ Copyright (c) 2020 Aaron Anderson. All rights reserved.
33Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Aaron Anderson
55-/
6- import Mathlib.LinearAlgebra.DFinsupp
6+ import Mathlib.Algebra.DirectSum.Module
7+ import Mathlib.Data.Finite.Card
78import Mathlib.Data.Matrix.Mul
9+ import Mathlib.LinearAlgebra.DFinsupp
810import Mathlib.LinearAlgebra.Finsupp.Span
911import Mathlib.LinearAlgebra.Isomorphisms
1012import Mathlib.LinearAlgebra.Projection
@@ -70,7 +72,6 @@ variable {R S} in
7072theorem 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"
7475theorem 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
8788variable [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
9296theorem isSimpleModule_iff_isAtom : IsSimpleModule R m ↔ IsAtom m := by
9397 rw [← Set.isSimpleOrder_Iic_iff_isAtom]
@@ -182,6 +186,12 @@ namespace IsSemisimpleModule
182186
183187variable [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+
185195theorem 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
261271
262272end 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. -/
265279theorem 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
276291lemma 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
292299lemma 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+
313336open LinearMap in
314337instance {ι} [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. -/
433462noncomputable instance _root_.Module.End.instDivisionRing
434463 [DecidableEq (Module.End R M)] [IsSimpleModule R M] : DivisionRing (Module.End R M) where
0 commit comments