Zulip Chat Archive
Stream: Is there code for X?
Topic: The tensor product of two multilinear maps is a multiline...
Eric Wieser (Dec 01 2020 at 20:09):
Is there an equiv between the tensor product of two multilinear maps and the map over the tensor product of the inputs?
Reid Barton (Dec 01 2020 at 20:27):
I can't parse this--an equiv should be between two types but neither side seems to be a type.
Eric Wieser (Dec 01 2020 at 21:18):
I'll paste a prototype once I've worked out how to summon the instances I need to write it
Eric Wieser (Dec 01 2020 at 21:21):
The short version is (multilinear_map R M M' ⊗[R] multilinear_map R N N') ≃ multilinear_map R (λ (i : ι₁ ⊕ ι₂), i.elim M N) (M' ⊗[R] N')
Eric Wieser (Dec 01 2020 at 21:30):
The long version is:
import linear_algebra.tensor_product
import linear_algebra.multilinear
open_locale tensor_product
instance sum.elim.add_comm_monoid {ι₁ ι₂ : Type}
{M : ι₁ → Type*} [∀ i, add_comm_monoid (M i)]
{N : ι₂ → Type*} [∀ i, add_comm_monoid (N i)]
(i : ι₁ ⊕ ι₂)
: add_comm_monoid (i.elim M N) := by cases i; dsimp; apply_instance
instance sum.elim.semimodule {ι₁ ι₂ : Type} [decidable_eq ι₁] [decidable_eq ι₂]
(R : Type*) [semiring R]
{M : ι₁ → Type*} [∀ i, add_comm_monoid (M i)] [∀ i, semimodule R (M i)]
{N : ι₂ → Type*} [∀ i, add_comm_monoid (N i)] [∀ i, semimodule R (N i)]
(i : ι₁ ⊕ ι₂)
: semimodule R (i.elim M N) := by cases i; dsimp; apply_instance
def multilinear.tmul_aux {ι₁ ι₂ : Type} [decidable_eq ι₁] [decidable_eq ι₂]
(R : Type*) [comm_semiring R]
{M : ι₁ → Type*} [∀ i, add_comm_monoid (M i)] [∀ i, semimodule R (M i)]
{N : ι₂ → Type*} [∀ i, add_comm_monoid (N i)] [∀ i, semimodule R (N i)]
{M' : Type*} [add_comm_monoid M'] [semimodule R M']
{N' : Type*} [add_comm_monoid N'] [semimodule R N']
(a : multilinear_map R M M') (b : multilinear_map R N N') :
multilinear_map R (sum.elim M N) (M' ⊗[R] N')
:=
{ to_fun := λ v, a (λ i, v (sum.inl i)) ⊗ₜ b (λ i, v (sum.inr i)),
map_add' := sorry,
map_smul' := sorry }
def multilinear.tmul {ι₁ ι₂ : Type} [decidable_eq ι₁] [decidable_eq ι₂]
(R : Type*) [comm_semiring R]
{M : ι₁ → Type*} [∀ i, add_comm_monoid (M i)] [∀ i, semimodule R (M i)]
{N : ι₂ → Type*} [∀ i, add_comm_monoid (N i)] [∀ i, semimodule R (N i)]
{M' : Type*} [add_comm_monoid M'] [semimodule R M']
{N' : Type*} [add_comm_monoid N'] [semimodule R N'] :
(multilinear_map R M M' ⊗[R] multilinear_map R N N') ≃ₗ[R]
multilinear_map R (sum.elim M N) (M' ⊗[R] N')
:=
{ to_fun := λ m,
{ to_fun := multilinear.tmul_aux R sorry sorry, -- split up the tensor product
map_add' := sorry,
map_smul' := sorry },
inv_fun := sorry,
left_inv := sorry,
right_inv := sorry,
map_add' := sorry,
map_smul' := sorry, }
Eric Wieser (Dec 01 2020 at 21:30):
This is way overgeneralized for what I actually need, but maybe bits of it already exist
Reid Barton (Dec 01 2020 at 22:02):
There is a map in the ->
direction but in general it isn't an isomorphism
Eric Wieser (Dec 01 2020 at 22:06):
Ok, guess I overgeneralized. I only care about tmul_aux really.
Eric Wieser (Dec 01 2020 at 22:07):
Which I think I can unsorry, but I wanted to check it doesn't exist somewhere
Eric Wieser (Dec 02 2020 at 09:42):
Here's the full sorry-free definition of tmux_aux
(now multilinear_map.of_tmul
):
Edit: #5179 so this doesn't get lost.
Last updated: Dec 20 2023 at 11:08 UTC