mathlib documentation

algebra.big_operators.finprod

Finite products and sums over types and sets #

We define products and sums over types and subsets of types, with no finiteness hypotheses. All infinite products and sums are defined to be junk values (i.e. one or zero). This approach is sometimes easier to use than finset.sum, when issues arise with finset and fintype being data.

Main definitions #

We use the following variables:

Definitions in this file:

Notation #

This notation works for functions f : p → M, where p : Prop, so the following works:

Implementation notes #

finsum and finprod is "yet another way of doing finite sums and products in Lean". However experiments in the wild (e.g. with matroids) indicate that it is a helpful approach in settings where the user is not interested in computability and wants to do reasoning without running into typeclass diamonds caused by the constructive finiteness used in definitions such as finset and fintype. By sticking solely to set.finite we avoid these problems. We are aware that there are other solutions but for beginner mathematicians this approach is easier in practice.

Another application is the construction of a partition of unity from a collection of “bump” function. In this case the finite set depends on the point and it's convenient to have a definition that does not mention the set explicitly.

The first arguments in all definitions and lemmas is the codomain of the function of the big operator. This is necessary for the heuristic in @[to_additive]. See the documentation of to_additive.attr for more information.

We did not add is_finite (X : Type) : Prop, because it is simply nonempty (fintype X).

Tags #

finsum, finprod, finite sum, finite product

Definition and relation to finset.sum and finset.prod #

@[irreducible]
noncomputable def finsum {M : Type u_1} {α : Sort u_2} [add_comm_monoid M] (f : α M) :
M

Sum of f x as x ranges over the elements of the support of f, if it's finite. Zero otherwise.

Equations
@[irreducible]
noncomputable def finprod {M : Type u_2} {α : Sort u_4} [comm_monoid M] (f : α M) :
M

Product of f x as x ranges over the elements of the multiplicative support of f, if it's finite. One otherwise.

Equations
theorem finsum_eq_sum_plift_of_support_to_finset_subset {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] {f : α M} (hf : (function.support (f plift.down)).finite) {s : finset (plift α)} (hs : hf.to_finset s) :
finsum (λ (i : α), f i) = s.sum (λ (i : plift α), f i.down)
theorem finprod_eq_prod_plift_of_mul_support_to_finset_subset {M : Type u_2} {α : Sort u_4} [comm_monoid M] {f : α M} (hf : (function.mul_support (f plift.down)).finite) {s : finset (plift α)} (hs : hf.to_finset s) :
finprod (λ (i : α), f i) = s.prod (λ (i : plift α), f i.down)
theorem finsum_eq_sum_plift_of_support_subset {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] {f : α M} {s : finset (plift α)} (hs : function.support (f plift.down) s) :
finsum (λ (i : α), f i) = s.sum (λ (i : plift α), f i.down)
theorem finprod_eq_prod_plift_of_mul_support_subset {M : Type u_2} {α : Sort u_4} [comm_monoid M] {f : α M} {s : finset (plift α)} (hs : function.mul_support (f plift.down) s) :
finprod (λ (i : α), f i) = s.prod (λ (i : plift α), f i.down)
@[simp]
theorem finsum_zero {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] :
finsum (λ (i : α), 0) = 0
@[simp]
theorem finprod_one {M : Type u_2} {α : Sort u_4} [comm_monoid M] :
finprod (λ (i : α), 1) = 1
theorem finprod_of_is_empty {M : Type u_2} {α : Sort u_4} [comm_monoid M] [is_empty α] (f : α M) :
finprod (λ (i : α), f i) = 1
theorem finsum_of_is_empty {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] [is_empty α] (f : α M) :
finsum (λ (i : α), f i) = 0
@[simp]
theorem finsum_false {M : Type u_2} [add_comm_monoid M] (f : false M) :
finsum (λ (i : false), f i) = 0
@[simp]
theorem finprod_false {M : Type u_2} [comm_monoid M] (f : false M) :
finprod (λ (i : false), f i) = 1
theorem finsum_eq_single {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] (f : α M) (a : α) (ha : (x : α), x a f x = 0) :
finsum (λ (x : α), f x) = f a
theorem finprod_eq_single {M : Type u_2} {α : Sort u_4} [comm_monoid M] (f : α M) (a : α) (ha : (x : α), x a f x = 1) :
finprod (λ (x : α), f x) = f a
theorem finprod_unique {M : Type u_2} {α : Sort u_4} [comm_monoid M] [unique α] (f : α M) :
finprod (λ (i : α), f i) = f inhabited.default
theorem finsum_unique {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] [unique α] (f : α M) :
finsum (λ (i : α), f i) = f inhabited.default
@[simp]
theorem finsum_true {M : Type u_2} [add_comm_monoid M] (f : true M) :
finsum (λ (i : true), f i) = f trivial
@[simp]
theorem finprod_true {M : Type u_2} [comm_monoid M] (f : true M) :
finprod (λ (i : true), f i) = f trivial
theorem finsum_eq_dif {M : Type u_2} [add_comm_monoid M] {p : Prop} [decidable p] (f : p M) :
finsum (λ (i : p), f i) = dite p (λ (h : p), f h) (λ (h : ¬p), 0)
theorem finprod_eq_dif {M : Type u_2} [comm_monoid M] {p : Prop} [decidable p] (f : p M) :
finprod (λ (i : p), f i) = dite p (λ (h : p), f h) (λ (h : ¬p), 1)
theorem finsum_eq_if {M : Type u_2} [add_comm_monoid M] {p : Prop} [decidable p] {x : M} :
finsum (λ (i : p), x) = ite p x 0
theorem finprod_eq_if {M : Type u_2} [comm_monoid M] {p : Prop} [decidable p] {x : M} :
finprod (λ (i : p), x) = ite p x 1
theorem finsum_congr {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] {f g : α M} (h : (x : α), f x = g x) :
theorem finprod_congr {M : Type u_2} {α : Sort u_4} [comm_monoid M] {f g : α M} (h : (x : α), f x = g x) :
theorem finsum_congr_Prop {M : Type u_2} [add_comm_monoid M] {p q : Prop} {f : p M} {g : q M} (hpq : p = q) (hfg : (h : q), f _ = g h) :
theorem finprod_congr_Prop {M : Type u_2} [comm_monoid M] {p q : Prop} {f : p M} {g : q M} (hpq : p = q) (hfg : (h : q), f _ = g h) :
theorem finprod_induction {M : Type u_2} {α : Sort u_4} [comm_monoid M] {f : α M} (p : M Prop) (hp₀ : p 1) (hp₁ : (x y : M), p x p y p (x * y)) (hp₂ : (i : α), p (f i)) :
p (finprod (λ (i : α), f i))

To prove a property of a finite product, it suffices to prove that the property is multiplicative and holds on the factors.

theorem finsum_induction {M : Type u_2} {α : Sort u_4} [add_comm_monoid M] {f : α M} (p : M Prop) (hp₀ : p 0) (hp₁ : (x y : M), p x p y p (x + y)) (hp₂ : (i : α), p (f i)) :
p (finsum (λ (i : α), f i))

To prove a property of a finite sum, it suffices to prove that the property is additive and holds on the summands.

