Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions Mathlib/GroupTheory/PGroup.lean
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Authors: Chris Hughes, Thomas Browning
-/
module

public import Mathlib.Data.SetLike.Fintype
public import Mathlib.GroupTheory.Perm.Cycle.Type
public import Mathlib.GroupTheory.SpecificGroups.Cyclic

Expand Down Expand Up @@ -392,6 +393,39 @@ end P2comm

end IsPGroup

open Subgroup in
/-- In an abelian `p`-group (finite or infinite), the maximal subgroups are exactly the subgroups
of index `p`. Finiteness is unnecessary: for a maximal `M`, the quotient `G ⧸ M` is simple *and
abelian*, hence `≅ ℤ/q` for a prime `q` (a simple abelian group is automatically finite), and being
a quotient of a `p`-group forces `q = p`; thus `[G : M] = p`. (This fails for non-abelian infinite
`p`-groups, e.g. Tarski monsters, whose maximal subgroups have order `p` and infinite index.)

The proof goes `IsCoatom M ↔ IsSimpleGroup (G ⧸ M)` (`CommGroup.isSimpleGroup_iff_isCoatom`), then
`CommGroup.is_simple_iff_prime_card` turns that into `(Nat.card (G ⧸ M)).Prime`, and
`IsPGroup.card_eq_or_dvd` (for the `p`-group quotient) forces that prime to be `p`;
`Subgroup.index_eq_card` converts card to index. -/
theorem CommGroup.isCoatom_iff_index_eq_prime {G : Type*} [CommGroup G] {p : ℕ} [hp : Fact p.Prime]
(hG : IsPGroup p G) (M : Subgroup G) : IsCoatom M ↔ M.index = p := by
rw [← CommGroup.isSimpleGroup_iff_isCoatom, CommGroup.is_simple_iff_prime_card,
Subgroup.index_eq_card]
refine ⟨fun h ↦ ?_, fun h ↦ h ▸ hp.out⟩
have h_dvd := (IsPGroup.card_eq_or_dvd (hG.to_quotient M)).resolve_left h.ne_one
exact ((Nat.prime_dvd_prime_iff_eq hp.out h).mp h_dvd).symm

open Subgroup in
/-- A finite non-cyclic abelian `p`-group has two distinct subgroups of index `p`. Contrapositive
route: if there is at most one index-`p` subgroup then, since maximal subgroups are exactly the
index-`p` subgroups (`CommGroup.isCoatom_iff_index_eq_prime`), there is at most one maximal
subgroup, so `G` is cyclic (`isCyclic_of_isCoatom_subsingleton`), contradicting `hnc`. -/
theorem IsPGroup.exists_index_eq_prime_ne_of_not_isCyclic {G : Type*} [CommGroup G] [Finite G]
{p : ℕ} [Fact p.Prime] (hG : IsPGroup p G) (hnc : ¬ IsCyclic G) :
∃ H₁ H₂ : Subgroup G, H₁.index = p ∧ H₂.index = p ∧ H₁ ≠ H₂ := by
by_contra hcon
push Not at hcon
refine hnc (isCyclic_of_isCoatom_subsingleton fun M₁ M₂ hM₁ hM₂ => ?_)
exact hcon M₁ M₂ ((CommGroup.isCoatom_iff_index_eq_prime hG M₁).mp hM₁)
((CommGroup.isCoatom_iff_index_eq_prime hG M₂).mp hM₂)

namespace ZModModule
variable {n : ℕ} {G : Type*} [AddCommGroup G] [Module (ZMod n) G]

Expand Down
18 changes: 18 additions & 0 deletions Mathlib/GroupTheory/QuotientGroup/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,24 @@ def comapMk'OrderIso (N : Subgroup G) [hn : N.Normal] :
right_inv := fun ⟨H, hH⟩ => Subtype.ext <| by simpa
map_rel_iff' := Subgroup.comap_le_comap_of_surjective <| mk'_surjective _

/-- The **correspondence theorem** as an order isomorphism onto the interval `Set.Ici N`.

