group_theory.sylow
⟷
Mathlib.GroupTheory.Sylow
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
centralizer
from subgroup G
to set G
(#18965)
This is consistent with all the other sub<foo>.centralizer
definitions.
This generalization reveals that a lot of downstream results are rather strangely stated about zpowers
.
This does not attempt to change these, instead leaving the work for a follow up (either in a later mathlib3 PR or in mathlib4).
@@ -302,18 +302,19 @@ ext (λ g, sylow.smul_eq_iff_mem_normalizer)
lemma sylow.conj_eq_normalizer_conj_of_mem_centralizer
[fact p.prime] [finite (sylow p G)] (P : sylow p G) (x g : G)
- (hx : x ∈ (P : subgroup G).centralizer) (hy : g⁻¹ * x * g ∈ (P : subgroup G).centralizer) :
+ (hx : x ∈ centralizer (P : set G)) (hy : g⁻¹ * x * g ∈ centralizer (P : set G)) :
∃ n ∈ (P : subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
begin
- have h1 : ↑P ≤ (zpowers x).centralizer,
+ have h1 : ↑P ≤ centralizer (zpowers x : set G),
{ rwa [le_centralizer_iff, zpowers_le] },
- have h2 : ↑(g • P) ≤ (zpowers x).centralizer,
+ have h2 : ↑(g • P) ≤ centralizer (zpowers x : set G),
{ rw [le_centralizer_iff, zpowers_le],
rintros - ⟨z, hz, rfl⟩,
specialize hy z hz,
rwa [←mul_assoc, ←eq_mul_inv_iff_mul_eq, mul_assoc, mul_assoc, mul_assoc, ←mul_assoc,
eq_inv_mul_iff_mul_eq, ←mul_assoc, ←mul_assoc] at hy },
- obtain ⟨h, hh⟩ := exists_smul_eq (zpowers x).centralizer ((g • P).subtype h2) (P.subtype h1),
+ obtain ⟨h, hh⟩ :=
+ exists_smul_eq (centralizer (zpowers x : set G)) ((g • P).subtype h2) (P.subtype h1),
simp_rw [sylow.smul_subtype, smul_def, smul_smul] at hh,
refine ⟨h * g, sylow.smul_eq_iff_mem_normalizer.mp (sylow.subtype_injective hh), _⟩,
rw [←mul_assoc, commute.right_comm (h.prop x (mem_zpowers x)), mul_inv_rev, inv_mul_cancel_right]
@@ -322,7 +323,8 @@ end
lemma sylow.conj_eq_normalizer_conj_of_mem [fact p.prime] [finite (sylow p G)] (P : sylow p G)
[hP : (P : subgroup G).is_commutative] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
∃ n ∈ (P : subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
-P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer P hx) (le_centralizer P hy)
+P.conj_eq_normalizer_conj_of_mem_centralizer x g
+ (le_centralizer (P : subgroup G) hx : _) (le_centralizer (P : subgroup G) hy : _)
/-- Sylow `p`-subgroups are in bijection with cosets of the normalizer of a Sylow `p`-subgroup -/
noncomputable def sylow.equiv_quotient_normalizer [fact p.prime] [fintype (sylow p G)]
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
The lemma card_eq_multiplicity
states that a Sylow group of a finite group has cardinality p^n, where n is
the multiplicity of p in the group order. This PR adds an inverse definition card_eq_multiplicity_to_sylow
, promoting a subgroup of the right cardinality to a Sylow group, and a simplification lemma coe_card_eq_multiplicity_to_sylow
for the coercion of the resulting Sylow group back to a subgroup.
@@ -36,7 +36,7 @@ The Sylow theorems are the following results for every finite group `G` and ever
there exists a subgroup of `G` of order `pⁿ`.
* `is_p_group.exists_le_sylow`: A generalization of Sylow's first theorem:
Every `p`-subgroup is contained in a Sylow `p`-subgroup.
-* `sylow.card_eq_multiplicity`: The cardinality of a Sylow group is `p ^ n`
+* `sylow.card_eq_multiplicity`: The cardinality of a Sylow subgroup is `p ^ n`
where `n` is the multiplicity of `p` in the group order.
* `sylow_conjugate`: A generalization of Sylow's second theorem:
If the number of Sylow `p`-subgroups is finite, then all Sylow `p`-subgroups are conjugate.
@@ -592,7 +592,7 @@ begin
rwa [h, card_bot] at key,
end
-/-- The cardinality of a Sylow group is `p ^ n`
+/-- The cardinality of a Sylow subgroup is `p ^ n`
where `n` is the multiplicity of `p` in the group order. -/
lemma card_eq_multiplicity [fintype G] {p : ℕ} [hp : fact p.prime] (P : sylow p G) :
card P = p ^ nat.factorization (card G) p :=
@@ -603,6 +603,21 @@ begin
exact P.1.card_subgroup_dvd_card,
end
+/-- A subgroup with cardinality `p ^ n` is a Sylow subgroup
+ where `n` is the multiplicity of `p` in the group order. -/
+def of_card [fintype G] {p : ℕ} [hp : fact p.prime] (H : subgroup G) [fintype H]
+ (card_eq : card H = p ^ (card G).factorization p) : sylow p G :=
+{ to_subgroup := H,
+ is_p_group' := is_p_group.of_card card_eq,
+ is_maximal' := begin
+ obtain ⟨P, hHP⟩ := (is_p_group.of_card card_eq).exists_le_sylow,
+ exact set_like.ext' (set.eq_of_subset_of_card_le hHP
+ (P.card_eq_multiplicity.trans card_eq.symm).le).symm ▸ λ _, P.3,
+ end }
+
+@[simp, norm_cast] lemma coe_of_card [fintype G] {p : ℕ} [hp : fact p.prime] (H : subgroup G)
+ [fintype H] (card_eq : card H = p ^ (card G).factorization p) : ↑(of_card H card_eq) = H := rfl
+
lemma subsingleton_of_normal {p : ℕ} [fact p.prime] [finite (sylow p G)] (P : sylow p G)
(h : (P : subgroup G).normal) : subsingleton (sylow p G) :=
begin
@@ -667,8 +682,8 @@ normalizer_eq_top.mp $ normalizer_condition_iff_only_full_group_self_normalizing
open_locale big_operators
-/-- If all its sylow groups are normal, then a finite group is isomorphic to the direct product
-of these sylow groups.
+/-- If all its Sylow subgroups are normal, then a finite group is isomorphic to the direct product
+of these Sylow subgroups.
-/
noncomputable
def direct_product_of_normal [fintype G]
@@ -677,7 +692,7 @@ def direct_product_of_normal [fintype G]
begin
set ps := (fintype.card G).factorization.support,
- -- “The” sylow group for p
+ -- “The” Sylow subgroup for p
let P : Π p, sylow p G := default,
have hcomm : pairwise (λ (p₁ p₂ : ps), ∀ (x y : G), x ∈ P p₁ → y ∈ P p₂ → commute x y),
@@ -689,7 +704,7 @@ begin
apply is_p_group.disjoint_of_ne p₁ p₂ hne' _ _ (P p₁).is_p_group' (P p₂).is_p_group', },
refine mul_equiv.trans _ _,
- -- There is only one sylow group for each p, so the inner product is trivial
+ -- There is only one Sylow subgroup for each p, so the inner product is trivial
show (Π p : ps, Π P : sylow p G, P) ≃* (Π p : ps, P p),
{ -- here we need to help the elaborator with an explicit instantiation
apply @mul_equiv.Pi_congr_right ps (λ p, (Π P : sylow p G, P)) (λ p, P p) _ _ ,
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -660,7 +660,7 @@ theorem card_normalizer_modEq_card [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.
have : H.subgroupOf (normalizer H) ≃ H := (subgroupOfEquivOfLe le_normalizer).toEquiv
rw [card_eq_card_quotient_mul_card_subgroup H,
card_eq_card_quotient_mul_card_subgroup (H.subgroup_of (normalizer H)), Fintype.card_congr this,
- hH, pow_succ]
+ hH, pow_succ']
exact (card_quotient_normalizer_modeq_card_quotient hH).mul_right' _
#align sylow.card_normalizer_modeq_card Sylow.card_normalizer_modEq_card
-/
@@ -675,7 +675,7 @@ theorem prime_dvd_card_quotient_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp :
have hcard : card (G ⧸ H) = s * p :=
(mul_left_inj' (show card H ≠ 0 from Fintype.card_ne_zero)).1
(by
- rwa [← card_eq_card_quotient_mul_card_subgroup H, hH, hs, pow_succ', mul_assoc, mul_comm p])
+ rwa [← card_eq_card_quotient_mul_card_subgroup H, hH, hs, pow_succ, mul_assoc, mul_comm p])
have hm :
s * p % p =
card (normalizer H ⧸ Subgroup.comap ((normalizer H).Subtype : normalizer H →* G) H) % p :=
@@ -705,7 +705,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
have hcard : card (G ⧸ H) = s * p :=
(mul_left_inj' (show card H ≠ 0 from Fintype.card_ne_zero)).1
(by
- rwa [← card_eq_card_quotient_mul_card_subgroup H, hH, hs, pow_succ', mul_assoc, mul_comm p])
+ rwa [← card_eq_card_quotient_mul_card_subgroup H, hH, hs, pow_succ, mul_assoc, mul_comm p])
have hm : s * p % p = card (normalizer H ⧸ H.subgroupOf H.normalizer) % p :=
card_congr (fixedPointsMulLeftCosetsEquivQuotient H) ▸
hcard ▸ (IsPGroup.of_card hH).card_modEq_card_fixedPoints _
@@ -730,7 +730,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [Set.card_image_of_injective
(Subgroup.comap (mk' (H.subgroup_of H.normalizer)) (zpowers x) : Set H.normalizer)
Subtype.val_injective,
- pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, Fintype.card_zpowers, ← Fintype.card_prod]
+ pow_succ, ← hH, Fintype.card_congr hequiv, ← hx, Fintype.card_zpowers, ← Fintype.card_prod]
exact @Fintype.card_congr _ _ (id _) (id _) (preimage_mk_equiv_subgroup_times_set _ _),
by
intro y hy
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -458,10 +458,10 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite
rintro - ⟨z, hz, rfl⟩
specialize hy z hz
rwa [← mul_assoc, ← eq_mul_inv_iff_mul_eq, mul_assoc, mul_assoc, mul_assoc, ← mul_assoc,
- eq_inv_mul_iff_mul_eq, ← mul_assoc, ← mul_assoc] at hy
+ eq_inv_mul_iff_mul_eq, ← mul_assoc, ← mul_assoc] at hy
obtain ⟨h, hh⟩ :=
exists_smul_eq (centralizer (zpowers x : Set G)) ((g • P).Subtype h2) (P.subtype h1)
- simp_rw [Sylow.smul_subtype, smul_def, smul_smul] at hh
+ simp_rw [Sylow.smul_subtype, smul_def, smul_smul] at hh
refine' ⟨h * g, sylow.smul_eq_iff_mem_normalizer.mp (Sylow.subtype_injective hh), _⟩
rw [← mul_assoc, Commute.right_comm (h.prop x (mem_zpowers x)), mul_inv_rev, inv_mul_cancel_right]
#align sylow.conj_eq_normalizer_conj_of_mem_centralizer Sylow.conj_eq_normalizer_conj_of_mem_centralizer
@@ -520,7 +520,7 @@ theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup
by
intro h
haveI := (P : Subgroup G).fintypeQuotientOfFiniteIndex
- rw [index_eq_card] at h
+ rw [index_eq_card] at h
obtain ⟨x, hx⟩ := exists_prime_orderOf_dvd_card p h
have h := IsPGroup.of_card ((order_eq_card_zpowers.symm.trans hx).trans (pow_one p).symm)
let Q := (zpowers x).comap (QuotientGroup.mk' (P : Subgroup G))
@@ -531,7 +531,7 @@ theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup
replace hp := mt order_of_eq_one_iff.mpr (ne_of_eq_of_ne hx hp.1.ne_one)
rw [← zpowers_eq_bot, ← Ne, ← bot_lt_iff_ne_bot, ←
comap_lt_comap_of_surjective (QuotientGroup.mk'_surjective _), MonoidHom.comap_bot,
- QuotientGroup.ker_mk'] at hp
+ QuotientGroup.ker_mk'] at hp
exact hp.ne' (P.3 hQ hp.le)
#align not_dvd_index_sylow' not_dvd_index_sylow'
-/
@@ -561,7 +561,7 @@ theorem Sylow.normalizer_sup_eq_top {p : ℕ} [Fact p.Prime] {N : Subgroup G} [N
rw [← inv_mul_cancel_left (↑n) g, sup_comm]
apply mul_mem_sup (N.inv_mem n.2)
rw [Sylow.smul_def, ← mul_smul, ← MulAut.conjNormal_val, ← mul_aut.conj_normal.map_mul,
- Sylow.ext_iff, Sylow.pointwise_smul_def, pointwise_smul_def] at hn
+ Sylow.ext_iff, Sylow.pointwise_smul_def, pointwise_smul_def] at hn
refine' fun x =>
(mem_map_iff_mem
(show Function.Injective (MulAut.conj (↑n * g)).toMonoidHom from
@@ -613,7 +613,7 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
inv_mem_iff.1
(mem_normalizer_fintype fun n (hn : n ∈ H) =>
have : (n⁻¹ * x)⁻¹ * x ∈ H := QuotientGroup.eq.1 (ha (mem_orbit _ ⟨n⁻¹, H.inv_mem hn⟩))
- show _ ∈ H by rw [mul_inv_rev, inv_inv] at this ; convert this; rw [inv_inv]),
+ show _ ∈ H by rw [mul_inv_rev, inv_inv] at this; convert this; rw [inv_inv]),
fun hx : ∀ n : G, n ∈ H ↔ x * n * x⁻¹ ∈ H =>
(mem_fixedPoints' _).2 fun y =>
Quotient.inductionOn' y fun y hy =>
@@ -623,7 +623,7 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
inv_mem_iff.1 <|
(hx _).2 <|
(mul_mem_cancel_left (inv_mem hb₁)).1 <| by
- rw [hx] at hb₂ <;> simpa [mul_inv_rev, mul_assoc] using hb₂)⟩
+ rw [hx] at hb₂ <;> simpa [mul_inv_rev, mul_assoc] using hb₂)⟩
#align sylow.mem_fixed_points_mul_left_cosets_iff_mem_normalizer Sylow.mem_fixedPoints_mul_left_cosets_iff_mem_normalizer
-/
@@ -680,7 +680,7 @@ theorem prime_dvd_card_quotient_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp :
s * p % p =
card (normalizer H ⧸ Subgroup.comap ((normalizer H).Subtype : normalizer H →* G) H) % p :=
hcard ▸ (card_quotient_normalizer_modEq_card_quotient hH).symm
- Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm )
+ Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm)
#align sylow.prime_dvd_card_quotient_normalizer Sylow.prime_dvd_card_quotient_normalizer
-/
@@ -710,7 +710,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
card_congr (fixedPointsMulLeftCosetsEquivQuotient H) ▸
hcard ▸ (IsPGroup.of_card hH).card_modEq_card_fixedPoints _
have hm' : p ∣ card (normalizer H ⧸ H.subgroupOf H.normalizer) :=
- Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm )
+ Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm)
let ⟨x, hx⟩ := @exists_prime_orderOf_dvd_card _ (QuotientGroup.Quotient.group _) _ _ hp hm'
have hequiv : H ≃ H.subgroupOf H.normalizer := (subgroupOfEquivOfLe le_normalizer).symm.toEquiv
⟨Subgroup.map (normalizer H).Subtype
@@ -787,9 +787,9 @@ theorem pow_dvd_card_of_pow_dvd_card [Fintype G] {p n : ℕ} [hp : Fact p.Prime]
theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G)
(hdvd : p ∣ card G) : p ∣ card P :=
by
- rw [← pow_one p] at hdvd
+ rw [← pow_one p] at hdvd
have key := P.pow_dvd_card_of_pow_dvd_card hdvd
- rwa [pow_one] at key
+ rwa [pow_one] at key
#align sylow.dvd_card_of_dvd_card Sylow.dvd_card_of_dvd_card
-/
@@ -808,7 +808,7 @@ theorem ne_bot_of_dvd_card [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow
by
refine' fun h => hp.out.not_dvd_one _
have key : p ∣ card (P : Subgroup G) := P.dvd_card_of_dvd_card hdvd
- rwa [h, card_bot] at key
+ rwa [h, card_bot] at key
#align sylow.ne_bot_of_dvd_card Sylow.ne_bot_of_dvd_card
-/
@@ -858,7 +858,7 @@ theorem unique_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylo
intro Q R
obtain ⟨x, h1⟩ := exists_smul_eq G P Q
obtain ⟨x, h2⟩ := exists_smul_eq G P R
- rw [Sylow.smul_eq_of_normal] at h1 h2
+ rw [Sylow.smul_eq_of_normal] at h1 h2
rw [← h1, ← h2]
#align sylow.subsingleton_of_normal Sylow.unique_of_normal
-/
@@ -895,7 +895,7 @@ theorem normalizer_normalizer {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P :
by
have := normal_of_normalizer_normal (P.subtype (le_normalizer.trans le_normalizer))
simp_rw [← normalizer_eq_top, coeSubtype, ← subgroup_of_normalizer_eq le_normalizer, ←
- subgroup_of_normalizer_eq le_rfl, subgroup_of_self] at this
+ subgroup_of_normalizer_eq le_rfl, subgroup_of_self] at this
rw [← subtype_range (P : Subgroup G).normalizer.normalizer, MonoidHom.range_eq_map, ← this rfl]
exact map_comap_eq_self (le_normalizer.trans (ge_of_eq (subtype_range _)))
#align sylow.normalizer_normalizer Sylow.normalizer_normalizer
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -469,7 +469,7 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite
#print Sylow.conj_eq_normalizer_conj_of_mem /-
theorem Sylow.conj_eq_normalizer_conj_of_mem [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
- [hP : (P : Subgroup G).IsCommutativeₓ] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
+ [hP : (P : Subgroup G).Commutative] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
∃ n ∈ (P : Subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer (P : Subgroup G) hx : _)
(le_centralizer (P : Subgroup G) hy : _)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -469,7 +469,7 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite
#print Sylow.conj_eq_normalizer_conj_of_mem /-
theorem Sylow.conj_eq_normalizer_conj_of_mem [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
- [hP : (P : Subgroup G).IsCommutative] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
+ [hP : (P : Subgroup G).IsCommutativeₓ] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
∃ n ∈ (P : Subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer (P : Subgroup G) hx : _)
(le_centralizer (P : Subgroup G) hy : _)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -361,7 +361,27 @@ theorem IsPGroup.sylow_mem_fixedPoints_iff {P : Subgroup G} (hP : IsPGroup p P)
/-- A generalization of **Sylow's second theorem**.
If the number of Sylow `p`-subgroups is finite, then all Sylow `p`-subgroups are conjugate. -/
instance [hp : Fact p.Prime] [Finite (Sylow p G)] : IsPretransitive G (Sylow p G) :=
- ⟨fun P Q => by classical⟩
+ ⟨fun P Q => by
+ classical
+ cases nonempty_fintype (Sylow p G)
+ have H := fun {R : Sylow p G} {S : orbit G P} =>
+ calc
+ S ∈ fixed_points R (orbit G P) ↔ S.1 ∈ fixed_points R (Sylow p G) :=
+ forall_congr' fun a => Subtype.ext_iff
+ _ ↔ R.1 ≤ S := R.2.sylow_mem_fixedPoints_iff
+ _ ↔ S.1.1 = R := ⟨fun h => R.3 S.1.2 h, ge_of_eq⟩
+ suffices Set.Nonempty (fixed_points Q (orbit G P)) by
+ exact Exists.elim this fun R hR => (congr_arg _ (Sylow.ext (H.mp hR))).mp R.2
+ apply Q.2.nonempty_fixed_point_of_prime_not_dvd_card
+ refine' fun h => hp.out.not_dvd_one (nat.modeq_zero_iff_dvd.mp _)
+ calc
+ 1 = card (fixed_points P (orbit G P)) := _
+ _ ≡ card (orbit G P) [MOD p] := (P.2.card_modEq_card_fixedPoints (orbit G P)).symm
+ _ ≡ 0 [MOD p] := nat.modeq_zero_iff_dvd.mpr h
+ rw [← Set.card_singleton (⟨P, mem_orbit_self P⟩ : orbit G P)]
+ refine' card_congr' (congr_arg _ (Eq.symm _))
+ rw [Set.eq_singleton_iff_unique_mem]
+ exact ⟨H.mpr rfl, fun R h => Subtype.ext (Sylow.ext (H.mp h))⟩⟩
variable (p) (G)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -361,27 +361,7 @@ theorem IsPGroup.sylow_mem_fixedPoints_iff {P : Subgroup G} (hP : IsPGroup p P)
/-- A generalization of **Sylow's second theorem**.
If the number of Sylow `p`-subgroups is finite, then all Sylow `p`-subgroups are conjugate. -/
instance [hp : Fact p.Prime] [Finite (Sylow p G)] : IsPretransitive G (Sylow p G) :=
- ⟨fun P Q => by
- classical
- cases nonempty_fintype (Sylow p G)
- have H := fun {R : Sylow p G} {S : orbit G P} =>
- calc
- S ∈ fixed_points R (orbit G P) ↔ S.1 ∈ fixed_points R (Sylow p G) :=
- forall_congr' fun a => Subtype.ext_iff
- _ ↔ R.1 ≤ S := R.2.sylow_mem_fixedPoints_iff
- _ ↔ S.1.1 = R := ⟨fun h => R.3 S.1.2 h, ge_of_eq⟩
- suffices Set.Nonempty (fixed_points Q (orbit G P)) by
- exact Exists.elim this fun R hR => (congr_arg _ (Sylow.ext (H.mp hR))).mp R.2
- apply Q.2.nonempty_fixed_point_of_prime_not_dvd_card
- refine' fun h => hp.out.not_dvd_one (nat.modeq_zero_iff_dvd.mp _)
- calc
- 1 = card (fixed_points P (orbit G P)) := _
- _ ≡ card (orbit G P) [MOD p] := (P.2.card_modEq_card_fixedPoints (orbit G P)).symm
- _ ≡ 0 [MOD p] := nat.modeq_zero_iff_dvd.mpr h
- rw [← Set.card_singleton (⟨P, mem_orbit_self P⟩ : orbit G P)]
- refine' card_congr' (congr_arg _ (Eq.symm _))
- rw [Set.eq_singleton_iff_unique_mem]
- exact ⟨H.mpr rfl, fun R h => Subtype.ext (Sylow.ext (H.mp h))⟩⟩
+ ⟨fun P Q => by classical⟩
variable (p) (G)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -730,8 +730,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [Set.card_image_of_injective
(Subgroup.comap (mk' (H.subgroup_of H.normalizer)) (zpowers x) : Set H.normalizer)
Subtype.val_injective,
- pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, orderOf_eq_card_zpowers, ←
- Fintype.card_prod]
+ pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, Fintype.card_zpowers, ← Fintype.card_prod]
exact @Fintype.card_congr _ _ (id _) (id _) (preimage_mk_equiv_subgroup_times_set _ _),
by
intro y hy
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -851,8 +851,8 @@ theorem coe_ofCard [Fintype G] {p : ℕ} [hp : Fact p.Prime] (H : Subgroup G) [F
#align sylow.coe_of_card Sylow.coe_ofCard
-/
-#print Sylow.subsingleton_of_normal /-
-theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
+#print Sylow.unique_of_normal /-
+theorem unique_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : Subsingleton (Sylow p G) :=
by
apply Subsingleton.intro
@@ -861,7 +861,7 @@ theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P
obtain ⟨x, h2⟩ := exists_smul_eq G P R
rw [Sylow.smul_eq_of_normal] at h1 h2
rw [← h1, ← h2]
-#align sylow.subsingleton_of_normal Sylow.subsingleton_of_normal
+#align sylow.subsingleton_of_normal Sylow.unique_of_normal
-/
section Pointwise
@@ -872,7 +872,7 @@ open scoped Pointwise
theorem characteristic_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : (P : Subgroup G).Characteristic :=
by
- haveI := Sylow.subsingleton_of_normal P h
+ haveI := Sylow.unique_of_normal P h
rw [characteristic_iff_map_eq]
intro Φ
show (Φ • P).toSubgroup = P.to_subgroup
@@ -941,8 +941,8 @@ noncomputable def directProductOfNormal [Fintype G]
have hcomm : Pairwise fun p₁ p₂ : ps => ∀ x y : G, x ∈ P p₁ → y ∈ P p₂ → Commute x y :=
by
rintro ⟨p₁, hp₁⟩ ⟨p₂, hp₂⟩ hne
- haveI hp₁' := Fact.mk (Nat.prime_of_mem_factorization hp₁)
- haveI hp₂' := Fact.mk (Nat.prime_of_mem_factorization hp₂)
+ haveI hp₁' := Fact.mk (Nat.prime_of_mem_primeFactors hp₁)
+ haveI hp₂' := Fact.mk (Nat.prime_of_mem_primeFactors hp₂)
have hne' : p₁ ≠ p₂ := by simpa using hne
apply Subgroup.commute_of_normal_of_disjoint _ _ (hn (P p₁)) (hn (P p₂))
apply IsPGroup.disjoint_of_ne p₁ p₂ hne' _ _ (P p₁).is_p_group' (P p₂).is_p_group'
@@ -952,10 +952,10 @@ noncomputable def directProductOfNormal [Fintype G]
· -- here we need to help the elaborator with an explicit instantiation
apply @MulEquiv.piCongrRight ps (fun p => ∀ P : Sylow p G, P) (fun p => P p) _ _
rintro ⟨p, hp⟩
- haveI hp' := Fact.mk (Nat.prime_of_mem_factorization hp)
+ haveI hp' := Fact.mk (Nat.prime_of_mem_primeFactors hp)
haveI := subsingleton_of_normal _ (hn (P p))
change (∀ P : Sylow p G, P) ≃* P p
- exact MulEquiv.piSubsingleton _ _
+ exact MulEquiv.piUnique _ _
show (∀ p : ps, P p) ≃* G
apply MulEquiv.ofBijective (Subgroup.noncommPiCoprod hcomm)
apply (bijective_iff_injective_and_card _).mpr
@@ -964,8 +964,8 @@ noncomputable def directProductOfNormal [Fintype G]
· apply Subgroup.injective_noncommPiCoprod_of_independent
apply independent_of_coprime_order hcomm
rintro ⟨p₁, hp₁⟩ ⟨p₂, hp₂⟩ hne
- haveI hp₁' := Fact.mk (Nat.prime_of_mem_factorization hp₁)
- haveI hp₂' := Fact.mk (Nat.prime_of_mem_factorization hp₂)
+ haveI hp₁' := Fact.mk (Nat.prime_of_mem_primeFactors hp₁)
+ haveI hp₂' := Fact.mk (Nat.prime_of_mem_primeFactors hp₂)
have hne' : p₁ ≠ p₂ := by simpa using hne
apply IsPGroup.coprime_card_of_ne p₁ p₂ hne' _ _ (P p₁).is_p_group' (P p₂).is_p_group'
show card (∀ p : ps, P p) = card G
@@ -975,7 +975,7 @@ noncomputable def directProductOfNormal [Fintype G]
_ = ∏ p : ps, p.1 ^ (card G).factorization p.1 :=
by
congr 1 with ⟨p, hp⟩
- exact @card_eq_multiplicity _ _ _ p ⟨Nat.prime_of_mem_factorization hp⟩ (P p)
+ exact @card_eq_multiplicity _ _ _ p ⟨Nat.prime_of_mem_primeFactors hp⟩ (P p)
_ = ∏ p in ps, p ^ (card G).factorization p :=
(Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _)
_ = (card G).factorization.Prod pow := rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,12 +3,12 @@ Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
-/
-import Mathbin.Data.Nat.Factorization.Basic
-import Mathbin.Data.SetLike.Fintype
-import Mathbin.GroupTheory.GroupAction.ConjAct
-import Mathbin.GroupTheory.PGroup
-import Mathbin.GroupTheory.NoncommPiCoprod
-import Mathbin.Order.Atoms.Finite
+import Data.Nat.Factorization.Basic
+import Data.SetLike.Fintype
+import GroupTheory.GroupAction.ConjAct
+import GroupTheory.PGroup
+import GroupTheory.NoncommPiCoprod
+import Order.Atoms.Finite
#align_import group_theory.sylow from "leanprover-community/mathlib"@"4be589053caf347b899a494da75410deb55fb3ef"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -797,7 +797,7 @@ theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G
#print Sylow.card_coprime_index /-
/-- Sylow subgroups are Hall subgroups. -/
theorem card_coprime_index [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
- (card P).coprime (index (P : Subgroup G)) :=
+ (card P).Coprime (index (P : Subgroup G)) :=
let ⟨n, hn⟩ := IsPGroup.iff_card.mp P.2
hn.symm ▸ (hp.1.coprime_pow_of_not_dvd (not_dvd_index_sylow P index_ne_zero_of_finite)).symm
#align sylow.card_coprime_index Sylow.card_coprime_index
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -90,7 +90,7 @@ instance : SetLike (Sylow p G) G where
instance : SubgroupClass (Sylow p G) G
where
- mul_mem s _ _ := s.mul_mem'
+ hMul_mem s _ _ := s.hMul_mem'
one_mem s := s.one_mem'
inv_mem s _ := s.inv_mem'
@@ -175,9 +175,9 @@ theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q :
⟨{ carrier := ⋃ R : c, R
one_mem' := ⟨Q, ⟨⟨Q, hQ⟩, rfl⟩, Q.one_mem⟩
inv_mem' := fun g ⟨_, ⟨R, rfl⟩, hg⟩ => ⟨R, ⟨R, rfl⟩, R.1.inv_mem hg⟩
- mul_mem' := fun g h ⟨_, ⟨R, rfl⟩, hg⟩ ⟨_, ⟨S, rfl⟩, hh⟩ =>
- (hc2.Total R.2 S.2).elim (fun T => ⟨S, ⟨S, rfl⟩, S.1.mul_mem (T hg) hh⟩) fun T =>
- ⟨R, ⟨R, rfl⟩, R.1.mul_mem hg (T hh)⟩ },
+ hMul_mem' := fun g h ⟨_, ⟨R, rfl⟩, hg⟩ ⟨_, ⟨S, rfl⟩, hh⟩ =>
+ (hc2.Total R.2 S.2).elim (fun T => ⟨S, ⟨S, rfl⟩, S.1.hMul_mem (T hg) hh⟩) fun T =>
+ ⟨R, ⟨R, rfl⟩, R.1.hMul_mem hg (T hh)⟩ },
fun ⟨g, _, ⟨S, rfl⟩, hg⟩ =>
by
refine' Exists.imp (fun k hk => _) (hc1 S.2 ⟨g, hg⟩)
@@ -263,7 +263,7 @@ instance Sylow.pointwiseMulAction {α : Type _} [Group α] [MulDistribMulAction
(congr_arg (· ∈ g⁻¹ • Q) (inv_smul_smul g s)).mp
(smul_mem_pointwise_smul (g • s) g⁻¹ Q (hS (smul_mem_pointwise_smul s g P hs))))⟩
one_smul P := Sylow.ext (one_smul α P)
- mul_smul g h P := Sylow.ext (mul_smul g h P)
+ hMul_smul g h P := Sylow.ext (hMul_smul g h P)
#align sylow.pointwise_mul_action Sylow.pointwiseMulAction
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/c0c52abb75074ed8b73a948341f50521fbf43b4c
@@ -10,7 +10,7 @@ import Mathbin.GroupTheory.PGroup
import Mathbin.GroupTheory.NoncommPiCoprod
import Mathbin.Order.Atoms.Finite
-#align_import group_theory.sylow from "leanprover-community/mathlib"@"bd365b1a4901dbd878e86cb146c2bd86533df468"
+#align_import group_theory.sylow from "leanprover-community/mathlib"@"4be589053caf347b899a494da75410deb55fb3ef"
/-!
# Sylow theorems
@@ -447,19 +447,20 @@ theorem Sylow.stabilizer_eq_normalizer (P : Sylow p G) :
#print Sylow.conj_eq_normalizer_conj_of_mem_centralizer /-
theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite (Sylow p G)]
- (P : Sylow p G) (x g : G) (hx : x ∈ (P : Subgroup G).centralizer)
- (hy : g⁻¹ * x * g ∈ (P : Subgroup G).centralizer) :
+ (P : Sylow p G) (x g : G) (hx : x ∈ centralizer (P : Set G))
+ (hy : g⁻¹ * x * g ∈ centralizer (P : Set G)) :
∃ n ∈ (P : Subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
by
- have h1 : ↑P ≤ (zpowers x).centralizer := by rwa [le_centralizer_iff, zpowers_le]
- have h2 : ↑(g • P) ≤ (zpowers x).centralizer :=
+ have h1 : ↑P ≤ centralizer (zpowers x : Set G) := by rwa [le_centralizer_iff, zpowers_le]
+ have h2 : ↑(g • P) ≤ centralizer (zpowers x : Set G) :=
by
rw [le_centralizer_iff, zpowers_le]
rintro - ⟨z, hz, rfl⟩
specialize hy z hz
rwa [← mul_assoc, ← eq_mul_inv_iff_mul_eq, mul_assoc, mul_assoc, mul_assoc, ← mul_assoc,
eq_inv_mul_iff_mul_eq, ← mul_assoc, ← mul_assoc] at hy
- obtain ⟨h, hh⟩ := exists_smul_eq (zpowers x).centralizer ((g • P).Subtype h2) (P.subtype h1)
+ obtain ⟨h, hh⟩ :=
+ exists_smul_eq (centralizer (zpowers x : Set G)) ((g • P).Subtype h2) (P.subtype h1)
simp_rw [Sylow.smul_subtype, smul_def, smul_smul] at hh
refine' ⟨h * g, sylow.smul_eq_iff_mem_normalizer.mp (Sylow.subtype_injective hh), _⟩
rw [← mul_assoc, Commute.right_comm (h.prop x (mem_zpowers x)), mul_inv_rev, inv_mul_cancel_right]
@@ -470,7 +471,8 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite
theorem Sylow.conj_eq_normalizer_conj_of_mem [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
[hP : (P : Subgroup G).IsCommutative] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
∃ n ∈ (P : Subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
- P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer P hx) (le_centralizer P hy)
+ P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer (P : Subgroup G) hx : _)
+ (le_centralizer (P : Subgroup G) hy : _)
#align sylow.conj_eq_normalizer_conj_of_mem Sylow.conj_eq_normalizer_conj_of_mem
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
-
-! This file was ported from Lean 3 source module group_theory.sylow
-! leanprover-community/mathlib commit bd365b1a4901dbd878e86cb146c2bd86533df468
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Data.Nat.Factorization.Basic
import Mathbin.Data.SetLike.Fintype
@@ -15,6 +10,8 @@ import Mathbin.GroupTheory.PGroup
import Mathbin.GroupTheory.NoncommPiCoprod
import Mathbin.Order.Atoms.Finite
+#align_import group_theory.sylow from "leanprover-community/mathlib"@"bd365b1a4901dbd878e86cb146c2bd86533df468"
+
/-!
# Sylow theorems
mathlib commit https://github.com/leanprover-community/mathlib/commit/2fe465deb81bcd7ccafa065bb686888a82f15372
@@ -827,6 +827,7 @@ theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylo
#align sylow.card_eq_multiplicity Sylow.card_eq_multiplicity
-/
+#print Sylow.ofCard /-
/-- A subgroup with cardinality `p ^ n` is a Sylow subgroup
where `n` is the multiplicity of `p` in the group order. -/
def ofCard [Fintype G] {p : ℕ} [hp : Fact p.Prime] (H : Subgroup G) [Fintype H]
@@ -841,12 +842,15 @@ def ofCard [Fintype G] {p : ℕ} [hp : Fact p.Prime] (H : Subgroup G) [Fintype H
(Set.eq_of_subset_of_card_le hHP (P.card_eq_multiplicity.trans card_eq.symm).le).symm ▸
fun _ => P.3
#align sylow.of_card Sylow.ofCard
+-/
+#print Sylow.coe_ofCard /-
@[simp, norm_cast]
theorem coe_ofCard [Fintype G] {p : ℕ} [hp : Fact p.Prime] (H : Subgroup G) [Fintype H]
(card_eq : card H = p ^ (card G).factorization p) : ↑(ofCard H card_eq) = H :=
rfl
#align sylow.coe_of_card Sylow.coe_ofCard
+-/
#print Sylow.subsingleton_of_normal /-
theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
mathlib commit https://github.com/leanprover-community/mathlib/commit/4e24c4bfcff371c71f7ba22050308aa17815626c
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
! This file was ported from Lean 3 source module group_theory.sylow
-! leanprover-community/mathlib commit f60c6087a7275b72d5db3c5a1d0e19e35a429c0a
+! leanprover-community/mathlib commit bd365b1a4901dbd878e86cb146c2bd86533df468
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -40,7 +40,7 @@ The Sylow theorems are the following results for every finite group `G` and ever
there exists a subgroup of `G` of order `pⁿ`.
* `is_p_group.exists_le_sylow`: A generalization of Sylow's first theorem:
Every `p`-subgroup is contained in a Sylow `p`-subgroup.
-* `sylow.card_eq_multiplicity`: The cardinality of a Sylow group is `p ^ n`
+* `sylow.card_eq_multiplicity`: The cardinality of a Sylow subgroup is `p ^ n`
where `n` is the multiplicity of `p` in the group order.
* `sylow_conjugate`: A generalization of Sylow's second theorem:
If the number of Sylow `p`-subgroups is finite, then all Sylow `p`-subgroups are conjugate.
@@ -815,7 +815,7 @@ theorem ne_bot_of_dvd_card [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow
-/
#print Sylow.card_eq_multiplicity /-
-/-- The cardinality of a Sylow group is `p ^ n`
+/-- The cardinality of a Sylow subgroup is `p ^ n`
where `n` is the multiplicity of `p` in the group order. -/
theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
card P = p ^ Nat.factorization (card G) p :=
@@ -827,6 +827,27 @@ theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylo
#align sylow.card_eq_multiplicity Sylow.card_eq_multiplicity
-/
+/-- A subgroup with cardinality `p ^ n` is a Sylow subgroup
+ where `n` is the multiplicity of `p` in the group order. -/
+def ofCard [Fintype G] {p : ℕ} [hp : Fact p.Prime] (H : Subgroup G) [Fintype H]
+ (card_eq : card H = p ^ (card G).factorization p) : Sylow p G
+ where
+ toSubgroup := H
+ is_p_group' := IsPGroup.of_card card_eq
+ is_maximal' := by
+ obtain ⟨P, hHP⟩ := (IsPGroup.of_card card_eq).exists_le_sylow
+ exact
+ SetLike.ext'
+ (Set.eq_of_subset_of_card_le hHP (P.card_eq_multiplicity.trans card_eq.symm).le).symm ▸
+ fun _ => P.3
+#align sylow.of_card Sylow.ofCard
+
+@[simp, norm_cast]
+theorem coe_ofCard [Fintype G] {p : ℕ} [hp : Fact p.Prime] (H : Subgroup G) [Fintype H]
+ (card_eq : card H = p ^ (card G).factorization p) : ↑(ofCard H card_eq) = H :=
+ rfl
+#align sylow.coe_of_card Sylow.coe_ofCard
+
#print Sylow.subsingleton_of_normal /-
theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : Subsingleton (Sylow p G) :=
@@ -904,15 +925,15 @@ theorem normal_of_normalizerCondition (hnc : NormalizerCondition G) {p : ℕ} [F
open scoped BigOperators
#print Sylow.directProductOfNormal /-
-/-- If all its sylow groups are normal, then a finite group is isomorphic to the direct product
-of these sylow groups.
+/-- If all its Sylow subgroups are normal, then a finite group is isomorphic to the direct product
+of these Sylow subgroups.
-/
noncomputable def directProductOfNormal [Fintype G]
(hn : ∀ {p : ℕ} [Fact p.Prime] (P : Sylow p G), (↑P : Subgroup G).Normal) :
(∀ p : (card G).factorization.support, ∀ P : Sylow p G, (↑P : Subgroup G)) ≃* G :=
by
set ps := (Fintype.card G).factorization.support
- -- “The” sylow group for p
+ -- “The” Sylow subgroup for p
let P : ∀ p, Sylow p G := default
have hcomm : Pairwise fun p₁ p₂ : ps => ∀ x y : G, x ∈ P p₁ → y ∈ P p₂ → Commute x y :=
by
@@ -923,7 +944,7 @@ noncomputable def directProductOfNormal [Fintype G]
apply Subgroup.commute_of_normal_of_disjoint _ _ (hn (P p₁)) (hn (P p₂))
apply IsPGroup.disjoint_of_ne p₁ p₂ hne' _ _ (P p₁).is_p_group' (P p₂).is_p_group'
refine' MulEquiv.trans _ _
- -- There is only one sylow group for each p, so the inner product is trivial
+ -- There is only one Sylow subgroup for each p, so the inner product is trivial
show (∀ p : ps, ∀ P : Sylow p G, P) ≃* ∀ p : ps, P p
· -- here we need to help the elaborator with an explicit instantiation
apply @MulEquiv.piCongrRight ps (fun p => ∀ P : Sylow p G, P) (fun p => P p) _ _
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -99,13 +99,16 @@ instance : SubgroupClass (Sylow p G) G
variable (P : Sylow p G)
+#print Sylow.mulActionLeft /-
/-- The action by a Sylow subgroup is the action by the underlying group. -/
instance mulActionLeft {α : Type _} [MulAction G α] : MulAction P α :=
Subgroup.mulAction ↑P
#align sylow.mul_action_left Sylow.mulActionLeft
+-/
variable {K : Type _} [Group K] (ϕ : K →* G) {N : Subgroup G}
+#print Sylow.comapOfKerIsPGroup /-
/-- The preimage of a Sylow subgroup under a p-group-kernel homomorphism is a Sylow subgroup. -/
def comapOfKerIsPGroup (hϕ : IsPGroup p ϕ.ker) (h : ↑P ≤ ϕ.range) : Sylow p K :=
{ P.1.comap ϕ with
@@ -115,43 +118,57 @@ def comapOfKerIsPGroup (hϕ : IsPGroup p ϕ.ker) (h : ↑P ≤ ϕ.range) : Sylow
rw [← P.3 (hQ.map ϕ) (le_trans (ge_of_eq (map_comap_eq_self h)) (map_mono hle))]
exact (comap_map_eq_self ((P.1.ker_le_comap ϕ).trans hle)).symm }
#align sylow.comap_of_ker_is_p_group Sylow.comapOfKerIsPGroup
+-/
+#print Sylow.coe_comapOfKerIsPGroup /-
@[simp]
theorem coe_comapOfKerIsPGroup (hϕ : IsPGroup p ϕ.ker) (h : ↑P ≤ ϕ.range) :
↑(P.comap_of_ker_isPGroup ϕ hϕ h) = Subgroup.comap ϕ ↑P :=
rfl
#align sylow.coe_comap_of_ker_is_p_group Sylow.coe_comapOfKerIsPGroup
+-/
+#print Sylow.comapOfInjective /-
/-- The preimage of a Sylow subgroup under an injective homomorphism is a Sylow subgroup. -/
def comapOfInjective (hϕ : Function.Injective ϕ) (h : ↑P ≤ ϕ.range) : Sylow p K :=
P.comap_of_ker_isPGroup ϕ (IsPGroup.ker_isPGroup_of_injective hϕ) h
#align sylow.comap_of_injective Sylow.comapOfInjective
+-/
+#print Sylow.coe_comapOfInjective /-
@[simp]
theorem coe_comapOfInjective (hϕ : Function.Injective ϕ) (h : ↑P ≤ ϕ.range) :
↑(P.comap_of_injective ϕ hϕ h) = Subgroup.comap ϕ ↑P :=
rfl
#align sylow.coe_comap_of_injective Sylow.coe_comapOfInjective
+-/
+#print Sylow.subtype /-
/-- A sylow subgroup of G is also a sylow subgroup of a subgroup of G. -/
protected def subtype (h : ↑P ≤ N) : Sylow p N :=
P.comap_of_injective N.Subtype Subtype.coe_injective (by rwa [subtype_range])
#align sylow.subtype Sylow.subtype
+-/
+#print Sylow.coe_subtype /-
@[simp]
theorem coe_subtype (h : ↑P ≤ N) : ↑(P.Subtype h) = subgroupOf (↑P) N :=
rfl
#align sylow.coe_subtype Sylow.coe_subtype
+-/
+#print Sylow.subtype_injective /-
theorem subtype_injective {P Q : Sylow p G} {hP : ↑P ≤ N} {hQ : ↑Q ≤ N}
(h : P.Subtype hP = Q.Subtype hQ) : P = Q :=
by
rw [SetLike.ext_iff] at h ⊢
exact fun g => ⟨fun hg => (h ⟨g, hP hg⟩).mp hg, fun hg => (h ⟨g, hQ hg⟩).mpr hg⟩
#align sylow.subtype_injective Sylow.subtype_injective
+-/
end Sylow
+#print IsPGroup.exists_le_sylow /-
/-- A generalization of **Sylow's first theorem**.
Every `p`-subgroup is contained in a Sylow `p`-subgroup. -/
theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q : Sylow p G, P ≤ Q :=
@@ -171,6 +188,7 @@ theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q :
P hP)
fun Q ⟨hQ1, hQ2, hQ3⟩ => ⟨⟨Q, hQ1, hQ3⟩, hQ2⟩
#align is_p_group.exists_le_sylow IsPGroup.exists_le_sylow
+-/
#print Sylow.nonempty /-
instance Sylow.nonempty : Nonempty (Sylow p G) :=
@@ -184,22 +202,29 @@ noncomputable instance Sylow.inhabited : Inhabited (Sylow p G) :=
#align sylow.inhabited Sylow.inhabited
-/
+#print Sylow.exists_comap_eq_of_ker_isPGroup /-
theorem Sylow.exists_comap_eq_of_ker_isPGroup {H : Type _} [Group H] (P : Sylow p H) {f : H →* G}
(hf : IsPGroup p f.ker) : ∃ Q : Sylow p G, (Q : Subgroup G).comap f = P :=
Exists.imp (fun Q hQ => P.3 (Q.2.comap_of_ker_isPGroup f hf) (map_le_iff_le_comap.mp hQ))
(P.2.map f).exists_le_sylow
#align sylow.exists_comap_eq_of_ker_is_p_group Sylow.exists_comap_eq_of_ker_isPGroup
+-/
+#print Sylow.exists_comap_eq_of_injective /-
theorem Sylow.exists_comap_eq_of_injective {H : Type _} [Group H] (P : Sylow p H) {f : H →* G}
(hf : Function.Injective f) : ∃ Q : Sylow p G, (Q : Subgroup G).comap f = P :=
P.exists_comap_eq_of_ker_isPGroup (IsPGroup.ker_isPGroup_of_injective hf)
#align sylow.exists_comap_eq_of_injective Sylow.exists_comap_eq_of_injective
+-/
+#print Sylow.exists_comap_subtype_eq /-
theorem Sylow.exists_comap_subtype_eq {H : Subgroup G} (P : Sylow p H) :
∃ Q : Sylow p G, (Q : Subgroup G).comap H.Subtype = P :=
P.exists_comap_eq_of_injective Subtype.coe_injective
#align sylow.exists_comap_subtype_eq Sylow.exists_comap_subtype_eq
+-/
+#print Sylow.fintypeOfKerIsPGroup /-
/-- If the kernel of `f : H →* G` is a `p`-group,
then `fintype (sylow p G)` implies `fintype (sylow p H)`. -/
noncomputable def Sylow.fintypeOfKerIsPGroup {H : Type _} [Group H] {f : H →* G}
@@ -209,12 +234,15 @@ noncomputable def Sylow.fintypeOfKerIsPGroup {H : Type _} [Group H] {f : H →*
let hg : ∀ P : Sylow p H, (g P).1.comap f = P := fun P => Classical.choose_spec (h_exists P)
Fintype.ofInjective g fun P Q h => Sylow.ext (by simp only [← hg, h])
#align sylow.fintype_of_ker_is_p_group Sylow.fintypeOfKerIsPGroup
+-/
+#print Sylow.fintypeOfInjective /-
/-- If `f : H →* G` is injective, then `fintype (sylow p G)` implies `fintype (sylow p H)`. -/
noncomputable def Sylow.fintypeOfInjective {H : Type _} [Group H] {f : H →* G}
(hf : Function.Injective f) [Fintype (Sylow p G)] : Fintype (Sylow p H) :=
Sylow.fintypeOfKerIsPGroup (IsPGroup.ker_isPGroup_of_injective hf)
#align sylow.fintype_of_injective Sylow.fintypeOfInjective
+-/
/-- If `H` is a subgroup of `G`, then `fintype (sylow p G)` implies `fintype (sylow p H)`. -/
noncomputable instance (H : Subgroup G) [Fintype (Sylow p G)] : Fintype (Sylow p H) :=
@@ -255,28 +283,39 @@ instance Sylow.mulAction : MulAction G (Sylow p G) :=
#align sylow.mul_action Sylow.mulAction
-/
+#print Sylow.smul_def /-
theorem Sylow.smul_def {g : G} {P : Sylow p G} : g • P = MulAut.conj g • P :=
rfl
#align sylow.smul_def Sylow.smul_def
+-/
+#print Sylow.coe_subgroup_smul /-
theorem Sylow.coe_subgroup_smul {g : G} {P : Sylow p G} :
↑(g • P) = MulAut.conj g • (P : Subgroup G) :=
rfl
#align sylow.coe_subgroup_smul Sylow.coe_subgroup_smul
+-/
+#print Sylow.coe_smul /-
theorem Sylow.coe_smul {g : G} {P : Sylow p G} : ↑(g • P) = MulAut.conj g • (P : Set G) :=
rfl
#align sylow.coe_smul Sylow.coe_smul
+-/
+#print Sylow.smul_le /-
theorem Sylow.smul_le {P : Sylow p G} {H : Subgroup G} (hP : ↑P ≤ H) (h : H) : ↑(h • P) ≤ H :=
Subgroup.conj_smul_le_of_le hP h
#align sylow.smul_le Sylow.smul_le
+-/
+#print Sylow.smul_subtype /-
theorem Sylow.smul_subtype {P : Sylow p G} {H : Subgroup G} (hP : ↑P ≤ H) (h : H) :
h • P.Subtype hP = (h • P).Subtype (Sylow.smul_le hP h) :=
Sylow.ext (Subgroup.conj_smul_subgroupOf hP h)
#align sylow.smul_subtype Sylow.smul_subtype
+-/
+#print Sylow.smul_eq_iff_mem_normalizer /-
theorem Sylow.smul_eq_iff_mem_normalizer {g : G} {P : Sylow p G} :
g • P = P ↔ g ∈ (P : Subgroup G).normalizer :=
by
@@ -289,6 +328,7 @@ theorem Sylow.smul_eq_iff_mem_normalizer {g : G} {P : Sylow p G} :
((congr_arg (· ∈ P.1) (MulAut.inv_apply_self G (MulAut.conj g) a)).mpr b),
fun hh => ⟨(MulAut.conj g)⁻¹ h, hh, MulAut.apply_inv_self G (MulAut.conj g) h⟩⟩
#align sylow.smul_eq_iff_mem_normalizer Sylow.smul_eq_iff_mem_normalizer
+-/
#print Sylow.smul_eq_of_normal /-
theorem Sylow.smul_eq_of_normal {g : G} {P : Sylow p G} [h : (P : Subgroup G).Normal] : g • P = P :=
@@ -296,11 +336,14 @@ theorem Sylow.smul_eq_of_normal {g : G} {P : Sylow p G} [h : (P : Subgroup G).No
#align sylow.smul_eq_of_normal Sylow.smul_eq_of_normal
-/
+#print Subgroup.sylow_mem_fixedPoints_iff /-
theorem Subgroup.sylow_mem_fixedPoints_iff (H : Subgroup G) {P : Sylow p G} :
P ∈ fixedPoints H (Sylow p G) ↔ H ≤ (P : Subgroup G).normalizer := by
simp_rw [SetLike.le_def, ← Sylow.smul_eq_iff_mem_normalizer] <;> exact Subtype.forall
#align subgroup.sylow_mem_fixed_points_iff Subgroup.sylow_mem_fixedPoints_iff
+-/
+#print IsPGroup.inf_normalizer_sylow /-
theorem IsPGroup.inf_normalizer_sylow {P : Subgroup G} (hP : IsPGroup p P) (Q : Sylow p G) :
P ⊓ (Q : Subgroup G).normalizer = P ⊓ Q :=
le_antisymm
@@ -309,11 +352,14 @@ theorem IsPGroup.inf_normalizer_sylow {P : Subgroup G} (hP : IsPGroup p P) (Q :
(Q.3 (hP.to_inf_left.to_sup_of_normal_right' Q.2 inf_le_right) le_sup_right)))
(inf_le_inf_left P le_normalizer)
#align is_p_group.inf_normalizer_sylow IsPGroup.inf_normalizer_sylow
+-/
+#print IsPGroup.sylow_mem_fixedPoints_iff /-
theorem IsPGroup.sylow_mem_fixedPoints_iff {P : Subgroup G} (hP : IsPGroup p P) {Q : Sylow p G} :
Q ∈ fixedPoints P (Sylow p G) ↔ P ≤ Q := by
rw [P.sylow_mem_fixed_points_iff, ← inf_eq_left, hP.inf_normalizer_sylow, inf_eq_left]
#align is_p_group.sylow_mem_fixed_points_iff IsPGroup.sylow_mem_fixedPoints_iff
+-/
/-- A generalization of **Sylow's second theorem**.
If the number of Sylow `p`-subgroups is finite, then all Sylow `p`-subgroups are conjugate. -/
@@ -372,22 +418,28 @@ theorem not_dvd_card_sylow [hp : Fact p.Prime] [Fintype (Sylow p G)] : ¬p ∣ c
variable {p} {G}
+#print Sylow.equivSMul /-
/-- Sylow subgroups are isomorphic -/
def Sylow.equivSMul (P : Sylow p G) (g : G) : P ≃* (g • P : Sylow p G) :=
equivSMul (MulAut.conj g) ↑P
#align sylow.equiv_smul Sylow.equivSMul
+-/
+#print Sylow.equiv /-
/-- Sylow subgroups are isomorphic -/
noncomputable def Sylow.equiv [Fact p.Prime] [Finite (Sylow p G)] (P Q : Sylow p G) : P ≃* Q :=
by
rw [← Classical.choose_spec (exists_smul_eq G P Q)]
exact P.equiv_smul (Classical.choose (exists_smul_eq G P Q))
#align sylow.equiv Sylow.equiv
+-/
+#print Sylow.orbit_eq_top /-
@[simp]
theorem Sylow.orbit_eq_top [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G) : orbit G P = ⊤ :=
top_le_iff.mp fun Q hQ => exists_smul_eq G P Q
#align sylow.orbit_eq_top Sylow.orbit_eq_top
+-/
#print Sylow.stabilizer_eq_normalizer /-
theorem Sylow.stabilizer_eq_normalizer (P : Sylow p G) :
@@ -396,6 +448,7 @@ theorem Sylow.stabilizer_eq_normalizer (P : Sylow p G) :
#align sylow.stabilizer_eq_normalizer Sylow.stabilizer_eq_normalizer
-/
+#print Sylow.conj_eq_normalizer_conj_of_mem_centralizer /-
theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite (Sylow p G)]
(P : Sylow p G) (x g : G) (hx : x ∈ (P : Subgroup G).centralizer)
(hy : g⁻¹ * x * g ∈ (P : Subgroup G).centralizer) :
@@ -414,12 +467,15 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite
refine' ⟨h * g, sylow.smul_eq_iff_mem_normalizer.mp (Sylow.subtype_injective hh), _⟩
rw [← mul_assoc, Commute.right_comm (h.prop x (mem_zpowers x)), mul_inv_rev, inv_mul_cancel_right]
#align sylow.conj_eq_normalizer_conj_of_mem_centralizer Sylow.conj_eq_normalizer_conj_of_mem_centralizer
+-/
+#print Sylow.conj_eq_normalizer_conj_of_mem /-
theorem Sylow.conj_eq_normalizer_conj_of_mem [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
[hP : (P : Subgroup G).IsCommutative] (x g : G) (hx : x ∈ P) (hy : g⁻¹ * x * g ∈ P) :
∃ n ∈ (P : Subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n :=
P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer P hx) (le_centralizer P hy)
#align sylow.conj_eq_normalizer_conj_of_mem Sylow.conj_eq_normalizer_conj_of_mem
+-/
#print Sylow.equivQuotientNormalizer /-
/-- Sylow `p`-subgroups are in bijection with cosets of the normalizer of a Sylow `p`-subgroup -/
@@ -495,6 +551,7 @@ theorem not_dvd_index_sylow [hp : Fact p.Prime] [Finite (Sylow p G)] (P : Sylow
#align not_dvd_index_sylow not_dvd_index_sylow
-/
+#print Sylow.normalizer_sup_eq_top /-
/-- **Frattini's Argument**: If `N` is a normal subgroup of `G`, and if `P` is a Sylow `p`-subgroup
of `N`, then `N_G(P) ⊔ N = G`. -/
theorem Sylow.normalizer_sup_eq_top {p : ℕ} [Fact p.Prime] {N : Subgroup G} [N.Normal]
@@ -514,7 +571,9 @@ theorem Sylow.normalizer_sup_eq_top {p : ℕ} [Fact p.Prime] {N : Subgroup G} [N
rw [map_map, ← congr_arg (map N.subtype) hn, map_map]
rfl
#align sylow.normalizer_sup_eq_top Sylow.normalizer_sup_eq_top
+-/
+#print Sylow.normalizer_sup_eq_top' /-
/-- **Frattini's Argument**: If `N` is a normal subgroup of `G`, and if `P` is a Sylow `p`-subgroup
of `N`, then `N_G(P) ⊔ N = G`. -/
theorem Sylow.normalizer_sup_eq_top' {p : ℕ} [Fact p.Prime] {N : Subgroup G} [N.Normal]
@@ -522,6 +581,7 @@ theorem Sylow.normalizer_sup_eq_top' {p : ℕ} [Fact p.Prime] {N : Subgroup G} [
rw [← Sylow.normalizer_sup_eq_top (P.subtype hP), P.coe_subtype, subgroup_of_map_subtype,
inf_of_le_left hP]
#align sylow.normalizer_sup_eq_top' Sylow.normalizer_sup_eq_top'
+-/
end InfiniteSylow
@@ -546,6 +606,7 @@ namespace Sylow
open Subgroup Submonoid MulAction
+#print Sylow.mem_fixedPoints_mul_left_cosets_iff_mem_normalizer /-
theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Finite ↥(H : Set G)]
{x : G} : (x : G ⧸ H) ∈ fixedPoints H (G ⧸ H) ↔ x ∈ normalizer H :=
⟨fun hx =>
@@ -565,7 +626,9 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
(mul_mem_cancel_left (inv_mem hb₁)).1 <| by
rw [hx] at hb₂ <;> simpa [mul_inv_rev, mul_assoc] using hb₂)⟩
#align sylow.mem_fixed_points_mul_left_cosets_iff_mem_normalizer Sylow.mem_fixedPoints_mul_left_cosets_iff_mem_normalizer
+-/
+#print Sylow.fixedPointsMulLeftCosetsEquivQuotient /-
/-- The fixed points of the action of `H` on its cosets correspond to `normalizer H / H`. -/
def fixedPointsMulLeftCosetsEquivQuotient (H : Subgroup G) [Finite (H : Set G)] :
MulAction.fixedPoints H (G ⧸ H) ≃
@@ -574,7 +637,9 @@ def fixedPointsMulLeftCosetsEquivQuotient (H : Subgroup G) [Finite (H : Set G)]
(fun a => (@mem_fixedPoints_mul_left_cosets_iff_mem_normalizer _ _ _ ‹_› _).symm)
(by intros; rw [setoidHasEquiv]; simp only [left_rel_apply]; rfl)
#align sylow.fixed_points_mul_left_cosets_equiv_quotient Sylow.fixedPointsMulLeftCosetsEquivQuotient
+-/
+#print Sylow.card_quotient_normalizer_modEq_card_quotient /-
/-- If `H` is a `p`-subgroup of `G`, then the index of `H` inside its normalizer is congruent
mod `p` to the index of `H`. -/
theorem card_quotient_normalizer_modEq_card_quotient [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.Prime]
@@ -585,7 +650,9 @@ theorem card_quotient_normalizer_modEq_card_quotient [Fintype G] {p : ℕ} {n :
rw [← Fintype.card_congr (fixed_points_mul_left_cosets_equiv_quotient H)]
exact ((IsPGroup.of_card hH).card_modEq_card_fixedPoints _).symm
#align sylow.card_quotient_normalizer_modeq_card_quotient Sylow.card_quotient_normalizer_modEq_card_quotient
+-/
+#print Sylow.card_normalizer_modEq_card /-
/-- If `H` is a subgroup of `G` of cardinality `p ^ n`, then the cardinality of the
normalizer of `H` is congruent mod `p ^ (n + 1)` to the cardinality of `G`. -/
theorem card_normalizer_modEq_card [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.Prime] {H : Subgroup G}
@@ -597,7 +664,9 @@ theorem card_normalizer_modEq_card [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.
hH, pow_succ]
exact (card_quotient_normalizer_modeq_card_quotient hH).mul_right' _
#align sylow.card_normalizer_modeq_card Sylow.card_normalizer_modEq_card
+-/
+#print Sylow.prime_dvd_card_quotient_normalizer /-
/-- If `H` is a `p`-subgroup but not a Sylow `p`-subgroup, then `p` divides the
index of `H` inside its normalizer. -/
theorem prime_dvd_card_quotient_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.Prime]
@@ -614,7 +683,9 @@ theorem prime_dvd_card_quotient_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp :
hcard ▸ (card_quotient_normalizer_modEq_card_quotient hH).symm
Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm )
#align sylow.prime_dvd_card_quotient_normalizer Sylow.prime_dvd_card_quotient_normalizer
+-/
+#print Sylow.prime_pow_dvd_card_normalizer /-
/-- If `H` is a `p`-subgroup but not a Sylow `p`-subgroup of cardinality `p ^ n`,
then `p ^ (n + 1)` divides the cardinality of the normalizer of `H`. -/
theorem prime_pow_dvd_card_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.Prime]
@@ -622,7 +693,9 @@ theorem prime_pow_dvd_card_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
p ^ (n + 1) ∣ card (normalizer H) :=
Nat.modEq_zero_iff_dvd.1 ((card_normalizer_modEq_card hH).trans hdvd.modEq_zero_nat)
#align sylow.prime_pow_dvd_card_normalizer Sylow.prime_pow_dvd_card_normalizer
+-/
+#print Sylow.exists_subgroup_card_pow_succ /-
/-- If `H` is a subgroup of `G` of cardinality `p ^ n`,
then `H` is contained in a subgroup of cardinality `p ^ (n + 1)`
if `p ^ (n + 1)` divides the cardinality of `G` -/
@@ -668,7 +741,9 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [zpow_zero, eq_comm, QuotientGroup.eq_one_iff]
simpa using hy⟩
#align sylow.exists_subgroup_card_pow_succ Sylow.exists_subgroup_card_pow_succ
+-/
+#print Sylow.exists_subgroup_card_pow_prime_le /-
/-- If `H` is a subgroup of `G` of cardinality `p ^ n`,
then `H` is contained in a subgroup of cardinality `p ^ m`
if `n ≤ m` and `p ^ m` divides the cardinality of `G` -/
@@ -689,7 +764,9 @@ theorem exists_subgroup_card_pow_prime_le [Fintype G] (p : ℕ) :
⟨K', by rw [hK'.1, tsub_add_cancel_of_le h0m.nat_succ_le], le_trans hK.2 hK'.2⟩)
fun hnm : n = m => ⟨H, by simp [hH, hnm]⟩
#align sylow.exists_subgroup_card_pow_prime_le Sylow.exists_subgroup_card_pow_prime_le
+-/
+#print Sylow.exists_subgroup_card_pow_prime /-
/-- A generalisation of **Sylow's first theorem**. If `p ^ n` divides
the cardinality of `G`, then there is a subgroup of cardinality `p ^ n` -/
theorem exists_subgroup_card_pow_prime [Fintype G] (p : ℕ) {n : ℕ} [Fact p.Prime]
@@ -697,14 +774,18 @@ theorem exists_subgroup_card_pow_prime [Fintype G] (p : ℕ) {n : ℕ} [Fact p.P
let ⟨K, hK⟩ := exists_subgroup_card_pow_prime_le p hdvd ⊥ (by simp) n.zero_le
⟨K, hK.1⟩
#align sylow.exists_subgroup_card_pow_prime Sylow.exists_subgroup_card_pow_prime
+-/
+#print Sylow.pow_dvd_card_of_pow_dvd_card /-
theorem pow_dvd_card_of_pow_dvd_card [Fintype G] {p n : ℕ} [hp : Fact p.Prime] (P : Sylow p G)
(hdvd : p ^ n ∣ card G) : p ^ n ∣ card P :=
(hp.1.coprime_pow_of_not_dvd
(not_dvd_index_sylow P index_ne_zero_of_finite)).symm.dvd_of_dvd_mul_left
((index_mul_card P.1).symm ▸ hdvd)
#align sylow.pow_dvd_card_of_pow_dvd_card Sylow.pow_dvd_card_of_pow_dvd_card
+-/
+#print Sylow.dvd_card_of_dvd_card /-
theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G)
(hdvd : p ∣ card G) : p ∣ card P :=
by
@@ -712,14 +793,18 @@ theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G
have key := P.pow_dvd_card_of_pow_dvd_card hdvd
rwa [pow_one] at key
#align sylow.dvd_card_of_dvd_card Sylow.dvd_card_of_dvd_card
+-/
+#print Sylow.card_coprime_index /-
/-- Sylow subgroups are Hall subgroups. -/
theorem card_coprime_index [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
(card P).coprime (index (P : Subgroup G)) :=
let ⟨n, hn⟩ := IsPGroup.iff_card.mp P.2
hn.symm ▸ (hp.1.coprime_pow_of_not_dvd (not_dvd_index_sylow P index_ne_zero_of_finite)).symm
#align sylow.card_coprime_index Sylow.card_coprime_index
+-/
+#print Sylow.ne_bot_of_dvd_card /-
theorem ne_bot_of_dvd_card [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G)
(hdvd : p ∣ card G) : (P : Subgroup G) ≠ ⊥ :=
by
@@ -727,7 +812,9 @@ theorem ne_bot_of_dvd_card [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow
have key : p ∣ card (P : Subgroup G) := P.dvd_card_of_dvd_card hdvd
rwa [h, card_bot] at key
#align sylow.ne_bot_of_dvd_card Sylow.ne_bot_of_dvd_card
+-/
+#print Sylow.card_eq_multiplicity /-
/-- The cardinality of a Sylow group is `p ^ n`
where `n` is the multiplicity of `p` in the group order. -/
theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
@@ -738,6 +825,7 @@ theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylo
rw [HEq, ← hp.out.pow_dvd_iff_dvd_ord_proj (show card G ≠ 0 from card_ne_zero), ← HEq]
exact P.1.card_subgroup_dvd_card
#align sylow.card_eq_multiplicity Sylow.card_eq_multiplicity
+-/
#print Sylow.subsingleton_of_normal /-
theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
@@ -790,6 +878,7 @@ theorem normalizer_normalizer {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P :
#align sylow.normalizer_normalizer Sylow.normalizer_normalizer
-/
+#print Sylow.normal_of_all_max_subgroups_normal /-
theorem normal_of_all_max_subgroups_normal [Finite G]
(hnc : ∀ H : Subgroup G, IsCoatom H → H.Normal) {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)]
(P : Sylow p G) : (↑P : Subgroup G).Normal :=
@@ -802,6 +891,7 @@ theorem normal_of_all_max_subgroups_normal [Finite G]
refine' (hK.1 _).elim
rw [← sup_of_le_right hNK, P.normalizer_sup_eq_top' hPK])
#align sylow.normal_of_all_max_subgroups_normal Sylow.normal_of_all_max_subgroups_normal
+-/
#print Sylow.normal_of_normalizerCondition /-
theorem normal_of_normalizerCondition (hnc : NormalizerCondition G) {p : ℕ} [Fact p.Prime]
@@ -813,6 +903,7 @@ theorem normal_of_normalizerCondition (hnc : NormalizerCondition G) {p : ℕ} [F
open scoped BigOperators
+#print Sylow.directProductOfNormal /-
/-- If all its sylow groups are normal, then a finite group is isomorphic to the direct product
of these sylow groups.
-/
@@ -866,6 +957,7 @@ noncomputable def directProductOfNormal [Fintype G]
_ = (card G).factorization.Prod pow := rfl
_ = card G := Nat.factorization_prod_pow_eq_self Fintype.card_ne_zero
#align sylow.direct_product_of_normal Sylow.directProductOfNormal
+-/
end Sylow
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -327,7 +327,6 @@ instance [hp : Fact p.Prime] [Finite (Sylow p G)] : IsPretransitive G (Sylow p G
forall_congr' fun a => Subtype.ext_iff
_ ↔ R.1 ≤ S := R.2.sylow_mem_fixedPoints_iff
_ ↔ S.1.1 = R := ⟨fun h => R.3 S.1.2 h, ge_of_eq⟩
-
suffices Set.Nonempty (fixed_points Q (orbit G P)) by
exact Exists.elim this fun R hR => (congr_arg _ (Sylow.ext (H.mp hR))).mp R.2
apply Q.2.nonempty_fixed_point_of_prime_not_dvd_card
@@ -336,7 +335,6 @@ instance [hp : Fact p.Prime] [Finite (Sylow p G)] : IsPretransitive G (Sylow p G
1 = card (fixed_points P (orbit G P)) := _
_ ≡ card (orbit G P) [MOD p] := (P.2.card_modEq_card_fixedPoints (orbit G P)).symm
_ ≡ 0 [MOD p] := nat.modeq_zero_iff_dvd.mpr h
-
rw [← Set.card_singleton (⟨P, mem_orbit_self P⟩ : orbit G P)]
refine' card_congr' (congr_arg _ (Eq.symm _))
rw [Set.eq_singleton_iff_unique_mem]
@@ -356,7 +354,6 @@ theorem card_sylow_modEq_one [Fact p.Prime] [Fintype (Sylow p G)] : card (Sylow
Q ∈ fixed_points P (Sylow p G) ↔ P.1 ≤ Q := P.2.sylow_mem_fixedPoints_iff
_ ↔ Q.1 = P.1 := ⟨P.3 Q.2, ge_of_eq⟩
_ ↔ Q ∈ {P} := sylow.ext_iff.symm.trans set.mem_singleton_iff.symm
-
have : Fintype (fixed_points P.1 (Sylow p G)) := by rw [this]; infer_instance
have : card (fixed_points P.1 (Sylow p G)) = 1 := by simp [this]
exact (P.2.card_modEq_card_fixedPoints (Sylow p G)).trans (by rw [this])
@@ -433,7 +430,6 @@ noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Fintype (Sylow p
_ ≃ orbit G P := by rw [P.orbit_eq_top]
_ ≃ G ⧸ stabilizer G P := (orbitEquivQuotientStabilizer G P)
_ ≃ G ⧸ (P : Subgroup G).normalizer := by rw [P.stabilizer_eq_normalizer]
-
#align sylow.equiv_quotient_normalizer Sylow.equivQuotientNormalizer
-/
@@ -869,7 +865,6 @@ noncomputable def directProductOfNormal [Fintype G]
(Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _)
_ = (card G).factorization.Prod pow := rfl
_ = card G := Nat.factorization_prod_pow_eq_self Fintype.card_ne_zero
-
#align sylow.direct_product_of_normal Sylow.directProductOfNormal
end Sylow
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -156,7 +156,7 @@ end Sylow
Every `p`-subgroup is contained in a Sylow `p`-subgroup. -/
theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q : Sylow p G, P ≤ Q :=
Exists.elim
- (zorn_nonempty_partialOrder₀ { Q : Subgroup G | IsPGroup p Q }
+ (zorn_nonempty_partialOrder₀ {Q : Subgroup G | IsPGroup p Q}
(fun c hc1 hc2 Q hQ =>
⟨{ carrier := ⋃ R : c, R
one_mem' := ⟨Q, ⟨⟨Q, hQ⟩, rfl⟩, Q.one_mem⟩
@@ -320,27 +320,27 @@ theorem IsPGroup.sylow_mem_fixedPoints_iff {P : Subgroup G} (hP : IsPGroup p P)
instance [hp : Fact p.Prime] [Finite (Sylow p G)] : IsPretransitive G (Sylow p G) :=
⟨fun P Q => by
classical
- cases nonempty_fintype (Sylow p G)
- have H := fun {R : Sylow p G} {S : orbit G P} =>
- calc
- S ∈ fixed_points R (orbit G P) ↔ S.1 ∈ fixed_points R (Sylow p G) :=
- forall_congr' fun a => Subtype.ext_iff
- _ ↔ R.1 ≤ S := R.2.sylow_mem_fixedPoints_iff
- _ ↔ S.1.1 = R := ⟨fun h => R.3 S.1.2 h, ge_of_eq⟩
-
- suffices Set.Nonempty (fixed_points Q (orbit G P)) by
- exact Exists.elim this fun R hR => (congr_arg _ (Sylow.ext (H.mp hR))).mp R.2
- apply Q.2.nonempty_fixed_point_of_prime_not_dvd_card
- refine' fun h => hp.out.not_dvd_one (nat.modeq_zero_iff_dvd.mp _)
+ cases nonempty_fintype (Sylow p G)
+ have H := fun {R : Sylow p G} {S : orbit G P} =>
calc
- 1 = card (fixed_points P (orbit G P)) := _
- _ ≡ card (orbit G P) [MOD p] := (P.2.card_modEq_card_fixedPoints (orbit G P)).symm
- _ ≡ 0 [MOD p] := nat.modeq_zero_iff_dvd.mpr h
+ S ∈ fixed_points R (orbit G P) ↔ S.1 ∈ fixed_points R (Sylow p G) :=
+ forall_congr' fun a => Subtype.ext_iff
+ _ ↔ R.1 ≤ S := R.2.sylow_mem_fixedPoints_iff
+ _ ↔ S.1.1 = R := ⟨fun h => R.3 S.1.2 h, ge_of_eq⟩
- rw [← Set.card_singleton (⟨P, mem_orbit_self P⟩ : orbit G P)]
- refine' card_congr' (congr_arg _ (Eq.symm _))
- rw [Set.eq_singleton_iff_unique_mem]
- exact ⟨H.mpr rfl, fun R h => Subtype.ext (Sylow.ext (H.mp h))⟩⟩
+ suffices Set.Nonempty (fixed_points Q (orbit G P)) by
+ exact Exists.elim this fun R hR => (congr_arg _ (Sylow.ext (H.mp hR))).mp R.2
+ apply Q.2.nonempty_fixed_point_of_prime_not_dvd_card
+ refine' fun h => hp.out.not_dvd_one (nat.modeq_zero_iff_dvd.mp _)
+ calc
+ 1 = card (fixed_points P (orbit G P)) := _
+ _ ≡ card (orbit G P) [MOD p] := (P.2.card_modEq_card_fixedPoints (orbit G P)).symm
+ _ ≡ 0 [MOD p] := nat.modeq_zero_iff_dvd.mpr h
+
+ rw [← Set.card_singleton (⟨P, mem_orbit_self P⟩ : orbit G P)]
+ refine' card_congr' (congr_arg _ (Eq.symm _))
+ rw [Set.eq_singleton_iff_unique_mem]
+ exact ⟨H.mpr rfl, fun R h => Subtype.ext (Sylow.ext (H.mp h))⟩⟩
variable (p) (G)
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -146,7 +146,7 @@ theorem coe_subtype (h : ↑P ≤ N) : ↑(P.Subtype h) = subgroupOf (↑P) N :=
theorem subtype_injective {P Q : Sylow p G} {hP : ↑P ≤ N} {hQ : ↑Q ≤ N}
(h : P.Subtype hP = Q.Subtype hQ) : P = Q :=
by
- rw [SetLike.ext_iff] at h⊢
+ rw [SetLike.ext_iff] at h ⊢
exact fun g => ⟨fun hg => (h ⟨g, hP hg⟩).mp hg, fun hg => (h ⟨g, hQ hg⟩).mpr hg⟩
#align sylow.subtype_injective Sylow.subtype_injective
@@ -167,7 +167,7 @@ theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q :
fun ⟨g, _, ⟨S, rfl⟩, hg⟩ =>
by
refine' Exists.imp (fun k hk => _) (hc1 S.2 ⟨g, hg⟩)
- rwa [Subtype.ext_iff, coe_pow] at hk⊢, fun M hM g hg => ⟨M, ⟨⟨M, hM⟩, rfl⟩, hg⟩⟩)
+ rwa [Subtype.ext_iff, coe_pow] at hk ⊢, fun M hM g hg => ⟨M, ⟨⟨M, hM⟩, rfl⟩, hg⟩⟩)
P hP)
fun Q ⟨hQ1, hQ2, hQ3⟩ => ⟨⟨Q, hQ1, hQ3⟩, hQ2⟩
#align is_p_group.exists_le_sylow IsPGroup.exists_le_sylow
@@ -411,9 +411,9 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite
rintro - ⟨z, hz, rfl⟩
specialize hy z hz
rwa [← mul_assoc, ← eq_mul_inv_iff_mul_eq, mul_assoc, mul_assoc, mul_assoc, ← mul_assoc,
- eq_inv_mul_iff_mul_eq, ← mul_assoc, ← mul_assoc] at hy
+ eq_inv_mul_iff_mul_eq, ← mul_assoc, ← mul_assoc] at hy
obtain ⟨h, hh⟩ := exists_smul_eq (zpowers x).centralizer ((g • P).Subtype h2) (P.subtype h1)
- simp_rw [Sylow.smul_subtype, smul_def, smul_smul] at hh
+ simp_rw [Sylow.smul_subtype, smul_def, smul_smul] at hh
refine' ⟨h * g, sylow.smul_eq_iff_mem_normalizer.mp (Sylow.subtype_injective hh), _⟩
rw [← mul_assoc, Commute.right_comm (h.prop x (mem_zpowers x)), mul_inv_rev, inv_mul_cancel_right]
#align sylow.conj_eq_normalizer_conj_of_mem_centralizer Sylow.conj_eq_normalizer_conj_of_mem_centralizer
@@ -469,7 +469,7 @@ theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup
by
intro h
haveI := (P : Subgroup G).fintypeQuotientOfFiniteIndex
- rw [index_eq_card] at h
+ rw [index_eq_card] at h
obtain ⟨x, hx⟩ := exists_prime_orderOf_dvd_card p h
have h := IsPGroup.of_card ((order_eq_card_zpowers.symm.trans hx).trans (pow_one p).symm)
let Q := (zpowers x).comap (QuotientGroup.mk' (P : Subgroup G))
@@ -480,7 +480,7 @@ theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup
replace hp := mt order_of_eq_one_iff.mpr (ne_of_eq_of_ne hx hp.1.ne_one)
rw [← zpowers_eq_bot, ← Ne, ← bot_lt_iff_ne_bot, ←
comap_lt_comap_of_surjective (QuotientGroup.mk'_surjective _), MonoidHom.comap_bot,
- QuotientGroup.ker_mk'] at hp
+ QuotientGroup.ker_mk'] at hp
exact hp.ne' (P.3 hQ hp.le)
#align not_dvd_index_sylow' not_dvd_index_sylow'
-/
@@ -509,7 +509,7 @@ theorem Sylow.normalizer_sup_eq_top {p : ℕ} [Fact p.Prime] {N : Subgroup G} [N
rw [← inv_mul_cancel_left (↑n) g, sup_comm]
apply mul_mem_sup (N.inv_mem n.2)
rw [Sylow.smul_def, ← mul_smul, ← MulAut.conjNormal_val, ← mul_aut.conj_normal.map_mul,
- Sylow.ext_iff, Sylow.pointwise_smul_def, pointwise_smul_def] at hn
+ Sylow.ext_iff, Sylow.pointwise_smul_def, pointwise_smul_def] at hn
refine' fun x =>
(mem_map_iff_mem
(show Function.Injective (MulAut.conj (↑n * g)).toMonoidHom from
@@ -557,7 +557,7 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
inv_mem_iff.1
(mem_normalizer_fintype fun n (hn : n ∈ H) =>
have : (n⁻¹ * x)⁻¹ * x ∈ H := QuotientGroup.eq.1 (ha (mem_orbit _ ⟨n⁻¹, H.inv_mem hn⟩))
- show _ ∈ H by rw [mul_inv_rev, inv_inv] at this; convert this; rw [inv_inv]),
+ show _ ∈ H by rw [mul_inv_rev, inv_inv] at this ; convert this; rw [inv_inv]),
fun hx : ∀ n : G, n ∈ H ↔ x * n * x⁻¹ ∈ H =>
(mem_fixedPoints' _).2 fun y =>
Quotient.inductionOn' y fun y hy =>
@@ -567,7 +567,7 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
inv_mem_iff.1 <|
(hx _).2 <|
(mul_mem_cancel_left (inv_mem hb₁)).1 <| by
- rw [hx] at hb₂ <;> simpa [mul_inv_rev, mul_assoc] using hb₂)⟩
+ rw [hx] at hb₂ <;> simpa [mul_inv_rev, mul_assoc] using hb₂)⟩
#align sylow.mem_fixed_points_mul_left_cosets_iff_mem_normalizer Sylow.mem_fixedPoints_mul_left_cosets_iff_mem_normalizer
/-- The fixed points of the action of `H` on its cosets correspond to `normalizer H / H`. -/
@@ -576,7 +576,7 @@ def fixedPointsMulLeftCosetsEquivQuotient (H : Subgroup G) [Finite (H : Set G)]
normalizer H ⧸ Subgroup.comap ((normalizer H).Subtype : normalizer H →* G) H :=
@subtypeQuotientEquivQuotientSubtype G (normalizer H : Set G) (id _) (id _) (fixedPoints _ _)
(fun a => (@mem_fixedPoints_mul_left_cosets_iff_mem_normalizer _ _ _ ‹_› _).symm)
- (by intros ; rw [setoidHasEquiv]; simp only [left_rel_apply]; rfl)
+ (by intros; rw [setoidHasEquiv]; simp only [left_rel_apply]; rfl)
#align sylow.fixed_points_mul_left_cosets_equiv_quotient Sylow.fixedPointsMulLeftCosetsEquivQuotient
/-- If `H` is a `p`-subgroup of `G`, then the index of `H` inside its normalizer is congruent
@@ -616,7 +616,7 @@ theorem prime_dvd_card_quotient_normalizer [Fintype G] {p : ℕ} {n : ℕ} [hp :
s * p % p =
card (normalizer H ⧸ Subgroup.comap ((normalizer H).Subtype : normalizer H →* G) H) % p :=
hcard ▸ (card_quotient_normalizer_modEq_card_quotient hH).symm
- Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm)
+ Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm )
#align sylow.prime_dvd_card_quotient_normalizer Sylow.prime_dvd_card_quotient_normalizer
/-- If `H` is a `p`-subgroup but not a Sylow `p`-subgroup of cardinality `p ^ n`,
@@ -642,7 +642,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
card_congr (fixedPointsMulLeftCosetsEquivQuotient H) ▸
hcard ▸ (IsPGroup.of_card hH).card_modEq_card_fixedPoints _
have hm' : p ∣ card (normalizer H ⧸ H.subgroupOf H.normalizer) :=
- Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm)
+ Nat.dvd_of_mod_eq_zero (by rwa [Nat.mod_eq_zero_of_dvd (dvd_mul_left _ _), eq_comm] at hm )
let ⟨x, hx⟩ := @exists_prime_orderOf_dvd_card _ (QuotientGroup.Quotient.group _) _ _ hp hm'
have hequiv : H ≃ H.subgroupOf H.normalizer := (subgroupOfEquivOfLe le_normalizer).symm.toEquiv
⟨Subgroup.map (normalizer H).Subtype
@@ -712,9 +712,9 @@ theorem pow_dvd_card_of_pow_dvd_card [Fintype G] {p n : ℕ} [hp : Fact p.Prime]
theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G)
(hdvd : p ∣ card G) : p ∣ card P :=
by
- rw [← pow_one p] at hdvd
+ rw [← pow_one p] at hdvd
have key := P.pow_dvd_card_of_pow_dvd_card hdvd
- rwa [pow_one] at key
+ rwa [pow_one] at key
#align sylow.dvd_card_of_dvd_card Sylow.dvd_card_of_dvd_card
/-- Sylow subgroups are Hall subgroups. -/
@@ -729,7 +729,7 @@ theorem ne_bot_of_dvd_card [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow
by
refine' fun h => hp.out.not_dvd_one _
have key : p ∣ card (P : Subgroup G) := P.dvd_card_of_dvd_card hdvd
- rwa [h, card_bot] at key
+ rwa [h, card_bot] at key
#align sylow.ne_bot_of_dvd_card Sylow.ne_bot_of_dvd_card
/-- The cardinality of a Sylow group is `p ^ n`
@@ -751,7 +751,7 @@ theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P
intro Q R
obtain ⟨x, h1⟩ := exists_smul_eq G P Q
obtain ⟨x, h2⟩ := exists_smul_eq G P R
- rw [Sylow.smul_eq_of_normal] at h1 h2
+ rw [Sylow.smul_eq_of_normal] at h1 h2
rw [← h1, ← h2]
#align sylow.subsingleton_of_normal Sylow.subsingleton_of_normal
-/
@@ -788,7 +788,7 @@ theorem normalizer_normalizer {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P :
by
have := normal_of_normalizer_normal (P.subtype (le_normalizer.trans le_normalizer))
simp_rw [← normalizer_eq_top, coeSubtype, ← subgroup_of_normalizer_eq le_normalizer, ←
- subgroup_of_normalizer_eq le_rfl, subgroup_of_self] at this
+ subgroup_of_normalizer_eq le_rfl, subgroup_of_self] at this
rw [← subtype_range (P : Subgroup G).normalizer.normalizer, MonoidHom.range_eq_map, ← this rfl]
exact map_comap_eq_self (le_normalizer.trans (ge_of_eq (subtype_range _)))
#align sylow.normalizer_normalizer Sylow.normalizer_normalizer
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
! This file was ported from Lean 3 source module group_theory.sylow
-! leanprover-community/mathlib commit c55911f6166b348e1c72b08c8664e3af5f1ce334
+! leanprover-community/mathlib commit f60c6087a7275b72d5db3c5a1d0e19e35a429c0a
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -18,6 +18,9 @@ import Mathbin.Order.Atoms.Finite
/-!
# Sylow theorems
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
The Sylow theorems are the following results for every finite group `G` and every prime number `p`.
* There exists a Sylow `p`-subgroup of `G`.
@@ -52,11 +55,13 @@ section InfiniteSylow
variable (p : ℕ) (G : Type _) [Group G]
+#print Sylow /-
/-- A Sylow `p`-subgroup is a maximal `p`-subgroup. -/
structure Sylow extends Subgroup G where
is_p_group' : IsPGroup p to_subgroup
is_maximal' : ∀ {Q : Subgroup G}, IsPGroup p Q → to_subgroup ≤ Q → Q = to_subgroup
#align sylow Sylow
+-/
variable {p} {G}
@@ -70,13 +75,17 @@ theorem toSubgroup_eq_coe {P : Sylow p G} : P.toSubgroup = ↑P :=
rfl
#align sylow.to_subgroup_eq_coe Sylow.toSubgroup_eq_coe
+#print Sylow.ext /-
@[ext]
theorem ext {P Q : Sylow p G} (h : (P : Subgroup G) = Q) : P = Q := by cases P <;> cases Q <;> congr
#align sylow.ext Sylow.ext
+-/
+#print Sylow.ext_iff /-
theorem ext_iff {P Q : Sylow p G} : P = Q ↔ (P : Subgroup G) = Q :=
⟨congr_arg coe, ext⟩
#align sylow.ext_iff Sylow.ext_iff
+-/
instance : SetLike (Sylow p G) G where
coe := coe
@@ -163,13 +172,17 @@ theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q :
fun Q ⟨hQ1, hQ2, hQ3⟩ => ⟨⟨Q, hQ1, hQ3⟩, hQ2⟩
#align is_p_group.exists_le_sylow IsPGroup.exists_le_sylow
+#print Sylow.nonempty /-
instance Sylow.nonempty : Nonempty (Sylow p G) :=
nonempty_of_exists IsPGroup.of_bot.exists_le_sylow
#align sylow.nonempty Sylow.nonempty
+-/
+#print Sylow.inhabited /-
noncomputable instance Sylow.inhabited : Inhabited (Sylow p G) :=
Classical.inhabited_of_nonempty Sylow.nonempty
#align sylow.inhabited Sylow.inhabited
+-/
theorem Sylow.exists_comap_eq_of_ker_isPGroup {H : Type _} [Group H] (P : Sylow p H) {f : H →* G}
(hf : IsPGroup p f.ker) : ∃ Q : Sylow p G, (Q : Subgroup G).comap f = P :=
@@ -213,6 +226,7 @@ instance (H : Subgroup G) [Finite (Sylow p G)] : Finite (Sylow p H) := by
open scoped Pointwise
+#print Sylow.pointwiseMulAction /-
/-- `subgroup.pointwise_mul_action` preserves Sylow subgroups. -/
instance Sylow.pointwiseMulAction {α : Type _} [Group α] [MulDistribMulAction α G] :
MulAction α (Sylow p G)
@@ -226,15 +240,20 @@ instance Sylow.pointwiseMulAction {α : Type _} [Group α] [MulDistribMulAction
one_smul P := Sylow.ext (one_smul α P)
mul_smul g h P := Sylow.ext (mul_smul g h P)
#align sylow.pointwise_mul_action Sylow.pointwiseMulAction
+-/
+#print Sylow.pointwise_smul_def /-
theorem Sylow.pointwise_smul_def {α : Type _} [Group α] [MulDistribMulAction α G] {g : α}
{P : Sylow p G} : ↑(g • P) = g • (P : Subgroup G) :=
rfl
#align sylow.pointwise_smul_def Sylow.pointwise_smul_def
+-/
+#print Sylow.mulAction /-
instance Sylow.mulAction : MulAction G (Sylow p G) :=
compHom _ MulAut.conj
#align sylow.mul_action Sylow.mulAction
+-/
theorem Sylow.smul_def {g : G} {P : Sylow p G} : g • P = MulAut.conj g • P :=
rfl
@@ -271,9 +290,11 @@ theorem Sylow.smul_eq_iff_mem_normalizer {g : G} {P : Sylow p G} :
fun hh => ⟨(MulAut.conj g)⁻¹ h, hh, MulAut.apply_inv_self G (MulAut.conj g) h⟩⟩
#align sylow.smul_eq_iff_mem_normalizer Sylow.smul_eq_iff_mem_normalizer
+#print Sylow.smul_eq_of_normal /-
theorem Sylow.smul_eq_of_normal {g : G} {P : Sylow p G} [h : (P : Subgroup G).Normal] : g • P = P :=
by simp only [Sylow.smul_eq_iff_mem_normalizer, normalizer_eq_top.mpr h, mem_top]
#align sylow.smul_eq_of_normal Sylow.smul_eq_of_normal
+-/
theorem Subgroup.sylow_mem_fixedPoints_iff (H : Subgroup G) {P : Sylow p G} :
P ∈ fixedPoints H (Sylow p G) ↔ H ≤ (P : Subgroup G).normalizer := by
@@ -323,6 +344,7 @@ instance [hp : Fact p.Prime] [Finite (Sylow p G)] : IsPretransitive G (Sylow p G
variable (p) (G)
+#print card_sylow_modEq_one /-
/-- A generalization of **Sylow's third theorem**.
If the number of Sylow `p`-subgroups is finite, then it is congruent to `1` modulo `p`. -/
theorem card_sylow_modEq_one [Fact p.Prime] [Fintype (Sylow p G)] : card (Sylow p G) ≡ 1 [MOD p] :=
@@ -339,7 +361,9 @@ theorem card_sylow_modEq_one [Fact p.Prime] [Fintype (Sylow p G)] : card (Sylow
have : card (fixed_points P.1 (Sylow p G)) = 1 := by simp [this]
exact (P.2.card_modEq_card_fixedPoints (Sylow p G)).trans (by rw [this])
#align card_sylow_modeq_one card_sylow_modEq_one
+-/
+#print not_dvd_card_sylow /-
theorem not_dvd_card_sylow [hp : Fact p.Prime] [Fintype (Sylow p G)] : ¬p ∣ card (Sylow p G) :=
fun h =>
hp.1.ne_one
@@ -347,13 +371,14 @@ theorem not_dvd_card_sylow [hp : Fact p.Prime] [Fintype (Sylow p G)] : ¬p ∣ c
((Nat.modEq_iff_dvd' zero_le_one).mp
((Nat.modEq_zero_iff_dvd.mpr h).symm.trans (card_sylow_modEq_one p G))))
#align not_dvd_card_sylow not_dvd_card_sylow
+-/
variable {p} {G}
/-- Sylow subgroups are isomorphic -/
-def Sylow.equivSmul (P : Sylow p G) (g : G) : P ≃* (g • P : Sylow p G) :=
+def Sylow.equivSMul (P : Sylow p G) (g : G) : P ≃* (g • P : Sylow p G) :=
equivSMul (MulAut.conj g) ↑P
-#align sylow.equiv_smul Sylow.equivSmul
+#align sylow.equiv_smul Sylow.equivSMul
/-- Sylow subgroups are isomorphic -/
noncomputable def Sylow.equiv [Fact p.Prime] [Finite (Sylow p G)] (P Q : Sylow p G) : P ≃* Q :=
@@ -367,10 +392,12 @@ theorem Sylow.orbit_eq_top [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G) :
top_le_iff.mp fun Q hQ => exists_smul_eq G P Q
#align sylow.orbit_eq_top Sylow.orbit_eq_top
+#print Sylow.stabilizer_eq_normalizer /-
theorem Sylow.stabilizer_eq_normalizer (P : Sylow p G) :
stabilizer G P = (P : Subgroup G).normalizer :=
ext fun g => Sylow.smul_eq_iff_mem_normalizer
#align sylow.stabilizer_eq_normalizer Sylow.stabilizer_eq_normalizer
+-/
theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite (Sylow p G)]
(P : Sylow p G) (x g : G) (hx : x ∈ (P : Subgroup G).centralizer)
@@ -397,6 +424,7 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem [Fact p.Prime] [Finite (Sylow p G)]
P.conj_eq_normalizer_conj_of_mem_centralizer x g (le_centralizer P hx) (le_centralizer P hy)
#align sylow.conj_eq_normalizer_conj_of_mem Sylow.conj_eq_normalizer_conj_of_mem
+#print Sylow.equivQuotientNormalizer /-
/-- Sylow `p`-subgroups are in bijection with cosets of the normalizer of a Sylow `p`-subgroup -/
noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Fintype (Sylow p G)]
(P : Sylow p G) : Sylow p G ≃ G ⧸ (P : Subgroup G).normalizer :=
@@ -407,27 +435,35 @@ noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Fintype (Sylow p
_ ≃ G ⧸ (P : Subgroup G).normalizer := by rw [P.stabilizer_eq_normalizer]
#align sylow.equiv_quotient_normalizer Sylow.equivQuotientNormalizer
+-/
noncomputable instance [Fact p.Prime] [Fintype (Sylow p G)] (P : Sylow p G) :
Fintype (G ⧸ (P : Subgroup G).normalizer) :=
ofEquiv (Sylow p G) P.equivQuotientNormalizer
+#print card_sylow_eq_card_quotient_normalizer /-
theorem card_sylow_eq_card_quotient_normalizer [Fact p.Prime] [Fintype (Sylow p G)]
(P : Sylow p G) : card (Sylow p G) = card (G ⧸ (P : Subgroup G).normalizer) :=
card_congr P.equivQuotientNormalizer
#align card_sylow_eq_card_quotient_normalizer card_sylow_eq_card_quotient_normalizer
+-/
+#print card_sylow_eq_index_normalizer /-
theorem card_sylow_eq_index_normalizer [Fact p.Prime] [Fintype (Sylow p G)] (P : Sylow p G) :
card (Sylow p G) = (P : Subgroup G).normalizer.index :=
(card_sylow_eq_card_quotient_normalizer P).trans (P : Subgroup G).normalizer.index_eq_card.symm
#align card_sylow_eq_index_normalizer card_sylow_eq_index_normalizer
+-/
+#print card_sylow_dvd_index /-
theorem card_sylow_dvd_index [Fact p.Prime] [Fintype (Sylow p G)] (P : Sylow p G) :
card (Sylow p G) ∣ (P : Subgroup G).index :=
((congr_arg _ (card_sylow_eq_index_normalizer P)).mp dvd_rfl).trans
(index_dvd_of_le le_normalizer)
#align card_sylow_dvd_index card_sylow_dvd_index
+-/
+#print not_dvd_index_sylow' /-
theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup G).Normal]
[FiniteIndex (P : Subgroup G)] : ¬p ∣ (P : Subgroup G).index :=
by
@@ -447,7 +483,9 @@ theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup
QuotientGroup.ker_mk'] at hp
exact hp.ne' (P.3 hQ hp.le)
#align not_dvd_index_sylow' not_dvd_index_sylow'
+-/
+#print not_dvd_index_sylow /-
theorem not_dvd_index_sylow [hp : Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(hP : relindex ↑P (P : Subgroup G).normalizer ≠ 0) : ¬p ∣ (P : Subgroup G).index :=
by
@@ -459,6 +497,7 @@ theorem not_dvd_index_sylow [hp : Fact p.Prime] [Finite (Sylow p G)] (P : Sylow
replace hP := not_dvd_index_sylow' (P.subtype le_normalizer)
exact hp.1.not_dvd_mul hP (not_dvd_card_sylow p G)
#align not_dvd_index_sylow not_dvd_index_sylow
+-/
/-- **Frattini's Argument**: If `N` is a normal subgroup of `G`, and if `P` is a Sylow `p`-subgroup
of `N`, then `N_G(P) ⊔ N = G`. -/
@@ -500,10 +539,12 @@ variable {G : Type u} {α : Type v} {β : Type w} [Group G]
attribute [local instance 10] Subtype.fintype setFintype Classical.propDecidable
+#print QuotientGroup.card_preimage_mk /-
theorem QuotientGroup.card_preimage_mk [Fintype G] (s : Subgroup G) (t : Set (G ⧸ s)) :
Fintype.card (QuotientGroup.mk ⁻¹' t) = Fintype.card s * Fintype.card t := by
rw [← Fintype.card_prod, Fintype.card_congr (preimage_mk_equiv_subgroup_times_set _ _)]
#align quotient_group.card_preimage_mk QuotientGroup.card_preimage_mk
+-/
namespace Sylow
@@ -702,6 +743,7 @@ theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylo
exact P.1.card_subgroup_dvd_card
#align sylow.card_eq_multiplicity Sylow.card_eq_multiplicity
+#print Sylow.subsingleton_of_normal /-
theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : Subsingleton (Sylow p G) :=
by
@@ -712,11 +754,13 @@ theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P
rw [Sylow.smul_eq_of_normal] at h1 h2
rw [← h1, ← h2]
#align sylow.subsingleton_of_normal Sylow.subsingleton_of_normal
+-/
section Pointwise
open scoped Pointwise
+#print Sylow.characteristic_of_normal /-
theorem characteristic_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : (P : Subgroup G).Characteristic :=
by
@@ -726,14 +770,18 @@ theorem characteristic_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (
show (Φ • P).toSubgroup = P.to_subgroup
congr
#align sylow.characteristic_of_normal Sylow.characteristic_of_normal
+-/
end Pointwise
+#print Sylow.normal_of_normalizer_normal /-
theorem normal_of_normalizer_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(hn : (↑P : Subgroup G).normalizer.Normal) : (↑P : Subgroup G).Normal := by
rw [← normalizer_eq_top, ← normalizer_sup_eq_top' P le_normalizer, sup_idem]
#align sylow.normal_of_normalizer_normal Sylow.normal_of_normalizer_normal
+-/
+#print Sylow.normalizer_normalizer /-
@[simp]
theorem normalizer_normalizer {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G) :
(↑P : Subgroup G).normalizer.normalizer = (↑P : Subgroup G).normalizer :=
@@ -744,6 +792,7 @@ theorem normalizer_normalizer {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P :
rw [← subtype_range (P : Subgroup G).normalizer.normalizer, MonoidHom.range_eq_map, ← this rfl]
exact map_comap_eq_self (le_normalizer.trans (ge_of_eq (subtype_range _)))
#align sylow.normalizer_normalizer Sylow.normalizer_normalizer
+-/
theorem normal_of_all_max_subgroups_normal [Finite G]
(hnc : ∀ H : Subgroup G, IsCoatom H → H.Normal) {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)]
@@ -758,11 +807,13 @@ theorem normal_of_all_max_subgroups_normal [Finite G]
rw [← sup_of_le_right hNK, P.normalizer_sup_eq_top' hPK])
#align sylow.normal_of_all_max_subgroups_normal Sylow.normal_of_all_max_subgroups_normal
+#print Sylow.normal_of_normalizerCondition /-
theorem normal_of_normalizerCondition (hnc : NormalizerCondition G) {p : ℕ} [Fact p.Prime]
[Finite (Sylow p G)] (P : Sylow p G) : (↑P : Subgroup G).Normal :=
normalizer_eq_top.mp <|
normalizerCondition_iff_only_full_group_self_normalizing.mp hnc _ <| normalizer_normalizer _
#align sylow.normal_of_normalizer_condition Sylow.normal_of_normalizerCondition
+-/
open scoped BigOperators
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -211,7 +211,7 @@ noncomputable instance (H : Subgroup G) [Fintype (Sylow p G)] : Fintype (Sylow p
instance (H : Subgroup G) [Finite (Sylow p G)] : Finite (Sylow p H) := by
cases nonempty_fintype (Sylow p G); infer_instance
-open Pointwise
+open scoped Pointwise
/-- `subgroup.pointwise_mul_action` preserves Sylow subgroups. -/
instance Sylow.pointwiseMulAction {α : Type _} [Group α] [MulDistribMulAction α G] :
@@ -492,7 +492,7 @@ end InfiniteSylow
open Equiv Equiv.Perm Finset Function List QuotientGroup
-open BigOperators
+open scoped BigOperators
universe u v w
@@ -715,7 +715,7 @@ theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P
section Pointwise
-open Pointwise
+open scoped Pointwise
theorem characteristic_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : (P : Subgroup G).Characteristic :=
@@ -764,7 +764,7 @@ theorem normal_of_normalizerCondition (hnc : NormalizerCondition G) {p : ℕ} [F
normalizerCondition_iff_only_full_group_self_normalizing.mp hnc _ <| normalizer_normalizer _
#align sylow.normal_of_normalizer_condition Sylow.normal_of_normalizerCondition
-open BigOperators
+open scoped BigOperators
/-- If all its sylow groups are normal, then a finite group is isomorphic to the direct product
of these sylow groups.
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -208,10 +208,8 @@ noncomputable instance (H : Subgroup G) [Fintype (Sylow p G)] : Fintype (Sylow p
Sylow.fintypeOfInjective H.subtype_injective
/-- If `H` is a subgroup of `G`, then `finite (sylow p G)` implies `finite (sylow p H)`. -/
-instance (H : Subgroup G) [Finite (Sylow p G)] : Finite (Sylow p H) :=
- by
- cases nonempty_fintype (Sylow p G)
- infer_instance
+instance (H : Subgroup G) [Finite (Sylow p G)] : Finite (Sylow p H) := by
+ cases nonempty_fintype (Sylow p G); infer_instance
open Pointwise
@@ -337,10 +335,7 @@ theorem card_sylow_modEq_one [Fact p.Prime] [Fintype (Sylow p G)] : card (Sylow
_ ↔ Q.1 = P.1 := ⟨P.3 Q.2, ge_of_eq⟩
_ ↔ Q ∈ {P} := sylow.ext_iff.symm.trans set.mem_singleton_iff.symm
- have : Fintype (fixed_points P.1 (Sylow p G)) :=
- by
- rw [this]
- infer_instance
+ have : Fintype (fixed_points P.1 (Sylow p G)) := by rw [this]; infer_instance
have : card (fixed_points P.1 (Sylow p G)) = 1 := by simp [this]
exact (P.2.card_modEq_card_fixedPoints (Sylow p G)).trans (by rw [this])
#align card_sylow_modeq_one card_sylow_modEq_one
@@ -521,10 +516,7 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
inv_mem_iff.1
(mem_normalizer_fintype fun n (hn : n ∈ H) =>
have : (n⁻¹ * x)⁻¹ * x ∈ H := QuotientGroup.eq.1 (ha (mem_orbit _ ⟨n⁻¹, H.inv_mem hn⟩))
- show _ ∈ H by
- rw [mul_inv_rev, inv_inv] at this
- convert this
- rw [inv_inv]),
+ show _ ∈ H by rw [mul_inv_rev, inv_inv] at this; convert this; rw [inv_inv]),
fun hx : ∀ n : G, n ∈ H ↔ x * n * x⁻¹ ∈ H =>
(mem_fixedPoints' _).2 fun y =>
Quotient.inductionOn' y fun y hy =>
@@ -543,11 +535,7 @@ def fixedPointsMulLeftCosetsEquivQuotient (H : Subgroup G) [Finite (H : Set G)]
normalizer H ⧸ Subgroup.comap ((normalizer H).Subtype : normalizer H →* G) H :=
@subtypeQuotientEquivQuotientSubtype G (normalizer H : Set G) (id _) (id _) (fixedPoints _ _)
(fun a => (@mem_fixedPoints_mul_left_cosets_iff_mem_normalizer _ _ _ ‹_› _).symm)
- (by
- intros
- rw [setoidHasEquiv]
- simp only [left_rel_apply]
- rfl)
+ (by intros ; rw [setoidHasEquiv]; simp only [left_rel_apply]; rfl)
#align sylow.fixed_points_mul_left_cosets_equiv_quotient Sylow.fixedPointsMulLeftCosetsEquivQuotient
/-- If `H` is a `p`-subgroup of `G`, then the index of `H` inside its normalizer is congruent
mathlib commit https://github.com/leanprover-community/mathlib/commit/09079525fd01b3dda35e96adaa08d2f943e1648c
@@ -503,7 +503,7 @@ universe u v w
variable {G : Type u} {α : Type v} {β : Type w} [Group G]
-attribute [local instance] Subtype.fintype setFintype Classical.propDecidable
+attribute [local instance 10] Subtype.fintype setFintype Classical.propDecidable
theorem QuotientGroup.card_preimage_mk [Fintype G] (s : Subgroup G) (t : Set (G ⧸ s)) :
Fintype.card (QuotientGroup.mk ⁻¹' t) = Fintype.card s * Fintype.card t := by
mathlib commit https://github.com/leanprover-community/mathlib/commit/da3fc4a33ff6bc75f077f691dc94c217b8d41559
@@ -357,7 +357,7 @@ variable {p} {G}
/-- Sylow subgroups are isomorphic -/
def Sylow.equivSmul (P : Sylow p G) (g : G) : P ≃* (g • P : Sylow p G) :=
- equivSmul (MulAut.conj g) ↑P
+ equivSMul (MulAut.conj g) ↑P
#align sylow.equiv_smul Sylow.equivSmul
/-- Sylow subgroups are isomorphic -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -408,7 +408,7 @@ noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Fintype (Sylow p
calc
Sylow p G ≃ (⊤ : Set (Sylow p G)) := (Equiv.Set.univ (Sylow p G)).symm
_ ≃ orbit G P := by rw [P.orbit_eq_top]
- _ ≃ G ⧸ stabilizer G P := orbitEquivQuotientStabilizer G P
+ _ ≃ G ⧸ stabilizer G P := (orbitEquivQuotientStabilizer G P)
_ ≃ G ⧸ (P : Subgroup G).normalizer := by rw [P.stabilizer_eq_normalizer]
#align sylow.equiv_quotient_normalizer Sylow.equivQuotientNormalizer
@@ -827,7 +827,7 @@ noncomputable def directProductOfNormal [Fintype G]
congr 1 with ⟨p, hp⟩
exact @card_eq_multiplicity _ _ _ p ⟨Nat.prime_of_mem_factorization hp⟩ (P p)
_ = ∏ p in ps, p ^ (card G).factorization p :=
- Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _
+ (Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _)
_ = (card G).factorization.Prod pow := rfl
_ = card G := Nat.factorization_prod_pow_eq_self Fintype.card_ne_zero
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -633,7 +633,8 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [Set.card_image_of_injective
(Subgroup.comap (mk' (H.subgroup_of H.normalizer)) (zpowers x) : Set H.normalizer)
Subtype.val_injective,
- pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, order_eq_card_zpowers, ← Fintype.card_prod]
+ pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, orderOf_eq_card_zpowers, ←
+ Fintype.card_prod]
exact @Fintype.card_congr _ _ (id _) (id _) (preimage_mk_equiv_subgroup_times_set _ _),
by
intro y hy
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -400,7 +400,7 @@ noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Finite (Sylow p
calc
Sylow p G ≃ (⊤ : Set (Sylow p G)) := (Equiv.Set.univ (Sylow p G)).symm
_ ≃ orbit G P := Equiv.setCongr P.orbit_eq_top.symm
- _ ≃ G ⧸ stabilizer G P := (orbitEquivQuotientStabilizer G P)
+ _ ≃ G ⧸ stabilizer G P := orbitEquivQuotientStabilizer G P
_ ≃ G ⧸ (P : Subgroup G).normalizer := by rw [P.stabilizer_eq_normalizer]
#align sylow.equiv_quotient_normalizer Sylow.equivQuotientNormalizer
We change the following field in the definition of an additive commutative monoid:
nsmul_succ : ∀ (n : ℕ) (x : G),
- AddMonoid.nsmul (n + 1) x = x + AddMonoid.nsmul n x
+ AddMonoid.nsmul (n + 1) x = AddMonoid.nsmul n x + x
where the latter is more natural
We adjust the definitions of ^
in monoids, groups, etc.
Originally there was a warning comment about why this natural order was preferred
use
x * npowRec n x
and notnpowRec n x * x
in the definition to make sure that definitional unfolding ofnpowRec
is blocked, to avoid deep recursion issues.
but it seems to no longer apply.
Remarks on the PR :
pow_succ
and pow_succ'
have switched their meanings.Ideal.IsPrime.mul_mem_pow
which is defined in [Mathlib/RingTheory/DedekindDomain/Ideal.lean]. Changing the order of operation forced me to add the symmetric lemma Ideal.IsPrime.mem_pow_mul
.@@ -555,7 +555,7 @@ theorem card_normalizer_modEq_card [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact p.
have : H.subgroupOf (normalizer H) ≃ H := (subgroupOfEquivOfLe le_normalizer).toEquiv
rw [card_eq_card_quotient_mul_card_subgroup H,
card_eq_card_quotient_mul_card_subgroup (H.subgroupOf (normalizer H)), Fintype.card_congr this,
- hH, pow_succ]
+ hH, pow_succ']
exact (card_quotient_normalizer_modEq_card_quotient hH).mul_right' _
#align sylow.card_normalizer_modeq_card Sylow.card_normalizer_modEq_card
@@ -613,7 +613,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [Set.card_image_of_injective
(Subgroup.comap (mk' (H.subgroupOf H.normalizer)) (zpowers x) : Set H.normalizer)
Subtype.val_injective,
- pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, ← Fintype.card_zpowers, ←
+ pow_succ, ← hH, Fintype.card_congr hequiv, ← hx, ← Fintype.card_zpowers, ←
Fintype.card_prod]
exact @Fintype.card_congr _ _ (_) (_)
(preimageMkEquivSubgroupProdSet (H.subgroupOf H.normalizer) (zpowers x)), by
@@ -685,7 +685,7 @@ lemma exists_subgroup_le_card_le {k p : ℕ} (hp : p.Prime) (h : IsPGroup p G) {
exists_nat_pow_near (Nat.one_le_iff_ne_zero.2 hk₀) hp.one_lt
obtain ⟨H', H'H, H'card⟩ := exists_subgroup_le_card_pow_prime_of_le_card hp h (hmk.trans hk)
refine ⟨H', H'H, ?_⟩
- simpa only [pow_succ, H'card] using And.intro hmk hkm
+ simpa only [pow_succ', H'card] using And.intro hmk hkm
theorem pow_dvd_card_of_pow_dvd_card [Fintype G] {p n : ℕ} [hp : Fact p.Prime] (P : Sylow p G)
(hdvd : p ^ n ∣ card G) : p ^ n ∣ card P :=
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -62,7 +62,7 @@ namespace Sylow
attribute [coe] Sylow.toSubgroup
---Porting note: Changed to `CoeOut`
+-- Porting note: Changed to `CoeOut`
instance : CoeOut (Sylow p G) (Subgroup G) :=
⟨Sylow.toSubgroup⟩
@@ -395,11 +395,11 @@ theorem Sylow.conj_eq_normalizer_conj_of_mem [Fact p.Prime] [Finite (Sylow p G)]
#align sylow.conj_eq_normalizer_conj_of_mem Sylow.conj_eq_normalizer_conj_of_mem
/-- Sylow `p`-subgroups are in bijection with cosets of the normalizer of a Sylow `p`-subgroup -/
-noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Fintype (Sylow p G)]
+noncomputable def Sylow.equivQuotientNormalizer [Fact p.Prime] [Finite (Sylow p G)]
(P : Sylow p G) : Sylow p G ≃ G ⧸ (P : Subgroup G).normalizer :=
calc
Sylow p G ≃ (⊤ : Set (Sylow p G)) := (Equiv.Set.univ (Sylow p G)).symm
- _ ≃ orbit G P := by rw [P.orbit_eq_top]
+ _ ≃ orbit G P := Equiv.setCongr P.orbit_eq_top.symm
_ ≃ G ⧸ stabilizer G P := (orbitEquivQuotientStabilizer G P)
_ ≃ G ⧸ (P : Subgroup G).normalizer := by rw [P.stabilizer_eq_normalizer]
@@ -854,7 +854,6 @@ noncomputable def directProductOfNormal [Fintype G]
(Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _)
_ = (card G).factorization.prod (· ^ ·) := rfl
_ = card G := Nat.factorization_prod_pow_eq_self Fintype.card_ne_zero
-
#align sylow.direct_product_of_normal Sylow.directProductOfNormal
end Sylow
@@ -9,6 +9,7 @@ import Mathlib.GroupTheory.GroupAction.ConjAct
import Mathlib.GroupTheory.PGroup
import Mathlib.GroupTheory.NoncommPiCoprod
import Mathlib.Order.Atoms.Finite
+import Mathlib.Data.Set.Lattice
#align_import group_theory.sylow from "leanprover-community/mathlib"@"4be589053caf347b899a494da75410deb55fb3ef"
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -658,13 +658,13 @@ then there is a subgroup of cardinality `p ^ n`. -/
lemma exists_subgroup_card_pow_prime_of_le_card {n p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
(hn : p ^ n ≤ Nat.card G) : ∃ H : Subgroup G, Nat.card H = p ^ n := by
have : Fact p.Prime := ⟨hp⟩
- have : Finite G := Nat.finite_of_card_ne_zero $ by linarith [Nat.one_le_pow n p hp.pos]
+ have : Finite G := Nat.finite_of_card_ne_zero <| by linarith [Nat.one_le_pow n p hp.pos]
cases nonempty_fintype G
obtain ⟨m, hm⟩ := h.exists_card_eq
simp_rw [Nat.card_eq_fintype_card] at hm hn ⊢
refine exists_subgroup_card_pow_prime _ ?_
rw [hm] at hn ⊢
- exact pow_dvd_pow _ $ (pow_le_pow_iff_right hp.one_lt).1 hn
+ exact pow_dvd_pow _ <| (pow_le_pow_iff_right hp.one_lt).1 hn
/-- A special case of **Sylow's first theorem**. If `G` is a `p`-group and `H` a subgroup of size at
least `p ^ n` then there is a subgroup of `H` of cardinality `p ^ n`. -/
@@ -653,25 +653,31 @@ theorem exists_subgroup_card_pow_prime [Fintype G] (p : ℕ) {n : ℕ} [Fact p.P
⟨K, hK.1⟩
#align sylow.exists_subgroup_card_pow_prime Sylow.exists_subgroup_card_pow_prime
-lemma exists_subgroup_card_pow_prime_of_le_card {m p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
- (hm : p ^ m ≤ Nat.card G) : ∃ H : Subgroup G, Nat.card H = p ^ m := by
+/-- A special case of **Sylow's first theorem**. If `G` is a `p`-group of size at least `p ^ n`
+then there is a subgroup of cardinality `p ^ n`. -/
+lemma exists_subgroup_card_pow_prime_of_le_card {n p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
+ (hn : p ^ n ≤ Nat.card G) : ∃ H : Subgroup G, Nat.card H = p ^ n := by
have : Fact p.Prime := ⟨hp⟩
- have : Finite G := Nat.finite_of_card_ne_zero $ by linarith [Nat.one_le_pow m p hp.pos]
+ have : Finite G := Nat.finite_of_card_ne_zero $ by linarith [Nat.one_le_pow n p hp.pos]
cases nonempty_fintype G
- obtain ⟨n, hn⟩ := h.exists_card_eq
- simp_rw [Nat.card_eq_fintype_card] at hn hm ⊢
+ obtain ⟨m, hm⟩ := h.exists_card_eq
+ simp_rw [Nat.card_eq_fintype_card] at hm hn ⊢
refine exists_subgroup_card_pow_prime _ ?_
- rw [hn] at hm ⊢
- exact pow_dvd_pow _ $ (pow_le_pow_iff_right hp.one_lt).1 hm
-
-lemma exists_subgroup_le_card_pow_prime_of_le_card {m p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
- {H : Subgroup G} (hm : p ^ m ≤ Nat.card H) : ∃ H' ≤ H, Nat.card H' = p ^ m := by
- obtain ⟨H', H'card⟩ := exists_subgroup_card_pow_prime_of_le_card hp (h.to_subgroup H) hm
+ rw [hm] at hn ⊢
+ exact pow_dvd_pow _ $ (pow_le_pow_iff_right hp.one_lt).1 hn
+
+/-- A special case of **Sylow's first theorem**. If `G` is a `p`-group and `H` a subgroup of size at
+least `p ^ n` then there is a subgroup of `H` of cardinality `p ^ n`. -/
+lemma exists_subgroup_le_card_pow_prime_of_le_card {n p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
+ {H : Subgroup G} (hn : p ^ n ≤ Nat.card H) : ∃ H' ≤ H, Nat.card H' = p ^ n := by
+ obtain ⟨H', H'card⟩ := exists_subgroup_card_pow_prime_of_le_card hp (h.to_subgroup H) hn
refine ⟨H'.map H.subtype, map_subtype_le _, ?_⟩
rw [← H'card]
let e : H' ≃* H'.map H.subtype := H'.equivMapOfInjective (Subgroup.subtype H) H.subtype_injective
exact Nat.card_congr e.symm.toEquiv
+/-- A special case of **Sylow's first theorem**. If `G` is a `p`-group and `H` a subgroup of size at
+least `k` then there is a subgroup of `H` of cardinality between `k / p` and `k`. -/
lemma exists_subgroup_le_card_le {k p : ℕ} (hp : p.Prime) (h : IsPGroup p G) {H : Subgroup G}
(hk : k ≤ Nat.card H) (hk₀ : k ≠ 0) : ∃ H' ≤ H, Nat.card H' ≤ k ∧ k < p * Nat.card H' := by
obtain ⟨m, hmk, hkm⟩ : ∃ s, p ^ s ≤ k ∧ k < p ^ (s + 1) :=
Prove variants of Sylow' first theorem relative to a subgroup.
From PFR
Co-authored-by: Sébastien Gouëzel <sebastien.gouezel@univ-rennes1.fr>
@@ -653,6 +653,33 @@ theorem exists_subgroup_card_pow_prime [Fintype G] (p : ℕ) {n : ℕ} [Fact p.P
⟨K, hK.1⟩
#align sylow.exists_subgroup_card_pow_prime Sylow.exists_subgroup_card_pow_prime
+lemma exists_subgroup_card_pow_prime_of_le_card {m p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
+ (hm : p ^ m ≤ Nat.card G) : ∃ H : Subgroup G, Nat.card H = p ^ m := by
+ have : Fact p.Prime := ⟨hp⟩
+ have : Finite G := Nat.finite_of_card_ne_zero $ by linarith [Nat.one_le_pow m p hp.pos]
+ cases nonempty_fintype G
+ obtain ⟨n, hn⟩ := h.exists_card_eq
+ simp_rw [Nat.card_eq_fintype_card] at hn hm ⊢
+ refine exists_subgroup_card_pow_prime _ ?_
+ rw [hn] at hm ⊢
+ exact pow_dvd_pow _ $ (pow_le_pow_iff_right hp.one_lt).1 hm
+
+lemma exists_subgroup_le_card_pow_prime_of_le_card {m p : ℕ} (hp : p.Prime) (h : IsPGroup p G)
+ {H : Subgroup G} (hm : p ^ m ≤ Nat.card H) : ∃ H' ≤ H, Nat.card H' = p ^ m := by
+ obtain ⟨H', H'card⟩ := exists_subgroup_card_pow_prime_of_le_card hp (h.to_subgroup H) hm
+ refine ⟨H'.map H.subtype, map_subtype_le _, ?_⟩
+ rw [← H'card]
+ let e : H' ≃* H'.map H.subtype := H'.equivMapOfInjective (Subgroup.subtype H) H.subtype_injective
+ exact Nat.card_congr e.symm.toEquiv
+
+lemma exists_subgroup_le_card_le {k p : ℕ} (hp : p.Prime) (h : IsPGroup p G) {H : Subgroup G}
+ (hk : k ≤ Nat.card H) (hk₀ : k ≠ 0) : ∃ H' ≤ H, Nat.card H' ≤ k ∧ k < p * Nat.card H' := by
+ obtain ⟨m, hmk, hkm⟩ : ∃ s, p ^ s ≤ k ∧ k < p ^ (s + 1) :=
+ exists_nat_pow_near (Nat.one_le_iff_ne_zero.2 hk₀) hp.one_lt
+ obtain ⟨H', H'H, H'card⟩ := exists_subgroup_le_card_pow_prime_of_le_card hp h (hmk.trans hk)
+ refine ⟨H', H'H, ?_⟩
+ simpa only [pow_succ, H'card] using And.intro hmk hkm
+
theorem pow_dvd_card_of_pow_dvd_card [Fintype G] {p n : ℕ} [hp : Fact p.Prime] (P : Sylow p G)
(hdvd : p ^ n ∣ card G) : p ^ n ∣ card P :=
(hp.1.coprime_pow_of_not_dvd
@@ -612,7 +612,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [Set.card_image_of_injective
(Subgroup.comap (mk' (H.subgroupOf H.normalizer)) (zpowers x) : Set H.normalizer)
Subtype.val_injective,
- pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, ←Fintype.card_zpowers, ←
+ pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, ← Fintype.card_zpowers, ←
Fintype.card_prod]
exact @Fintype.card_congr _ _ (_) (_)
(preimageMkEquivSubgroupProdSet (H.subgroupOf H.normalizer) (zpowers x)), by
The cardinality of a subgroup is greater than the order of any of its elements.
Rename
order_eq_card_zpowers
→ Fintype.card_zpowers
order_eq_card_zpowers'
→ Nat.card_zpowers
(and turn it around to match Nat.card_subgroupPowers
)Submonoid.powers_subset
→ Submonoid.powers_le
orderOf_dvd_card_univ
→ orderOf_dvd_card
orderOf_subgroup
→ Subgroup.orderOf
Subgroup.nonempty
→ Subgroup.coe_nonempty
@@ -430,7 +430,7 @@ theorem not_dvd_index_sylow' [hp : Fact p.Prime] (P : Sylow p G) [(P : Subgroup
letI : Fintype (G ⧸ (P : Subgroup G)) := (P : Subgroup G).fintypeQuotientOfFiniteIndex
rw [index_eq_card (P : Subgroup G)] at h
obtain ⟨x, hx⟩ := exists_prime_orderOf_dvd_card (G := G ⧸ (P : Subgroup G)) p h
- have h := IsPGroup.of_card ((orderOf_eq_card_zpowers.symm.trans hx).trans (pow_one p).symm)
+ have h := IsPGroup.of_card ((Fintype.card_zpowers.trans hx).trans (pow_one p).symm)
let Q := (zpowers x).comap (QuotientGroup.mk' (P : Subgroup G))
have hQ : IsPGroup p Q := by
apply h.comap_of_ker_isPGroup
@@ -612,7 +612,7 @@ theorem exists_subgroup_card_pow_succ [Fintype G] {p : ℕ} {n : ℕ} [hp : Fact
rw [Set.card_image_of_injective
(Subgroup.comap (mk' (H.subgroupOf H.normalizer)) (zpowers x) : Set H.normalizer)
Subtype.val_injective,
- pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, orderOf_eq_card_zpowers, ←
+ pow_succ', ← hH, Fintype.card_congr hequiv, ← hx, ←Fintype.card_zpowers, ←
Fintype.card_prod]
exact @Fintype.card_congr _ _ (_) (_)
(preimageMkEquivSubgroupProdSet (H.subgroupOf H.normalizer) (zpowers x)), by
attribute [simp] ... in
-> attribute [local simp] ... in
(#7678)
Mathlib.Logic.Unique contains the line attribute [simp] eq_iff_true_of_subsingleton in ...
:
Despite what the in
part may imply, this adds the lemma to the simp set "globally", including for downstream files; it is likely that attribute [local simp] eq_iff_true_of_subsingleton in ...
was meant instead (or maybe scoped simp
, but I think "scoped" refers to the current namespace). Indeed, the relevant lemma is not marked with @[simp]
for possible slowness: https://github.com/leanprover/std4/blob/846e9e1d6bb534774d1acd2dc430e70987da3c18/Std/Logic.lean#L749. Adding it to the simp set causes the example at https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Regression.20in.20simp to slow down.
This PR changes this and fixes the relevant downstream simp
s. There was also one ocurrence of attribute [simp] FullSubcategory.comp_def FullSubcategory.id_def in
in Mathlib.CategoryTheory.Monoidal.Subcategory but that was much easier to fix.
@@ -731,7 +731,7 @@ theorem characteristic_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (
intro Φ
show (Φ • P).toSubgroup = P.toSubgroup
congr
- simp
+ simp [eq_iff_true_of_subsingleton]
#align sylow.characteristic_of_normal Sylow.characteristic_of_normal
end Pointwise
MeasurableSpace
arguments for consistency with other lemmas.Equiv.piSubsingleton
and MulEquiv.piSubsingleton
to Equiv.piUnique
and MulEquiv.piUnique
.@@ -710,15 +710,15 @@ theorem coe_ofCard [Fintype G] {p : ℕ} [Fact p.Prime] (H : Subgroup G) [Fintyp
rfl
#align sylow.coe_of_card Sylow.coe_ofCard
-theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
- (h : (P : Subgroup G).Normal) : Subsingleton (Sylow p G) := by
- apply Subsingleton.intro
- intro Q R
+/-- If `G` has a normal Sylow `p`-subgroup, then it is the only Sylow `p`-subgroup. -/
+noncomputable def unique_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
+ (h : (P : Subgroup G).Normal) : Unique (Sylow p G) := by
+ refine { uniq := fun Q ↦ ?_ }
obtain ⟨x, h1⟩ := exists_smul_eq G P Q
- obtain ⟨x, h2⟩ := exists_smul_eq G P R
+ obtain ⟨x, h2⟩ := exists_smul_eq G P default
rw [Sylow.smul_eq_of_normal] at h1 h2
rw [← h1, ← h2]
-#align sylow.subsingleton_of_normal Sylow.subsingleton_of_normal
+#align sylow.subsingleton_of_normal Sylow.unique_of_normal
section Pointwise
@@ -726,7 +726,7 @@ open Pointwise
theorem characteristic_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : (P : Subgroup G).Characteristic := by
- haveI := Sylow.subsingleton_of_normal P h
+ haveI := Sylow.unique_of_normal P h
rw [characteristic_iff_map_eq]
intro Φ
show (Φ • P).toSubgroup = P.toSubgroup
@@ -796,9 +796,8 @@ noncomputable def directProductOfNormal [Fintype G]
apply @MulEquiv.piCongrRight ps (fun p => ∀ P : Sylow p G, P) (fun p => P p) _ _
rintro ⟨p, hp⟩
haveI hp' := Fact.mk (Nat.prime_of_mem_primeFactors hp)
- haveI := subsingleton_of_normal _ (hn (P p))
- change (∀ P : Sylow p G, P) ≃* P p
- exact MulEquiv.piSubsingleton _ _
+ letI := unique_of_normal _ (hn (P p))
+ apply MulEquiv.piUnique
show (∀ p : ps, P p) ≃* G
apply MulEquiv.ofBijective (Subgroup.noncommPiCoprod hcomm)
apply (bijective_iff_injective_and_card _).mpr
mathlib can't make up its mind on whether to spell "the prime factors of n
" as n.factors.toFinset
or n.factorization.support
, even though those two are defeq. This PR proposes to unify everything to a new definition Nat.primeFactors
, and streamline the existing scattered API about n.factors.toFinset
and n.factorization.support
to Nat.primeFactors
. We also get to write a bit more API that didn't make sense before, eg primeFactors_mono
.
@@ -778,14 +778,14 @@ of these Sylow subgroups.
-/
noncomputable def directProductOfNormal [Fintype G]
(hn : ∀ {p : ℕ} [Fact p.Prime] (P : Sylow p G), (↑P : Subgroup G).Normal) :
- (∀ p : (card G).factorization.support, ∀ P : Sylow p G, (↑P : Subgroup G)) ≃* G := by
- set ps := (Fintype.card G).factorization.support
+ (∀ p : (card G).primeFactors, ∀ P : Sylow p G, (↑P : Subgroup G)) ≃* G := by
+ set ps := (Fintype.card G).primeFactors
-- “The” Sylow subgroup for p
let P : ∀ p, Sylow p G := default
have hcomm : Pairwise fun p₁ p₂ : ps => ∀ x y : G, x ∈ P p₁ → y ∈ P p₂ → Commute x y := by
rintro ⟨p₁, hp₁⟩ ⟨p₂, hp₂⟩ hne
- haveI hp₁' := Fact.mk (Nat.prime_of_mem_factorization hp₁)
- haveI hp₂' := Fact.mk (Nat.prime_of_mem_factorization hp₂)
+ haveI hp₁' := Fact.mk (Nat.prime_of_mem_primeFactors hp₁)
+ haveI hp₂' := Fact.mk (Nat.prime_of_mem_primeFactors hp₂)
have hne' : p₁ ≠ p₂ := by simpa using hne
apply Subgroup.commute_of_normal_of_disjoint _ _ (hn (P p₁)) (hn (P p₂))
apply IsPGroup.disjoint_of_ne p₁ p₂ hne' _ _ (P p₁).isPGroup' (P p₂).isPGroup'
@@ -795,7 +795,7 @@ noncomputable def directProductOfNormal [Fintype G]
· -- here we need to help the elaborator with an explicit instantiation
apply @MulEquiv.piCongrRight ps (fun p => ∀ P : Sylow p G, P) (fun p => P p) _ _
rintro ⟨p, hp⟩
- haveI hp' := Fact.mk (Nat.prime_of_mem_factorization hp)
+ haveI hp' := Fact.mk (Nat.prime_of_mem_primeFactors hp)
haveI := subsingleton_of_normal _ (hn (P p))
change (∀ P : Sylow p G, P) ≃* P p
exact MulEquiv.piSubsingleton _ _
@@ -807,8 +807,8 @@ noncomputable def directProductOfNormal [Fintype G]
· apply Subgroup.injective_noncommPiCoprod_of_independent
apply independent_of_coprime_order hcomm
rintro ⟨p₁, hp₁⟩ ⟨p₂, hp₂⟩ hne
- haveI hp₁' := Fact.mk (Nat.prime_of_mem_factorization hp₁)
- haveI hp₂' := Fact.mk (Nat.prime_of_mem_factorization hp₂)
+ haveI hp₁' := Fact.mk (Nat.prime_of_mem_primeFactors hp₁)
+ haveI hp₂' := Fact.mk (Nat.prime_of_mem_primeFactors hp₂)
have hne' : p₁ ≠ p₂ := by simpa using hne
apply IsPGroup.coprime_card_of_ne p₁ p₂ hne' _ _ (P p₁).isPGroup' (P p₂).isPGroup'
show card (∀ p : ps, P p) = card G
@@ -816,7 +816,7 @@ noncomputable def directProductOfNormal [Fintype G]
card (∀ p : ps, P p) = ∏ p : ps, card (P p) := Fintype.card_pi
_ = ∏ p : ps, p.1 ^ (card G).factorization p.1 := by
congr 1 with ⟨p, hp⟩
- exact @card_eq_multiplicity _ _ _ p ⟨Nat.prime_of_mem_factorization hp⟩ (P p)
+ exact @card_eq_multiplicity _ _ _ p ⟨Nat.prime_of_mem_primeFactors hp⟩ (P p)
_ = ∏ p in ps, p ^ (card G).factorization p :=
(Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _)
_ = (card G).factorization.prod (· ^ ·) := rfl
MulAction.Stabilizer
and AddAction.Stabilizer
, renaming MulAction.Stabilizer.submonoid
to MulAction.stabilizerSubmonoid
.@@ -503,7 +503,7 @@ namespace Sylow
theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Finite (H : Set G)]
{x : G} : (x : G ⧸ H) ∈ MulAction.fixedPoints H (G ⧸ H) ↔ x ∈ normalizer H :=
⟨fun hx =>
- have ha : ∀ {y : G ⧸ H}, y ∈ orbit H (x : G ⧸ H) → y = x := (mem_fixedPoints' _).1 hx _
+ have ha : ∀ {y : G ⧸ H}, y ∈ orbit H (x : G ⧸ H) → y = x := mem_fixedPoints'.1 hx _
(inv_mem_iff (G := G)).1
(mem_normalizer_fintype fun n (hn : n ∈ H) =>
have : (n⁻¹ * x)⁻¹ * x ∈ H := QuotientGroup.eq.1 (ha ⟨⟨n⁻¹, inv_mem hn⟩, rfl⟩)
@@ -512,7 +512,7 @@ theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Fin
convert this
rw [inv_inv]),
fun hx : ∀ n : G, n ∈ H ↔ x * n * x⁻¹ ∈ H =>
- (mem_fixedPoints' _).2 fun y =>
+ mem_fixedPoints'.2 fun y =>
Quotient.inductionOn' y fun y hy =>
QuotientGroup.eq.2
(let ⟨⟨b, hb₁⟩, hb₂⟩ := hy
@@ -500,9 +500,6 @@ theorem QuotientGroup.card_preimage_mk [Fintype G] (s : Subgroup G) (t : Set (G
#align quotient_group.card_preimage_mk QuotientGroup.card_preimage_mk
namespace Sylow
-
-open Subgroup Submonoid MulAction
-
theorem mem_fixedPoints_mul_left_cosets_iff_mem_normalizer {H : Subgroup G} [Finite (H : Set G)]
{x : G} : (x : G ⧸ H) ∈ MulAction.fixedPoints H (G ⧸ H) ↔ x ∈ normalizer H :=
⟨fun hx =>
@@ -672,7 +672,7 @@ theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G
/-- Sylow subgroups are Hall subgroups. -/
theorem card_coprime_index [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
- (card P).coprime (index (P : Subgroup G)) :=
+ (card P).Coprime (index (P : Subgroup G)) :=
let ⟨_n, hn⟩ := IsPGroup.iff_card.mp P.2
hn.symm ▸ (hp.1.coprime_pow_of_not_dvd (not_dvd_index_sylow P index_ne_zero_of_finite)).symm
#align sylow.card_coprime_index Sylow.card_coprime_index
@@ -672,7 +672,7 @@ theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G
/-- Sylow subgroups are Hall subgroups. -/
theorem card_coprime_index [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
- (card P).Coprime (index (P : Subgroup G)) :=
+ (card P).coprime (index (P : Subgroup G)) :=
let ⟨_n, hn⟩ := IsPGroup.iff_card.mp P.2
hn.symm ▸ (hp.1.coprime_pow_of_not_dvd (not_dvd_index_sylow P index_ne_zero_of_finite)).symm
#align sylow.card_coprime_index Sylow.card_coprime_index
Some changes have already been review and delegated in #6910 and #7148.
The diff that needs looking at is https://github.com/leanprover-community/mathlib4/pull/7174/commits/64d6d07ee18163627c8f517eb31455411921c5ac
The std bump PR was insta-merged already!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -672,7 +672,7 @@ theorem dvd_card_of_dvd_card [Fintype G] {p : ℕ} [Fact p.Prime] (P : Sylow p G
/-- Sylow subgroups are Hall subgroups. -/
theorem card_coprime_index [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
- (card P).coprime (index (P : Subgroup G)) :=
+ (card P).Coprime (index (P : Subgroup G)) :=
let ⟨_n, hn⟩ := IsPGroup.iff_card.mp P.2
hn.symm ▸ (hp.1.coprime_pow_of_not_dvd (not_dvd_index_sylow P index_ne_zero_of_finite)).symm
#align sylow.card_coprime_index Sylow.card_coprime_index
Function.Commute
(#6456)
This PR protects Function.Commute
, so that it no longer clashes with Commute
in the root namespace, as suggested by @j-loreaux in #6290.
@@ -785,7 +785,7 @@ noncomputable def directProductOfNormal [Fintype G]
set ps := (Fintype.card G).factorization.support
-- “The” Sylow subgroup for p
let P : ∀ p, Sylow p G := default
- have hcomm : Pairwise fun p₁ p₂ : ps => ∀ x y : G, x ∈ P p₁ → y ∈ P p₂ → _root_.Commute x y := by
+ have hcomm : Pairwise fun p₁ p₂ : ps => ∀ x y : G, x ∈ P p₁ → y ∈ P p₂ → Commute x y := by
rintro ⟨p₁, hp₁⟩ ⟨p₂, hp₂⟩ hne
haveI hp₁' := Fact.mk (Nat.prime_of_mem_factorization hp₁)
haveI hp₂' := Fact.mk (Nat.prime_of_mem_factorization hp₂)
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -47,7 +47,7 @@ open Fintype MulAction Subgroup
section InfiniteSylow
-variable (p : ℕ) (G : Type _) [Group G]
+variable (p : ℕ) (G : Type*) [Group G]
/-- A Sylow `p`-subgroup is a maximal `p`-subgroup. -/
structure Sylow extends Subgroup G where
@@ -91,11 +91,11 @@ instance : SubgroupClass (Sylow p G) G where
variable (P : Sylow p G)
/-- The action by a Sylow subgroup is the action by the underlying group. -/
-instance mulActionLeft {α : Type _} [MulAction G α] : MulAction P α :=
+instance mulActionLeft {α : Type*} [MulAction G α] : MulAction P α :=
inferInstanceAs (MulAction (P : Subgroup G) α)
#align sylow.mul_action_left Sylow.mulActionLeft
-variable {K : Type _} [Group K] (ϕ : K →* G) {N : Subgroup G}
+variable {K : Type*} [Group K] (ϕ : K →* G) {N : Subgroup G}
/-- The preimage of a Sylow subgroup under a p-group-kernel homomorphism is a Sylow subgroup. -/
def comapOfKerIsPGroup (hϕ : IsPGroup p ϕ.ker) (h : ↑P ≤ ϕ.range) : Sylow p K :=
@@ -169,13 +169,13 @@ noncomputable instance Sylow.inhabited : Inhabited (Sylow p G) :=
Classical.inhabited_of_nonempty Sylow.nonempty
#align sylow.inhabited Sylow.inhabited
-theorem Sylow.exists_comap_eq_of_ker_isPGroup {H : Type _} [Group H] (P : Sylow p H) {f : H →* G}
+theorem Sylow.exists_comap_eq_of_ker_isPGroup {H : Type*} [Group H] (P : Sylow p H) {f : H →* G}
(hf : IsPGroup p f.ker) : ∃ Q : Sylow p G, (Q : Subgroup G).comap f = P :=
Exists.imp (fun Q hQ => P.3 (Q.2.comap_of_ker_isPGroup f hf) (map_le_iff_le_comap.mp hQ))
(P.2.map f).exists_le_sylow
#align sylow.exists_comap_eq_of_ker_is_p_group Sylow.exists_comap_eq_of_ker_isPGroup
-theorem Sylow.exists_comap_eq_of_injective {H : Type _} [Group H] (P : Sylow p H) {f : H →* G}
+theorem Sylow.exists_comap_eq_of_injective {H : Type*} [Group H] (P : Sylow p H) {f : H →* G}
(hf : Function.Injective f) : ∃ Q : Sylow p G, (Q : Subgroup G).comap f = P :=
P.exists_comap_eq_of_ker_isPGroup (IsPGroup.ker_isPGroup_of_injective hf)
#align sylow.exists_comap_eq_of_injective Sylow.exists_comap_eq_of_injective
@@ -187,7 +187,7 @@ theorem Sylow.exists_comap_subtype_eq {H : Subgroup G} (P : Sylow p H) :
/-- If the kernel of `f : H →* G` is a `p`-group,
then `Fintype (Sylow p G)` implies `Fintype (Sylow p H)`. -/
-noncomputable def Sylow.fintypeOfKerIsPGroup {H : Type _} [Group H] {f : H →* G}
+noncomputable def Sylow.fintypeOfKerIsPGroup {H : Type*} [Group H] {f : H →* G}
(hf : IsPGroup p f.ker) [Fintype (Sylow p G)] : Fintype (Sylow p H) :=
let h_exists := fun P : Sylow p H => P.exists_comap_eq_of_ker_isPGroup hf
let g : Sylow p H → Sylow p G := fun P => Classical.choose (h_exists P)
@@ -196,7 +196,7 @@ noncomputable def Sylow.fintypeOfKerIsPGroup {H : Type _} [Group H] {f : H →*
#align sylow.fintype_of_ker_is_p_group Sylow.fintypeOfKerIsPGroup
/-- If `f : H →* G` is injective, then `Fintype (Sylow p G)` implies `Fintype (Sylow p H)`. -/
-noncomputable def Sylow.fintypeOfInjective {H : Type _} [Group H] {f : H →* G}
+noncomputable def Sylow.fintypeOfInjective {H : Type*} [Group H] {f : H →* G}
(hf : Function.Injective f) [Fintype (Sylow p G)] : Fintype (Sylow p H) :=
Sylow.fintypeOfKerIsPGroup (IsPGroup.ker_isPGroup_of_injective hf)
#align sylow.fintype_of_injective Sylow.fintypeOfInjective
@@ -213,7 +213,7 @@ instance (H : Subgroup G) [Finite (Sylow p G)] : Finite (Sylow p H) := by
open Pointwise
/-- `Subgroup.pointwiseMulAction` preserves Sylow subgroups. -/
-instance Sylow.pointwiseMulAction {α : Type _} [Group α] [MulDistribMulAction α G] :
+instance Sylow.pointwiseMulAction {α : Type*} [Group α] [MulDistribMulAction α G] :
MulAction α (Sylow p G) where
smul g P :=
⟨(g • P.toSubgroup : Subgroup G), P.2.map _, fun {Q} hQ hS =>
@@ -225,7 +225,7 @@ instance Sylow.pointwiseMulAction {α : Type _} [Group α] [MulDistribMulAction
mul_smul g h P := Sylow.ext (mul_smul g h P.toSubgroup)
#align sylow.pointwise_mul_action Sylow.pointwiseMulAction
-theorem Sylow.pointwise_smul_def {α : Type _} [Group α] [MulDistribMulAction α G] {g : α}
+theorem Sylow.pointwise_smul_def {α : Type*} [Group α] [MulDistribMulAction α G] {g : α}
{P : Sylow p G} : ↑(g • P) = g • (P : Subgroup G) :=
rfl
#align sylow.pointwise_smul_def Sylow.pointwise_smul_def
@@ -10,7 +10,7 @@ import Mathlib.GroupTheory.PGroup
import Mathlib.GroupTheory.NoncommPiCoprod
import Mathlib.Order.Atoms.Finite
-#align_import group_theory.sylow from "leanprover-community/mathlib"@"bd365b1a4901dbd878e86cb146c2bd86533df468"
+#align_import group_theory.sylow from "leanprover-community/mathlib"@"4be589053caf347b899a494da75410deb55fb3ef"
/-!
# Sylow theorems
@@ -370,17 +370,18 @@ theorem Sylow.stabilizer_eq_normalizer (P : Sylow p G) :
#align sylow.stabilizer_eq_normalizer Sylow.stabilizer_eq_normalizer
theorem Sylow.conj_eq_normalizer_conj_of_mem_centralizer [Fact p.Prime] [Finite (Sylow p G)]
- (P : Sylow p G) (x g : G) (hx : x ∈ (P : Subgroup G).centralizer)
- (hy : g⁻¹ * x * g ∈ (P : Subgroup G).centralizer) :
+ (P : Sylow p G) (x g : G) (hx : x ∈ centralizer (P : Set G))
+ (hy : g⁻¹ * x * g ∈ centralizer (P : Set G)) :
∃ n ∈ (P : Subgroup G).normalizer, g⁻¹ * x * g = n⁻¹ * x * n := by
- have h1 : ↑P ≤ (zpowers x).centralizer := by rwa [le_centralizer_iff, zpowers_le]
- have h2 : ↑(g • P) ≤ (zpowers x).centralizer := by
+ have h1 : ↑P ≤ centralizer (zpowers x : Set G) := by rwa [le_centralizer_iff, zpowers_le]
+ have h2 : ↑(g • P) ≤ centralizer (zpowers x : Set G) := by
rw [le_centralizer_iff, zpowers_le]
rintro - ⟨z, hz, rfl⟩
specialize hy z hz
rwa [← mul_assoc, ← eq_mul_inv_iff_mul_eq, mul_assoc, mul_assoc, mul_assoc, ← mul_assoc,
eq_inv_mul_iff_mul_eq, ← mul_assoc, ← mul_assoc] at hy
- obtain ⟨h, hh⟩ := exists_smul_eq (zpowers x).centralizer ((g • P).subtype h2) (P.subtype h1)
+ obtain ⟨h, hh⟩ :=
+ exists_smul_eq (centralizer (zpowers x : Set G)) ((g • P).subtype h2) (P.subtype h1)
simp_rw [Sylow.smul_subtype, Subgroup.smul_def, smul_smul] at hh
refine' ⟨h * g, Sylow.smul_eq_iff_mem_normalizer.mp (Sylow.subtype_injective hh), _⟩
rw [← mul_assoc, Commute.right_comm (h.prop x (mem_zpowers x)), mul_inv_rev, inv_mul_cancel_right]
@@ -821,7 +821,7 @@ noncomputable def directProductOfNormal [Fintype G]
exact @card_eq_multiplicity _ _ _ p ⟨Nat.prime_of_mem_factorization hp⟩ (P p)
_ = ∏ p in ps, p ^ (card G).factorization p :=
(Finset.prod_finset_coe (fun p => p ^ (card G).factorization p) _)
- _ = (card G).factorization.prod (. ^ .) := rfl
+ _ = (card G).factorization.prod (· ^ ·) := rfl
_ = card G := Nat.factorization_prod_pow_eq_self Fintype.card_ne_zero
#align sylow.direct_product_of_normal Sylow.directProductOfNormal
@@ -2,11 +2,6 @@
Copyright (c) 2018 Chris Hughes. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
-
-! This file was ported from Lean 3 source module group_theory.sylow
-! leanprover-community/mathlib commit bd365b1a4901dbd878e86cb146c2bd86533df468
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Data.Nat.Factorization.Basic
import Mathlib.Data.SetLike.Fintype
@@ -15,6 +10,8 @@ import Mathlib.GroupTheory.PGroup
import Mathlib.GroupTheory.NoncommPiCoprod
import Mathlib.Order.Atoms.Finite
+#align_import group_theory.sylow from "leanprover-community/mathlib"@"bd365b1a4901dbd878e86cb146c2bd86533df468"
+
/-!
# Sylow theorems
Port https://github.com/leanprover-community/mathlib/pull/18300 to mathlib4
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
! This file was ported from Lean 3 source module group_theory.sylow
-! leanprover-community/mathlib commit c55911f6166b348e1c72b08c8664e3af5f1ce334
+! leanprover-community/mathlib commit bd365b1a4901dbd878e86cb146c2bd86533df468
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -37,7 +37,7 @@ The Sylow theorems are the following results for every finite group `G` and ever
there exists a subgroup of `G` of order `pⁿ`.
* `IsPGroup.exists_le_sylow`: A generalization of Sylow's first theorem:
Every `p`-subgroup is contained in a Sylow `p`-subgroup.
-* `Sylow.card_eq_multiplicity`: The cardinality of a Sylow group is `p ^ n`
+* `Sylow.card_eq_multiplicity`: The cardinality of a Sylow subgroup is `p ^ n`
where `n` is the multiplicity of `p` in the group order.
* `sylow_conjugate`: A generalization of Sylow's second theorem:
If the number of Sylow `p`-subgroups is finite, then all Sylow `p`-subgroups are conjugate.
@@ -686,7 +686,7 @@ theorem ne_bot_of_dvd_card [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow
rwa [h, card_bot] at key
#align sylow.ne_bot_of_dvd_card Sylow.ne_bot_of_dvd_card
-/-- The cardinality of a Sylow group is `p ^ n`
+/-- The cardinality of a Sylow subgroup is `p ^ n`
where `n` is the multiplicity of `p` in the group order. -/
theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylow p G) :
card P = p ^ Nat.factorization (card G) p := by
@@ -696,6 +696,25 @@ theorem card_eq_multiplicity [Fintype G] {p : ℕ} [hp : Fact p.Prime] (P : Sylo
exact P.1.card_subgroup_dvd_card
#align sylow.card_eq_multiplicity Sylow.card_eq_multiplicity
+/-- A subgroup with cardinality `p ^ n` is a Sylow subgroup
+ where `n` is the multiplicity of `p` in the group order. -/
+def ofCard [Fintype G] {p : ℕ} [Fact p.Prime] (H : Subgroup G) [Fintype H]
+ (card_eq : card H = p ^ (card G).factorization p) : Sylow p G
+ where
+ toSubgroup := H
+ isPGroup' := IsPGroup.of_card card_eq
+ is_maximal' := by
+ obtain ⟨P, hHP⟩ := (IsPGroup.of_card card_eq).exists_le_sylow
+ exact SetLike.ext'
+ (Set.eq_of_subset_of_card_le hHP (P.card_eq_multiplicity.trans card_eq.symm).le).symm ▸ P.3
+#align sylow.of_card Sylow.ofCard
+
+@[simp, norm_cast]
+theorem coe_ofCard [Fintype G] {p : ℕ} [Fact p.Prime] (H : Subgroup G) [Fintype H]
+ (card_eq : card H = p ^ (card G).factorization p) : ↑(ofCard H card_eq) = H :=
+ rfl
+#align sylow.coe_of_card Sylow.coe_ofCard
+
theorem subsingleton_of_normal {p : ℕ} [Fact p.Prime] [Finite (Sylow p G)] (P : Sylow p G)
(h : (P : Subgroup G).Normal) : Subsingleton (Sylow p G) := by
apply Subsingleton.intro
@@ -759,14 +778,14 @@ theorem normal_of_normalizerCondition (hnc : NormalizerCondition G) {p : ℕ} [F
open BigOperators
-/-- If all its sylow groups are normal, then a finite group is isomorphic to the direct product
-of these sylow groups.
+/-- If all its Sylow subgroups are normal, then a finite group is isomorphic to the direct product
+of these Sylow subgroups.
-/
noncomputable def directProductOfNormal [Fintype G]
(hn : ∀ {p : ℕ} [Fact p.Prime] (P : Sylow p G), (↑P : Subgroup G).Normal) :
(∀ p : (card G).factorization.support, ∀ P : Sylow p G, (↑P : Subgroup G)) ≃* G := by
set ps := (Fintype.card G).factorization.support
- -- “The” sylow group for p
+ -- “The” Sylow subgroup for p
let P : ∀ p, Sylow p G := default
have hcomm : Pairwise fun p₁ p₂ : ps => ∀ x y : G, x ∈ P p₁ → y ∈ P p₂ → _root_.Commute x y := by
rintro ⟨p₁, hp₁⟩ ⟨p₂, hp₂⟩ hne
@@ -776,7 +795,7 @@ noncomputable def directProductOfNormal [Fintype G]
apply Subgroup.commute_of_normal_of_disjoint _ _ (hn (P p₁)) (hn (P p₂))
apply IsPGroup.disjoint_of_ne p₁ p₂ hne' _ _ (P p₁).isPGroup' (P p₂).isPGroup'
refine' MulEquiv.trans (N := ∀ p : ps, P p) _ _
- -- There is only one sylow group for each p, so the inner product is trivial
+ -- There is only one Sylow subgroup for each p, so the inner product is trivial
show (∀ p : ps, ∀ P : Sylow p G, P) ≃* ∀ p : ps, P p
· -- here we need to help the elaborator with an explicit instantiation
apply @MulEquiv.piCongrRight ps (fun p => ∀ P : Sylow p G, P) (fun p => P p) _ _
at
and goals (#5387)
Changes are of the form
some_tactic at h⊢
-> some_tactic at h ⊢
some_tactic at h
-> some_tactic at h
@@ -139,7 +139,7 @@ theorem coe_subtype (h : ↑P ≤ N) : ↑(P.subtype h) = subgroupOf (↑P) N :=
theorem subtype_injective {P Q : Sylow p G} {hP : ↑P ≤ N} {hQ : ↑Q ≤ N}
(h : P.subtype hP = Q.subtype hQ) : P = Q := by
- rw [SetLike.ext_iff] at h⊢
+ rw [SetLike.ext_iff] at h ⊢
exact fun g => ⟨fun hg => (h ⟨g, hP hg⟩).mp hg, fun hg => (h ⟨g, hQ hg⟩).mpr hg⟩
#align sylow.subtype_injective Sylow.subtype_injective
@@ -159,7 +159,7 @@ theorem IsPGroup.exists_le_sylow {P : Subgroup G} (hP : IsPGroup p P) : ∃ Q :
⟨R, ⟨R, rfl⟩, R.1.mul_mem hg (T hh)⟩ },
fun ⟨g, _, ⟨S, rfl⟩, hg⟩ => by
refine' Exists.imp (fun k hk => _) (hc1 S.2 ⟨g, hg⟩)
- rwa [Subtype.ext_iff, coe_pow] at hk⊢, fun M hM g hg => ⟨M, ⟨⟨M, hM⟩, rfl⟩, hg⟩⟩)
+ rwa [Subtype.ext_iff, coe_pow] at hk ⊢, fun M hM g hg => ⟨M, ⟨⟨M, hM⟩, rfl⟩, hg⟩⟩)
P hP)
fun {Q} ⟨hQ1, hQ2, hQ3⟩ => ⟨⟨Q, hQ1, hQ3 _⟩, hQ2⟩
#align is_p_group.exists_le_sylow IsPGroup.exists_le_sylow
The unported dependencies are