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

tactic: classical
  letI := H.fintypeQuotientOfFiniteIndex
  change ∀ (k g₀) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑(⟨g₀⁻¹ * g ^ k * g₀, hk⟩ : H) = g ^ k at key
  rw [transfer_eq_prod_quotient_orbitRel_zpowers_quot, ← Finset.prod_to_list]
  refine (List.prod_map_hom _ _ _).trans ?_ refine congrArg ϕ (Subtype.coe_injective ?_)
  simp only rw [H.coe_mk, ← (zpowers g).coe_mk g (mem_zpowers g), ← (zpowers g).coe_pow,
    index_eq_card, Fintype.card_congr (selfEquivSigmaOrbits (zpowers g) (G ⧸ H)),
    Fintype.card_sigma, ← Finset.prod_pow_eq_pow_sum, ← Finset.prod_to_list]
  simp only [Subgroup.val_list_prod, List.map_map, ← minimalPeriod_eq_card]
  congr
  funext
  apply key
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
⊢ ϕ.transfer g = ϕ ⟨g ^ H.index, ⋯⟩
state_after: no goals

tactic: letI := H.fintypeQuotientOfFiniteIndex
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
⊢ ϕ.transfer g = ϕ ⟨g ^ H.index, ⋯⟩
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
⊢ ϕ.transfer g = ϕ ⟨g ^ H.index, ⋯⟩

tactic: change ∀ (k g₀) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑(⟨g₀⁻¹ * g ^ k * g₀, hk⟩ : H) = g ^ k at key
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
key : ∀ (k : ℕ) (g₀ : G), g₀⁻¹ * g ^ k * g₀ ∈ H → g₀⁻¹ * g ^ k * g₀ = g ^ k
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
⊢ ϕ.transfer g = ϕ ⟨g ^ H.index, ⋯⟩
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ϕ.transfer g = ϕ ⟨g ^ H.index, ⋯⟩

tactic: rw [transfer_eq_prod_quotient_orbitRel_zpowers_quot, ← Finset.prod_to_list]
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ϕ.transfer g = ϕ ⟨g ^ H.index, ⋯⟩
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (List.map
        (fun q =>
          ϕ ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
        Finset.univ.toList).prod =
    ϕ ⟨g ^ H.index, ⋯⟩

tactic: refine (List.prod_map_hom _ _ _).trans ?_
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (List.map
        (fun q =>
          ϕ ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
        Finset.univ.toList).prod =
    ϕ ⟨g ^ H.index, ⋯⟩
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ϕ
      (List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
          Finset.univ.toList).prod =
    ϕ ⟨g ^ H.index, ⋯⟩

tactic: refine congrArg ϕ (Subtype.coe_injective ?_)
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ϕ
      (List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
          Finset.univ.toList).prod =
    ϕ ⟨g ^ H.index, ⋯⟩
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (fun a => ↑a)
      (List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
          Finset.univ.toList).prod =
    (fun a => ↑a) ⟨g ^ H.index, ⋯⟩

tactic: simp only
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (fun a => ↑a)
      (List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
          Finset.univ.toList).prod =
    (fun a => ↑a) ⟨g ^ H.index, ⋯⟩
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ↑(List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
          Finset.univ.toList).prod =
    g ^ H.index

tactic: rw [H.coe_mk, ← (zpowers g).coe_mk g (mem_zpowers g), ← (zpowers g).coe_pow,
  index_eq_card, Fintype.card_congr (selfEquivSigmaOrbits (zpowers g) (G ⧸ H)),
  Fintype.card_sigma, ← Finset.prod_pow_eq_pow_sum, ← Finset.prod_to_list]
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ↑(List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
          Finset.univ.toList).prod =
    g ^ H.index
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ↑(List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * ↑⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => ↑⟨g, ⋯⟩ • x) q.out' *
                Quotient.out' q.out',
              ⋯⟩)
          Finset.univ.toList).prod =
    ↑(List.map (fun i => ⟨g, ⋯⟩ ^ Fintype.card ↑(orbit (↥(zpowers g)) (Quotient.out' i))) Finset.univ.toList).prod

tactic: simp only [Subgroup.val_list_prod, List.map_map, ← minimalPeriod_eq_card]
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ ↑(List.map
          (fun q =>
            ⟨(Quotient.out' q.out')⁻¹ * ↑⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => ↑⟨g, ⋯⟩ • x) q.out' *
                Quotient.out' q.out',
              ⋯⟩)
          Finset.univ.toList).prod =
    ↑(List.map (fun i => ⟨g, ⋯⟩ ^ Fintype.card ↑(orbit (↥(zpowers g)) (Quotient.out' i))) Finset.univ.toList).prod
state_after: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (List.map
        (Subtype.val ∘ fun q =>
          ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
        Finset.univ.toList).prod =
    (List.map (Subtype.val ∘ fun i => ⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' i))
        Finset.univ.toList).prod

tactic: congr
state_before: G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (List.map
        (Subtype.val ∘ fun q =>
          ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
        Finset.univ.toList).prod =
    (List.map (Subtype.val ∘ fun i => ⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' i))
        Finset.univ.toList).prod
state_after: case e_a.e_f
G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (Subtype.val ∘ fun q =>
      ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩) =
    Subtype.val ∘ fun i => ⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' i)

tactic: funext
state_before: case e_a.e_f
G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
⊢ (Subtype.val ∘ fun q =>
      ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩) =
    Subtype.val ∘ fun i => ⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' i)
state_after: case e_a.e_f.h
G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
x✝ : Quotient (orbitRel (↥(zpowers g)) (G ⧸ H))
⊢ (Subtype.val ∘ fun q =>
        ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
      x✝ =
    (Subtype.val ∘ fun i => ⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' i)) x✝

tactic: apply key
state_before: case e_a.e_f.h
G : Type u_1
inst✝² : Group G
H : Subgroup G
A : Type u_2
inst✝¹ : CommGroup A
ϕ : ↥H →* A
T : ↑(leftTransversals ↑H)
inst✝ : H.FiniteIndex
g : G
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
key : ∀ (k : ℕ) (g₀ : G) (hk : g₀⁻¹ * g ^ k * g₀ ∈ H), ↑⟨g₀⁻¹ * g ^ k * g₀, hk⟩ = g ^ k
x✝ : Quotient (orbitRel (↥(zpowers g)) (G ⧸ H))
⊢ (Subtype.val ∘ fun q =>
        ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩)
      x✝ =
    (Subtype.val ∘ fun i => ⟨g, ⋯⟩ ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' i)) x✝
state_after: no goals