Documentation

Mathlib.LinearAlgebra.Multilinear.Basic

Multilinear maps #

We define multilinear maps as maps from ∀ (i : ι), M₁ i to M₂ which are linear in each coordinate. Here, M₁ i and M₂ are modules over a ring R, and ι is an arbitrary type (although some statements will require it to be a fintype). This space, denoted by MultilinearMap R M₁ M₂, inherits a module structure by pointwise addition and multiplication.

Main definitions #

See Mathlib.LinearAlgebra.Multilinear.Curry for the currying of multilinear maps.

Implementation notes #

Expressing that a map is linear along the i-th coordinate when all other coordinates are fixed can be done in two (equivalent) different ways:

The second way is more artificial as the value of m at i is not relevant, but it has the advantage of avoiding subtype inclusion issues. This is the definition we use, based on Function.update that allows to change the value of m at i.

Note that the use of Function.update requires a DecidableEq ι term to appear somewhere in the statement of MultilinearMap.map_update_add' and MultilinearMap.map_update_smul'. Three possible choices are:

  1. Requiring DecidableEq ι as an argument to MultilinearMap (as we did originally).
  2. Using Classical.decEq ι in the statement of map_add' and map_smul'.
  3. Quantifying over all possible DecidableEq ι instances in the statement of map_add' and map_smul'.

Option 1 works fine, but puts unnecessary constraints on the user (the zero map certainly does not need decidability). Option 2 looks great at first, but in the common case when ι = Fin n it introduces non-defeq decidability instance diamonds within the context of proving map_update_add' and map_update_smul', of the form Fin.decidableEq n = Classical.decEq (Fin n). Option 3 of course does something similar, but of the form Fin.decidableEq n = _inst, which is much easier to clean up since _inst is a free variable and so the equality can just be substituted.

structure MultilinearMap (R : Type uR) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Type (max (max uι v₁) v₂)

Multilinear maps over the ring R, from ∀ i, M₁ i to M₂ where M₁ i and M₂ are modules over R.

instance MultilinearMap.instFunLikeForall {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
FunLike (MultilinearMap R M₁ M₂) ((i : ι) → M₁ i) M₂
Equations
def MultilinearMap.mk' {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DecidableEq ι] (f : ((i : ι) → M₁ i)M₂) (h₁ : ∀ (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i), f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y) := by aesop) (h₂ : ∀ (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i), f (Function.update m i (c x)) = c f (Function.update m i x) := by aesop) :
MultilinearMap R M₁ M₂

Constructor for MultilinearMap R M₁ M₂ when the index type ι is already endowed with a DecidableEq instance.

Equations
  • MultilinearMap.mk' f h₁ h₂ = { toFun := f, map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.mk'_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DecidableEq ι] (f : ((i : ι) → M₁ i)M₂) (h₁ : ∀ (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i), f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y) := by aesop) (h₂ : ∀ (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i), f (Function.update m i (c x)) = c f (Function.update m i x) := by aesop) (a✝ : (i : ι) → M₁ i) :
