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.

Todo #

We did not add is_finite (X : Type) : Prop, because it is simply nonempty (fintype X). There is work on fincard in the pipeline, which returns the cardinality of X if it is finite, and 0 otherwise.

Tags #

finsum, finprod, finite sum, finite product

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

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
def finprod {M : Type u_1} {α : Sort u_3} [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_1} {α : Sort u_3} [add_comm_monoid M] {f : α → M} (hf : (function.support (f plift.down)).finite) {s : finset (plift α)} (hs : hf.to_finset s) :
∑ᶠ (i : α), f i = ∑ (i : plift α) in s, f i.down
theorem finprod_eq_prod_plift_of_mul_support_to_finset_subset {M : Type u_1} {α : Sort u_3} [comm_monoid M] {f : α → M} (hf : (function.mul_support (f plift.down)).finite) {s : finset (plift α)} (hs : hf.to_finset s) :
∏ᶠ (i : α), f i = ∏ (i : plift α) in s, f i.down
theorem finsum_eq_sum_plift_of_support_subset {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] {f : α → M} {s : finset (plift α)} (hs : function.support (f plift.down) s) :
∑ᶠ (i : α), f i = ∑ (i : plift α) in s, f i.down
theorem finprod_eq_prod_plift_of_mul_support_subset {M : Type u_1} {α : Sort u_3} [comm_monoid M] {f : α → M} {s : finset (plift α)} (hs : function.mul_support (f plift.down) s) :
∏ᶠ (i : α), f i = ∏ (i : plift α) in s, f i.down
@[simp]
theorem finsum_zero {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] :
∑ᶠ (i : α), 0 = 0
@[simp]
theorem finprod_one {M : Type u_1} {α : Sort u_3} [comm_monoid M] :
∏ᶠ (i : α), 1 = 1
theorem finprod_of_is_empty {M : Type u_1} {α : Sort u_3} [comm_monoid M] [is_empty α] (f : α → M) :
∏ᶠ (i : α), f i = 1
theorem finsum_of_is_empty {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] [is_empty α] (f : α → M) :
∑ᶠ (i : α), f i = 0
@[simp]
theorem finsum_false {M : Type u_1} [add_comm_monoid M] (f : false → M) :
∑ᶠ (i : false), f i = 0
@[simp]
theorem finprod_false {M : Type u_1} [comm_monoid M] (f : false → M) :
∏ᶠ (i : false), f i = 1
theorem finsum_eq_single {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] (f : α → M) (a : α) (ha : ∀ (x : α), x af x = 0) :
∑ᶠ (x : α), f x = f a
theorem finprod_eq_single {M : Type u_1} {α : Sort u_3} [comm_monoid M] (f : α → M) (a : α) (ha : ∀ (x : α), x af x = 1) :
∏ᶠ (x : α), f x = f a
theorem finprod_unique {M : Type u_1} {α : Sort u_3} [comm_monoid M] [unique α] (f : α → M) :
∏ᶠ (i : α), f i = f (default α)
theorem finsum_unique {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] [unique α] (f : α → M) :
∑ᶠ (i : α), f i = f (default α)
@[simp]
theorem finsum_true {M : Type u_1} [add_comm_monoid M] (f : true → M) :
∑ᶠ (i : true), f i = f trivial
@[simp]
theorem finprod_true {M : Type u_1} [comm_monoid M] (f : true → M) :
∏ᶠ (i : true), f i = f trivial
theorem finsum_eq_dif {M : Type u_1} [add_comm_monoid M] {p : Prop} [decidable p] (f : p → M) :
∑ᶠ (i : p), f i = dite p (λ (h : p), f h) (λ (h : ¬p), 0)
theorem finprod_eq_dif {M : Type u_1} [comm_monoid M] {p : Prop} [decidable p] (f : p → M) :
∏ᶠ (i : p), f i = dite p (λ (h : p), f h) (λ (h : ¬p), 1)
theorem finsum_eq_if {M : Type u_1} [add_comm_monoid M] {p : Prop} [decidable p] {x : M} :
∑ᶠ (i : p), x = ite p x 0
theorem finprod_eq_if {M : Type u_1} [comm_monoid M] {p : Prop} [decidable p] {x : M} :
∏ᶠ (i : p), x = ite p x 1
theorem finsum_congr {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] {f g : α → M} (h : ∀ (x : α), f x = g x) :
theorem finprod_congr {M : Type u_1} {α : Sort u_3} [comm_monoid M] {f g : α → M} (h : ∀ (x : α), f x = g x) :
theorem finsum_congr_Prop {M : Type u_1} [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_1} [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_1} {α : Sort u_3} [comm_monoid M] {f : α → M} (p : M → Prop) (hp₀ : p 1) (hp₁ : ∀ (x y : M), p xp yp (x * y)) (hp₂ : ∀ (i : α), p (f i)) :
p (∏ᶠ (i : α), f i)

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

