@@ -667,6 +667,19 @@ lemma prod_of_injOn (e : ι → κ) (he : Set.InjOn e s) (hest : Set.MapsTo e s
667
667
668
668
variable [DecidableEq κ]
669
669
670
+ @[to_additive]
671
+ lemma prod_fiberwise_eq_prod_filter (s : Finset ι) (t : Finset κ) (g : ι → κ) (f : ι → α) :
672
+ ∏ j in t, ∏ i in s.filter fun i ↦ g i = j, f i = ∏ i in s.filter fun i ↦ g i ∈ t, f i := by
673
+ rw [← prod_disjiUnion, disjiUnion_filter_eq]
674
+
675
+ @[to_additive]
676
+ lemma prod_fiberwise_eq_prod_filter' (s : Finset ι) (t : Finset κ) (g : ι → κ) (f : κ → α) :
677
+ ∏ j in t, ∏ _i in s.filter fun i ↦ g i = j, f j = ∏ i in s.filter fun i ↦ g i ∈ t, f (g i) := by
678
+ calc
679
+ _ = ∏ j in t, ∏ i in s.filter fun i ↦ g i = j, f (g i) :=
680
+ prod_congr rfl fun j _ ↦ prod_congr rfl fun i hi ↦ by rw [(mem_filter.1 hi).2 ]
681
+ _ = _ := prod_fiberwise_eq_prod_filter _ _ _ _
682
+
670
683
@[to_additive]
671
684
lemma prod_fiberwise_of_maps_to {g : ι → κ} (h : ∀ i ∈ s, g i ∈ t) (f : ι → α) :
672
685
∏ j in t, ∏ i in s.filter fun i ↦ g i = j, f i = ∏ i in s, f i := by
@@ -1945,6 +1958,23 @@ theorem prod_dvd_prod_of_subset {ι M : Type*} [CommMonoid M] (s t : Finset ι)
1945
1958
1946
1959
end CommMonoid
1947
1960
1961
+ section CancelCommMonoid
1962
+ variable [DecidableEq ι] [CancelCommMonoid α] {s t : Finset ι} {f : ι → α}
1963
+
1964
+ @[to_additive]
1965
+ lemma prod_sdiff_eq_prod_sdiff_iff :
1966
+ ∏ i in s \ t, f i = ∏ i in t \ s, f i ↔ ∏ i in s, f i = ∏ i in t, f i :=
1967
+ eq_comm.trans $ eq_iff_eq_of_mul_eq_mul $ by
1968
+ rw [← prod_union disjoint_sdiff_self_left, ← prod_union disjoint_sdiff_self_left,
1969
+ sdiff_union_self_eq_union, sdiff_union_self_eq_union, union_comm]
1970
+
1971
+ @[to_additive]
1972
+ lemma prod_sdiff_ne_prod_sdiff_iff :
1973
+ ∏ i in s \ t, f i ≠ ∏ i in t \ s, f i ↔ ∏ i in s, f i ≠ ∏ i in t, f i :=
1974
+ prod_sdiff_eq_prod_sdiff_iff.not
1975
+
1976
+ end CancelCommMonoid
1977
+
1948
1978
theorem card_eq_sum_ones (s : Finset α) : s.card = ∑ x in s, 1 := by
1949
1979
rw [sum_const, smul_eq_mul, mul_one]
1950
1980
#align finset.card_eq_sum_ones Finset.card_eq_sum_ones
@@ -1955,6 +1985,10 @@ theorem sum_const_nat {m : ℕ} {f : α → ℕ} (h₁ : ∀ x ∈ s, f x = m) :
1955
1985
apply sum_congr rfl h₁
1956
1986
#align finset.sum_const_nat Finset.sum_const_nat
1957
1987
1988
+ lemma sum_card_fiberwise_eq_card_filter {κ : Type *} [DecidableEq κ] (s : Finset ι) (t : Finset κ)
1989
+ (g : ι → κ) : ∑ j in t, (s.filter fun i ↦ g i = j).card = (s.filter fun i ↦ g i ∈ t).card := by
1990
+ simpa only [card_eq_sum_ones] using sum_fiberwise_eq_sum_filter _ _ _ _
1991
+
1958
1992
lemma card_filter (p) [DecidablePred p] (s : Finset α) :
1959
1993
(filter p s).card = ∑ a in s, ite (p a) 1 0 := by
1960
1994
rw [sum_ite, sum_const_zero, add_zero, sum_const, smul_eq_mul, mul_one]
@@ -2156,10 +2190,13 @@ theorem prod_int_mod (s : Finset α) (n : ℤ) (f : α → ℤ) :
2156
2190
end Finset
2157
2191
2158
2192
namespace Fintype
2159
- variable {ι κ α : Type *} [Fintype ι] [Fintype κ] [CommMonoid α]
2193
+ variable {ι κ α : Type *} [Fintype ι] [Fintype κ]
2160
2194
2161
2195
open Finset
2162
2196
2197
+ section CommMonoid
2198
+ variable [CommMonoid α]
2199
+
2163
2200
/-- `Fintype.prod_bijective` is a variant of `Finset.prod_bij` that accepts `Function.Bijective`.
2164
2201
2165
2202
See `Function.Bijective.prod_comp` for a version without `h`. -/
@@ -2256,6 +2293,52 @@ theorem prod_subtype_mul_prod_subtype {α β : Type*} [Fintype α] [CommMonoid
2256
2293
#align fintype.prod_subtype_mul_prod_subtype Fintype.prod_subtype_mul_prod_subtype
2257
2294
#align fintype.sum_subtype_add_sum_subtype Fintype.sum_subtype_add_sum_subtype
2258
2295
2296
+ @[to_additive] lemma prod_subset {s : Finset ι} {f : ι → α} (h : ∀ i, f i ≠ 1 → i ∈ s) :
2297
+ ∏ i in s, f i = ∏ i, f i :=
2298
+ Finset.prod_subset s.subset_univ $ by simpa [not_imp_comm (a := _ ∈ s)]
2299
+
2300
+ @[to_additive]
2301
+ lemma prod_ite_eq_ite_exists (p : ι → Prop ) [DecidablePred p] (h : ∀ i j, p i → p j → i = j)
2302
+ (a : α) : ∏ i, ite (p i) a 1 = ite (∃ i, p i) a 1 := by
2303
+ simp [prod_ite_one univ p (by simpa using h)]
2304
+
2305
+ variable [DecidableEq ι]
2306
+
2307
+ /-- See also `Finset.prod_dite_eq`. -/
2308
+ @[to_additive "See also `Finset.sum_dite_eq`."] lemma prod_dite_eq (i : ι) (f : ∀ j, i = j → α) :
2309
+ ∏ j, (if h : i = j then f j h else 1 ) = f i rfl := by
2310
+ rw [Finset.prod_dite_eq, if_pos (mem_univ _)]
2311
+
2312
+ /-- See also `Finset.prod_dite_eq'`. -/
2313
+ @[to_additive "See also `Finset.sum_dite_eq'`."] lemma prod_dite_eq' (i : ι) (f : ∀ j, j = i → α) :
2314
+ ∏ j, (if h : j = i then f j h else 1 ) = f i rfl := by
2315
+ rw [Finset.prod_dite_eq', if_pos (mem_univ _)]
2316
+
2317
+ /-- See also `Finset.prod_ite_eq`. -/
2318
+ @[to_additive "See also `Finset.sum_ite_eq`."]
2319
+ lemma prod_ite_eq (i : ι) (f : ι → α) : ∏ j, (if i = j then f j else 1 ) = f i := by
2320
+ rw [Finset.prod_ite_eq, if_pos (mem_univ _)]
2321
+
2322
+ /-- See also `Finset.prod_ite_eq'`. -/
2323
+ @[to_additive "See also `Finset.sum_ite_eq'`."]
2324
+ lemma prod_ite_eq' (i : ι) (f : ι → α) : ∏ j, (if j = i then f j else 1 ) = f i := by
2325
+ rw [Finset.prod_ite_eq', if_pos (mem_univ _)]
2326
+
2327
+ /-- See also `Finset.prod_pi_mulSingle`. -/
2328
+ @[to_additive "See also `Finset.sum_pi_single`."]
2329
+ lemma prod_pi_mulSingle {α : ι → Type *} [∀ i, CommMonoid (α i)] (i : ι) (f : ∀ i, α i) :
2330
+ ∏ j, Pi.mulSingle j (f j) i = f i := prod_dite_eq _ _
2331
+
2332
+ /-- See also `Finset.prod_pi_mulSingle'`. -/
2333
+ @[to_additive "See also `Finset.sum_pi_single'`."]
2334
+ lemma prod_pi_mulSingle' (i : ι) (a : α) : ∏ j, Pi.mulSingle i a j = a := prod_dite_eq' _ _
2335
+
2336
+ end CommMonoid
2337
+
2338
+ variable [CommMonoidWithZero α] {p : ι → Prop } [DecidablePred p]
2339
+
2340
+ lemma prod_boole : ∏ i, ite (p i) (1 : α) 0 = ite (∀ i, p i) 1 0 := by simp [Finset.prod_boole]
2341
+
2259
2342
end Fintype
2260
2343
2261
2344
namespace Finset
0 commit comments