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.sum_range {β : Type u_2} [AddCommMonoid β] {n : } (f : β) :
iFinset.range n, f i = i : Fin n, f i
theorem Finset.prod_range {β : Type u_2} [CommMonoid β] {n : } (f : β) :
iFinset.range n, f i = 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_ofFn {β : Type u_2} [CommMonoid β] {n : } (f : Fin nβ) :
(List.ofFn f).prod = i : Fin n, f i
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_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_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_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_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 product

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_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 product

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

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 (Fin.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

@[simp]
theorem Fin.sum_univ_get {α : Type u_1} [AddCommMonoid α] (l : List α) :
i : Fin l.length, l.get i = l.sum
@[simp]
theorem Fin.prod_univ_get {α : Type u_1} [CommMonoid α] (l : List α) :
i : Fin l.length, l.get i = l.prod
@[simp]
theorem Fin.sum_univ_get' {α : Type u_1} {β : Type u_2} [AddCommMonoid β] (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} [CommMonoid β] (l : List α) (f : αβ) :
i : Fin l.length, f (l.get i) = (List.map f l).prod
theorem Fin.sum_cons {β : Type u_2} [AddCommMonoid β] {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} [CommMonoid β] {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} [AddCommMonoid β] (f : Fin 1β) :
i : Fin 1, f i = f 0
theorem Fin.prod_univ_one {β : Type u_2} [CommMonoid β] (f : Fin 1β) :
i : Fin 1, f i = f 0
@[simp]
theorem Fin.sum_univ_two {β : Type u_2} [AddCommMonoid β] (f : Fin 2β) :
i : Fin 2, f i = f 0 + f 1
@[simp]
theorem Fin.prod_univ_two {β : Type u_2} [CommMonoid β] (f : Fin 2β) :
i : Fin 2, f i = f 0 * f 1
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_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_three {β : Type u_2} [AddCommMonoid β] (f : Fin 3β) :
i : Fin 3, f i = f 0 + f 1 + f 2
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_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_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_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_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_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_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_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_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_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.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_pow_mul_eq_add_pow {n : } {R : Type u_3} [CommSemiring R] (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} [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.sum_Ioi_zero {M : Type u_3} [AddCommMonoid M] {n : } {v : Fin n.succM} :
iFinset.Ioi 0, v i = j : Fin n, v j.succ
theorem Fin.prod_Ioi_zero {M : Type u_3} [CommMonoid M] {n : } {v : Fin n.succM} :
iFinset.Ioi 0, v i = j : Fin n, v j.succ
theorem Fin.sum_Ioi_succ {M : Type u_3} [AddCommMonoid M] {n : } (i : Fin n) (v : Fin n.succM) :
jFinset.Ioi i.succ, v j = jFinset.Ioi i, v j.succ
theorem Fin.prod_Ioi_succ {M : Type u_3} [CommMonoid M] {n : } (i : Fin n) (v : Fin n.succM) :
jFinset.Ioi i.succ, v j = jFinset.Ioi i, v j.succ
theorem Fin.sum_congr' {M : Type u_3} [AddCommMonoid M] {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} [CommMonoid M] {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} [AddCommMonoid M] {a : } {b : } (f : Fin (a + b)M) :
i : Fin (a + b), f i = i : Fin a, f (Fin.castAdd b i) + i : Fin b, f (Fin.natAdd a 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 (Fin.castAdd b i)) * i : Fin b, f (Fin.natAdd a i)
theorem Fin.sum_trunc {M : Type u_3} [AddCommMonoid M] {a : } {b : } (f : Fin (a + b)M) (hf : ∀ (j : Fin b), f (Fin.natAdd a j) = 0) :
i : Fin (a + b), f i = i : Fin a, f (Fin.castLE i)
theorem Fin.prod_trunc {M : Type u_3} [CommMonoid M] {a : } {b : } (f : Fin (a + b)M) (hf : ∀ (j : Fin b), f (Fin.natAdd a j) = 1) :
i : Fin (a + b), f i = i : Fin a, f (Fin.castLE i)
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
    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
      @[simp]
      theorem Fin.partialSum_zero {α : Type u_1} [AddMonoid α] {n : } (f : Fin nα) :
      @[simp]
      theorem Fin.partialProd_zero {α : Type u_1} [Monoid α] {n : } (f : Fin nα) :
      theorem Fin.partialSum_succ {α : Type u_1} [AddMonoid α] {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} [Monoid α] {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} [AddMonoid α] {n : } (f : Fin (n + 1)α) (j : Fin (n + 1)) :
      theorem Fin.partialProd_succ' {α : Type u_1} [Monoid α] {n : } (f : Fin (n + 1)α) (j : Fin (n + 1)) :
      theorem Fin.partialSum_left_neg {n : } {G : Type u_3} [AddGroup G] (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} [Group G] (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} [AddGroup G] (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} [Group G] (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} [AddGroup G] (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} [Group G] (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 : } [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)
          theorem List.sum_take_ofFn {α : Type u_1} [AddCommMonoid α] {n : } (f : Fin nα) (i : ) :
          (List.take i (List.ofFn f)).sum = jFinset.filter (fun (j : Fin n) => j < i) Finset.univ, f j
          theorem List.prod_take_ofFn {α : Type u_1} [CommMonoid α] {n : } (f : Fin nα) (i : ) :
          (List.take i (List.ofFn f)).prod = jFinset.filter (fun (j : Fin n) => j < i) Finset.univ, f j
          theorem List.sum_ofFn {α : Type u_1} [AddCommMonoid α] {n : } {f : Fin nα} :
          (List.ofFn f).sum = i : Fin n, f i
          theorem List.prod_ofFn {α : Type u_1} [CommMonoid α] {n : } {f : Fin nα} :
          (List.ofFn f).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} [AddCommGroup G] (L : List G) :
            L.alternatingSum = i : Fin L.length, (-1) ^ i L.get i
            theorem List.alternatingProd_eq_finset_prod {G : Type u_3} [CommGroup G] (L : List G) :
            L.alternatingProd = i : Fin L.length, L.get i ^ (-1) ^ i