mathlib3 documentation

group_theory.index

Index of a Subgroup #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

In this file we define the index of a subgroup, and prove several divisibility properties. Several theorems proved in this file are known as Lagrange's theorem.

Main definitions #

Main results #

noncomputable def subgroup.index {G : Type u_1} [group G] (H : subgroup G) :

The index of a subgroup as a natural number, and returns 0 if the index is infinite.

Equations
noncomputable def add_subgroup.index {G : Type u_1} [add_group G] (H : add_subgroup G) :

The index of a subgroup as a natural number, and returns 0 if the index is infinite.

Equations
noncomputable def subgroup.relindex {G : Type u_1} [group G] (H K : subgroup G) :

The relative index of a subgroup as a natural number, and returns 0 if the relative index is infinite.

Equations
noncomputable def add_subgroup.relindex {G : Type u_1} [add_group G] (H K : add_subgroup G) :

The relative index of a subgroup as a natural number, and returns 0 if the relative index is infinite.

Equations
theorem subgroup.index_comap_of_surjective {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] {f : G' →* G} (hf : function.surjective ⇑f) :
theorem subgroup.index_comap {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] (f : G' →* G) :
theorem add_subgroup.index_comap {G : Type u_1} [add_group G] (H : add_subgroup G) {G' : Type u_2} [add_group G'] (f : G' →+ G) :
theorem add_subgroup.relindex_comap {G : Type u_1} [add_group G] (H : add_subgroup G) {G' : Type u_2} [add_group G'] (f : G' →+ G) (K : add_subgroup G') :
theorem subgroup.relindex_comap {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] (f : G' →* G) (K : subgroup G') :
theorem subgroup.relindex_mul_index {G : Type u_1} [group G] {H K : subgroup G} (h : H ≤ K) :
theorem add_subgroup.relindex_mul_index {G : Type u_1} [add_group G] {H K : add_subgroup G} (h : H ≤ K) :
theorem subgroup.index_dvd_of_le {G : Type u_1} [group G] {H K : subgroup G} (h : H ≤ K) :
theorem add_subgroup.index_dvd_of_le {G : Type u_1} [add_group G] {H K : add_subgroup G} (h : H ≤ K) :
theorem add_subgroup.relindex_dvd_index_of_le {G : Type u_1} [add_group G] {H K : add_subgroup G} (h : H ≤ K) :
theorem subgroup.relindex_dvd_index_of_le {G : Type u_1} [group G] {H K : subgroup G} (h : H ≤ K) :
theorem subgroup.relindex_subgroup_of {G : Type u_1} [group G] {H K L : subgroup G} (hKL : K ≤ L) :
theorem subgroup.relindex_mul_relindex {G : Type u_1} [group G] (H K L : subgroup G) (hHK : H ≤ K) (hKL : K ≤ L) :
theorem add_subgroup.relindex_mul_relindex {G : Type u_1} [add_group G] (H K L : add_subgroup G) (hHK : H ≤ K) (hKL : K ≤ L) :
theorem add_subgroup.inf_relindex_right {G : Type u_1} [add_group G] (H K : add_subgroup G) :
(H ⊓ K).relindex K = H.relindex K
theorem subgroup.inf_relindex_right {G : Type u_1} [group G] (H K : subgroup G) :
(H ⊓ K).relindex K = H.relindex K
theorem subgroup.inf_relindex_left {G : Type u_1} [group G] (H K : subgroup G) :
(H ⊓ K).relindex H = K.relindex H
theorem add_subgroup.inf_relindex_left {G : Type u_1} [add_group G] (H K : add_subgroup G) :
(H ⊓ K).relindex H = K.relindex H
theorem add_subgroup.relindex_inf_mul_relindex {G : Type u_1} [add_group G] (H K L : add_subgroup G) :
H.relindex (K ⊓ L) * K.relindex L = (H ⊓ K).relindex L
theorem subgroup.relindex_inf_mul_relindex {G : Type u_1} [group G] (H K L : subgroup G) :
H.relindex (K ⊓ L) * K.relindex L = (H ⊓ K).relindex L
@[simp]
theorem add_subgroup.relindex_sup_right {G : Type u_1} [add_group G] (H K : add_subgroup G) [K.normal] :
K.relindex (H ⊔ K) = K.relindex H
@[simp]
theorem subgroup.relindex_sup_right {G : Type u_1} [group G] (H K : subgroup G) [K.normal] :
K.relindex (H ⊔ K) = K.relindex H
@[simp]
theorem subgroup.relindex_sup_left {G : Type u_1} [group G] (H K : subgroup G) [K.normal] :
K.relindex (K ⊔ H) = K.relindex H
@[simp]
theorem add_subgroup.relindex_sup_left {G : Type u_1} [add_group G] (H K : add_subgroup G) [K.normal] :
K.relindex (K ⊔ H) = K.relindex H
theorem subgroup.relindex_dvd_index_of_normal {G : Type u_1} [group G] (H K : subgroup G) [H.normal] :
theorem add_subgroup.relindex_dvd_of_le_left {G : Type u_1} [add_group G] {H K : add_subgroup G} (L : add_subgroup G) (hHK : H ≤ K) :
theorem subgroup.relindex_dvd_of_le_left {G : Type u_1} [group G] {H K : subgroup G} (L : subgroup G) (hHK : H ≤ K) :
theorem add_subgroup.index_eq_two_iff {G : Type u_1} [add_group G] {H : add_subgroup G} :
H.index = 2 ↔ ∃ (a : G), ∀ (b : G), xor (b + a ∈ H) (b ∈ H)

/-- An additive subgroup has index two if and only if there exists a such that for all b, exactly one of b + a and b belong to H. -/

theorem subgroup.index_eq_two_iff {G : Type u_1} [group G] {H : subgroup G} :
H.index = 2 ↔ ∃ (a : G), ∀ (b : G), xor (b * a ∈ H) (b ∈ H)

A subgroup has index two if and only if there exists a such that for all b, exactly one of b * a and b belong to H.

theorem subgroup.mul_mem_iff_of_index_two {G : Type u_1} [group G] {H : subgroup G} (h : H.index = 2) {a b : G} :
a * b ∈ H ↔ (a ∈ H ↔ b ∈ H)
theorem add_subgroup.add_mem_iff_of_index_two {G : Type u_1} [add_group G] {H : add_subgroup G} (h : H.index = 2) {a b : G} :
a + b ∈ H ↔ (a ∈ H ↔ b ∈ H)
theorem add_subgroup.add_self_mem_of_index_two {G : Type u_1} [add_group G] {H : add_subgroup G} (h : H.index = 2) (a : G) :
a + a ∈ H
theorem subgroup.mul_self_mem_of_index_two {G : Type u_1} [group G] {H : subgroup G} (h : H.index = 2) (a : G) :
a * a ∈ H
theorem subgroup.sq_mem_of_index_two {G : Type u_1} [group G] {H : subgroup G} (h : H.index = 2) (a : G) :
a ^ 2 ∈ H
theorem add_subgroup.two_smul_mem_of_index_two {G : Type u_1} [add_group G] {H : add_subgroup G} (h : H.index = 2) (a : G) :
2 • a ∈ H
@[simp]
theorem add_subgroup.index_top {G : Type u_1} [add_group G] :
@[simp]
theorem subgroup.index_top {G : Type u_1} [group G] :
@[simp]
theorem subgroup.index_bot {G : Type u_1} [group G] :
@[simp]
theorem add_subgroup.index_bot {G : Type u_1} [add_group G] :
@[simp]
theorem add_subgroup.relindex_top_left {G : Type u_1} [add_group G] (H : add_subgroup G) :
@[simp]
theorem subgroup.relindex_top_left {G : Type u_1} [group G] (H : subgroup G) :
@[simp]
theorem subgroup.relindex_top_right {G : Type u_1} [group G] (H : subgroup G) :
@[simp]
@[simp]
theorem subgroup.relindex_bot_left {G : Type u_1} [group G] (H : subgroup G) :
@[simp]
theorem subgroup.relindex_bot_right {G : Type u_1} [group G] (H : subgroup G) :
@[simp]
@[simp]
theorem add_subgroup.relindex_self {G : Type u_1} [add_group G] (H : add_subgroup G) :
H.relindex H = 1
@[simp]
theorem subgroup.relindex_self {G : Type u_1} [group G] (H : subgroup G) :
H.relindex H = 1
theorem add_subgroup.index_ker {G : Type u_1} [add_group G] {H : Type u_2} [add_group H] (f : G →+ H) :
theorem subgroup.index_ker {G : Type u_1} [group G] {H : Type u_2} [group H] (f : G →* H) :
theorem subgroup.relindex_ker {G : Type u_1} [group G] {H : Type u_2} [group H] (f : G →* H) (K : subgroup G) :
theorem add_subgroup.relindex_ker {G : Type u_1} [add_group G] {H : Type u_2} [add_group H] (f : G →+ H) (K : add_subgroup G) :
@[simp]
@[simp]
theorem subgroup.card_mul_index {G : Type u_1} [group G] (H : subgroup G) :
theorem subgroup.nat_card_dvd_of_injective {G : Type u_1} {H : Type u_2} [group G] [group H] (f : G →* H) (hf : function.injective ⇑f) :
theorem subgroup.nat_card_dvd_of_le {G : Type u_1} [group G] (H K : subgroup G) (hHK : H ≤ K) :
theorem add_subgroup.nat_card_dvd_of_le {G : Type u_1} [add_group G] (H K : add_subgroup G) (hHK : H ≤ K) :
theorem subgroup.nat_card_dvd_of_surjective {G : Type u_1} {H : Type u_2} [group G] [group H] (f : G →* H) (hf : function.surjective ⇑f) :
theorem subgroup.card_dvd_of_surjective {G : Type u_1} {H : Type u_2} [group G] [group H] [fintype G] [fintype H] (f : G →* H) (hf : function.surjective ⇑f) :
theorem add_subgroup.index_map {G : Type u_1} [add_group G] (H : add_subgroup G) {G' : Type u_2} [add_group G'] (f : G →+ G') :
theorem subgroup.index_map {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] (f : G →* G') :
theorem add_subgroup.index_map_dvd {G : Type u_1} [add_group G] (H : add_subgroup G) {G' : Type u_2} [add_group G'] {f : G →+ G'} (hf : function.surjective ⇑f) :
theorem subgroup.index_map_dvd {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] {f : G →* G'} (hf : function.surjective ⇑f) :
theorem add_subgroup.dvd_index_map {G : Type u_1} [add_group G] (H : add_subgroup G) {G' : Type u_2} [add_group G'] {f : G →+ G'} (hf : f.ker ≤ H) :
theorem subgroup.dvd_index_map {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] {f : G →* G'} (hf : f.ker ≤ H) :
theorem add_subgroup.index_map_eq {G : Type u_1} [add_group G] (H : add_subgroup G) {G' : Type u_2} [add_group G'] {f : G →+ G'} (hf1 : function.surjective ⇑f) (hf2 : f.ker ≤ H) :
theorem subgroup.index_map_eq {G : Type u_1} [group G] (H : subgroup G) {G' : Type u_2} [group G'] {f : G →* G'} (hf1 : function.surjective ⇑f) (hf2 : f.ker ≤ H) :
theorem subgroup.index_eq_card {G : Type u_1} [group G] (H : subgroup G) [fintype (G ⧸ H)] :
theorem add_subgroup.index_eq_card {G : Type u_1} [add_group G] (H : add_subgroup G) [fintype (G ⧸ H)] :
theorem subgroup.index_mul_card {G : Type u_1} [group G] (H : subgroup G) [fintype G] [hH : fintype ↥H] :
theorem subgroup.index_dvd_card {G : Type u_1} [group G] (H : subgroup G) [fintype G] :
theorem add_subgroup.relindex_eq_zero_of_le_left {G : Type u_1} [add_group G] {H K L : add_subgroup G} (hHK : H ≤ K) (hKL : K.relindex L = 0) :
H.relindex L = 0
theorem subgroup.relindex_eq_zero_of_le_left {G : Type u_1} [group G] {H K L : subgroup G} (hHK : H ≤ K) (hKL : K.relindex L = 0) :
H.relindex L = 0
theorem subgroup.relindex_eq_zero_of_le_right {G : Type u_1} [group G] {H K L : subgroup G} (hKL : K ≤ L) (hHK : H.relindex K = 0) :
H.relindex L = 0
theorem add_subgroup.relindex_eq_zero_of_le_right {G : Type u_1} [add_group G] {H K L : add_subgroup G} (hKL : K ≤ L) (hHK : H.relindex K = 0) :
H.relindex L = 0
theorem subgroup.index_eq_zero_of_relindex_eq_zero {G : Type u_1} [group G] {H K : subgroup G} (h : H.relindex K = 0) :
H.index = 0
theorem subgroup.relindex_le_of_le_left {G : Type u_1} [group G] {H K L : subgroup G} (hHK : H ≤ K) (hHL : H.relindex L ≠ 0) :
theorem add_subgroup.relindex_le_of_le_left {G : Type u_1} [add_group G] {H K L : add_subgroup G} (hHK : H ≤ K) (hHL : H.relindex L ≠ 0) :
theorem add_subgroup.relindex_le_of_le_right {G : Type u_1} [add_group G] {H K L : add_subgroup G} (hKL : K ≤ L) (hHL : H.relindex L ≠ 0) :
theorem subgroup.relindex_le_of_le_right {G : Type u_1} [group G] {H K L : subgroup G} (hKL : K ≤ L) (hHL : H.relindex L ≠ 0) :
theorem add_subgroup.relindex_ne_zero_trans {G : Type u_1} [add_group G] {H K L : add_subgroup G} (hHK : H.relindex K ≠ 0) (hKL : K.relindex L ≠ 0) :
theorem subgroup.relindex_ne_zero_trans {G : Type u_1} [group G] {H K L : subgroup G} (hHK : H.relindex K ≠ 0) (hKL : K.relindex L ≠ 0) :
theorem subgroup.relindex_inf_ne_zero {G : Type u_1} [group G] {H K L : subgroup G} (hH : H.relindex L ≠ 0) (hK : K.relindex L ≠ 0) :
(H ⊓ K).relindex L ≠ 0
theorem add_subgroup.relindex_inf_ne_zero {G : Type u_1} [add_group G] {H K L : add_subgroup G} (hH : H.relindex L ≠ 0) (hK : K.relindex L ≠ 0) :
(H ⊓ K).relindex L ≠ 0
theorem subgroup.index_inf_ne_zero {G : Type u_1} [group G] {H K : subgroup G} (hH : H.index ≠ 0) (hK : K.index ≠ 0) :
(H ⊓ K).index ≠ 0
theorem add_subgroup.index_inf_ne_zero {G : Type u_1} [add_group G] {H K : add_subgroup G} (hH : H.index ≠ 0) (hK : K.index ≠ 0) :
(H ⊓ K).index ≠ 0
theorem subgroup.relindex_inf_le {G : Type u_1} [group G] {H K L : subgroup G} :
(H ⊓ K).relindex L ≤ H.relindex L * K.relindex L
theorem add_subgroup.relindex_inf_le {G : Type u_1} [add_group G] {H K L : add_subgroup G} :
(H ⊓ K).relindex L ≤ H.relindex L * K.relindex L
theorem add_subgroup.index_inf_le {G : Type u_1} [add_group G] {H K : add_subgroup G} :
(H ⊓ K).index ≤ H.index * K.index
theorem subgroup.index_inf_le {G : Type u_1} [group G] {H K : subgroup G} :
(H ⊓ K).index ≤ H.index * K.index
theorem subgroup.relindex_infi_ne_zero {G : Type u_1} [group G] {L : subgroup G} {ι : Type u_2} [hι : finite ι] {f : ι → subgroup G} (hf : ∀ (i : ι), (f i).relindex L ≠ 0) :
(⨅ (i : ι), f i).relindex L ≠ 0
theorem add_subgroup.relindex_infi_ne_zero {G : Type u_1} [add_group G] {L : add_subgroup G} {ι : Type u_2} [hι : finite ι] {f : ι → add_subgroup G} (hf : ∀ (i : ι), (f i).relindex L ≠ 0) :
(⨅ (i : ι), f i).relindex L ≠ 0
theorem subgroup.relindex_infi_le {G : Type u_1} [group G] {L : subgroup G} {ι : Type u_2} [fintype ι] (f : ι → subgroup G) :
(⨅ (i : ι), f i).relindex L ≤ finset.univ.prod (λ (i : ι), (f i).relindex L)
theorem add_subgroup.relindex_infi_le {G : Type u_1} [add_group G] {L : add_subgroup G} {ι : Type u_2} [fintype ι] (f : ι → add_subgroup G) :
(⨅ (i : ι), f i).relindex L ≤ finset.univ.prod (λ (i : ι), (f i).relindex L)
theorem subgroup.index_infi_ne_zero {G : Type u_1} [group G] {ι : Type u_2} [finite ι] {f : ι → subgroup G} (hf : ∀ (i : ι), (f i).index ≠ 0) :
(⨅ (i : ι), f i).index ≠ 0
theorem add_subgroup.index_infi_ne_zero {G : Type u_1} [add_group G] {ι : Type u_2} [finite ι] {f : ι → add_subgroup G} (hf : ∀ (i : ι), (f i).index ≠ 0) :
(⨅ (i : ι), f i).index ≠ 0
theorem add_subgroup.index_infi_le {G : Type u_1} [add_group G] {ι : Type u_2} [fintype ι] (f : ι → add_subgroup G) :
(⨅ (i : ι), f i).index ≤ finset.univ.prod (λ (i : ι), (f i).index)
theorem subgroup.index_infi_le {G : Type u_1} [group G] {ι : Type u_2} [fintype ι] (f : ι → subgroup G) :
(⨅ (i : ι), f i).index ≤ finset.univ.prod (λ (i : ι), (f i).index)
@[simp]
theorem add_subgroup.index_eq_one {G : Type u_1} [add_group G] {H : add_subgroup G} :
H.index = 1 ↔ H = ⊤
@[simp]
theorem subgroup.index_eq_one {G : Type u_1} [group G] {H : subgroup G} :
H.index = 1 ↔ H = ⊤
@[simp]
theorem subgroup.relindex_eq_one {G : Type u_1} [group G] {H K : subgroup G} :
H.relindex K = 1 ↔ K ≤ H
@[simp]
theorem add_subgroup.relindex_eq_one {G : Type u_1} [add_group G] {H K : add_subgroup G} :
H.relindex K = 1 ↔ K ≤ H
@[simp]
theorem add_subgroup.card_eq_one {G : Type u_1} [add_group G] {H : add_subgroup G} :
@[simp]
theorem subgroup.card_eq_one {G : Type u_1} [group G] {H : subgroup G} :
theorem add_subgroup.index_ne_zero_of_finite {G : Type u_1} [add_group G] {H : add_subgroup G} [hH : finite (G ⧸ H)] :
theorem subgroup.index_ne_zero_of_finite {G : Type u_1} [group G] {H : subgroup G} [hH : finite (G ⧸ H)] :
noncomputable def subgroup.fintype_of_index_ne_zero {G : Type u_1} [group G] {H : subgroup G} (hH : H.index ≠ 0) :
fintype (G ⧸ H)

Finite index implies finite quotient.

Equations
noncomputable def add_subgroup.fintype_of_index_ne_zero {G : Type u_1} [add_group G] {H : add_subgroup G} (hH : H.index ≠ 0) :
fintype (G ⧸ H)

Finite index implies finite quotient.

Equations
theorem add_subgroup.one_lt_index_of_ne_top {G : Type u_1} [add_group G] {H : add_subgroup G} [finite (G ⧸ H)] (hH : H ≠ ⊤) :
1 < H.index
theorem subgroup.one_lt_index_of_ne_top {G : Type u_1} [group G] {H : subgroup G} [finite (G ⧸ H)] (hH : H ≠ ⊤) :
1 < H.index
@[class]
structure add_subgroup.finite_index {G : Type u_2} [add_group G] (H : add_subgroup G) :
Prop

Typeclass for finite index subgroups.

Instances of this typeclass
@[protected, instance]
@[protected, instance]
@[protected, instance]
@[protected, instance]
@[protected, instance]
@[protected, instance]
@[protected, instance]
@[protected, instance]
theorem subgroup.finite_index_of_le {G : Type u_1} [group G] {H K : subgroup G} [H.finite_index] (h : H ≤ K) :
theorem add_subgroup.finite_index_of_le {G : Type u_1} [add_group G] {H K : add_subgroup G} [H.finite_index] (h : H ≤ K) :
@[protected, instance]
def subgroup.finite_index_ker {G : Type u_1} [group G] {G' : Type u_2} [group G'] (f : G →* G') [finite ↥(f.range)] :
@[protected, instance]
def add_subgroup.finite_index_ker {G : Type u_1} [add_group G] {G' : Type u_2} [add_group G'] (f : G →+ G') [finite ↥(f.range)] :
@[protected, instance]
@[protected, instance]