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

Commit 811da36

Browse files
author
Amelia Livingston
committed
feat(representation_theory/group_cohomology_resolution): show k[G^(n + 1)] is free over k[G] (#15501)
Defines an isomorphism $k[G^{n + 1}] \cong k[G] \otimes_k k[G^n].$ Also shows that given a $k$-algebra $R$ and a $k$-basis for a module $M,$ we get an $R$-basis of $R \otimes_k M.$ Then, using that, we show $k[G^{n + 1}]$ is free.
1 parent 557f5e5 commit 811da36

File tree

6 files changed

+222
-13
lines changed

6 files changed

+222
-13
lines changed

src/algebra/big_operators/fin.lean

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,29 @@ by simp [partial_prod, list.take_succ, list.of_fn_nth_val, dif_pos j.is_lt, ←o
181181
partial_prod f j.succ = f 0 * partial_prod (fin.tail f) j :=
182182
by simpa [partial_prod]
183183

184+
@[to_additive] lemma partial_prod_left_inv {G : Type*} [group G] (f : fin (n + 1) → G) :
185+
f 0 • partial_prod (λ i : fin n, (f i)⁻¹ * f i.succ) = f :=
186+
funext $ λ x, fin.induction_on x (by simp) (λ x hx,
187+
begin
188+
simp only [coe_eq_cast_succ, pi.smul_apply, smul_eq_mul] at hx ⊢,
189+
rw [partial_prod_succ, ←mul_assoc, hx, mul_inv_cancel_left],
190+
end)
191+
192+
@[to_additive] lemma partial_prod_right_inv {G : Type*} [group G]
193+
(g : G) (f : fin n → G) (i : fin n) :
194+
((g • partial_prod f) i)⁻¹ * (g • partial_prod f) i.succ = f i :=
195+
begin
196+
cases i with i hn,
197+
induction i with i hi generalizing hn,
198+
{ simp [←fin.succ_mk, partial_prod_succ] },
199+
{ specialize hi (lt_trans (nat.lt_succ_self i) hn),
200+
simp only [mul_inv_rev, fin.coe_eq_cast_succ, fin.succ_mk, fin.cast_succ_mk,
201+
smul_eq_mul, pi.smul_apply] at hi ⊢,
202+
rw [←fin.succ_mk _ _ (lt_trans (nat.lt_succ_self _) hn), ←fin.succ_mk],
203+
simp only [partial_prod_succ, mul_inv_rev, fin.cast_succ_mk],
204+
assoc_rw [hi, inv_mul_cancel_left] }
205+
end
206+
184207
end partial_prod
185208

186209
end fin

src/linear_algebra/basic.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,22 @@ end
117117
(linear_equiv_fun_on_fintype R M α).symm f = f :=
118118
by { ext, simp [linear_equiv_fun_on_fintype], }
119119

120+
/-- If `α` has a unique term, then the type of finitely supported functions `α →₀ M` is
121+
`R`-linearly equivalent to `M`. -/
122+
noncomputable def linear_equiv.finsupp_unique (α : Type*) [unique α] : (α →₀ M) ≃ₗ[R] M :=
123+
{ map_add' := λ x y, rfl,
124+
map_smul' := λ r x, rfl,
125+
..finsupp.equiv_fun_on_fintype.trans (equiv.fun_unique α M) }
126+
127+
variables {R M α}
128+
129+
@[simp] lemma linear_equiv.finsupp_unique_apply (α : Type*) [unique α] (f : α →₀ M) :
130+
linear_equiv.finsupp_unique R M α f = f default := rfl
131+
132+
@[simp] lemma linear_equiv.finsupp_unique_symm_apply {α : Type*} [unique α] (m : M) :
133+
(linear_equiv.finsupp_unique R M α).symm m = finsupp.single default m :=
134+
by ext; simp [linear_equiv.finsupp_unique]
135+
120136
end finsupp
121137

122138
/-- decomposing `x : ι → R` as a sum along the canonical basis -/

src/logic/equiv/basic.lean

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,10 +629,28 @@ calc punit × α ≃ α × punit : prod_comm _ _
629629
def prod_unique (α β : Type*) [unique β] : α × β ≃ α :=
630630
((equiv.refl α).prod_congr $ equiv_punit β).trans $ prod_punit α
631631

632+
@[simp] lemma coe_prod_unique {α β : Type*} [unique β] :
633+
⇑(prod_unique α β) = prod.fst := rfl
634+
635+
lemma prod_unique_apply {α β : Type*} [unique β] (x : α × β) :
636+
prod_unique α β x = x.1 := rfl
637+
638+
@[simp] lemma prod_unique_symm_apply {α β : Type*} [unique β] (x : α) :
639+
(prod_unique α β).symm x = (x, default) := rfl
640+
632641
/-- Any `unique` type is a left identity for type product up to equivalence. -/
633642
def unique_prod (α β : Type*) [unique β] : β × α ≃ α :=
634643
((equiv_punit β).prod_congr $ equiv.refl α).trans $ punit_prod α
635644

645+
@[simp] lemma coe_unique_prod {α β : Type*} [unique β] :
646+
⇑(unique_prod α β) = prod.snd := rfl
647+
648+
lemma unique_prod_apply {α β : Type*} [unique β] (x : β × α) :
649+
unique_prod α β x = x.2 := rfl
650+
651+
@[simp] lemma unique_prod_symm_apply {α β : Type*} [unique β] (x : α) :
652+
(unique_prod α β).symm x = (default, x) := rfl
653+
636654
/-- `empty` type is a right absorbing element for type product up to an equivalence. -/
637655
def prod_empty (α : Type*) : α × empty ≃ empty :=
638656
equiv_empty _

src/representation_theory/basic.lean

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ which we equip with an instance `module (monoid_algebra k G) ρ.as_module`.
9393
9494
You should use `as_module_equiv : ρ.as_module ≃+ V` to translate terms.
9595
-/
96-
@[nolint unused_arguments, derive add_comm_monoid]
96+
@[nolint unused_arguments, derive [add_comm_monoid, module (module.End k V)]]
9797
def as_module (ρ : representation k G V) := V
9898

9999
instance : inhabited ρ.as_module := ⟨0
@@ -103,10 +103,7 @@ A `k`-linear representation of `G` on `V` can be thought of as
103103
a module over `monoid_algebra k G`.
104104
-/
105105
noncomputable instance as_module_module : module (monoid_algebra k G) ρ.as_module :=
106-
begin
107-
change module (monoid_algebra k G) V,
108-
exact module.comp_hom V (as_algebra_hom ρ).to_ring_hom,
109-
end
106+
module.comp_hom V (as_algebra_hom ρ).to_ring_hom
110107

111108
/--
112109
The additive equivalence from the `module (monoid_algebra k G)` to the original vector space
@@ -264,6 +261,20 @@ begin
264261
simp only [of_mul_action_def, finsupp.lmap_domain_apply, finsupp.map_domain_apply, hg],
265262
end
266263

264+
lemma of_mul_action_self_smul_eq_mul
265+
(x : monoid_algebra k G) (y : (of_mul_action k G G).as_module) :
266+
x • y = (x * y : monoid_algebra k G) :=
267+
x.induction_on (λ g, by show as_algebra_hom _ _ _ = _; ext; simp)
268+
(λ x y hx hy, by simp only [hx, hy, add_mul, add_smul])
269+
(λ r x hx, by show as_algebra_hom _ _ _ = _; simpa [←hx])
270+
271+
/-- If we equip `k[G]` with the `k`-linear `G`-representation induced by the left regular action of
272+
`G` on itself, the resulting object is isomorphic as a `k[G]`-module to `k[G]` with its natural
273+
`k[G]`-module structure. -/
274+
@[simps] noncomputable def of_mul_action_self_as_module_equiv :
275+
(of_mul_action k G G).as_module ≃ₗ[monoid_algebra k G] monoid_algebra k G :=
276+
{ map_smul' := of_mul_action_self_smul_eq_mul, ..as_module_equiv _ }
277+
267278
/--
268279
When `G` is a group, a `k`-linear representation of `G` on `V` can be thought of as
269280
a group homomorphism from `G` into the invertible `k`-linear endomorphisms of `V`.
@@ -298,6 +309,27 @@ local notation ρV ` ⊗ ` ρW := tprod ρV ρW
298309
@[simp]
299310
lemma tprod_apply (g : G) : (ρV ⊗ ρW) g = tensor_product.map (ρV g) (ρW g) := rfl
300311

312+
lemma smul_tprod_one_as_module (r : monoid_algebra k G) (x : V) (y : W) :
313+
(r • (x ⊗ₜ y) : (ρV.tprod 1).as_module) = (r • x : ρV.as_module) ⊗ₜ y :=
314+
begin
315+
show as_algebra_hom _ _ _ = as_algebra_hom _ _ _ ⊗ₜ _,
316+
simp only [as_algebra_hom_def, monoid_algebra.lift_apply,
317+
tprod_apply, monoid_hom.one_apply, linear_map.finsupp_sum_apply,
318+
linear_map.smul_apply, tensor_product.map_tmul, linear_map.one_apply],
319+
simp only [finsupp.sum, tensor_product.sum_tmul],
320+
refl,
321+
end
322+
323+
lemma smul_one_tprod_as_module (r : monoid_algebra k G) (x : V) (y : W) :
324+
(r • (x ⊗ₜ y) : ((1 : representation k G V).tprod ρW).as_module) = x ⊗ₜ (r • y : ρW.as_module) :=
325+
begin
326+
show as_algebra_hom _ _ _ = _ ⊗ₜ as_algebra_hom _ _ _,
327+
simp only [as_algebra_hom_def, monoid_algebra.lift_apply,
328+
tprod_apply, monoid_hom.one_apply, linear_map.finsupp_sum_apply,
329+
linear_map.smul_apply, tensor_product.map_tmul, linear_map.one_apply],
330+
simp only [finsupp.sum, tensor_product.tmul_sum, tensor_product.tmul_smul],
331+
end
332+
301333
end tensor_product
302334

303335
section linear_hom

src/representation_theory/group_cohomology_resolution.lean

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,22 @@ This file contains facts about an important `k[G]`-module structure on `k[Gⁿ]`
1313
commutative ring and `G` is a group. The module structure arises from the representation
1414
`G →* End(k[Gⁿ])` induced by the diagonal action of `G` on `Gⁿ.`
1515
16-
In particular, we define morphisms of `k`-linear `G`-representations between `k[Gⁿ⁺¹]` and
16+
In particular, we define an isomorphism of `k`-linear `G`-representations between `k[Gⁿ⁺¹]` and
1717
`k[G] ⊗ₖ k[Gⁿ]` (on which `G` acts by `ρ(g₁)(g₂ ⊗ x) = (g₁ * g₂) ⊗ x`).
1818
19+
This allows us to define a `k[G]`-basis on `k[Gⁿ⁺¹]`, by mapping the natural `k[G]`-basis of
20+
`k[G] ⊗ₖ k[Gⁿ]` along the isomorphism.
21+
1922
## Main definitions
2023
2124
* `group_cohomology.resolution.to_tensor`
2225
* `group_cohomology.resolution.of_tensor`
2326
* `Rep.of_mul_action`
27+
* `group_cohomology.resolution.equiv_tensor`
28+
* `group_cohomology.resolution.of_mul_action_basis`
2429
2530
## TODO
2631
27-
* Show that `group_cohomology.resolution.to_tensor` and `group_cohomology.resolution.of_tensor` are
28-
mutually inverse.
29-
* Use the above to deduce that `k[Gⁿ⁺¹]` is free over `k[G]`.
3032
* Use the freeness of `k[Gⁿ⁺¹]` to build a projective resolution of the (trivial) `k[G]`-module
3133
`k`, and so develop group cohomology.
3234
@@ -79,8 +81,7 @@ variables {k G n}
7981
lemma to_tensor_aux_single (f : Gⁿ⁺¹) (m : k) :
8082
to_tensor_aux k G n (single f m) = single (f 0) m ⊗ₜ single (λ i, (f i)⁻¹ * f i.succ) 1 :=
8183
begin
82-
erw [lift_apply, sum_single_index, tensor_product.smul_tmul'],
83-
{ simp },
84+
simp only [to_tensor_aux, lift_apply, sum_single_index, tensor_product.smul_tmul'],
8485
{ simp },
8586
end
8687

@@ -99,10 +100,36 @@ lemma of_tensor_aux_comm_of_mul_action (g h : G) (x : Gⁿ) :
99100
(1 : module.End k (Gⁿ →₀ k)) (single h (1 : k) ⊗ₜ single x (1 : k))) =
100101
of_mul_action k G Gⁿ⁺¹ g (of_tensor_aux k G n (single h 1 ⊗ₜ single x 1)) :=
101102
begin
102-
dsimp,
103103
simp [of_mul_action_def, of_tensor_aux_single, mul_smul],
104104
end
105105

106+
lemma to_tensor_aux_left_inv (x : Gⁿ⁺¹ →₀ k) :
107+
of_tensor_aux _ _ _ (to_tensor_aux _ _ _ x) = x :=
108+
begin
109+
refine linear_map.ext_iff.1 (@finsupp.lhom_ext _ _ _ k _ _ _ _ _
110+
(linear_map.comp (of_tensor_aux _ _ _) (to_tensor_aux _ _ _)) linear_map.id (λ x y, _)) x,
111+
dsimp,
112+
rw [to_tensor_aux_single x y, of_tensor_aux_single, finsupp.lift_apply, finsupp.sum_single_index,
113+
one_smul, fin.partial_prod_left_inv],
114+
{ rw zero_smul }
115+
end
116+
117+
lemma to_tensor_aux_right_inv (x : (G →₀ k) ⊗[k] (Gⁿ →₀ k)) :
118+
to_tensor_aux _ _ _ (of_tensor_aux _ _ _ x) = x :=
119+
begin
120+
refine tensor_product.induction_on x (by simp) (λ y z, _) (λ z w hz hw, by simp [hz, hw]),
121+
rw [←finsupp.sum_single y, finsupp.sum, tensor_product.sum_tmul],
122+
simp only [finset.smul_sum, linear_map.map_sum],
123+
refine finset.sum_congr rfl (λ f hf, _),
124+
simp only [of_tensor_aux_single, finsupp.lift_apply, finsupp.smul_single',
125+
linear_map.map_finsupp_sum, to_tensor_aux_single, fin.partial_prod_right_inv],
126+
dsimp,
127+
simp only [fin.partial_prod_zero, mul_one],
128+
conv_rhs {rw [←finsupp.sum_single z, finsupp.sum, tensor_product.tmul_sum]},
129+
exact finset.sum_congr rfl (λ g hg, show _ ⊗ₜ _ = _, by
130+
rw [←finsupp.smul_single', tensor_product.smul_tmul, finsupp.smul_single_one])
131+
end
132+
106133
variables (k G n)
107134

108135
/-- Given a `G`-action on `H`, this is `k[H]` bundled with the natural representation
@@ -144,4 +171,55 @@ lemma of_tensor_single' (g : G →₀ k) (x : Gⁿ) (m : k) :
144171
finsupp.lift _ k G (λ a, single (a • partial_prod x) m) g :=
145172
by simp [of_tensor, of_tensor_aux]
146173

174+
variables (k G n)
175+
176+
/-- An isomorphism of `k`-linear representations of `G` from `k[Gⁿ⁺¹]` to `k[G] ⊗ₖ k[Gⁿ]` (on
177+
which `G` acts by `ρ(g₁)(g₂ ⊗ x) = (g₁ * g₂) ⊗ x`) sending `(g₀, ..., gₙ)` to
178+
`g₀ ⊗ (g₀⁻¹g₁, g₁⁻¹g₂, ..., gₙ₋₁⁻¹gₙ)`. -/
179+
def equiv_tensor : (Rep.of_mul_action k G (fin (n + 1) → G)) ≅ Rep.of
180+
((representation.of_mul_action k G G).tprod (1 : representation k G ((fin n → G) →₀ k))) :=
181+
Action.mk_iso (linear_equiv.to_Module_iso
182+
{ inv_fun := of_tensor_aux k G n,
183+
left_inv := to_tensor_aux_left_inv,
184+
right_inv := λ x, by convert to_tensor_aux_right_inv x,
185+
..to_tensor_aux k G n }) (to_tensor k G n).comm
186+
187+
-- not quite sure which simp lemmas to make here
188+
@[simp] lemma equiv_tensor_def :
189+
(equiv_tensor k G n).hom = to_tensor k G n := rfl
190+
191+
@[simp] lemma equiv_tensor_inv_def :
192+
(equiv_tensor k G n).inv = of_tensor k G n := rfl
193+
194+
/-- The `k[G]`-linear isomorphism `k[G] ⊗ₖ k[Gⁿ] ≃ k[Gⁿ⁺¹]`, where the `k[G]`-module structure on
195+
the lefthand side is `tensor_product.left_module`, whilst that of the righthand side comes from
196+
`representation.as_module`. Allows us to use `basis.algebra_tensor_product` to get a `k[G]`-basis
197+
of the righthand side. -/
198+
def of_mul_action_basis_aux : (monoid_algebra k G ⊗[k] ((fin n → G) →₀ k)) ≃ₗ[monoid_algebra k G]
199+
(of_mul_action k G (fin (n + 1) → G)).as_module :=
200+
{ map_smul' := λ r x,
201+
begin
202+
rw [ring_hom.id_apply, linear_equiv.to_fun_eq_coe, ←linear_equiv.map_smul],
203+
congr' 1,
204+
refine x.induction_on _ (λ x y, _) (λ y z hy hz, _),
205+
{ simp only [smul_zero] },
206+
{ simp only [tensor_product.smul_tmul'],
207+
show (r * x) ⊗ₜ y = _,
208+
rw [←of_mul_action_self_smul_eq_mul, smul_tprod_one_as_module] },
209+
{ rw [smul_add, hz, hy, smul_add], }
210+
end, .. ((Rep.equivalence_Module_monoid_algebra.1).map_iso
211+
(equiv_tensor k G n).symm).to_linear_equiv }
212+
213+
/-- A `k[G]`-basis of `k[Gⁿ⁺¹]`, coming from the `k[G]`-linear isomorphism
214+
`k[G] ⊗ₖ k[Gⁿ] ≃ k[Gⁿ⁺¹].` -/
215+
def of_mul_action_basis :
216+
basis (fin n → G) (monoid_algebra k G) (of_mul_action k G (fin (n + 1) → G)).as_module :=
217+
@basis.map _ (monoid_algebra k G) (monoid_algebra k G ⊗[k] ((fin n → G) →₀ k))
218+
_ _ _ _ _ _ (@algebra.tensor_product.basis k _ (monoid_algebra k G) _ _ ((fin n → G) →₀ k) _ _
219+
(fin n → G) (⟨linear_equiv.refl k _⟩)) (of_mul_action_basis_aux k G n)
220+
221+
lemma of_mul_action_free :
222+
module.free (monoid_algebra k G) (of_mul_action k G (fin (n + 1) → G)).as_module :=
223+
module.free.of_basis (of_mul_action_basis k G n)
224+
147225
end group_cohomology.resolution

src/ring_theory/tensor_product.lean

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,6 @@ by rw [product_map, alg_hom.range_comp, map_range, map_sup, ←alg_hom.range_com
799799
lmul'_comp_include_right, alg_hom.id_comp, alg_hom.id_comp]
800800

801801
end
802-
803802
section
804803

805804
variables {R A A' B S : Type*}
@@ -814,7 +813,50 @@ and `g : B →ₐ[R] S` is an `A`-algebra homomorphism. -/
814813
..(product_map (f.restrict_scalars R) g).to_ring_hom }
815814

816815
end
816+
section basis
817+
818+
variables {k : Type*} [comm_ring k] (R : Type*) [ring R] [algebra k R] {M : Type*}
819+
[add_comm_monoid M] [module k M] {ι : Type*} (b : basis ι k M)
820+
821+
/-- Given a `k`-algebra `R` and a `k`-basis of `M,` this is a `k`-linear isomorphism
822+
`R ⊗[k] M ≃ (ι →₀ R)` (which is in fact `R`-linear). -/
823+
noncomputable def basis_aux : R ⊗[k] M ≃ₗ[k] (ι →₀ R) :=
824+
(_root_.tensor_product.congr (finsupp.linear_equiv.finsupp_unique k R punit).symm b.repr) ≪≫ₗ
825+
(finsupp_tensor_finsupp k R k punit ι).trans (finsupp.lcongr (equiv.unique_prod ι punit)
826+
(_root_.tensor_product.rid k R))
827+
828+
variables {R}
829+
830+
lemma basis_aux_tmul (r : R) (m : M) :
831+
basis_aux R b (r ⊗ₜ m) = r • (finsupp.map_range (algebra_map k R)
832+
(map_zero _) (b.repr m)) :=
833+
begin
834+
ext,
835+
simp [basis_aux, ←algebra.commutes, algebra.smul_def],
836+
end
837+
838+
lemma basis_aux_map_smul (r : R) (x : R ⊗[k] M) :
839+
basis_aux R b (r • x) = r • basis_aux R b x :=
840+
tensor_product.induction_on x (by simp) (λ x y, by simp only [tensor_product.smul_tmul',
841+
basis_aux_tmul, smul_assoc]) (λ x y hx hy, by simp [hx, hy])
842+
843+
variables (R)
844+
845+
/-- Given a `k`-algebra `R`, this is the `R`-basis of `R ⊗[k] M` induced by a `k`-basis of `M`. -/
846+
noncomputable def basis : basis ι R (R ⊗[k] M) :=
847+
{ repr := { map_smul' := basis_aux_map_smul b, .. basis_aux R b } }
848+
849+
variables {R}
850+
851+
@[simp] lemma basis_repr_tmul (r : R) (m : M) :
852+
(basis R b).repr (r ⊗ₜ m) = r • (finsupp.map_range (algebra_map k R) (map_zero _) (b.repr m)) :=
853+
basis_aux_tmul _ _ _
854+
855+
@[simp] lemma basis_repr_symm_apply (r : R) (i : ι) :
856+
(basis R b).repr.symm (finsupp.single i r) = r ⊗ₜ b.repr.symm (finsupp.single i 1) :=
857+
by simp [basis, equiv.unique_prod_symm_apply, basis_aux]
817858

859+
end basis
818860
end tensor_product
819861
end algebra
820862

0 commit comments

Comments
 (0)