Skip to content

Commit db6bc5d

Browse files
committed
feat: More big operator lemmas (#10551)
From LeanAPAP
1 parent c81020b commit db6bc5d

File tree

8 files changed

+223
-32
lines changed

8 files changed

+223
-32
lines changed

Mathlib/Algebra/BigOperators/Basic.lean

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,19 @@ lemma prod_of_injOn (e : ι → κ) (he : Set.InjOn e s) (hest : Set.MapsTo e s
667667

668668
variable [DecidableEq κ]
669669

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+
670683
@[to_additive]
671684
lemma prod_fiberwise_of_maps_to {g : ι → κ} (h : ∀ i ∈ s, g i ∈ t) (f : ι → α) :
672685
∏ 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 ι)
19451958

19461959
end CommMonoid
19471960

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+
19481978
theorem card_eq_sum_ones (s : Finset α) : s.card = ∑ x in s, 1 := by
19491979
rw [sum_const, smul_eq_mul, mul_one]
19501980
#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) :
19551985
apply sum_congr rfl h₁
19561986
#align finset.sum_const_nat Finset.sum_const_nat
19571987

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+
19581992
lemma card_filter (p) [DecidablePred p] (s : Finset α) :
19591993
(filter p s).card = ∑ a in s, ite (p a) 1 0 := by
19601994
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 : α → ℤ) :
21562190
end Finset
21572191

21582192
namespace Fintype
2159-
variable {ι κ α : Type*} [Fintype ι] [Fintype κ] [CommMonoid α]
2193+
variable {ι κ α : Type*} [Fintype ι] [Fintype κ]
21602194

21612195
open Finset
21622196

