Theorem: MonoidHom.transfer_eq_pow_aux
File: Mathlib/GroupTheory/Transfer.lean

tactic: by_cases hH : H.index = 0
state_before: G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
⊢ g ^ index H ∈ H

tactic: letI := fintypeOfIndexNeZero hH
state_before: case neg
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
hH : ¬index H = 0
⊢ g ^ index H ∈ H

tactic: rw [hH, pow_zero]
state_before: case pos
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
hH : index H = 0
⊢ g ^ index H ∈ H

tactic: exact H.one_mem
state_before: case pos
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
hH : index H = 0
⊢ 1 ∈ H

tactic: have hf : ∀ q, f q ∈ H.subgroupOf (zpowers g) := fun q => key q.out'
state_before: case neg
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
hH : ¬index H = 0
this : Fintype (G ⧸ H) := fintypeOfIndexNeZero hH
key : ∀ (q : G ⧸ H), g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) q ∈ H
f : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)) → { x // x ∈ zpowers g } :=
  fun q =>
    { val := g, property := (_ : g ∈ zpowers g) } ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q)
⊢ g ^ index H ∈ H

tactic: replace key :=
  Subgroup.prod_mem (H.subgroupOf (zpowers g)) fun q (_ : q ∈ Finset.univ) => hf q
state_before: case neg
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
hH : ¬index H = 0
this : Fintype (G ⧸ H) := fintypeOfIndexNeZero hH
key : ∀ (q : G ⧸ H), g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) q ∈ H
f : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)) → { x // x ∈ zpowers g } :=
  fun q =>
    { val := g, property := (_ : g ∈ zpowers g) } ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q)
hf : ∀ (q : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H))), f q ∈ subgroupOf H (zpowers g)
⊢ g ^ index H ∈ H

tactic: simpa only [minimalPeriod_eq_card, Finset.prod_pow_eq_pow_sum, Fintype.card_sigma,
  Fintype.card_congr (selfEquivSigmaOrbits (zpowers g) (G ⧸ H)), index_eq_card] using key
state_before: case neg
G : Type u_1
inst✝¹ : Group G
H : Subgroup G
A : Type ?u.255305
inst✝ : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
g : G
hH : ¬index H = 0
this : Fintype (G ⧸ H) := fintypeOfIndexNeZero hH
f : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)) → { x // x ∈ zpowers g } :=
  fun q =>
    { val := g, property := (_ : g ∈ zpowers g) } ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q)
hf : ∀ (q : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H))), f q ∈ subgroupOf H (zpowers g)
key : ∏ c : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)), f c ∈ subgroupOf H (zpowers g)
⊢ g ^ index H ∈ H