Module docstring
{"# Subgroups
This file provides some result on multiplicative and additive subgroups in the finite context.
Tags
subgroup, subgroups
","### Conversion to/from Additive/Multiplicative
"}
{"# Subgroups
This file provides some result on multiplicative and additive subgroups in the finite context.
subgroup, subgroups
","### Conversion to/from Additive/Multiplicative
"}
Subgroup.instFintypeSubtypeMemOfDecidablePred
instance
(K : Subgroup G) [DecidablePred (· ∈ K)] [Fintype G] : Fintype K
@[to_additive]
instance (K : Subgroup G) [DecidablePred (· ∈ K)] [Fintype G] : Fintype K :=
show Fintype { g : G // g ∈ K } from inferInstance
Subgroup.instFiniteSubtypeMem
instance
(K : Subgroup G) [Finite G] : Finite K
@[to_additive]
instance (K : Subgroup G) [Finite G] : Finite K :=
Subtype.finite
Subgroup.list_prod_mem
theorem
{l : List G} : (∀ x ∈ l, x ∈ K) → l.prod ∈ K
/-- Product of a list of elements in a subgroup is in the subgroup. -/
@[to_additive "Sum of a list of elements in an `AddSubgroup` is in the `AddSubgroup`."]
protected theorem list_prod_mem {l : List G} : (∀ x ∈ l, x ∈ K) → l.prod ∈ K :=
list_prod_mem
Subgroup.multiset_prod_mem
theorem
{G} [CommGroup G] (K : Subgroup G) (g : Multiset G) : (∀ a ∈ g, a ∈ K) → g.prod ∈ K
/-- Product of a multiset of elements in a subgroup of a `CommGroup` is in the subgroup. -/
@[to_additive "Sum of a multiset of elements in an `AddSubgroup` of an `AddCommGroup` is in
the `AddSubgroup`."]
protected theorem multiset_prod_mem {G} [CommGroup G] (K : Subgroup G) (g : Multiset G) :
(∀ a ∈ g, a ∈ K) → g.prod ∈ K :=
multiset_prod_mem g
Subgroup.multiset_noncommProd_mem
theorem
(K : Subgroup G) (g : Multiset G) (comm) : (∀ a ∈ g, a ∈ K) → g.noncommProd comm ∈ K
@[to_additive]
theorem multiset_noncommProd_mem (K : Subgroup G) (g : Multiset G) (comm) :
(∀ a ∈ g, a ∈ K) → g.noncommProd comm ∈ K :=
K.toSubmonoid.multiset_noncommProd_mem g comm
Subgroup.prod_mem
theorem
{G : Type*} [CommGroup G] (K : Subgroup G) {ι : Type*} {t : Finset ι} {f : ι → G} (h : ∀ c ∈ t, f c ∈ K) :
(∏ c ∈ t, f c) ∈ K
/-- Product of elements of a subgroup of a `CommGroup` indexed by a `Finset` is in the
subgroup. -/
@[to_additive "Sum of elements in an `AddSubgroup` of an `AddCommGroup` indexed by a `Finset`
is in the `AddSubgroup`."]
protected theorem prod_mem {G : Type*} [CommGroup G] (K : Subgroup G) {ι : Type*} {t : Finset ι}
{f : ι → G} (h : ∀ c ∈ t, f c ∈ K) : (∏ c ∈ t, f c) ∈ K :=
prod_mem h
Subgroup.noncommProd_mem
theorem
(K : Subgroup G) {ι : Type*} {t : Finset ι} {f : ι → G} (comm) : (∀ c ∈ t, f c ∈ K) → t.noncommProd f comm ∈ K
@[to_additive]
theorem noncommProd_mem (K : Subgroup G) {ι : Type*} {t : Finset ι} {f : ι → G} (comm) :
(∀ c ∈ t, f c ∈ K) → t.noncommProd f comm ∈ K :=
K.toSubmonoid.noncommProd_mem t f comm
Subgroup.val_list_prod
theorem
(l : List H) : (l.prod : G) = (l.map Subtype.val).prod
@[to_additive (attr := simp 1100, norm_cast)]
theorem val_list_prod (l : List H) : (l.prod : G) = (l.map Subtype.val).prod :=
SubmonoidClass.coe_list_prod l
Subgroup.val_multiset_prod
theorem
{G} [CommGroup G] (H : Subgroup G) (m : Multiset H) : (m.prod : G) = (m.map Subtype.val).prod
@[to_additive (attr := simp 1100, norm_cast)]
theorem val_multiset_prod {G} [CommGroup G] (H : Subgroup G) (m : Multiset H) :
(m.prod : G) = (m.map Subtype.val).prod :=
SubmonoidClass.coe_multiset_prod m
Subgroup.val_finset_prod
theorem
{ι G} [CommGroup G] (H : Subgroup G) (f : ι → H) (s : Finset ι) : ↑(∏ i ∈ s, f i) = (∏ i ∈ s, f i : G)
@[to_additive (attr := simp 1100, norm_cast)]
theorem val_finset_prod {ι G} [CommGroup G] (H : Subgroup G) (f : ι → H) (s : Finset ι) :
↑(∏ i ∈ s, f i) = (∏ i ∈ s, f i : G) :=
SubmonoidClass.coe_finset_prod f s
Subgroup.fintypeBot
instance
: Fintype (⊥ : Subgroup G)
@[to_additive]
instance fintypeBot : Fintype (⊥ : Subgroup G) :=
⟨{1}, by
rintro ⟨x, ⟨hx⟩⟩
exact Finset.mem_singleton_self _⟩
Subgroup.card_bot
theorem
: Nat.card (⊥ : Subgroup G) = 1
@[to_additive]
theorem card_bot : Nat.card (⊥ : Subgroup G) = 1 := by simp
Subgroup.card_top
theorem
: Nat.card (⊤ : Subgroup G) = Nat.card G
@[to_additive]
theorem card_top : Nat.card (⊤ : Subgroup G) = Nat.card G :=
Nat.card_congr Subgroup.topEquiv.toEquiv
Subgroup.card_eq_iff_eq_top
theorem
[Finite H] : Nat.card H = Nat.card G ↔ H = ⊤
@[to_additive (attr := simp)]
theorem card_eq_iff_eq_top [Finite H] : Nat.cardNat.card H = Nat.card G ↔ H = ⊤ :=
Iff.intro (eq_top_of_card_eq H) (fun h ↦ by simpa only [h] using card_top)
Subgroup.card_le_one_iff_eq_bot
theorem
[Finite H] : Nat.card H ≤ 1 ↔ H = ⊥
@[to_additive card_le_one_iff_eq_bot]
theorem card_le_one_iff_eq_bot [Finite H] : Nat.cardNat.card H ≤ 1 ↔ H = ⊥ :=
⟨H.eq_bot_of_card_le, fun h => by simp [h]⟩
Subgroup.one_lt_card_iff_ne_bot
theorem
[Finite H] : 1 < Nat.card H ↔ H ≠ ⊥
@[to_additive one_lt_card_iff_ne_bot]
theorem one_lt_card_iff_ne_bot [Finite H] : 1 < Nat.card H ↔ H ≠ ⊥ :=
lt_iff_not_le.trans H.card_le_one_iff_eq_bot.not
Subgroup.card_le_card_group
theorem
[Finite G] : Nat.card H ≤ Nat.card G
@[to_additive]
theorem card_le_card_group [Finite G] : Nat.card H ≤ Nat.card G :=
Nat.card_le_card_of_injective _ Subtype.coe_injective
Subgroup.card_le_of_le
theorem
{H K : Subgroup G} [Finite K] (h : H ≤ K) : Nat.card H ≤ Nat.card K
@[to_additive]
theorem card_le_of_le {H K : Subgroup G} [Finite K] (h : H ≤ K) : Nat.card H ≤ Nat.card K :=
Nat.card_le_card_of_injective _ (Subgroup.inclusion_injective h)
Subgroup.card_map_of_injective
theorem
{H : Type*} [Group H] {K : Subgroup G} {f : G →* H} (hf : Function.Injective f) : Nat.card (map f K) = Nat.card K
@[to_additive]
theorem card_map_of_injective {H : Type*} [Group H] {K : Subgroup G} {f : G →* H}
(hf : Function.Injective f) :
Nat.card (map f K) = Nat.card K := by
apply Nat.card_image_of_injective hf
Subgroup.card_subtype
theorem
(K : Subgroup G) (L : Subgroup K) : Nat.card (map K.subtype L) = Nat.card L
@[to_additive]
theorem card_subtype (K : Subgroup G) (L : Subgroup K) :
Nat.card (map K.subtype L) = Nat.card L :=
card_map_of_injective K.subtype_injective
Subgroup.pi_mem_of_mulSingle_mem_aux
theorem
[DecidableEq η] (I : Finset η) {H : Subgroup (∀ i, f i)} (x : ∀ i, f i) (h1 : ∀ i, i ∉ I → x i = 1)
(h2 : ∀ i, i ∈ I → Pi.mulSingle i (x i) ∈ H) : x ∈ H
@[to_additive]
theorem pi_mem_of_mulSingle_mem_aux [DecidableEq η] (I : Finset η) {H : Subgroup (∀ i, f i)}
(x : ∀ i, f i) (h1 : ∀ i, i ∉ I → x i = 1) (h2 : ∀ i, i ∈ I → Pi.mulSinglePi.mulSingle i (x i) ∈ H) :
x ∈ H := by
induction I using Finset.induction_on generalizing x with
| empty =>
have : x = 1 := by
ext i
exact h1 i (Finset.not_mem_empty i)
rw [this]
exact one_mem H
| insert i I hnmem ih =>
have : x = Function.update x i 1 * Pi.mulSingle i (x i) := by
ext j
by_cases heq : j = i
· subst heq
simp
· simp [heq]
rw [this]
clear this
apply mul_mem
· apply ih <;> clear ih
· intro j hj
by_cases heq : j = i
· subst heq
simp
· simpa [heq] using h1 j (by simpa [heq] using hj)
· intro j hj
have : j ≠ i := by
rintro rfl
contradiction
simp only [ne_eq, this, not_false_eq_true, Function.update_of_ne]
exact h2 _ (Finset.mem_insert_of_mem hj)
· apply h2
simp
Subgroup.pi_mem_of_mulSingle_mem
theorem
[Finite η] [DecidableEq η] {H : Subgroup (∀ i, f i)} (x : ∀ i, f i) (h : ∀ i, Pi.mulSingle i (x i) ∈ H) : x ∈ H
@[to_additive]
theorem pi_mem_of_mulSingle_mem [Finite η] [DecidableEq η] {H : Subgroup (∀ i, f i)} (x : ∀ i, f i)
(h : ∀ i, Pi.mulSinglePi.mulSingle i (x i) ∈ H) : x ∈ H := by
cases nonempty_fintype η
exact pi_mem_of_mulSingle_mem_aux Finset.univ x (by simp) fun i _ => h i
Subgroup.pi_le_iff
theorem
[DecidableEq η] [Finite η] {H : ∀ i, Subgroup (f i)} {J : Subgroup (∀ i, f i)} :
pi univ H ≤ J ↔ ∀ i : η, map (MonoidHom.mulSingle f i) (H i) ≤ J
/-- For finite index types, the `Subgroup.pi` is generated by the embeddings of the groups. -/
@[to_additive "For finite index types, the `Subgroup.pi` is generated by the embeddings of the
additive groups."]
theorem pi_le_iff [DecidableEq η] [Finite η] {H : ∀ i, Subgroup (f i)} {J : Subgroup (∀ i, f i)} :
pipi univ H ≤ J ↔ ∀ i : η, map (MonoidHom.mulSingle f i) (H i) ≤ J := by
constructor
· rintro h i _ ⟨x, hx, rfl⟩
apply h
simpa using hx
· exact fun h x hx => pi_mem_of_mulSingle_mem x fun i => h i (mem_map_of_mem _ (hx i trivial))
Subgroup.mem_normalizer_fintype
theorem
{S : Set G} [Finite S] {x : G} (h : ∀ n, n ∈ S → x * n * x⁻¹ ∈ S) : x ∈ Subgroup.setNormalizer S
theorem mem_normalizer_fintype {S : Set G} [Finite S] {x : G} (h : ∀ n, n ∈ S → x * n * x⁻¹ ∈ S) :
x ∈ Subgroup.setNormalizer S := by
haveI := Classical.propDecidable; cases nonempty_fintype S
haveI := Set.fintypeImage S fun n => x * n * x⁻¹
exact fun n =>
⟨h n, fun h₁ =>
have heq : (fun n => x * n * x⁻¹) '' S = S :=
Set.eq_of_subset_of_card_le (fun n ⟨y, hy⟩ => hy.2 ▸ h y hy.1)
(by rw [Set.card_image_of_injective S conj_injective])
have : x * n * x⁻¹ ∈ (fun n => x * n * x⁻¹) '' S := heq.symm ▸ h₁
let ⟨y, hy⟩ := this
conj_injective hy.2 ▸ hy.1⟩
MonoidHom.decidableMemRange
instance
(f : G →* N) [Fintype G] [DecidableEq N] : DecidablePred (· ∈ f.range)
@[to_additive]
instance decidableMemRange (f : G →* N) [Fintype G] [DecidableEq N] : DecidablePred (· ∈ f.range) :=
fun _ => Fintype.decidableExistsFintype
MonoidHom.fintypeMrange
instance
{M N : Type*} [Monoid M] [Monoid N] [Fintype M] [DecidableEq N] (f : M →* N) : Fintype (mrange f)
/-- The range of a finite monoid under a monoid homomorphism is finite.
Note: this instance can form a diamond with `Subtype.fintype` in the
presence of `Fintype N`. -/
@[to_additive "The range of a finite additive monoid under an additive monoid homomorphism is
finite.
Note: this instance can form a diamond with `Subtype.fintype` or `Subgroup.fintype` in the presence
of `Fintype N`."]
instance fintypeMrange {M N : Type*} [Monoid M] [Monoid N] [Fintype M] [DecidableEq N]
(f : M →* N) : Fintype (mrange f) :=
Set.fintypeRange f
MonoidHom.fintypeRange
instance
[Fintype G] [DecidableEq N] (f : G →* N) : Fintype (range f)
/-- The range of a finite group under a group homomorphism is finite.
Note: this instance can form a diamond with `Subtype.fintype` or `Subgroup.fintype` in the
presence of `Fintype N`. -/
@[to_additive "The range of a finite additive group under an additive group homomorphism is finite.
Note: this instance can form a diamond with `Subtype.fintype` or `Subgroup.fintype` in the
presence of `Fintype N`."]
instance fintypeRange [Fintype G] [DecidableEq N] (f : G →* N) : Fintype (range f) :=
Set.fintypeRange f
Fintype.card_coeSort_mrange
theorem
{M N : Type*} [Monoid M] [Monoid N] [Fintype M] [DecidableEq N] {f : M →* N} (hf : Function.Injective f) :
Fintype.card (mrange f) = Fintype.card M
lemma _root_.Fintype.card_coeSort_mrange {M N : Type*} [Monoid M] [Monoid N] [Fintype M]
[DecidableEq N] {f : M →* N} (hf : Function.Injective f) :
Fintype.card (mrange f) = Fintype.card M :=
Set.card_range_of_injective hf
Fintype.card_coeSort_range
theorem
[Fintype G] [DecidableEq N] {f : G →* N} (hf : Function.Injective f) : Fintype.card (range f) = Fintype.card G
lemma _root_.Fintype.card_coeSort_range [Fintype G] [DecidableEq N] {f : G →* N}
(hf : Function.Injective f) :
Fintype.card (range f) = Fintype.card G :=
Set.card_range_of_injective hf