# 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 #

• finFunctionFinEquiv: An explicit equivalence between Fin n → Fin m and Fin (m ^ n).
theorem Finset.sum_range {β : Type u_2} [] {n : } (f : β) :
i, f i = i : Fin n, f i
theorem Finset.prod_range {β : Type u_2} [] {n : } (f : β) :
i, f i = i : Fin n, f i
theorem Fin.sum_ofFn {β : Type u_2} [] {n : } (f : Fin nβ) :
().sum = i : Fin n, f i
theorem Fin.prod_ofFn {β : Type u_2} [] {n : } (f : Fin nβ) :
().prod = i : Fin n, f i
theorem Fin.sum_univ_def {β : Type u_2} [] {n : } (f : Fin nβ) :
i : Fin n, f i = ().sum
theorem Fin.prod_univ_def {β : Type u_2} [] {n : } (f : Fin nβ) :
i : Fin n, f i = ().prod
theorem Fin.sum_univ_zero {β : Type u_2} [] (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_zero {β : Type u_2} [] (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_succAbove {β : Type u_2} [] {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 product

theorem Fin.prod_univ_succAbove {β : Type u_2} [] {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_succ {β : Type u_2} [] {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 product

theorem Fin.prod_univ_succ {β : Type u_2} [] {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_castSucc {β : Type u_2} [] {n : } (f : Fin (n + 1)β) :
i : Fin (n + 1), f i = i : Fin n, f i.castSucc + f ()

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

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

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

@[simp]
theorem Fin.sum_univ_get {α : Type u_1} [] (l : List α) :
i : Fin l.length, l.get i = l.sum
@[simp]
theorem Fin.prod_univ_get {α : Type u_1} [] (l : List α) :
i : Fin l.length, l.get i = l.prod
@[simp]
theorem Fin.sum_univ_get' {α : Type u_1} {β : Type u_2} [] (l : List α) (f : αβ) :
i : Fin l.length, f (l.get i) = (List.map f l).sum
@[simp]
theorem Fin.prod_univ_get' {α : Type u_1} {β : Type u_2} [] (l : List α) (f : αβ) :
i : Fin l.length, f (l.get i) = (List.map f l).prod
theorem Fin.sum_cons {β : Type u_2} [] {n : } (x : β) (f : Fin nβ) :
i : Fin n.succ, Fin.cons x f i = x + i : Fin n, f i
theorem Fin.prod_cons {β : Type u_2} [] {n : } (x : β) (f : Fin nβ) :
i : Fin n.succ, Fin.cons x f i = x * i : Fin n, f i
theorem Fin.sum_univ_one {β : Type u_2} [] (f : Fin 1β) :
i : Fin 1, f i = f 0
theorem Fin.prod_univ_one {β : Type u_2} [] (f : Fin 1β) :
i : Fin 1, f i = f 0
@[simp]
theorem Fin.sum_univ_two {β : Type u_2} [] (f : Fin 2β) :
i : Fin 2, f i = f 0 + f 1
@[simp]
theorem Fin.prod_univ_two {β : Type u_2} [] (f : Fin 2β) :
i : Fin 2, f i = f 0 * f 1
theorem Fin.sum_univ_two' {α : Type u_1} {β : Type u_2} [] (f : αβ) (a : α) (b : α) :
i : Fin ().succ, f (![a, b] i) = f a + f b
theorem Fin.prod_univ_two' {α : Type u_1} {β : Type u_2} [] (f : αβ) (a : α) (b : α) :
i : Fin ().succ, f (![a, b] i) = f a * f b
theorem Fin.sum_univ_three {β : Type u_2} [] (f : Fin 3β) :
i : Fin 3, f i = f 0 + f 1 + f 2
theorem Fin.prod_univ_three {β : Type u_2} [] (f : Fin 3β) :
i : Fin 3, f i = f 0 * f 1 * f 2
theorem Fin.sum_univ_four {β : Type u_2} [] (f : Fin 4β) :
i : Fin 4, f i = f 0 + f 1 + f 2 + f 3
theorem Fin.prod_univ_four {β : Type u_2} [] (f : Fin 4β) :
i : Fin 4, f i = f 0 * f 1 * f 2 * f 3
theorem Fin.sum_univ_five {β : Type u_2} [] (f : Fin 5β) :
i : Fin 5, f i = f 0 + f 1 + f 2 + f 3 + f 4
theorem Fin.prod_univ_five {β : Type u_2} [] (f : Fin 5β) :
i : Fin 5, f i = f 0 * f 1 * f 2 * f 3 * f 4
theorem Fin.sum_univ_six {β : Type u_2} [] (f : Fin 6β) :
i : Fin 6, f i = f 0 + f 1 + f 2 + f 3 + f 4 + f 5
theorem Fin.prod_univ_six {β : Type u_2} [] (f : Fin 6β) :
i : Fin 6, f i = f 0 * f 1 * f 2 * f 3 * f 4 * f 5
theorem Fin.sum_univ_seven {β : Type u_2} [] (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_seven {β : Type u_2} [] (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_eight {β : Type u_2} [] (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.prod_univ_eight {β : Type u_2} [] (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} [] (a : R) (b : R) :
s : Finset (Fin n), a ^ s.card * b ^ (n - s.card) = (a + b) ^ n
theorem Fin.prod_const {α : Type u_1} [] (n : ) (x : α) :
_i : Fin n, x = x ^ n
theorem Fin.sum_const {α : Type u_1} [] (n : ) (x : α) :
_i : Fin n, x = n x
theorem Fin.sum_Ioi_zero {M : Type u_3} [] {n : } {v : Fin n.succM} :
i, v i = j : Fin n, v j.succ
theorem Fin.prod_Ioi_zero {M : Type u_3} [] {n : } {v : Fin n.succM} :
i, v i = j : Fin n, v j.succ
theorem Fin.sum_Ioi_succ {M : Type u_3} [] {n : } (i : Fin n) (v : Fin n.succM) :
jFinset.Ioi i.succ, v j = j, v j.succ
theorem Fin.prod_Ioi_succ {M : Type u_3} [] {n : } (i : Fin n) (v : Fin n.succM) :
jFinset.Ioi i.succ, v j = j, v j.succ
theorem Fin.sum_congr' {M : Type u_3} [] {a : } {b : } (f : Fin bM) (h : a = b) :
i : Fin a, f (Fin.cast h i) = i : Fin b, f i
theorem Fin.prod_congr' {M : Type u_3} [] {a : } {b : } (f : Fin bM) (h : a = b) :
i : Fin a, f (Fin.cast h i) = i : Fin b, f i
theorem Fin.sum_univ_add {M : Type u_3} [] {a : } {b : } (f : Fin (a + b)M) :
i : Fin (a + b), f i = i : Fin a, f () + i : Fin b, f ()
theorem Fin.prod_univ_add {M : Type u_3} [] {a : } {b : } (f : Fin (a + b)M) :
i : Fin (a + b), f i = (i : Fin a, f ()) * i : Fin b, f ()
theorem Fin.sum_trunc {M : Type u_3} [] {a : } {b : } (f : Fin (a + b)M) (hf : ∀ (j : Fin b), f () = 0) :
i : Fin (a + b), f i = i : Fin a, f ()
theorem Fin.prod_trunc {M : Type u_3} [] {a : } {b : } (f : Fin (a + b)M) (hf : ∀ (j : Fin b), f () = 1) :
i : Fin (a + b), f i = i : Fin a, f ()
def Fin.partialSum {α : Type u_1} [] {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
def Fin.partialProd {α : Type u_1} [] {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
@[simp]
theorem Fin.partialSum_zero {α : Type u_1} [] {n : } (f : Fin nα) :
= 0
@[simp]
theorem Fin.partialProd_zero {α : Type u_1} [] {n : } (f : Fin nα) :
= 1
theorem Fin.partialSum_succ {α : Type u_1} [] {n : } (f : Fin nα) (j : Fin n) :
Fin.partialSum f j.succ = Fin.partialSum f j.castSucc + f j
theorem Fin.partialProd_succ {α : Type u_1} [] {n : } (f : Fin nα) (j : Fin n) :
Fin.partialProd f j.succ = Fin.partialProd f j.castSucc * f j
theorem Fin.partialSum_succ' {α : Type u_1} [] {n : } (f : Fin (n + 1)α) (j : Fin (n + 1)) :
Fin.partialSum f j.succ = f 0 +
theorem Fin.partialProd_succ' {α : Type u_1} [] {n : } (f : Fin (n + 1)α) (j : Fin (n + 1)) :
Fin.partialProd f j.succ = f 0 *
theorem Fin.partialSum_left_neg {n : } {G : Type u_3} [] (f : Fin (n + 1)G) :
(f 0 +ᵥ Fin.partialSum fun (i : Fin n) => -f i + f i.succ) = f
theorem Fin.partialProd_left_inv {n : } {G : Type u_3} [] (f : Fin (n + 1)G) :
(f 0 Fin.partialProd fun (i : Fin n) => (f i)⁻¹ * f i.succ) = f
theorem Fin.partialSum_right_neg {n : } {G : Type u_3} [] (f : Fin nG) (i : Fin n) :
-Fin.partialSum f i.castSucc + Fin.partialSum f i.succ = f i
theorem Fin.partialProd_right_inv {n : } {G : Type u_3} [] (f : Fin nG) (i : Fin n) :
(Fin.partialProd f i.castSucc)⁻¹ * Fin.partialProd f i.succ = f i
theorem Fin.neg_partialSum_add_eq_contractNth {n : } {G : Type u_3} [] (g : Fin (n + 1)G) (j : Fin (n + 1)) (k : Fin n) :
-Fin.partialSum g (j.succ.succAbove k.castSucc) + Fin.partialSum g (j.succAbove k).succ = j.contractNth (fun (x x_1 : G) => x + x_1) 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.inv_partialProd_mul_eq_contractNth {n : } {G : Type u_3} [] (g : Fin (n + 1)G) (j : Fin (n + 1)) (k : Fin n) :
(Fin.partialProd g (j.succ.succAbove k.castSucc))⁻¹ * Fin.partialProd g (j.succAbove k).succ = j.contractNth (fun (x x_1 : G) => x * x_1) 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.

@[simp]
theorem finFunctionFinEquiv_symm_apply_val {m : } {n : } (a : Fin (m ^ n)) (b : Fin n) :
(finFunctionFinEquiv.symm a b) = a / m ^ b % m
@[simp]
theorem finFunctionFinEquiv_apply_val {m : } {n : } (f : Fin nFin m) :
(finFunctionFinEquiv f) = i : Fin n, (f i) * m ^ i
def finFunctionFinEquiv {m : } {n : } :
(Fin nFin m) Fin (m ^ n)

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

Equations
Instances For
theorem finFunctionFinEquiv_apply {m : } {n : } (f : Fin nFin m) :
(finFunctionFinEquiv f) = i : Fin n, (f i) * m ^ i
theorem finFunctionFinEquiv_single {m : } {n : } [] (i : Fin n) (j : Fin m) :
(finFunctionFinEquiv ()) = 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 ()
theorem finPiFinEquiv_single {m : } {n : Fin m} [∀ (i : Fin m), NeZero (n i)] (i : Fin m) (j : Fin (n i)) :
(finPiFinEquiv ()) = j * j : Fin i, n ()
theorem List.sum_take_ofFn {α : Type u_1} [] {n : } (f : Fin nα) (i : ) :
(List.take i ()).sum = jFinset.filter (fun (j : Fin n) => j < i) Finset.univ, f j
theorem List.prod_take_ofFn {α : Type u_1} [] {n : } (f : Fin nα) (i : ) :
(List.take i ()).prod = jFinset.filter (fun (j : Fin n) => j < i) Finset.univ, f j
theorem List.sum_ofFn {α : Type u_1} [] {n : } {f : Fin nα} :
().sum = i : Fin n, f i
theorem List.prod_ofFn {α : Type u_1} [] {n : } {f : Fin nα} :
().prod = i : Fin n, f i
abbrev List.alternatingSum_eq_finset_sum.match_1 {G : Type u_1} (motive : List GProp) :
∀ (x : List G), (Unitmotive [])(∀ (g : G), motive [g])(∀ (g h : G) (L : List G), motive (g :: h :: L))motive x
Equations
• =
Instances For
theorem List.alternatingSum_eq_finset_sum {G : Type u_3} [] (L : List G) :
L.alternatingSum = i : Fin L.length, (-1) ^ i L.get i
theorem List.alternatingProd_eq_finset_prod {G : Type u_3} [] (L : List G) :
L.alternatingProd = i : Fin L.length, L.get i ^ (-1) ^ i