(mk' f h₁ h₂) a✝ = f a✝
@[simp]
theorem MultilinearMap.toFun_eq_coe {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) :
f.toFun = f
@[simp]
theorem MultilinearMap.coe_mk {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : ((i : ι) → M₁ i)M₂) (h₁ : ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i), f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y)) (h₂ : ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i), f (Function.update m i (c x)) = c f (Function.update m i x)) :
{ toFun := f, map_update_add' := h₁, map_update_smul' := h₂ } = f
theorem MultilinearMap.congr_fun {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {f g : MultilinearMap R M₁ M₂} (h : f = g) (x : (i : ι) → M₁ i) :
f x = g x
theorem MultilinearMap.congr_arg {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) {x y : (i : ι) → M₁ i} (h : x = y) :
f x = f y
theorem MultilinearMap.coe_injective {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
theorem MultilinearMap.coe_inj {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {f g : MultilinearMap R M₁ M₂} :
f = g f = g
theorem MultilinearMap.ext {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {f f' : MultilinearMap R M₁ M₂} (H : ∀ (x : (i : ι) → M₁ i), f x = f' x) :
f = f'
theorem MultilinearMap.ext_iff {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {f f' : MultilinearMap R M₁ M₂} :
f = f' ∀ (x : (i : ι) → M₁ i), f x = f' x
@[simp]
theorem MultilinearMap.mk_coe {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (h₁ : ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i), f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y)) (h₂ : ∀ [inst : DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i), f (Function.update m i (c x)) = c f (Function.update m i x)) :
{ toFun := f, map_update_add' := h₁, map_update_smul' := h₂ } = f
@[simp]
theorem MultilinearMap.map_update_add {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i) :
f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y)
@[deprecated MultilinearMap.map_update_add (since := "2024-11-03")]
theorem MultilinearMap.map_add {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i) :
f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y)

Alias of MultilinearMap.map_update_add.

@[deprecated MultilinearMap.map_update_add (since := "2024-11-03")]
theorem MultilinearMap.map_add' {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i) :
f (Function.update m i (x + y)) = f (Function.update m i x) + f (Function.update m i y)

Alias of MultilinearMap.map_update_add.

@[simp]
theorem MultilinearMap.map_update_smul {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i) :
f (Function.update m i (c x)) = c f (Function.update m i x)

Earlier, this name was used by what is now called MultilinearMap.map_update_smul_left.

@[deprecated MultilinearMap.map_update_smul (since := "2024-11-03")]
theorem MultilinearMap.map_smul {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i) :
f (Function.update m i (c x)) = c f (Function.update m i x)

Alias of MultilinearMap.map_update_smul.


Earlier, this name was used by what is now called MultilinearMap.map_update_smul_left.

@[deprecated MultilinearMap.map_update_smul (since := "2024-11-03")]
theorem MultilinearMap.map_smul' {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i) :
f (Function.update m i (c x)) = c f (Function.update m i x)

Alias of MultilinearMap.map_update_smul.


Earlier, this name was used by what is now called MultilinearMap.map_update_smul_left.

theorem MultilinearMap.map_coord_zero {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) {m : (i : ι) → M₁ i} (i : ι) (h : m i = 0) :
f m = 0
@[simp]
theorem MultilinearMap.map_update_zero {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) :
f (Function.update m i 0) = 0
@[simp]
theorem MultilinearMap.map_zero {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [Nonempty ι] :
f 0 = 0
instance MultilinearMap.instAdd {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Add (MultilinearMap R M₁ M₂)
Equations
@[simp]
theorem MultilinearMap.add_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f f' : MultilinearMap R M₁ M₂) (m : (i : ι) → M₁ i) :
(f + f') m = f m + f' m
instance MultilinearMap.instZero {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Zero (MultilinearMap R M₁ M₂)
Equations
  • MultilinearMap.instZero = { zero := { toFun := fun (x : (i : ι) → M₁ i) => 0, map_update_add' := , map_update_smul' := } }
instance MultilinearMap.instInhabited {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Equations
@[simp]
theorem MultilinearMap.zero_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (m : (i : ι) → M₁ i) :
0 m = 0
instance MultilinearMap.instSMul {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DistribSMul S M₂] [SMulCommClass R S M₂] :
SMul S (MultilinearMap R M₁ M₂)
Equations
@[simp]
theorem MultilinearMap.smul_apply {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DistribSMul S M₂] [SMulCommClass R S M₂] (f : MultilinearMap R M₁ M₂) (c : S) (m : (i : ι) → M₁ i) :
(c f) m = c f m
theorem MultilinearMap.coe_smul {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DistribSMul S M₂] [SMulCommClass R S M₂] (c : S) (f : MultilinearMap R M₁ M₂) :
⇑(c f) = c f
instance MultilinearMap.addCommMonoid {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Equations
def MultilinearMap.coeAddMonoidHom {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
MultilinearMap R M₁ M₂ →+ ((i : ι) → M₁ i)M₂

Coercion of a multilinear map to a function as an additive monoid homomorphism.

Equations
@[simp]
theorem MultilinearMap.coeAddMonoidHom_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (a✝ : MultilinearMap R M₁ M₂) (a : (i : ι) → M₁ i) :
coeAddMonoidHom a✝ a = a✝ a
@[simp]
theorem MultilinearMap.coe_sum {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {α : Type u_1} (f : αMultilinearMap R M₁ M₂) (s : Finset α) :
(∑ as, f a) = as, (f a)
theorem MultilinearMap.sum_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {α : Type u_1} (f : αMultilinearMap R M₁ M₂) (m : (i : ι) → M₁ i) {s : Finset α} :
(∑ as, f a) m = as, (f a) m
def MultilinearMap.toLinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) :
M₁ i →ₗ[R] M₂

If f is a multilinear map, then f.toLinearMap m i is the linear map obtained by fixing all coordinates but i equal to those of m, and varying the i-th coordinate.

Equations
@[simp]
theorem MultilinearMap.toLinearMap_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x : M₁ i) :
(f.toLinearMap m i) x = f (Function.update m i x)
def MultilinearMap.prod {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (f : MultilinearMap R M₁ M₂) (g : MultilinearMap R M₁ M₃) :
MultilinearMap R M₁ (M₂ × M₃)

The cartesian product of two multilinear maps, as a multilinear map.

Equations
  • f.prod g = { toFun := fun (m : (i : ι) → M₁ i) => (f m, g m), map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.prod_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (f : MultilinearMap R M₁ M₂) (g : MultilinearMap R M₁ M₃) (m : (i : ι) → M₁ i) :
(f.prod g) m = (f m, g m)
def MultilinearMap.pi {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] {ι' : Type u_1} {M' : ι'Type u_2} [(i : ι') → AddCommMonoid (M' i)] [(i : ι') → Module R (M' i)] (f : (i : ι') → MultilinearMap R M₁ (M' i)) :
MultilinearMap R M₁ ((i : ι') → M' i)

Combine a family of multilinear maps with the same domain and codomains M' i into a multilinear map taking values in the space of functions ∀ i, M' i.

Equations
  • MultilinearMap.pi f = { toFun := fun (m : (i : ι) → M₁ i) (i : ι') => (f i) m, map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.pi_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] {ι' : Type u_1} {M' : ι'Type u_2} [(i : ι') → AddCommMonoid (M' i)] [(i : ι') → Module R (M' i)] (f : (i : ι') → MultilinearMap R M₁ (M' i)) (m : (i : ι) → M₁ i) (i : ι') :
(pi f) m i = (f i) m
def MultilinearMap.ofSubsingleton (R : Type uR) {ι : Type uι} (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] [Subsingleton ι] (i : ι) :
(M₂ →ₗ[R] M₃) MultilinearMap R (fun (x : ι) => M₂) M₃

Equivalence between linear maps M₂ →ₗ[R] M₃ and one-multilinear maps.

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.ofSubsingleton_apply_apply (R : Type uR) {ι : Type uι} (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] [Subsingleton ι] (i : ι) (f : M₂ →ₗ[R] M₃) (x : ιM₂) :
((ofSubsingleton R M₂ M₃ i) f) x = f (x i)
@[simp]
theorem MultilinearMap.ofSubsingleton_symm_apply_apply (R : Type uR) {ι : Type uι} (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] [Subsingleton ι] (i : ι) (f : MultilinearMap R (fun (x : ι) => M₂) M₃) (x : M₂) :
((ofSubsingleton R M₂ M₃ i).symm f) x = f fun (x_1 : ι) => x
def MultilinearMap.constOfIsEmpty (R : Type uR) {ι : Type uι} (M₁ : ιType v₁) {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [IsEmpty ι] (m : M₂) :
MultilinearMap R M₁ M₂

The constant map is multilinear when ι is empty.

Equations
@[simp]
theorem MultilinearMap.constOfIsEmpty_apply (R : Type uR) {ι : Type uι} (M₁ : ιType v₁) {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [IsEmpty ι] (m : M₂) :
(constOfIsEmpty R M₁ m) = Function.const ((i : ι) → M₁ i) m
def MultilinearMap.restr {R : Type uR} {M₂ : Type v₂} {M' : Type v'} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M'] [Module R M₂] [Module R M'] {k n : } (f : MultilinearMap R (fun (x : Fin n) => M') M₂) (s : Finset (Fin n)) (hk : s.card = k) (z : M') :
MultilinearMap R (fun (x : Fin k) => M') M₂

Given a multilinear map f on n variables (parameterized by Fin n) and a subset s of k of these variables, one gets a new multilinear map on Fin k by varying these variables, and fixing the other ones equal to a given value z. It is denoted by f.restr s hk z, where hk is a proof that the cardinality of s is k. The implicit identification between Fin k and s that we use is the canonical (increasing) bijection.

Equations
  • f.restr s hk z = { toFun := fun (v : Fin kM') => f fun (j : Fin n) => if h : j s then v ((s.orderIsoOfFin hk).symm j, h) else z, map_update_add' := , map_update_smul' := }
theorem MultilinearMap.cons_add {R : Type uR} {n : } {M : Fin n.succType v} {M₂ : Type v₂} [Semiring R] [(i : Fin n.succ) → AddCommMonoid (M i)] [AddCommMonoid M₂] [(i : Fin n.succ) → Module R (M i)] [Module R M₂] (f : MultilinearMap R M M₂) (m : (i : Fin n) → M i.succ) (x y : M 0) :
f (Fin.cons (x + y) m) = f (Fin.cons x m) + f (Fin.cons y m)

In the specific case of multilinear maps on spaces indexed by Fin (n+1), where one can build an element of ∀ (i : Fin (n+1)), M i using cons, one can express directly the additivity of a multilinear map along the first variable.

theorem MultilinearMap.cons_smul {R : Type uR} {n : } {M : Fin n.succType v} {M₂ : Type v₂} [Semiring R] [(i : Fin n.succ) → AddCommMonoid (M i)] [AddCommMonoid M₂] [(i : Fin n.succ) → Module R (M i)] [Module R M₂] (f : MultilinearMap R M M₂) (m : (i : Fin n) → M i.succ) (c : R) (x : M 0) :
f (Fin.cons (c x) m) = c f (Fin.cons x m)

In the specific case of multilinear maps on spaces indexed by Fin (n+1), where one can build an element of ∀ (i : Fin (n+1)), M i using cons, one can express directly the multiplicativity of a multilinear map along the first variable.

theorem MultilinearMap.snoc_add {R : Type uR} {n : } {M : Fin n.succType v} {M₂ : Type v₂} [Semiring R] [(i : Fin n.succ) → AddCommMonoid (M i)] [AddCommMonoid M₂] [(i : Fin n.succ) → Module R (M i)] [Module R M₂] (f : MultilinearMap R M M₂) (m : (i : Fin n) → M i.castSucc) (x y : M (Fin.last n)) :
f (Fin.snoc m (x + y)) = f (Fin.snoc m x) + f (Fin.snoc m y)

In the specific case of multilinear maps on spaces indexed by Fin (n+1), where one can build an element of ∀ (i : Fin (n+1)), M i using snoc, one can express directly the additivity of a multilinear map along the first variable.

theorem MultilinearMap.snoc_smul {R : Type uR} {n : } {M : Fin n.succType v} {M₂ : Type v₂} [Semiring R] [(i : Fin n.succ) → AddCommMonoid (M i)] [AddCommMonoid M₂] [(i : Fin n.succ) → Module R (M i)] [Module R M₂] (f : MultilinearMap R M M₂) (m : (i : Fin n) → M i.castSucc) (c : R) (x : M (Fin.last n)) :
f (Fin.snoc m (c x)) = c f (Fin.snoc m x)

In the specific case of multilinear maps on spaces indexed by Fin (n+1), where one can build an element of ∀ (i : Fin (n+1)), M i using cons, one can express directly the multiplicativity of a multilinear map along the first variable.

def MultilinearMap.compLinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (g : MultilinearMap R M₁' M₂) (f : (i : ι) → M₁ i →ₗ[R] M₁' i) :
MultilinearMap R M₁ M₂

If g is a multilinear map and f is a collection of linear maps, then g (f₁ m₁, ..., fₙ mₙ) is again a multilinear map, that we call g.compLinearMap f.

Equations
  • g.compLinearMap f = { toFun := fun (m : (i : ι) → M₁ i) => g fun (i : ι) => (f i) (m i), map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.compLinearMap_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (g : MultilinearMap R M₁' M₂) (f : (i : ι) → M₁ i →ₗ[R] M₁' i) (m : (i : ι) → M₁ i) :
(g.compLinearMap f) m = g fun (i : ι) => (f i) (m i)
theorem MultilinearMap.compLinearMap_assoc {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] {M₁'' : ιType u_2} [(i : ι) → AddCommMonoid (M₁'' i)] [(i : ι) → Module R (M₁'' i)] (g : MultilinearMap R M₁'' M₂) (f₁ : (i : ι) → M₁' i →ₗ[R] M₁'' i) (f₂ : (i : ι) → M₁ i →ₗ[R] M₁' i) :
(g.compLinearMap f₁).compLinearMap f₂ = g.compLinearMap fun (i : ι) => f₁ i ∘ₗ f₂ i

Composing a multilinear map twice with a linear map in each argument is the same as composing with their composition.

@[simp]
theorem MultilinearMap.zero_compLinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (f : (i : ι) → M₁ i →ₗ[R] M₁' i) :

Composing the zero multilinear map with a linear map in each argument.

@[simp]
theorem MultilinearMap.compLinearMap_id {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [Semiring R] [AddCommMonoid M₂] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (g : MultilinearMap R M₁' M₂) :
(g.compLinearMap fun (x : ι) => LinearMap.id) = g

Composing a multilinear map with the identity linear map in each argument.

theorem MultilinearMap.compLinearMap_injective {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (f : (i : ι) → M₁ i →ₗ[R] M₁' i) (hf : ∀ (i : ι), Function.Surjective (f i)) :
Function.Injective fun (g : MultilinearMap R M₁' M₂) => g.compLinearMap f

Composing with a family of surjective linear maps is injective.

theorem MultilinearMap.compLinearMap_inj {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (f : (i : ι) → M₁ i →ₗ[R] M₁' i) (hf : ∀ (i : ι), Function.Surjective (f i)) (g₁ g₂ : MultilinearMap R M₁' M₂) :
g₁.compLinearMap f = g₂.compLinearMap f g₁ = g₂
@[simp]
theorem MultilinearMap.comp_linearEquiv_eq_zero_iff {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (g : MultilinearMap R M₁' M₂) (f : (i : ι) → M₁ i ≃ₗ[R] M₁' i) :
(g.compLinearMap fun (i : ι) => (f i)) = 0 g = 0

Composing a multilinear map with a linear equiv on each argument gives the zero map if and only if the multilinear map is the zero map.

theorem MultilinearMap.map_piecewise_add {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m m' : (i : ι) → M₁ i) (t : Finset ι) :
f (t.piecewise (m + m') m') = st.powerset, f (s.piecewise m m')

If one adds to a vector m' another vector m, but only for coordinates in a finset t, then the image under a multilinear map f is the sum of f (s.piecewise m m') along all subsets s of t. This is mainly an auxiliary statement to prove the result when t = univ, given in map_add_univ, although it can be useful in its own right as it does not require the index set ι to be finite.

theorem MultilinearMap.map_add_univ {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] [Fintype ι] (m m' : (i : ι) → M₁ i) :
f (m + m') = s : Finset ι, f (s.piecewise m m')

Additivity of a multilinear map along all coordinates at the same time, writing f (m + m') as the sum of f (s.piecewise m m') over all sets s.

theorem MultilinearMap.map_sum_finset_aux {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) {α : ιType u_1} (g : (i : ι) → α iM₁ i) (A : (i : ι) → Finset (α i)) [DecidableEq ι] [Fintype ι] {n : } (h : i : ι, (A i).card = n) :
(f fun (i : ι) => jA i, g i j) = rFintype.piFinset A, f fun (i : ι) => g i (r i)

If f is multilinear, then f (Σ_{j₁ ∈ A₁} g₁ j₁, ..., Σ_{jₙ ∈ Aₙ} gₙ jₙ) is the sum of f (g₁ (r 1), ..., gₙ (r n)) where r ranges over all functions with r 1 ∈ A₁, ..., r n ∈ Aₙ. This follows from multilinearity by expanding successively with respect to each coordinate. Here, we give an auxiliary statement tailored for an inductive proof. Use instead map_sum_finset.

theorem MultilinearMap.map_sum_finset {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) {α : ιType u_1} (g : (i : ι) → α iM₁ i) (A : (i : ι) → Finset (α i)) [DecidableEq ι] [Fintype ι] :
(f fun (i : ι) => jA i, g i j) = rFintype.piFinset A, f fun (i : ι) => g i (r i)

If f is multilinear, then f (Σ_{j₁ ∈ A₁} g₁ j₁, ..., Σ_{jₙ ∈ Aₙ} gₙ jₙ) is the sum of f (g₁ (r 1), ..., gₙ (r n)) where r ranges over all functions with r 1 ∈ A₁, ..., r n ∈ Aₙ. This follows from multilinearity by expanding successively with respect to each coordinate.

theorem MultilinearMap.map_sum {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) {α : ιType u_1} (g : (i : ι) → α iM₁ i) [DecidableEq ι] [Fintype ι] [(i : ι) → Fintype (α i)] :
(f fun (i : ι) => j : α i, g i j) = r : (i : ι) → α i, f fun (i : ι) => g i (r i)

If f is multilinear, then f (Σ_{j₁} g₁ j₁, ..., Σ_{jₙ} gₙ jₙ) is the sum of f (g₁ (r 1), ..., gₙ (r n)) where r ranges over all functions r. This follows from multilinearity by expanding successively with respect to each coordinate.

theorem MultilinearMap.map_update_sum {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) {α : Type u_2} [DecidableEq ι] (t : Finset α) (i : ι) (g : αM₁ i) (m : (i : ι) → M₁ i) :
f (Function.update m i (∑ at, g a)) = at, f (Function.update m i (g a))
def MultilinearMap.codRestrict {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (p : Submodule R M₂) (h : ∀ (v : (i : ι) → M₁ i), f v p) :
MultilinearMap R M₁ p

Restrict the codomain of a multilinear map to a submodule.

This is the multilinear version of LinearMap.codRestrict.

Equations
  • f.codRestrict p h = { toFun := fun (v : (i : ι) → M₁ i) => f v, , map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.codRestrict_apply_coe {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (p : Submodule R M₂) (h : ∀ (v : (i : ι) → M₁ i), f v p) (v : (i : ι) → M₁ i) :
((f.codRestrict p h) v) = f v
def MultilinearMap.restrictScalars (R : Type uR) {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {A : Type u_1} [Semiring A] [SMul R A] [(i : ι) → Module A (M₁ i)] [Module A M₂] [∀ (i : ι), IsScalarTower R A (M₁ i)] [IsScalarTower R A M₂] (f : MultilinearMap A M₁ M₂) :
MultilinearMap R M₁ M₂

Reinterpret an A-multilinear map as an R-multilinear map, if A is an algebra over R and their actions on all involved modules agree with the action of R on A.

Equations
@[simp]
theorem MultilinearMap.coe_restrictScalars (R : Type uR) {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {A : Type u_1} [Semiring A] [SMul R A] [(i : ι) → Module A (M₁ i)] [Module A M₂] [∀ (i : ι), IsScalarTower R A (M₁ i)] [IsScalarTower R A M₂] (f : MultilinearMap A M₁ M₂) :
(restrictScalars R f) = f
def MultilinearMap.domDomCongr {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (m : MultilinearMap R (fun (x : ι₁) => M₂) M₃) :
MultilinearMap R (fun (x : ι₂) => M₂) M₃

Transfer the arguments to a map along an equivalence between argument indices.

The naming is derived from Finsupp.domCongr, noting that here the permutation applies to the domain of the domain.

Equations
  • MultilinearMap.domDomCongr σ m = { toFun := fun (v : ι₂M₂) => m fun (i : ι₁) => v (σ i), map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.domDomCongr_apply {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (m : MultilinearMap R (fun (x : ι₁) => M₂) M₃) (v : ι₂M₂) :
(domDomCongr σ m) v = m fun (i : ι₁) => v (σ i)
theorem MultilinearMap.domDomCongr_trans {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} {ι₃ : Type u_3} (σ₁ : ι₁ ι₂) (σ₂ : ι₂ ι₃) (m : MultilinearMap R (fun (x : ι₁) => M₂) M₃) :
domDomCongr (σ₁.trans σ₂) m = domDomCongr σ₂ (domDomCongr σ₁ m)
theorem MultilinearMap.domDomCongr_mul {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} (σ₁ σ₂ : Equiv.Perm ι₁) (m : MultilinearMap R (fun (x : ι₁) => M₂) M₃) :
domDomCongr (σ₂ * σ₁) m = domDomCongr σ₂ (domDomCongr σ₁ m)
def MultilinearMap.domDomCongrEquiv {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) :
MultilinearMap R (fun (x : ι₁) => M₂) M₃ ≃+ MultilinearMap R (fun (x : ι₂) => M₂) M₃

MultilinearMap.domDomCongr as an equivalence.

This is declared separately because it does not work with dot notation.

Equations
@[simp]
theorem MultilinearMap.domDomCongrEquiv_symm_apply {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (m : MultilinearMap R (fun (x : ι₂) => M₂) M₃) :
@[simp]
theorem MultilinearMap.domDomCongrEquiv_apply {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (m : MultilinearMap R (fun (x : ι₁) => M₂) M₃) :
@[simp]
theorem MultilinearMap.domDomCongr_eq_iff {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [Module R M₂] [Module R M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (f g : MultilinearMap R (fun (x : ι₁) => M₂) M₃) :
domDomCongr σ f = domDomCongr σ g f = g

The results of applying domDomCongr to two maps are equal if and only if those maps are.

If {a // P a} is a subtype of ι and if we fix an element z of (i : {a // ¬ P a}) → M₁ i, then a multilinear map on M₁ defines a multilinear map on the restriction of M₁ to {a // P a}, by fixing the arguments out of {a // P a} equal to the values of z.

theorem MultilinearMap.domDomRestrict_aux {ι : Sort u_2} [DecidableEq ι] (P : ιProp) [DecidablePred P] {M₁ : ιType u_1} [DecidableEq { a : ι // P a }] (x : (i : { a : ι // P a }) → M₁ i) (z : (i : { a : ι // ¬P a }) → M₁ i) (i : { a : ι // P a }) (c : M₁ i) :
(fun (j : ι) => if h : P j then Function.update x i c j, h else z j, h) = Function.update (fun (j : ι) => if h : P j then x j, h else z j, h) (↑i) c
theorem MultilinearMap.domDomRestrict_aux_right {ι : Sort u_2} [DecidableEq ι] (P : ιProp) [DecidablePred P] {M₁ : ιType u_1} [DecidableEq { a : ι // ¬P a }] (x : (i : { a : ι // P a }) → M₁ i) (z : (i : { a : ι // ¬P a }) → M₁ i) (i : { a : ι // ¬P a }) (c : M₁ i) :
(fun (j : ι) => if h : P j then x j, h else Function.update z i c j, h) = Function.update (fun (j : ι) => if h : P j then x j, h else z j, h) (↑i) c
def MultilinearMap.domDomRestrict {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (P : ιProp) [DecidablePred P] (z : (i : { a : ι // ¬P a }) → M₁ i) :
MultilinearMap R (fun (i : { a : ι // P a }) => M₁ i) M₂

Given a multilinear map f on (i : ι) → M i, a (decidable) predicate P on ι and an element z of (i : {a // ¬ P a}) → M₁ i, construct a multilinear map on (i : {a // P a}) → M₁ i) whose value at x is f evaluated at the vector with ith coordinate x i if P i and z i otherwise.

The naming is similar to MultilinearMap.domDomCongr: here we are applying the restriction to the domain of the domain.

For a linear map version, see MultilinearMap.domDomRestrictₗ.

Equations
  • f.domDomRestrict P z = { toFun := fun (x : (i : { a : ι // P a }) → M₁ i) => f fun (j : ι) => if h : P j then x j, h else z j, h, map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.domDomRestrict_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (P : ιProp) [DecidablePred P] (x : (i : { a : ι // P a }) → M₁ i) (z : (i : { a : ι // ¬P a }) → M₁ i) :
(f.domDomRestrict P z) x = f fun (j : ι) => if h : P j then x j, h else z j, h
def MultilinearMap.linearDeriv {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DecidableEq ι] [Fintype ι] (f : MultilinearMap R M₁ M₂) (x : (i : ι) → M₁ i) :
((i : ι) → M₁ i) →ₗ[R] M₂

The "derivative" of a multilinear map, as a linear map from (i : ι) → M₁ i to M₂. For continuous multilinear maps, this will indeed be the derivative.

Equations
@[simp]
theorem MultilinearMap.linearDeriv_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [DecidableEq ι] [Fintype ι] (f : MultilinearMap R M₁ M₂) (x y : (i : ι) → M₁ i) :
(f.linearDeriv x) y = i : ι, f (Function.update x i (y i))
def LinearMap.compMultilinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g : M₂ →ₗ[R] M₃) (f : MultilinearMap R M₁ M₂) :
MultilinearMap R M₁ M₃

Composing a multilinear map with a linear map gives again a multilinear map.

Equations
@[simp]
theorem LinearMap.coe_compMultilinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g : M₂ →ₗ[R] M₃) (f : MultilinearMap R M₁ M₂) :
(g.compMultilinearMap f) = g f
@[simp]
theorem LinearMap.compMultilinearMap_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g : M₂ →ₗ[R] M₃) (f : MultilinearMap R M₁ M₂) (m : (i : ι) → M₁ i) :
(g.compMultilinearMap f) m = g (f m)
@[simp]
theorem LinearMap.compMultilinearMap_zero {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g : M₂ →ₗ[R] M₃) :
@[simp]
theorem LinearMap.zero_compMultilinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (f : MultilinearMap R M₁ M₂) :
@[simp]
theorem LinearMap.compMultilinearMap_add {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g : M₂ →ₗ[R] M₃) (f₁ f₂ : MultilinearMap R M₁ M₂) :
@[simp]
theorem LinearMap.add_compMultilinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g₁ g₂ : M₂ →ₗ[R] M₃) (f : MultilinearMap R M₁ M₂) :
@[simp]
theorem LinearMap.compMultilinearMap_smul {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] [DistribSMul S M₂] [DistribSMul S M₃] [SMulCommClass R S M₂] [SMulCommClass R S M₃] [CompatibleSMul M₂ M₃ S R] (g : M₂ →ₗ[R] M₃) (s : S) (f : MultilinearMap R M₁ M₂) :
@[simp]
theorem LinearMap.smul_compMultilinearMap {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] [Monoid S] [DistribMulAction S M₃] [SMulCommClass R S M₃] (g : M₂ →ₗ[R] M₃) (s : S) (f : MultilinearMap R M₁ M₂) :
@[simp]
theorem LinearMap.subtype_compMultilinearMap_codRestrict {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (p : Submodule R M₂) (h : ∀ (v : (i : ι) → M₁ i), f v p) :

The multilinear version of LinearMap.subtype_comp_codRestrict

@[simp]
theorem LinearMap.compMultilinearMap_codRestrict {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [AddCommMonoid M₃] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Module R M₃] (g : M₂ →ₗ[R] M₃) (f : MultilinearMap R M₁ M₂) (p : Submodule R M₃) (h : ∀ (c : M₂), g c p) :

The multilinear version of LinearMap.comp_codRestrict

@[simp]
theorem LinearMap.compMultilinearMap_domDomCongr {R : Type uR} {M₂ : Type v₂} {M₃ : Type v₃} {M' : Type v'} [Semiring R] [AddCommMonoid M₂] [AddCommMonoid M₃] [AddCommMonoid M'] [Module R M₂] [Module R M₃] [Module R M'] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (g : M₂ →ₗ[R] M₃) (f : MultilinearMap R (fun (x : ι₁) => M') M₂) :
instance MultilinearMap.instDistribMulActionOfSMulCommClass {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Monoid S] [DistribMulAction S M₂] [Module R M₂] [SMulCommClass R S M₂] :
Equations
instance MultilinearMap.instModule {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] :
Module S (MultilinearMap R M₁ M₂)

The space of multilinear maps over an algebra over R is a module over R, for the pointwise addition and scalar multiplication.

Equations
instance MultilinearMap.instNoZeroSMulDivisors {R : Type uR} {S : Type uS} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] [NoZeroSMulDivisors S M₂] :
def LinearMap.compMultilinearMapₗ {R : Type uR} (S : Type uS) {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [AddCommMonoid M₃] [Module R M₃] [Semiring S] [Module S M₂] [Module S M₃] [SMulCommClass R S M₂] [SMulCommClass R S M₃] [CompatibleSMul M₂ M₃ S R] (g : M₂ →ₗ[R] M₃) :
MultilinearMap R M₁ M₂ →ₗ[S] MultilinearMap R M₁ M₃

LinearMap.compMultilinearMap as an S-linear map.

Equations
@[simp]
theorem LinearMap.compMultilinearMapₗ_apply {R : Type uR} (S : Type uS) {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} {M₃ : Type v₃} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [AddCommMonoid M₃] [Module R M₃] [Semiring S] [Module S M₂] [Module S M₃] [SMulCommClass R S M₂] [SMulCommClass R S M₃] [CompatibleSMul M₂ M₃ S R] (g : M₂ →ₗ[R] M₃) (f : MultilinearMap R M₁ M₂) :
def MultilinearMap.ofSubsingletonₗ (R : Type uR) (S : Type uS) {ι : Type uι} (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [AddCommMonoid M₃] [Module S M₃] [Module R M₃] [SMulCommClass R S M₃] [Subsingleton ι] (i : ι) :
(M₂ →ₗ[R] M₃) ≃ₗ[S] MultilinearMap R (fun (x : ι) => M₂) M₃

Linear equivalence between linear maps M₂ →ₗ[R] M₃ and one-multilinear maps MultilinearMap R (fun _ : ι ↦ M₂) M₃.

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.ofSubsingletonₗ_apply (R : Type uR) (S : Type uS) {ι : Type uι} (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [AddCommMonoid M₃] [Module S M₃] [Module R M₃] [SMulCommClass R S M₃] [Subsingleton ι] (i : ι) (a✝ : M₂ →ₗ[R] M₃) :
(ofSubsingletonₗ R S M₂ M₃ i) a✝ = (ofSubsingleton R M₂ M₃ i) a✝
@[simp]
theorem MultilinearMap.ofSubsingletonₗ_symm_apply (R : Type uR) (S : Type uS) {ι : Type uι} (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [AddCommMonoid M₃] [Module S M₃] [Module R M₃] [SMulCommClass R S M₃] [Subsingleton ι] (i : ι) (a✝ : MultilinearMap R (fun (x : ι) => M₂) M₃) :
(ofSubsingletonₗ R S M₂ M₃ i).symm a✝ = (ofSubsingleton R M₂ M₃ i).symm a✝
def MultilinearMap.domDomCongrLinearEquiv' (R : Type uR) (S : Type uS) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] {ι' : Type u_1} (σ : ι ι') :
MultilinearMap R M₁ M₂ ≃ₗ[S] MultilinearMap R (fun (i : ι') => M₁ (σ.symm i)) M₂

The dependent version of MultilinearMap.domDomCongrLinearEquiv.

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.domDomCongrLinearEquiv'_apply (R : Type uR) (S : Type uS) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] {ι' : Type u_1} (σ : ι ι') (f : MultilinearMap R M₁ M₂) :
(domDomCongrLinearEquiv' R S M₁ M₂ σ) f = { toFun := f (Equiv.piCongrLeft' M₁ σ).symm, map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.domDomCongrLinearEquiv'_symm_apply (R : Type uR) (S : Type uS) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] {ι' : Type u_1} (σ : ι ι') (f : MultilinearMap R (fun (i : ι') => M₁ (σ.symm i)) M₂) :
(domDomCongrLinearEquiv' R S M₁ M₂ σ).symm f = { toFun := f (Equiv.piCongrLeft' M₁ σ), map_update_add' := , map_update_smul' := }
def MultilinearMap.constLinearEquivOfIsEmpty (R : Type uR) (S : Type uS) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] [IsEmpty ι] :
M₂ ≃ₗ[S] MultilinearMap R M₁ M₂

The space of constant maps is equivalent to the space of maps that are multilinear with respect to an empty family.

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.constLinearEquivOfIsEmpty_apply (R : Type uR) (S : Type uS) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] [IsEmpty ι] (m : M₂) :
(constLinearEquivOfIsEmpty R S M₁ M₂) m = constOfIsEmpty R M₁ m
@[simp]
theorem MultilinearMap.constLinearEquivOfIsEmpty_symm_apply (R : Type uR) (S : Type uS) {ι : Type uι} (M₁ : ιType v₁) (M₂ : Type v₂) [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [(i : ι) → Module R (M₁ i)] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [Module S M₂] [SMulCommClass R S M₂] [IsEmpty ι] (f : MultilinearMap R M₁ M₂) :
(constLinearEquivOfIsEmpty R S M₁ M₂).symm f = f 0
def MultilinearMap.domDomCongrLinearEquiv (R : Type uR) (S : Type uS) (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [AddCommMonoid M₃] [Module S M₃] [Module R M₃] [SMulCommClass R S M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) :
MultilinearMap R (fun (x : ι₁) => M₂) M₃ ≃ₗ[S] MultilinearMap R (fun (x : ι₂) => M₂) M₃

MultilinearMap.domDomCongr as a LinearEquiv.

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.domDomCongrLinearEquiv_symm_apply (R : Type uR) (S : Type uS) (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [AddCommMonoid M₃] [Module S M₃] [Module R M₃] [SMulCommClass R S M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (a✝ : MultilinearMap R (fun (x : ι₂) => M₂) M₃) :
(domDomCongrLinearEquiv R S M₂ M₃ σ).symm a✝ = (domDomCongrEquiv σ).invFun a✝
@[simp]
theorem MultilinearMap.domDomCongrLinearEquiv_apply (R : Type uR) (S : Type uS) (M₂ : Type v₂) (M₃ : Type v₃) [Semiring R] [AddCommMonoid M₂] [Module R M₂] [Semiring S] [AddCommMonoid M₃] [Module S M₃] [Module R M₃] [SMulCommClass R S M₃] {ι₁ : Type u_1} {ι₂ : Type u_2} (σ : ι₁ ι₂) (a✝ : MultilinearMap R (fun (x : ι₁) => M₂) M₃) :
(domDomCongrLinearEquiv R S M₂ M₃ σ) a✝ = (domDomCongrEquiv σ).toFun a✝
def MultilinearMap.domDomRestrictₗ {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (P : ιProp) [DecidablePred P] :
MultilinearMap R (fun (i : { a : ι // ¬P a }) => M₁ i) (MultilinearMap R (fun (i : { a : ι // P a }) => M₁ i) M₂)

Given a predicate P, one may associate to a multilinear map f a multilinear map from the elements satisfying P to the multilinear maps on elements not satisfying P. In other words, splitting the variables into two subsets one gets a multilinear map into multilinear maps. This is a linear map version of the function MultilinearMap.domDomRestrict.

Equations
theorem MultilinearMap.iteratedFDeriv_aux {ι : Type u_4} {M₁ : ιType u_2} {α : Type u_3} [DecidableEq α] (s : Set ι) [DecidableEq { x : ι // x s }] (e : α s) (m : α(i : ι) → M₁ i) (a : α) (z : (i : ι) → M₁ i) :
(fun (i : s) => Function.update m a z (e.symm i) i) = fun (i : s) => Function.update (fun (j : s) => m (e.symm j) j) (e a) (z (e a)) i
noncomputable def MultilinearMap.iteratedFDerivComponent {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {α : Type u_2} (f : MultilinearMap R M₁ M₂) {s : Set ι} (e : α s) [DecidablePred fun (x : ι) => x s] :
MultilinearMap R (fun (i : { a : ι // as }) => M₁ i) (MultilinearMap R (fun (x : α) => (i : ι) → M₁ i) M₂)

One of the components of the iterated derivative of a multilinear map. Given a bijection e between a type α (typically Fin k) and a subset s of ι, this component is a multilinear map of k vectors v₁, ..., vₖ, mapping them to f (x₁, (v_{e.symm 2})₂, x₃, ...), where at indices i in s one uses the i-th coordinate of the vector v_{e.symm i} and otherwise one uses the i-th coordinate of a reference vector x. This is multilinear in the components of x outside of s, and in the v_j.

Equations
  • One or more equations did not get rendered due to their size.
noncomputable def MultilinearMap.iteratedFDeriv {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Fintype ι] (f : MultilinearMap R M₁ M₂) (k : ) (x : (i : ι) → M₁ i) :
MultilinearMap R (fun (x : Fin k) => (i : ι) → M₁ i) M₂

The k-th iterated derivative of a multilinear map f at the point x. It is a multilinear map of k vectors v₁, ..., vₖ (with the same type as x), mapping them to ∑ f (x₁, (v_{i₁})₂, x₃, ...), where at each index j one uses either xⱼ or one of the (vᵢ)ⱼ, and each vᵢ has to be used exactly once. The sum is parameterized by the embeddings of Fin k in the index type ι (or, equivalently, by the subsets s of ι of cardinality k and then the bijections between Fin k and s).

For the continuous version, see ContinuousMultilinearMap.iteratedFDeriv.

Equations
def MultilinearMap.compLinearMapₗ {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (f : (i : ι) → M₁ i →ₗ[R] M₁' i) :
MultilinearMap R M₁' M₂ →ₗ[R] MultilinearMap R M₁ M₂

If f is a collection of linear maps, then the construction MultilinearMap.compLinearMap sending a multilinear map g to g (f₁ ⬝ , ..., fₙ ⬝ ) is linear in g.

Equations
@[simp]
theorem MultilinearMap.compLinearMapₗ_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (f : (i : ι) → M₁ i →ₗ[R] M₁' i) (g : MultilinearMap R M₁' M₂) :
def MultilinearMap.compLinearMapMultilinear {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] :
MultilinearMap R (fun (i : ι) => M₁ i →ₗ[R] M₁' i) (MultilinearMap R M₁' M₂ →ₗ[R] MultilinearMap R M₁ M₂)

If f is a collection of linear maps, then the construction MultilinearMap.compLinearMap sending a multilinear map g to g (f₁ ⬝ , ..., fₙ ⬝ ) is linear in g and multilinear in f₁, ..., fₙ.

Equations
@[simp]
theorem MultilinearMap.compLinearMapMultilinear_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (f : (i : ι) → M₁ i →ₗ[R] M₁' i) :
def MultilinearMap.piLinearMap {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] :
MultilinearMap R M₁' M₂ →ₗ[R] MultilinearMap R (fun (i : ι) => M₁ i →ₗ[R] M₁' i) (MultilinearMap R M₁ M₂)

Let M₁ᵢ and M₁ᵢ' be two families of R-modules and M₂ an R-module. Let us denote Π i, M₁ᵢ and Π i, M₁ᵢ' by M and M' respectively. If g is a multilinear map M' → M₂, then g can be reinterpreted as a multilinear map from Π i, M₁ᵢ ⟶ M₁ᵢ' to M ⟶ M₂ via (fᵢ) ↦ v ↦ g(fᵢ vᵢ).

Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.piLinearMap_apply_apply_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] {M₁' : ιType u_1} [(i : ι) → AddCommMonoid (M₁' i)] [(i : ι) → Module R (M₁' i)] (g : MultilinearMap R M₁' M₂) (a✝ : (i : ι) → (fun (i : ι) => M₁ i →ₗ[R] M₁' i) i) (m : (i : ι) → M₁ i) :
((piLinearMap g) a✝) m = g fun (i : ι) => (a✝ i) (m i)
theorem MultilinearMap.map_piecewise_smul {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (c : ιR) (m : (i : ι) → M₁ i) (s : Finset ι) :
f (s.piecewise (fun (i : ι) => c i m i) m) = (∏ is, c i) f m

If one multiplies by c i the coordinates in a finset s, then the image under a multilinear map is multiplied by ∏ i ∈ s, c i. This is mainly an auxiliary statement to prove the result when s = univ, given in map_smul_univ, although it can be useful in its own right as it does not require the index set ι to be finite.

theorem MultilinearMap.map_smul_univ {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [Fintype ι] (c : ιR) (m : (i : ι) → M₁ i) :
(f fun (i : ι) => c i m i) = (∏ i : ι, c i) f m

Multiplicativity of a multilinear map along all coordinates at the same time, writing f (fun i => c i • m i) as (∏ i, c i) • f m.

@[simp]
theorem MultilinearMap.map_update_smul_left {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] [Fintype ι] (m : (i : ι) → M₁ i) (i : ι) (c : R) (x : M₁ i) :
f (Function.update (c m) i x) = c ^ (Fintype.card ι - 1) f (Function.update m i x)
def MultilinearMap.mkPiAlgebra (R : Type uR) (ι : Type uι) [CommSemiring R] (A : Type u_1) [CommSemiring A] [Algebra R A] [Fintype ι] :
MultilinearMap R (fun (x : ι) => A) A

Given an R-algebra A, mkPiAlgebra is the multilinear map on A^ι associating to m the product of all the m i.

See also MultilinearMap.mkPiAlgebraFin for a version that works with a non-commutative algebra A but requires ι = Fin n.

Equations
  • MultilinearMap.mkPiAlgebra R ι A = { toFun := fun (m : ιA) => i : ι, m i, map_update_add' := , map_update_smul' := }
@[simp]
theorem MultilinearMap.mkPiAlgebra_apply {R : Type uR} {ι : Type uι} [CommSemiring R] {A : Type u_1} [CommSemiring A] [Algebra R A] [Fintype ι] (m : ιA) :
(MultilinearMap.mkPiAlgebra R ι A) m = i : ι, m i
def MultilinearMap.mkPiAlgebraFin (R : Type uR) (n : ) [CommSemiring R] (A : Type u_1) [Semiring A] [Algebra R A] :
MultilinearMap R (fun (x : Fin n) => A) A

Given an R-algebra A, mkPiAlgebraFin is the multilinear map on A^n associating to m the product of all the m i.

See also MultilinearMap.mkPiAlgebra for a version that assumes [CommSemiring A] but works for A^ι with any finite type ι.

Equations
@[simp]
theorem MultilinearMap.mkPiAlgebraFin_apply {R : Type uR} {n : } [CommSemiring R] {A : Type u_1} [Semiring A] [Algebra R A] (m : Fin nA) :
theorem MultilinearMap.mkPiAlgebraFin_apply_const {R : Type uR} {n : } [CommSemiring R] {A : Type u_1} [Semiring A] [Algebra R A] (a : A) :
((MultilinearMap.mkPiAlgebraFin R n A) fun (x : Fin n) => a) = a ^ n
def MultilinearMap.smulRight {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ R) (z : M₂) :
MultilinearMap R M₁ M₂

Given an R-multilinear map f taking values in R, f.smulRight z is the map sending m to f m • z.

Equations
@[simp]
theorem MultilinearMap.smulRight_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [CommSemiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ R) (z : M₂) (m : (i : ι) → M₁ i) :
(f.smulRight z) m = f m z
def MultilinearMap.mkPiRing (R : Type uR) (ι : Type uι) {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] (z : M₂) :
MultilinearMap R (fun (x : ι) => R) M₂

The canonical multilinear map on R^ι when ι is finite, associating to m the product of all the m i (multiplied by a fixed reference element z in the target module). See also mkPiAlgebra for a more general version.

Equations
@[simp]
theorem MultilinearMap.mkPiRing_apply {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] (z : M₂) (m : ιR) :
(MultilinearMap.mkPiRing R ι z) m = (∏ i : ι, m i) z
theorem MultilinearMap.mkPiRing_apply_one_eq_self {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] (f : MultilinearMap R (fun (x : ι) => R) M₂) :
MultilinearMap.mkPiRing R ι (f fun (x : ι) => 1) = f
theorem MultilinearMap.mkPiRing_eq_iff {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] {z₁ z₂ : M₂} :
MultilinearMap.mkPiRing R ι z₁ = MultilinearMap.mkPiRing R ι z₂ z₁ = z₂
theorem MultilinearMap.mkPiRing_zero {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] :
theorem MultilinearMap.mkPiRing_eq_zero_iff {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] (z : M₂) :
instance MultilinearMap.instNeg {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Neg (MultilinearMap R M₁ M₂)
Equations
@[simp]
theorem MultilinearMap.neg_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) (m : (i : ι) → M₁ i) :
(-f) m = -f m
instance MultilinearMap.instSub {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Sub (MultilinearMap R M₁ M₂)
Equations
@[simp]
theorem MultilinearMap.sub_apply {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f g : MultilinearMap R M₁ M₂) (m : (i : ι) → M₁ i) :
(f - g) m = f m - g m
instance MultilinearMap.instAddCommGroup {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] :
Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem MultilinearMap.map_update_neg {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x : M₁ i) :
f (Function.update m i (-x)) = -f (Function.update m i x)
@[deprecated MultilinearMap.map_update_neg (since := "2024-11-03")]
theorem MultilinearMap.map_neg {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x : M₁ i) :
f (Function.update m i (-x)) = -f (Function.update m i x)

Alias of MultilinearMap.map_update_neg.

@[simp]
theorem MultilinearMap.map_update_sub {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i) :
f (Function.update m i (x - y)) = f (Function.update m i x) - f (Function.update m i y)
@[deprecated MultilinearMap.map_update_sub (since := "2024-11-03")]
theorem MultilinearMap.map_sub {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (m : (i : ι) → M₁ i) (i : ι) (x y : M₁ i) :
f (Function.update m i (x - y)) = f (Function.update m i x) - f (Function.update m i y)

Alias of MultilinearMap.map_update_sub.

theorem MultilinearMap.map_update {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] (x : (i : ι) → M₁ i) (i : ι) (v : M₁ i) :
f (Function.update x i v) = f x - f (Function.update x i (x i - v))
theorem MultilinearMap.map_sub_map_piecewise {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [LinearOrder ι] (a b : (i : ι) → M₁ i) (s : Finset ι) :
f a - f (s.piecewise b a) = is, f fun (j : ι) => if j sj < i then a j else if i = j then a j - b j else b j
theorem MultilinearMap.map_piecewise_sub_map_piecewise {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [LinearOrder ι] (a b v : (i : ι) → M₁ i) (s : Finset ι) :
f (s.piecewise a v) - f (s.piecewise b v) = is, f fun (j : ι) => if j s then if j < i then a j else if j = i then a j - b j else b j else v j

This calculates the differences between the values of a multilinear map at two arguments that differ on a finset s of ι. It requires a linear order on ι in order to express the result.

theorem MultilinearMap.map_add_eq_map_add_linearDeriv_add {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] [Fintype ι] (x h : (i : ι) → M₁ i) :
f (x + h) = f x + (f.linearDeriv x) h + s{s : Finset ι | 2 s.card}, f (s.piecewise h x)
theorem MultilinearMap.map_add_sub_map_add_sub_linearDeriv {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Semiring R] [(i : ι) → AddCommGroup (M₁ i)] [AddCommGroup M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] (f : MultilinearMap R M₁ M₂) [DecidableEq ι] [Fintype ι] (x h h' : (i : ι) → M₁ i) :
f (x + h) - f (x + h') - (f.linearDeriv x) (h - h') = s{s : Finset ι | 2 s.card}, (f (s.piecewise h x) - f (s.piecewise h' x))

This expresses the difference between the values of a multilinear map at two points "close to x" in terms of the "derivative" of the multilinear map at x and of "second-order" terms.

def MultilinearMap.piRingEquiv {R : Type uR} {ι : Type uι} {M₂ : Type v₂} [CommSemiring R] [AddCommMonoid M₂] [Module R M₂] [Fintype ι] :
M₂ ≃ₗ[R] MultilinearMap R (fun (x : ι) => R) M₂

When ι is finite, multilinear maps on R^ι with values in M₂ are in bijection with M₂, as such a multilinear map is completely determined by its value on the constant vector made of ones. We register this bijection as a linear equivalence in MultilinearMap.piRingEquiv.

Equations
  • One or more equations did not get rendered due to their size.
def MultilinearMap.map {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Ring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Nonempty ι] (f : MultilinearMap R M₁ M₂) (p : (i : ι) → Submodule R (M₁ i)) :

The pushforward of an indexed collection of submodule p i ⊆ M₁ i by f : M₁ → M₂.

Note that this is not a submodule - it is not closed under addition.

Equations
  • f.map p = { carrier := f '' {v : (i : ι) → M₁ i | ∀ (i : ι), v i p i}, smul_mem' := }
theorem MultilinearMap.map_nonempty {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Ring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Nonempty ι] (f : MultilinearMap R M₁ M₂) (p : (i : ι) → Submodule R (M₁ i)) :
(↑(f.map p)).Nonempty

The map is always nonempty. This lemma is needed to apply SubMulAction.zero_mem.

def MultilinearMap.range {R : Type uR} {ι : Type uι} {M₁ : ιType v₁} {M₂ : Type v₂} [Ring R] [(i : ι) → AddCommMonoid (M₁ i)] [AddCommMonoid M₂] [(i : ι) → Module R (M₁ i)] [Module R M₂] [Nonempty ι] (f : MultilinearMap R M₁ M₂) :

The range of a multilinear map, closed under scalar multiplication.

Equations