Documentation

Mathlib.Algebra.BigOperators.Fin

Big operators and Fin #

Some results about products and sums over the type Fin.

The most important results are the induction formulas Fin.prod_univ_castSucc and Fin.prod_univ_succ, and the formula Fin.prod_const for the product of a constant function. These results have variants for sums instead of products.

Main declarations #

theorem Finset.prod_range {β : Type u_2} [CommMonoid β] {n : ℕ} (f : ℕ → β) :
∏ i ∈ range n, f i = ∏ i : Fin n, f ↑i
theorem Finset.sum_range {β : Type u_2} [AddCommMonoid β] {n : ℕ} (f : ℕ → β) :
∑ i ∈ range n, f i = ∑ i : Fin n, f ↑i
theorem Fin.prod_ofFn {β : Type u_2} [CommMonoid β] {n : ℕ} (f : Fin n → β) :
(List.ofFn f).prod = ∏ i : Fin n, f i
theorem Fin.sum_ofFn {β : Type u_2} [AddCommMonoid β] {n : ℕ} (f : Fin n → β) :
(List.ofFn f).sum = ∑ i : Fin n, f i
theorem Fin.prod_univ_def {β : Type u_2} [CommMonoid β] {n : ℕ} (f : Fin n → β) :
∏ i : Fin n, f i = (List.map f (List.finRange n)).prod
theorem Fin.sum_univ_def {β : Type u_2} [AddCommMonoid β] {n : ℕ} (f : Fin n → β) :
∑ i : Fin n, f i = (List.map f (List.finRange n)).sum
theorem Fin.prod_univ_zero {β : Type u_2} [CommMonoid β] (f : Fin 0 → β) :
∏ i : Fin 0, f i = 1

A product of a function f : Fin 0 → β is 1 because Fin 0 is empty

theorem Fin.sum_univ_zero {β : Type u_2} [AddCommMonoid β] (f : Fin 0 → β) :
∑ i : Fin 0, f i = 0

A sum of a function f : Fin 0 → β is 0 because Fin 0 is empty

theorem Fin.prod_univ_succAbove {β : Type u_2} [CommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) (x : Fin (n + 1)) :
∏ i : Fin (n + 1), f i = f x * ∏ i : Fin n, f (x.succAbove i)

A product of a function f : Fin (n + 1) → β over all Fin (n + 1) is the product of f x, for some x : Fin (n + 1) times the remaining product

theorem Fin.sum_univ_succAbove {β : Type u_2} [AddCommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) (x : Fin (n + 1)) :
∑ i : Fin (n + 1), f i = f x + ∑ i : Fin n, f (x.succAbove i)

A sum of a function f : Fin (n + 1) → β over all Fin (n + 1) is the sum of f x, for some x : Fin (n + 1) plus the remaining sum

theorem Fin.prod_univ_succ {β : Type u_2} [CommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) :
∏ i : Fin (n + 1), f i = f 0 * ∏ i : Fin n, f i.succ

A product of a function f : Fin (n + 1) → β over all Fin (n + 1) is the product of f 0 plus the remaining product

theorem Fin.sum_univ_succ {β : Type u_2} [AddCommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) :
∑ i : Fin (n + 1), f i = f 0 + ∑ i : Fin n, f i.succ

A sum of a function f : Fin (n + 1) → β over all Fin (n + 1) is the sum of f 0 plus the remaining sum

theorem Fin.prod_univ_castSucc {β : Type u_2} [CommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) :
∏ i : Fin (n + 1), f i = (∏ i : Fin n, f i.castSucc) * f (last n)

A product of a function f : Fin (n + 1) → β over all Fin (n + 1) is the product of f (Fin.last n) plus the remaining product

theorem Fin.sum_univ_castSucc {β : Type u_2} [AddCommMonoid β] {n : ℕ} (f : Fin (n + 1) → β) :
∑ i : Fin (n + 1), f i = ∑ i : Fin n, f i.castSucc + f (last n)

A sum of a function f : Fin (n + 1) → β over all Fin (n + 1) is the sum of f (Fin.last n) plus the remaining sum

