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.

Instances For
    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
    @[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'
    @[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
    Instances For
      @[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
      Instances For
        @[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' := }
        Instances For
          @[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' := }
          Instances For
            @[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.
            Instances For
              @[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
              @[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)
              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
              Instances For
                @[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' := }
                Instances For
                  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' := }
                  Instances For
                    @[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' := }
                    Instances For
                      @[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
                      Instances For
                        @[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' := }
                        Instances For
                          @[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
                          Instances For
                            @[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.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.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' := }
                            Instances For
                              @[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
                              Instances For
                                @[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
                                Instances For
                                  @[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₃] [Monoid S] [DistribMulAction S M₂] [DistribMulAction 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
                                  Instances For
                                    @[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.
                                    Instances For
                                      @[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.
                                      Instances For
                                        @[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.
                                        Instances For
                                          @[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.
                                          Instances For
                                            @[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✝
                                            @[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✝
                                            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
                                            Instances For
                                              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.
                                              Instances For
                                                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
                                                Instances For
                                                  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
                                                  Instances For
                                                    @[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
                                                    Instances For
                                                      @[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.
                                                      Instances For
                                                        @[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' := }
                                                        Instances For
                                                          @[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
                                                          Instances For
                                                            @[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
                                                            Instances For
                                                              @[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
                                                              Instances For
                                                                @[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
                                                                @[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 + sFinset.filter (fun (s : Finset ι) => 2 s.card) Finset.univ, 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') = sFinset.filter (fun (s : Finset ι) => 2 s.card) Finset.univ, (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.
                                                                Instances For
                                                                  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' := }
                                                                  Instances For
                                                                    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
                                                                    Instances For