group_theory.p_group
⟷
Mathlib.GroupTheory.PGroup
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)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -3,7 +3,7 @@ Copyright (c) 2018 . All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
-/
-import Data.Zmod.Basic
+import Data.ZMod.Basic
import GroupTheory.Index
import GroupTheory.GroupAction.ConjAct
import GroupTheory.GroupAction.Quotient
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -201,7 +201,7 @@ theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p
let ⟨k, hk⟩ := iff_card.1 hG
⟨k,
Nat.pos_of_ne_zero fun hk0 => by
- rw [hk0, pow_zero] at hk <;> exact fintype.one_lt_card.ne' hk,
+ rw [hk0, pow_zero] at hk <;> exact fintype.one_lt_card.ne' hk,
hk⟩,
fun ⟨k, hk0, hk⟩ =>
one_lt_card_iff_nontrivial.1 <| hk.symm ▸ one_lt_pow (Fact.out p.Prime).one_lt (ne_of_gt hk0)⟩
@@ -299,7 +299,7 @@ theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.cente
classical
cases nonempty_fintype G
have := (hG.of_equiv ConjAct.toConjAct).exists_fixed_point_of_prime_dvd_card_of_fixed_point G
- rw [ConjAct.fixedPoints_eq_center] at this
+ rw [ConjAct.fixedPoints_eq_center] at this
obtain ⟨g, hg⟩ := this _ (Subgroup.center G).one_mem
· exact ⟨⟨1, ⟨g, hg.1⟩, mt subtype.ext_iff.mp hg.2⟩⟩
· obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
@@ -352,9 +352,9 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
by
intro g
obtain ⟨j, hj⟩ := hH ⟨ϕ g.1, g.2⟩
- rw [Subtype.ext_iff, H.coe_pow, Subtype.coe_mk, ← ϕ.map_pow] at hj
+ rw [Subtype.ext_iff, H.coe_pow, Subtype.coe_mk, ← ϕ.map_pow] at hj
obtain ⟨k, hk⟩ := hϕ ⟨g.1 ^ p ^ j, hj⟩
- rwa [Subtype.ext_iff, ϕ.ker.coe_pow, Subtype.coe_mk, ← pow_mul, ← pow_add] at hk
+ rwa [Subtype.ext_iff, ϕ.ker.coe_pow, Subtype.coe_mk, ← pow_mul, ← pow_add] at hk
exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
-/
@@ -439,7 +439,7 @@ theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact
intro x hx₁ hx₂
obtain ⟨n₁, hn₁⟩ := iff_order_of.mp hH₁ ⟨x, hx₁⟩
obtain ⟨n₂, hn₂⟩ := iff_order_of.mp hH₂ ⟨x, hx₂⟩
- rw [← Subgroup.orderOf_coe, Subgroup.coe_mk] at hn₁ hn₂
+ rw [← Subgroup.orderOf_coe, Subgroup.coe_mk] at hn₁ hn₂
have : p₁ ^ n₁ = p₂ ^ n₂ := by rw [← hn₁, ← hn₂]
rcases n₁.eq_zero_or_pos with (rfl | hn₁)
· simpa using hn₁
@@ -471,10 +471,10 @@ theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
IsCyclic (G ⧸ center G) := by
classical
rcases card_center_eq_prime_pow hG zero_lt_two with ⟨k, hk0, hk⟩
- rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
+ rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
have hk2 := (Nat.pow_dvd_pow_iff_le_right (Fact.out p.prime).one_lt).1 ⟨_, hG.symm⟩
interval_cases
- · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
+ · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
exact isCyclic_of_prime_card hG
·
exact
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -227,7 +227,38 @@ variable (α) [Fintype α]
/-- If `G` is a `p`-group acting on a finite set `α`, then the number of fixed points
of the action is congruent mod `p` to the cardinality of `α` -/
theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
- card α ≡ card (fixedPoints G α) [MOD p] := by classical
+ card α ≡ card (fixedPoints G α) [MOD p] := by
+ classical
+ calc
+ card α = card (Σ y : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
+ card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbit_rel G α))).symm
+ _ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
+ _ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
+ _ = _ := by simp <;> rfl
+ rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
+ have key :
+ ∀ x,
+ card { y // (Quotient.mk'' y : Quotient (orbit_rel G α)) = Quotient.mk'' x } =
+ card (orbit G x) :=
+ fun x => by simp only [Quotient.eq''] <;> congr
+ refine'
+ Eq.symm
+ (Finset.sum_bij_ne_zero (fun a _ _ => Quotient.mk'' a.1) (fun _ _ _ => Finset.mem_univ _)
+ (fun a₁ a₂ _ _ _ _ h => Subtype.eq ((mem_fixed_points' α).mp a₂.2 a₁.1 (Quotient.exact' h)))
+ (fun b => Quotient.inductionOn' b fun b _ hb => _) fun a ha _ => by
+ rw [key, mem_fixed_points_iff_card_orbit_eq_one.mp a.2])
+ obtain ⟨k, hk⟩ := hG.card_orbit b
+ have : k = 0 :=
+ le_zero_iff.1
+ (Nat.le_of_lt_succ
+ (lt_of_not_ge
+ (mt (pow_dvd_pow p)
+ (by
+ rwa [pow_one, ← hk, ← Nat.modEq_zero_iff_dvd, ← ZMod.eq_iff_modEq_nat, ← key,
+ Nat.cast_zero]))))
+ exact
+ ⟨⟨b, mem_fixed_points_iff_card_orbit_eq_one.2 <| by rw [hk, this, pow_zero]⟩, Finset.mem_univ _,
+ ne_of_eq_of_ne Nat.cast_one one_ne_zero, rfl⟩
#align is_p_group.card_modeq_card_fixed_points IsPGroup.card_modEq_card_fixedPoints
-/
@@ -264,7 +295,15 @@ theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card
-/
#print IsPGroup.center_nontrivial /-
-theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by classical
+theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by
+ classical
+ cases nonempty_fintype G
+ have := (hG.of_equiv ConjAct.toConjAct).exists_fixed_point_of_prime_dvd_card_of_fixed_point G
+ rw [ConjAct.fixedPoints_eq_center] at this
+ obtain ⟨g, hg⟩ := this _ (Subgroup.center G).one_mem
+ · exact ⟨⟨1, ⟨g, hg.1⟩, mt subtype.ext_iff.mp hg.2⟩⟩
+ · obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
+ exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
#align is_p_group.center_nontrivial IsPGroup.center_nontrivial
-/
@@ -273,7 +312,8 @@ theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
by
haveI := center_nontrivial hG
cases nonempty_fintype G
- classical
+ classical exact
+ bot_lt_iff_ne_bot.mpr ((Subgroup.center G).one_lt_card_iff_ne_bot.mp Fintype.one_lt_card)
#align is_p_group.bot_lt_center IsPGroup.bot_lt_center
-/
@@ -428,7 +468,20 @@ theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
#print IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq /-
/-- The quotient by the center of a group of cardinality `p ^ 2` is cyclic. -/
theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
- IsCyclic (G ⧸ center G) := by classical
+ IsCyclic (G ⧸ center G) := by
+ classical
+ rcases card_center_eq_prime_pow hG zero_lt_two with ⟨k, hk0, hk⟩
+ rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
+ have hk2 := (Nat.pow_dvd_pow_iff_le_right (Fact.out p.prime).one_lt).1 ⟨_, hG.symm⟩
+ interval_cases
+ · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
+ exact isCyclic_of_prime_card hG
+ ·
+ exact
+ @isCyclic_of_subsingleton _ _
+ ⟨Fintype.card_le_one_iff.1
+ (mul_right_injective₀ (pow_ne_zero 2 (NeZero.ne p))
+ (hG.trans (mul_one (p ^ 2)).symm)).le⟩
#align is_p_group.cyclic_center_quotient_of_card_eq_prime_sq IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -227,38 +227,7 @@ variable (α) [Fintype α]
/-- If `G` is a `p`-group acting on a finite set `α`, then the number of fixed points
of the action is congruent mod `p` to the cardinality of `α` -/
theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
- card α ≡ card (fixedPoints G α) [MOD p] := by
- classical
- calc
- card α = card (Σ y : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
- card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbit_rel G α))).symm
- _ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
- _ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
- _ = _ := by simp <;> rfl
- rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
- have key :
- ∀ x,
- card { y // (Quotient.mk'' y : Quotient (orbit_rel G α)) = Quotient.mk'' x } =
- card (orbit G x) :=
- fun x => by simp only [Quotient.eq''] <;> congr
- refine'
- Eq.symm
- (Finset.sum_bij_ne_zero (fun a _ _ => Quotient.mk'' a.1) (fun _ _ _ => Finset.mem_univ _)
- (fun a₁ a₂ _ _ _ _ h => Subtype.eq ((mem_fixed_points' α).mp a₂.2 a₁.1 (Quotient.exact' h)))
- (fun b => Quotient.inductionOn' b fun b _ hb => _) fun a ha _ => by
- rw [key, mem_fixed_points_iff_card_orbit_eq_one.mp a.2])
- obtain ⟨k, hk⟩ := hG.card_orbit b
- have : k = 0 :=
- le_zero_iff.1
- (Nat.le_of_lt_succ
- (lt_of_not_ge
- (mt (pow_dvd_pow p)
- (by
- rwa [pow_one, ← hk, ← Nat.modEq_zero_iff_dvd, ← ZMod.eq_iff_modEq_nat, ← key,
- Nat.cast_zero]))))
- exact
- ⟨⟨b, mem_fixed_points_iff_card_orbit_eq_one.2 <| by rw [hk, this, pow_zero]⟩, Finset.mem_univ _,
- ne_of_eq_of_ne Nat.cast_one one_ne_zero, rfl⟩
+ card α ≡ card (fixedPoints G α) [MOD p] := by classical
#align is_p_group.card_modeq_card_fixed_points IsPGroup.card_modEq_card_fixedPoints
-/
@@ -295,15 +264,7 @@ theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card
-/
#print IsPGroup.center_nontrivial /-
-theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by
- classical
- cases nonempty_fintype G
- have := (hG.of_equiv ConjAct.toConjAct).exists_fixed_point_of_prime_dvd_card_of_fixed_point G
- rw [ConjAct.fixedPoints_eq_center] at this
- obtain ⟨g, hg⟩ := this _ (Subgroup.center G).one_mem
- · exact ⟨⟨1, ⟨g, hg.1⟩, mt subtype.ext_iff.mp hg.2⟩⟩
- · obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
- exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
+theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by classical
#align is_p_group.center_nontrivial IsPGroup.center_nontrivial
-/
@@ -312,8 +273,7 @@ theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
by
haveI := center_nontrivial hG
cases nonempty_fintype G
- classical exact
- bot_lt_iff_ne_bot.mpr ((Subgroup.center G).one_lt_card_iff_ne_bot.mp Fintype.one_lt_card)
+ classical
#align is_p_group.bot_lt_center IsPGroup.bot_lt_center
-/
@@ -468,20 +428,7 @@ theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
#print IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq /-
/-- The quotient by the center of a group of cardinality `p ^ 2` is cyclic. -/
theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
- IsCyclic (G ⧸ center G) := by
- classical
- rcases card_center_eq_prime_pow hG zero_lt_two with ⟨k, hk0, hk⟩
- rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
- have hk2 := (Nat.pow_dvd_pow_iff_le_right (Fact.out p.prime).one_lt).1 ⟨_, hG.symm⟩
- interval_cases
- · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
- exact isCyclic_of_prime_card hG
- ·
- exact
- @isCyclic_of_subsingleton _ _
- ⟨Fintype.card_le_one_iff.1
- (mul_right_injective₀ (pow_ne_zero 2 (NeZero.ne p))
- (hG.trans (mul_one (p ^ 2)).symm)).le⟩
+ IsCyclic (G ⧸ center G) := by classical
#align is_p_group.cyclic_center_quotient_of_card_eq_prime_sq IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -132,7 +132,7 @@ theorem orderOf_coprime {n : ℕ} (hn : p.Coprime n) (g : G) : (orderOf g).Copri
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).Coprime n := fun g =>
- order_eq_card_zpowers' g ▸ hG.orderOf_coprime hn g
+ Nat.card_zpowers g ▸ hG.orderOf_coprime hn g
{ toFun := (· ^ n)
invFun := fun g => (powCoprime (h g)).symm ⟨g, Subgroup.mem_zpowers g⟩
left_inv := fun g =>
@@ -154,7 +154,7 @@ theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g =
#print IsPGroup.powEquiv_symm_apply /-
@[simp]
theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
- (hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers'] <;> rfl
+ (hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [Nat.card_zpowers] <;> rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
-/
@@ -439,7 +439,7 @@ theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact
intro x hx₁ hx₂
obtain ⟨n₁, hn₁⟩ := iff_order_of.mp hH₁ ⟨x, hx₁⟩
obtain ⟨n₂, hn₂⟩ := iff_order_of.mp hH₂ ⟨x, hx₂⟩
- rw [← orderOf_subgroup, Subgroup.coe_mk] at hn₁ hn₂
+ rw [← Subgroup.orderOf_coe, Subgroup.coe_mk] at hn₁ hn₂
have : p₁ ^ n₁ = p₂ ^ n₂ := by rw [← hn₁, ← hn₂]
rcases n₁.eq_zero_or_pos with (rfl | hn₁)
· simpa using hn₁
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,13 +3,13 @@ Copyright (c) 2018 . All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Chris Hughes, Thomas Browning
-/
-import Mathbin.Data.Zmod.Basic
-import Mathbin.GroupTheory.Index
-import Mathbin.GroupTheory.GroupAction.ConjAct
-import Mathbin.GroupTheory.GroupAction.Quotient
-import Mathbin.GroupTheory.Perm.Cycle.Type
-import Mathbin.GroupTheory.SpecificGroups.Cyclic
-import Mathbin.Tactic.IntervalCases
+import Data.Zmod.Basic
+import GroupTheory.Index
+import GroupTheory.GroupAction.ConjAct
+import GroupTheory.GroupAction.Quotient
+import GroupTheory.Perm.Cycle.Type
+import GroupTheory.SpecificGroups.Cyclic
+import Tactic.IntervalCases
#align_import group_theory.p_group from "leanprover-community/mathlib"@"0b7c740e25651db0ba63648fbae9f9d6f941e31b"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -122,7 +122,7 @@ theorem of_equiv {H : Type _} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
-/
#print IsPGroup.orderOf_coprime /-
-theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).coprime n :=
+theorem orderOf_coprime {n : ℕ} (hn : p.Coprime n) (g : G) : (orderOf g).Coprime n :=
let ⟨k, hk⟩ := hG g
(hn.pow_leftₓ k).coprime_dvd_left (orderOf_dvd_of_pow_eq_one hk)
#align is_p_group.order_of_coprime IsPGroup.orderOf_coprime
@@ -130,8 +130,8 @@ theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).copri
#print IsPGroup.powEquiv /-
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
-noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
- let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).coprime n := fun g =>
+noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
+ let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).Coprime n := fun g =>
order_eq_card_zpowers' g ▸ hG.orderOf_coprime hn g
{ toFun := (· ^ n)
invFun := fun g => (powCoprime (h g)).symm ⟨g, Subgroup.mem_zpowers g⟩
@@ -146,14 +146,14 @@ noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
#print IsPGroup.powEquiv_apply /-
@[simp]
-theorem powEquiv_apply {n : ℕ} (hn : p.coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
+theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
rfl
#align is_p_group.pow_equiv_apply IsPGroup.powEquiv_apply
-/
#print IsPGroup.powEquiv_symm_apply /-
@[simp]
-theorem powEquiv_symm_apply {n : ℕ} (hn : p.coprime n) (g : G) :
+theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
(hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers'] <;> rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
-/
@@ -422,7 +422,7 @@ theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
[Fintype H₂] (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) :
- Nat.coprime (Fintype.card H₁) (Fintype.card H₂) :=
+ Nat.Coprime (Fintype.card H₁) (Fintype.card H₂) :=
by
obtain ⟨n₁, heq₁⟩ := iff_card.mp hH₁; rw [heq₁]; clear heq₁
obtain ⟨n₂, heq₂⟩ := iff_card.mp hH₂; rw [heq₂]; clear heq₂
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -71,7 +71,7 @@ theorem iff_card [Fact p.Prime] [Fintype G] : IsPGroup p G ↔ ∃ n : ℕ, card
refine' ⟨fun h => _, fun ⟨n, hn⟩ => of_card hn⟩
suffices ∀ q ∈ Nat.factors (card G), q = p
by
- use (card G).factors.length
+ use(card G).factors.length
rw [← List.prod_replicate, ← List.eq_replicate_of_mem this, Nat.prod_factors hG]
intro q hq
obtain ⟨hq1, hq2⟩ := (Nat.mem_factors hG).mp hq
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2018 . 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.p_group
-! leanprover-community/mathlib commit 0b7c740e25651db0ba63648fbae9f9d6f941e31b
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Data.Zmod.Basic
import Mathbin.GroupTheory.Index
@@ -16,6 +11,8 @@ import Mathbin.GroupTheory.Perm.Cycle.Type
import Mathbin.GroupTheory.SpecificGroups.Cyclic
import Mathbin.Tactic.IntervalCases
+#align_import group_theory.p_group from "leanprover-community/mathlib"@"0b7c740e25651db0ba63648fbae9f9d6f941e31b"
+
/-!
# p-groups
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -61,9 +61,11 @@ theorem of_card [Fintype G] {n : ℕ} (hG : card G = p ^ n) : IsPGroup p G := fu
#align is_p_group.of_card IsPGroup.of_card
-/
+#print IsPGroup.of_bot /-
theorem of_bot : IsPGroup p (⊥ : Subgroup G) :=
of_card (Subgroup.card_bot.trans (pow_zero p).symm)
#align is_p_group.of_bot IsPGroup.of_bot
+-/
#print IsPGroup.iff_card /-
theorem iff_card [Fact p.Prime] [Fintype G] : IsPGroup p G ↔ ∃ n : ℕ, card G = p ^ n :=
@@ -87,24 +89,28 @@ section GIsPGroup
variable (hG : IsPGroup p G)
-include hG
-
+#print IsPGroup.of_injective /-
theorem of_injective {H : Type _} [Group H] (ϕ : H →* G) (hϕ : Function.Injective ϕ) :
IsPGroup p H := by
simp_rw [IsPGroup, ← hϕ.eq_iff, ϕ.map_pow, ϕ.map_one]
exact fun h => hG (ϕ h)
#align is_p_group.of_injective IsPGroup.of_injective
+-/
+#print IsPGroup.to_subgroup /-
theorem to_subgroup (H : Subgroup G) : IsPGroup p H :=
hG.of_injective H.Subtype Subtype.coe_injective
#align is_p_group.to_subgroup IsPGroup.to_subgroup
+-/
+#print IsPGroup.of_surjective /-
theorem of_surjective {H : Type _} [Group H] (ϕ : G →* H) (hϕ : Function.Surjective ϕ) :
IsPGroup p H :=
by
refine' fun h => Exists.elim (hϕ h) fun g hg => Exists.imp (fun k hk => _) (hG g)
rw [← hg, ← ϕ.map_pow, hk, ϕ.map_one]
#align is_p_group.of_surjective IsPGroup.of_surjective
+-/
#print IsPGroup.to_quotient /-
theorem to_quotient (H : Subgroup G) [H.Normal] : IsPGroup p (G ⧸ H) :=
@@ -112,9 +118,11 @@ theorem to_quotient (H : Subgroup G) [H.Normal] : IsPGroup p (G ⧸ H) :=
#align is_p_group.to_quotient IsPGroup.to_quotient
-/
+#print IsPGroup.of_equiv /-
theorem of_equiv {H : Type _} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.ofSurjective ϕ.toMonoidHom ϕ.Surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
+-/
#print IsPGroup.orderOf_coprime /-
theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).coprime n :=
@@ -155,8 +163,6 @@ theorem powEquiv_symm_apply {n : ℕ} (hn : p.coprime n) (g : G) :
variable [hp : Fact p.Prime]
-include hp
-
#print IsPGroup.powEquiv' /-
/-- If `p ∤ n`, then the `n`th power map is a bijection. -/
@[reducible]
@@ -192,6 +198,7 @@ theorem card_eq_or_dvd : Nat.card G = 1 ∨ p ∣ Nat.card G :=
#align is_p_group.card_eq_or_dvd IsPGroup.card_eq_or_dvd
-/
+#print IsPGroup.nontrivial_iff_card /-
theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p ^ n :=
⟨fun hGnt =>
let ⟨k, hk⟩ := iff_card.1 hG
@@ -202,6 +209,7 @@ theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p
fun ⟨k, hk0, hk⟩ =>
one_lt_card_iff_nontrivial.1 <| hk.symm ▸ one_lt_pow (Fact.out p.Prime).one_lt (ne_of_gt hk0)⟩
#align is_p_group.nontrivial_iff_card IsPGroup.nontrivial_iff_card
+-/
variable {α : Type _} [MulAction G α]
@@ -289,6 +297,7 @@ theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card
#align is_p_group.exists_fixed_point_of_prime_dvd_card_of_fixed_point IsPGroup.exists_fixed_point_of_prime_dvd_card_of_fixed_point
-/
+#print IsPGroup.center_nontrivial /-
theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by
classical
cases nonempty_fintype G
@@ -299,7 +308,9 @@ theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.cente
· obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
#align is_p_group.center_nontrivial IsPGroup.center_nontrivial
+-/
+#print IsPGroup.bot_lt_center /-
theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
by
haveI := center_nontrivial hG
@@ -307,28 +318,38 @@ theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
classical exact
bot_lt_iff_ne_bot.mpr ((Subgroup.center G).one_lt_card_iff_ne_bot.mp Fintype.one_lt_card)
#align is_p_group.bot_lt_center IsPGroup.bot_lt_center
+-/
end GIsPGroup
+#print IsPGroup.to_le /-
theorem to_le {H K : Subgroup G} (hK : IsPGroup p K) (hHK : H ≤ K) : IsPGroup p H :=
hK.of_injective (Subgroup.inclusion hHK) fun a b h =>
Subtype.ext (show _ from Subtype.ext_iff.mp h)
#align is_p_group.to_le IsPGroup.to_le
+-/
+#print IsPGroup.to_inf_left /-
theorem to_inf_left {H K : Subgroup G} (hH : IsPGroup p H) : IsPGroup p (H ⊓ K : Subgroup G) :=
hH.to_le inf_le_left
#align is_p_group.to_inf_left IsPGroup.to_inf_left
+-/
+#print IsPGroup.to_inf_right /-
theorem to_inf_right {H K : Subgroup G} (hK : IsPGroup p K) : IsPGroup p (H ⊓ K : Subgroup G) :=
hK.to_le inf_le_right
#align is_p_group.to_inf_right IsPGroup.to_inf_right
+-/
+#print IsPGroup.map /-
theorem map {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : G →* K) :
IsPGroup p (H.map ϕ) := by
rw [← H.subtype_range, MonoidHom.map_range]
exact hH.of_surjective (ϕ.restrict H).range_restrict (ϕ.restrict H).rangeRestrict_surjective
#align is_p_group.map IsPGroup.map
+-/
+#print IsPGroup.comap_of_ker_isPGroup /-
theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K]
(ϕ : K →* G) (hϕ : IsPGroup p ϕ.ker) : IsPGroup p (H.comap ϕ) :=
by
@@ -339,22 +360,30 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
rwa [Subtype.ext_iff, ϕ.ker.coe_pow, Subtype.coe_mk, ← pow_mul, ← pow_add] at hk
exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
+-/
+#print IsPGroup.ker_isPGroup_of_injective /-
theorem ker_isPGroup_of_injective {K : Type _} [Group K] {ϕ : K →* G} (hϕ : Function.Injective ϕ) :
IsPGroup p ϕ.ker :=
(congr_arg (fun Q : Subgroup K => IsPGroup p Q) (ϕ.ker_eq_bot_iff.mpr hϕ)).mpr IsPGroup.of_bot
#align is_p_group.ker_is_p_group_of_injective IsPGroup.ker_isPGroup_of_injective
+-/
+#print IsPGroup.comap_of_injective /-
theorem comap_of_injective {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : K →* G)
(hϕ : Function.Injective ϕ) : IsPGroup p (H.comap ϕ) :=
hH.comap_of_ker_isPGroup ϕ (ker_isPGroup_of_injective hϕ)
#align is_p_group.comap_of_injective IsPGroup.comap_of_injective
+-/
+#print IsPGroup.comap_subtype /-
theorem comap_subtype {H : Subgroup G} (hH : IsPGroup p H) {K : Subgroup G} :
IsPGroup p (H.comap K.Subtype) :=
hH.comap_of_injective K.Subtype Subtype.coe_injective
#align is_p_group.comap_subtype IsPGroup.comap_subtype
+-/
+#print IsPGroup.to_sup_of_normal_right /-
theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
[K.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
by
@@ -362,12 +391,16 @@ theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
apply (hH.map (QuotientGroup.mk' K)).comap_of_ker_isPGroup
rwa [QuotientGroup.ker_mk']
#align is_p_group.to_sup_of_normal_right IsPGroup.to_sup_of_normal_right
+-/
+#print IsPGroup.to_sup_of_normal_left /-
theorem to_sup_of_normal_left {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
[H.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
(congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right hK hH)
#align is_p_group.to_sup_of_normal_left IsPGroup.to_sup_of_normal_left
+-/
+#print IsPGroup.to_sup_of_normal_right' /-
theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : H ≤ K.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
let hHK' :=
@@ -378,12 +411,16 @@ theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsP
hHK').of_equiv
(Subgroup.subgroupOfEquivOfLe (sup_le hHK Subgroup.le_normalizer))
#align is_p_group.to_sup_of_normal_right' IsPGroup.to_sup_of_normal_right'
+-/
+#print IsPGroup.to_sup_of_normal_left' /-
theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : K ≤ H.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
(congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right' hK hH hHK)
#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'
+-/
+#print IsPGroup.coprime_card_of_ne /-
/-- finite p-groups with different p have coprime orders -/
theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
@@ -394,7 +431,9 @@ theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁
obtain ⟨n₂, heq₂⟩ := iff_card.mp hH₂; rw [heq₂]; clear heq₂
exact Nat.coprime_pow_primes _ _ hp₁.elim hp₂.elim hne
#align is_p_group.coprime_card_of_ne IsPGroup.coprime_card_of_ne
+-/
+#print IsPGroup.disjoint_of_ne /-
/-- p-groups with different p are disjoint -/
theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂)
(H₁ H₂ : Subgroup G) (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) : Disjoint H₁ H₂ :=
@@ -409,15 +448,15 @@ theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact
· simpa using hn₁
· exact absurd (eq_of_prime_pow_eq hp₁.out.prime hp₂.out.prime hn₁ this) hne
#align is_p_group.disjoint_of_ne IsPGroup.disjoint_of_ne
+-/
section P2comm
variable [Fintype G] [Fact p.Prime] {n : ℕ} (hGpn : card G = p ^ n)
-include hGpn
-
open Subgroup
+#print IsPGroup.card_center_eq_prime_pow /-
/-- The cardinality of the `center` of a `p`-group is `p ^ k` where `k` is positive. -/
theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
∃ k > 0, card (center G) = p ^ k :=
@@ -427,8 +466,7 @@ theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
haveI : Nontrivial G := (nontrivial_iff_card <| of_card hGpn).2 ⟨n, hn, hGpn⟩
exact (nontrivial_iff_card hcG).mp (center_nontrivial (of_card hGpn))
#align is_p_group.card_center_eq_prime_pow IsPGroup.card_center_eq_prime_pow
-
-omit hGpn
+-/
#print IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq /-
/-- The quotient by the center of a group of cardinality `p ^ 2` is cyclic. -/
@@ -459,11 +497,13 @@ def commGroupOfCardEqPrimeSq (hG : card G = p ^ 2) : CommGroup G :=
#align is_p_group.comm_group_of_card_eq_prime_sq IsPGroup.commGroupOfCardEqPrimeSq
-/
+#print IsPGroup.commutative_of_card_eq_prime_sq /-
/-- A group of order `p ^ 2` is commutative. See also `is_p_group.comm_group_of_card_eq_prime_sq`
for the `comm_group` instance. -/
theorem commutative_of_card_eq_prime_sq (hG : card G = p ^ 2) : ∀ a b : G, a * b = b * a :=
(commGroupOfCardEqPrimeSq hG).mul_comm
#align is_p_group.commutative_of_card_eq_prime_sq IsPGroup.commutative_of_card_eq_prime_sq
+-/
end P2comm
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -230,7 +230,6 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
_ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
_ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
_ = _ := by simp <;> rfl
-
rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
have key :
∀ x,
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -224,38 +224,37 @@ variable (α) [Fintype α]
theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
card α ≡ card (fixedPoints G α) [MOD p] := by
classical
- calc
- card α = card (Σ y : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
- card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbit_rel G α))).symm
- _ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
- _ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
- _ = _ := by simp <;> rfl
-
- rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
- have key :
- ∀ x,
- card { y // (Quotient.mk'' y : Quotient (orbit_rel G α)) = Quotient.mk'' x } =
- card (orbit G x) :=
- fun x => by simp only [Quotient.eq''] <;> congr
- refine'
- Eq.symm
- (Finset.sum_bij_ne_zero (fun a _ _ => Quotient.mk'' a.1) (fun _ _ _ => Finset.mem_univ _)
- (fun a₁ a₂ _ _ _ _ h =>
- Subtype.eq ((mem_fixed_points' α).mp a₂.2 a₁.1 (Quotient.exact' h)))
- (fun b => Quotient.inductionOn' b fun b _ hb => _) fun a ha _ => by
- rw [key, mem_fixed_points_iff_card_orbit_eq_one.mp a.2])
- obtain ⟨k, hk⟩ := hG.card_orbit b
- have : k = 0 :=
- le_zero_iff.1
- (Nat.le_of_lt_succ
- (lt_of_not_ge
- (mt (pow_dvd_pow p)
- (by
- rwa [pow_one, ← hk, ← Nat.modEq_zero_iff_dvd, ← ZMod.eq_iff_modEq_nat, ← key,
- Nat.cast_zero]))))
- exact
- ⟨⟨b, mem_fixed_points_iff_card_orbit_eq_one.2 <| by rw [hk, this, pow_zero]⟩,
- Finset.mem_univ _, ne_of_eq_of_ne Nat.cast_one one_ne_zero, rfl⟩
+ calc
+ card α = card (Σ y : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
+ card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbit_rel G α))).symm
+ _ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
+ _ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
+ _ = _ := by simp <;> rfl
+
+ rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
+ have key :
+ ∀ x,
+ card { y // (Quotient.mk'' y : Quotient (orbit_rel G α)) = Quotient.mk'' x } =
+ card (orbit G x) :=
+ fun x => by simp only [Quotient.eq''] <;> congr
+ refine'
+ Eq.symm
+ (Finset.sum_bij_ne_zero (fun a _ _ => Quotient.mk'' a.1) (fun _ _ _ => Finset.mem_univ _)
+ (fun a₁ a₂ _ _ _ _ h => Subtype.eq ((mem_fixed_points' α).mp a₂.2 a₁.1 (Quotient.exact' h)))
+ (fun b => Quotient.inductionOn' b fun b _ hb => _) fun a ha _ => by
+ rw [key, mem_fixed_points_iff_card_orbit_eq_one.mp a.2])
+ obtain ⟨k, hk⟩ := hG.card_orbit b
+ have : k = 0 :=
+ le_zero_iff.1
+ (Nat.le_of_lt_succ
+ (lt_of_not_ge
+ (mt (pow_dvd_pow p)
+ (by
+ rwa [pow_one, ← hk, ← Nat.modEq_zero_iff_dvd, ← ZMod.eq_iff_modEq_nat, ← key,
+ Nat.cast_zero]))))
+ exact
+ ⟨⟨b, mem_fixed_points_iff_card_orbit_eq_one.2 <| by rw [hk, this, pow_zero]⟩, Finset.mem_univ _,
+ ne_of_eq_of_ne Nat.cast_one one_ne_zero, rfl⟩
#align is_p_group.card_modeq_card_fixed_points IsPGroup.card_modEq_card_fixedPoints
-/
@@ -293,13 +292,13 @@ theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card
theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by
classical
- cases nonempty_fintype G
- have := (hG.of_equiv ConjAct.toConjAct).exists_fixed_point_of_prime_dvd_card_of_fixed_point G
- rw [ConjAct.fixedPoints_eq_center] at this
- obtain ⟨g, hg⟩ := this _ (Subgroup.center G).one_mem
- · exact ⟨⟨1, ⟨g, hg.1⟩, mt subtype.ext_iff.mp hg.2⟩⟩
- · obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
- exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
+ cases nonempty_fintype G
+ have := (hG.of_equiv ConjAct.toConjAct).exists_fixed_point_of_prime_dvd_card_of_fixed_point G
+ rw [ConjAct.fixedPoints_eq_center] at this
+ obtain ⟨g, hg⟩ := this _ (Subgroup.center G).one_mem
+ · exact ⟨⟨1, ⟨g, hg.1⟩, mt subtype.ext_iff.mp hg.2⟩⟩
+ · obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
+ exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
#align is_p_group.center_nontrivial IsPGroup.center_nontrivial
theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
@@ -307,7 +306,7 @@ theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
haveI := center_nontrivial hG
cases nonempty_fintype G
classical exact
- bot_lt_iff_ne_bot.mpr ((Subgroup.center G).one_lt_card_iff_ne_bot.mp Fintype.one_lt_card)
+ bot_lt_iff_ne_bot.mpr ((Subgroup.center G).one_lt_card_iff_ne_bot.mp Fintype.one_lt_card)
#align is_p_group.bot_lt_center IsPGroup.bot_lt_center
end GIsPGroup
@@ -437,18 +436,18 @@ omit hGpn
theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
IsCyclic (G ⧸ center G) := by
classical
- rcases card_center_eq_prime_pow hG zero_lt_two with ⟨k, hk0, hk⟩
- rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
- have hk2 := (Nat.pow_dvd_pow_iff_le_right (Fact.out p.prime).one_lt).1 ⟨_, hG.symm⟩
- interval_cases
- · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
- exact isCyclic_of_prime_card hG
- ·
- exact
- @isCyclic_of_subsingleton _ _
- ⟨Fintype.card_le_one_iff.1
- (mul_right_injective₀ (pow_ne_zero 2 (NeZero.ne p))
- (hG.trans (mul_one (p ^ 2)).symm)).le⟩
+ rcases card_center_eq_prime_pow hG zero_lt_two with ⟨k, hk0, hk⟩
+ rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
+ have hk2 := (Nat.pow_dvd_pow_iff_le_right (Fact.out p.prime).one_lt).1 ⟨_, hG.symm⟩
+ interval_cases
+ · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
+ exact isCyclic_of_prime_card hG
+ ·
+ exact
+ @isCyclic_of_subsingleton _ _
+ ⟨Fintype.card_le_one_iff.1
+ (mul_right_injective₀ (pow_ne_zero 2 (NeZero.ne p))
+ (hG.trans (mul_one (p ^ 2)).symm)).le⟩
#align is_p_group.cyclic_center_quotient_of_card_eq_prime_sq IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -197,7 +197,7 @@ theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p
let ⟨k, hk⟩ := iff_card.1 hG
⟨k,
Nat.pos_of_ne_zero fun hk0 => by
- rw [hk0, pow_zero] at hk <;> exact fintype.one_lt_card.ne' hk,
+ rw [hk0, pow_zero] at hk <;> exact fintype.one_lt_card.ne' hk,
hk⟩,
fun ⟨k, hk0, hk⟩ =>
one_lt_card_iff_nontrivial.1 <| hk.symm ▸ one_lt_pow (Fact.out p.Prime).one_lt (ne_of_gt hk0)⟩
@@ -225,7 +225,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
card α ≡ card (fixedPoints G α) [MOD p] := by
classical
calc
- card α = card (Σy : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
+ card α = card (Σ y : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbit_rel G α))).symm
_ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
_ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
@@ -295,7 +295,7 @@ theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.cente
classical
cases nonempty_fintype G
have := (hG.of_equiv ConjAct.toConjAct).exists_fixed_point_of_prime_dvd_card_of_fixed_point G
- rw [ConjAct.fixedPoints_eq_center] at this
+ rw [ConjAct.fixedPoints_eq_center] at this
obtain ⟨g, hg⟩ := this _ (Subgroup.center G).one_mem
· exact ⟨⟨1, ⟨g, hg.1⟩, mt subtype.ext_iff.mp hg.2⟩⟩
· obtain ⟨n, hn0, hn⟩ := hG.nontrivial_iff_card.mp inferInstance
@@ -336,9 +336,9 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
by
intro g
obtain ⟨j, hj⟩ := hH ⟨ϕ g.1, g.2⟩
- rw [Subtype.ext_iff, H.coe_pow, Subtype.coe_mk, ← ϕ.map_pow] at hj
+ rw [Subtype.ext_iff, H.coe_pow, Subtype.coe_mk, ← ϕ.map_pow] at hj
obtain ⟨k, hk⟩ := hϕ ⟨g.1 ^ p ^ j, hj⟩
- rwa [Subtype.ext_iff, ϕ.ker.coe_pow, Subtype.coe_mk, ← pow_mul, ← pow_add] at hk
+ rwa [Subtype.ext_iff, ϕ.ker.coe_pow, Subtype.coe_mk, ← pow_mul, ← pow_add] at hk
exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
@@ -405,7 +405,7 @@ theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact
intro x hx₁ hx₂
obtain ⟨n₁, hn₁⟩ := iff_order_of.mp hH₁ ⟨x, hx₁⟩
obtain ⟨n₂, hn₂⟩ := iff_order_of.mp hH₂ ⟨x, hx₂⟩
- rw [← orderOf_subgroup, Subgroup.coe_mk] at hn₁ hn₂
+ rw [← orderOf_subgroup, Subgroup.coe_mk] at hn₁ hn₂
have : p₁ ^ n₁ = p₂ ^ n₂ := by rw [← hn₁, ← hn₂]
rcases n₁.eq_zero_or_pos with (rfl | hn₁)
· simpa using hn₁
@@ -438,10 +438,10 @@ theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
IsCyclic (G ⧸ center G) := by
classical
rcases card_center_eq_prime_pow hG zero_lt_two with ⟨k, hk0, hk⟩
- rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
+ rw [card_eq_card_quotient_mul_card_subgroup (center G), mul_comm, hk] at hG
have hk2 := (Nat.pow_dvd_pow_iff_le_right (Fact.out p.prime).one_lt).1 ⟨_, hG.symm⟩
interval_cases
- · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
+ · rw [sq, pow_one, mul_right_inj' (Fact.out p.prime).NeZero] at hG
exact isCyclic_of_prime_card hG
·
exact
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -28,7 +28,7 @@ It also contains proofs of some corollaries of this lemma about existence of fix
-/
-open BigOperators
+open scoped BigOperators
open Fintype MulAction
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -61,12 +61,6 @@ theorem of_card [Fintype G] {n : ℕ} (hG : card G = p ^ n) : IsPGroup p G := fu
#align is_p_group.of_card IsPGroup.of_card
-/
-/- warning: is_p_group.of_bot -> IsPGroup.of_bot is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasBot.{u1} G _inst_1))) (Subgroup.toGroup.{u1} G _inst_1 (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasBot.{u1} G _inst_1)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instBotSubgroup.{u1} G _inst_1)))) (Subgroup.toGroup.{u1} G _inst_1 (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instBotSubgroup.{u1} G _inst_1)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.of_bot IsPGroup.of_botₓ'. -/
theorem of_bot : IsPGroup p (⊥ : Subgroup G) :=
of_card (Subgroup.card_bot.trans (pow_zero p).symm)
#align is_p_group.of_bot IsPGroup.of_bot
@@ -95,34 +89,16 @@ variable (hG : IsPGroup p G)
include hG
-/- warning: is_p_group.of_injective -> IsPGroup.of_injective is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (Function.Injective.{succ u2, succ u1} H G (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (fun (_x : MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) => H -> G) (MonoidHom.hasCoeToFun.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (Function.Injective.{succ u2, succ u1} H G (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) H (fun (_x : H) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : H) => G) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) H G (MulOneClass.toMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (MonoidHom.monoidHomClass.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
-Case conversion may be inaccurate. Consider using '#align is_p_group.of_injective IsPGroup.of_injectiveₓ'. -/
theorem of_injective {H : Type _} [Group H] (ϕ : H →* G) (hϕ : Function.Injective ϕ) :
IsPGroup p H := by
simp_rw [IsPGroup, ← hϕ.eq_iff, ϕ.map_pow, ϕ.map_one]
exact fun h => hG (ϕ h)
#align is_p_group.of_injective IsPGroup.of_injective
-/- warning: is_p_group.to_subgroup -> IsPGroup.to_subgroup is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall (H : Subgroup.{u1} G _inst_1), IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall (H : Subgroup.{u1} G _inst_1), IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_subgroup IsPGroup.to_subgroupₓ'. -/
theorem to_subgroup (H : Subgroup G) : IsPGroup p H :=
hG.of_injective H.Subtype Subtype.coe_injective
#align is_p_group.to_subgroup IsPGroup.to_subgroup
-/- warning: is_p_group.of_surjective -> IsPGroup.of_surjective is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))), (Function.Surjective.{succ u1, succ u2} G H (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) (fun (_x : MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) => G -> H) (MonoidHom.hasCoeToFun.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))), (Function.Surjective.{succ u1, succ u2} G H (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) G (fun (_x : G) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : G) => H) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) G H (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (MonoidHom.monoidHomClass.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
-Case conversion may be inaccurate. Consider using '#align is_p_group.of_surjective IsPGroup.of_surjectiveₓ'. -/
theorem of_surjective {H : Type _} [Group H] (ϕ : G →* H) (hϕ : Function.Surjective ϕ) :
IsPGroup p H :=
by
@@ -136,12 +112,6 @@ theorem to_quotient (H : Subgroup G) [H.Normal] : IsPGroup p (G ⧸ H) :=
#align is_p_group.to_quotient IsPGroup.to_quotient
-/
-/- warning: is_p_group.of_equiv -> IsPGroup.of_equiv is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H], (MulEquiv.{u1, u2} G H (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))))) -> (IsPGroup.{u2} p H _inst_2))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H], (MulEquiv.{u1, u2} G H (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))))) -> (IsPGroup.{u2} p H _inst_2))
-Case conversion may be inaccurate. Consider using '#align is_p_group.of_equiv IsPGroup.of_equivₓ'. -/
theorem of_equiv {H : Type _} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.ofSurjective ϕ.toMonoidHom ϕ.Surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
@@ -222,12 +192,6 @@ theorem card_eq_or_dvd : Nat.card G = 1 ∨ p ∣ Nat.card G :=
#align is_p_group.card_eq_or_dvd IsPGroup.card_eq_or_dvd
-/
-/- warning: is_p_group.nontrivial_iff_card -> IsPGroup.nontrivial_iff_card is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_2 : Fintype.{u1} G], Iff (Nontrivial.{u1} G) (Exists.{1} Nat (fun (n : Nat) => Exists.{0} (GT.gt.{0} Nat Nat.hasLt n (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) (fun (H : GT.gt.{0} Nat Nat.hasLt n (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) => Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p n)))))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_2 : Fintype.{u1} G], Iff (Nontrivial.{u1} G) (Exists.{1} Nat (fun (n : Nat) => And (GT.gt.{0} Nat instLTNat n (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p n)))))
-Case conversion may be inaccurate. Consider using '#align is_p_group.nontrivial_iff_card IsPGroup.nontrivial_iff_cardₓ'. -/
theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p ^ n :=
⟨fun hGnt =>
let ⟨k, hk⟩ := iff_card.1 hG
@@ -327,12 +291,6 @@ theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card
#align is_p_group.exists_fixed_point_of_prime_dvd_card_of_fixed_point IsPGroup.exists_fixed_point_of_prime_dvd_card_of_fixed_point
-/
-/- warning: is_p_group.center_nontrivial -> IsPGroup.center_nontrivial is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], Nontrivial.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], Nontrivial.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Subgroup.center.{u1} G _inst_1))))
-Case conversion may be inaccurate. Consider using '#align is_p_group.center_nontrivial IsPGroup.center_nontrivialₓ'. -/
theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by
classical
cases nonempty_fintype G
@@ -344,12 +302,6 @@ theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.cente
exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
#align is_p_group.center_nontrivial IsPGroup.center_nontrivial
-/- warning: is_p_group.bot_lt_center -> IsPGroup.bot_lt_center is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], LT.lt.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLt.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasBot.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], LT.lt.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLT.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instBotSubgroup.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1))
-Case conversion may be inaccurate. Consider using '#align is_p_group.bot_lt_center IsPGroup.bot_lt_centerₓ'. -/
theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
by
haveI := center_nontrivial hG
@@ -360,55 +312,25 @@ theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
end GIsPGroup
-/- warning: is_p_group.to_le -> IsPGroup.to_le is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) H K) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_le IsPGroup.to_leₓ'. -/
theorem to_le {H K : Subgroup G} (hK : IsPGroup p K) (hHK : H ≤ K) : IsPGroup p H :=
hK.of_injective (Subgroup.inclusion hHK) fun a b h =>
Subtype.ext (show _ from Subtype.ext_iff.mp h)
#align is_p_group.to_le IsPGroup.to_le
-/- warning: is_p_group.to_inf_left -> IsPGroup.to_inf_left is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_inf_left IsPGroup.to_inf_leftₓ'. -/
theorem to_inf_left {H K : Subgroup G} (hH : IsPGroup p H) : IsPGroup p (H ⊓ K : Subgroup G) :=
hH.to_le inf_le_left
#align is_p_group.to_inf_left IsPGroup.to_inf_left
-/- warning: is_p_group.to_inf_right -> IsPGroup.to_inf_right is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_inf_right IsPGroup.to_inf_rightₓ'. -/
theorem to_inf_right {H K : Subgroup G} (hK : IsPGroup p K) : IsPGroup p (H ⊓ K : Subgroup G) :=
hK.to_le inf_le_right
#align is_p_group.to_inf_right IsPGroup.to_inf_right
-/- warning: is_p_group.map -> IsPGroup.map is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Type.{u2}} [_inst_2 : Group.{u2} K] (ϕ : MonoidHom.{u1, u2} G K (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2)))), IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (Subgroup.map.{u1, u2} G _inst_1 K _inst_2 ϕ H)) (Subgroup.toGroup.{u2} K _inst_2 (Subgroup.map.{u1, u2} G _inst_1 K _inst_2 ϕ H)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u2}} [_inst_1 : Group.{u2} G] {H : Subgroup.{u2} G _inst_1}, (IsPGroup.{u2} p (Subtype.{succ u2} G (fun (x : G) => Membership.mem.{u2, u2} G (Subgroup.{u2} G _inst_1) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u2} G _inst_1)) x H)) (Subgroup.toGroup.{u2} G _inst_1 H)) -> (forall {K : Type.{u1}} [_inst_2 : Group.{u1} K] (ϕ : MonoidHom.{u2, u1} G K (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2)))), IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (Subgroup.map.{u2, u1} G _inst_1 K _inst_2 ϕ H))) (Subgroup.toGroup.{u1} K _inst_2 (Subgroup.map.{u2, u1} G _inst_1 K _inst_2 ϕ H)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.map IsPGroup.mapₓ'. -/
theorem map {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : G →* K) :
IsPGroup p (H.map ϕ) := by
rw [← H.subtype_range, MonoidHom.map_range]
exact hH.of_surjective (ϕ.restrict H).range_restrict (ϕ.restrict H).rangeRestrict_surjective
#align is_p_group.map IsPGroup.map
-/- warning: is_p_group.comap_of_ker_is_p_group -> IsPGroup.comap_of_ker_isPGroup is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Type.{u2}} [_inst_2 : Group.{u2} K] (ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)) (Subgroup.toGroup.{u2} K _inst_2 (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ))) -> (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H)) (Subgroup.toGroup.{u2} K _inst_2 (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H))))
-but is expected to have type
- forall {p : Nat} {G : Type.{u2}} [_inst_1 : Group.{u2} G] {H : Subgroup.{u2} G _inst_1}, (IsPGroup.{u2} p (Subtype.{succ u2} G (fun (x : G) => Membership.mem.{u2, u2} G (Subgroup.{u2} G _inst_1) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u2} G _inst_1)) x H)) (Subgroup.toGroup.{u2} G _inst_1 H)) -> (forall {K : Type.{u1}} [_inst_2 : Group.{u1} K] (ϕ : MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))), (IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (MonoidHom.ker.{u1, u2} K _inst_2 G (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) ϕ))) (Subgroup.toGroup.{u1} K _inst_2 (MonoidHom.ker.{u1, u2} K _inst_2 G (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) ϕ))) -> (IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))) (Subgroup.toGroup.{u1} K _inst_2 (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))))
-Case conversion may be inaccurate. Consider using '#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroupₓ'. -/
theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K]
(ϕ : K →* G) (hϕ : IsPGroup p ϕ.ker) : IsPGroup p (H.comap ϕ) :=
by
@@ -420,45 +342,21 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
-/- warning: is_p_group.ker_is_p_group_of_injective -> IsPGroup.ker_isPGroup_of_injective is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {K : Type.{u2}} [_inst_2 : Group.{u2} K] {ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))}, (Function.Injective.{succ u2, succ u1} K G (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (fun (_x : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) => K -> G) (MonoidHom.hasCoeToFun.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) ϕ)) -> (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)) (Subgroup.toGroup.{u2} K _inst_2 (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {K : Type.{u2}} [_inst_2 : Group.{u2} K] {ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))}, (Function.Injective.{succ u2, succ u1} K G (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) K (fun (_x : K) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : K) => G) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) K G (MulOneClass.toMul.{u2} K (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (MonoidHom.monoidHomClass.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) ϕ)) -> (IsPGroup.{u2} p (Subtype.{succ u2} K (fun (x : K) => Membership.mem.{u2, u2} K (Subgroup.{u2} K _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u2} K _inst_2)) x (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ))) (Subgroup.toGroup.{u2} K _inst_2 (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.ker_is_p_group_of_injective IsPGroup.ker_isPGroup_of_injectiveₓ'. -/
theorem ker_isPGroup_of_injective {K : Type _} [Group K] {ϕ : K →* G} (hϕ : Function.Injective ϕ) :
IsPGroup p ϕ.ker :=
(congr_arg (fun Q : Subgroup K => IsPGroup p Q) (ϕ.ker_eq_bot_iff.mpr hϕ)).mpr IsPGroup.of_bot
#align is_p_group.ker_is_p_group_of_injective IsPGroup.ker_isPGroup_of_injective
-/- warning: is_p_group.comap_of_injective -> IsPGroup.comap_of_injective is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Type.{u2}} [_inst_2 : Group.{u2} K] (ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (Function.Injective.{succ u2, succ u1} K G (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (fun (_x : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) => K -> G) (MonoidHom.hasCoeToFun.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) ϕ)) -> (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H)) (Subgroup.toGroup.{u2} K _inst_2 (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H))))
-but is expected to have type
- forall {p : Nat} {G : Type.{u2}} [_inst_1 : Group.{u2} G] {H : Subgroup.{u2} G _inst_1}, (IsPGroup.{u2} p (Subtype.{succ u2} G (fun (x : G) => Membership.mem.{u2, u2} G (Subgroup.{u2} G _inst_1) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u2} G _inst_1)) x H)) (Subgroup.toGroup.{u2} G _inst_1 H)) -> (forall {K : Type.{u1}} [_inst_2 : Group.{u1} K] (ϕ : MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))), (Function.Injective.{succ u1, succ u2} K G (FunLike.coe.{max (succ u2) (succ u1), succ u1, succ u2} (MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) K (fun (_x : K) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : K) => G) _x) (MulHomClass.toFunLike.{max u2 u1, u1, u2} (MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) K G (MulOneClass.toMul.{u1} K (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2)))) (MulOneClass.toMul.{u2} G (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) (MonoidHomClass.toMulHomClass.{max u2 u1, u1, u2} (MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) (MonoidHom.monoidHomClass.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))))) ϕ)) -> (IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))) (Subgroup.toGroup.{u1} K _inst_2 (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))))
-Case conversion may be inaccurate. Consider using '#align is_p_group.comap_of_injective IsPGroup.comap_of_injectiveₓ'. -/
theorem comap_of_injective {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : K →* G)
(hϕ : Function.Injective ϕ) : IsPGroup p (H.comap ϕ) :=
hH.comap_of_ker_isPGroup ϕ (ker_isPGroup_of_injective hϕ)
#align is_p_group.comap_of_injective IsPGroup.comap_of_injective
-/- warning: is_p_group.comap_subtype -> IsPGroup.comap_subtype is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Subgroup.{u1} G _inst_1}, IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.setLike.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K))) (Subgroup.comap.{u1, u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H)) (Subgroup.toGroup.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K) (Subgroup.comap.{u1, u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Subgroup.{u1} G _inst_1}, IsPGroup.{u1} p (Subtype.{succ u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (fun (x : Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) => Membership.mem.{u1, u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.instSetLikeSubgroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K))) x (Subgroup.comap.{u1, u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H))) (Subgroup.toGroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K) (Subgroup.comap.{u1, u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.comap_subtype IsPGroup.comap_subtypeₓ'. -/
theorem comap_subtype {H : Subgroup G} (hH : IsPGroup p H) {K : Subgroup G} :
IsPGroup p (H.comap K.Subtype) :=
hH.comap_of_injective K.Subtype Subtype.coe_injective
#align is_p_group.comap_subtype IsPGroup.comap_subtype
-/- warning: is_p_group.to_sup_of_normal_right -> IsPGroup.to_sup_of_normal_right is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 K], IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 K], IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_right IsPGroup.to_sup_of_normal_rightₓ'. -/
theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
[K.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
by
@@ -467,23 +365,11 @@ theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
rwa [QuotientGroup.ker_mk']
#align is_p_group.to_sup_of_normal_right IsPGroup.to_sup_of_normal_right
-/- warning: is_p_group.to_sup_of_normal_left -> IsPGroup.to_sup_of_normal_left is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 H], IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 H], IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_left IsPGroup.to_sup_of_normal_leftₓ'. -/
theorem to_sup_of_normal_left {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
[H.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
(congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right hK hH)
#align is_p_group.to_sup_of_normal_left IsPGroup.to_sup_of_normal_left
-/- warning: is_p_group.to_sup_of_normal_right' -> IsPGroup.to_sup_of_normal_right' is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) H (Subgroup.normalizer.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H (Subgroup.normalizer.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_right' IsPGroup.to_sup_of_normal_right'ₓ'. -/
theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : H ≤ K.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
let hHK' :=
@@ -495,23 +381,11 @@ theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsP
(Subgroup.subgroupOfEquivOfLe (sup_le hHK Subgroup.le_normalizer))
#align is_p_group.to_sup_of_normal_right' IsPGroup.to_sup_of_normal_right'
-/- warning: is_p_group.to_sup_of_normal_left' -> IsPGroup.to_sup_of_normal_left' is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) K (Subgroup.normalizer.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) K (Subgroup.normalizer.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'ₓ'. -/
theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : K ≤ H.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
(congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right' hK hH hHK)
#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'
-/- warning: is_p_group.coprime_card_of_ne -> IsPGroup.coprime_card_of_ne is a dubious translation:
-lean 3 declaration is
- forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] {G₂ : Type.{u2}} [_inst_2 : Group.{u2} G₂] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u2} G₂ _inst_2) [_inst_3 : Fintype.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁)] [_inst_4 : Fintype.{u2} (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} G₂ _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.setLike.{u2} G₂ _inst_2)) H₂)], (IsPGroup.{u1} p₁ (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u2} p₂ (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} G₂ _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.setLike.{u2} G₂ _inst_2)) H₂) (Subgroup.toGroup.{u2} G₂ _inst_2 H₂)) -> (Nat.coprime (Fintype.card.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁) _inst_3) (Fintype.card.{u2} (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} G₂ _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.setLike.{u2} G₂ _inst_2)) H₂) _inst_4)))
-but is expected to have type
- forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] {G₂ : Type.{u2}} [_inst_2 : Group.{u2} G₂] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u2} G₂ _inst_2) [_inst_3 : Fintype.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁))] [_inst_4 : Fintype.{u2} (Subtype.{succ u2} G₂ (fun (x : G₂) => Membership.mem.{u2, u2} G₂ (Subgroup.{u2} G₂ _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.instSetLikeSubgroup.{u2} G₂ _inst_2)) x H₂))], (IsPGroup.{u1} p₁ (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁)) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u2} p₂ (Subtype.{succ u2} G₂ (fun (x : G₂) => Membership.mem.{u2, u2} G₂ (Subgroup.{u2} G₂ _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.instSetLikeSubgroup.{u2} G₂ _inst_2)) x H₂)) (Subgroup.toGroup.{u2} G₂ _inst_2 H₂)) -> (Nat.coprime (Fintype.card.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁)) _inst_3) (Fintype.card.{u2} (Subtype.{succ u2} G₂ (fun (x : G₂) => Membership.mem.{u2, u2} G₂ (Subgroup.{u2} G₂ _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.instSetLikeSubgroup.{u2} G₂ _inst_2)) x H₂)) _inst_4)))
-Case conversion may be inaccurate. Consider using '#align is_p_group.coprime_card_of_ne IsPGroup.coprime_card_of_neₓ'. -/
/-- finite p-groups with different p have coprime orders -/
theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
@@ -523,12 +397,6 @@ theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁
exact Nat.coprime_pow_primes _ _ hp₁.elim hp₂.elim hne
#align is_p_group.coprime_card_of_ne IsPGroup.coprime_card_of_ne
-/- warning: is_p_group.disjoint_of_ne -> IsPGroup.disjoint_of_ne is a dubious translation:
-lean 3 declaration is
- forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u1} G _inst_1), (IsPGroup.{u1} p₁ (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u1} p₂ (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₂) (Subgroup.toGroup.{u1} G _inst_1 H₂)) -> (Disjoint.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (BoundedOrder.toOrderBot.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) (CompleteLattice.toBoundedOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))) H₁ H₂))
-but is expected to have type
- forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u1} G _inst_1), (IsPGroup.{u1} p₁ (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁)) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u1} p₂ (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₂)) (Subgroup.toGroup.{u1} G _inst_1 H₂)) -> (Disjoint.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))) (BoundedOrder.toOrderBot.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) (CompleteLattice.toBoundedOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))) H₁ H₂))
-Case conversion may be inaccurate. Consider using '#align is_p_group.disjoint_of_ne IsPGroup.disjoint_of_neₓ'. -/
/-- p-groups with different p are disjoint -/
theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂)
(H₁ H₂ : Subgroup G) (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) : Disjoint H₁ H₂ :=
@@ -552,12 +420,6 @@ include hGpn
open Subgroup
-/- warning: is_p_group.card_center_eq_prime_pow -> IsPGroup.card_center_eq_prime_pow is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)] {n : Nat}, (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p n)) -> (LT.lt.{0} Nat Nat.hasLt (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero))) n) -> (forall [_inst_4 : Fintype.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1))], Exists.{1} Nat (fun (k : Nat) => Exists.{0} (GT.gt.{0} Nat Nat.hasLt k (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) (fun (H : GT.gt.{0} Nat Nat.hasLt k (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) => Eq.{1} Nat (Fintype.card.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1)) _inst_4) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p k))))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)] {n : Nat}, (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p n)) -> (LT.lt.{0} Nat instLTNat (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0)) n) -> (forall [_inst_4 : Fintype.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Subgroup.center.{u1} G _inst_1)))], Exists.{1} Nat (fun (k : Nat) => And (GT.gt.{0} Nat instLTNat k (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) (Eq.{1} Nat (Fintype.card.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Subgroup.center.{u1} G _inst_1))) _inst_4) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p k))))
-Case conversion may be inaccurate. Consider using '#align is_p_group.card_center_eq_prime_pow IsPGroup.card_center_eq_prime_powₓ'. -/
/-- The cardinality of the `center` of a `p`-group is `p ^ k` where `k` is positive. -/
theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
∃ k > 0, card (center G) = p ^ k :=
@@ -599,12 +461,6 @@ def commGroupOfCardEqPrimeSq (hG : card G = p ^ 2) : CommGroup G :=
#align is_p_group.comm_group_of_card_eq_prime_sq IsPGroup.commGroupOfCardEqPrimeSq
-/
-/- warning: is_p_group.commutative_of_card_eq_prime_sq -> IsPGroup.commutative_of_card_eq_prime_sq is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)], (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p (OfNat.ofNat.{0} Nat 2 (OfNat.mk.{0} Nat 2 (bit0.{0} Nat Nat.hasAdd (One.one.{0} Nat Nat.hasOne)))))) -> (forall (a : G) (b : G), Eq.{succ u1} G (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) a b) (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) b a))
-but is expected to have type
- forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)], (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p (OfNat.ofNat.{0} Nat 2 (instOfNatNat 2)))) -> (forall (a : G) (b : G), Eq.{succ u1} G (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) a b) (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) b a))
-Case conversion may be inaccurate. Consider using '#align is_p_group.commutative_of_card_eq_prime_sq IsPGroup.commutative_of_card_eq_prime_sqₓ'. -/
/-- A group of order `p ^ 2` is commutative. See also `is_p_group.comm_group_of_card_eq_prime_sq`
for the `comm_group` instance. -/
theorem commutative_of_card_eq_prime_sq (hG : card G = p ^ 2) : ∀ a b : G, a * b = b * a :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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.p_group
-! leanprover-community/mathlib commit f694c7dead66f5d4c80f446c796a5aad14707f0e
+! leanprover-community/mathlib commit 0b7c740e25651db0ba63648fbae9f9d6f941e31b
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -19,6 +19,9 @@ import Mathbin.Tactic.IntervalCases
/-!
# p-groups
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file contains a proof that if `G` is a `p`-group acting on a finite set `α`,
then the number of fixed points of the action is congruent mod `p` to the cardinality of `α`.
It also contains proofs of some corollaries of this lemma about existence of fixed points.
mathlib commit https://github.com/leanprover-community/mathlib/commit/ef95945cd48c932c9e034872bd25c3c220d9c946
@@ -31,15 +31,18 @@ open Fintype MulAction
variable (p : ℕ) (G : Type _) [Group G]
+#print IsPGroup /-
/-- A p-group is a group in which every element has prime power order -/
def IsPGroup : Prop :=
∀ g : G, ∃ k : ℕ, g ^ p ^ k = 1
#align is_p_group IsPGroup
+-/
variable {p} {G}
namespace IsPGroup
+#print IsPGroup.iff_orderOf /-
theorem iff_orderOf [hp : Fact p.Prime] : IsPGroup p G ↔ ∀ g : G, ∃ k : ℕ, orderOf g = p ^ k :=
forall_congr' fun g =>
⟨fun ⟨k, hk⟩ =>
@@ -47,15 +50,25 @@ theorem iff_orderOf [hp : Fact p.Prime] : IsPGroup p G ↔ ∀ g : G, ∃ k :
((Nat.dvd_prime_pow hp.out).mp (orderOf_dvd_of_pow_eq_one hk)),
Exists.imp fun k hk => by rw [← hk, pow_orderOf_eq_one]⟩
#align is_p_group.iff_order_of IsPGroup.iff_orderOf
+-/
+#print IsPGroup.of_card /-
theorem of_card [Fintype G] {n : ℕ} (hG : card G = p ^ n) : IsPGroup p G := fun g =>
⟨n, by rw [← hG, pow_card_eq_one]⟩
#align is_p_group.of_card IsPGroup.of_card
+-/
+/- warning: is_p_group.of_bot -> IsPGroup.of_bot is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasBot.{u1} G _inst_1))) (Subgroup.toGroup.{u1} G _inst_1 (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasBot.{u1} G _inst_1)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instBotSubgroup.{u1} G _inst_1)))) (Subgroup.toGroup.{u1} G _inst_1 (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instBotSubgroup.{u1} G _inst_1)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.of_bot IsPGroup.of_botₓ'. -/
theorem of_bot : IsPGroup p (⊥ : Subgroup G) :=
of_card (Subgroup.card_bot.trans (pow_zero p).symm)
#align is_p_group.of_bot IsPGroup.of_bot
+#print IsPGroup.iff_card /-
theorem iff_card [Fact p.Prime] [Fintype G] : IsPGroup p G ↔ ∃ n : ℕ, card G = p ^ n :=
by
have hG : card G ≠ 0 := card_ne_zero
@@ -71,6 +84,7 @@ theorem iff_card [Fact p.Prime] [Fintype G] : IsPGroup p G ↔ ∃ n : ℕ, card
obtain ⟨k, hk⟩ := (iff_order_of.mp h) g
exact (hq1.pow_eq_iff.mp (hg.symm.trans hk).symm).1.symm
#align is_p_group.iff_card IsPGroup.iff_card
+-/
section GIsPGroup
@@ -78,16 +92,34 @@ variable (hG : IsPGroup p G)
include hG
+/- warning: is_p_group.of_injective -> IsPGroup.of_injective is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (Function.Injective.{succ u2, succ u1} H G (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (fun (_x : MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) => H -> G) (MonoidHom.hasCoeToFun.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (Function.Injective.{succ u2, succ u1} H G (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) H (fun (_x : H) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : H) => G) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) H G (MulOneClass.toMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (MonoidHom.monoidHomClass.{u2, u1} H G (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
+Case conversion may be inaccurate. Consider using '#align is_p_group.of_injective IsPGroup.of_injectiveₓ'. -/
theorem of_injective {H : Type _} [Group H] (ϕ : H →* G) (hϕ : Function.Injective ϕ) :
IsPGroup p H := by
simp_rw [IsPGroup, ← hϕ.eq_iff, ϕ.map_pow, ϕ.map_one]
exact fun h => hG (ϕ h)
#align is_p_group.of_injective IsPGroup.of_injective
+/- warning: is_p_group.to_subgroup -> IsPGroup.to_subgroup is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall (H : Subgroup.{u1} G _inst_1), IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall (H : Subgroup.{u1} G _inst_1), IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_subgroup IsPGroup.to_subgroupₓ'. -/
theorem to_subgroup (H : Subgroup G) : IsPGroup p H :=
hG.of_injective H.Subtype Subtype.coe_injective
#align is_p_group.to_subgroup IsPGroup.to_subgroup
+/- warning: is_p_group.of_surjective -> IsPGroup.of_surjective is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))), (Function.Surjective.{succ u1, succ u2} G H (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) (fun (_x : MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) => G -> H) (MonoidHom.hasCoeToFun.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H] (ϕ : MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))), (Function.Surjective.{succ u1, succ u2} G H (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) G (fun (_x : G) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : G) => H) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) G H (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))) G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))) (MonoidHom.monoidHomClass.{u1, u2} G H (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2)))))) ϕ)) -> (IsPGroup.{u2} p H _inst_2))
+Case conversion may be inaccurate. Consider using '#align is_p_group.of_surjective IsPGroup.of_surjectiveₓ'. -/
theorem of_surjective {H : Type _} [Group H] (ϕ : G →* H) (hϕ : Function.Surjective ϕ) :
IsPGroup p H :=
by
@@ -95,19 +127,30 @@ theorem of_surjective {H : Type _} [Group H] (ϕ : G →* H) (hϕ : Function.Sur
rw [← hg, ← ϕ.map_pow, hk, ϕ.map_one]
#align is_p_group.of_surjective IsPGroup.of_surjective
+#print IsPGroup.to_quotient /-
theorem to_quotient (H : Subgroup G) [H.Normal] : IsPGroup p (G ⧸ H) :=
hG.ofSurjective (QuotientGroup.mk' H) Quotient.surjective_Quotient_mk''
#align is_p_group.to_quotient IsPGroup.to_quotient
+-/
+/- warning: is_p_group.of_equiv -> IsPGroup.of_equiv is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H], (MulEquiv.{u1, u2} G H (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toHasMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))))) -> (IsPGroup.{u2} p H _inst_2))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall {H : Type.{u2}} [_inst_2 : Group.{u2} H], (MulEquiv.{u1, u2} G H (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MulOneClass.toMul.{u2} H (Monoid.toMulOneClass.{u2} H (DivInvMonoid.toMonoid.{u2} H (Group.toDivInvMonoid.{u2} H _inst_2))))) -> (IsPGroup.{u2} p H _inst_2))
+Case conversion may be inaccurate. Consider using '#align is_p_group.of_equiv IsPGroup.of_equivₓ'. -/
theorem of_equiv {H : Type _} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.ofSurjective ϕ.toMonoidHom ϕ.Surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
+#print IsPGroup.orderOf_coprime /-
theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).coprime n :=
let ⟨k, hk⟩ := hG g
(hn.pow_leftₓ k).coprime_dvd_left (orderOf_dvd_of_pow_eq_one hk)
#align is_p_group.order_of_coprime IsPGroup.orderOf_coprime
+-/
+#print IsPGroup.powEquiv /-
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).coprime n := fun g =>
@@ -121,27 +164,35 @@ noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
right_inv := fun g =>
Subtype.ext_iff.1 <| (powCoprime (h g)).right_inv ⟨g, Subgroup.mem_zpowers g⟩ }
#align is_p_group.pow_equiv IsPGroup.powEquiv
+-/
+#print IsPGroup.powEquiv_apply /-
@[simp]
theorem powEquiv_apply {n : ℕ} (hn : p.coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
rfl
#align is_p_group.pow_equiv_apply IsPGroup.powEquiv_apply
+-/
+#print IsPGroup.powEquiv_symm_apply /-
@[simp]
theorem powEquiv_symm_apply {n : ℕ} (hn : p.coprime n) (g : G) :
(hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers'] <;> rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
+-/
variable [hp : Fact p.Prime]
include hp
+#print IsPGroup.powEquiv' /-
/-- If `p ∤ n`, then the `n`th power map is a bijection. -/
@[reducible]
noncomputable def powEquiv' {n : ℕ} (hn : ¬p ∣ n) : G ≃ G :=
powEquiv hG (hp.out.coprime_iff_not_dvd.mpr hn)
#align is_p_group.pow_equiv' IsPGroup.powEquiv'
+-/
+#print IsPGroup.index /-
theorem index (H : Subgroup G) [H.FiniteIndex] : ∃ n : ℕ, H.index = p ^ n :=
by
haveI := H.normal_core.fintype_quotient_of_finite_index
@@ -152,7 +203,9 @@ theorem index (H : Subgroup G) [H.FiniteIndex] : ∃ n : ℕ, H.index = p ^ n :=
(Subgroup.index_dvd_of_le H.normal_core_le))
exact ⟨k, hk2⟩
#align is_p_group.index IsPGroup.index
+-/
+#print IsPGroup.card_eq_or_dvd /-
theorem card_eq_or_dvd : Nat.card G = 1 ∨ p ∣ Nat.card G :=
by
cases fintypeOrInfinite G
@@ -164,7 +217,14 @@ theorem card_eq_or_dvd : Nat.card G = 1 ∨ p ∣ Nat.card G :=
· rw [Nat.card_eq_zero_of_infinite]
exact Or.inr ⟨0, rfl⟩
#align is_p_group.card_eq_or_dvd IsPGroup.card_eq_or_dvd
+-/
+/- warning: is_p_group.nontrivial_iff_card -> IsPGroup.nontrivial_iff_card is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_2 : Fintype.{u1} G], Iff (Nontrivial.{u1} G) (Exists.{1} Nat (fun (n : Nat) => Exists.{0} (GT.gt.{0} Nat Nat.hasLt n (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) (fun (H : GT.gt.{0} Nat Nat.hasLt n (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) => Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p n)))))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_2 : Fintype.{u1} G], Iff (Nontrivial.{u1} G) (Exists.{1} Nat (fun (n : Nat) => And (GT.gt.{0} Nat instLTNat n (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p n)))))
+Case conversion may be inaccurate. Consider using '#align is_p_group.nontrivial_iff_card IsPGroup.nontrivial_iff_cardₓ'. -/
theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p ^ n :=
⟨fun hGnt =>
let ⟨k, hk⟩ := iff_card.1 hG
@@ -178,6 +238,7 @@ theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p
variable {α : Type _} [MulAction G α]
+#print IsPGroup.card_orbit /-
theorem card_orbit (a : α) [Fintype (orbit G a)] : ∃ n : ℕ, card (orbit G a) = p ^ n :=
by
let ϕ := orbit_equiv_quotient_stabilizer G a
@@ -186,9 +247,11 @@ theorem card_orbit (a : α) [Fintype (orbit G a)] : ∃ n : ℕ, card (orbit G a
rw [card_congr ϕ, ← Subgroup.index_eq_card]
exact hG.index (stabilizer G a)
#align is_p_group.card_orbit IsPGroup.card_orbit
+-/
variable (α) [Fintype α]
+#print IsPGroup.card_modEq_card_fixedPoints /-
/-- If `G` is a `p`-group acting on a finite set `α`, then the number of fixed points
of the action is congruent mod `p` to the cardinality of `α` -/
theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
@@ -227,7 +290,9 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
⟨⟨b, mem_fixed_points_iff_card_orbit_eq_one.2 <| by rw [hk, this, pow_zero]⟩,
Finset.mem_univ _, ne_of_eq_of_ne Nat.cast_one one_ne_zero, rfl⟩
#align is_p_group.card_modeq_card_fixed_points IsPGroup.card_modEq_card_fixedPoints
+-/
+#print IsPGroup.nonempty_fixed_point_of_prime_not_dvd_card /-
/-- If a p-group acts on `α` and the cardinality of `α` is not a multiple
of `p` then the action has a fixed point. -/
theorem nonempty_fixed_point_of_prime_not_dvd_card (hpα : ¬p ∣ card α) [Finite (fixedPoints G α)] :
@@ -240,7 +305,9 @@ theorem nonempty_fixed_point_of_prime_not_dvd_card (hpα : ¬p ∣ card α) [Fin
rw [← Nat.modEq_zero_iff_dvd, ← hpα]
exact hG.card_modeq_card_fixed_points α)
#align is_p_group.nonempty_fixed_point_of_prime_not_dvd_card IsPGroup.nonempty_fixed_point_of_prime_not_dvd_card
+-/
+#print IsPGroup.exists_fixed_point_of_prime_dvd_card_of_fixed_point /-
/-- If a p-group acts on `α` and the cardinality of `α` is a multiple
of `p`, and the action has one fixed point, then it has another fixed point. -/
theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card α) {a : α}
@@ -255,7 +322,14 @@ theorem exists_fixed_point_of_prime_dvd_card_of_fixed_point (hpα : p ∣ card
let ⟨⟨b, hb⟩, hba⟩ := exists_ne_of_one_lt_card hα ⟨a, ha⟩
⟨b, hb, fun hab => hba (by simp_rw [hab])⟩
#align is_p_group.exists_fixed_point_of_prime_dvd_card_of_fixed_point IsPGroup.exists_fixed_point_of_prime_dvd_card_of_fixed_point
+-/
+/- warning: is_p_group.center_nontrivial -> IsPGroup.center_nontrivial is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], Nontrivial.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], Nontrivial.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Subgroup.center.{u1} G _inst_1))))
+Case conversion may be inaccurate. Consider using '#align is_p_group.center_nontrivial IsPGroup.center_nontrivialₓ'. -/
theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.center G) := by
classical
cases nonempty_fintype G
@@ -267,6 +341,12 @@ theorem center_nontrivial [Nontrivial G] [Finite G] : Nontrivial (Subgroup.cente
exact hn.symm ▸ dvd_pow_self _ (ne_of_gt hn0)
#align is_p_group.center_nontrivial IsPGroup.center_nontrivial
+/- warning: is_p_group.bot_lt_center -> IsPGroup.bot_lt_center is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], LT.lt.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLt.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasBot.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G], (IsPGroup.{u1} p G _inst_1) -> (forall [hp : Fact (Nat.Prime p)] [_inst_4 : Nontrivial.{u1} G] [_inst_5 : Finite.{succ u1} G], LT.lt.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLT.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) (Bot.bot.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instBotSubgroup.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1))
+Case conversion may be inaccurate. Consider using '#align is_p_group.bot_lt_center IsPGroup.bot_lt_centerₓ'. -/
theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
by
haveI := center_nontrivial hG
@@ -277,25 +357,55 @@ theorem bot_lt_center [Nontrivial G] [Finite G] : ⊥ < Subgroup.center G :=
end GIsPGroup
+/- warning: is_p_group.to_le -> IsPGroup.to_le is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) H K) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_le IsPGroup.to_leₓ'. -/
theorem to_le {H K : Subgroup G} (hK : IsPGroup p K) (hHK : H ≤ K) : IsPGroup p H :=
hK.of_injective (Subgroup.inclusion hHK) fun a b h =>
Subtype.ext (show _ from Subtype.ext_iff.mp h)
#align is_p_group.to_le IsPGroup.to_le
+/- warning: is_p_group.to_inf_left -> IsPGroup.to_inf_left is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_inf_left IsPGroup.to_inf_leftₓ'. -/
theorem to_inf_left {H K : Subgroup G} (hH : IsPGroup p H) : IsPGroup p (H ⊓ K : Subgroup G) :=
hH.to_le inf_le_left
#align is_p_group.to_inf_left IsPGroup.to_inf_left
+/- warning: is_p_group.to_inf_right -> IsPGroup.to_inf_right is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.hasInf.{u1} G _inst_1) H K)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Inf.inf.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instInfSubgroup.{u1} G _inst_1) H K)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_inf_right IsPGroup.to_inf_rightₓ'. -/
theorem to_inf_right {H K : Subgroup G} (hK : IsPGroup p K) : IsPGroup p (H ⊓ K : Subgroup G) :=
hK.to_le inf_le_right
#align is_p_group.to_inf_right IsPGroup.to_inf_right
+/- warning: is_p_group.map -> IsPGroup.map is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Type.{u2}} [_inst_2 : Group.{u2} K] (ϕ : MonoidHom.{u1, u2} G K (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2)))), IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (Subgroup.map.{u1, u2} G _inst_1 K _inst_2 ϕ H)) (Subgroup.toGroup.{u2} K _inst_2 (Subgroup.map.{u1, u2} G _inst_1 K _inst_2 ϕ H)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u2}} [_inst_1 : Group.{u2} G] {H : Subgroup.{u2} G _inst_1}, (IsPGroup.{u2} p (Subtype.{succ u2} G (fun (x : G) => Membership.mem.{u2, u2} G (Subgroup.{u2} G _inst_1) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u2} G _inst_1)) x H)) (Subgroup.toGroup.{u2} G _inst_1 H)) -> (forall {K : Type.{u1}} [_inst_2 : Group.{u1} K] (ϕ : MonoidHom.{u2, u1} G K (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2)))), IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (Subgroup.map.{u2, u1} G _inst_1 K _inst_2 ϕ H))) (Subgroup.toGroup.{u1} K _inst_2 (Subgroup.map.{u2, u1} G _inst_1 K _inst_2 ϕ H)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.map IsPGroup.mapₓ'. -/
theorem map {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : G →* K) :
IsPGroup p (H.map ϕ) := by
rw [← H.subtype_range, MonoidHom.map_range]
exact hH.of_surjective (ϕ.restrict H).range_restrict (ϕ.restrict H).rangeRestrict_surjective
#align is_p_group.map IsPGroup.map
+/- warning: is_p_group.comap_of_ker_is_p_group -> IsPGroup.comap_of_ker_isPGroup is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Type.{u2}} [_inst_2 : Group.{u2} K] (ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)) (Subgroup.toGroup.{u2} K _inst_2 (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ))) -> (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H)) (Subgroup.toGroup.{u2} K _inst_2 (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H))))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u2}} [_inst_1 : Group.{u2} G] {H : Subgroup.{u2} G _inst_1}, (IsPGroup.{u2} p (Subtype.{succ u2} G (fun (x : G) => Membership.mem.{u2, u2} G (Subgroup.{u2} G _inst_1) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u2} G _inst_1)) x H)) (Subgroup.toGroup.{u2} G _inst_1 H)) -> (forall {K : Type.{u1}} [_inst_2 : Group.{u1} K] (ϕ : MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))), (IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (MonoidHom.ker.{u1, u2} K _inst_2 G (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) ϕ))) (Subgroup.toGroup.{u1} K _inst_2 (MonoidHom.ker.{u1, u2} K _inst_2 G (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) ϕ))) -> (IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))) (Subgroup.toGroup.{u1} K _inst_2 (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))))
+Case conversion may be inaccurate. Consider using '#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroupₓ'. -/
theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K]
(ϕ : K →* G) (hϕ : IsPGroup p ϕ.ker) : IsPGroup p (H.comap ϕ) :=
by
@@ -307,21 +417,45 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
+/- warning: is_p_group.ker_is_p_group_of_injective -> IsPGroup.ker_isPGroup_of_injective is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {K : Type.{u2}} [_inst_2 : Group.{u2} K] {ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))}, (Function.Injective.{succ u2, succ u1} K G (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (fun (_x : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) => K -> G) (MonoidHom.hasCoeToFun.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) ϕ)) -> (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)) (Subgroup.toGroup.{u2} K _inst_2 (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {K : Type.{u2}} [_inst_2 : Group.{u2} K] {ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))}, (Function.Injective.{succ u2, succ u1} K G (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) K (fun (_x : K) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : K) => G) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) K G (MulOneClass.toMul.{u2} K (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2)))) (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) (MonoidHom.monoidHomClass.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))))) ϕ)) -> (IsPGroup.{u2} p (Subtype.{succ u2} K (fun (x : K) => Membership.mem.{u2, u2} K (Subgroup.{u2} K _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u2} K _inst_2)) x (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ))) (Subgroup.toGroup.{u2} K _inst_2 (MonoidHom.ker.{u2, u1} K _inst_2 G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))) ϕ)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.ker_is_p_group_of_injective IsPGroup.ker_isPGroup_of_injectiveₓ'. -/
theorem ker_isPGroup_of_injective {K : Type _} [Group K] {ϕ : K →* G} (hϕ : Function.Injective ϕ) :
IsPGroup p ϕ.ker :=
(congr_arg (fun Q : Subgroup K => IsPGroup p Q) (ϕ.ker_eq_bot_iff.mpr hϕ)).mpr IsPGroup.of_bot
#align is_p_group.ker_is_p_group_of_injective IsPGroup.ker_isPGroup_of_injective
+/- warning: is_p_group.comap_of_injective -> IsPGroup.comap_of_injective is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Type.{u2}} [_inst_2 : Group.{u2} K] (ϕ : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))), (Function.Injective.{succ u2, succ u1} K G (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) (fun (_x : MonoidHom.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) => K -> G) (MonoidHom.hasCoeToFun.{u2, u1} K G (Monoid.toMulOneClass.{u2} K (DivInvMonoid.toMonoid.{u2} K (Group.toDivInvMonoid.{u2} K _inst_2))) (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1)))) ϕ)) -> (IsPGroup.{u2} p (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} K _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} K _inst_2) K (Subgroup.setLike.{u2} K _inst_2)) (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H)) (Subgroup.toGroup.{u2} K _inst_2 (Subgroup.comap.{u2, u1} K _inst_2 G _inst_1 ϕ H))))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u2}} [_inst_1 : Group.{u2} G] {H : Subgroup.{u2} G _inst_1}, (IsPGroup.{u2} p (Subtype.{succ u2} G (fun (x : G) => Membership.mem.{u2, u2} G (Subgroup.{u2} G _inst_1) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u2} G _inst_1)) x H)) (Subgroup.toGroup.{u2} G _inst_1 H)) -> (forall {K : Type.{u1}} [_inst_2 : Group.{u1} K] (ϕ : MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))), (Function.Injective.{succ u1, succ u2} K G (FunLike.coe.{max (succ u2) (succ u1), succ u1, succ u2} (MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) K (fun (_x : K) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : K) => G) _x) (MulHomClass.toFunLike.{max u2 u1, u1, u2} (MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) K G (MulOneClass.toMul.{u1} K (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2)))) (MulOneClass.toMul.{u2} G (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) (MonoidHomClass.toMulHomClass.{max u2 u1, u1, u2} (MonoidHom.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))) K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1))) (MonoidHom.monoidHomClass.{u1, u2} K G (Monoid.toMulOneClass.{u1} K (DivInvMonoid.toMonoid.{u1} K (Group.toDivInvMonoid.{u1} K _inst_2))) (Monoid.toMulOneClass.{u2} G (DivInvMonoid.toMonoid.{u2} G (Group.toDivInvMonoid.{u2} G _inst_1)))))) ϕ)) -> (IsPGroup.{u1} p (Subtype.{succ u1} K (fun (x : K) => Membership.mem.{u1, u1} K (Subgroup.{u1} K _inst_2) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} K _inst_2) K (Subgroup.instSetLikeSubgroup.{u1} K _inst_2)) x (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))) (Subgroup.toGroup.{u1} K _inst_2 (Subgroup.comap.{u1, u2} K _inst_2 G _inst_1 ϕ H))))
+Case conversion may be inaccurate. Consider using '#align is_p_group.comap_of_injective IsPGroup.comap_of_injectiveₓ'. -/
theorem comap_of_injective {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : K →* G)
(hϕ : Function.Injective ϕ) : IsPGroup p (H.comap ϕ) :=
hH.comap_of_ker_isPGroup ϕ (ker_isPGroup_of_injective hϕ)
#align is_p_group.comap_of_injective IsPGroup.comap_of_injective
+/- warning: is_p_group.comap_subtype -> IsPGroup.comap_subtype is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Subgroup.{u1} G _inst_1}, IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.setLike.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K))) (Subgroup.comap.{u1, u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H)) (Subgroup.toGroup.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K) (Subgroup.comap.{u1, u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (forall {K : Subgroup.{u1} G _inst_1}, IsPGroup.{u1} p (Subtype.{succ u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (fun (x : Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) => Membership.mem.{u1, u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.instSetLikeSubgroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K))) x (Subgroup.comap.{u1, u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H))) (Subgroup.toGroup.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K) (Subgroup.comap.{u1, u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K) G _inst_1 (Subgroup.subtype.{u1} G _inst_1 K) H)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.comap_subtype IsPGroup.comap_subtypeₓ'. -/
theorem comap_subtype {H : Subgroup G} (hH : IsPGroup p H) {K : Subgroup G} :
IsPGroup p (H.comap K.Subtype) :=
hH.comap_of_injective K.Subtype Subtype.coe_injective
#align is_p_group.comap_subtype IsPGroup.comap_subtype
+/- warning: is_p_group.to_sup_of_normal_right -> IsPGroup.to_sup_of_normal_right is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 K], IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 K], IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_right IsPGroup.to_sup_of_normal_rightₓ'. -/
theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
[K.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
by
@@ -330,11 +464,23 @@ theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
rwa [QuotientGroup.ker_mk']
#align is_p_group.to_sup_of_normal_right IsPGroup.to_sup_of_normal_right
+/- warning: is_p_group.to_sup_of_normal_left -> IsPGroup.to_sup_of_normal_left is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 H], IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (forall [_inst_2 : Subgroup.Normal.{u1} G _inst_1 H], IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_left IsPGroup.to_sup_of_normal_leftₓ'. -/
theorem to_sup_of_normal_left {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
[H.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
(congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right hK hH)
#align is_p_group.to_sup_of_normal_left IsPGroup.to_sup_of_normal_left
+/- warning: is_p_group.to_sup_of_normal_right' -> IsPGroup.to_sup_of_normal_right' is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) H (Subgroup.normalizer.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H (Subgroup.normalizer.{u1} G _inst_1 K)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_right' IsPGroup.to_sup_of_normal_right'ₓ'. -/
theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : H ≤ K.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
let hHK' :=
@@ -346,11 +492,23 @@ theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsP
(Subgroup.subgroupOfEquivOfLe (sup_le hHK Subgroup.le_normalizer))
#align is_p_group.to_sup_of_normal_right' IsPGroup.to_sup_of_normal_right'
+/- warning: is_p_group.to_sup_of_normal_left' -> IsPGroup.to_sup_of_normal_left' is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) K) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) K (Subgroup.normalizer.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toHasSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))))) H K)))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] {H : Subgroup.{u1} G _inst_1} {K : Subgroup.{u1} G _inst_1}, (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H)) (Subgroup.toGroup.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x K)) (Subgroup.toGroup.{u1} G _inst_1 K)) -> (LE.le.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) K (Subgroup.normalizer.{u1} G _inst_1 H)) -> (IsPGroup.{u1} p (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K))) (Subgroup.toGroup.{u1} G _inst_1 (Sup.sup.{u1} (Subgroup.{u1} G _inst_1) (SemilatticeSup.toSup.{u1} (Subgroup.{u1} G _inst_1) (Lattice.toSemilatticeSup.{u1} (Subgroup.{u1} G _inst_1) (ConditionallyCompleteLattice.toLattice.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.toConditionallyCompleteLattice.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) H K)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'ₓ'. -/
theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : K ≤ H.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
(congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right' hK hH hHK)
#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'
+/- warning: is_p_group.coprime_card_of_ne -> IsPGroup.coprime_card_of_ne is a dubious translation:
+lean 3 declaration is
+ forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] {G₂ : Type.{u2}} [_inst_2 : Group.{u2} G₂] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u2} G₂ _inst_2) [_inst_3 : Fintype.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁)] [_inst_4 : Fintype.{u2} (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} G₂ _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.setLike.{u2} G₂ _inst_2)) H₂)], (IsPGroup.{u1} p₁ (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u2} p₂ (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} G₂ _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.setLike.{u2} G₂ _inst_2)) H₂) (Subgroup.toGroup.{u2} G₂ _inst_2 H₂)) -> (Nat.coprime (Fintype.card.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁) _inst_3) (Fintype.card.{u2} (coeSort.{succ u2, succ (succ u2)} (Subgroup.{u2} G₂ _inst_2) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.setLike.{u2} G₂ _inst_2)) H₂) _inst_4)))
+but is expected to have type
+ forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] {G₂ : Type.{u2}} [_inst_2 : Group.{u2} G₂] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u2} G₂ _inst_2) [_inst_3 : Fintype.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁))] [_inst_4 : Fintype.{u2} (Subtype.{succ u2} G₂ (fun (x : G₂) => Membership.mem.{u2, u2} G₂ (Subgroup.{u2} G₂ _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.instSetLikeSubgroup.{u2} G₂ _inst_2)) x H₂))], (IsPGroup.{u1} p₁ (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁)) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u2} p₂ (Subtype.{succ u2} G₂ (fun (x : G₂) => Membership.mem.{u2, u2} G₂ (Subgroup.{u2} G₂ _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.instSetLikeSubgroup.{u2} G₂ _inst_2)) x H₂)) (Subgroup.toGroup.{u2} G₂ _inst_2 H₂)) -> (Nat.coprime (Fintype.card.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁)) _inst_3) (Fintype.card.{u2} (Subtype.{succ u2} G₂ (fun (x : G₂) => Membership.mem.{u2, u2} G₂ (Subgroup.{u2} G₂ _inst_2) (SetLike.instMembership.{u2, u2} (Subgroup.{u2} G₂ _inst_2) G₂ (Subgroup.instSetLikeSubgroup.{u2} G₂ _inst_2)) x H₂)) _inst_4)))
+Case conversion may be inaccurate. Consider using '#align is_p_group.coprime_card_of_ne IsPGroup.coprime_card_of_neₓ'. -/
/-- finite p-groups with different p have coprime orders -/
theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
@@ -362,6 +520,12 @@ theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁
exact Nat.coprime_pow_primes _ _ hp₁.elim hp₂.elim hne
#align is_p_group.coprime_card_of_ne IsPGroup.coprime_card_of_ne
+/- warning: is_p_group.disjoint_of_ne -> IsPGroup.disjoint_of_ne is a dubious translation:
+lean 3 declaration is
+ forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u1} G _inst_1), (IsPGroup.{u1} p₁ (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₁) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u1} p₂ (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) H₂) (Subgroup.toGroup.{u1} G _inst_1 H₂)) -> (Disjoint.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (BoundedOrder.toOrderBot.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toHasLe.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (SetLike.partialOrder.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)))) (CompleteLattice.toBoundedOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.completeLattice.{u1} G _inst_1))) H₁ H₂))
+but is expected to have type
+ forall {G : Type.{u1}} [_inst_1 : Group.{u1} G] (p₁ : Nat) (p₂ : Nat) [hp₁ : Fact (Nat.Prime p₁)] [hp₂ : Fact (Nat.Prime p₂)], (Ne.{1} Nat p₁ p₂) -> (forall (H₁ : Subgroup.{u1} G _inst_1) (H₂ : Subgroup.{u1} G _inst_1), (IsPGroup.{u1} p₁ (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₁)) (Subgroup.toGroup.{u1} G _inst_1 H₁)) -> (IsPGroup.{u1} p₂ (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x H₂)) (Subgroup.toGroup.{u1} G _inst_1 H₂)) -> (Disjoint.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))) (BoundedOrder.toOrderBot.{u1} (Subgroup.{u1} G _inst_1) (Preorder.toLE.{u1} (Subgroup.{u1} G _inst_1) (PartialOrder.toPreorder.{u1} (Subgroup.{u1} G _inst_1) (OmegaCompletePartialOrder.toPartialOrder.{u1} (Subgroup.{u1} G _inst_1) (CompleteLattice.instOmegaCompletePartialOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))))) (CompleteLattice.toBoundedOrder.{u1} (Subgroup.{u1} G _inst_1) (Subgroup.instCompleteLatticeSubgroup.{u1} G _inst_1))) H₁ H₂))
+Case conversion may be inaccurate. Consider using '#align is_p_group.disjoint_of_ne IsPGroup.disjoint_of_neₓ'. -/
/-- p-groups with different p are disjoint -/
theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂)
(H₁ H₂ : Subgroup G) (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) : Disjoint H₁ H₂ :=
@@ -385,6 +549,12 @@ include hGpn
open Subgroup
+/- warning: is_p_group.card_center_eq_prime_pow -> IsPGroup.card_center_eq_prime_pow is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)] {n : Nat}, (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p n)) -> (LT.lt.{0} Nat Nat.hasLt (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero))) n) -> (forall [_inst_4 : Fintype.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1))], Exists.{1} Nat (fun (k : Nat) => Exists.{0} (GT.gt.{0} Nat Nat.hasLt k (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) (fun (H : GT.gt.{0} Nat Nat.hasLt k (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) => Eq.{1} Nat (Fintype.card.{u1} (coeSort.{succ u1, succ (succ u1)} (Subgroup.{u1} G _inst_1) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.setLike.{u1} G _inst_1)) (Subgroup.center.{u1} G _inst_1)) _inst_4) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p k))))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)] {n : Nat}, (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p n)) -> (LT.lt.{0} Nat instLTNat (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0)) n) -> (forall [_inst_4 : Fintype.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Subgroup.center.{u1} G _inst_1)))], Exists.{1} Nat (fun (k : Nat) => And (GT.gt.{0} Nat instLTNat k (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) (Eq.{1} Nat (Fintype.card.{u1} (Subtype.{succ u1} G (fun (x : G) => Membership.mem.{u1, u1} G (Subgroup.{u1} G _inst_1) (SetLike.instMembership.{u1, u1} (Subgroup.{u1} G _inst_1) G (Subgroup.instSetLikeSubgroup.{u1} G _inst_1)) x (Subgroup.center.{u1} G _inst_1))) _inst_4) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p k))))
+Case conversion may be inaccurate. Consider using '#align is_p_group.card_center_eq_prime_pow IsPGroup.card_center_eq_prime_powₓ'. -/
/-- The cardinality of the `center` of a `p`-group is `p ^ k` where `k` is positive. -/
theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
∃ k > 0, card (center G) = p ^ k :=
@@ -397,6 +567,7 @@ theorem card_center_eq_prime_pow (hn : 0 < n) [Fintype (center G)] :
omit hGpn
+#print IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq /-
/-- The quotient by the center of a group of cardinality `p ^ 2` is cyclic. -/
theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
IsCyclic (G ⧸ center G) := by
@@ -414,14 +585,23 @@ theorem cyclic_center_quotient_of_card_eq_prime_sq (hG : card G = p ^ 2) :
(mul_right_injective₀ (pow_ne_zero 2 (NeZero.ne p))
(hG.trans (mul_one (p ^ 2)).symm)).le⟩
#align is_p_group.cyclic_center_quotient_of_card_eq_prime_sq IsPGroup.cyclic_center_quotient_of_card_eq_prime_sq
+-/
+#print IsPGroup.commGroupOfCardEqPrimeSq /-
/-- A group of order `p ^ 2` is commutative. See also `is_p_group.commutative_of_card_eq_prime_sq`
for just the proof that `∀ a b, a * b = b * a` -/
def commGroupOfCardEqPrimeSq (hG : card G = p ^ 2) : CommGroup G :=
@commGroupOfCycleCenterQuotient _ _ _ _ (cyclic_center_quotient_of_card_eq_prime_sq hG) _
(QuotientGroup.ker_mk' (center G)).le
#align is_p_group.comm_group_of_card_eq_prime_sq IsPGroup.commGroupOfCardEqPrimeSq
+-/
+/- warning: is_p_group.commutative_of_card_eq_prime_sq -> IsPGroup.commutative_of_card_eq_prime_sq is a dubious translation:
+lean 3 declaration is
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)], (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p (OfNat.ofNat.{0} Nat 2 (OfNat.mk.{0} Nat 2 (bit0.{0} Nat Nat.hasAdd (One.one.{0} Nat Nat.hasOne)))))) -> (forall (a : G) (b : G), Eq.{succ u1} G (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) a b) (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toHasMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) b a))
+but is expected to have type
+ forall {p : Nat} {G : Type.{u1}} [_inst_1 : Group.{u1} G] [_inst_2 : Fintype.{u1} G] [_inst_3 : Fact (Nat.Prime p)], (Eq.{1} Nat (Fintype.card.{u1} G _inst_2) (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p (OfNat.ofNat.{0} Nat 2 (instOfNatNat 2)))) -> (forall (a : G) (b : G), Eq.{succ u1} G (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) a b) (HMul.hMul.{u1, u1, u1} G G G (instHMul.{u1} G (MulOneClass.toMul.{u1} G (Monoid.toMulOneClass.{u1} G (DivInvMonoid.toMonoid.{u1} G (Group.toDivInvMonoid.{u1} G _inst_1))))) b a))
+Case conversion may be inaccurate. Consider using '#align is_p_group.commutative_of_card_eq_prime_sq IsPGroup.commutative_of_card_eq_prime_sqₓ'. -/
/-- A group of order `p ^ 2` is commutative. See also `is_p_group.comm_group_of_card_eq_prime_sq`
for the `comm_group` instance. -/
theorem commutative_of_card_eq_prime_sq (hG : card G = p ^ 2) : ∀ a b : G, a * b = b * a :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/1a313d8bba1bad05faba71a4a4e9742ab5bd9efd
@@ -304,7 +304,7 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
rw [Subtype.ext_iff, H.coe_pow, Subtype.coe_mk, ← ϕ.map_pow] at hj
obtain ⟨k, hk⟩ := hϕ ⟨g.1 ^ p ^ j, hj⟩
rwa [Subtype.ext_iff, ϕ.ker.coe_pow, Subtype.coe_mk, ← pow_mul, ← pow_add] at hk
- exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).val_pow_eq_pow_val]⟩
+ exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
theorem ker_isPGroup_of_injective {K : Type _} [Group K] {ϕ : K →* G} (hϕ : Function.Injective ϕ) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -197,7 +197,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
calc
card α = card (Σy : Quotient (orbit_rel G α), { x // Quotient.mk'' x = y }) :=
card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbit_rel G α))).symm
- _ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := card_sigma _
+ _ = ∑ a : Quotient (orbit_rel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
_ ≡ ∑ a : fixed_points G α, 1 [MOD p] := _
_ = _ := by simp <;> rfl
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -187,7 +187,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
calc
card α = card (Σy : Quotient (orbitRel G α), { x // Quotient.mk'' x = y }) :=
card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbitRel G α))).symm
- _ = ∑ a : Quotient (orbitRel G α), card { x // Quotient.mk'' x = a } := card_sigma _
+ _ = ∑ a : Quotient (orbitRel G α), card { x // Quotient.mk'' x = a } := card_sigma
_ ≡ ∑ _a : fixedPoints G α, 1 [MOD p] := ?_
_ = _ := by simp; rfl
rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
@@ -187,7 +187,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
calc
card α = card (Σy : Quotient (orbitRel G α), { x // Quotient.mk'' x = y }) :=
card_congr (Equiv.sigmaFiberEquiv (@Quotient.mk'' _ (orbitRel G α))).symm
- _ = ∑ a : Quotient (orbitRel G α), card { x // Quotient.mk'' x = a } := (card_sigma _)
+ _ = ∑ a : Quotient (orbitRel G α), card { x // Quotient.mk'' x = a } := card_sigma _
_ ≡ ∑ _a : fixedPoints G α, 1 [MOD p] := ?_
_ = _ := by simp; rfl
rw [← ZMod.eq_iff_modEq_nat p, Nat.cast_sum, Nat.cast_sum]
LinearOrderedCommGroupWithZero
(#11716)
Reconstitute the file Algebra.Order.Monoid.WithZero
from three files:
Algebra.Order.Monoid.WithZero.Defs
Algebra.Order.Monoid.WithZero.Basic
Algebra.Order.WithZero
Avoid importing it in many files. Most uses were just to get le_zero_iff
to work on Nat
.
Before
After
@@ -205,7 +205,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
rw [key, mem_fixedPoints_iff_card_orbit_eq_one.mp a.2])
obtain ⟨k, hk⟩ := hG.card_orbit b
have : k = 0 :=
- le_zero_iff.1
+ Nat.le_zero.1
(Nat.le_of_lt_succ
(lt_of_not_ge
(mt (pow_dvd_pow p)
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
.@@ -150,7 +150,7 @@ theorem card_eq_or_dvd : Nat.card G = 1 ∨ p ∣ Nat.card G := by
rw [Nat.card_eq_fintype_card, hn]
cases' n with n n
· exact Or.inl rfl
- · exact Or.inr ⟨p ^ n, by rw [pow_succ]⟩
+ · exact Or.inr ⟨p ^ n, by rw [pow_succ']⟩
· rw [Nat.card_eq_zero_of_infinite]
exact Or.inr ⟨0, rfl⟩
#align is_p_group.card_eq_or_dvd IsPGroup.card_eq_or_dvd
Those lemmas have historically been very annoying to use in rw
since all their arguments were implicit. One too many people complained about it on Zulip, so I'm changing them.
Downstream code broken by this change can fix it by adding appropriately many _
s.
Also marks CauSeq.ext
@[ext]
.
Order.BoundedOrder
top_sup_eq
sup_top_eq
bot_sup_eq
sup_bot_eq
top_inf_eq
inf_top_eq
bot_inf_eq
inf_bot_eq
Order.Lattice
sup_idem
sup_comm
sup_assoc
sup_left_idem
sup_right_idem
inf_idem
inf_comm
inf_assoc
inf_left_idem
inf_right_idem
sup_inf_left
sup_inf_right
inf_sup_left
inf_sup_right
Order.MinMax
max_min_distrib_left
max_min_distrib_right
min_max_distrib_left
min_max_distrib_right
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -319,8 +319,7 @@ theorem to_sup_of_normal_right {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
#align is_p_group.to_sup_of_normal_right IsPGroup.to_sup_of_normal_right
theorem to_sup_of_normal_left {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
- [H.Normal] : IsPGroup p (H ⊔ K : Subgroup G) :=
- (congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right hK hH)
+ [H.Normal] : IsPGroup p (H ⊔ K : Subgroup G) := sup_comm H K ▸ to_sup_of_normal_right hK hH
#align is_p_group.to_sup_of_normal_left IsPGroup.to_sup_of_normal_left
theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
@@ -336,7 +335,7 @@ theorem to_sup_of_normal_right' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsP
theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPGroup p K)
(hHK : K ≤ H.normalizer) : IsPGroup p (H ⊔ K : Subgroup G) :=
- (congr_arg (fun H : Subgroup G => IsPGroup p H) sup_comm).mp (to_sup_of_normal_right' hK hH hHK)
+ sup_comm H K ▸ to_sup_of_normal_right' hK hH hHK
#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'
/-- finite p-groups with different p have coprime orders -/
Lemmas around this were a mess, throth in terms of names, statement and location. This PR standardises everything to be in Algebra.BigOperators.Basic
and changes the lemmas to take in InjOn
and SurjOn
assumptions where possible (and where impossible make sure the hypotheses are taken in the correct order) and moves the equality of functions hypothesis last.
Also add a few lemmas that help fix downstream uses by golfing.
From LeanAPAP and LeanCamCombi
@@ -199,7 +199,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
refine'
Eq.symm
(Finset.sum_bij_ne_zero (fun a _ _ => Quotient.mk'' a.1) (fun _ _ _ => Finset.mem_univ _)
- (fun a₁ a₂ _ _ _ _ h =>
+ (fun a₁ _ _ a₂ _ _ h =>
Subtype.eq (mem_fixedPoints'.mp a₂.2 a₁.1 (Quotient.exact' h)))
(fun b => Quotient.inductionOn' b fun b _ hb => _) fun a ha _ => by
rw [key, mem_fixedPoints_iff_card_orbit_eq_one.mp a.2])
Prove variants of Sylow' first theorem relative to a subgroup.
From PFR
Co-authored-by: Sébastien Gouëzel <sebastien.gouezel@univ-rennes1.fr>
@@ -67,6 +67,8 @@ theorem iff_card [Fact p.Prime] [Fintype G] : IsPGroup p G ↔ ∃ n : ℕ, card
exact (hq1.pow_eq_iff.mp (hg.symm.trans hk).symm).1.symm
#align is_p_group.iff_card IsPGroup.iff_card
+alias ⟨exists_card_eq, _⟩ := iff_card
+
section GIsPGroup
variable (hG : IsPGroup p G)
@@ -121,7 +121,7 @@ theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g =
@[simp]
theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
- (hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [←Nat.card_zpowers]; rfl
+ (hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [← Nat.card_zpowers]; rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
variable [hp : Fact p.Prime]
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
@@ -103,7 +103,7 @@ theorem orderOf_coprime {n : ℕ} (hn : p.Coprime n) (g : G) : (orderOf g).Copri
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).Coprime n := fun g =>
- order_eq_card_zpowers' g ▸ hG.orderOf_coprime hn g
+ (Nat.card_zpowers g).symm ▸ hG.orderOf_coprime hn g
{ toFun := (· ^ n)
invFun := fun g => (powCoprime (h g)).symm ⟨g, Subgroup.mem_zpowers g⟩
left_inv := fun g =>
@@ -121,7 +121,7 @@ theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g =
@[simp]
theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
- (hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers']; rfl
+ (hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [←Nat.card_zpowers]; rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
variable [hp : Fact p.Prime]
@@ -354,7 +354,7 @@ theorem disjoint_of_ne (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime] [hp₂ : Fact
intro x hx₁ hx₂
obtain ⟨n₁, hn₁⟩ := iff_orderOf.mp hH₁ ⟨x, hx₁⟩
obtain ⟨n₂, hn₂⟩ := iff_orderOf.mp hH₂ ⟨x, hx₂⟩
- rw [← orderOf_subgroup, Subgroup.coe_mk] at hn₁ hn₂
+ rw [Subgroup.orderOf_mk] at hn₁ hn₂
have : p₁ ^ n₁ = p₂ ^ n₂ := by rw [← hn₁, ← hn₂]
rcases n₁.eq_zero_or_pos with (rfl | hn₁)
· simpa using hn₁
MulAction.Stabilizer
and AddAction.Stabilizer
, renaming MulAction.Stabilizer.submonoid
to MulAction.stabilizerSubmonoid
.@@ -198,7 +198,7 @@ theorem card_modEq_card_fixedPoints [Fintype (fixedPoints G α)] :
Eq.symm
(Finset.sum_bij_ne_zero (fun a _ _ => Quotient.mk'' a.1) (fun _ _ _ => Finset.mem_univ _)
(fun a₁ a₂ _ _ _ _ h =>
- Subtype.eq ((mem_fixedPoints' α).mp a₂.2 a₁.1 (Quotient.exact' h)))
+ Subtype.eq (mem_fixedPoints'.mp a₂.2 a₁.1 (Quotient.exact' h)))
(fun b => Quotient.inductionOn' b fun b _ hb => _) fun a ha _ => by
rw [key, mem_fixedPoints_iff_card_orbit_eq_one.mp a.2])
obtain ⟨k, hk⟩ := hG.card_orbit b
@@ -95,14 +95,14 @@ theorem of_equiv {H : Type*} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.of_surjective ϕ.toMonoidHom ϕ.surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
-theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).coprime n :=
+theorem orderOf_coprime {n : ℕ} (hn : p.Coprime n) (g : G) : (orderOf g).Coprime n :=
let ⟨k, hk⟩ := hG g
(hn.pow_left k).coprime_dvd_left (orderOf_dvd_of_pow_eq_one hk)
#align is_p_group.order_of_coprime IsPGroup.orderOf_coprime
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
-noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
- let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).coprime n := fun g =>
+noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
+ let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).Coprime n := fun g =>
order_eq_card_zpowers' g ▸ hG.orderOf_coprime hn g
{ toFun := (· ^ n)
invFun := fun g => (powCoprime (h g)).symm ⟨g, Subgroup.mem_zpowers g⟩
@@ -115,12 +115,12 @@ noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
#align is_p_group.pow_equiv IsPGroup.powEquiv
@[simp]
-theorem powEquiv_apply {n : ℕ} (hn : p.coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
+theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
rfl
#align is_p_group.pow_equiv_apply IsPGroup.powEquiv_apply
@[simp]
-theorem powEquiv_symm_apply {n : ℕ} (hn : p.coprime n) (g : G) :
+theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
(hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers']; rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
@@ -341,7 +341,7 @@ theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
theorem coprime_card_of_ne {G₂ : Type*} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
[Fintype H₂] (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) :
- Nat.coprime (Fintype.card H₁) (Fintype.card H₂) := by
+ Nat.Coprime (Fintype.card H₁) (Fintype.card H₂) := by
obtain ⟨n₁, heq₁⟩ := iff_card.mp hH₁; rw [heq₁]; clear heq₁
obtain ⟨n₂, heq₂⟩ := iff_card.mp hH₂; rw [heq₂]; clear heq₂
exact Nat.coprime_pow_primes _ _ hp₁.elim hp₂.elim hne
@@ -409,4 +409,3 @@ theorem commutative_of_card_eq_prime_sq (hG : card G = p ^ 2) : ∀ a b : G, a *
end P2comm
end IsPGroup
-
@@ -95,14 +95,14 @@ theorem of_equiv {H : Type*} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.of_surjective ϕ.toMonoidHom ϕ.surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
-theorem orderOf_coprime {n : ℕ} (hn : p.Coprime n) (g : G) : (orderOf g).Coprime n :=
+theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).coprime n :=
let ⟨k, hk⟩ := hG g
(hn.pow_left k).coprime_dvd_left (orderOf_dvd_of_pow_eq_one hk)
#align is_p_group.order_of_coprime IsPGroup.orderOf_coprime
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
-noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
- let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).Coprime n := fun g =>
+noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
+ let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).coprime n := fun g =>
order_eq_card_zpowers' g ▸ hG.orderOf_coprime hn g
{ toFun := (· ^ n)
invFun := fun g => (powCoprime (h g)).symm ⟨g, Subgroup.mem_zpowers g⟩
@@ -115,12 +115,12 @@ noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
#align is_p_group.pow_equiv IsPGroup.powEquiv
@[simp]
-theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
+theorem powEquiv_apply {n : ℕ} (hn : p.coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
rfl
#align is_p_group.pow_equiv_apply IsPGroup.powEquiv_apply
@[simp]
-theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
+theorem powEquiv_symm_apply {n : ℕ} (hn : p.coprime n) (g : G) :
(hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers']; rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
@@ -341,7 +341,7 @@ theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
theorem coprime_card_of_ne {G₂ : Type*} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
[Fintype H₂] (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) :
- Nat.Coprime (Fintype.card H₁) (Fintype.card H₂) := by
+ Nat.coprime (Fintype.card H₁) (Fintype.card H₂) := by
obtain ⟨n₁, heq₁⟩ := iff_card.mp hH₁; rw [heq₁]; clear heq₁
obtain ⟨n₂, heq₂⟩ := iff_card.mp hH₂; rw [heq₂]; clear heq₂
exact Nat.coprime_pow_primes _ _ hp₁.elim hp₂.elim hne
@@ -409,3 +409,4 @@ theorem commutative_of_card_eq_prime_sq (hG : card G = p ^ 2) : ∀ a b : G, a *
end P2comm
end IsPGroup
+
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>
@@ -95,14 +95,14 @@ theorem of_equiv {H : Type*} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.of_surjective ϕ.toMonoidHom ϕ.surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
-theorem orderOf_coprime {n : ℕ} (hn : p.coprime n) (g : G) : (orderOf g).coprime n :=
+theorem orderOf_coprime {n : ℕ} (hn : p.Coprime n) (g : G) : (orderOf g).Coprime n :=
let ⟨k, hk⟩ := hG g
(hn.pow_left k).coprime_dvd_left (orderOf_dvd_of_pow_eq_one hk)
#align is_p_group.order_of_coprime IsPGroup.orderOf_coprime
/-- If `gcd(p,n) = 1`, then the `n`th power map is a bijection. -/
-noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
- let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).coprime n := fun g =>
+noncomputable def powEquiv {n : ℕ} (hn : p.Coprime n) : G ≃ G :=
+ let h : ∀ g : G, (Nat.card (Subgroup.zpowers g)).Coprime n := fun g =>
order_eq_card_zpowers' g ▸ hG.orderOf_coprime hn g
{ toFun := (· ^ n)
invFun := fun g => (powCoprime (h g)).symm ⟨g, Subgroup.mem_zpowers g⟩
@@ -115,12 +115,12 @@ noncomputable def powEquiv {n : ℕ} (hn : p.coprime n) : G ≃ G :=
#align is_p_group.pow_equiv IsPGroup.powEquiv
@[simp]
-theorem powEquiv_apply {n : ℕ} (hn : p.coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
+theorem powEquiv_apply {n : ℕ} (hn : p.Coprime n) (g : G) : hG.powEquiv hn g = g ^ n :=
rfl
#align is_p_group.pow_equiv_apply IsPGroup.powEquiv_apply
@[simp]
-theorem powEquiv_symm_apply {n : ℕ} (hn : p.coprime n) (g : G) :
+theorem powEquiv_symm_apply {n : ℕ} (hn : p.Coprime n) (g : G) :
(hG.powEquiv hn).symm g = g ^ (orderOf g).gcdB n := by rw [order_eq_card_zpowers']; rfl
#align is_p_group.pow_equiv_symm_apply IsPGroup.powEquiv_symm_apply
@@ -341,7 +341,7 @@ theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
theorem coprime_card_of_ne {G₂ : Type*} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
[Fintype H₂] (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) :
- Nat.coprime (Fintype.card H₁) (Fintype.card H₂) := by
+ Nat.Coprime (Fintype.card H₁) (Fintype.card H₂) := by
obtain ⟨n₁, heq₁⟩ := iff_card.mp hH₁; rw [heq₁]; clear heq₁
obtain ⟨n₂, heq₂⟩ := iff_card.mp hH₂; rw [heq₂]; clear heq₂
exact Nat.coprime_pow_primes _ _ hp₁.elim hp₂.elim hne
@@ -409,4 +409,3 @@ theorem commutative_of_card_eq_prime_sq (hG : card G = p ^ 2) : ∀ a b : G, a *
end P2comm
end IsPGroup
-
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -26,7 +26,7 @@ open BigOperators
open Fintype MulAction
-variable (p : ℕ) (G : Type _) [Group G]
+variable (p : ℕ) (G : Type*) [Group G]
/-- A p-group is a group in which every element has prime power order -/
def IsPGroup : Prop :=
@@ -71,7 +71,7 @@ section GIsPGroup
variable (hG : IsPGroup p G)
-theorem of_injective {H : Type _} [Group H] (ϕ : H →* G) (hϕ : Function.Injective ϕ) :
+theorem of_injective {H : Type*} [Group H] (ϕ : H →* G) (hϕ : Function.Injective ϕ) :
IsPGroup p H := by
simp_rw [IsPGroup, ← hϕ.eq_iff, ϕ.map_pow, ϕ.map_one]
exact fun h => hG (ϕ h)
@@ -81,7 +81,7 @@ theorem to_subgroup (H : Subgroup G) : IsPGroup p H :=
hG.of_injective H.subtype Subtype.coe_injective
#align is_p_group.to_subgroup IsPGroup.to_subgroup
-theorem of_surjective {H : Type _} [Group H] (ϕ : G →* H) (hϕ : Function.Surjective ϕ) :
+theorem of_surjective {H : Type*} [Group H] (ϕ : G →* H) (hϕ : Function.Surjective ϕ) :
IsPGroup p H := by
refine' fun h => Exists.elim (hϕ h) fun g hg => Exists.imp (fun k hk => _) (hG g)
rw [← hg, ← ϕ.map_pow, hk, ϕ.map_one]
@@ -91,7 +91,7 @@ theorem to_quotient (H : Subgroup G) [H.Normal] : IsPGroup p (G ⧸ H) :=
hG.of_surjective (QuotientGroup.mk' H) Quotient.surjective_Quotient_mk''
#align is_p_group.to_quotient IsPGroup.to_quotient
-theorem of_equiv {H : Type _} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
+theorem of_equiv {H : Type*} [Group H] (ϕ : G ≃* H) : IsPGroup p H :=
hG.of_surjective ϕ.toMonoidHom ϕ.surjective
#align is_p_group.of_equiv IsPGroup.of_equiv
@@ -165,7 +165,7 @@ theorem nontrivial_iff_card [Fintype G] : Nontrivial G ↔ ∃ n > 0, card G = p
hk.symm ▸ one_lt_pow (Fact.out (p := p.Prime)).one_lt (ne_of_gt hk0)⟩
#align is_p_group.nontrivial_iff_card IsPGroup.nontrivial_iff_card
-variable {α : Type _} [MulAction G α]
+variable {α : Type*} [MulAction G α]
theorem card_orbit (a : α) [Fintype (orbit G a)] : ∃ n : ℕ, card (orbit G a) = p ^ n := by
let ϕ := orbitEquivQuotientStabilizer G a
@@ -278,13 +278,13 @@ theorem to_inf_right {H K : Subgroup G} (hK : IsPGroup p K) : IsPGroup p (H ⊓
hK.to_le inf_le_right
#align is_p_group.to_inf_right IsPGroup.to_inf_right
-theorem map {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : G →* K) :
+theorem map {H : Subgroup G} (hH : IsPGroup p H) {K : Type*} [Group K] (ϕ : G →* K) :
IsPGroup p (H.map ϕ) := by
rw [← H.subtype_range, MonoidHom.map_range]
exact hH.of_surjective (ϕ.restrict H).rangeRestrict (ϕ.restrict H).rangeRestrict_surjective
#align is_p_group.map IsPGroup.map
-theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K]
+theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type*} [Group K]
(ϕ : K →* G) (hϕ : IsPGroup p ϕ.ker) : IsPGroup p (H.comap ϕ) := by
intro g
obtain ⟨j, hj⟩ := hH ⟨ϕ g.1, g.2⟩
@@ -294,12 +294,12 @@ theorem comap_of_ker_isPGroup {H : Subgroup G} (hH : IsPGroup p H) {K : Type _}
exact ⟨j + k, by rwa [Subtype.ext_iff, (H.comap ϕ).coe_pow]⟩
#align is_p_group.comap_of_ker_is_p_group IsPGroup.comap_of_ker_isPGroup
-theorem ker_isPGroup_of_injective {K : Type _} [Group K] {ϕ : K →* G} (hϕ : Function.Injective ϕ) :
+theorem ker_isPGroup_of_injective {K : Type*} [Group K] {ϕ : K →* G} (hϕ : Function.Injective ϕ) :
IsPGroup p ϕ.ker :=
(congr_arg (fun Q : Subgroup K => IsPGroup p Q) (ϕ.ker_eq_bot_iff.mpr hϕ)).mpr IsPGroup.of_bot
#align is_p_group.ker_is_p_group_of_injective IsPGroup.ker_isPGroup_of_injective
-theorem comap_of_injective {H : Subgroup G} (hH : IsPGroup p H) {K : Type _} [Group K] (ϕ : K →* G)
+theorem comap_of_injective {H : Subgroup G} (hH : IsPGroup p H) {K : Type*} [Group K] (ϕ : K →* G)
(hϕ : Function.Injective ϕ) : IsPGroup p (H.comap ϕ) :=
hH.comap_of_ker_isPGroup ϕ (ker_isPGroup_of_injective hϕ)
#align is_p_group.comap_of_injective IsPGroup.comap_of_injective
@@ -338,7 +338,7 @@ theorem to_sup_of_normal_left' {H K : Subgroup G} (hH : IsPGroup p H) (hK : IsPG
#align is_p_group.to_sup_of_normal_left' IsPGroup.to_sup_of_normal_left'
/-- finite p-groups with different p have coprime orders -/
-theorem coprime_card_of_ne {G₂ : Type _} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
+theorem coprime_card_of_ne {G₂ : Type*} [Group G₂] (p₁ p₂ : ℕ) [hp₁ : Fact p₁.Prime]
[hp₂ : Fact p₂.Prime] (hne : p₁ ≠ p₂) (H₁ : Subgroup G) (H₂ : Subgroup G₂) [Fintype H₁]
[Fintype H₂] (hH₁ : IsPGroup p₁ H₁) (hH₂ : IsPGroup p₂ H₂) :
Nat.coprime (Fintype.card H₁) (Fintype.card H₂) := by
@@ -2,11 +2,6 @@
Copyright (c) 2018 . 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.p_group
-! leanprover-community/mathlib commit f694c7dead66f5d4c80f446c796a5aad14707f0e
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Data.ZMod.Basic
import Mathlib.GroupTheory.Index
@@ -16,6 +11,8 @@ import Mathlib.GroupTheory.Perm.Cycle.Type
import Mathlib.GroupTheory.SpecificGroups.Cyclic
import Mathlib.Tactic.IntervalCases
+#align_import group_theory.p_group from "leanprover-community/mathlib"@"f694c7dead66f5d4c80f446c796a5aad14707f0e"
+
/-!
# p-groups
The unported dependencies are