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

Commit 6288eed

Browse files
committed
feat(linear_algebra/alternating): Add alternatization of multilinear_map (#5187)
This adds: * `def multilinear_map.alternatize` * `lemma alternating_map.to_multilinear_map_alternize`
1 parent dbdba55 commit 6288eed

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

src/linear_algebra/alternating.lean

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,71 @@ lemma map_congr_perm [fintype ι] (σ : equiv.perm ι) :
237237
by { rw [g.map_perm, smul_smul], simp }
238238

239239
end alternating_map
240+
241+
open_locale big_operators
242+
243+
namespace multilinear_map
244+
245+
open equiv
246+
247+
variables [fintype ι]
248+
249+
private lemma alternization_map_eq_zero_of_eq_aux
250+
(m : multilinear_map R (λ i : ι, M) L)
251+
(v : ι → M) (i j : ι) (i_ne_j : i ≠ j) (hv : v i = v j) :
252+
∑ (σ : perm ι), (σ.sign : ℤ) • m.dom_dom_congr σ v = 0 :=
253+
finset.sum_involution
254+
(λ σ _, swap i j * σ)
255+
(λ σ _, begin
256+
convert add_right_neg (↑σ.sign • m.dom_dom_congr σ v),
257+
rw [perm.sign_mul, perm.sign_swap i_ne_j, ←neg_smul,
258+
multilinear_map.dom_dom_congr_apply, multilinear_map.dom_dom_congr_apply],
259+
congr' 2,
260+
{ simp },
261+
{ ext, simp [apply_swap_eq_self hv] },
262+
end)
263+
(λ σ _ _, (not_congr swap_mul_eq_iff).mpr i_ne_j)
264+
(λ σ _, finset.mem_univ _)
265+
(λ σ _, swap_mul_involutive i j σ)
266+
267+
/-- Produce an `alternating_map` out of a `multilinear_map`, by summing over all argument
268+
permutations. -/
269+
def alternatization : multilinear_map R (λ i : ι, M) L →+ alternating_map R M L ι :=
270+
{ to_fun := λ m,
271+
{ to_fun := λ v, ∑ (σ : perm ι), (σ.sign : ℤ) • m.dom_dom_congr σ v,
272+
map_add' := λ v i a b, by simp_rw [←finset.sum_add_distrib, multilinear_map.map_add, smul_add],
273+
map_smul' := λ v i c a, by simp_rw [finset.smul_sum, multilinear_map.map_smul, smul_comm],
274+
map_eq_zero_of_eq' := λ v i j hvij hij, alternization_map_eq_zero_of_eq_aux m v i j hij hvij },
275+
map_add' := λ a b, begin
276+
ext,
277+
simp only [
278+
finset.sum_add_distrib, smul_add, add_apply, dom_dom_congr_apply, alternating_map.add_apply,
279+
alternating_map.coe_mk],
280+
end,
281+
map_zero' := begin
282+
ext,
283+
simp only [
284+
dom_dom_congr_apply, alternating_map.zero_apply, finset.sum_const_zero, smul_zero,
285+
alternating_map.coe_mk, zero_apply]
286+
end }
287+
288+
lemma alternatization_apply (m : multilinear_map R (λ i : ι, M) L) (v : ι → M) :
289+
alternatization m v = ∑ (σ : perm ι), (σ.sign : ℤ) • m.dom_dom_congr σ v := rfl
290+
291+
end multilinear_map
292+
293+
namespace alternating_map
294+
295+
/-- Alternatizing a multilinear map that is already alternating results in a scale factor of `n!`,
296+
where `n` is the number of inputs. -/
297+
lemma to_multilinear_map_alternization [fintype ι] (a : alternating_map R M L ι) :
298+
a.to_multilinear_map.alternatization = nat.factorial (fintype.card ι) • a :=
299+
begin
300+
ext,
301+
simp only [multilinear_map.alternatization_apply, map_perm, smul_smul, ←nat.smul_def, coe_mk,
302+
smul_apply, add_monoid_hom.coe_mk, finset.sum_const, coe_multilinear_map, one_smul,
303+
multilinear_map.dom_dom_congr_apply, int.units_coe_mul_self, to_multilinear_map_eq_coe,
304+
finset.card_univ, fintype.card_perm],
305+
end
306+
307+
end alternating_map

0 commit comments

Comments
 (0)