@@ -169,6 +169,15 @@ by { subst q, exact finprod_congr hfg }
169
169
170
170
attribute [congr] finsum_congr_Prop
171
171
172
+ lemma finprod_nonneg {R : Type *} [ordered_comm_semiring R] {f : α → R} (hf : ∀ x, 0 ≤ f x) :
173
+ 0 ≤ ∏ᶠ x, f x :=
174
+ begin
175
+ rw finprod,
176
+ split_ifs,
177
+ { exact finset.prod_nonneg (λ x _, hf _) },
178
+ { exact zero_le_one }
179
+ end
180
+
172
181
@[to_additive] lemma monoid_hom.map_finprod_plift (f : M →* N) (g : α → M)
173
182
(h : finite (mul_support $ g ∘ plift.down)) :
174
183
f (∏ᶠ x, g x) = ∏ᶠ x, f (g x) :=
@@ -240,13 +249,14 @@ by { classical, rw [finprod_def, dif_pos hf] }
240
249
∏ᶠ i : α, f i = ∏ i, f i :=
241
250
finprod_eq_prod_of_mul_support_to_finset_subset _ (finite.of_fintype _) $ finset.subset_univ _
242
251
243
- @[to_additive] lemma finprod_mem_eq_prod_of_mem_iff (f : α → M) {s : set α } {t : finset α}
244
- (h : ∀ {x}, f x ≠ 1 → (x ∈ s ↔ x ∈ t)) :
245
- ∏ᶠ i ∈ s , f i = ∏ i in t, f i :=
252
+ @[to_additive] lemma finprod_cond_eq_prod_of_cond_iff (f : α → M) {p : α → Prop } {t : finset α}
253
+ (h : ∀ {x}, f x ≠ 1 → (p x ↔ x ∈ t)) :
254
+ ∏ᶠ i (hi : p i) , f i = ∏ i in t, f i :=
246
255
begin
256
+ set s := {x | p x},
247
257
have : mul_support (s.mul_indicator f) ⊆ t,
248
258
{ rw [set.mul_support_mul_indicator], intros x hx, exact (h hx.2 ).1 hx.1 },
249
- rw [finprod_mem_def, finprod_eq_prod_of_mul_support_subset _ this ],
259
+ erw [finprod_mem_def, finprod_eq_prod_of_mul_support_subset _ this ],
250
260
refine finset.prod_congr rfl (λ x hx, mul_indicator_apply_eq_self.2 $ λ hxs, _),
251
261
contrapose! hxs,
252
262
exact (h hxs).2 hx
@@ -255,12 +265,12 @@ end
255
265
@[to_additive] lemma finprod_mem_eq_prod_of_inter_mul_support_eq (f : α → M) {s : set α}
256
266
{t : finset α} (h : s ∩ mul_support f = t ∩ mul_support f) :
257
267
∏ᶠ i ∈ s, f i = ∏ i in t, f i :=
258
- finprod_mem_eq_prod_of_mem_iff _ $ by simpa [set.ext_iff] using h
268
+ finprod_cond_eq_prod_of_cond_iff _ $ by simpa [set.ext_iff] using h
259
269
260
270
@[to_additive] lemma finprod_mem_eq_prod_of_subset (f : α → M) {s : set α} {t : finset α}
261
271
(h₁ : s ∩ mul_support f ⊆ t) (h₂ : ↑t ⊆ s) :
262
272
∏ᶠ i ∈ s, f i = ∏ i in t, f i :=
263
- finprod_mem_eq_prod_of_mem_iff _ $ λ x hx, ⟨λ h, h₁ ⟨h, hx⟩, λ h, h₂ h⟩
273
+ finprod_cond_eq_prod_of_cond_iff _ $ λ x hx, ⟨λ h, h₁ ⟨h, hx⟩, λ h, h₂ h⟩
264
274
265
275
@[to_additive] lemma finprod_mem_eq_prod (f : α → M) {s : set α}
266
276
(hf : (s ∩ mul_support f).finite) :
@@ -642,4 +652,19 @@ begin
642
652
{ exact (finprod_mem_eq_one_of_infinite hs).symm ▸ hp₀ }
643
653
end
644
654
655
+ lemma finprod_cond_nonneg {R : Type *} [ordered_comm_semiring R] {p : α → Prop } {f : α → R}
656
+ (hf : ∀ x, p x → 0 ≤ f x) :
657
+ 0 ≤ ∏ᶠ x (h : p x), f x :=
658
+ finprod_nonneg $ λ x, finprod_nonneg $ hf x
659
+
660
+ lemma finprod_eq_zero {M₀ : Type *} [comm_monoid_with_zero M₀] (f : α → M₀) (x : α)
661
+ (hx : f x = 0 ) (hf : finite (mul_support f)) :
662
+ ∏ᶠ x, f x = 0 :=
663
+ begin
664
+ nontriviality,
665
+ rw [finprod_eq_prod f hf],
666
+ refine finset.prod_eq_zero (hf.mem_to_finset.2 _) hx,
667
+ simp [hx]
668
+ end
669
+
645
670
end type
0 commit comments