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

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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
⊢ ϕ.transfer g =
    ∏ q : Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)),
      ϕ ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
⊢ ϕ.transfer g =
    ∏ q : Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)),
      ϕ ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩

tactic: refine Fintype.prod_congr _ _ (fun q => ?_)
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
⊢ ∏ a : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H),
      ∏ s : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' a)),
        ϕ
          ⟨(↑((MemLeftTransversals.toEquiv ⋯) ((H.quotientEquivSigmaZMod g).symm ⟨a, s⟩)))⁻¹ *
              ↑((MemLeftTransversals.toEquiv ⋯) ((H.quotientEquivSigmaZMod g).symm ⟨a, s⟩)),
            ⋯⟩ =
    ∏ q : Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)),
      ϕ ⟨(Quotient.out' q.out')⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) q.out' * Quotient.out' q.out', ⋯⟩
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
⊢ ∏ s : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q)),
      ϕ
        ⟨(↑((MemLeftTransversals.toEquiv ⋯) ((H.quotientEquivSigmaZMod g).symm ⟨q, s⟩)))⁻¹ *
            ↑((MemLeftTransversals.toEquiv ⋯) ((H.quotientEquivSigmaZMod g).symm ⟨q, s⟩)),
          ⋯⟩ =
    ϕ
      ⟨(Quotient.out' (Quotient.out' q))⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) *
          Quotient.out' (Quotient.out' q),
        ⋯⟩

tactic: simp only [quotientEquivSigmaZMod_symm_apply, transferTransversal_apply',
  transferTransversal_apply'']
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
⊢ ∏ s : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q)),
      ϕ
        ⟨(↑((MemLeftTransversals.toEquiv ⋯) ((H.quotientEquivSigmaZMod g).symm ⟨q, s⟩)))⁻¹ *
            ↑((MemLeftTransversals.toEquiv ⋯) ((H.quotientEquivSigmaZMod g).symm ⟨q, s⟩)),
          ⋯⟩ =
    ϕ
      ⟨(Quotient.out' (Quotient.out' q))⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) *
          Quotient.out' (Quotient.out' q),
        ⋯⟩
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
⊢ ∏ x : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q)),
      ϕ
        ⟨(g ^ x.cast * Quotient.out' (Quotient.out' q))⁻¹ *
            if x = 0 then
              g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) * Quotient.out' (Quotient.out' q)
            else g ^ x.cast * Quotient.out' (Quotient.out' q),
          ⋯⟩ =
    ϕ
      ⟨(Quotient.out' (Quotient.out' q))⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) *
          Quotient.out' (Quotient.out' q),
        ⋯⟩

tactic: simp only [if_pos, ZMod.cast_zero, zpow_zero, one_mul, mul_assoc]
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
⊢ ϕ
      ⟨(g ^ ZMod.cast 0 * Quotient.out' (Quotient.out' q))⁻¹ *
          if 0 = 0 then g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) * Quotient.out' (Quotient.out' q)
          else g ^ ZMod.cast 0 * Quotient.out' (Quotient.out' q),
        ⋯⟩ =
    ϕ
      ⟨(Quotient.out' (Quotient.out' q))⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) *
          Quotient.out' (Quotient.out' q),
        ⋯⟩
state_after: no goals

tactic: intro k hk
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
⊢ ∀ (x : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q))),
    x ≠ 0 →
      ϕ
          ⟨(g ^ x.cast * Quotient.out' (Quotient.out' q))⁻¹ *
              if x = 0 then
                g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) * Quotient.out' (Quotient.out' q)
              else g ^ x.cast * Quotient.out' (Quotient.out' q),
            ⋯⟩ =
        1
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
k : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q))
hk : k ≠ 0
⊢ ϕ
      ⟨(g ^ k.cast * Quotient.out' (Quotient.out' q))⁻¹ *
          if k = 0 then g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) * Quotient.out' (Quotient.out' q)
          else g ^ k.cast * Quotient.out' (Quotient.out' q),
        ⋯⟩ =
    1

tactic: simp only [if_neg hk, inv_mul_self]
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
k : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q))
hk : k ≠ 0
⊢ ϕ
      ⟨(g ^ k.cast * Quotient.out' (Quotient.out' q))⁻¹ *
          if k = 0 then g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) * Quotient.out' (Quotient.out' q)
          else g ^ k.cast * Quotient.out' (Quotient.out' q),
        ⋯⟩ =
    1
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
k : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q))
hk : k ≠ 0
⊢ ϕ ⟨1, ⋯⟩ = 1

tactic: exact map_one ϕ
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
inst✝ : Fintype (Quotient (orbitRel (↥(zpowers g)) (G ⧸ H)))
this : Fintype (G ⧸ H) := H.fintypeQuotientOfFiniteIndex
q : orbitRel.Quotient (↥(zpowers g)) (G ⧸ H)
k : ZMod (Function.minimalPeriod (fun x => g • x) (Quotient.out' q))
hk : k ≠ 0
⊢ ϕ ⟨1, ⋯⟩ = 1
state_after: no goals