Skip to content

Commit 2e5fa83

Browse files
committed
feat: a supremum of semisimple modules is semisimple (#10086)
Another small step toward Jordan-Chevalley-Dunford.
1 parent feec58a commit 2e5fa83

File tree

5 files changed

+155
-5
lines changed

5 files changed

+155
-5
lines changed

Mathlib/LinearAlgebra/Basic.lean

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,10 @@ theorem _root_.AddMonoidHom.coe_toIntLinearMap_range {M M₂ : Type*} [AddCommGr
212212
[AddCommGroup M₂] (f : M →+ M₂) :
213213
LinearMap.range f.toIntLinearMap = AddSubgroup.toIntSubmodule f.range := rfl
214214

215+
lemma _root_.Submodule.map_comap_eq_of_le [RingHomSurjective τ₁₂] {f : F} {p : Submodule R₂ M₂}
216+
(h : p ≤ LinearMap.range f) : (p.comap f).map f = p :=
217+
SetLike.coe_injective <| Set.image_preimage_eq_of_subset h
218+
215219
/-- A linear map version of `AddMonoidHom.eqLocusM` -/
216220
def eqLocus (f g : F) : Submodule R M :=
217221
{ (f : M →+ M₂).eqLocusM g with
@@ -1384,7 +1388,7 @@ namespace Submodule
13841388

13851389
section Module
13861390

1387-
variable [Semiring R] [AddCommMonoid M] [Module R M]
1391+
variable [Semiring R] [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N]
13881392

13891393
/-- Given `p` a submodule of the module `M` and `q` a submodule of `p`, `p.equivSubtypeMap q`
13901394
is the natural `LinearEquiv` between `q` and `q.map p.subtype`. -/
@@ -1410,6 +1414,17 @@ theorem equivSubtypeMap_symm_apply {p : Submodule R M} {q : Submodule R p} (x :
14101414
rfl
14111415
#align submodule.equiv_subtype_map_symm_apply Submodule.equivSubtypeMap_symm_apply
14121416

1417+
/-- A linear injection `M ↪ N` restricts to an equivalence `f⁻¹ p ≃ p` for any submodule `p`
1418+
contained in its range. -/
1419+
@[simps! apply]
1420+
noncomputable def comap_equiv_self_of_inj_of_le {f : M →ₗ[R] N} {p : Submodule R N}
1421+
(hf : Injective f) (h : p ≤ LinearMap.range f) :
1422+
p.comap f ≃ₗ[R] p :=
1423+
LinearEquiv.ofBijective
1424+
((f ∘ₗ (p.comap f).subtype).codRestrict p <| fun ⟨x, hx⟩ ↦ mem_comap.mp hx)
1425+
(⟨fun x y hxy ↦ by simpa using hf (Subtype.ext_iff.mp hxy),
1426+
fun ⟨x, hx⟩ ↦ by obtain ⟨y, rfl⟩ := h hx; exact ⟨⟨y, hx⟩, by simp [Subtype.ext_iff]⟩⟩)
1427+
14131428
end Module
14141429

14151430
end Submodule

Mathlib/Order/CompleteLattice.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,11 @@ theorem biSup_congr {p : ι → Prop} (h : ∀ i, p i → f i = g i) :
697697
⨆ (i) (_ : p i), f i = ⨆ (i) (_ : p i), g i :=
698698
iSup_congr fun i ↦ iSup_congr (h i)
699699

700+
theorem biSup_congr' {p : ι → Prop} {f g : (i : ι) → p i → α}
701+
(h : ∀ i (hi : p i), f i hi = g i hi) :
702+
⨆ i, ⨆ (hi : p i), f i hi = ⨆ i, ⨆ (hi : p i), g i hi := by
703+
congr; ext i; congr; ext hi; exact h i hi
704+
700705
theorem Function.Surjective.iSup_comp {f : ι → ι'} (hf : Surjective f) (g : ι' → α) :
701706
⨆ x, g (f x) = ⨆ y, g y := by
702707
simp only [iSup._eq_1]
@@ -766,6 +771,11 @@ theorem biInf_congr {p : ι → Prop} (h : ∀ i, p i → f i = g i) :
766771
⨅ (i) (_ : p i), f i = ⨅ (i) (_ : p i), g i :=
767772
biSup_congr (α := αᵒᵈ) h
768773

774+
theorem biInf_congr' {p : ι → Prop} {f g : (i : ι) → p i → α}
775+
(h : ∀ i (hi : p i), f i hi = g i hi) :
776+
⨅ i, ⨅ (hi : p i), f i hi = ⨅ i, ⨅ (hi : p i), g i hi := by
777+
congr; ext i; congr; ext hi; exact h i hi
778+
769779
theorem Function.Surjective.iInf_comp {f : ι → ι'} (hf : Surjective f) (g : ι' → α) :
770780
⨅ x, g (f x) = ⨅ y, g y :=
771781
@Function.Surjective.iSup_comp αᵒᵈ _ _ _ f hf g
@@ -1307,6 +1317,14 @@ theorem iInf_inf_eq : ⨅ x, f x ⊓ g x = (⨅ x, f x) ⊓ ⨅ x, g x :=
13071317
@iSup_sup_eq αᵒᵈ _ _ _ _
13081318
#align infi_inf_eq iInf_inf_eq
13091319

1320+
lemma biInf_le {ι : Type*} {s : Set ι} (f : ι → α) {i : ι} (hi : i ∈ s) :
1321+
⨅ i ∈ s, f i ≤ f i := by
1322+
simpa only [iInf_subtype'] using iInf_le (ι := s) (f := f ∘ (↑)) ⟨i, hi⟩
1323+
1324+
lemma le_biSup {ι : Type*} {s : Set ι} (f : ι → α) {i : ι} (hi : i ∈ s) :
1325+
f i ≤ ⨆ i ∈ s, f i :=
1326+
biInf_le (α := αᵒᵈ) f hi
1327+
13101328
/- TODO: here is another example where more flexible pattern matching
13111329
might help.
13121330

Mathlib/Order/CompleteLatticeIntervals.lean

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Copyright (c) 2022 Heather Macbeth. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Heather Macbeth
55
-/
6+
import Mathlib.Order.CompactlyGenerated
67
import Mathlib.Order.ConditionallyCompleteLattice.Basic
78
import Mathlib.Order.LatticeIntervals
89
import Mathlib.Data.Set.Intervals.OrdConnected
@@ -27,7 +28,7 @@ open Classical
2728

2829
open Set
2930

30-
variable {α : Type*} (s : Set α)
31+
variable {ι : Sort*} {α : Type*} (s : Set α)
3132

3233
section SupSet
3334

@@ -231,13 +232,94 @@ lemma Set.Icc.coe_sInf [ConditionallyCompleteLattice α] {a b : α} (h : a ≤ b
231232
congrArg Subtype.val (dif_neg hS.ne_empty)
232233

233234
lemma Set.Icc.coe_iSup [ConditionallyCompleteLattice α] {a b : α} (h : a ≤ b)
234-
{ι : Sort*} [Nonempty ι] {S : ι → Set.Icc a b} : letI := Set.Icc.completeLattice h
235+
[Nonempty ι] {S : ι → Set.Icc a b} : letI := Set.Icc.completeLattice h
235236
↑(iSup S) = (⨆ i, S i : α) :=
236237
(Set.Icc.coe_sSup h (range_nonempty S)).trans (congrArg sSup (range_comp Subtype.val S).symm)
237238

238239
lemma Set.Icc.coe_iInf [ConditionallyCompleteLattice α] {a b : α} (h : a ≤ b)
239-
{ι : Sort*} [Nonempty ι] {S : ι → Set.Icc a b} : letI := Set.Icc.completeLattice h
240+
[Nonempty ι] {S : ι → Set.Icc a b} : letI := Set.Icc.completeLattice h
240241
↑(iInf S) = (⨅ i, S i : α) :=
241242
(Set.Icc.coe_sInf h (range_nonempty S)).trans (congrArg sInf (range_comp Subtype.val S).symm)
242243

243244
end Icc
245+
246+
namespace Set.Iic
247+
248+
variable [CompleteLattice α] {a : α}
249+
250+
instance instCompleteLattice : CompleteLattice (Iic a) where
251+
sSup S := ⟨sSup ((↑) '' S), by simpa using fun b hb _ ↦ hb⟩
252+
sInf S := ⟨a ⊓ sInf ((↑) '' S), by simp⟩
253+
le_sSup S b hb := le_sSup <| mem_image_of_mem Subtype.val hb
254+
sSup_le S b hb := sSup_le <| fun c' ⟨c, hc, hc'⟩ ↦ hc' ▸ hb c hc
255+
sInf_le S b hb := inf_le_of_right_le <| sInf_le <| mem_image_of_mem Subtype.val hb
256+
le_sInf S b hb := le_inf_iff.mpr ⟨b.property, le_sInf fun d' ⟨d, hd, hd'⟩ ↦ hd' ▸ hb d hd⟩
257+
le_top := by simp
258+
bot_le := by simp
259+
260+
variable (S : Set <| Iic a) (f : ι → Iic a) (p : ι → Prop)
261+
262+
@[simp] theorem coe_sSup : (↑(sSup S) : α) = sSup ((↑) '' S) := rfl
263+
264+
@[simp] theorem coe_iSup : (↑(⨆ i, f i) : α) = ⨆ i, (f i : α) := by
265+
rw [iSup, coe_sSup]; congr; ext; simp
266+
267+
theorem coe_biSup : (↑(⨆ i, ⨆ (_ : p i), f i) : α) = ⨆ i, ⨆ (_ : p i), (f i : α) := by simp
268+
269+
@[simp] theorem coe_sInf : (↑(sInf S) : α) = a ⊓ sInf ((↑) '' S) := rfl
270+
271+
@[simp] theorem coe_iInf : (↑(⨅ i, f i) : α) = a ⊓ ⨅ i, (f i : α) := by
272+
rw [iInf, coe_sInf]; congr; ext; simp
273+
274+
theorem coe_biInf : (↑(⨅ i, ⨅ (_ : p i), f i) : α) = a ⊓ ⨅ i, ⨅ (_ : p i), (f i : α) := by
275+
cases isEmpty_or_nonempty ι
276+
· simp
277+
· simp_rw [coe_iInf, ← inf_iInf, ← inf_assoc, inf_idem]
278+
279+
theorem isCompactElement {b : Iic a} (h : CompleteLattice.IsCompactElement (b : α)) :
280+
CompleteLattice.IsCompactElement b := by
281+
simp only [CompleteLattice.isCompactElement_iff, Finset.sup_eq_iSup] at h ⊢
282+
intro ι s hb
283+
replace hb : (b : α) ≤ iSup ((↑) ∘ s) := le_trans hb <| (coe_iSup s) ▸ le_refl _
284+
obtain ⟨t, ht⟩ := h ι ((↑) ∘ s) hb
285+
exact ⟨t, (by simpa using ht : (b : α) ≤ _)⟩
286+
287+
instance instIsCompactlyGenerated [IsCompactlyGenerated α] : IsCompactlyGenerated (Iic a) := by
288+
refine ⟨fun ⟨x, (hx : x ≤ a)⟩ ↦ ?_⟩
289+
obtain ⟨s, hs, rfl⟩ := IsCompactlyGenerated.exists_sSup_eq x
290+
rw [sSup_le_iff] at hx
291+
let f : s → Iic a := fun y ↦ ⟨y, hx _ y.property⟩
292+
refine ⟨range f, ?_, ?_⟩
293+
· rintro - ⟨⟨y, hy⟩, hy', rfl⟩
294+
exact isCompactElement (hs _ hy)
295+
· rw [Subtype.ext_iff]
296+
change sSup (((↑) : Iic a → α) '' (range f)) = sSup s
297+
congr
298+
ext b
299+
simpa using hx b
300+
301+
end Set.Iic
302+
303+
theorem complementedLattice_of_complementedLattice_Iic
304+
[CompleteLattice α] [IsModularLattice α] [IsCompactlyGenerated α]
305+
{ι : Type*} {s : Set ι} {f : ι → α}
306+
(h : ∀ i ∈ s, ComplementedLattice <| Iic (f i))
307+
(h' : ⨆ i ∈ s, f i = ⊤) :
308+
ComplementedLattice α := by
309+
apply complementedLattice_of_sSup_atoms_eq_top
310+
have : ∀ i ∈ s, ∃ t : Set α, f i = sSup t ∧ ∀ a ∈ t, IsAtom a := fun i hi ↦ by
311+
replace h := complementedLattice_iff_isAtomistic.mp (h i hi)
312+
obtain ⟨u, hu, hu'⟩ := eq_sSup_atoms (⊤ : Iic (f i))
313+
refine ⟨(↑) '' u, ?_, ?_⟩
314+
· replace hu : f i = ↑(sSup u) := Subtype.ext_iff.mp hu
315+
simp_rw [hu, Iic.coe_sSup]
316+
· rintro b ⟨⟨a, ha'⟩, ha, rfl⟩
317+
exact IsAtom.of_isAtom_coe_Iic (hu' _ ha)
318+
choose t ht ht' using this
319+
let u : Set α := ⋃ i, ⋃ hi : i ∈ s, t i hi
320+
have hu₁ : u ⊆ {a | IsAtom a} := by
321+
rintro a ⟨-, ⟨i, rfl⟩, ⟨-, ⟨hi, rfl⟩, ha : a ∈ t i hi⟩⟩
322+
exact ht' i hi a ha
323+
have hu₂ : sSup u = ⨆ i ∈ s, f i := by simp_rw [sSup_iUnion, biSup_congr' ht]
324+
rw [eq_top_iff, ← h', ← hu₂]
325+
exact sSup_le_sSup hu₁

Mathlib/Order/Disjoint.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,12 @@ class ComplementedLattice (α) [Lattice α] [BoundedOrder α] : Prop where
705705

706706
export ComplementedLattice (exists_isCompl)
707707

708+
instance Subsingleton.instComplementedLattice
709+
[Lattice α] [BoundedOrder α] [Subsingleton α] : ComplementedLattice α := by
710+
refine ⟨fun a ↦ ⟨⊥, disjoint_bot_right, ?_⟩⟩
711+
rw [Subsingleton.elim ⊥ ⊤]
712+
exact codisjoint_top_right
713+
708714
namespace ComplementedLattice
709715

710716
variable [Lattice α] [BoundedOrder α] [ComplementedLattice α]

Mathlib/RingTheory/SimpleModule.lean

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Aaron Anderson
55
-/
66
import Mathlib.LinearAlgebra.Isomorphisms
77
import Mathlib.Order.JordanHolder
8+
import Mathlib.Order.CompleteLatticeIntervals
89

910
#align_import ring_theory.simple_module from "leanprover-community/mathlib"@"cce7f68a7eaadadf74c82bbac20721cdc03a1cc1"
1011

@@ -29,7 +30,7 @@ import Mathlib.Order.JordanHolder
2930
-/
3031

3132

32-
variable (R : Type*) [Ring R] (M : Type*) [AddCommGroup M] [Module R M]
33+
variable {ι : Type*} (R : Type*) [Ring R] (M : Type*) [AddCommGroup M] [Module R M]
3334

3435
/-- A module is simple when it has only two submodules, `⊥` and `⊤`. -/
3536
abbrev IsSimpleModule :=
@@ -119,6 +120,34 @@ theorem is_semisimple_iff_top_eq_sSup_simples :
119120
exact IsSemisimpleModule.sSup_simples_eq_top⟩
120121
#align is_semisimple_iff_top_eq_Sup_simples is_semisimple_iff_top_eq_sSup_simples
121122

123+
lemma isSemisimpleModule_of_IsSemisimpleModule_submodule {s : Set ι} {p : ι → Submodule R M}
124+
(hp : ∀ i ∈ s, IsSemisimpleModule R (p i)) (hp' : ⨆ i ∈ s, p i = ⊤) :
125+
IsSemisimpleModule R M := by
126+
refine complementedLattice_of_complementedLattice_Iic (fun i hi ↦ ?_) hp'
127+
let e : Submodule R (p i) ≃o Set.Iic (p i) := Submodule.MapSubtype.relIso (p i)
128+
simpa only [← e.complementedLattice_iff] using hp i hi
129+
130+
lemma isSemisimpleModule_biSup_of_IsSemisimpleModule_submodule {s : Set ι} {p : ι → Submodule R M}
131+
(hp : ∀ i ∈ s, IsSemisimpleModule R (p i)) :
132+
IsSemisimpleModule R ↥(⨆ i ∈ s, p i) := by
133+
let q := ⨆ i ∈ s, p i
134+
let p' : ι → Submodule R q := fun i ↦ (p i).comap q.subtype
135+
have hp₀ : ∀ i ∈ s, p i ≤ LinearMap.range q.subtype := fun i hi ↦ by
136+
simpa only [Submodule.range_subtype] using le_biSup _ hi
137+
have hp₁ : ∀ i ∈ s, IsSemisimpleModule R (p' i) := fun i hi ↦ by
138+
let e : p' i ≃ₗ[R] p i := (p i).comap_equiv_self_of_inj_of_le q.injective_subtype (hp₀ i hi)
139+
exact (Submodule.orderIsoMapComap e).complementedLattice_iff.mpr <| hp i hi
140+
have hp₂ : ⨆ i ∈ s, p' i = ⊤ := by
141+
apply Submodule.map_injective_of_injective q.injective_subtype
142+
simp_rw [Submodule.map_top, Submodule.range_subtype, Submodule.map_iSup]
143+
exact biSup_congr fun i hi ↦ Submodule.map_comap_eq_of_le (hp₀ i hi)
144+
exact isSemisimpleModule_of_IsSemisimpleModule_submodule hp₁ hp₂
145+
146+
lemma isSemisimpleModule_of_IsSemisimpleModule_submodule' {p : ι → Submodule R M}
147+
(hp : ∀ i, IsSemisimpleModule R (p i)) (hp' : ⨆ i, p i = ⊤) :
148+
IsSemisimpleModule R M :=
149+
isSemisimpleModule_of_IsSemisimpleModule_submodule (s := Set.univ) (fun i _ ↦ hp i) (by simpa)
150+
122151
namespace LinearMap
123152

124153
theorem injective_or_eq_zero [IsSimpleModule R M] (f : M →ₗ[R] N) :

0 commit comments

Comments
 (0)