|
| 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