theorem finprod_nonneg {α : Sort u_4} {R : Type u_1} [ordered_comm_semiring R] {f : α R} (hf : (x : α), 0 f x) :
0 finprod (λ (x : α), f x)
theorem finsum_nonneg {α : Sort u_4} {M : Type u_1} [ordered_add_comm_monoid M] {f : α M} (hf : (i : α), 0 f i) :
0 finsum (λ (i : α), f i)
theorem one_le_finprod' {α : Sort u_4} {M : Type u_1} [ordered_comm_monoid M] {f : α M} (hf : (i : α), 1 f i) :
1 finprod (λ (i : α), f i)
theorem monoid_hom.map_finprod_plift {M : Type u_2} {N : Type u_3} {α : Sort u_4} [comm_monoid M] [comm_monoid N] (f : M →* N) (g : α M) (h : (function.mul_support (g plift.down)).finite) :
f (finprod (λ (x : α), g x)) = finprod (λ (x : α), f (g x))
theorem add_monoid_hom.map_finsum_plift {M : Type u_2} {N : Type u_3} {α : Sort u_4} [add_comm_monoid M] [add_comm_monoid N] (f : M →+ N) (g : α M) (h : (function.support (g plift.down)).finite) :
f (finsum (λ (x : α), g x)) = finsum (λ (x : α), f (g x))
theorem add_monoid_hom.map_finsum_Prop {M : Type u_2} {N : Type u_3} [add_comm_monoid M] [add_comm_monoid N] {p : Prop} (f : M →+ N) (g : p M) :
f (finsum (λ (x : p), g x)) = finsum (λ (x : p), f (g x))
theorem monoid_hom.map_finprod_Prop {M : Type u_2} {N : Type u_3} [comm_monoid M] [comm_monoid N] {p : Prop} (f : M →* N) (g : p M) :
f (finprod (λ (x : p), g x)) = finprod (λ (x : p), f (g x))
theorem monoid_hom.map_finprod_of_preimage_one {M : Type u_2} {N : Type u_3} {α : Sort u_4} [comm_monoid M] [comm_monoid N] (f : M →* N) (hf : (x : M), f x = 1 x = 1) (g : α M) :
f (finprod (λ (i : α), g i)) = finprod (λ (i : α), f (g i))
theorem add_monoid_hom.map_finsum_of_preimage_zero {M : Type u_2} {N : Type u_3} {α : Sort u_4} [add_comm_monoid M] [add_comm_monoid N] (f : M →+ N) (hf : (x : M), f x = 0 x = 0) (g : α M) :
f (finsum (λ (i : α), g i)) = finsum (λ (i : α), f (g i))
theorem monoid_hom.map_finprod_of_injective {M : Type u_2} {N : Type u_3} {α : Sort u_4} [comm_monoid M] [comm_monoid N] (g : M →* N) (hg : function.injective g) (f : α M) :
g (finprod (λ (i : α), f i)) = finprod (λ (i : α), g (f i))
theorem add_monoid_hom.map_finsum_of_injective {M : Type u_2} {N : Type u_3} {α : Sort u_4} [add_comm_monoid M] [add_comm_monoid N] (g : M →+ N) (hg : function.injective g) (f : α M) :
g (finsum (λ (i : α), f i)) = finsum (λ (i : α), g (f i))
theorem mul_equiv.map_finprod {M : Type u_2} {N : Type u_3} {α : Sort u_4} [comm_monoid M] [comm_monoid N] (g : M ≃* N) (f : α M) :
g (finprod (λ (i : α), f i)) = finprod (λ (i : α), g (f i))
theorem add_equiv.map_finsum {M : Type u_2} {N : Type u_3} {α : Sort u_4} [add_comm_monoid M] [add_comm_monoid N] (g : M ≃+ N) (f : α M) :
g (finsum (λ (i : α), f i)) = finsum (λ (i : α), g (f i))
theorem finsum_smul {ι : Sort u_6} {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] [no_zero_smul_divisors R M] (f : ι R) (x : M) :
finsum (λ (i : ι), f i) x = finsum (λ (i : ι), f i x)
theorem smul_finsum {ι : Sort u_6} {R : Type u_1} {M : Type u_2} [ring R] [add_comm_group M] [module R M] [no_zero_smul_divisors R M] (c : R) (f : ι M) :
c finsum (λ (i : ι), f i) = finsum (λ (i : ι), c f i)
theorem finprod_inv_distrib {G : Type u_1} {α : Sort u_4} [division_comm_monoid G] (f : α G) :
finprod (λ (x : α), (f x)⁻¹) = (finprod (λ (x : α), f x))⁻¹
theorem finsum_neg_distrib {G : Type u_1} {α : Sort u_4} [subtraction_comm_monoid G] (f : α G) :
finsum (λ (x : α), -f x) = -finsum (λ (x : α), f x)
theorem finprod_eq_mul_indicator_apply {α : Type u_1} {M : Type u_5} [comm_monoid M] (s : set α) (f : α M) (a : α) :
finprod (λ (h : a s), f a) = s.mul_indicator f a
theorem finsum_eq_indicator_apply {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (s : set α) (f : α M) (a : α) :
finsum (λ (h : a s), f a) = s.indicator f a
@[simp]
theorem finprod_mem_mul_support {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (a : α) :
finprod (λ (h : f a 1), f a) = f a
@[simp]
theorem finsum_mem_support {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (a : α) :
finsum (λ (h : f a 0), f a) = f a
theorem finprod_mem_def {α : Type u_1} {M : Type u_5} [comm_monoid M] (s : set α) (f : α M) :
finprod (λ (a : α), finprod (λ (H : a s), f a)) = finprod (λ (a : α), s.mul_indicator f a)
theorem finsum_mem_def {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (s : set α) (f : α M) :
finsum (λ (a : α), finsum (λ (H : a s), f a)) = finsum (λ (a : α), s.indicator f a)
theorem finsum_eq_sum_of_support_subset {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {s : finset α} (h : function.support f s) :
finsum (λ (i : α), f i) = s.sum (λ (i : α), f i)
theorem finprod_eq_prod_of_mul_support_subset {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {s : finset α} (h : function.mul_support f s) :
finprod (λ (i : α), f i) = s.prod (λ (i : α), f i)
theorem finsum_eq_sum_of_support_to_finset_subset {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (hf : (function.support f).finite) {s : finset α} (h : hf.to_finset s) :
finsum (λ (i : α), f i) = s.sum (λ (i : α), f i)
theorem finprod_eq_prod_of_mul_support_to_finset_subset {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (hf : (function.mul_support f).finite) {s : finset α} (h : hf.to_finset s) :
finprod (λ (i : α), f i) = s.prod (λ (i : α), f i)
theorem finsum_eq_finset_sum_of_support_subset {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {s : finset α} (h : function.support f s) :
finsum (λ (i : α), f i) = s.sum (λ (i : α), f i)
theorem finprod_eq_finset_prod_of_mul_support_subset {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {s : finset α} (h : function.mul_support f s) :
finprod (λ (i : α), f i) = s.prod (λ (i : α), f i)
theorem finprod_def {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) [decidable (function.mul_support f).finite] :
finprod (λ (i : α), f i) = dite (function.mul_support f).finite (λ (h : (function.mul_support f).finite), h.to_finset.prod (λ (i : α), f i)) (λ (h : ¬(function.mul_support f).finite), 1)
theorem finsum_def {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) [decidable (function.support f).finite] :
finsum (λ (i : α), f i) = dite (function.support f).finite (λ (h : (function.support f).finite), h.to_finset.sum (λ (i : α), f i)) (λ (h : ¬(function.support f).finite), 0)
theorem finsum_of_infinite_support {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} (hf : (function.support f).infinite) :
finsum (λ (i : α), f i) = 0
theorem finprod_of_infinite_mul_support {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} (hf : (function.mul_support f).infinite) :
finprod (λ (i : α), f i) = 1
theorem finsum_eq_sum {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (hf : (function.support f).finite) :
finsum (λ (i : α), f i) = hf.to_finset.sum (λ (i : α), f i)
theorem finprod_eq_prod {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (hf : (function.mul_support f).finite) :
finprod (λ (i : α), f i) = hf.to_finset.prod (λ (i : α), f i)
theorem finprod_eq_prod_of_fintype {α : Type u_1} {M : Type u_5} [comm_monoid M] [fintype α] (f : α M) :
finprod (λ (i : α), f i) = finset.univ.prod (λ (i : α), f i)
theorem finsum_eq_sum_of_fintype {α : Type u_1} {M : Type u_5} [add_comm_monoid M] [fintype α] (f : α M) :
finsum (λ (i : α), f i) = finset.univ.sum (λ (i : α), f i)
theorem finsum_cond_eq_sum_of_cond_iff {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {p : α Prop} {t : finset α} (h : {x : α}, f x 0 (p x x t)) :
finsum (λ (i : α), finsum (λ (hi : p i), f i)) = t.sum (λ (i : α), f i)
theorem finprod_cond_eq_prod_of_cond_iff {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {p : α Prop} {t : finset α} (h : {x : α}, f x 1 (p x x t)) :
finprod (λ (i : α), finprod (λ (hi : p i), f i)) = t.prod (λ (i : α), f i)
theorem finsum_cond_ne {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (a : α) [decidable_eq α] (hf : (function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i a), f i)) = (hf.to_finset.erase a).sum (λ (i : α), f i)
theorem finprod_cond_ne {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (a : α) [decidable_eq α] (hf : (function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i a), f i)) = (hf.to_finset.erase a).prod (λ (i : α), f i)
theorem finsum_mem_eq_sum_of_inter_support_eq {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {s : set α} {t : finset α} (h : s function.support f = t function.support f) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = t.sum (λ (i : α), f i)
theorem finprod_mem_eq_prod_of_inter_mul_support_eq {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {s : set α} {t : finset α} (h : s function.mul_support f = t function.mul_support f) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = t.prod (λ (i : α), f i)
theorem finsum_mem_eq_sum_of_subset {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {s : set α} {t : finset α} (h₁ : s function.support f t) (h₂ : t s) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = t.sum (λ (i : α), f i)
theorem finprod_mem_eq_prod_of_subset {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {s : set α} {t : finset α} (h₁ : s function.mul_support f t) (h₂ : t s) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = t.prod (λ (i : α), f i)
theorem finsum_mem_eq_sum {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {s : set α} (hf : (s function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = hf.to_finset.sum (λ (i : α), f i)
theorem finprod_mem_eq_prod {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {s : set α} (hf : (s function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = hf.to_finset.prod (λ (i : α), f i)
theorem finsum_mem_eq_sum_filter {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s : set α) [decidable_pred (λ (_x : α), _x s)] (hf : (function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = (finset.filter (λ (_x : α), _x s) hf.to_finset).sum (λ (i : α), f i)
theorem finprod_mem_eq_prod_filter {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s : set α) [decidable_pred (λ (_x : α), _x s)] (hf : (function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = (finset.filter (λ (_x : α), _x s) hf.to_finset).prod (λ (i : α), f i)
theorem finprod_mem_eq_to_finset_prod {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s : set α) [fintype s] :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = s.to_finset.prod (λ (i : α), f i)
theorem finsum_mem_eq_to_finset_sum {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s : set α) [fintype s] :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = s.to_finset.sum (λ (i : α), f i)
theorem finprod_mem_eq_finite_to_finset_prod {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) {s : set α} (hs : s.finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = hs.to_finset.prod (λ (i : α), f i)
theorem finsum_mem_eq_finite_to_finset_sum {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) {s : set α} (hs : s.finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = hs.to_finset.sum (λ (i : α), f i)
theorem finprod_mem_finset_eq_prod {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s : finset α) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = s.prod (λ (i : α), f i)
theorem finsum_mem_finset_eq_sum {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s : finset α) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = s.sum (λ (i : α), f i)
theorem finprod_mem_coe_finset {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s : finset α) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = s.prod (λ (i : α), f i)
theorem finsum_mem_coe_finset {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s : finset α) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = s.sum (λ (i : α), f i)
theorem finsum_mem_eq_zero_of_infinite {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (hs : (s function.support f).infinite) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = 0
theorem finprod_mem_eq_one_of_infinite {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (hs : (s function.mul_support f).infinite) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = 1
theorem finprod_mem_eq_one_of_forall_eq_one {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (h : (x : α), x s f x = 1) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = 1
theorem finsum_mem_eq_zero_of_forall_eq_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (h : (x : α), x s f x = 0) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = 0
theorem finprod_mem_inter_mul_support {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s : set α) :
finprod (λ (i : α), finprod (λ (H : i s function.mul_support f), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i))
theorem finsum_mem_inter_support {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s : set α) :
finsum (λ (i : α), finsum (λ (H : i s function.support f), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i))
theorem finprod_mem_inter_mul_support_eq {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s t : set α) (h : s function.mul_support f = t function.mul_support f) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = finprod (λ (i : α), finprod (λ (H : i t), f i))
theorem finsum_mem_inter_support_eq {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s t : set α) (h : s function.support f = t function.support f) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = finsum (λ (i : α), finsum (λ (H : i t), f i))
theorem finprod_mem_inter_mul_support_eq' {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) (s t : set α) (h : (x : α), x function.mul_support f (x s x t)) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = finprod (λ (i : α), finprod (λ (H : i t), f i))
theorem finsum_mem_inter_support_eq' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) (s t : set α) (h : (x : α), x function.support f (x s x t)) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = finsum (λ (i : α), finsum (λ (H : i t), f i))
theorem finprod_mem_univ {α : Type u_1} {M : Type u_5} [comm_monoid M] (f : α M) :
finprod (λ (i : α), finprod (λ (H : i set.univ), f i)) = finprod (λ (i : α), f i)
theorem finsum_mem_univ {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (f : α M) :
finsum (λ (i : α), finsum (λ (H : i set.univ), f i)) = finsum (λ (i : α), f i)
theorem finprod_mem_congr {α : Type u_1} {M : Type u_5} [comm_monoid M] {f g : α M} {s t : set α} (h₀ : s = t) (h₁ : (x : α), x t f x = g x) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = finprod (λ (i : α), finprod (λ (H : i t), g i))
theorem finsum_mem_congr {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f g : α M} {s t : set α} (h₀ : s = t) (h₁ : (x : α), x t f x = g x) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = finsum (λ (i : α), finsum (λ (H : i t), g i))
theorem finprod_eq_one_of_forall_eq_one {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} (h : (x : α), f x = 1) :
finprod (λ (i : α), f i) = 1
theorem finsum_eq_zero_of_forall_eq_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} (h : (x : α), f x = 0) :
finsum (λ (i : α), f i) = 0

Distributivity w.r.t. addition, subtraction, and (scalar) multiplication #

theorem finprod_mul_distrib {α : Type u_1} {M : Type u_5} [comm_monoid M] {f g : α M} (hf : (function.mul_support f).finite) (hg : (function.mul_support g).finite) :
finprod (λ (i : α), f i * g i) = finprod (λ (i : α), f i) * finprod (λ (i : α), g i)

If the multiplicative supports of f and g are finite, then the product of f i * g i equals the product of f i multiplied by the product of g i.

theorem finsum_add_distrib {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f g : α M} (hf : (function.support f).finite) (hg : (function.support g).finite) :
finsum (λ (i : α), f i + g i) = finsum (λ (i : α), f i) + finsum (λ (i : α), g i)

If the additive supports of f and g are finite, then the sum of f i + g i equals the sum of f i plus the sum of g i.

theorem finsum_sub_distrib {α : Type u_1} {G : Type u_4} [subtraction_comm_monoid G] {f g : α G} (hf : (function.support f).finite) (hg : (function.support g).finite) :
finsum (λ (i : α), f i - g i) = finsum (λ (i : α), f i) - finsum (λ (i : α), g i)

If the additive supports of f and g are finite, then the sum of f i - g i equals the sum of f i minus the sum of g i.

theorem finprod_div_distrib {α : Type u_1} {G : Type u_4} [division_comm_monoid G] {f g : α G} (hf : (function.mul_support f).finite) (hg : (function.mul_support g).finite) :
finprod (λ (i : α), f i / g i) = finprod (λ (i : α), f i) / finprod (λ (i : α), g i)

If the multiplicative supports of f and g are finite, then the product of f i / g i equals the product of f i divided by the product of g i.

theorem finprod_mem_mul_distrib' {α : Type u_1} {M : Type u_5} [comm_monoid M] {f g : α M} {s : set α} (hf : (s function.mul_support f).finite) (hg : (s function.mul_support g).finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i * g i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i s), g i))

A more general version of finprod_mem_mul_distrib that only requires s ∩ mul_support f and s ∩ mul_support g rather than s to be finite.

theorem finsum_mem_add_distrib' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f g : α M} {s : set α} (hf : (s function.support f).finite) (hg : (s function.support g).finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i + g i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i s), g i))

A more general version of finsum_mem_add_distrib that only requires s ∩ support f and s ∩ support g rather than s to be finite.

theorem finprod_mem_one {α : Type u_1} {M : Type u_5} [comm_monoid M] (s : set α) :
finprod (λ (i : α), finprod (λ (H : i s), 1)) = 1

The product of the constant function 1 over any set equals 1.

theorem finsum_mem_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] (s : set α) :
finsum (λ (i : α), finsum (λ (H : i s), 0)) = 0

The product of the constant function 0 over any set equals 0.

theorem finprod_mem_of_eq_on_one {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (hf : set.eq_on f 1 s) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = 1

If a function f equals 1 on a set s, then the product of f i over i ∈ s equals 1.

theorem finsum_mem_of_eq_on_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (hf : set.eq_on f 0 s) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = 0

If a function f equals 0 on a set s, then the product of f i over i ∈ s equals 0.

theorem exists_ne_one_of_finprod_mem_ne_one {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (h : finprod (λ (i : α), finprod (λ (H : i s), f i)) 1) :
(x : α) (H : x s), f x 1

If the product of f i over i ∈ s is not equal to 1, then there is some x ∈ s such that f x ≠ 1.

theorem exists_ne_zero_of_finsum_mem_ne_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (h : finsum (λ (i : α), finsum (λ (H : i s), f i)) 0) :
(x : α) (H : x s), f x 0

If the product of f i over i ∈ s is not equal to 0, then there is some x ∈ s such that f x ≠ 0.

theorem finprod_mem_mul_distrib {α : Type u_1} {M : Type u_5} [comm_monoid M] {f g : α M} {s : set α} (hs : s.finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i * g i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i s), g i))

Given a finite set s, the product of f i * g i over i ∈ s equals the product of f i over i ∈ s times the product of g i over i ∈ s.

theorem finsum_mem_add_distrib {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f g : α M} {s : set α} (hs : s.finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i + g i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i s), g i))

Given a finite set s, the sum of f i + g i over i ∈ s equals the sum of f i over i ∈ s plus the sum of g i over i ∈ s.

theorem add_monoid_hom.map_finsum {α : Type u_1} {M : Type u_5} {N : Type u_6} [add_comm_monoid M] [add_comm_monoid N] {f : α M} (g : M →+ N) (hf : (function.support f).finite) :
g (finsum (λ (i : α), f i)) = finsum (λ (i : α), g (f i))
theorem monoid_hom.map_finprod {α : Type u_1} {M : Type u_5} {N : Type u_6} [comm_monoid M] [comm_monoid N] {f : α M} (g : M →* N) (hf : (function.mul_support f).finite) :
g (finprod (λ (i : α), f i)) = finprod (λ (i : α), g (f i))
theorem finsum_nsmul {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} (hf : (function.support f).finite) (n : ) :
n finsum (λ (i : α), f i) = finsum (λ (i : α), n f i)
theorem finprod_pow {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} (hf : (function.mul_support f).finite) (n : ) :
finprod (λ (i : α), f i) ^ n = finprod (λ (i : α), f i ^ n)
theorem monoid_hom.map_finprod_mem' {α : Type u_1} {M : Type u_5} {N : Type u_6} [comm_monoid M] [comm_monoid N] {s : set α} {f : α M} (g : M →* N) (h₀ : (s function.mul_support f).finite) :
g (finprod (λ (j : α), finprod (λ (H : j s), f j))) = finprod (λ (i : α), finprod (λ (H : i s), g (f i)))

A more general version of monoid_hom.map_finprod_mem that requires s ∩ mul_support f rather than s to be finite.

theorem add_monoid_hom.map_finsum_mem' {α : Type u_1} {M : Type u_5} {N : Type u_6} [add_comm_monoid M] [add_comm_monoid N] {s : set α} {f : α M} (g : M →+ N) (h₀ : (s function.support f).finite) :
g (finsum (λ (j : α), finsum (λ (H : j s), f j))) = finsum (λ (i : α), finsum (λ (H : i s), g (f i)))

A more general version of add_monoid_hom.map_finsum_mem that requires s ∩ support f rather than s to be finite.

theorem monoid_hom.map_finprod_mem {α : Type u_1} {M : Type u_5} {N : Type u_6} [comm_monoid M] [comm_monoid N] {s : set α} (f : α M) (g : M →* N) (hs : s.finite) :
g (finprod (λ (j : α), finprod (λ (H : j s), f j))) = finprod (λ (i : α), finprod (λ (H : i s), g (f i)))

Given a monoid homomorphism g : M →* N and a function f : α → M, the value of g at the product of f i over i ∈ s equals the product of g (f i) over s.

theorem add_monoid_hom.map_finsum_mem {α : Type u_1} {M : Type u_5} {N : Type u_6} [add_comm_monoid M] [add_comm_monoid N] {s : set α} (f : α M) (g : M →+ N) (hs : s.finite) :
g (finsum (λ (j : α), finsum (λ (H : j s), f j))) = finsum (λ (i : α), finsum (λ (H : i s), g (f i)))

Given an additive monoid homomorphism g : M →* N and a function f : α → M, the value of g at the sum of f i over i ∈ s equals the sum of g (f i) over s.

theorem mul_equiv.map_finprod_mem {α : Type u_1} {M : Type u_5} {N : Type u_6} [comm_monoid M] [comm_monoid N] (g : M ≃* N) (f : α M) {s : set α} (hs : s.finite) :
g (finprod (λ (i : α), finprod (λ (H : i s), f i))) = finprod (λ (i : α), finprod (λ (H : i s), g (f i)))
theorem add_equiv.map_finsum_mem {α : Type u_1} {M : Type u_5} {N : Type u_6} [add_comm_monoid M] [add_comm_monoid N] (g : M ≃+ N) (f : α M) {s : set α} (hs : s.finite) :
g (finsum (λ (i : α), finsum (λ (H : i s), f i))) = finsum (λ (i : α), finsum (λ (H : i s), g (f i)))
theorem finprod_mem_inv_distrib {α : Type u_1} {G : Type u_4} {s : set α} [division_comm_monoid G] (f : α G) (hs : s.finite) :
finprod (λ (x : α), finprod (λ (H : x s), (f x)⁻¹)) = (finprod (λ (x : α), finprod (λ (H : x s), f x)))⁻¹
theorem finsum_mem_neg_distrib {α : Type u_1} {G : Type u_4} {s : set α} [subtraction_comm_monoid G] (f : α G) (hs : s.finite) :
finsum (λ (x : α), finsum (λ (H : x s), -f x)) = -finsum (λ (x : α), finsum (λ (H : x s), f x))
theorem finprod_mem_div_distrib {α : Type u_1} {G : Type u_4} {s : set α} [division_comm_monoid G] (f g : α G) (hs : s.finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i / g i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) / finprod (λ (i : α), finprod (λ (H : i s), g i))

Given a finite set s, the product of f i / g i over i ∈ s equals the product of f i over i ∈ s divided by the product of g i over i ∈ s.

theorem finsum_mem_sub_distrib {α : Type u_1} {G : Type u_4} {s : set α} [subtraction_comm_monoid G] (f g : α G) (hs : s.finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i - g i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) - finsum (λ (i : α), finsum (λ (H : i s), g i))

Given a finite set s, the sum of f i / g i over i ∈ s equals the sum of f i over i ∈ s minus the sum of g i over i ∈ s.

∏ᶠ x ∈ s, f x and set operations #

theorem finprod_mem_empty {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} :
finprod (λ (i : α), finprod (λ (H : i ), f i)) = 1

The product of any function over an empty set is 1.

theorem finsum_mem_empty {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} :
finsum (λ (i : α), finsum (λ (H : i ), f i)) = 0

The sum of any function over an empty set is 0.

theorem nonempty_of_finprod_mem_ne_one {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (h : finprod (λ (i : α), finprod (λ (H : i s), f i)) 1) :

A set s is nonempty if the product of some function over s is not equal to 1.

theorem nonempty_of_finsum_mem_ne_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (h : finsum (λ (i : α), finsum (λ (H : i s), f i)) 0) :

A set s is nonempty if the sum of some function over s is not equal to 0.

theorem finsum_mem_union_inter {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hs : s.finite) (ht : t.finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) + finsum (λ (i : α), finsum (λ (H : i s t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t), f i))

Given finite sets s and t, the sum of f i over i ∈ s ∪ t plus the sum of f i over i ∈ s ∩ t equals the sum of f i over i ∈ s plus the sum of f i over i ∈ t.

theorem finprod_mem_union_inter {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hs : s.finite) (ht : t.finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) * finprod (λ (i : α), finprod (λ (H : i s t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t), f i))

Given finite sets s and t, the product of f i over i ∈ s ∪ t times the product of f i over i ∈ s ∩ t equals the product of f i over i ∈ s times the product of f i over i ∈ t.

theorem finprod_mem_union_inter' {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hs : (s function.mul_support f).finite) (ht : (t function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) * finprod (λ (i : α), finprod (λ (H : i s t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t), f i))

A more general version of finprod_mem_union_inter that requires s ∩ mul_support f and t ∩ mul_support f rather than s and t to be finite.

theorem finsum_mem_union_inter' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hs : (s function.support f).finite) (ht : (t function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) + finsum (λ (i : α), finsum (λ (H : i s t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t), f i))

A more general version of finsum_mem_union_inter that requires s ∩ support f and t ∩ support f rather than s and t to be finite.

theorem finprod_mem_union' {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hst : disjoint s t) (hs : (s function.mul_support f).finite) (ht : (t function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t), f i))

A more general version of finprod_mem_union that requires s ∩ mul_support f and t ∩ mul_support f rather than s and t to be finite.

theorem finsum_mem_union' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hst : disjoint s t) (hs : (s function.support f).finite) (ht : (t function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t), f i))

A more general version of finsum_mem_union that requires s ∩ support f and t ∩ support f rather than s and t to be finite.

theorem finprod_mem_union {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hst : disjoint s t) (hs : s.finite) (ht : t.finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t), f i))

Given two finite disjoint sets s and t, the product of f i over i ∈ s ∪ t equals the product of f i over i ∈ s times the product of f i over i ∈ t.

theorem finsum_mem_union {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hst : disjoint s t) (hs : s.finite) (ht : t.finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t), f i))

Given two finite disjoint sets s and t, the sum of f i over i ∈ s ∪ t equals the sum of f i over i ∈ s plus the sum of f i over i ∈ t.

theorem finprod_mem_union'' {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hst : disjoint (s function.mul_support f) (t function.mul_support f)) (hs : (s function.mul_support f).finite) (ht : (t function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t), f i))

A more general version of finprod_mem_union' that requires s ∩ mul_support f and t ∩ mul_support f rather than s and t to be disjoint

theorem finsum_mem_union'' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hst : disjoint (s function.support f) (t function.support f)) (hs : (s function.support f).finite) (ht : (t function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t), f i))

A more general version of finsum_mem_union' that requires s ∩ support f and t ∩ support f rather than s and t to be disjoint

theorem finprod_mem_singleton {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {a : α} :
finprod (λ (i : α), finprod (λ (H : i {a}), f i)) = f a

The product of f i over i ∈ {a} equals f a.

theorem finsum_mem_singleton {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {a : α} :
finsum (λ (i : α), finsum (λ (H : i {a}), f i)) = f a

The sum of f i over i ∈ {a} equals f a.

@[simp]
theorem finsum_cond_eq_left {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {a : α} :
finsum (λ (i : α), finsum (λ (H : i = a), f i)) = f a
@[simp]
theorem finprod_cond_eq_left {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {a : α} :
finprod (λ (i : α), finprod (λ (H : i = a), f i)) = f a
@[simp]
theorem finprod_cond_eq_right {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {a : α} :
finprod (λ (i : α), finprod (λ (hi : a = i), f i)) = f a
@[simp]
theorem finsum_cond_eq_right {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {a : α} :
finsum (λ (i : α), finsum (λ (hi : a = i), f i)) = f a
theorem finsum_mem_insert' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {a : α} {s : set α} (f : α M) (h : a s) (hs : (s function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i has_insert.insert a s), f i)) = f a + finsum (λ (i : α), finsum (λ (H : i s), f i))

A more general version of finsum_mem_insert that requires s ∩ support f rather than s to be finite.

theorem finprod_mem_insert' {α : Type u_1} {M : Type u_5} [comm_monoid M] {a : α} {s : set α} (f : α M) (h : a s) (hs : (s function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i has_insert.insert a s), f i)) = f a * finprod (λ (i : α), finprod (λ (H : i s), f i))

A more general version of finprod_mem_insert that requires s ∩ mul_support f rather than s to be finite.

theorem finsum_mem_insert {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {a : α} {s : set α} (f : α M) (h : a s) (hs : s.finite) :
finsum (λ (i : α), finsum (λ (H : i has_insert.insert a s), f i)) = f a + finsum (λ (i : α), finsum (λ (H : i s), f i))

Given a finite set s and an element a ∉ s, the sum of f i over i ∈ insert a s equals f a plus the sum of f i over i ∈ s.

theorem finprod_mem_insert {α : Type u_1} {M : Type u_5} [comm_monoid M] {a : α} {s : set α} (f : α M) (h : a s) (hs : s.finite) :
finprod (λ (i : α), finprod (λ (H : i has_insert.insert a s), f i)) = f a * finprod (λ (i : α), finprod (λ (H : i s), f i))

Given a finite set s and an element a ∉ s, the product of f i over i ∈ insert a s equals f a times the product of f i over i ∈ s.

theorem finsum_mem_insert_of_eq_zero_if_not_mem {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {a : α} {s : set α} (h : a s f a = 0) :
finsum (λ (i : α), finsum (λ (H : i has_insert.insert a s), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i))

If f a = 0 when a ∉ s, then the sum of f i over i ∈ insert a s equals the sum of f i over i ∈ s.

theorem finprod_mem_insert_of_eq_one_if_not_mem {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {a : α} {s : set α} (h : a s f a = 1) :
finprod (λ (i : α), finprod (λ (H : i has_insert.insert a s), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i))

If f a = 1 when a ∉ s, then the product of f i over i ∈ insert a s equals the product of f i over i ∈ s.

theorem finsum_mem_insert_zero {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {a : α} {s : set α} (h : f a = 0) :
finsum (λ (i : α), finsum (λ (H : i has_insert.insert a s), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i))

If f a = 0, then the sum of f i over i ∈ insert a s equals the sum of f i over i ∈ s.

theorem finprod_mem_insert_one {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {a : α} {s : set α} (h : f a = 1) :
finprod (λ (i : α), finprod (λ (H : i has_insert.insert a s), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i))

If f a = 1, then the product of f i over i ∈ insert a s equals the product of f i over i ∈ s.

theorem finprod_mem_dvd {α : Type u_1} {N : Type u_6} [comm_monoid N] {f : α N} (a : α) (hf : (function.mul_support f).finite) :
f a finprod f

If the multiplicative support of f is finite, then for every x in the domain of f, f x divides finprod f.

theorem finprod_mem_pair {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {a b : α} (h : a b) :
finprod (λ (i : α), finprod (λ (H : i {a, b}), f i)) = f a * f b

The product of f i over i ∈ {a, b}, a ≠ b, is equal to f a * f b.

theorem finsum_mem_pair {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {a b : α} (h : a b) :
finsum (λ (i : α), finsum (λ (H : i {a, b}), f i)) = f a + f b

The sum of f i over i ∈ {a, b}, a ≠ b, is equal to f a + f b.

theorem finsum_mem_image' {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set β} {g : β α} (hg : set.inj_on g (s function.support (f g))) :
finsum (λ (i : α), finsum (λ (H : i g '' s), f i)) = finsum (λ (j : β), finsum (λ (H : j s), f (g j)))

The sum of f y over y ∈ g '' s equals the sum of f (g i) over s provided that g is injective on s ∩ support (f ∘ g).

theorem finprod_mem_image' {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {f : α M} {s : set β} {g : β α} (hg : set.inj_on g (s function.mul_support (f g))) :
finprod (λ (i : α), finprod (λ (H : i g '' s), f i)) = finprod (λ (j : β), finprod (λ (H : j s), f (g j)))

The product of f y over y ∈ g '' s equals the product of f (g i) over s provided that g is injective on s ∩ mul_support (f ∘ g).

theorem finsum_mem_image {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set β} {g : β α} (hg : set.inj_on g s) :
finsum (λ (i : α), finsum (λ (H : i g '' s), f i)) = finsum (λ (j : β), finsum (λ (H : j s), f (g j)))

The sum of f y over y ∈ g '' s equals the sum of f (g i) over s provided that g is injective on s.

theorem finprod_mem_image {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {f : α M} {s : set β} {g : β α} (hg : set.inj_on g s) :
finprod (λ (i : α), finprod (λ (H : i g '' s), f i)) = finprod (λ (j : β), finprod (λ (H : j s), f (g j)))

The product of f y over y ∈ g '' s equals the product of f (g i) over s provided that g is injective on s.

theorem finsum_mem_range' {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {f : α M} {g : β α} (hg : set.inj_on g (function.support (f g))) :
finsum (λ (i : α), finsum (λ (H : i set.range g), f i)) = finsum (λ (j : β), f (g j))

The sum of f y over y ∈ set.range g equals the sum of f (g i) over all i provided that g is injective on support (f ∘ g).

theorem finprod_mem_range' {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {f : α M} {g : β α} (hg : set.inj_on g (function.mul_support (f g))) :
finprod (λ (i : α), finprod (λ (H : i set.range g), f i)) = finprod (λ (j : β), f (g j))

The product of f y over y ∈ set.range g equals the product of f (g i) over all i provided that g is injective on mul_support (f ∘ g).

theorem finsum_mem_range {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {f : α M} {g : β α} (hg : function.injective g) :
finsum (λ (i : α), finsum (λ (H : i set.range g), f i)) = finsum (λ (j : β), f (g j))

The sum of f y over y ∈ set.range g equals the sum of f (g i) over all i provided that g is injective.

theorem finprod_mem_range {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {f : α M} {g : β α} (hg : function.injective g) :
finprod (λ (i : α), finprod (λ (H : i set.range g), f i)) = finprod (λ (j : β), f (g j))

The product of f y over y ∈ set.range g equals the product of f (g i) over all i provided that g is injective.

theorem finsum_mem_eq_of_bij_on {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {s : set α} {t : set β} {f : α M} {g : β M} (e : α β) (he₀ : set.bij_on e s t) (he₁ : (x : α), x s f x = g (e x)) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) = finsum (λ (j : β), finsum (λ (H : j t), g j))

See also finset.sum_bij.

theorem finprod_mem_eq_of_bij_on {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {s : set α} {t : set β} {f : α M} {g : β M} (e : α β) (he₀ : set.bij_on e s t) (he₁ : (x : α), x s f x = g (e x)) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) = finprod (λ (j : β), finprod (λ (H : j t), g j))

See also finset.prod_bij.

theorem finprod_eq_of_bijective {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {f : α M} {g : β M} (e : α β) (he₀ : function.bijective e) (he₁ : (x : α), f x = g (e x)) :
finprod (λ (i : α), f i) = finprod (λ (j : β), g j)

See finprod_comp, fintype.prod_bijective and finset.prod_bij.

theorem finsum_eq_of_bijective {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {f : α M} {g : β M} (e : α β) (he₀ : function.bijective e) (he₁ : (x : α), f x = g (e x)) :
finsum (λ (i : α), f i) = finsum (λ (j : β), g j)

See finsum_comp, fintype.sum_bijective and finset.sum_bij.

theorem finprod_comp {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {g : β M} (e : α β) (he₀ : function.bijective e) :
finprod (λ (i : α), g (e i)) = finprod (λ (j : β), g j)

See also finprod_eq_of_bijective, fintype.prod_bijective and finset.prod_bij.

theorem finsum_comp {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {g : β M} (e : α β) (he₀ : function.bijective e) :
finsum (λ (i : α), g (e i)) = finsum (λ (j : β), g j)

See also finsum_eq_of_bijective, fintype.sum_bijective and finset.sum_bij.

theorem finprod_comp_equiv {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] (e : α β) {f : β M} :
finprod (λ (i : α), f (e i)) = finprod (λ (i' : β), f i')
theorem finsum_comp_equiv {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] (e : α β) {f : β M} :
finsum (λ (i : α), f (e i)) = finsum (λ (i' : β), f i')
theorem finsum_set_coe_eq_finsum_mem {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} (s : set α) :
finsum (λ (j : s), f j) = finsum (λ (i : α), finsum (λ (H : i s), f i))
theorem finprod_set_coe_eq_finprod_mem {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} (s : set α) :
finprod (λ (j : s), f j) = finprod (λ (i : α), finprod (λ (H : i s), f i))
theorem finsum_subtype_eq_finsum_cond {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} (p : α Prop) :
finsum (λ (j : subtype p), f j) = finsum (λ (i : α), finsum (λ (hi : p i), f i))
theorem finprod_subtype_eq_finprod_cond {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} (p : α Prop) :
finprod (λ (j : subtype p), f j) = finprod (λ (i : α), finprod (λ (hi : p i), f i))
theorem finprod_mem_inter_mul_diff' {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (t : set α) (h : (s function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) * finprod (λ (i : α), finprod (λ (H : i s \ t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i))
theorem finsum_mem_inter_add_diff' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (t : set α) (h : (s function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) + finsum (λ (i : α), finsum (λ (H : i s \ t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i))
theorem finsum_mem_inter_add_diff {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (t : set α) (h : s.finite) :
finsum (λ (i : α), finsum (λ (H : i s t), f i)) + finsum (λ (i : α), finsum (λ (H : i s \ t), f i)) = finsum (λ (i : α), finsum (λ (H : i s), f i))
theorem finprod_mem_inter_mul_diff {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (t : set α) (h : s.finite) :
finprod (λ (i : α), finprod (λ (H : i s t), f i)) * finprod (λ (i : α), finprod (λ (H : i s \ t), f i)) = finprod (λ (i : α), finprod (λ (H : i s), f i))
theorem finprod_mem_mul_diff' {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hst : s t) (ht : (t function.mul_support f).finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t \ s), f i)) = finprod (λ (i : α), finprod (λ (H : i t), f i))

A more general version of finprod_mem_mul_diff that requires t ∩ mul_support f rather than t to be finite.

theorem finsum_mem_add_diff' {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hst : s t) (ht : (t function.support f).finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t \ s), f i)) = finsum (λ (i : α), finsum (λ (H : i t), f i))

A more general version of finsum_mem_add_diff that requires t ∩ support f rather than t to be finite.

theorem finsum_mem_add_diff {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s t : set α} (hst : s t) (ht : t.finite) :
finsum (λ (i : α), finsum (λ (H : i s), f i)) + finsum (λ (i : α), finsum (λ (H : i t \ s), f i)) = finsum (λ (i : α), finsum (λ (H : i t), f i))

Given a finite set t and a subset s of t, the sum of f i over i ∈ s plus the sum of f i over t \ s equals the sum of f i over i ∈ t.

theorem finprod_mem_mul_diff {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s t : set α} (hst : s t) (ht : t.finite) :
finprod (λ (i : α), finprod (λ (H : i s), f i)) * finprod (λ (i : α), finprod (λ (H : i t \ s), f i)) = finprod (λ (i : α), finprod (λ (H : i t), f i))

Given a finite set t and a subset s of t, the product of f i over i ∈ s times the product of f i over t \ s equals the product of f i over i ∈ t.

theorem finsum_mem_Union {α : Type u_1} {ι : Type u_3} {M : Type u_5} [add_comm_monoid M] {f : α M} [finite ι] {t : ι set α} (h : pairwise (disjoint on t)) (ht : (i : ι), (t i).finite) :
finsum (λ (a : α), finsum (λ (H : a (i : ι), t i), f a)) = finsum (λ (i : ι), finsum (λ (a : α), finsum (λ (H : a t i), f a)))

Given a family of pairwise disjoint finite sets t i indexed by a finite type, the sum of f a over the union ⋃ i, t i is equal to the sum over all indexes i of the sums of f a over a ∈ t i.

theorem finprod_mem_Union {α : Type u_1} {ι : Type u_3} {M : Type u_5} [comm_monoid M] {f : α M} [finite ι] {t : ι set α} (h : pairwise (disjoint on t)) (ht : (i : ι), (t i).finite) :
finprod (λ (a : α), finprod (λ (H : a (i : ι), t i), f a)) = finprod (λ (i : ι), finprod (λ (a : α), finprod (λ (H : a t i), f a)))

Given a family of pairwise disjoint finite sets t i indexed by a finite type, the product of f a over the union ⋃ i, t i is equal to the product over all indexes i of the products of f a over a ∈ t i.

theorem finprod_mem_bUnion {α : Type u_1} {ι : Type u_3} {M : Type u_5} [comm_monoid M] {f : α M} {I : set ι} {t : ι set α} (h : I.pairwise_disjoint t) (hI : I.finite) (ht : (i : ι), i I (t i).finite) :
finprod (λ (a : α), finprod (λ (H : a (x : ι) (H : x I), t x), f a)) = finprod (λ (i : ι), finprod (λ (H : i I), finprod (λ (j : α), finprod (λ (H : j t i), f j))))

Given a family of sets t : ι → set α, a finite set I in the index type such that all sets t i, i ∈ I, are finite, if all t i, i ∈ I, are pairwise disjoint, then the product of f a over a ∈ ⋃ i ∈ I, t i is equal to the product over i ∈ I of the products of f a over a ∈ t i.

theorem finsum_mem_bUnion {α : Type u_1} {ι : Type u_3} {M : Type u_5} [add_comm_monoid M] {f : α M} {I : set ι} {t : ι set α} (h : I.pairwise_disjoint t) (hI : I.finite) (ht : (i : ι), i I (t i).finite) :
finsum (λ (a : α), finsum (λ (H : a (x : ι) (H : x I), t x), f a)) = finsum (λ (i : ι), finsum (λ (H : i I), finsum (λ (j : α), finsum (λ (H : j t i), f j))))

Given a family of sets t : ι → set α, a finite set I in the index type such that all sets t i, i ∈ I, are finite, if all t i, i ∈ I, are pairwise disjoint, then the sum of f a over a ∈ ⋃ i ∈ I, t i is equal to the sum over i ∈ I of the sums of f a over a ∈ t i.

theorem finsum_mem_sUnion {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {t : set (set α)} (h : t.pairwise_disjoint id) (ht₀ : t.finite) (ht₁ : (x : set α), x t x.finite) :
finsum (λ (a : α), finsum (λ (H : a ⋃₀ t), f a)) = finsum (λ (s : set α), finsum (λ (H : s t), finsum (λ (a : α), finsum (λ (H : a s), f a))))

If t is a finite set of pairwise disjoint finite sets, then the sum of f a over a ∈ ⋃₀ t is the sum over s ∈ t of the sums of f a over a ∈ s.

theorem finprod_mem_sUnion {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {t : set (set α)} (h : t.pairwise_disjoint id) (ht₀ : t.finite) (ht₁ : (x : set α), x t x.finite) :
finprod (λ (a : α), finprod (λ (H : a ⋃₀ t), f a)) = finprod (λ (s : set α), finprod (λ (H : s t), finprod (λ (a : α), finprod (λ (H : a s), f a))))

If t is a finite set of pairwise disjoint finite sets, then the product of f a over a ∈ ⋃₀ t is the product over s ∈ t of the products of f a over a ∈ s.

theorem mul_finprod_cond_ne {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} (a : α) (hf : (function.mul_support f).finite) :
f a * finprod (λ (i : α), finprod (λ (H : i a), f i)) = finprod (λ (i : α), f i)
theorem add_finsum_cond_ne {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} (a : α) (hf : (function.support f).finite) :
f a + finsum (λ (i : α), finsum (λ (H : i a), f i)) = finsum (λ (i : α), f i)
theorem finprod_mem_comm {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {s : set α} {t : set β} (f : α β M) (hs : s.finite) (ht : t.finite) :
finprod (λ (i : α), finprod (λ (H : i s), finprod (λ (j : β), finprod (λ (H : j t), f i j)))) = finprod (λ (j : β), finprod (λ (H : j t), finprod (λ (i : α), finprod (λ (H : i s), f i j))))

If s : set α and t : set β are finite sets, then taking the product over s commutes with taking the product over t.

theorem finsum_mem_comm {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {s : set α} {t : set β} (f : α β M) (hs : s.finite) (ht : t.finite) :
finsum (λ (i : α), finsum (λ (H : i s), finsum (λ (j : β), finsum (λ (H : j t), f i j)))) = finsum (λ (j : β), finsum (λ (H : j t), finsum (λ (i : α), finsum (λ (H : i s), f i j))))

If s : set α and t : set β are finite sets, then summing over s commutes with summing over t.

theorem finprod_mem_induction {α : Type u_1} {M : Type u_5} [comm_monoid M] {f : α M} {s : set α} (p : M Prop) (hp₀ : p 1) (hp₁ : (x y : M), p x p y p (x * y)) (hp₂ : (x : α), x s p (f x)) :
p (finprod (λ (i : α), finprod (λ (H : i s), f i)))

To prove a property of a finite product, it suffices to prove that the property is multiplicative and holds on factors.

theorem finsum_mem_induction {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {f : α M} {s : set α} (p : M Prop) (hp₀ : p 0) (hp₁ : (x y : M), p x p y p (x + y)) (hp₂ : (x : α), x s p (f x)) :
p (finsum (λ (i : α), finsum (λ (H : i s), f i)))

To prove a property of a finite sum, it suffices to prove that the property is additive and holds on summands.

theorem finprod_cond_nonneg {α : Type u_1} {R : Type u_2} [ordered_comm_semiring R] {p : α Prop} {f : α R} (hf : (x : α), p x 0 f x) :
0 finprod (λ (x : α), finprod (λ (h : p x), f x))
theorem single_le_finsum {α : Type u_1} {M : Type u_2} [ordered_add_comm_monoid M] (i : α) {f : α M} (hf : (function.support f).finite) (h : (j : α), 0 f j) :
f i finsum (λ (j : α), f j)
theorem single_le_finprod {α : Type u_1} {M : Type u_2} [ordered_comm_monoid M] (i : α) {f : α M} (hf : (function.mul_support f).finite) (h : (j : α), 1 f j) :
f i finprod (λ (j : α), f j)
theorem finprod_eq_zero {α : Type u_1} {M₀ : Type u_2} [comm_monoid_with_zero M₀] (f : α M₀) (x : α) (hx : f x = 0) (hf : (function.mul_support f).finite) :
finprod (λ (x : α), f x) = 0
theorem finsum_sum_comm {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] (s : finset β) (f : α β M) (h : (b : β), b s (function.support (λ (a : α), f a b)).finite) :
finsum (λ (a : α), s.sum (λ (b : β), f a b)) = s.sum (λ (b : β), finsum (λ (a : α), f a b))
theorem finprod_prod_comm {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] (s : finset β) (f : α β M) (h : (b : β), b s (function.mul_support (λ (a : α), f a b)).finite) :
finprod (λ (a : α), s.prod (λ (b : β), f a b)) = s.prod (λ (b : β), finprod (λ (a : α), f a b))
theorem sum_finsum_comm {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] (s : finset α) (f : α β M) (h : (a : α), a s (function.support (f a)).finite) :
s.sum (λ (a : α), finsum (λ (b : β), f a b)) = finsum (λ (b : β), s.sum (λ (a : α), f a b))
theorem prod_finprod_comm {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] (s : finset α) (f : α β M) (h : (a : α), a s (function.mul_support (f a)).finite) :
s.prod (λ (a : α), finprod (λ (b : β), f a b)) = finprod (λ (b : β), s.prod (λ (a : α), f a b))
theorem mul_finsum {α : Type u_1} {R : Type u_2} [semiring R] (f : α R) (r : R) (h : (function.support f).finite) :
r * finsum (λ (a : α), f a) = finsum (λ (a : α), r * f a)
theorem finsum_mul {α : Type u_1} {R : Type u_2} [semiring R] (f : α R) (r : R) (h : (function.support f).finite) :
finsum (λ (a : α), f a) * r = finsum (λ (a : α), f a * r)
theorem finset.mul_support_of_fiberwise_prod_subset_image {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] [decidable_eq β] (s : finset α) (f : α M) (g : α β) :
function.mul_support (λ (b : β), (finset.filter (λ (a : α), g a = b) s).prod f) (finset.image g s)
theorem finset.support_of_fiberwise_sum_subset_image {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] [decidable_eq β] (s : finset α) (f : α M) (g : α β) :
function.support (λ (b : β), (finset.filter (λ (a : α), g a = b) s).sum f) (finset.image g s)
theorem finsum_mem_finset_product' {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] [decidable_eq α] [decidable_eq β] (s : finset × β)) (f : α × β M) :
finsum (λ (ab : α × β), finsum (λ (h : ab s), f ab)) = finsum (λ (a : α), finsum (λ (b : β), finsum (λ (h : b finset.image prod.snd (finset.filter (λ (ab : α × β), ab.fst = a) s)), f (a, b))))

Note that b ∈ (s.filter (λ ab, prod.fst ab = a)).image prod.snd iff (a, b) ∈ s so we can simplify the right hand side of this lemma. However the form stated here is more useful for iterating this lemma, e.g., if we have f : α × β × γ → M.

theorem finprod_mem_finset_product' {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] [decidable_eq α] [decidable_eq β] (s : finset × β)) (f : α × β M) :
finprod (λ (ab : α × β), finprod (λ (h : ab s), f ab)) = finprod (λ (a : α), finprod (λ (b : β), finprod (λ (h : b finset.image prod.snd (finset.filter (λ (ab : α × β), ab.fst = a) s)), f (a, b))))

Note that b ∈ (s.filter (λ ab, prod.fst ab = a)).image prod.snd iff (a, b) ∈ s so we can simplify the right hand side of this lemma. However the form stated here is more useful for iterating this lemma, e.g., if we have f : α × β × γ → M.

theorem finsum_mem_finset_product {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] (s : finset × β)) (f : α × β M) :
finsum (λ (ab : α × β), finsum (λ (h : ab s), f ab)) = finsum (λ (a : α), finsum (λ (b : β), finsum (λ (h : (a, b) s), f (a, b))))

See also finsum_mem_finset_product'.

theorem finprod_mem_finset_product {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] (s : finset × β)) (f : α × β M) :
finprod (λ (ab : α × β), finprod (λ (h : ab s), f ab)) = finprod (λ (a : α), finprod (λ (b : β), finprod (λ (h : (a, b) s), f (a, b))))

See also finprod_mem_finset_product'.

theorem finprod_mem_finset_product₃ {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {γ : Type u_3} (s : finset × β × γ)) (f : α × β × γ M) :
finprod (λ (abc : α × β × γ), finprod (λ (h : abc s), f abc)) = finprod (λ (a : α), finprod (λ (b : β), finprod (λ (c : γ), finprod (λ (h : (a, b, c) s), f (a, b, c)))))
theorem finsum_mem_finset_product₃ {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {γ : Type u_3} (s : finset × β × γ)) (f : α × β × γ M) :
finsum (λ (abc : α × β × γ), finsum (λ (h : abc s), f abc)) = finsum (λ (a : α), finsum (λ (b : β), finsum (λ (c : γ), finsum (λ (h : (a, b, c) s), f (a, b, c)))))
theorem finprod_curry {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] (f : α × β M) (hf : (function.mul_support f).finite) :
finprod (λ (ab : α × β), f ab) = finprod (λ (a : α), finprod (λ (b : β), f (a, b)))
theorem finsum_curry {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] (f : α × β M) (hf : (function.support f).finite) :
finsum (λ (ab : α × β), f ab) = finsum (λ (a : α), finsum (λ (b : β), f (a, b)))
theorem finsum_curry₃ {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {γ : Type u_3} (f : α × β × γ M) (h : (function.support f).finite) :
finsum (λ (abc : α × β × γ), f abc) = finsum (λ (a : α), finsum (λ (b : β), finsum (λ (c : γ), f (a, b, c))))
theorem finprod_curry₃ {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {γ : Type u_3} (f : α × β × γ M) (h : (function.mul_support f).finite) :
finprod (λ (abc : α × β × γ), f abc) = finprod (λ (a : α), finprod (λ (b : β), finprod (λ (c : γ), f (a, b, c))))
theorem finprod_dmem {α : Type u_1} {M : Type u_5} [comm_monoid M] {s : set α} [decidable_pred (λ (_x : α), _x s)] (f : Π (a : α), a s M) :
finprod (λ (a : α), finprod (λ (h : a s), f a h)) = finprod (λ (a : α), finprod (λ (h : a s), dite (a s) (λ (h' : a s), f a h') (λ (h' : a s), 1)))
theorem finsum_dmem {α : Type u_1} {M : Type u_5} [add_comm_monoid M] {s : set α} [decidable_pred (λ (_x : α), _x s)] (f : Π (a : α), a s M) :
finsum (λ (a : α), finsum (λ (h : a s), f a h)) = finsum (λ (a : α), finsum (λ (h : a s), dite (a s) (λ (h' : a s), f a h') (λ (h' : a s), 0)))
theorem finprod_emb_domain' {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] {f : α β} (hf : function.injective f) [decidable_pred (λ (_x : β), _x set.range f)] (g : α M) :
finprod (λ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 1)) = finprod (λ (a : α), g a)
theorem finsum_emb_domain' {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] {f : α β} (hf : function.injective f) [decidable_pred (λ (_x : β), _x set.range f)] (g : α M) :
finsum (λ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 0)) = finsum (λ (a : α), g a)
theorem finprod_emb_domain {α : Type u_1} {β : Type u_2} {M : Type u_5} [comm_monoid M] (f : α β) [decidable_pred (λ (_x : β), _x set.range f)] (g : α M) :
finprod (λ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 1)) = finprod (λ (a : α), g a)
theorem finsum_emb_domain {α : Type u_1} {β : Type u_2} {M : Type u_5} [add_comm_monoid M] (f : α β) [decidable_pred (λ (_x : β), _x set.range f)] (g : α M) :
finsum (λ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 0)) = finsum (λ (a : α), g a)