@@ -157,34 +157,11 @@ by rw [fintype.card_pi, finset.prod_const]; refl
157
157
fintype.card (vector α n) = fintype.card α ^ n :=
158
158
by rw fintype.of_equiv_card; simp
159
159
160
-
161
160
@[simp, to_additive]
162
161
lemma finset.prod_attach_univ [fintype α] [comm_monoid β] (f : {a : α // a ∈ @univ α _} → β) :
163
162
∏ x in univ.attach, f x = ∏ x, f ⟨x, (mem_univ _)⟩ :=
164
163
prod_bij (λ x _, x.1 ) (λ _ _, mem_univ _) (λ _ _ , by simp) (by simp) (λ b _, ⟨⟨b, mem_univ _⟩, by simp⟩)
165
164
166
- @[to_additive]
167
- lemma finset.prod_range_eq_prod_fin [comm_monoid β] (n : ℕ) (f : ℕ → β) :
168
- ∏ k in range n, f k = ∏ k : fin n, f k :=
169
- begin
170
- symmetry,
171
- refine prod_bij (λ k hk, k) _ _ _ _,
172
- { rintro ⟨k, hk⟩ _, simp * },
173
- { rintro ⟨k, hk⟩ _, simp * },
174
- { intros, rwa fin.eq_iff_veq },
175
- { intros k hk, rw mem_range at hk,
176
- exact ⟨⟨k, hk⟩, mem_univ _, rfl⟩ }
177
- end
178
-
179
- @[to_additive]
180
- lemma finset.prod_fin_eq_prod_range [comm_monoid β] {n : ℕ} (c : fin n → β) :
181
- ∏ i, c i = ∏ i in finset.range n, if h : i < n then c ⟨i, h⟩ else 1 :=
182
- begin
183
- rw [finset.prod_range_eq_prod_fin, finset.prod_congr rfl],
184
- rintros ⟨i, hi⟩ _,
185
- simp only [fin.coe_eq_val, hi, dif_pos]
186
- end
187
-
188
165
/-- Taking a product over `univ.pi t` is the same as taking the product over `fintype.pi_finset t`.
189
166
`univ.pi t` and `fintype.pi_finset t` are essentially the same `finset`, but differ
190
167
in the type of their element, `univ.pi t` is a `finset (Π a ∈ univ, t a)` and
@@ -227,20 +204,8 @@ lemma fin.sum_pow_mul_eq_add_pow {n : ℕ} {R : Type*} [comm_semiring R] (a b :
227
204
(a + b) ^ n :=
228
205
by simpa using fintype.sum_pow_mul_eq_add_pow (fin n) a b
229
206
230
- /-- It is equivalent to sum a function over `fin n` or `finset.range n`. -/
231
207
@[to_additive]
232
- lemma fin.prod_univ_eq_prod_range [comm_monoid α] (f : ℕ → α) (n : ℕ) :
233
- ∏ i : fin n, f i.val = ∏ i in finset.range n, f i :=
234
- begin
235
- apply finset.prod_bij (λ (a : fin n) ha, a.val),
236
- { assume a ha, simp [a.is_lt] },
237
- { assume a ha, refl },
238
- { assume a b ha hb H, exact (fin.ext_iff _ _).2 H },
239
- { assume b hb, exact ⟨⟨b, list.mem_range.mp hb⟩, finset.mem_univ _, rfl⟩, }
240
- end
241
-
242
- @[to_additive]
243
- lemma finset.prod_equiv [fintype α] [fintype β] [comm_monoid γ] (e : α ≃ β) (f : β → γ) :
208
+ lemma equiv.prod_comp [fintype α] [fintype β] [comm_monoid γ] (e : α ≃ β) (f : β → γ) :
244
209
∏ i, f (e i) = ∏ i, f i :=
245
210
begin
246
211
apply prod_bij (λ i hi, e i) (λ i hi, mem_univ _) _ (λ a b _ _ h, e.injective h),
@@ -250,16 +215,33 @@ begin
250
215
{ simp }
251
216
end
252
217
218
+ /-- It is equivalent to sum a function over `fin n` or `finset.range n`. -/
219
+ @[to_additive]
220
+ lemma fin.prod_univ_eq_prod_range [comm_monoid α] (f : ℕ → α) (n : ℕ) :
221
+ ∏ i : fin n, f i = ∏ i in range n, f i :=
222
+ calc (∏ i : fin n, f i) = ∏ i : {x // x ∈ range n}, f i :
223
+ ((equiv.fin_equiv_subtype n).trans
224
+ (equiv.subtype_congr_right (λ _, mem_range.symm))).prod_comp (f ∘ coe)
225
+ ... = ∏ i in range n, f i : by rw [← attach_eq_univ, prod_attach]
226
+
227
+ @[to_additive]
228
+ lemma finset.prod_fin_eq_prod_range [comm_monoid β] {n : ℕ} (c : fin n → β) :
229
+ ∏ i, c i = ∏ i in finset.range n, if h : i < n then c ⟨i, h⟩ else 1 :=
230
+ begin
231
+ rw [← fin.prod_univ_eq_prod_range, finset.prod_congr rfl],
232
+ rintros ⟨i, hi⟩ _,
233
+ simp only [fin.coe_eq_val, hi, dif_pos]
234
+ end
235
+
253
236
@[to_additive]
254
237
lemma finset.prod_subtype {M : Type *} [comm_monoid M]
255
238
{p : α → Prop } {F : fintype (subtype p)} {s : finset α} (h : ∀ x, x ∈ s ↔ p x) (f : α → M) :
256
239
∏ a in s, f a = ∏ a : subtype p, f a :=
257
240
have (∈ s) = p, from set.ext h,
258
241
begin
259
- rw ← prod_attach,
242
+ rw [ ← prod_attach, attach_eq_univ] ,
260
243
substI p,
261
- congr,
262
- simp [finset.ext_iff]
244
+ congr
263
245
end
264
246
265
247
@[to_additive] lemma finset.prod_fiberwise [decidable_eq β] [fintype β] [comm_monoid γ]
@@ -284,10 +266,22 @@ lemma fintype.prod_fiberwise [fintype α] [decidable_eq β] [fintype β] [comm_m
284
266
(f : α → β) (g : α → γ) :
285
267
(∏ b : β, ∏ a : {a // f a = b}, g (a : α)) = ∏ a, g a :=
286
268
begin
287
- rw [← finset.prod_equiv (equiv.sigma_preimage_equiv f) _ , ← univ_sigma_univ, prod_sigma],
269
+ rw [← (equiv.sigma_preimage_equiv f).prod_comp , ← univ_sigma_univ, prod_sigma],
288
270
refl
289
271
end
290
272
273
+ lemma fintype.prod_dite [fintype α] {p : α → Prop } [decidable_pred p]
274
+ [comm_monoid β] (f : Π (a : α) (ha : p a), β) (g : Π (a : α) (ha : ¬p a), β) :
275
+ (∏ a, dite (p a) (f a) (g a)) = (∏ a : {a // p a}, f a a.2 ) * (∏ a : {a // ¬p a}, g a a.2 ) :=
276
+ begin
277
+ simp only [prod_dite, attach_eq_univ],
278
+ congr' 1 ,
279
+ { convert (equiv.subtype_congr_right _).prod_comp (λ x : {x // p x}, f x x.2 ),
280
+ simp },
281
+ { convert (equiv.subtype_congr_right _).prod_comp (λ x : {x // ¬p x}, g x x.2 ),
282
+ simp }
283
+ end
284
+
291
285
section
292
286
open finset
293
287
0 commit comments