Theorem: MonoidHom.card_fiber_eq_of_mem_range
File: Mathlib/GroupTheory/Index.lean

Proof steps:
state_before: G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : M
hx : x ∈ Set.range ⇑f
hy : y ∈ Set.range ⇑f
⊢ (filter (fun g => f g = x) univ).card = (filter (fun g => f g = y) univ).card
state_after: case intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
y : M
hy : y ∈ Set.range ⇑f
x : G
⊢ (filter (fun g => f g = f x) univ).card = (filter (fun g => f g = y) univ).card
tactic: rcases hx with ⟨x, rfl⟩
state_before: case intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
y : M
hy : y ∈ Set.range ⇑f
x : G
⊢ (filter (fun g => f g = f x) univ).card = (filter (fun g => f g = y) univ).card
state_after: case intro.intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : G
⊢ (filter (fun g => f g = f x) univ).card = (filter (fun g => f g = f y) univ).card
tactic: rcases hy with ⟨y, rfl⟩
state_before: case intro.intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : G
⊢ (filter (fun g => f g = f x) univ).card = (filter (fun g => f g = f y) univ).card
state_after: case intro.intro.intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : G
⊢ (filter (fun g => f g = f x) univ).card = (filter (fun g => f g = f ((fun x_1 => x * x_1) y)) univ).card
tactic: rcases mul_left_surjective x y with ⟨y, rfl⟩
state_before: case intro.intro.intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : G
⊢ (filter (fun g => f g = f x) univ).card = (filter (fun g => f g = f ((fun x_1 => x * x_1) y)) univ).card
state_after: case intro.intro.intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : G
⊢ (filter ((fun g => f g = f x) ∘ ⇑(Equiv.toEmbedding (Equiv.mulRight y⁻¹))) univ).card =
    (filter (fun g => f g = f ((fun x_1 => x * x_1) y)) univ).card
tactic: conv_lhs =>
    rw [← map_univ_equiv (Equiv.mulRight y⁻¹), filter_map, card_map]
state_before: case intro.intro.intro
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y : G
⊢ (filter ((fun g => f g = f x) ∘ ⇑(Equiv.toEmbedding (Equiv.mulRight y⁻¹))) univ).card =
    (filter (fun g => f g = f ((fun x_1 => x * x_1) y)) univ).card
state_after: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
⊢ ((fun g => f g = f x) ∘ ⇑(Equiv.toEmbedding (Equiv.mulRight y⁻¹))) g ↔ f g = f ((fun x_1 => x * x_1) y)
tactic: congr 2 with g
state_before: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
⊢ ((fun g => f g = f x) ∘ ⇑(Equiv.toEmbedding (Equiv.mulRight y⁻¹))) g ↔ f g = f ((fun x_1 => x * x_1) y)
state_after: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
⊢ f g * f y⁻¹ = f x ↔ f g = f x * f y
tactic: simp only [Function.comp, Equiv.toEmbedding_apply, Equiv.coe_mulRight, map_mul]
state_before: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
⊢ f g * f y⁻¹ = f x ↔ f g = f x * f y
state_after: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
f' : G →* M := ↑f
⊢ f g * f y⁻¹ = f x ↔ f g = f x * f y
tactic: let f' := MonoidHomClass.toMonoidHom f
state_before: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
f' : G →* M := ↑f
⊢ f g * f y⁻¹ = f x ↔ f g = f x * f y
state_after: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
f' : G →* M := ↑f
⊢ f' g * f' y⁻¹ = f' x ↔ f' g = f' x * f' y
tactic: show f' g * f' y⁻¹ = f' x ↔ f' g = f' x * f' y
state_before: case intro.intro.intro.e_s.e_p.h.a
G : Type u_1
M : Type u_2
F : Type u_3
inst✝⁵ : Group G
inst✝⁴ : Fintype G
inst✝³ : Monoid M
inst✝² : DecidableEq M
inst✝¹ : FunLike F G M
inst✝ : MonoidHomClass F G M
f : F
x y g : G
f' : G →* M := ↑f
⊢ f' g * f' y⁻¹ = f' x ↔ f' g = f' x * f' y
state_after: no goals
tactic: rw [← f'.coe_toHomUnits y⁻¹, map_inv, Units.mul_inv_eq_iff_eq_mul, f'.coe_toHomUnits]