@[simp]
theorem Fin.prod_univ_get {α : Type u_1} [CommMonoid α] (l : List α) :
∏ i : Fin l.length, l[↑i] = l.prod
@[simp]
theorem Fin.sum_univ_get {α : Type u_1} [AddCommMonoid α] (l : List α) :
∑ i : Fin l.length, l[↑i] = l.sum
@[simp]
theorem Fin.prod_univ_get' {α : Type u_1} {β : Type u_2} [CommMonoid β] (l : List α) (f : α → β) :
∏ i : Fin l.length, f l[↑i] = (List.map f l).prod
@[simp]
theorem Fin.sum_univ_get' {α : Type u_1} {β : Type u_2} [AddCommMonoid β] (l : List α) (f : α → β) :
∑ i : Fin l.length, f l[↑i] = (List.map f l).sum
@[simp]
theorem Fin.prod_cons {β : Type u_2} [CommMonoid β] {n : ℕ} (x : β) (f : Fin n → β) :
∏ i : Fin n.succ, cons x f i = x * ∏ i : Fin n, f i
@[simp]
theorem Fin.sum_cons {β : Type u_2} [AddCommMonoid β] {n : ℕ} (x : β) (f : Fin n → β) :
∑ i : Fin n.succ, cons x f i = x + ∑ i : Fin n, f i
@[simp]
theorem Fin.prod_snoc {β : Type u_2} [CommMonoid β] {n : ℕ} (x : β) (f : Fin n → β) :
∏ i : Fin n.succ, snoc f x i = (∏ i : Fin n, f i) * x
@[simp]
theorem Fin.sum_snoc {β : Type u_2} [AddCommMonoid β] {n : ℕ} (x : β) (f : Fin n → β) :
∑ i : Fin n.succ, snoc f x i = ∑ i : Fin n, f i + x
theorem Fin.prod_univ_one {β : Type u_2} [CommMonoid β] (f : Fin 1 → β) :
∏ i : Fin 1, f i = f 0
theorem Fin.sum_univ_one {β : Type u_2} [AddCommMonoid β] (f : Fin 1 → β) :
∑ i : Fin 1, f i = f 0
@[simp]
theorem Fin.prod_univ_two {β : Type u_2} [CommMonoid β] (f : Fin 2 → β) :
∏ i : Fin 2, f i = f 0 * f 1
@[simp]
theorem Fin.sum_univ_two {β : Type u_2} [AddCommMonoid β] (f : Fin 2 → β) :
∑ i : Fin 2, f i = f 0 + f 1
theorem Fin.prod_univ_two' {α : Type u_1} {β : Type u_2} [CommMonoid β] (f : α → β) (a b : α) :
∏ i : Fin (Nat.succ 0).succ, f (![a, b] i) = f a * f b
theorem Fin.sum_univ_two' {α : Type u_1} {β : Type u_2} [AddCommMonoid β] (f : α → β) (a b : α) :
∑ i : Fin (Nat.succ 0).succ, f (![a, b] i) = f a + f b
theorem Fin.prod_univ_three {β : Type u_2} [CommMonoid β] (f : Fin 3 → β) :
∏ i : Fin 3, f i = f 0 * f 1 * f 2
theorem Fin.sum_univ_three {β : Type u_2} [AddCommMonoid β] (f : Fin 3 → β) :
∑ i : Fin 3, f i = f 0 + f 1 + f 2
theorem Fin.prod_univ_four {β : Type u_2} [CommMonoid β] (f : Fin 4 → β) :
∏ i : Fin 4, f i = f 0 * f 1 * f 2 * f 3
theorem Fin.sum_univ_four {β : Type u_2} [AddCommMonoid β] (f : Fin 4 → β) :
∑ i : Fin 4, f i = f 0 + f 1 + f 2 + f 3
theorem Fin.prod_univ_five {β : Type u_2} [CommMonoid β] (f : Fin 5 → β) :
∏ i : Fin 5, f i = f 0 * f 1 * f 2 * f 3 * f 4
theorem Fin.sum_univ_five {β : Type u_2} [AddCommMonoid β] (f : Fin 5 → β) :
∑ i : Fin 5, f i = f 0 + f 1 + f 2 + f 3 + f 4
theorem Fin.prod_univ_six {β : Type u_2} [CommMonoid β] (f : Fin 6 → β) :
∏ i : Fin 6, f i = f 0 * f 1 * f 2 * f 3 * f 4 * f 5
theorem Fin.sum_univ_six {β : Type u_2} [AddCommMonoid β] (f : Fin 6 → β) :
∑ i : Fin 6, f i = f 0 + f 1 + f 2 + f 3 + f 4 + f 5
theorem Fin.prod_univ_seven {β : Type u_2} [CommMonoid β] (f : Fin 7 → β) :
∏ i : Fin 7, f i = f 0 * f 1 * f 2 * f 3 * f 4 * f 5 * f 6
theorem Fin.sum_univ_seven {β : Type u_2} [AddCommMonoid β] (f : Fin 7 → β) :
∑ i : Fin 7, f i = f 0 + f 1 + f 2 + f 3 + f 4 + f 5 + f 6
theorem Fin.prod_univ_eight {β : Type u_2} [CommMonoid β] (f : Fin 8 → β) :
∏ i : Fin 8, f i = f 0 * f 1 * f 2 * f 3 * f 4 * f 5 * f 6 * f 7
theorem Fin.sum_univ_eight {β : Type u_2} [AddCommMonoid β] (f : Fin 8 → β) :
∑ i : Fin 8, f i = f 0 + f 1 + f 2 + f 3 + f 4 + f 5 + f 6 + f 7
theorem Fin.sum_pow_mul_eq_add_pow {n : ℕ} {R : Type u_3} [CommSemiring R] (a b : R) :
∑ s : Finset (Fin n), a ^ s.card * b ^ (n - s.card) = (a + b) ^ n
theorem Fin.prod_const {α : Type u_1} [CommMonoid α] (n : ℕ) (x : α) :
∏ _i : Fin n, x = x ^ n
theorem Fin.sum_const {α : Type u_1} [AddCommMonoid α] (n : ℕ) (x : α) :
∑ _i : Fin n, x = n • x
theorem Fin.prod_Ioi_zero {M : Type u_3} [CommMonoid M] {n : ℕ} {v : Fin n.succ → M} :
∏ i ∈ Finset.Ioi 0, v i = ∏ j : Fin n, v j.succ
theorem Fin.sum_Ioi_zero {M : Type u_3} [AddCommMonoid M] {n : ℕ} {v : Fin n.succ → M} :
∑ i ∈ Finset.Ioi 0, v i = ∑ j : Fin n, v j.succ
theorem Fin.prod_Ioi_succ {M : Type u_3} [CommMonoid M] {n : ℕ} (i : Fin n) (v : Fin n.succ → M) :
∏ j ∈ Finset.Ioi i.succ, v j = ∏ j ∈ Finset.Ioi i, v j.succ
theorem Fin.sum_Ioi_succ {M : Type u_3} [AddCommMonoid M] {n : ℕ} (i : Fin n) (v : Fin n.succ → M) :
∑ j ∈ Finset.Ioi i.succ, v j = ∑ j ∈ Finset.Ioi i, v j.succ
theorem Fin.prod_congr' {M : Type u_3} [CommMonoid M] {a b : ℕ} (f : Fin b → M) (h : a = b) :
∏ i : Fin a, f (Fin.cast h i) = ∏ i : Fin b, f i
theorem Fin.sum_congr' {M : Type u_3} [AddCommMonoid M] {a b : ℕ} (f : Fin b → M) (h : a = b) :
∑ i : Fin a, f (Fin.cast h i) = ∑ i : Fin b, f i
theorem Fin.prod_univ_add {M : Type u_3} [CommMonoid M] {a b : ℕ} (f : Fin (a + b) → M) :
∏ i : Fin (a + b), f i = (∏ i : Fin a, f (castAdd b i)) * ∏ i : Fin b, f (natAdd a i)
theorem Fin.sum_univ_add {M : Type u_3} [AddCommMonoid M] {a b : ℕ} (f : Fin (a + b) → M) :
∑ i : Fin (a + b), f i = ∑ i : Fin a, f (castAdd b i) + ∑ i : Fin b, f (natAdd a i)
theorem Fin.prod_trunc {M : Type u_3} [CommMonoid M] {a b : ℕ} (f : Fin (a + b) → M) (hf : ∀ (j : Fin b), f (natAdd a j) = 1) :
∏ i : Fin (a + b), f i = ∏ i : Fin a, f (castLE ⋯ i)
theorem Fin.sum_trunc {M : Type u_3} [AddCommMonoid M] {a b : ℕ} (f : Fin (a + b) → M) (hf : ∀ (j : Fin b), f (natAdd a j) = 0) :
∑ i : Fin (a + b), f i = ∑ i : Fin a, f (castLE ⋯ i)
theorem Fin.sum_neg_one_pow (R : Type u_3) [Ring R] (m : ℕ) :
∑ n : Fin m, (-1) ^ ↑n = if Even m then 0 else 1
def Fin.partialProd {α : Type u_1} [Monoid α] {n : ℕ} (f : Fin n → α) (i : Fin (n + 1)) :
α