theorem finsum_induction {M : Type u_1} {α : Sort u_3} [add_comm_monoid M] {f : α → M} (p : M → Prop) (hp₀ : p 0) (hp₁ : ∀ (x y : M), p xp yp (x + y)) (hp₂ : ∀ (i : α), p (f i)) :
p (∑ᶠ (i : α), 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_nonneg {α : Sort u_3} {R : Type u_1} [ordered_comm_semiring R] {f : α → R} (hf : ∀ (x : α), 0 f x) :
0 ∏ᶠ (x : α), f x
theorem finsum_nonneg {α : Sort u_3} {M : Type u_1} [ordered_add_comm_monoid M] {f : α → M} (hf : ∀ (i : α), 0 f i) :
0 ∑ᶠ (i : α), f i
theorem one_le_finprod' {α : Sort u_3} {M : Type u_1} [ordered_comm_monoid M] {f : α → M} (hf : ∀ (i : α), 1 f i) :
1 ∏ᶠ (i : α), f i
theorem monoid_hom.map_finprod_plift {M : Type u_1} {N : Type u_2} {α : Sort u_3} [comm_monoid M] [comm_monoid N] (f : M →* N) (g : α → M) (h : (function.mul_support (g plift.down)).finite) :
f (∏ᶠ (x : α), g x) = ∏ᶠ (x : α), f (g x)
theorem add_monoid_hom.map_finsum_plift {M : Type u_1} {N : Type u_2} {α : Sort u_3} [add_comm_monoid M] [add_comm_monoid N] (f : M →+ N) (g : α → M) (h : (function.support (g plift.down)).finite) :
f (∑ᶠ (x : α), g x) = ∑ᶠ (x : α), f (g x)
theorem add_monoid_hom.map_finsum_Prop {M : Type u_1} {N : Type u_2} [add_comm_monoid M] [add_comm_monoid N] {p : Prop} (f : M →+ N) (g : p → M) :
f (∑ᶠ (x : p), g x) = ∑ᶠ (x : p), f (g x)
theorem monoid_hom.map_finprod_Prop {M : Type u_1} {N : Type u_2} [comm_monoid M] [comm_monoid N] {p : Prop} (f : M →* N) (g : p → M) :
f (∏ᶠ (x : p), g x) = ∏ᶠ (x : p), f (g x)
theorem finprod_eq_mul_indicator_apply {α : Type u_1} {M : Type u_4} [comm_monoid M] (s : set α) (f : α → M) (a : α) :
∏ᶠ (h : a s), f a = s.mul_indicator f a
theorem finsum_eq_indicator_apply {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (s : set α) (f : α → M) (a : α) :
∑ᶠ (h : a s), f a = s.indicator f a
@[simp]
theorem finprod_mem_mul_support {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (a : α) :
∏ᶠ (h : f a 1), f a = f a
@[simp]
theorem finsum_mem_support {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (a : α) :
∑ᶠ (h : f a 0), f a = f a
theorem finprod_mem_def {α : Type u_1} {M : Type u_4} [comm_monoid M] (s : set α) (f : α → M) :
∏ᶠ (a : α) (H : a s), f a = ∏ᶠ (a : α), s.mul_indicator f a
theorem finsum_mem_def {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (s : set α) (f : α → M) :
∑ᶠ (a : α) (H : a s), f a = ∑ᶠ (a : α), s.indicator f a
theorem finsum_eq_sum_of_support_subset {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) {s : finset α} (h : function.support f s) :
∑ᶠ (i : α), f i = ∑ (i : α) in s, f i
theorem finprod_eq_prod_of_mul_support_subset {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) {s : finset α} (h : function.mul_support f s) :
∏ᶠ (i : α), f i = ∏ (i : α) in s, f i
theorem finsum_eq_sum_of_support_to_finset_subset {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (hf : (function.support f).finite) {s : finset α} (h : hf.to_finset s) :
∑ᶠ (i : α), f i = ∑ (i : α) in s, f i
theorem finprod_eq_prod_of_mul_support_to_finset_subset {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (hf : (function.mul_support f).finite) {s : finset α} (h : hf.to_finset s) :
∏ᶠ (i : α), f i = ∏ (i : α) in s, f i
theorem finprod_def {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) [decidable (function.mul_support f).finite] :
∏ᶠ (i : α), f i = dite (function.mul_support f).finite (λ (h : (function.mul_support f).finite), ∏ (i : α) in h.to_finset, f i) (λ (h : ¬(function.mul_support f).finite), 1)
theorem finsum_def {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) [decidable (function.support f).finite] :
∑ᶠ (i : α), f i = dite (function.support f).finite (λ (h : (function.support f).finite), ∑ (i : α) in h.to_finset, f i) (λ (h : ¬(function.support f).finite), 0)
theorem finsum_of_infinite_support {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} (hf : (function.support f).infinite) :
∑ᶠ (i : α), f i = 0
theorem finprod_of_infinite_mul_support {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} (hf : (function.mul_support f).infinite) :
∏ᶠ (i : α), f i = 1
theorem finsum_eq_sum {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (hf : (function.support f).finite) :
∑ᶠ (i : α), f i = ∑ (i : α) in hf.to_finset, f i
theorem finprod_eq_prod {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (hf : (function.mul_support f).finite) :
∏ᶠ (i : α), f i = ∏ (i : α) in hf.to_finset, f i
theorem finprod_eq_prod_of_fintype {α : Type u_1} {M : Type u_4} [comm_monoid M] [fintype α] (f : α → M) :
∏ᶠ (i : α), f i = ∏ (i : α), f i
theorem finsum_eq_sum_of_fintype {α : Type u_1} {M : Type u_4} [add_comm_monoid M] [fintype α] (f : α → M) :
∑ᶠ (i : α), f i = ∑ (i : α), f i
theorem finsum_cond_eq_sum_of_cond_iff {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) {p : α → Prop} {t : finset α} (h : ∀ {x : α}, f x 0(p x x t)) :
∑ᶠ (i : α) (hi : p i), f i = ∑ (i : α) in t, f i
theorem finprod_cond_eq_prod_of_cond_iff {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) {p : α → Prop} {t : finset α} (h : ∀ {x : α}, f x 1(p x x t)) :
∏ᶠ (i : α) (hi : p i), f i = ∏ (i : α) in t, f i
theorem finsum_mem_eq_sum_of_inter_support_eq {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) {s : set α} {t : finset α} (h : s function.support f = t function.support f) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in t, f i
theorem finprod_mem_eq_prod_of_inter_mul_support_eq {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) {s : set α} {t : finset α} (h : s function.mul_support f = t function.mul_support f) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in t, f i
theorem finsum_mem_eq_sum_of_subset {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) {s : set α} {t : finset α} (h₁ : s function.support f t) (h₂ : t s) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in t, f i
theorem finprod_mem_eq_prod_of_subset {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) {s : set α} {t : finset α} (h₁ : s function.mul_support f t) (h₂ : t s) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in t, f i
theorem finsum_mem_eq_sum {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) {s : set α} (hf : (s function.support f).finite) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in hf.to_finset, f i
theorem finprod_mem_eq_prod {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) {s : set α} (hf : (s function.mul_support f).finite) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in hf.to_finset, f i
theorem finsum_mem_eq_sum_filter {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s : set α) [decidable_pred (λ (_x : α), _x s)] (hf : (function.support f).finite) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in finset.filter (λ (_x : α), _x s) hf.to_finset, f i
theorem finprod_mem_eq_prod_filter {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s : set α) [decidable_pred (λ (_x : α), _x s)] (hf : (function.mul_support f).finite) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in finset.filter (λ (_x : α), _x s) hf.to_finset, f i
theorem finprod_mem_eq_to_finset_prod {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s : set α) [fintype s] :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in s.to_finset, f i
theorem finsum_mem_eq_to_finset_sum {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s : set α) [fintype s] :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in s.to_finset, f i
theorem finprod_mem_eq_finite_to_finset_prod {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) {s : set α} (hs : s.finite) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in hs.to_finset, f i
theorem finsum_mem_eq_finite_to_finset_sum {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) {s : set α} (hs : s.finite) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in hs.to_finset, f i
theorem finprod_mem_finset_eq_prod {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s : finset α) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in s, f i
theorem finsum_mem_finset_eq_sum {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s : finset α) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in s, f i
theorem finprod_mem_coe_finset {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s : finset α) :
∏ᶠ (i : α) (H : i s), f i = ∏ (i : α) in s, f i
theorem finsum_mem_coe_finset {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s : finset α) :
∑ᶠ (i : α) (H : i s), f i = ∑ (i : α) in s, f i
theorem finsum_mem_eq_zero_of_infinite {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set α} (hs : (s function.support f).infinite) :
∑ᶠ (i : α) (H : i s), f i = 0
theorem finprod_mem_eq_one_of_infinite {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (hs : (s function.mul_support f).infinite) :
∏ᶠ (i : α) (H : i s), f i = 1
theorem finprod_mem_inter_mul_support {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s : set α) :
∏ᶠ (i : α) (H : i s function.mul_support f), f i = ∏ᶠ (i : α) (H : i s), f i
theorem finsum_mem_inter_support {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s : set α) :
∑ᶠ (i : α) (H : i s function.support f), f i = ∑ᶠ (i : α) (H : i s), f i
theorem finprod_mem_inter_mul_support_eq {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s t : set α) (h : s function.mul_support f = t function.mul_support f) :
∏ᶠ (i : α) (H : i s), f i = ∏ᶠ (i : α) (H : i t), f i
theorem finsum_mem_inter_support_eq {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s t : set α) (h : s function.support f = t function.support f) :
∑ᶠ (i : α) (H : i s), f i = ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_inter_mul_support_eq' {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s t : set α) (h : ∀ (x : α), x function.mul_support f(x s x t)) :
∏ᶠ (i : α) (H : i s), f i = ∏ᶠ (i : α) (H : i t), f i
theorem finsum_mem_inter_support_eq' {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) (s t : set α) (h : ∀ (x : α), x function.support f(x s x t)) :
∑ᶠ (i : α) (H : i s), f i = ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_univ {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) :
∏ᶠ (i : α) (H : i set.univ), f i = ∏ᶠ (i : α), f i
theorem finsum_mem_univ {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (f : α → M) :
∑ᶠ (i : α) (H : i set.univ), f i = ∑ᶠ (i : α), f i
theorem finprod_mem_congr {α : Type u_1} {M : Type u_4} [comm_monoid M] {f g : α → M} {s t : set α} (h₀ : s = t) (h₁ : ∀ (x : α), x tf x = g x) :
∏ᶠ (i : α) (H : i s), f i = ∏ᶠ (i : α) (H : i t), g i
theorem finsum_mem_congr {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f g : α → M} {s t : set α} (h₀ : s = t) (h₁ : ∀ (x : α), x tf x = g x) :
∑ᶠ (i : α) (H : i s), f i = ∑ᶠ (i : α) (H : i t), g i

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

theorem finprod_mul_distrib {α : Type u_1} {M : Type u_4} [comm_monoid M] {f g : α → M} (hf : (function.mul_support f).finite) (hg : (function.mul_support g).finite) :
∏ᶠ (i : α), (f i) * g i = (∏ᶠ (i : α), f i) * ∏ᶠ (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 over g i.

theorem finsum_add_distrib {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f g : α → M} (hf : (function.support f).finite) (hg : (function.support g).finite) :
∑ᶠ (i : α), (f i + g i) = ∑ᶠ (i : α), f i + ∑ᶠ (i : α), g i
theorem finprod_mem_mul_distrib' {α : Type u_1} {M : Type u_4} [comm_monoid M] {f g : α → M} {s : set α} (hf : (s function.mul_support f).finite) (hg : (s function.mul_support g).finite) :
∏ᶠ (i : α) (H : i s), (f i) * g i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (H : i s), g i

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

theorem finsum_mem_add_distrib' {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f g : α → M} {s : set α} (hf : (s function.support f).finite) (hg : (s function.support g).finite) :
∑ᶠ (i : α) (H : i s), (f i + g i) = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i s), g i
theorem finprod_mem_one {α : Type u_1} {M : Type u_4} [comm_monoid M] (s : set α) :
∏ᶠ (i : α) (H : i s), 1 = 1

The product of constant one over any set equals one.

theorem finsum_mem_zero {α : Type u_1} {M : Type u_4} [add_comm_monoid M] (s : set α) :
∑ᶠ (i : α) (H : i s), 0 = 0
theorem finprod_mem_of_eq_on_one {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (hf : set.eq_on f 1 s) :
∏ᶠ (i : α) (H : i s), f i = 1

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

theorem finsum_mem_of_eq_on_zero {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set α} (hf : set.eq_on f 0 s) :
∑ᶠ (i : α) (H : i s), f i = 0
theorem exists_ne_one_of_finprod_mem_ne_one {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (h : ∏ᶠ (i : α) (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 one, 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_4} [add_comm_monoid M] {f : α → M} {s : set α} (h : ∑ᶠ (i : α) (H : i s), f i 0) :
∃ (x : α) (H : x s), f x 0
theorem finprod_mem_mul_distrib {α : Type u_1} {M : Type u_4} [comm_monoid M] {f g : α → M} {s : set α} (hs : s.finite) :
∏ᶠ (i : α) (H : i s), (f i) * g i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (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_4} [add_comm_monoid M] {f g : α → M} {s : set α} (hs : s.finite) :
∑ᶠ (i : α) (H : i s), (f i + g i) = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i s), g i
theorem add_monoid_hom.map_finsum {α : Type u_1} {M : Type u_4} {N : Type u_5} [add_comm_monoid M] [add_comm_monoid N] {f : α → M} (g : M →+ N) (hf : (function.support f).finite) :
g (∑ᶠ (i : α), f i) = ∑ᶠ (i : α), g (f i)
theorem monoid_hom.map_finprod {α : Type u_1} {M : Type u_4} {N : Type u_5} [comm_monoid M] [comm_monoid N] {f : α → M} (g : M →* N) (hf : (function.mul_support f).finite) :
g (∏ᶠ (i : α), f i) = ∏ᶠ (i : α), g (f i)
theorem monoid_hom.map_finprod_mem' {α : Type u_1} {M : Type u_4} {N : Type u_5} [comm_monoid M] [comm_monoid N] {s : set α} {f : α → M} (g : M →* N) (h₀ : (s function.mul_support f).finite) :
g (∏ᶠ (j : α) (H : j s), f j) = ∏ᶠ (i : α) (H : i s), g (f i)

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

theorem add_monoid_hom.map_finsum_mem' {α : Type u_1} {M : Type u_4} {N : Type u_5} [add_comm_monoid M] [add_comm_monoid N] {s : set α} {f : α → M} (g : M →+ N) (h₀ : (s function.support f).finite) :
g (∑ᶠ (j : α) (H : j s), f j) = ∑ᶠ (i : α) (H : i s), g (f i)
theorem monoid_hom.map_finprod_mem {α : Type u_1} {M : Type u_4} {N : Type u_5} [comm_monoid M] [comm_monoid N] {s : set α} (f : α → M) (g : M →* N) (hs : s.finite) :
g (∏ᶠ (j : α) (H : j s), f j) = ∏ᶠ (i : α) (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_4} {N : Type u_5} [add_comm_monoid M] [add_comm_monoid N] {s : set α} (f : α → M) (g : M →+ N) (hs : s.finite) :
g (∑ᶠ (j : α) (H : j s), f j) = ∑ᶠ (i : α) (H : i s), g (f i)

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

theorem finprod_mem_empty {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} :
∏ᶠ (i : α) (H : i ), f i = 1

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

theorem finsum_mem_empty {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} :
∑ᶠ (i : α) (H : i ), f i = 0
theorem nonempty_of_finprod_mem_ne_one {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (h : ∏ᶠ (i : α) (H : i s), f i 1) :

A set s is not empty if the product of some function over s is not equal to one.

theorem nonempty_of_finsum_mem_ne_zero {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set α} (h : ∑ᶠ (i : α) (H : i s), f i 0) :
theorem finsum_mem_union_inter {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s t : set α} (hs : s.finite) (ht : t.finite) :
∑ᶠ (i : α) (H : i s t), f i + ∑ᶠ (i : α) (H : i s t), f i = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_union_inter {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s t : set α} (hs : s.finite) (ht : t.finite) :
(∏ᶠ (i : α) (H : i s t), f i) * ∏ᶠ (i : α) (H : i s t), f i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (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_4} [comm_monoid M] {f : α → M} {s t : set α} (hs : (s function.mul_support f).finite) (ht : (t function.mul_support f).finite) :
(∏ᶠ (i : α) (H : i s t), f i) * ∏ᶠ (i : α) (H : i s t), f i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (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 instead of s and t to be finite.

theorem finsum_mem_union_inter' {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s t : set α} (hs : (s function.support f).finite) (ht : (t function.support f).finite) :
∑ᶠ (i : α) (H : i s t), f i + ∑ᶠ (i : α) (H : i s t), f i = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_union' {α : Type u_1} {M : Type u_4} [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) :
∏ᶠ (i : α) (H : i s t), f i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (H : i t), f i

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

theorem finsum_mem_union' {α : Type u_1} {M : Type u_4} [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) :
∑ᶠ (i : α) (H : i s t), f i = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_union {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s t : set α} (hst : disjoint s t) (hs : s.finite) (ht : t.finite) :
∏ᶠ (i : α) (H : i s t), f i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (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_4} [add_comm_monoid M] {f : α → M} {s t : set α} (hst : disjoint s t) (hs : s.finite) (ht : t.finite) :
∑ᶠ (i : α) (H : i s t), f i = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_union'' {α : Type u_1} {M : Type u_4} [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) :
∏ᶠ (i : α) (H : i s t), f i = (∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (H : i t), f i

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

theorem finsum_mem_union'' {α : Type u_1} {M : Type u_4} [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) :
∑ᶠ (i : α) (H : i s t), f i = ∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_singleton {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {a : α} :
∏ᶠ (i : α) (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_4} [add_comm_monoid M] {f : α → M} {a : α} :
∑ᶠ (i : α) (H : i {a}), f i = f a
@[simp]
theorem finsum_cond_eq_left {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {a : α} :
∑ᶠ (i : α) (H : i = a), f i = f a
@[simp]
theorem finprod_cond_eq_left {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {a : α} :
∏ᶠ (i : α) (H : i = a), f i = f a
@[simp]
theorem finprod_cond_eq_right {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {a : α} :
∏ᶠ (i : α) (hi : a = i), f i = f a
@[simp]
theorem finsum_cond_eq_right {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {a : α} :
∑ᶠ (i : α) (hi : a = i), f i = f a
theorem finsum_mem_insert' {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {a : α} {s : set α} (f : α → M) (h : a s) (hs : (s function.support f).finite) :
∑ᶠ (i : α) (H : i insert a s), f i = f a + ∑ᶠ (i : α) (H : i s), f i
theorem finprod_mem_insert' {α : Type u_1} {M : Type u_4} [comm_monoid M] {a : α} {s : set α} (f : α → M) (h : a s) (hs : (s function.mul_support f).finite) :
∏ᶠ (i : α) (H : i insert a s), f i = (f a) * ∏ᶠ (i : α) (H : i s), f i

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

theorem finsum_mem_insert {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {a : α} {s : set α} (f : α → M) (h : a s) (hs : s.finite) :
∑ᶠ (i : α) (H : i insert a s), f i = f a + ∑ᶠ (i : α) (H : i s), f i
theorem finprod_mem_insert {α : Type u_1} {M : Type u_4} [comm_monoid M] {a : α} {s : set α} (f : α → M) (h : a s) (hs : s.finite) :
∏ᶠ (i : α) (H : i insert a s), f i = (f a) * ∏ᶠ (i : α) (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_4} [add_comm_monoid M] {f : α → M} {a : α} {s : set α} (h : a sf a = 0) :
∑ᶠ (i : α) (H : i insert a s), f i = ∑ᶠ (i : α) (H : i s), f i
theorem finprod_mem_insert_of_eq_one_if_not_mem {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {a : α} {s : set α} (h : a sf a = 1) :
∏ᶠ (i : α) (H : i insert a s), f i = ∏ᶠ (i : α) (H : i s), f i

If f a = 1 for all 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_4} [add_comm_monoid M] {f : α → M} {a : α} {s : set α} (h : f a = 0) :
∑ᶠ (i : α) (H : i insert a s), f i = ∑ᶠ (i : α) (H : i s), f i
theorem finprod_mem_insert_one {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {a : α} {s : set α} (h : f a = 1) :
∏ᶠ (i : α) (H : i insert a s), f i = ∏ᶠ (i : α) (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_pair {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {a b : α} (h : a b) :
∏ᶠ (i : α) (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_4} [add_comm_monoid M] {f : α → M} {a b : α} (h : a b) :
∑ᶠ (i : α) (H : i {a, b}), f i = f a + f b
theorem finsum_mem_image' {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set β} {g : β → α} (hg : set.inj_on g (s function.support (f g))) :
∑ᶠ (i : α) (H : i g '' s), f i = ∑ᶠ (j : β) (H : j s), f (g j)
theorem finprod_mem_image' {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set β} {g : β → α} (hg : set.inj_on g (s function.mul_support (f g))) :
∏ᶠ (i : α) (H : i g '' s), f i = ∏ᶠ (j : β) (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} {M : Type u_4} [add_comm_monoid M] {f : α → M} {β : Type u_2} {s : set β} {g : β → α} (hg : set.inj_on g s) :
∑ᶠ (i : α) (H : i g '' s), f i = ∑ᶠ (j : β) (H : j s), f (g j)
theorem finprod_mem_image {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {β : Type u_2} {s : set β} {g : β → α} (hg : set.inj_on g s) :
∏ᶠ (i : α) (H : i g '' s), f i = ∏ᶠ (j : β) (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_4} [add_comm_monoid M] {f : α → M} {g : β → α} (hg : set.inj_on g (function.support (f g))) :
∑ᶠ (i : α) (H : i set.range g), f i = ∑ᶠ (j : β), f (g j)
theorem finprod_mem_range' {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {f : α → M} {g : β → α} (hg : set.inj_on g (function.mul_support (f g))) :
∏ᶠ (i : α) (H : i set.range g), f i = ∏ᶠ (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_4} [add_comm_monoid M] {f : α → M} {g : β → α} (hg : function.injective g) :
∑ᶠ (i : α) (H : i set.range g), f i = ∑ᶠ (j : β), f (g j)
theorem finprod_mem_range {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {f : α → M} {g : β → α} (hg : function.injective g) :
∏ᶠ (i : α) (H : i set.range g), f i = ∏ᶠ (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_4} [add_comm_monoid M] {s : set α} {t : set β} {f : α → M} {g : β → M} (e : α → β) (he₀ : set.bij_on e s t) (he₁ : ∀ (x : α), x sf x = g (e x)) :
∑ᶠ (i : α) (H : i s), f i = ∑ᶠ (j : β) (H : j t), g j
theorem finprod_mem_eq_of_bij_on {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {s : set α} {t : set β} {f : α → M} {g : β → M} (e : α → β) (he₀ : set.bij_on e s t) (he₁ : ∀ (x : α), x sf x = g (e x)) :
∏ᶠ (i : α) (H : i s), f i = ∏ᶠ (j : β) (H : j t), g j

The product of f i over s : set α is equal to the product of g j over t : set β if there exists a function e : α → β such that e is bijective from s to t and for all x in s we have f x = g (e x).

theorem finsum_set_coe_eq_finsum_mem {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} (s : set α) :
∑ᶠ (j : s), f j = ∑ᶠ (i : α) (H : i s), f i
theorem finprod_set_coe_eq_finprod_mem {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} (s : set α) :
∏ᶠ (j : s), f j = ∏ᶠ (i : α) (H : i s), f i
theorem finsum_subtype_eq_finsum_cond {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} (p : α → Prop) :
∑ᶠ (j : subtype p), f j = ∑ᶠ (i : α) (hi : p i), f i
theorem finprod_subtype_eq_finprod_cond {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} (p : α → Prop) :
∏ᶠ (j : subtype p), f j = ∏ᶠ (i : α) (hi : p i), f i
theorem finprod_mem_inter_mul_diff' {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (t : set α) (h : (s function.mul_support f).finite) :
(∏ᶠ (i : α) (H : i s t), f i) * ∏ᶠ (i : α) (H : i s \ t), f i = ∏ᶠ (i : α) (H : i s), f i
theorem finsum_mem_inter_add_diff' {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set α} (t : set α) (h : (s function.support f).finite) :
∑ᶠ (i : α) (H : i s t), f i + ∑ᶠ (i : α) (H : i s \ t), f i = ∑ᶠ (i : α) (H : i s), f i
theorem finsum_mem_inter_add_diff {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set α} (t : set α) (h : s.finite) :
∑ᶠ (i : α) (H : i s t), f i + ∑ᶠ (i : α) (H : i s \ t), f i = ∑ᶠ (i : α) (H : i s), f i
theorem finprod_mem_inter_mul_diff {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (t : set α) (h : s.finite) :
(∏ᶠ (i : α) (H : i s t), f i) * ∏ᶠ (i : α) (H : i s \ t), f i = ∏ᶠ (i : α) (H : i s), f i
theorem finprod_mem_mul_diff' {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s t : set α} (hst : s t) (ht : (t function.mul_support f).finite) :
(∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (H : i t \ s), f i = ∏ᶠ (i : α) (H : i t), f i

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

theorem finsum_mem_add_diff' {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s t : set α} (hst : s t) (ht : (t function.support f).finite) :
∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t \ s), f i = ∑ᶠ (i : α) (H : i t), f i
theorem finsum_mem_add_diff {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s t : set α} (hst : s t) (ht : t.finite) :
∑ᶠ (i : α) (H : i s), f i + ∑ᶠ (i : α) (H : i t \ s), f i = ∑ᶠ (i : α) (H : i t), f i
theorem finprod_mem_mul_diff {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s t : set α} (hst : s t) (ht : t.finite) :
(∏ᶠ (i : α) (H : i s), f i) * ∏ᶠ (i : α) (H : i t \ s), f i = ∏ᶠ (i : α) (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_4} [add_comm_monoid M] {f : α → M} [fintype ι] {t : ι → set α} (h : pairwise (disjoint on t)) (ht : ∀ (i : ι), (t i).finite) :
∑ᶠ (a : α) (H : a ⋃ (i : ι), t i), f a = ∑ᶠ (i : ι) (a : α) (H : a t i), f a
theorem finprod_mem_Union {α : Type u_1} {ι : Type u_3} {M : Type u_4} [comm_monoid M] {f : α → M} [fintype ι] {t : ι → set α} (h : pairwise (disjoint on t)) (ht : ∀ (i : ι), (t i).finite) :
∏ᶠ (a : α) (H : a ⋃ (i : ι), t i), f a = ∏ᶠ (i : ι) (a : α) (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_4} [comm_monoid M] {f : α → M} {I : set ι} {t : ι → set α} (h : I.pairwise_on (disjoint on t)) (hI : I.finite) (ht : ∀ (i : ι), i I(t i).finite) :
∏ᶠ (a : α) (H : a ⋃ (x : ι) (H : x I), t x), f a = ∏ᶠ (i : ι) (H : i I) (j : α) (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_4} [add_comm_monoid M] {f : α → M} {I : set ι} {t : ι → set α} (h : I.pairwise_on (disjoint on t)) (hI : I.finite) (ht : ∀ (i : ι), i I(t i).finite) :
∑ᶠ (a : α) (H : a ⋃ (x : ι) (H : x I), t x), f a = ∑ᶠ (i : ι) (H : i I) (j : α) (H : j t i), f j
theorem finsum_mem_sUnion {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {t : set (set α)} (h : t.pairwise_on disjoint) (ht₀ : t.finite) (ht₁ : ∀ (x : set α), x t → x.finite) :
∑ᶠ (a : α) (H : a ⋃₀t), f a = ∑ᶠ (s : set α) (H : s t) (a : α) (H : a s), f a
theorem finprod_mem_sUnion {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {t : set (set α)} (h : t.pairwise_on disjoint) (ht₀ : t.finite) (ht₁ : ∀ (x : set α), x t → x.finite) :
∏ᶠ (a : α) (H : a ⋃₀t), f a = ∏ᶠ (s : set α) (H : s t) (a : α) (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 finprod_mem_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {s : set α} {t : set β} (f : α → β → M) (hs : s.finite) (ht : t.finite) :
∏ᶠ (i : α) (H : i s) (j : β) (H : j t), f i j = ∏ᶠ (j : β) (H : j t) (i : α) (H : i s), f i j

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

theorem finsum_mem_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] {s : set α} {t : set β} (f : α → β → M) (hs : s.finite) (ht : t.finite) :
∑ᶠ (i : α) (H : i s) (j : β) (H : j t), f i j = ∑ᶠ (j : β) (H : j t) (i : α) (H : i s), f i j
theorem finprod_mem_induction {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (p : M → Prop) (hp₀ : p 1) (hp₁ : ∀ (x y : M), p xp yp (x * y)) (hp₂ : ∀ (x : α), x sp (f x)) :
p (∏ᶠ (i : α) (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 multipliers.

theorem finsum_mem_induction {α : Type u_1} {M : Type u_4} [add_comm_monoid M] {f : α → M} {s : set α} (p : M → Prop) (hp₀ : p 0) (hp₁ : ∀ (x y : M), p xp yp (x + y)) (hp₂ : ∀ (x : α), x sp (f x)) :
p (∑ᶠ (i : α) (H : i s), f i)
theorem finprod_cond_nonneg {α : Type u_1} {R : Type u_2} [ordered_comm_semiring R] {p : α → Prop} {f : α → R} (hf : ∀ (x : α), p x0 f x) :
0 ∏ᶠ (x : α) (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 ∑ᶠ (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 ∏ᶠ (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) :
∏ᶠ (x : α), f x = 0
theorem finsum_sum_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] (s : finset β) (f : α → β → M) (h : ∀ (b : β), b s(function.support (λ (a : α), f a b)).finite) :
∑ᶠ (a : α), ∑ (b : β) in s, f a b = ∑ (b : β) in s, ∑ᶠ (a : α), f a b
theorem finprod_prod_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] (s : finset β) (f : α → β → M) (h : ∀ (b : β), b s(function.mul_support (λ (a : α), f a b)).finite) :
∏ᶠ (a : α), ∏ (b : β) in s, f a b = ∏ (b : β) in s, ∏ᶠ (a : α), f a b
theorem sum_finsum_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] (s : finset α) (f : α → β → M) (h : ∀ (a : α), a s(function.support (f a)).finite) :
∑ (a : α) in s, ∑ᶠ (b : β), f a b = ∑ᶠ (b : β), ∑ (a : α) in s, f a b
theorem prod_finprod_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] (s : finset α) (f : α → β → M) (h : ∀ (a : α), a s(function.mul_support (f a)).finite) :
∏ (a : α) in s, ∏ᶠ (b : β), f a b = ∏ᶠ (b : β), ∏ (a : α) in s, 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 * ∑ᶠ (a : α), f a = ∑ᶠ (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) :
(∑ᶠ (a : α), f a) * r = ∑ᶠ (a : α), (f a) * r
theorem finset.mul_support_of_fiberwise_prod_subset_image {α : Type u_1} {β : Type u_2} {M : Type u_4} [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_4} [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_4} [add_comm_monoid M] [decidable_eq α] [decidable_eq β] (s : finset × β)) (f : α × β → M) :
∑ᶠ (ab : α × β) (h : ab s), f ab = ∑ᶠ (a : α) (b : β) (h : b finset.image prod.snd (finset.filter (λ (ab : α × β), ab.fst = a) s)), f (a, b)
theorem finprod_mem_finset_product' {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] [decidable_eq α] [decidable_eq β] (s : finset × β)) (f : α × β → M) :
∏ᶠ (ab : α × β) (h : ab s), f ab = ∏ᶠ (a : α) (b : β) (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_4} [add_comm_monoid M] (s : finset × β)) (f : α × β → M) :
∑ᶠ (ab : α × β) (h : ab s), f ab = ∑ᶠ (a : α) (b : β) (h : (a, b) s), f (a, b)
theorem finprod_mem_finset_product {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] (s : finset × β)) (f : α × β → M) :
∏ᶠ (ab : α × β) (h : ab s), f ab = ∏ᶠ (a : α) (b : β) (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_4} [comm_monoid M] {γ : Type u_3} (s : finset × β × γ)) (f : α × β × γ → M) :
∏ᶠ (abc : α × β × γ) (h : abc s), f abc = ∏ᶠ (a : α) (b : β) (c : γ) (h : (a, b, c) s), f (a, b, c)
theorem finsum_mem_finset_product₃ {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] {γ : Type u_3} (s : finset × β × γ)) (f : α × β × γ → M) :
∑ᶠ (abc : α × β × γ) (h : abc s), f abc = ∑ᶠ (a : α) (b : β) (c : γ) (h : (a, b, c) s), f (a, b, c)
theorem finprod_curry {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] (f : α × β → M) (hf : (function.mul_support f).finite) :
∏ᶠ (ab : α × β), f ab = ∏ᶠ (a : α) (b : β), f (a, b)
theorem finsum_curry {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] (f : α × β → M) (hf : (function.support f).finite) :
∑ᶠ (ab : α × β), f ab = ∑ᶠ (a : α) (b : β), f (a, b)
theorem finsum_curry₃ {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] {γ : Type u_3} (f : α × β × γ → M) (h : (function.support f).finite) :
∑ᶠ (abc : α × β × γ), f abc = ∑ᶠ (a : α) (b : β) (c : γ), f (a, b, c)
theorem finprod_curry₃ {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {γ : Type u_3} (f : α × β × γ → M) (h : (function.mul_support f).finite) :
∏ᶠ (abc : α × β × γ), f abc = ∏ᶠ (a : α) (b : β) (c : γ), f (a, b, c)
theorem finprod_dmem {α : Type u_1} {M : Type u_4} [comm_monoid M] {s : set α} [decidable_pred (λ (_x : α), _x s)] (f : Π (a : α), a s → M) :
∏ᶠ (a : α) (h : a s), f a h = ∏ᶠ (a : α) (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_4} [add_comm_monoid M] {s : set α} [decidable_pred (λ (_x : α), _x s)] (f : Π (a : α), a s → M) :
∑ᶠ (a : α) (h : a s), f a h = ∑ᶠ (a : α) (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_4} [comm_monoid M] {f : α → β} (hf : function.injective f) [decidable_pred (λ (_x : β), _x set.range f)] (g : α → M) :
∏ᶠ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 1) = ∏ᶠ (a : α), g a
theorem finsum_emb_domain' {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] {f : α → β} (hf : function.injective f) [decidable_pred (λ (_x : β), _x set.range f)] (g : α → M) :
∑ᶠ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 0) = ∑ᶠ (a : α), g a
theorem finprod_emb_domain {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] (f : α β) [decidable_pred (λ (_x : β), _x set.range f)] (g : α → M) :
∏ᶠ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 1) = ∏ᶠ (a : α), g a
theorem finsum_emb_domain {α : Type u_1} {β : Type u_2} {M : Type u_4} [add_comm_monoid M] (f : α β) [decidable_pred (λ (_x : β), _x set.range f)] (g : α → M) :
∑ᶠ (b : β), dite (b set.range f) (λ (h : b set.range f), g (classical.some h)) (λ (h : b set.range f), 0) = ∑ᶠ (a : α), g a