@@ -30,6 +30,10 @@ local notation s " +ˢ " N => Set.image ((↑) : α → α ⧸ N) s
3030section Group
3131variable [Group α] [DecidableEq α] {s t : Finset α} {a : α}
3232
33+ @[to_additive]
34+ instance (s : Finset α) : DecidablePred (· ∈ stabilizer α s.toSet) :=
35+ fun a ↦ decidable_of_iff (a ∈ stabilizer α s) (by simp)
36+
3337/-- The stabilizer of `s` as a finset. As an exception, this sends `∅` to `∅`.-/
3438@[to_additive "The stabilizer of `s` as a finset. As an exception, this sends `∅` to `∅`."]
3539def mulStab (s : Finset α) : Finset α := {a ∈ s / s | a • s = s}
@@ -51,20 +55,22 @@ lemma mulStab_subset_div_right (ha : a ∈ s) : s.mulStab ⊆ s / {a} := by
5155 exact smul_mem_smul_finset ha
5256
5357@[to_additive (attr := simp)]
54- lemma coe_mulStab (hs : s.Nonempty) : (s.mulStab : Set α) = MulAction. stabilizer α s := by
58+ lemma coe_mulStab (hs : s.Nonempty) : (s.mulStab : Set α) = stabilizer α s.toSet := by
5559 ext; simp [mem_mulStab hs]
5660
5761@[to_additive]
5862lemma mem_mulStab_iff_subset_smul_finset (hs : s.Nonempty) : a ∈ s.mulStab ↔ s ⊆ a • s := by
59- rw [← mem_coe, coe_mulStab hs, SetLike.mem_coe, mem_stabilizer_finset_iff_subset_smul_finset]
63+ rw [← mem_coe, coe_mulStab hs, SetLike.mem_coe, stabilizer_coe_finset,
64+ mem_stabilizer_finset_iff_subset_smul_finset]
6065
6166@[to_additive]
6267lemma mem_mulStab_iff_smul_finset_subset (hs : s.Nonempty) : a ∈ s.mulStab ↔ a • s ⊆ s := by
63- rw [← mem_coe, coe_mulStab hs, SetLike.mem_coe, mem_stabilizer_finset_iff_smul_finset_subset]
68+ rw [← mem_coe, coe_mulStab hs, SetLike.mem_coe, stabilizer_coe_finset,
69+ mem_stabilizer_finset_iff_smul_finset_subset]
6470
6571@[to_additive]
6672lemma mem_mulStab' (hs : s.Nonempty) : a ∈ s.mulStab ↔ ∀ ⦃b⦄, b ∈ s → a • b ∈ s := by
67- rw [← mem_coe, coe_mulStab hs, SetLike.mem_coe, mem_stabilizer_finset']
73+ rw [← mem_coe, coe_mulStab hs, SetLike.mem_coe, stabilizer_coe_finset, mem_stabilizer_finset']
6874
6975@[to_additive (attr := simp)]
7076lemma mulStab_empty : mulStab (∅ : Finset α) = ∅ := by simp [mulStab]
@@ -188,31 +194,30 @@ lemma mul_subset_left : t ⊆ s.mulStab → s * t ⊆ s := by rw [mul_comm]; exa
188194lemma mulStab_idem (s : Finset α) : s.mulStab.mulStab = s.mulStab := by
189195 obtain rfl | hs := s.eq_empty_or_nonempty
190196 · simp
191- rw [← coe_inj, coe_mulStab hs, coe_mulStab hs.mulStab, ← stabilizer_coe_finset, coe_mulStab hs]
197+ rw [← coe_inj, coe_mulStab hs, coe_mulStab hs.mulStab, coe_mulStab hs]
192198 simp
193199
194200@[to_additive (attr := simp)]
195201lemma mulStab_smul (a : α) (s : Finset α) : (a • s).mulStab = s.mulStab := by
196202 obtain rfl | hs := s.eq_empty_or_nonempty
197203 · simp
198- · rw [← coe_inj, coe_mulStab hs, coe_mulStab hs.smul_finset, stabilizer_smul_eq_right]
199-
200- open scoped Classical
204+ · rw [← coe_inj, coe_mulStab hs, coe_mulStab hs.smul_finset, stabilizer_coe_finset,
205+ stabilizer_coe_finset, stabilizer_smul_eq_right]
201206
202207@[to_additive]
203208lemma mulStab_image_coe_quotient (hs : s.Nonempty) :
204- (s.image (↑) : Finset (α ⧸ stabilizer α s)).mulStab = 1 := by
205- rw [← coe_inj, coe_mulStab (hs.image _), ← stabilizer_coe_finset, ← stabilizer_coe_finset,
206- coe_image, coe_one, stabilizer_image_coe_quotient, Subgroup.coe_bot, Set.singleton_one]
209+ (s.image (↑) : Finset (α ⧸ stabilizer α s.toSet )).mulStab = 1 := by
210+ simp_rw [← coe_inj, coe_mulStab (hs.image _), coe_image, coe_one]
211+ rw [ stabilizer_image_coe_quotient, Subgroup.coe_bot, Set.singleton_one]
207212
208213@[to_additive]
209214lemma preimage_image_quotientMk_stabilizer_eq_mul_mulStab (ht : t.Nonempty) (s : Finset α) :
210- QuotientGroup.mk ⁻¹' (s +ˢ stabilizer α t) = s * t.mulStab := by
211- rw [QuotientGroup.preimage_image_mk_eq_mul, coe_mulStab ht]
215+ QuotientGroup.mk ⁻¹' (s +ˢ stabilizer α t.toSet ) = s * t.mulStab := by
216+ rw [QuotientGroup.preimage_image_mk_eq_mul, coe_mulStab ht, stabilizer_coe_finset ]
212217
213218@[to_additive]
214219lemma preimage_image_quotientMk_mulStabilizer (s : Finset α) :
215- QuotientGroup.mk ⁻¹' (s +ˢ stabilizer α s) = s := by
220+ QuotientGroup.mk ⁻¹' (s +ˢ stabilizer α s.toSet ) = s := by
216221 obtain rfl | hs := s.eq_empty_or_nonempty
217222 · simp
218223 · rw [preimage_image_quotientMk_stabilizer_eq_mul_mulStab hs s, ← coe_mul, mul_mulStab]
@@ -280,12 +285,12 @@ lemma card_mulStab_dvd_card_mulStab (hs : s.Nonempty) (h : s.mulStab ⊆ t.mulSt
280285
281286/-- A version of Lagrange's theorem. -/
282287@[to_additive "A version of Lagrange's theorem."]
283- lemma card_mulStab_mul_card_image_coe' (s t : Finset α) :
284- #t.mulStab * #(s +ₛ stabilizer α t) = #(s * t.mulStab) := by
288+ lemma card_mulStab_mul_card_image_coe' (s t : Finset α) [DecidableEq (α ⧸ stabilizer α t.toSet)] :
289+ #t.mulStab * #(s +ₛ stabilizer α t.toSet ) = #(s * t.mulStab) := by
285290 obtain rfl | ht := t.eq_empty_or_nonempty
286291 · simp
287- have := QuotientGroup.preimageMkEquivSubgroupProdSet _ (s +ˢ stabilizer α t)
288- have that : ↥(stabilizer α t) = ↥t.mulStab := by
292+ have := QuotientGroup.preimageMkEquivSubgroupProdSet _ (s +ˢ stabilizer α t.toSet )
293+ have that : ↥(stabilizer α t.toSet ) = ↥t.mulStab := by
289294 rw [← SetLike.coe_sort_coe, ← coe_mulStab ht, Finset.coe_sort_coe]
290295 have temp := this.trans ((Equiv.cast that).prodCongr (Equiv.refl _))
291296 rw [preimage_image_quotientMk_stabilizer_eq_mul_mulStab ht] at temp
@@ -295,13 +300,13 @@ lemma card_mulStab_mul_card_image_coe' (s t : Finset α) :
295300
296301@[to_additive]
297302lemma card_mul_card_eq_mulStab_card_mul_coe (s t : Finset α) :
298- #(s * t) = #(s * t).mulStab * #((s * t) +ₛ stabilizer α (s * t)) := by
303+ #(s * t) = #(s * t).mulStab * #((s * t) +ₛ stabilizer α (s * t).toSet ) := by
299304 obtain rfl | hs := s.eq_empty_or_nonempty
300305 · simp
301306 obtain rfl | ht := t.eq_empty_or_nonempty
302307 · simp
303- have := QuotientGroup.preimageMkEquivSubgroupProdSet _ $ ↑(s * t) +ˢ stabilizer α (s * t)
304- have that : ↥(stabilizer α (s * t)) = ↥(s * t).mulStab := by
308+ have := QuotientGroup.preimageMkEquivSubgroupProdSet _ $ ↑(s * t) +ˢ stabilizer α (s * t).toSet
309+ have that : ↥(stabilizer α (s * t).toSet ) = ↥(s * t).mulStab := by
305310 rw [← SetLike.coe_sort_coe, ← coe_mulStab (hs.mul ht), Finset.coe_sort_coe]
306311 have temp := this.trans $ (Equiv.cast that).prodCongr (Equiv.refl _)
307312 rw [preimage_image_quotientMk_mulStabilizer] at temp
@@ -310,40 +315,42 @@ lemma card_mul_card_eq_mulStab_card_mul_coe (s t : Finset α) :
310315/-- A version of Lagrange's theorem. -/
311316@[to_additive "A version of Lagrange's theorem."]
312317lemma card_mulStab_mul_card_image_coe (s t : Finset α) :
313- #(s * t).mulStab * #((s +ₛ stabilizer α (s * t)) * (t +ₛ stabilizer α (s * t))) = #(s * t) := by
318+ #(s * t).mulStab * #((s +ₛ stabilizer α (s * t).toSet) * (t +ₛ stabilizer α (s * t).toSet)) =
319+ #(s * t) := by
314320 obtain rfl | hs := s.eq_empty_or_nonempty
315321 · simp
316322 obtain rfl | ht := t.eq_empty_or_nonempty
317323 · simp
318- let this := QuotientGroup.preimageMkEquivSubgroupProdSet (stabilizer α (s * t))
319- ((s +ˢ stabilizer α (s * t)) * (t +ˢ stabilizer α (s * t)))
324+ let this := QuotientGroup.preimageMkEquivSubgroupProdSet (stabilizer α (s * t).toSet )
325+ ((s +ˢ stabilizer α (s * t).toSet ) * (t +ˢ stabilizer α (s * t).toSet ))
320326 have image_coe_mul :
321- ((s * t) +ˢ stabilizer α (s * t)) = (s +ˢ stabilizer α (s * t)) * (t +ˢ stabilizer α (s * t)) : =
322- Set.image_mul (QuotientGroup.mk' ( stabilizer α (s * t)) : α →* α ⧸ stabilizer α (s * t))
323- rw [← image_coe_mul, ← coe_mul, preimage_image_quotientMk_mulStabilizer, coe_mul, image_coe_mul]
324- at this
327+ ((s * t).toSet +ˢ stabilizer α (s * t).toSet) =
328+ (s +ˢ stabilizer α (s * t).toSet) * (t +ˢ stabilizer α (s * t).toSet) := by
329+ simpa [coe_mul] using Set.image_mul (QuotientGroup.mk' (stabilizer α (s * t).toSet))
330+ rw [← image_coe_mul, preimage_image_quotientMk_mulStabilizer, image_coe_mul] at this
325331 have that :
326- (stabilizer α (s * t) × ↥((s +ˢ stabilizer α (s * t)) * (t +ˢ stabilizer α (s * t)))) =
327- ((s * t).mulStab × ↥((s +ˢ stabilizer α (s * t)) * (t +ˢ stabilizer α (s * t)))) := by
332+ (stabilizer α (s * t).toSet ×
333+ ↥((s +ˢ stabilizer α (s * t).toSet) * (t +ˢ stabilizer α (s * t).toSet))) =
334+ ((s * t).mulStab ×
335+ ↥((s +ˢ stabilizer α (s * t).toSet) * (t +ˢ stabilizer α (s * t).toSet))) := by
328336 rw [← SetLike.coe_sort_coe, ← coe_mulStab (hs.mul ht), Finset.coe_sort_coe]
329337 let temp := this.trans (Equiv.cast that)
330338 replace temp := Fintype.card_congr temp
331- simp_rw [← Finset.coe_mul s t] at temp
332339 simp only [Fintype.card_prod, Fintype.card_coe] at temp
333340 have h1 : Fintype.card ((s * t : Finset α) : Set α) = Fintype.card (s * t) := by congr
334- have h2 : (s +ˢ stabilizer α (s * t)) * (t +ˢ stabilizer α (s * t)) =
335- ↑((s +ₛ stabilizer α (s * t)) * (t +ₛ stabilizer α (s * t))) := by simp
341+ have h2 : (s +ˢ stabilizer α (s * t).toSet ) * (t +ˢ stabilizer α (s * t).toSet ) =
342+ ↑((s +ₛ stabilizer α (s * t).toSet ) * (t +ₛ stabilizer α (s * t).toSet )) := by simp
336343 have h3 :
337- Fintype.card ((s +ˢ stabilizer α (s * t)) * (t +ˢ stabilizer α (s * t))) =
338- Fintype.card ((s +ₛ stabilizer α (s * t)) * (t +ₛ stabilizer α (s * t))) := by
344+ Fintype.card ((s +ˢ stabilizer α (s * t).toSet ) * (t +ˢ stabilizer α (s * t).toSet )) =
345+ Fintype.card ((s +ₛ stabilizer α (s * t).toSet ) * (t +ₛ stabilizer α (s * t).toSet )) := by
339346 simp_rw [h2]
340347 congr
341348 simp only [h1, h3, Fintype.card_coe] at temp
342349 rw [temp]
343350
344351@[to_additive]
345- lemma subgroup_mul_card_eq_mul_of_mul_stab_subset (s : Subgroup α) (t : Finset α)
346- (hst : (s : Set α) ⊆ t.mulStab) : Nat.card s * #(t +ₛ s) = #t := by
352+ lemma subgroup_mul_card_eq_mul_of_mul_stab_subset (s : Subgroup α) [DecidablePred (· ∈ s)]
353+ (t : Finset α) ( hst : (s : Set α) ⊆ t.mulStab) : Nat.card s * #(t +ₛ s) = #t := by
347354 suffices h : (t : Set α) * s = t by
348355 simpa [h, eq_comm] using s.card_mul_eq_card_subgroup_mul_card_quotient t
349356 apply Set.Subset.antisymm (Set.Subset.trans (Set.mul_subset_mul_left hst) _)
@@ -353,7 +360,7 @@ lemma subgroup_mul_card_eq_mul_of_mul_stab_subset (s : Subgroup α) (t : Finset
353360 · rw [← coe_mul, mul_mulStab]
354361
355362@[to_additive]
356- lemma mulStab_quotient_commute_subgroup (s : Subgroup α) (t : Finset α)
363+ lemma mulStab_quotient_commute_subgroup (s : Subgroup α) [DecidablePred (· ∈ s)] (t : Finset α)
357364 (hst : (s : Set α) ⊆ t.mulStab) : (t.mulStab +ₛ s) = (t +ₛ s).mulStab := by
358365 obtain rfl | ht := t.eq_empty_or_nonempty
359366 · simp
0 commit comments