2197+
section CommMonoid
2198+
variable [CommMonoid α]
2199+
21632200
/-- `Fintype.prod_bijective` is a variant of `Finset.prod_bij` that accepts `Function.Bijective`.
21642201
21652202
See `Function.Bijective.prod_comp` for a version without `h`. -/
@@ -2256,6 +2293,52 @@ theorem prod_subtype_mul_prod_subtype {α β : Type*} [Fintype α] [CommMonoid
22562293
#align fintype.prod_subtype_mul_prod_subtype Fintype.prod_subtype_mul_prod_subtype
22572294
#align fintype.sum_subtype_add_sum_subtype Fintype.sum_subtype_add_sum_subtype
22582295

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+
22592342
end Fintype
22602343

22612344
namespace Finset

Mathlib/Algebra/BigOperators/Ring.lean

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,11 @@ lemma prod_univ_sum [Fintype ι] (t : ∀ i, Finset (κ i)) (f : ∀ i, κ i →
170170

171171
lemma sum_prod_piFinset {κ : Type*} [Fintype ι] (s : Finset κ) (g : ι → κ → α) :
172172
∑ f in piFinset fun _ : ι ↦ s, ∏ i, g i (f i) = ∏ i, ∑ j in s, g i j := by
173-
classical rw [← prod_univ_sum]
173+
rw [← prod_univ_sum]
174174

175175
lemma sum_pow' (s : Finset ι) (f : ι → α) (n : ℕ) :
176176
(∑ a in s, f a) ^ n = ∑ p in piFinset fun _i : Fin n ↦ s, ∏ i, f (p i) := by
177-
classical convert @prod_univ_sum (Fin n) _ _ _ _ _ (fun _i ↦ s) fun _i d ↦ f d; simp
177+
convert @prod_univ_sum (Fin n) _ _ _ _ _ (fun _i ↦ s) fun _i d ↦ f d; simp
178178

179179
/-- The product of `f a + g a` over all of `s` is the sum over the powerset of `s` of the product of
180180
`f` over a subset `t` times the product of `g` over the complement of `t` -/
@@ -297,7 +297,31 @@ lemma sum_div (s : Finset ι) (f : ι → α) (a : α) :
297297
end DivisionSemiring
298298
end Finset
299299

300+
open Finset
301+
302+
namespace Fintype
303+
variable {ι κ α : Type*} [DecidableEq ι] [Fintype ι] [Fintype κ] [CommSemiring α]
304+
305+
lemma sum_pow (f : ι → α) (n : ℕ) : (∑ a, f a) ^ n = ∑ p : Fin n → ι, ∏ i, f (p i) := by
306+
simp [sum_pow']
307+
308+
lemma sum_mul_sum (f : ι → α) (g : κ → α) : (∑ i, f i) * ∑ j, g j = ∑ i, ∑ j, f i * g j :=
309+
Finset.sum_mul_sum _ _ _ _
310+
311+
lemma prod_add (f g : ι → α) : ∏ a, (f a + g a) = ∑ t, (∏ a in t, f a) * ∏ a in tᶜ, g a := by
312+
simpa [compl_eq_univ_sdiff] using Finset.prod_add f g univ
313+
314+
end Fintype
315+
300316
namespace Nat
317+
variable {ι : Type*} {s : Finset ι} {f : ι → ℕ} {n : ℕ}
318+
319+
protected lemma sum_div (hf : ∀ i ∈ s, n ∣ f i) : (∑ i in s, f i) / n = ∑ i in s, f i / n := by
320+
obtain rfl | hn := n.eq_zero_or_pos
321+
· simp
322+
rw [Nat.div_eq_iff_eq_mul_left hn (dvd_sum hf), sum_mul]
323+
refine' sum_congr rfl fun s hs ↦ _
324+
rw [Nat.div_mul_cancel (hf _ hs)]
301325

302326
@[simp, norm_cast]
303327
lemma cast_list_sum [AddMonoidWithOne β] (s : List ℕ) : (↑s.sum : β) = (s.map (↑)).sum :=

Mathlib/Algebra/Module/BigOperators.lean

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Chris Hughes, Yury Kudryashov, Yaël Dillies
55
-/
66
import Mathlib.Algebra.Module.Defs
7+
import Mathlib.Data.Fintype.BigOperators
78
import Mathlib.GroupTheory.GroupAction.BigOperators
89

910
#align_import algebra.module.big_operators from "leanprover-community/mathlib"@"509de852e1de55e1efa8eacfa11df0823f26f226"
@@ -14,7 +15,7 @@ import Mathlib.GroupTheory.GroupAction.BigOperators
1415

1516
open BigOperators
1617

17-
variable {α β R M ι : Type*}
18+
variable {ι κ α β R M : Type*}
1819

1920
section AddCommMonoid
2021

@@ -51,3 +52,17 @@ end AddCommMonoid
5152
theorem Finset.cast_card [CommSemiring R] (s : Finset α) : (s.card : R) = ∑ a in s, 1 := by
5253
rw [Finset.sum_const, Nat.smul_one_eq_coe]
5354
#align finset.cast_card Finset.cast_card
55+
56+
open Finset
57+
58+
namespace Fintype
59+
variable [DecidableEq ι] [Fintype ι] [AddCommMonoid α]
60+
61+
lemma sum_piFinset_apply (f : κ → α) (s : Finset κ) (i : ι) :
62+
∑ g in piFinset fun _ : ι ↦ s, f (g i) = s.card ^ (card ι - 1) • ∑ b in s, f b := by
63+
classical
64+
rw [Finset.sum_comp]
65+
simp only [eval_image_piFinset_const, card_filter_piFinset_const s, ite_smul, zero_smul, smul_sum,
66+
sum_ite_mem, inter_self]
67+
68+
end Fintype

Mathlib/Data/Finset/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2631,7 +2631,7 @@ theorem filter_False {h} (s : Finset α) : @filter _ (fun _ => False) h s = ∅
26312631

26322632
variable {p q}
26332633

2634-
theorem filter_eq_self : s.filter p = s ↔ ∀ x ∈ s, p x := by simp [Finset.ext_iff]
2634+
@[simp] lemma filter_eq_self : s.filter p = s ↔ ∀ x ∈ s, p x := by simp [Finset.ext_iff]
26352635
#align finset.filter_eq_self Finset.filter_eq_self
26362636

26372637
theorem filter_eq_empty_iff : s.filter p = ∅ ↔ ∀ ⦃x⦄, x ∈ s → ¬p x := by simp [Finset.ext_iff]

Mathlib/Data/Finset/Union.lean

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,20 @@ lemma disjiUnion_disjiUnion (s : Finset α) (f : α → Finset β) (g : β → F
8888
eq_of_veq <| Multiset.bind_assoc.trans (Multiset.attach_bind_coe _ _).symm
8989
#align finset.disj_Union_disj_Union Finset.disjiUnion_disjiUnion
9090

91-
lemma disjiUnion_filter_eq_of_maps_to [DecidableEq β] {s : Finset α} {t : Finset β} {f : α → β}
92-
(h : ∀ x ∈ s, f x ∈ t) :
93-
t.disjiUnion (fun a ↦ s.filter (fun c ↦ f c = a))
94-
(fun x' hx y' hy hne ↦ by
95-
simp_rw [disjoint_left, mem_filter]
96-
rintro i ⟨_, rfl⟩ ⟨_, rfl⟩
97-
exact hne rfl) = s :=
98-
ext fun b ↦ by simpa using h b
91+
variable [DecidableEq β] {s : Finset α} {t : Finset β} {f : α → β}
92+
93+
private lemma pairwiseDisjoint_fibers : Set.PairwiseDisjoint ↑t fun a ↦ s.filter (f · = a) :=
94+
fun x' hx y' hy hne ↦ by
95+
simp_rw [disjoint_left, mem_filter]; rintro i ⟨_, rfl⟩ ⟨_, rfl⟩; exact hne rfl
96+
97+
-- `simpNF` claims that the statement can't simplify itself, but it can (as of 2024-02-14)
98+
@[simp, nolint simpNF] lemma disjiUnion_filter_eq (s : Finset α) (t : Finset β) (f : α → β) :
99+
t.disjiUnion (fun a ↦ s.filter (f · = a)) pairwiseDisjoint_fibers =
100+
s.filter fun c ↦ f c ∈ t :=
101+
ext fun b => by simpa using and_comm
102+
103+
lemma disjiUnion_filter_eq_of_maps_to (h : ∀ x ∈ s, f x ∈ t) :
104+
t.disjiUnion (fun a ↦ s.filter (f · = a)) pairwiseDisjoint_fibers = s := by simpa
99105
#align finset.disj_Union_filter_eq_of_maps_to Finset.disjiUnion_filter_eq_of_maps_to
100106

101107
end DisjiUnion

Mathlib/Data/Fintype/BigOperators.lean

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -118,29 +118,63 @@ end
118118

119119
open Finset
120120

121-
@[simp]
122-
nonrec theorem Fintype.card_sigma {α : Type*} (β : α → Type*) [Fintype α] [∀ a, Fintype (β a)] :
123-
Fintype.card (Sigma β) = ∑ a, Fintype.card (β a) :=
124-
card_sigma _ _
125-
#align fintype.card_sigma Fintype.card_sigma
121+
section Pi
122+
variable {ι κ : Type*} {α : ι → Type*} [DecidableEq ι] [DecidableEq κ] [Fintype ι]
123+
[∀ i, DecidableEq (α i)]
126124

127-
@[simp]
128-
theorem Finset.card_pi [DecidableEq α] {δ : α → Type*} (s : Finset α) (t : ∀ a, Finset (δ a)) :
129-
(s.pi t).card = ∏ a in s, card (t a) :=
130-
Multiset.card_pi _ _
125+
@[simp] lemma Finset.card_pi (s : Finset ι) (t : ∀ i, Finset (α i)) :
126+
(s.pi t).card = ∏ i in s, card (t i) := Multiset.card_pi _ _
131127
#align finset.card_pi Finset.card_pi
132128

133-
@[simp]
134-
theorem Fintype.card_piFinset [DecidableEq α] [Fintype α] {δ : α → Type*} (t : ∀ a, Finset (δ a)) :
135-
(Fintype.piFinset t).card = ∏ a, Finset.card (t a) := by simp [Fintype.piFinset, card_map]
129+
namespace Fintype
130+
131+
@[simp] lemma card_piFinset (s : ∀ i, Finset (α i)) :
132+
(piFinset s).card = ∏ i, (s i).card := by simp [piFinset, card_map]
136133
#align fintype.card_pi_finset Fintype.card_piFinset
137134

138-
@[simp]
139-
theorem Fintype.card_pi {β : α → Type*} [DecidableEq α] [Fintype α] [∀ a, Fintype (β a)] :
140-
Fintype.card (∀ a, β a) = ∏ a, Fintype.card (β a) :=
141-
Fintype.card_piFinset _
135+
@[simp] lemma card_pi [DecidableEq ι] [∀ i, Fintype (α i)] : card (∀ i, α i) = ∏ i, card (α i) :=
136+
card_piFinset _
142137
#align fintype.card_pi Fintype.card_pi
143138

139+
@[simp] nonrec lemma card_sigma [Fintype ι] [∀ i, Fintype (α i)] :
140+
card (Sigma α) = ∑ i, card (α i) := card_sigma _ _
141+
#align fintype.card_sigma Fintype.card_sigma
142+
143+
/-- The number of dependent maps `f : Π j, s j` for which the `i` component is `a` is the product
144+
over all `j ≠ i` of `(s j).card`.
145+
146+
Note that this is just a composition of easier lemmas, but there's some glue missing to make that
147+
smooth enough not to need this lemma. -/
148+
lemma card_filter_piFinset_eq_of_mem (s : ∀ i, Finset (α i)) (i : ι) {a : α i} (ha : a ∈ s i) :
149+
((piFinset s).filter fun f ↦ f i = a).card = ∏ j in univ.erase i, (s j).card := by
150+
calc
151+
_ = ∏ j, (Function.update s i {a} j).card := by
152+
rw [← piFinset_update_singleton_eq_filter_piFinset_eq _ _ ha, Fintype.card_piFinset]
153+
_ = ∏ j, Function.update (fun j ↦ (s j).card) i 1 j :=
154+
Fintype.prod_congr _ _ fun j ↦ by obtain rfl | hji := eq_or_ne j i <;> simp [*]
155+
_ = _ := by simp [prod_update_of_mem, erase_eq]
156+
157+
lemma card_filter_piFinset_const_eq_of_mem (s : Finset κ) (i : ι) {x : κ} (hx : x ∈ s) :
158+
((piFinset fun _ ↦ s).filter fun f ↦ f i = x).card = s.card ^ (card ι - 1) :=
159+
(card_filter_piFinset_eq_of_mem _ _ hx).trans $ by
160+
rw [prod_const s.card, card_erase_of_mem (mem_univ _), card_univ]
161+
162+
lemma card_filter_piFinset_eq (s : ∀ i, Finset (α i)) (i : ι) (a : α i) :
163+
((piFinset s).filter fun f ↦ f i = a).card =
164+
if a ∈ s i then ∏ b in univ.erase i, (s b).card else 0 := by
165+
split_ifs with h
166+
· rw [card_filter_piFinset_eq_of_mem _ _ h]
167+
· rw [filter_piFinset_of_not_mem _ _ _ h, Finset.card_empty]
168+
169+
lemma card_filter_piFinset_const (s : Finset κ) (i : ι) (j : κ) :
170+
((piFinset fun _ ↦ s).filter fun f ↦ f i = j).card =
171+
if j ∈ s then s.card ^ (card ι - 1) else 0 :=
172+
(card_filter_piFinset_eq _ _ _).trans $ by
173+
rw [prod_const s.card, card_erase_of_mem (mem_univ _), card_univ]
174+
175+
end Fintype
176+
end Pi
177+
144178
-- FIXME ouch, this should be in the main file.
145179
@[simp]
146180
theorem Fintype.card_fun [DecidableEq α] [Fintype α] [Fintype β] :

Mathlib/Data/Fintype/Pi.lean

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,39 @@ lemma eval_image_piFinset (t : ∀ a, Finset (δ a)) (a : α) [DecidableEq (δ a
9797
choose f hf using ht
9898
exact ⟨fun b ↦ if h : a = b then h ▸ x else f _ h, by aesop, by simp⟩
9999

100-
lemma filter_piFinset_of_not_mem [∀ a, DecidableEq (δ a)] (t : ∀ a, Finset (δ a)) (a : α)
101-
(x : δ a) (hx : x ∉ t a) : (piFinset t).filter (· a = x) = ∅ := by
100+
lemma eval_image_piFinset_const {β} [DecidableEq β] (t : Finset β) (a : α) :
101+
((piFinset fun _i : α ↦ t).image fun f ↦ f a) = t := by
102+
obtain rfl | ht := t.eq_empty_or_nonempty
103+
· haveI : Nonempty α := ⟨a⟩
104+
simp
105+
· exact eval_image_piFinset (fun _ ↦ t) a fun _ _ ↦ ht
106+
107+
variable [∀ a, DecidableEq (δ a)]
108+
109+
lemma filter_piFinset_of_not_mem (t : ∀ a, Finset (δ a)) (a : α) (x : δ a) (hx : x ∉ t a) :
110+
(piFinset t).filter (· a = x) = ∅ := by
102111
simp only [filter_eq_empty_iff, mem_piFinset]; rintro f hf rfl; exact hx (hf _)
103112

113+
-- TODO: This proof looks like a good example of something that `aesop` can't do but should
114+
lemma piFinset_update_eq_filter_piFinset_mem (s : ∀ i, Finset (δ i)) (i : α) {t : Finset (δ i)}
115+
(hts : t ⊆ s i) : piFinset (Function.update s i t) = (piFinset s).filter (fun f ↦ f i ∈ t) := by
116+
ext f
117+
simp only [mem_piFinset, mem_filter]
118+
refine ⟨fun h ↦ ?_, fun h j ↦ ?_⟩
119+
· have := by simpa using h i
120+
refine ⟨fun j ↦ ?_, this⟩
121+
obtain rfl | hji := eq_or_ne j i
122+
· exact hts this
123+
· simpa [hji] using h j
124+
· obtain rfl | hji := eq_or_ne j i
125+
· simpa using h.2
126+
· simpa [hji] using h.1 j
127+
128+
lemma piFinset_update_singleton_eq_filter_piFinset_eq (s : ∀ i, Finset (δ i)) (i : α) {a : δ i}
129+
(ha : a ∈ s i) :
130+
piFinset (Function.update s i {a}) = (piFinset s).filter (fun f ↦ f i = a) := by
131+
simp [piFinset_update_eq_filter_piFinset_mem, ha]
132+
104133
end Fintype
105134

106135
/-! ### pi -/

Mathlib/GroupTheory/PGroup.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
187187
calc
188188
card α = card (Σy : Quotient (orbitRel G α), { x // Quotient.mk'' x = y }) :=
189189
card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbitRel G α))).symm
190-
_ = ∑ a : Quotient (orbitRel G α), card { x // Quotient.mk'' x = a } := card_sigma _
190+
_ = ∑ a : Quotient (orbitRel G α), card { x // Quotient.mk'' x = a } := card_sigma
191191
_ ≡ ∑ _a : fixedPoints G α, 1 [MOD p] := ?_
192192
_ = _ := by simp; rfl
193193
rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]

0 commit comments

Comments
 (0)