Compared to `comapMk'OrderIso`, whose codomain is the bare subtype `{H : Subgroup G // N ≤ H}`,
landing in `Set.Ici N` makes the interval order API available (e.g.
`Set.isSimpleOrder_Ici_iff_isCoatom`), mirroring the submodule side `Submodule.comapMkQRelIso`. -/
@[to_additive (attr := simps apply_coe) /-- The **correspondence theorem** as an order isomorphism
onto the interval `Set.Ici N`.

Compared to `comapMk'AddOrderIso`, whose codomain is the bare subtype
`{H : AddSubgroup G // N ≤ H}`, landing in `Set.Ici N` makes the interval order API available. -/]
def comapMk'OrderIso' (N : Subgroup G) [hn : N.Normal] :
Subgroup (G ⧸ N) ≃o Set.Ici N where
toFun H' := ⟨Subgroup.comap (mk' N) H', le_comap_mk' N _⟩
invFun H := Subgroup.map (mk' N) H
left_inv H' := Subgroup.map_comap_eq_self <| by simp
right_inv := fun ⟨H, hH⟩ => Subtype.ext <| by simpa
map_rel_iff' := Subgroup.comap_le_comap_of_surjective <| mk'_surjective _

end CorrespTheorem

section trivial
Expand Down
33 changes: 33 additions & 0 deletions Mathlib/GroupTheory/SpecificGroups/Cyclic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,39 @@ theorem CommGroup.is_simple_iff_prime_card [CommGroup α] : IsSimpleGroup α ↔
@[deprecated (since := "2025-11-19")]
alias CommGroup.is_simple_iff_isCyclic_and_prime_card := CommGroup.is_simple_iff_prime_card

open Subgroup in
/-- A group with at most one maximal subgroup is cyclic. Maximal subgroups are the coatoms
`IsCoatom (· : Subgroup G)` of the subgroup lattice; only `IsCoatomic (Subgroup G)` is required
(automatic for finite `G`), with no finiteness, commutativity, or `p`-group hypothesis. -/
@[to_additive /-- An additive group with at most one maximal subgroup is cyclic. Maximal subgroups
are the coatoms `IsCoatom (· : AddSubgroup G)` of the subgroup lattice; only
`IsCoatomic (AddSubgroup G)` is required (automatic for finite `G`), with no finiteness,
commutativity, or `p`-group hypothesis. -/]
theorem isCyclic_of_isCoatom_subsingleton {G : Type*} [Group G] [IsCoatomic (Subgroup G)]
(h : ∀ M₁ M₂ : Subgroup G, IsCoatom M₁ → IsCoatom M₂ → M₁ = M₂) :
IsCyclic G := by
rw [isCyclic_iff_exists_zpowers_eq_top]
obtain hbot | ⟨M, hM, -⟩ := eq_top_or_exists_le_coatom (⊥ : Subgroup G)
· exact ⟨1, eq_top_of_bot_eq_top hbot _⟩
· obtain ⟨g, -, hg⟩ := SetLike.exists_of_lt hM.lt_top
refine ⟨g, ?_⟩
by_contra hne
obtain ⟨M', hM', hle⟩ := (eq_top_or_exists_le_coatom (zpowers g)).resolve_left hne
exact hg (h M' M hM' hM ▸ hle (mem_zpowers g))

/-- A subgroup of a commutative group is maximal (a coatom in the subgroup lattice) iff the quotient
by it is simple. Group analogue of `isSimpleModule_iff_isCoatom`. -/
@[to_additive /-- A subgroup of an additive commutative group is maximal (a coatom in the subgroup
lattice) iff the quotient by it is simple. Additive group analogue of
`isSimpleModule_iff_isCoatom`. -/]
theorem CommGroup.isSimpleGroup_iff_isCoatom {G : Type*} [CommGroup G] {M : Subgroup G} :
IsSimpleGroup (G ⧸ M) ↔ IsCoatom M := by
rw [← Set.isSimpleOrder_Ici_iff_isCoatom,
← (QuotientGroup.comapMk'OrderIso' M).isSimpleOrder_iff, isSimpleGroup_iff, isSimpleOrder_iff]
by_cases hG : Nontrivial (G ⧸ M)
· simp [hG, Subgroup.normal_of_isMulCommutative]
· simp [hG]

section SpecificInstances

instance : IsAddCyclic ℤ := ⟨1, fun n ↦ ⟨n, by simp only [smul_eq_mul, mul_one]⟩⟩
Expand Down
Loading