Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 3dec44d

Browse files
Amelia Livingstonjoelriou
andcommitted
feat(representation_theory/group_cohomology_resolution): add isomorphism with nth inhomogeneous cochains (#18159)
Given a $k$-linear $G$-representation $A,$ this defines the $k$-linear isomorphism between functions $G^n \to A$ and representation morphisms $Hom(k[G^{n + 1}], A),$ called `Rep.diagonal_hom_equiv`. Co-authored-by: Joël Riou <joel.riou@universite-paris-saclay.fr>
1 parent c5dd931 commit 3dec44d

6 files changed

Lines changed: 236 additions & 7 deletions

File tree

src/category_theory/linear/basic.lean

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,28 @@ instance {X Y : C} (f : X ⟶ Y) [mono f] (r : R) [invertible r] : mono (r • f
130130
simpa [smul_smul] using congr_arg (λ f, ⅟r • f) H,
131131
end
132132

133+
/-- Given isomorphic objects `X ≅ Y, W ≅ Z` in a `k`-linear category, we have a `k`-linear
134+
isomorphism between `Hom(X, W)` and `Hom(Y, Z).` -/
135+
def hom_congr (k : Type*) {C : Type*} [category C] [semiring k]
136+
[preadditive C] [linear k C] {X Y W Z : C} (f₁ : X ≅ Y) (f₂ : W ≅ Z) :
137+
(X ⟶ W) ≃ₗ[k] (Y ⟶ Z) :=
138+
{ inv_fun := (left_comp k W f₁.hom).comp (right_comp k Y f₂.symm.hom),
139+
left_inv := λ x, by simp only [iso.symm_hom, linear_map.to_fun_eq_coe, linear_map.coe_comp,
140+
function.comp_app, left_comp_apply, right_comp_apply, category.assoc, iso.hom_inv_id,
141+
category.comp_id, iso.hom_inv_id_assoc],
142+
right_inv := λ x, by simp only [iso.symm_hom, linear_map.coe_comp, function.comp_app,
143+
right_comp_apply, left_comp_apply, linear_map.to_fun_eq_coe, iso.inv_hom_id_assoc,
144+
category.assoc, iso.inv_hom_id, category.comp_id],
145+
..(right_comp k Y f₂.hom).comp (left_comp k W f₁.symm.hom) }
146+
147+
lemma hom_congr_apply (k : Type*) {C : Type*} [category C] [semiring k]
148+
[preadditive C] [linear k C] {X Y W Z : C} (f₁ : X ≅ Y) (f₂ : W ≅ Z) (f : X ⟶ W) :
149+
hom_congr k f₁ f₂ f = (f₁.inv ≫ f) ≫ f₂.hom := rfl
150+
151+
lemma hom_congr_symm_apply (k : Type*) {C : Type*} [category C] [semiring k]
152+
[preadditive C] [linear k C] {X Y W Z : C} (f₁ : X ≅ Y) (f₂ : W ≅ Z) (f : Y ⟶ Z) :
153+
(hom_congr k f₁ f₂).symm f = f₁.hom ≫ f ≫ f₂.inv := rfl
154+
133155
end
134156

135157
section

src/linear_algebra/finsupp.lean

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ theorem lsum_symm_apply (f : (α →₀ M) →ₗ[R] N) (x : α) :
344344
end lsum
345345

346346
section
347-
variables (M) (R) (X : Type*)
347+
variables (M) (R) (X : Type*) (S) [module S M] [smul_comm_class R S M]
348348

349349
/--
350350
A slight rearrangement from `lsum` gives us
@@ -362,6 +362,24 @@ lemma lift_apply (f) (g) :
362362
((lift M R X) f) g = g.sum (λ x r, r • f x) :=
363363
rfl
364364

365+
/-- Given compatible `S` and `R`-module structures on `M` and a type `X`, the set of functions
366+
`X → M` is `S`-linearly equivalent to the `R`-linear maps from the free `R`-module
367+
on `X` to `M`. -/
368+
noncomputable def llift : (X → M) ≃ₗ[S] ((X →₀ R) →ₗ[R] M) :=
369+
{ map_smul' :=
370+
begin
371+
intros,
372+
dsimp,
373+
ext,
374+
simp only [coe_comp, function.comp_app, lsingle_apply, lift_apply, pi.smul_apply,
375+
sum_single_index, zero_smul, one_smul, linear_map.smul_apply],
376+
end, ..lift M R X }
377+
378+
@[simp] lemma llift_apply (f : X → M) (x : X →₀ R) :
379+
llift M R S X f x = lift M R X f x := rfl
380+
381+
@[simp] lemma llift_symm_apply (f : (X →₀ R) →ₗ[R] M) (x : X) :
382+
(llift M R S X).symm f x = f (single x 1) := rfl
365383
end
366384

367385
section lmap_domain

src/representation_theory/Action.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,12 +504,12 @@ rfl
504504
rfl
505505

506506
@[simp] lemma functor_category_monoidal_equivalence.functor_map {A B : Action V G} (f : A ⟶ B) :
507-
(functor_category_monoidal_equivalence _ _).1.1.map f
507+
(functor_category_monoidal_equivalence _ _).map f
508508
= functor_category_equivalence.functor.map f := rfl
509509

510510
@[simp] lemma functor_category_monoidal_equivalence.inverse_map
511511
{A B : single_obj G ⥤ V} (f : A ⟶ B) :
512-
(functor_category_monoidal_equivalence _ _).1.inv.map f
512+
(functor_category_monoidal_equivalence _ _).inv.map f
513513
= functor_category_equivalence.inverse.map f := rfl
514514

515515
variables (H : Group.{u})

src/representation_theory/Rep.lean

Lines changed: 135 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,26 @@ lemma coe_of {V : Type u} [add_comm_group V] [module k V] (ρ : G →* (V →ₗ
6868
@[simp] lemma of_ρ {V : Type u} [add_comm_group V] [module k V] (ρ : G →* (V →ₗ[k] V)) :
6969
(of ρ).ρ = ρ := rfl
7070

71+
@[simp] lemma Action_ρ_eq_ρ {A : Rep k G} : Action.ρ A = A.ρ := rfl
72+
73+
/-- Allows us to apply lemmas about the underlying `ρ`, which would take an element `g : G` rather
74+
than `g : Mon.of G` as an argument. -/
75+
lemma of_ρ_apply {V : Type u} [add_comm_group V] [module k V]
76+
(ρ : representation k G V) (g : Mon.of G) :
77+
(Rep.of ρ).ρ g = ρ (g : G) := rfl
78+
7179
-- Verify that limits are calculated correctly.
7280
noncomputable example : preserves_limits (forget₂ (Rep k G) (Module.{u} k)) :=
7381
by apply_instance
7482
noncomputable example : preserves_colimits (forget₂ (Rep k G) (Module.{u} k)) :=
7583
by apply_instance
7684

85+
@[simp] lemma monoidal_category.braiding_hom_apply {A B : Rep k G} (x : A) (y : B) :
86+
Action.hom.hom (β_ A B).hom (tensor_product.tmul k x y) = tensor_product.tmul k y x := rfl
87+
88+
@[simp] lemma monoidal_category.braiding_inv_apply {A B : Rep k G} (x : A) (y : B) :
89+
Action.hom.hom (β_ A B).inv (tensor_product.tmul k y x) = tensor_product.tmul k x y := rfl
90+
7791
section linearization
7892

7993
variables (k G)
@@ -117,6 +131,56 @@ noncomputable def linearization_of_mul_action_iso (n : ℕ) :
117131
(linearization k G).1.1.obj (Action.of_mul_action G (fin n → G))
118132
≅ of_mul_action k G (fin n → G) := iso.refl _
119133

134+
variables {k G}
135+
136+
/-- Given an element `x : A`, there is a natural morphism of representations `k[G] ⟶ A` sending
137+
`g ↦ A.ρ(g)(x).` -/
138+
@[simps] noncomputable def left_regular_hom (A : Rep k G) (x : A) :
139+
Rep.of_mul_action k G G ⟶ A :=
140+
{ hom := finsupp.lift _ _ _ (λ g, A.ρ g x),
141+
comm' := λ g,
142+
begin
143+
refine finsupp.lhom_ext' (λ y, linear_map.ext_ring _),
144+
simpa only [linear_map.comp_apply, Module.comp_def, finsupp.lsingle_apply,
145+
finsupp.lift_apply, Action_ρ_eq_ρ, of_ρ_apply, representation.of_mul_action_single,
146+
finsupp.sum_single_index, zero_smul, one_smul, smul_eq_mul, A.ρ.map_mul],
147+
end }
148+
149+
lemma left_regular_hom_apply {A : Rep k G} (x : A) :
150+
(left_regular_hom A x).hom (finsupp.single 1 1) = x :=
151+
begin
152+
simpa only [left_regular_hom_hom, finsupp.lift_apply, finsupp.sum_single_index, one_smul,
153+
A.ρ.map_one, zero_smul],
154+
end
155+
156+
/-- Given a `k`-linear `G`-representation `A`, there is a `k`-linear isomorphism between
157+
representation morphisms `Hom(k[G], A)` and `A`. -/
158+
@[simps] noncomputable def left_regular_hom_equiv (A : Rep k G) :
159+
(Rep.of_mul_action k G G ⟶ A) ≃ₗ[k] A :=
160+
{ to_fun := λ f, f.hom (finsupp.single 1 1),
161+
map_add' := λ x y, rfl,
162+
map_smul' := λ r x, rfl,
163+
inv_fun := λ x, left_regular_hom A x,
164+
left_inv := λ f,
165+
begin
166+
refine Action.hom.ext _ _ (finsupp.lhom_ext' (λ (x : G), linear_map.ext_ring _)),
167+
have : f.hom (((of_mul_action k G G).ρ) x (finsupp.single (1 : G) (1 : k)))
168+
= A.ρ x (f.hom (finsupp.single (1 : G) (1 : k))) :=
169+
linear_map.ext_iff.1 (f.comm x) (finsupp.single 1 1),
170+
simp only [linear_map.comp_apply, finsupp.lsingle_apply,
171+
left_regular_hom_hom, finsupp.lift_apply, finsupp.sum_single_index, one_smul, ←this,
172+
zero_smul, of_ρ_apply, representation.of_mul_action_single x (1 : G) (1 : k), smul_eq_mul,
173+
mul_one],
174+
end,
175+
right_inv := λ x, left_regular_hom_apply x }
176+
177+
lemma left_regular_hom_equiv_symm_single {A : Rep k G} (x : A) (g : G) :
178+
((left_regular_hom_equiv A).symm x).hom (finsupp.single g 1) = A.ρ g x :=
179+
begin
180+
simp only [left_regular_hom_equiv_symm_apply, left_regular_hom_hom,
181+
finsupp.lift_apply, finsupp.sum_single_index, zero_smul, one_smul],
182+
end
183+
120184
end linearization
121185
end
122186
section
@@ -162,8 +226,7 @@ rfl
162226
`G`-representation `B,` the `k`-linear map underlying the resulting map `B ⟶ iHom(A, A ⊗ B)` is
163227
given by flipping the arguments in the natural `k`-bilinear map `A →ₗ[k] B →ₗ[k] A ⊗ B`. -/
164228
@[simp] lemma ihom_coev_app_hom :
165-
Action.hom.hom ((ihom.coev A).app B) =
166-
(tensor_product.mk _ _ _).flip :=
229+
Action.hom.hom ((ihom.coev A).app B) = (tensor_product.mk _ _ _).flip :=
167230
begin
168231
refine linear_map.ext (λ x, linear_map.ext (λ y, _)),
169232
simpa only [ihom_coev_app_def, functor.map_comp, comp_hom,
@@ -208,9 +271,79 @@ the identity map on `Homₖ(A, B).` -/
208271
tensor_product.uncurry _ _ _ _ linear_map.id.flip :=
209272
monoidal_closed_uncurry_hom _
210273

274+
variables (A B C)
275+
276+
/-- There is a `k`-linear isomorphism between the sets of representation morphisms`Hom(A ⊗ B, C)`
277+
and `Hom(B, Homₖ(A, C))`. -/
278+
noncomputable def monoidal_closed.linear_hom_equiv :
279+
(A ⊗ B ⟶ C) ≃ₗ[k] (B ⟶ (A ⟶[Rep k G] C)) :=
280+
{ map_add' := λ f g, rfl,
281+
map_smul' := λ r f, rfl, ..(ihom.adjunction A).hom_equiv _ _ }
282+
283+
/-- There is a `k`-linear isomorphism between the sets of representation morphisms`Hom(A ⊗ B, C)`
284+
and `Hom(A, Homₖ(B, C))`. -/
285+
noncomputable def monoidal_closed.linear_hom_equiv_comm :
286+
(A ⊗ B ⟶ C) ≃ₗ[k] (A ⟶ (B ⟶[Rep k G] C)) :=
287+
(linear.hom_congr k (β_ A B) (iso.refl _)) ≪≫ₗ
288+
monoidal_closed.linear_hom_equiv _ _ _
289+
290+
variables {A B C}
291+
292+
lemma monoidal_closed.linear_hom_equiv_hom (f : A ⊗ B ⟶ C) :
293+
(monoidal_closed.linear_hom_equiv A B C f).hom =
294+
(tensor_product.curry f.hom).flip :=
295+
monoidal_closed_curry_hom _
296+
297+
lemma monoidal_closed.linear_hom_equiv_comm_hom (f : A ⊗ B ⟶ C) :
298+
(monoidal_closed.linear_hom_equiv_comm A B C f).hom =
299+
tensor_product.curry f.hom :=
300+
begin
301+
dunfold monoidal_closed.linear_hom_equiv_comm,
302+
refine linear_map.ext (λ x, linear_map.ext (λ y, _)),
303+
simp only [linear_equiv.trans_apply, monoidal_closed.linear_hom_equiv_hom,
304+
linear.hom_congr_apply, iso.refl_hom, iso.symm_hom, linear_map.to_fun_eq_coe,
305+
linear_map.coe_comp, function.comp_app, linear.left_comp_apply, linear.right_comp_apply,
306+
category.comp_id, Action.comp_hom, linear_map.flip_apply, tensor_product.curry_apply,
307+
Module.coe_comp, function.comp_app, monoidal_category.braiding_inv_apply],
308+
end
309+
310+
lemma monoidal_closed.linear_hom_equiv_symm_hom (f : B ⟶ (A ⟶[Rep k G] C)) :
311+
((monoidal_closed.linear_hom_equiv A B C).symm f).hom =
312+
tensor_product.uncurry k A B C f.hom.flip :=
313+
monoidal_closed_uncurry_hom _
314+
315+
lemma monoidal_closed.linear_hom_equiv_comm_symm_hom (f : A ⟶ (B ⟶[Rep k G] C)) :
316+
((monoidal_closed.linear_hom_equiv_comm A B C).symm f).hom =
317+
tensor_product.uncurry k A B C f.hom :=
318+
begin
319+
dunfold monoidal_closed.linear_hom_equiv_comm,
320+
refine tensor_product.algebra_tensor_module.curry_injective
321+
(linear_map.ext (λ x, linear_map.ext (λ y, _))),
322+
simp only [linear_equiv.trans_symm, linear_equiv.trans_apply, linear.hom_congr_symm_apply,
323+
iso.refl_inv, linear_map.coe_comp, function.comp_app, category.comp_id, Action.comp_hom,
324+
monoidal_closed.linear_hom_equiv_symm_hom, tensor_product.algebra_tensor_module.curry_apply,
325+
linear_map.coe_restrict_scalars, linear_map.to_fun_eq_coe, linear_map.flip_apply,
326+
tensor_product.curry_apply, Module.coe_comp, function.comp_app,
327+
monoidal_category.braiding_hom_apply, tensor_product.uncurry_apply],
328+
end
329+
211330
end
212331
end Rep
332+
namespace representation
333+
variables {k G : Type u} [comm_ring k] [monoid G] {V W : Type u}
334+
[add_comm_group V] [add_comm_group W] [module k V] [module k W]
335+
(ρ : representation k G V) (τ : representation k G W)
336+
337+
/-- Tautological isomorphism to help Lean in typechecking. -/
338+
def Rep_of_tprod_iso : Rep.of (ρ.tprod τ) ≅ Rep.of ρ ⊗ Rep.of τ := iso.refl _
339+
340+
lemma Rep_of_tprod_iso_apply (x : tensor_product k V W) :
341+
(Rep_of_tprod_iso ρ τ).hom.hom x = x := rfl
342+
343+
lemma Rep_of_tprod_iso_inv_apply (x : tensor_product k V W) :
344+
(Rep_of_tprod_iso ρ τ).inv.hom x = x := rfl
213345

346+
end representation
214347
/-!
215348
# The categorical equivalence `Rep k G ≌ Module.{u} (monoid_algebra k G)`.
216349
-/

src/representation_theory/basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@ variables {k G H}
245245

246246
lemma of_mul_action_def (g : G) : of_mul_action k G H g = finsupp.lmap_domain k k ((•) g) := rfl
247247

248+
lemma of_mul_action_single (g : G) (x : H) (r : k) :
249+
of_mul_action k G H g (finsupp.single x r) = finsupp.single (g • x) r :=
250+
finsupp.map_domain_single
251+
248252
end mul_action
249253
section group
250254

src/representation_theory/group_cohomology_resolution.lean

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,12 @@ variables {k G n}
169169

170170
@[simp] lemma to_tensor_single (f : Gⁿ⁺¹) (m : k) :
171171
(to_tensor k G n).hom (single f m) = single (f 0) m ⊗ₜ single (λ i, (f i)⁻¹ * f i.succ) 1 :=
172-
to_tensor_aux_single _ _
172+
by apply to_tensor_aux_single f m
173173

174174
@[simp] lemma of_tensor_single (g : G) (m : k) (x : Gⁿ →₀ k) :
175175
(of_tensor k G n).hom ((single g m) ⊗ₜ x) =
176176
finsupp.lift (Rep.of_mul_action k G Gⁿ⁺¹) k Gⁿ (λ f, single (g • partial_prod f) m) x :=
177-
of_tensor_aux_single _ _ _
177+
by apply of_tensor_aux_single g m x
178178

179179
lemma of_tensor_single' (g : G →₀ k) (x : Gⁿ) (m : k) :
180180
(of_tensor k G n).hom (g ⊗ₜ single x m) =
@@ -233,6 +233,58 @@ module.free.of_basis (of_mul_action_basis k G n)
233233

234234
end basis
235235
end group_cohomology.resolution
236+
namespace Rep
237+
variables (n) [group G]
238+
open group_cohomology.resolution
239+
240+
/-- Given a `k`-linear `G`-representation `A`, the set of representation morphisms
241+
`Hom(k[Gⁿ⁺¹], A)` is `k`-linearly isomorphic to the set of functions `Gⁿ → A`. -/
242+
noncomputable def diagonal_hom_equiv (A : Rep k G) :
243+
(Rep.of_mul_action k G (fin (n + 1) → G) ⟶ A) ≃ₗ[k] ((fin n → G) → A) :=
244+
linear.hom_congr k ((equiv_tensor k G n).trans
245+
((representation.of_mul_action k G G).Rep_of_tprod_iso 1)) (iso.refl _) ≪≫ₗ
246+
((Rep.monoidal_closed.linear_hom_equiv_comm _ _ _) ≪≫ₗ (Rep.left_regular_hom_equiv _))
247+
≪≫ₗ (finsupp.llift A k k (fin n → G)).symm
248+
249+
variables {n}
250+
251+
/-- Given a `k`-linear `G`-representation `A`, `diagonal_hom_equiv` is a `k`-linear isomorphism of
252+
the set of representation morphisms `Hom(k[Gⁿ⁺¹], A)` with `Fun(Gⁿ, A)`. This lemma says that this
253+
sends a morphism of representations `f : k[Gⁿ⁺¹] ⟶ A` to the function
254+
`(g₁, ..., gₙ) ↦ f(1, g₁, g₁g₂, ..., g₁g₂...gₙ).` -/
255+
lemma diagonal_hom_equiv_apply {A : Rep k G} (f : Rep.of_mul_action k G (fin (n + 1) → G) ⟶ A)
256+
(x : fin n → G) : diagonal_hom_equiv n A f x = f.hom (finsupp.single (fin.partial_prod x) 1) :=
257+
begin
258+
unfold diagonal_hom_equiv,
259+
simpa only [linear_equiv.trans_apply, Rep.left_regular_hom_equiv_apply,
260+
monoidal_closed.linear_hom_equiv_comm_hom, finsupp.llift_symm_apply, tensor_product.curry_apply,
261+
linear.hom_congr_apply, iso.refl_hom, iso.trans_inv, Action.comp_hom, Module.comp_def,
262+
linear_map.comp_apply, equiv_tensor_inv_def, representation.Rep_of_tprod_iso_inv_apply,
263+
of_tensor_single (1 : G) (1 : k) (finsupp.single x (1 : k)), finsupp.lift_apply,
264+
finsupp.sum_single_index, one_smul, zero_smul],
265+
end
266+
267+
/-- Given a `k`-linear `G`-representation `A`, `diagonal_hom_equiv` is a `k`-linear isomorphism of
268+
the set of representation morphisms `Hom(k[Gⁿ⁺¹], A)` with `Fun(Gⁿ, A)`. This lemma says that the
269+
inverse map sends a function `f : Gⁿ → A` to the representation morphism sending
270+
`(g₀, ... gₙ) ↦ ρ(g₀)(f(g₀⁻¹g₁, g₁⁻¹g₂, ..., gₙ₋₁⁻¹gₙ))`, where `ρ` is the representation attached
271+
to `A`. -/
272+
lemma diagonal_hom_equiv_symm_apply {A : Rep k G} (f : (fin n → G) → A) (x : fin (n + 1) → G) :
273+
((diagonal_hom_equiv n A).symm f).hom (finsupp.single x 1)
274+
= A.ρ (x 0) (f (λ (i : fin n), (x ↑i)⁻¹ * x i.succ)) :=
275+
begin
276+
unfold diagonal_hom_equiv,
277+
simp only [linear_equiv.trans_symm, linear_equiv.symm_symm, linear_equiv.trans_apply,
278+
Rep.left_regular_hom_equiv_symm_apply, linear.hom_congr_symm_apply, Action.comp_hom,
279+
iso.refl_inv, category.comp_id, Rep.monoidal_closed.linear_hom_equiv_comm_symm_hom,
280+
iso.trans_hom, Module.comp_def, linear_map.comp_apply, representation.Rep_of_tprod_iso_apply,
281+
equiv_tensor_def, to_tensor_single x (1 : k), tensor_product.uncurry_apply,
282+
Rep.left_regular_hom_hom, finsupp.lift_apply, Rep.ihom_obj_ρ, representation.lin_hom_apply,
283+
finsupp.sum_single_index, zero_smul, one_smul, Rep.of_ρ,
284+
monoid_hom.one_apply, linear_map.one_apply, finsupp.llift_apply A k k],
285+
end
286+
287+
end Rep
236288
variables (G)
237289

238290
/-- The simplicial `G`-set sending `[n]` to `Gⁿ⁺¹` equipped with the diagonal action of `G`. -/

0 commit comments

Comments
 (0)