# mathlibdocumentation

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:

• α, β - types with no structure;
• s, t - sets
• M, N - additive or multiplicative commutative monoids
• f, g - functions

Definitions in this file:

• finsum f : M : the sum of f x as x ranges over the support of f, if it's finite. Zero otherwise.

• finprod f : M : the product of f x as x ranges over the multiplicative support of f, if it's finite. One otherwise.

## Notation #

• ∑ᶠ i, f i and ∑ᶠ i : α, f i for finsum f

• ∏ᶠ i, f i and ∏ᶠ i : α, f i for finprod f

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

• ∑ᶠ i ∈ s, f i, where f : α → M, s : set α : sum over the set s;
• ∑ᶠ n < 5, f n, where f : ℕ → M : same as f 0 + f 1 + f 2 + f 3 + f 4;
• ∏ᶠ (n >= -2) (hn : n < 3), f n, where f : ℤ → M : same as f (-2) * f (-1) * f 0 * f 1 * f 2.

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

noncomputable def finsum {M : Type u_1} {α : Sort u_2} (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
noncomputable 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} {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 : .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} {f : α → M} {s : finset (plift α)} (hs : 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 : s) :
∏ᶠ (i : α), f i = ∏ (i : plift α) in s, f i.down
@[simp]
theorem finsum_zero {M : Type u_1} {α : Sort u_3}  :
∑ᶠ (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} [is_empty α] (f : α → M) :
∑ᶠ (i : α), f i = 0
@[simp]
theorem finsum_false {M : Type u_1} (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} (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 =
theorem finsum_unique {M : Type u_1} {α : Sort u_3} [unique α] (f : α → M) :
∑ᶠ (i : α), f i =
@[simp]
theorem finsum_true {M : Type u_1} (f : true → M) :
∑ᶠ (i : true), f i =
@[simp]
theorem finprod_true {M : Type u_1} [comm_monoid M] (f : true → M) :
∏ᶠ (i : true), f i =
theorem finsum_eq_dif {M : Type u_1} {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} {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} {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} {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} {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} {f : α → R} (hf : ∀ (x : α), 0 f x) :
0 ∏ᶠ (x : α), f x
theorem finsum_nonneg {α : Sort u_3} {M : Type u_1} {f : α → M} (hf : ∀ (i : α), 0 f i) :
0 ∑ᶠ (i : α), f i
theorem one_le_finprod' {α : Sort u_3} {M : Type u_1} {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 : .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} (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} {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 monoid_hom.map_finprod_of_preimage_one {M : Type u_1} {N : Type u_2} {α : Sort u_3} [comm_monoid M] [comm_monoid N] (f : M →* N) (hf : ∀ (x : M), f x = 1x = 1) (g : α → M) :
f (∏ᶠ (i : α), g i) = ∏ᶠ (i : α), f (g i)
theorem add_monoid_hom.map_finsum_of_preimage_zero {M : Type u_1} {N : Type u_2} {α : Sort u_3} (f : M →+ N) (hf : ∀ (x : M), f x = 0x = 0) (g : α → M) :
f (∑ᶠ (i : α), g i) = ∑ᶠ (i : α), f (g i)
theorem monoid_hom.map_finprod_of_injective {M : Type u_1} {N : Type u_2} {α : Sort u_3} [comm_monoid M] [comm_monoid N] (g : M →* N) (hg : function.injective g) (f : α → M) :
g (∏ᶠ (i : α), f i) = ∏ᶠ (i : α), g (f i)
theorem add_monoid_hom.map_finsum_of_injective {M : Type u_1} {N : Type u_2} {α : Sort u_3} (g : M →+ N) (hg : function.injective g) (f : α → M) :
g (∑ᶠ (i : α), f i) = ∑ᶠ (i : α), g (f i)
theorem mul_equiv.map_finprod {M : Type u_1} {N : Type u_2} {α : Sort u_3} [comm_monoid M] [comm_monoid N] (g : M ≃* N) (f : α → M) :
g (∏ᶠ (i : α), f i) = ∏ᶠ (i : α), g (f i)
theorem add_equiv.map_finsum {M : Type u_1} {N : Type u_2} {α : Sort u_3} (g : M ≃+ N) (f : α → M) :
g (∑ᶠ (i : α), f i) = ∑ᶠ (i : α), g (f i)
theorem finsum_smul {ι : Sort u_5} {R : Type u_1} {M : Type u_2} [ring R] [ M] (f : ι → R) (x : M) :
(∑ᶠ (i : ι), f i) x = ∑ᶠ (i : ι), f i x
theorem smul_finsum {ι : Sort u_5} {R : Type u_1} {M : Type u_2} [ring R] [ M] (c : R) (f : ι → M) :
c ∑ᶠ (i : ι), f i = ∑ᶠ (i : ι), c f i
theorem finprod_inv_distrib {α : Sort u_3} {G : Type u_1} [comm_group G] (f : α → G) :
∏ᶠ (x : α), (f x)⁻¹ = (∏ᶠ (x : α), f x)⁻¹
theorem finsum_neg_distrib {α : Sort u_3} {G : Type u_1} (f : α → G) :
∑ᶠ (x : α), -f x = -∑ᶠ (x : α), f x
theorem finprod_inv_distrib₀ {α : Sort u_3} {G : Type u_1} (f : α → G) :
∏ᶠ (x : α), (f x)⁻¹ = (∏ᶠ (x : α), f 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 = a
theorem finsum_eq_indicator_apply {α : Type u_1} {M : Type u_4} (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} (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 : α), a
theorem finsum_mem_def {α : Type u_1} {M : Type u_4} (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} (f : α → M) {s : finset α} (h : 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 : 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} (f : α → M) (hf : .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 : .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)  :
∏ᶠ (i : α), f i = (λ (h : , ∏ (i : α) in h.to_finset, f i) (λ (h : , 1)
theorem finsum_def {α : Type u_1} {M : Type u_4} (f : α → M)  :
∑ᶠ (i : α), f i = (λ (h : .finite), ∑ (i : α) in h.to_finset, f i) (λ (h : ¬.finite), 0)
theorem finsum_of_infinite_support {α : Type u_1} {M : Type u_4} {f : α → M} (hf : .infinite) :
∑ᶠ (i : α), f i = 0
theorem finprod_of_infinite_mul_support {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} (hf : .infinite) :
∏ᶠ (i : α), f i = 1
theorem finsum_eq_sum {α : Type u_1} {M : Type u_4} (f : α → M) (hf : .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 : .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} [fintype α] (f : α → M) :
∑ᶠ (i : α), f i = ∑ (i : α), f i
theorem finsum_cond_eq_sum_of_cond_iff {α : Type u_1} {M : Type u_4} (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_cond_ne {α : Type u_1} {M : Type u_4} (f : α → M) (a : α) [decidable_eq α] (hf : .finite) :
∑ᶠ (i : α) (H : i a), f i = ∑ (i : α) in hf.to_finset.erase a, f i
theorem finprod_cond_ne {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (a : α) [decidable_eq α] (hf : .finite) :
∏ᶠ (i : α) (H : i a), f i = ∏ (i : α) in hf.to_finset.erase a, f i
theorem finsum_mem_eq_sum_of_inter_support_eq {α : Type u_1} {M : Type u_4} (f : α → M) {s : set α} {t : finset α} (h : = ) :
∑ᶠ (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 : = ) :
∏ᶠ (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} (f : α → M) {s : set α} {t : finset α} (h₁ : 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₁ : 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} (f : α → M) {s : set α} (hf : (s .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 : .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} (f : α → M) (s : set α) [decidable_pred (λ (_x : α), _x s)] (hf : .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 : .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} (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} (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} (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} (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} {f : α → M} {s : set α} (hs : (s .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 : .infinite) :
∏ᶠ (i : α) (H : i s), f i = 1
theorem finprod_mem_eq_one_of_forall_eq_one {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s : set α} (h : ∀ (x : α), x sf x = 1) :
∏ᶠ (i : α) (H : i s), f i = 1
theorem finsum_mem_eq_zero_of_forall_eq_zero {α : Type u_1} {M : Type u_4} {f : α → M} {s : set α} (h : ∀ (x : α), x sf x = 0) :
∑ᶠ (i : α) (H : i s), f i = 0
theorem finprod_mem_inter_mul_support {α : Type u_1} {M : Type u_4} [comm_monoid M] (f : α → M) (s : set α) :
∏ᶠ (i : α) (H : i , f i = ∏ᶠ (i : α) (H : i s), f i
theorem finsum_mem_inter_support {α : Type u_1} {M : Type u_4} (f : α → M) (s : set α) :
∑ᶠ (i : α) (H : i , 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 : = ) :
∏ᶠ (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} (f : α → M) (s t : set α) (h : = ) :
∑ᶠ (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 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} (f : α → M) (s t : set α) (h : ∀ (x : α), (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 : , f i = ∏ᶠ (i : α), f i
theorem finsum_mem_univ {α : Type u_1} {M : Type u_4} (f : α → M) :
∑ᶠ (i : α) (H : , 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} {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 finprod_eq_one_of_forall_eq_one {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} (h : ∀ (x : α), f x = 1) :
∏ᶠ (i : α), f i = 1
theorem finsum_eq_zero_of_forall_eq_zero {α : Type u_1} {M : Type u_4} {f : α → M} (h : ∀ (x : α), f x = 0) :
∑ᶠ (i : α), f i = 0

### 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 : .finite) (hg : .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} {f g : α → M} (hf : .finite) (hg : .finite) :
∑ᶠ (i : α), (f i + g i) = ∑ᶠ (i : α), f i + ∑ᶠ (i : α), g i
theorem finsum_sub_distrib {α : Type u_1} {G : Type u_2} {f g : α → G} (hf : .finite) (hg : .finite) :
∑ᶠ (i : α), (f i - g i) = ∑ᶠ (i : α), f i - ∑ᶠ (i : α), g i
theorem finprod_div_distrib {α : Type u_1} {G : Type u_2} [comm_group G] {f g : α → G} (hf : .finite) (hg : .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 divided by the product over g i.

theorem finprod_div_distrib₀ {α : Type u_1} {G : Type u_2} {f g : α → G} (hf : .finite) (hg : .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 : .finite) (hg : .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} {f g : α → M} {s : set α} (hf : (s .finite) (hg : (s .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} (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 : 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} {f : α → M} {s : set α} (hf : 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} {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} {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} {f : α → M} (g : M →+ N) (hf : .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 : .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₀ : .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} {s : set α} {f : α → M} (g : M →+ N) (h₀ : (s .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} {s : set α} (f : α → M) (g : M →+ N) (hs : s.finite) :
g (∑ᶠ (j : α) (H : j s), f j) = ∑ᶠ (i : α) (H : i s), g (f i)
theorem mul_equiv.map_finprod_mem {α : Type u_1} {M : Type u_4} {N : Type u_5} [comm_monoid M] [comm_monoid N] (g : M ≃* N) (f : α → M) {s : set α} (hs : s.finite) :
g (∏ᶠ (i : α) (H : i s), f i) = ∏ᶠ (i : α) (H : i s), g (f i)
theorem add_equiv.map_finsum_mem {α : Type u_1} {M : Type u_4} {N : Type u_5} (g : M ≃+ N) (f : α → M) {s : set α} (hs : s.finite) :
g (∑ᶠ (i : α) (H : i s), f i) = ∑ᶠ (i : α) (H : i s), g (f i)
theorem finprod_mem_inv_distrib {α : Type u_1} {s : set α} {G : Type u_2} [comm_group G] (f : α → G) (hs : s.finite) :
∏ᶠ (x : α) (H : x s), (f x)⁻¹ = (∏ᶠ (x : α) (H : x s), f x)⁻¹
theorem finsum_mem_neg_distrib {α : Type u_1} {s : set α} {G : Type u_2} (f : α → G) (hs : s.finite) :
∑ᶠ (x : α) (H : x s), -f x = -∑ᶠ (x : α) (H : x s), f x
theorem finprod_mem_inv_distrib₀ {α : Type u_1} {s : set α} {G : Type u_2} (f : α → G) (hs : s.finite) :
∏ᶠ (x : α) (H : x s), (f x)⁻¹ = (∏ᶠ (x : α) (H : x s), f x)⁻¹
theorem finprod_mem_div_distrib {α : Type u_1} {s : set α} {G : Type u_2} [comm_group G] (f g : α → G) (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 divided by the product of g i over i ∈ s.

theorem finsum_mem_sub_distrib {α : Type u_1} {s : set α} {G : Type u_2} (f g : α → G) (hs : s.finite) :
∑ᶠ (i : α) (H : i s), (f i - g i) = ∑ᶠ (i : α) (H : i s), f i - ∑ᶠ (i : α) (H : i s), g i
theorem finprod_mem_div_distrib₀ {α : Type u_1} {s : set α} {G : Type u_2} (f g : α → G) (hs : s.finite) :
∏ᶠ (i : α) (H : i s), f i / g i = (∏ᶠ (i : α) (H : i s), f i) / ∏ᶠ (i : α) (H : i s), g 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} {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} {f : α → M} {s : set α} (h : ∑ᶠ (i : α) (H : i s), f i 0) :
theorem finsum_mem_union_inter {α : Type u_1} {M : Type u_4} {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 : .finite) (ht : .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} {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' {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} {s t : set α} (hst : t) (hs : .finite) (ht : .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} {f : α → M} {s t : set α} (hst : 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 : 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} {f : α → M} {s t : set α} (hst : 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 : ) (hs : .finite) (ht : .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} {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_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} {f : α → M} {a : α} :
∑ᶠ (i : α) (H : i {a}), f i = f a
@[simp]
theorem finsum_cond_eq_left {α : Type u_1} {M : Type u_4} {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} {f : α → M} {a : α} :
∑ᶠ (i : α) (hi : a = i), f i = f a
theorem finsum_mem_insert' {α : Type u_1} {M : Type u_4} {a : α} {s : set α} (f : α → M) (h : a s) (hs : (s .finite) :
∑ᶠ (i : α) (H : i 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 : .finite) :
∏ᶠ (i : α) (H : i 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} {a : α} {s : set α} (f : α → M) (h : a s) (hs : s.finite) :
∑ᶠ (i : α) (H : i 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 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} {f : α → M} {a : α} {s : set α} (h : a sf a = 0) :
∑ᶠ (i : α) (H : i 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 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} {f : α → M} {a : α} {s : set α} (h : f a = 0) :
∑ᶠ (i : α) (H : i 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 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_dvd {α : Type u_1} {N : Type u_5} [comm_monoid N] {f : α → N} (a : α) (hf : .finite) :
f a

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_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} {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} {f : α → M} {s : set β} {g : β → α} (hg : (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 : (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} {f : α → M} {β : Type u_2} {s : set β} {g : β → α} (hg : 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 : 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} {f : α → M} {g : β → α} (hg : (function.support (f g))) :
∑ᶠ (i : α) (H : i , 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.mul_support (f g))) :
∏ᶠ (i : α) (H : i , 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} {f : α → M} {g : β → α} (hg : function.injective g) :
∑ᶠ (i : α) (H : i , 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 , 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} {s : set α} {t : set β} {f : α → M} {g : β → M} (e : α → β) (he₀ : 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₀ : 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). See also finset.prod_bij.

theorem finprod_eq_of_bijective {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {f : α → M} {g : β → M} (e : α → β) (he₀ : function.bijective e) (he₁ : ∀ (x : α), f x = g (e x)) :
∏ᶠ (i : α), f i = ∏ᶠ (j : β), g j

The product of f i is equal to the product of g j if there exists a bijective function e : α → β such that for all x we have f x = g (e x). See finprod_comp, fintype.prod_bijective and finset.prod_bij

theorem finsum_eq_of_bijective {α : Type u_1} {β : Type u_2} {M : Type u_4} {f : α → M} {g : β → M} (e : α → β) (he₀ : function.bijective e) (he₁ : ∀ (x : α), f x = g (e x)) :
∑ᶠ (i : α), f i = ∑ᶠ (j : β), g j
theorem finprod_comp {α : Type u_1} {β : Type u_2} {M : Type u_4} [comm_monoid M] {g : β → M} (e : α → β) (he₀ : function.bijective e) :
∏ᶠ (i : α), g (e i) = ∏ᶠ (j : β), g j

Given a bijective function e the product of g i is equal to the product of g (e i). 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_4} {g : β → M} (e : α → β) (he₀ : function.bijective e) :
∑ᶠ (i : α), g (e i) = ∑ᶠ (j : β), g j
theorem finsum_set_coe_eq_finsum_mem {α : Type u_1} {M : Type u_4} {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} {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 : .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} {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 finsum_mem_inter_add_diff {α : Type u_1} {M : Type u_4} {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 : .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} {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 finsum_mem_add_diff {α : Type u_1} {M : Type u_4} {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} {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_disjoint 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} {f : α → M} {I : set ι} {t : ι → set α} (h : I.pairwise_disjoint 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} {f : α → M} {t : set (set α)} (h : t.pairwise_disjoint id) (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_disjoint id) (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 mul_finprod_cond_ne {α : Type u_1} {M : Type u_4} [comm_monoid M] {f : α → M} (a : α) (hf : .finite) :
(f a) * ∏ᶠ (i : α) (H : i a), f i = ∏ᶠ (i : α), f i
theorem add_finsum_cond_ne {α : Type u_1} {M : Type u_4} {f : α → M} (a : α) (hf : .finite) :
f a + ∑ᶠ (i : α) (H : i a), f i = ∑ᶠ (i : α), f i
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} {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} {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} {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} (i : α) {f : α → M} (hf : .finite) (h : ∀ (j : α), 0 f j) :
f i ∑ᶠ (j : α), f j
theorem single_le_finprod {α : Type u_1} {M : Type u_2} (i : α) {f : α → M} (hf : .finite) (h : ∀ (j : α), 1 f j) :
f i ∏ᶠ (j : α), f j
theorem finprod_eq_zero {α : Type u_1} {M₀ : Type u_2} (f : α → M₀) (x : α) (hx : f x = 0) (hf : .finite) :
∏ᶠ (x : α), f x = 0
theorem finsum_sum_comm {α : Type u_1} {β : Type u_2} {M : Type u_4} (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} (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 : .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 : .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) s)
theorem finset.support_of_fiberwise_sum_subset_image {α : Type u_1} {β : Type u_2} {M : Type u_4} [decidable_eq β] (s : finset α) (f : α → M) (g : α → β) :
function.support (λ (b : β), (finset.filter (λ (a : α), g a = b) s).sum f) s)
theorem finsum_mem_finset_product' {α : Type u_1} {β : Type u_2} {M : Type u_4} [decidable_eq α] [decidable_eq β] (s : finset × β)) (f : α × β → M) :
∑ᶠ (ab : α × β) (h : ab s), f ab = ∑ᶠ (a : α) (b : β) (h : b (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.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} (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)

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} {γ : 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 : .finite) :
∏ᶠ (ab : α × β), f ab = ∏ᶠ (a : α) (b : β), f (a, b)
theorem finsum_curry {α : Type u_1} {β : Type u_2} {M : Type u_4} (f : α × β → M) (hf : .finite) :
∑ᶠ (ab : α × β), f ab = ∑ᶠ (a : α) (b : β), f (a, b)
theorem finsum_curry₃ {α : Type u_1} {β : Type u_2} {M : Type u_4} {γ : Type u_3} (f : α × β × γ → M) (h : .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 : .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} {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 (λ (h : b , g (classical.some h)) (λ (h : b , 1) = ∏ᶠ (a : α), g a
theorem finsum_emb_domain' {α : Type u_1} {β : Type u_2} {M : Type u_4} {f : α → β} (hf : function.injective f) [decidable_pred (λ (_x : β), _x set.range f)] (g : α → M) :
∑ᶠ (b : β), dite (b (λ (h : b , g (classical.some h)) (λ (h : b , 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 (λ (h : b , g (classical.some h)) (λ (h : b , 1) = ∏ᶠ (a : α), g a
theorem finsum_emb_domain {α : Type u_1} {β : Type u_2} {M : Type u_4} (f : α β) [decidable_pred (λ (_x : β), _x set.range f)] (g : α → M) :
∑ᶠ (b : β), dite (b (λ (h : b , g (classical.some h)) (λ (h : b , 0) = ∑ᶠ (a : α), g a