Skip to content

Commit fa5d1a1

Browse files
committed
feat: port RepresentationTheory.Maschke (#2986)
1 parent a552c81 commit fa5d1a1

File tree

5 files changed

+189
-4
lines changed

5 files changed

+189
-4
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,6 +1325,7 @@ import Mathlib.Order.WellFoundedSet
13251325
import Mathlib.Order.WithBot
13261326
import Mathlib.Order.Zorn
13271327
import Mathlib.Order.ZornAtoms
1328+
import Mathlib.RepresentationTheory.Maschke
13281329
import Mathlib.RingTheory.Adjoin.Basic
13291330
import Mathlib.RingTheory.AlgebraTower
13301331
import Mathlib.RingTheory.Congruence

Mathlib/Algebra/Module/LinearMap.lean

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,7 @@ variable [Module R M] [Module R M₂] [Module S M₃]
206206

207207
variable {σ : R →+* S}
208208

209-
instance : SemilinearMapClass (M →ₛₗ[σ] M₃) σ M M₃
210-
where
209+
instance : SemilinearMapClass (M →ₛₗ[σ] M₃) σ M M₃ where
211210
coe f := f.toFun
212211
coe_injective' f g h := by
213212
cases f

Mathlib/Algebra/MonoidAlgebra/Basic.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ open Finset
5858

5959
open Finsupp hiding single mapDomain
6060

61-
universe u₁ u₂ u₃
61+
universe u₁ u₂ u₃ u₄
6262

6363
variable (k : Type u₁) (G : Type u₂) {R : Type _}
6464

@@ -997,7 +997,7 @@ section
997997

998998
variable {k}
999999

1000-
variable [Monoid G] [CommSemiring k] {V W : Type u} [AddCommMonoid V] [Module k V]
1000+
variable [Monoid G] [CommSemiring k] {V : Type u₃} {W : Type u} [AddCommMonoid V] [Module k V]
10011001
[Module (MonoidAlgebra k G) V] [IsScalarTower k (MonoidAlgebra k G) V] [AddCommMonoid W]
10021002
[Module k W] [Module (MonoidAlgebra k G) W] [IsScalarTower k (MonoidAlgebra k G) W]
10031003
(f : V →ₗ[k] W)

Mathlib/Data/Fintype/Card.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,8 @@ theorem card_ne_zero [Nonempty α] : card α ≠ 0 :=
549549
_root_.ne_of_gt card_pos
550550
#align fintype.card_ne_zero Fintype.card_ne_zero
551551

552+
instance [Nonempty α] : NeZero (card α) := ⟨card_ne_zero⟩
553+
552554
theorem card_le_one_iff : card α ≤ 1 ↔ ∀ a b : α, a = b :=
553555
let n := card α
554556
have hn : n = card α := rfl
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
/-
2+
Copyright (c) 2020 Scott Morrison. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Scott Morrison
5+
6+
! This file was ported from Lean 3 source module representation_theory.maschke
7+
! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Algebra.MonoidAlgebra.Basic
12+
import Mathlib.Algebra.CharP.Invertible
13+
import Mathlib.LinearAlgebra.Basis
14+
15+
/-!
16+
# Maschke's theorem
17+
18+
We prove **Maschke's theorem** for finite groups,
19+
in the formulation that every submodule of a `k[G]` module has a complement,
20+
when `k` is a field with `Invertible (Fintype.card G : k)`.
21+
22+
We do the core computation in greater generality.
23+
For any `[CommRing k]` in which `[Invertible (Fintype.card G : k)]`,
24+
and a `k[G]`-linear map `i : V → W` which admits a `k`-linear retraction `π`,
25+
we produce a `k[G]`-linear retraction by
26+
taking the average over `G` of the conjugates of `π`.
27+
28+
## Implementation Notes
29+
* These results assume `Invertible (Fintype.card G : k)` which is equivalent to the more
30+
familiar `¬(ringChar k ∣ Fintype.card G)`. It is possible to convert between them using
31+
`invertibleOfRingCharNotDvd` and `not_ringChar_dvd_of_invertible`.
32+
33+
34+
## Future work
35+
It's not so far to give the usual statement, that every finite dimensional representation
36+
of a finite group is semisimple (i.e. a direct sum of irreducibles).
37+
-/
38+
39+
40+
universe u v w
41+
42+
noncomputable section
43+
44+
open Module MonoidAlgebra BigOperators
45+
46+
/-!
47+
We now do the key calculation in Maschke's theorem.
48+
49+
Given `V → W`, an inclusion of `k[G]` modules,
50+
assume we have some retraction `π` (i.e. `∀ v, π (i v) = v`),
51+
just as a `k`-linear map.
52+
(When `k` is a field, this will be available cheaply, by choosing a basis.)
53+
54+
We now construct a retraction of the inclusion as a `k[G]`-linear map,
55+
by the formula
56+
$$ \frac{1}{|G|} \sum_{g \in G} g⁻¹ • π(g • -). $$
57+
-/
58+
59+
namespace LinearMap
60+
61+
set_option synthInstance.etaExperiment true
62+
63+
-- At first we work with any `[CommRing k]`, and add the assumption that
64+
-- `[Invertible (Fintype.card G : k)]` when it is required.
65+
variable {k : Type u} [CommRing k] {G : Type u} [Group G]
66+
variable {V : Type v} [AddCommGroup V] [Module k V] [Module (MonoidAlgebra k G) V]
67+
variable [IsScalarTower k (MonoidAlgebra k G) V]
68+
variable {W : Type w} [AddCommGroup W] [Module k W] [Module (MonoidAlgebra k G) W]
69+
variable [IsScalarTower k (MonoidAlgebra k G) W]
70+
71+
variable (π : W →ₗ[k] V)
72+
73+
/-- We define the conjugate of `π` by `g`, as a `k`-linear map. -/
74+
def conjugate (g : G) : W →ₗ[k] V :=
75+
.comp (.comp (GroupSmul.linearMap k V g⁻¹) π) (GroupSmul.linearMap k W g)
76+
#align linear_map.conjugate LinearMap.conjugate
77+
78+
theorem conjugate_apply (g : G) (v : W) :
79+
π.conjugate g v = MonoidAlgebra.single g⁻¹ (1 : k) • π (MonoidAlgebra.single g (1 : k) • v) :=
80+
rfl
81+
82+
variable (i : V →ₗ[MonoidAlgebra k G] W) (h : ∀ v : V, (π : W → V) (i v) = v)
83+
84+
section
85+
86+
theorem conjugate_i (g : G) (v : V) : (conjugate π g : W → V) (i v) = v := by
87+
rw [conjugate_apply, ← i.map_smul, h, ← mul_smul, single_mul_single, mul_one, mul_left_inv,
88+
← one_def, one_smul]
89+
#align linear_map.conjugate_i LinearMap.conjugate_i
90+
91+
end
92+
93+
variable (G) [Fintype G]
94+
95+
/-- The sum of the conjugates of `π` by each element `g : G`, as a `k`-linear map.
96+
97+
(We postpone dividing by the size of the group as long as possible.)
98+
-/
99+
def sumOfConjugates : W →ₗ[k] V :=
100+
∑ g : G, π.conjugate g
101+
#align linear_map.sum_of_conjugates LinearMap.sumOfConjugates
102+
103+
lemma sumOfConjugates_apply (v : W) : π.sumOfConjugates G v = ∑ g : G, π.conjugate g v :=
104+
LinearMap.sum_apply _ _ _
105+
106+
/-- In fact, the sum over `g : G` of the conjugate of `π` by `g` is a `k[G]`-linear map.
107+
-/
108+
def sumOfConjugatesEquivariant : W →ₗ[MonoidAlgebra k G] V :=
109+
MonoidAlgebra.equivariantOfLinearOfComm (π.sumOfConjugates G) fun g v => by
110+
simp only [sumOfConjugates_apply, Finset.smul_sum, conjugate_apply]
111+
refine Fintype.sum_bijective (· * g) (Group.mulRight_bijective g) _ _ fun i ↦ ?_
112+
simp only [smul_smul, single_mul_single, mul_inv_rev, mul_inv_cancel_left, one_mul]
113+
#align linear_map.sum_of_conjugates_equivariant LinearMap.sumOfConjugatesEquivariant
114+
115+
theorem sumOfConjugatesEquivariant_apply (v : W) :
116+
π.sumOfConjugatesEquivariant G v = ∑ g : G, π.conjugate g v :=
117+
π.sumOfConjugates_apply G v
118+
119+
section
120+
121+
variable [Invertible (Fintype.card G : k)]
122+
123+
/-- We construct our `k[G]`-linear retraction of `i` as
124+
$$ \frac{1}{|G|} \sum_{g \in G} g⁻¹ • π(g • -). $$
125+
-/
126+
def equivariantProjection : W →ₗ[MonoidAlgebra k G] V :=
127+
⅟(Fintype.card G : k) • π.sumOfConjugatesEquivariant G
128+
#align linear_map.equivariant_projection LinearMap.equivariantProjection
129+
130+
theorem equivariantProjection_apply (v : W) :
131+
π.equivariantProjection G v = ⅟(Fintype.card G : k) • ∑ g : G, π.conjugate g v := by
132+
simp only [equivariantProjection, smul_apply, sumOfConjugatesEquivariant_apply]
133+
134+
theorem equivariantProjection_condition (v : V) : (π.equivariantProjection G) (i v) = v := by
135+
rw [equivariantProjection_apply]
136+
simp only [conjugate_i π i h]
137+
rw [Finset.sum_const, Finset.card_univ, nsmul_eq_smul_cast k, smul_smul,
138+
Invertible.invOf_mul_self, one_smul]
139+
#align linear_map.equivariant_projection_condition LinearMap.equivariantProjection_condition
140+
141+
end
142+
143+
end LinearMap
144+
145+
end
146+
147+
namespace MonoidAlgebra
148+
149+
-- Now we work over a `[Field k]`.
150+
variable {k : Type u} [Field k] {G : Type u} [Fintype G] [Invertible (Fintype.card G : k)]
151+
variable [Group G]
152+
variable {V : Type u} [AddCommGroup V] [Module k V] [Module (MonoidAlgebra k G) V]
153+
variable [IsScalarTower k (MonoidAlgebra k G) V]
154+
variable {W : Type u} [AddCommGroup W] [Module k W] [Module (MonoidAlgebra k G) W]
155+
variable [IsScalarTower k (MonoidAlgebra k G) W]
156+
157+
theorem exists_leftInverse_of_injective (f : V →ₗ[MonoidAlgebra k G] W)
158+
(hf : LinearMap.ker f = ⊥) :
159+
∃ g : W →ₗ[MonoidAlgebra k G] V, g.comp f = LinearMap.id := by
160+
obtain ⟨φ, hφ⟩ := (f.restrictScalars k).exists_leftInverse_of_injective <| by
161+
simp only [hf, Submodule.restrictScalars_bot, LinearMap.ker_restrictScalars]
162+
refine ⟨φ.equivariantProjection G, FunLike.ext _ _ ?_⟩
163+
exact φ.equivariantProjection_condition G _ <| FunLike.congr_fun hφ
164+
#align monoid_algebra.exists_left_inverse_of_injective MonoidAlgebra.exists_leftInverse_of_injective
165+
166+
namespace Submodule
167+
168+
theorem exists_isCompl (p : Submodule (MonoidAlgebra k G) V) :
169+
∃ q : Submodule (MonoidAlgebra k G) V, IsCompl p q := by
170+
have : IsScalarTower k (MonoidAlgebra k G) p := p.isScalarTower'
171+
rcases MonoidAlgebra.exists_leftInverse_of_injective p.subtype p.ker_subtype with ⟨f, hf⟩
172+
refine ⟨LinearMap.ker f, LinearMap.isCompl_of_proj ?_⟩
173+
exact FunLike.congr_fun hf
174+
#align monoid_algebra.submodule.exists_is_compl MonoidAlgebra.Submodule.exists_isCompl
175+
176+
/-- This also implies an instance `IsSemisimpleModule (MonoidAlgebra k G) V`. -/
177+
instance complementedLattice : ComplementedLattice (Submodule (MonoidAlgebra k G) V) :=
178+
⟨exists_isCompl⟩
179+
#align monoid_algebra.submodule.complemented_lattice MonoidAlgebra.Submodule.complementedLattice
180+
181+
end Submodule
182+
183+
end MonoidAlgebra

0 commit comments

Comments
 (0)