Theorem: Subgroup.exists_finset_card_le_mul
File: Mathlib/GroupTheory/Schreier.lean

Proof steps:
state_before: G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: letI := H.fintypeQuotientOfFiniteIndex
state_before: G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this : DecidableEq G
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: haveI : DecidableEq G := Classical.decEq G
state_before: G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this : DecidableEq G
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this : DecidableEq G
R₀ : Set G
hR : R₀ ∈ rightTransversals ↑H
hR1 : 1 ∈ R₀
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: obtain ⟨R₀, hR, hR1⟩ := H.exists_right_transversal 1
state_before: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this : DecidableEq G
R₀ : Set G
hR : R₀ ∈ rightTransversals ↑H
hR1 : 1 ∈ R₀
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
hR : R₀ ∈ rightTransversals ↑H
hR1 : 1 ∈ R₀
this : Fintype ↑R₀
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: haveI : Fintype R₀ := Fintype.ofEquiv _ (toEquiv hR)
state_before: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
hR : R₀ ∈ rightTransversals ↑H
hR1 : 1 ∈ R₀
this : Fintype ↑R₀
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
hR : R₀ ∈ rightTransversals ↑H
hR1 : 1 ∈ R₀
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: let R : Finset G := Set.toFinset R₀
state_before: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
hR : R₀ ∈ rightTransversals ↑H
hR1 : 1 ∈ R₀
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
hR1 : 1 ∈ R₀
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
hR : ↑R ∈ rightTransversals ↑H
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: replace hR : (R : Set G) ∈ rightTransversals (H : Set G) := by rwa [Set.coe_toFinset]
state_before: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
hR1 : 1 ∈ R₀
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
hR : ↑R ∈ rightTransversals ↑H
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
hR : ↑R ∈ rightTransversals ↑H
hR1 : 1 ∈ R
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
tactic: replace hR1 : (1 : G) ∈ R := by rwa [Set.mem_toFinset]
state_before: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
hR : ↑R ∈ rightTransversals ↑H
hR1 : 1 ∈ R
⊢ ∃ T, T.card ≤ H.index * S.card ∧ closure ↑T = ⊤
state_after: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
hR : ↑R ∈ rightTransversals ↑H
hR1 : 1 ∈ R
⊢ (Finset.image (fun g => ⟨g * (↑(toFun hR g))⁻¹, ⋯⟩) (R * S)).card ≤ H.index * S.card
tactic: refine ⟨_, ?_, closure_mul_image_eq_top' hR hR1 hS⟩
state_before: case intro.intro
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
R✝ S✝ : Set G
inst✝ : H.FiniteIndex
S : Finset G
hS : closure ↑S = ⊤
this✝¹ : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
this✝ : DecidableEq G
R₀ : Set G
this : Fintype ↑R₀
R : Finset G := R₀.toFinset
hR : ↑R ∈ rightTransversals ↑H
hR1 : 1 ∈ R
⊢ R.card = H.index
state_after: no goals
tactic: calc
    R.card = Fintype.card R := (Fintype.card_coe R).symm
    _ = _ := (Fintype.card_congr (toEquiv hR)).symm
    _ = Fintype.card (G ⧸ H) := QuotientGroup.card_quotient_rightRel H
    _ = H.index := by rw [index_eq_card, Nat.card_eq_fintype_card]