For f = (a₁, ..., aₙ) in αⁿ, partialProd f is (1, a₁, a₁a₂, ..., a₁...aₙ) in αⁿ⁺¹.

Equations
Instances For
    def Fin.partialSum {α : Type u_1} [AddMonoid α] {n : ℕ} (f : Fin n → α) (i : Fin (n + 1)) :
    α

    For f = (a₁, ..., aₙ) in αⁿ, partialSum f is

    (0, a₁, a₁ + a₂, ..., a₁ + ... + aₙ) in αⁿ⁺¹.

    Equations
    Instances For
      @[simp]
      theorem Fin.partialProd_zero {α : Type u_1} [Monoid α] {n : ℕ} (f : Fin n → α) :
      @[simp]
      theorem Fin.partialSum_zero {α : Type u_1} [AddMonoid α] {n : ℕ} (f : Fin n → α) :
      theorem Fin.partialProd_succ {α : Type u_1} [Monoid α] {n : ℕ} (f : Fin n → α) (j : Fin n) :
      theorem Fin.partialSum_succ {α : Type u_1} [AddMonoid α] {n : ℕ} (f : Fin n → α) (j : Fin n) :
      theorem Fin.partialProd_succ' {α : Type u_1} [Monoid α] {n : ℕ} (f : Fin (n + 1) → α) (j : Fin (n + 1)) :
      theorem Fin.partialSum_succ' {α : Type u_1} [AddMonoid α] {n : ℕ} (f : Fin (n + 1) → α) (j : Fin (n + 1)) :
      theorem Fin.partialProd_left_inv {n : ℕ} {G : Type u_3} [Group G] (f : Fin (n + 1) → G) :
      (f 0 • partialProd fun (i : Fin n) => (f ↑↑i)⁻¹ * f i.succ) = f
      theorem Fin.partialSum_left_neg {n : ℕ} {G : Type u_3} [AddGroup G] (f : Fin (n + 1) → G) :
      (f 0 +ᵥ partialSum fun (i : Fin n) => -f ↑↑i + f i.succ) = f
      theorem Fin.partialProd_right_inv {n : ℕ} {G : Type u_3} [Group G] (f : Fin n → G) (i : Fin n) :
      theorem Fin.partialSum_right_neg {n : ℕ} {G : Type u_3} [AddGroup G] (f : Fin n → G) (i : Fin n) :
      theorem Fin.inv_partialProd_mul_eq_contractNth {n : ℕ} {G : Type u_3} [Group G] (g : Fin (n + 1) → G) (j : Fin (n + 1)) (k : Fin n) :
      (partialProd g (j.succ.succAbove k.castSucc))⁻¹ * partialProd g (j.succAbove k).succ = j.contractNth (fun (x1 x2 : G) => x1 * x2) g k

      Let (g₀, g₁, ..., gₙ) be a tuple of elements in Gⁿ⁺¹. Then if k < j, this says (g₀g₁...gₖ₋₁)⁻¹ * g₀g₁...gₖ = gₖ. If k = j, it says (g₀g₁...gₖ₋₁)⁻¹ * g₀g₁...gₖ₊₁ = gₖgₖ₊₁. If k > j, it says (g₀g₁...gₖ)⁻¹ * g₀g₁...gₖ₊₁ = gₖ₊₁. Useful for defining group cohomology.

      theorem Fin.neg_partialSum_add_eq_contractNth {n : ℕ} {G : Type u_3} [AddGroup G] (g : Fin (n + 1) → G) (j : Fin (n + 1)) (k : Fin n) :
      -partialSum g (j.succ.succAbove k.castSucc) + partialSum g (j.succAbove k).succ = j.contractNth (fun (x1 x2 : G) => x1 + x2) g k

      Let (g₀, g₁, ..., gₙ) be a tuple of elements in Gⁿ⁺¹. Then if k < j, this says -(g₀ + g₁ + ... + gₖ₋₁) + (g₀ + g₁ + ... + gₖ) = gₖ. If k = j, it says -(g₀ + g₁ + ... + gₖ₋₁) + (g₀ + g₁ + ... + gₖ₊₁) = gₖ + gₖ₊₁. If k > j, it says -(g₀ + g₁ + ... + gₖ) + (g₀ + g₁ + ... + gₖ₊₁) = gₖ₊₁. Useful for defining group cohomology.

      def finFunctionFinEquiv {m n : ℕ} :
      (Fin n → Fin m) ≃ Fin (m ^ n)

      Equivalence between Fin n → Fin m and Fin (m ^ n).

      Equations
      Instances For
        @[simp]
        theorem finFunctionFinEquiv_apply_val {m n : ℕ} (f : Fin n → Fin m) :
        ↑(finFunctionFinEquiv f) = ∑ i : Fin n, ↑(f i) * m ^ ↑i
        @[simp]
        theorem finFunctionFinEquiv_symm_apply_val {m n : ℕ} (a : Fin (m ^ n)) (b : Fin n) :
        ↑(finFunctionFinEquiv.symm a b) = ↑a / m ^ ↑b % m
        theorem finFunctionFinEquiv_apply {m n : ℕ} (f : Fin n → Fin m) :
        ↑(finFunctionFinEquiv f) = ∑ i : Fin n, ↑(f i) * m ^ ↑i
        theorem finFunctionFinEquiv_single {m n : ℕ} [NeZero m] (i : Fin n) (j : Fin m) :
        ↑(finFunctionFinEquiv (Pi.single i j)) = ↑j * m ^ ↑i
        def finPiFinEquiv {m : ℕ} {n : Fin m → ℕ} :
        ((i : Fin m) → Fin (n i)) ≃ Fin (∏ i : Fin m, n i)

        Equivalence between ∀ i : Fin m, Fin (n i) and Fin (∏ i : Fin m, n i).

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          theorem finPiFinEquiv_apply {m : ℕ} {n : Fin m → ℕ} (f : (i : Fin m) → Fin (n i)) :
          ↑(finPiFinEquiv f) = ∑ i : Fin m, ↑(f i) * ∏ j : Fin ↑i, n (Fin.castLE ⋯ j)
          theorem finPiFinEquiv_single {m : ℕ} {n : Fin m → ℕ} [∀ (i : Fin m), NeZero (n i)] (i : Fin m) (j : Fin (n i)) :
          ↑(finPiFinEquiv (Pi.single i j)) = ↑j * ∏ j : Fin ↑i, n (Fin.castLE ⋯ j)
          def finSigmaFinEquiv {m : ℕ} {n : Fin m → ℕ} :
          (i : Fin m) × Fin (n i) ≃ Fin (∑ i : Fin m, n i)

          Equivalence between the Sigma type (i : Fin m) × Fin (n i) and Fin (∑ i : Fin m, n i).

          Equations
          Instances For
            @[simp]
            theorem finSigmaFinEquiv_apply {m : ℕ} {n : Fin m → ℕ} (k : (i : Fin m) × Fin (n i)) :
            ↑(finSigmaFinEquiv k) = ∑ i : Fin ↑k.fst, n (Fin.castLE ⋯ i) + ↑k.snd
            theorem finSigmaFinEquiv_one {n : Fin 1 → ℕ} (ij : (i : Fin 1) × Fin (n i)) :
            ↑(finSigmaFinEquiv ij) = ↑ij.snd

            finSigmaFinEquiv on Fin 1 × f is just f

            theorem List.prod_take_ofFn {α : Type u_1} [CommMonoid α] {n : ℕ} (f : Fin n → α) (i : ℕ) :
            (take i (ofFn f)).prod = ∏ j ∈ {j : Fin n | ↑j < i}, f j
            theorem List.sum_take_ofFn {α : Type u_1} [AddCommMonoid α] {n : ℕ} (f : Fin n → α) (i : ℕ) :
            (take i (ofFn f)).sum = ∑ j ∈ {j : Fin n | ↑j < i}, f j
            theorem List.prod_ofFn {α : Type u_1} [CommMonoid α] {n : ℕ} {f : Fin n → α} :
            (ofFn f).prod = ∏ i : Fin n, f i
            theorem List.sum_ofFn {α : Type u_1} [AddCommMonoid α] {n : ℕ} {f : Fin n → α} :
            (ofFn f).sum = ∑ i : Fin n, f i
            theorem List.alternatingProd_eq_finset_prod {G : Type u_3} [CommGroup G] (L : List G) :
            L.alternatingProd = ∏ i : Fin L.length, L[i] ^ (-1) ^ ↑i
            theorem List.alternatingSum_eq_finset_sum {G : Type u_3} [AddCommGroup G] (L : List G) :
            L.alternatingSum = ∑ i : Fin L.length, (-1) ^ ↑i • L[i]