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
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
⊢ ↑(transfer ϕ) g =
    ∏ q : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)),
      ↑ϕ
        {
          val :=
            (Quotient.out' (Quotient.out' q))⁻¹ *
                g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
              Quotient.out' (Quotient.out' q),
          property :=
            (_ :
              (Quotient.out' (Quotient.out' q))⁻¹ *
                    g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
                  Quotient.out' (Quotient.out' q) ∈
                H) }

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
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
⊢ ∏ a : orbitRel.Quotient { x // x ∈ zpowers g } (G ⧸ H),
      ∏ s in (fun x => Finset.univ) a,
        ↑ϕ
          {
            val :=
              (↑(↑(MemLeftTransversals.toEquiv (_ : ↑(transferTransversal H g) ∈ leftTransversals ↑H))
                      (↑(quotientEquivSigmaZMod H g).symm { fst := a, snd := s })))⁻¹ *
                ↑(↑(MemLeftTransversals.toEquiv (_ : ↑(g • transferTransversal H g) ∈ leftTransversals ↑H))
                    (↑(quotientEquivSigmaZMod H g).symm { fst := a, snd := s })),
            property :=
              (_ :
                (↑(↑(MemLeftTransversals.toEquiv (_ : ↑(transferTransversal H g) ∈ leftTransversals ↑H))
                          (↑(quotientEquivSigmaZMod H g).symm { fst := a, snd := s })))⁻¹ *
                    ↑(↑(MemLeftTransversals.toEquiv (_ : ↑(g • transferTransversal H g) ∈ leftTransversals ↑H))
                        (↑(quotientEquivSigmaZMod H g).symm { fst := a, snd := s })) ∈
                  H) } =
    ∏ q : Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)),
      ↑ϕ
        {
          val :=
            (Quotient.out' (Quotient.out' q))⁻¹ *
                g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
              Quotient.out' (Quotient.out' q),
          property :=
            (_ :
              (Quotient.out' (Quotient.out' q))⁻¹ *
                    g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
                  Quotient.out' (Quotient.out' q) ∈
                H) }

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
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
q : orbitRel.Quotient { x // x ∈ zpowers g } (G ⧸ H)
⊢ ∏ s in (fun x => Finset.univ) q,
      ↑ϕ
        {
          val :=
            (↑(↑(MemLeftTransversals.toEquiv (_ : ↑(transferTransversal H g) ∈ leftTransversals ↑H))
                    (↑(quotientEquivSigmaZMod H g).symm { fst := q, snd := s })))⁻¹ *
              ↑(↑(MemLeftTransversals.toEquiv (_ : ↑(g • transferTransversal H g) ∈ leftTransversals ↑H))
                  (↑(quotientEquivSigmaZMod H g).symm { fst := q, snd := s })),
          property :=
            (_ :
              (↑(↑(MemLeftTransversals.toEquiv (_ : ↑(transferTransversal H g) ∈ leftTransversals ↑H))
                        (↑(quotientEquivSigmaZMod H g).symm { fst := q, snd := s })))⁻¹ *
                  ↑(↑(MemLeftTransversals.toEquiv (_ : ↑(g • transferTransversal H g) ∈ leftTransversals ↑H))
                      (↑(quotientEquivSigmaZMod H g).symm { fst := q, snd := s })) ∈
                H) } =
    ↑ϕ
      {
        val :=
          (Quotient.out' (Quotient.out' q))⁻¹ *
              g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
            Quotient.out' (Quotient.out' q),
        property :=
          (_ :
            (Quotient.out' (Quotient.out' q))⁻¹ *
                  g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
                Quotient.out' (Quotient.out' q) ∈
              H) }

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
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
q : orbitRel.Quotient { x // x ∈ zpowers g } (G ⧸ H)
⊢ ↑ϕ
      {
        val :=
          (g ^ ↑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 ^ ↑0 * Quotient.out' (Quotient.out' q),
        property :=
          (_ :
            (fun x => x ∈ H)
              ((g ^ ↑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 ^ ↑0 * Quotient.out' (Quotient.out' q))) } =
    ↑ϕ
      {
        val :=
          (Quotient.out' (Quotient.out' q))⁻¹ * g ^ Function.minimalPeriod (fun x => g • x) (Quotient.out' q) *
            Quotient.out' (Quotient.out' q),
        property :=
          (_ :
            (Quotient.out' (Quotient.out' q))⁻¹ *
                  g ^ Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q) *
                Quotient.out' (Quotient.out' q) ∈
              H) }

tactic: intro k hk
state_before: G : Type u_1
inst✝³ : Group G
H : Subgroup G
A : Type u_2
inst✝² : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
q : orbitRel.Quotient { x // x ∈ zpowers g } (G ⧸ H)
⊢ ∀ (x : ZMod (Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q))),
    x ≠ 0 →
      ↑ϕ
          {
            val :=
              (g ^ ↑x * 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 * Quotient.out' (Quotient.out' q),
            property :=
              (_ :
                (fun x => x ∈ H)
                  ((g ^ ↑x * 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 * 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
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
q : orbitRel.Quotient { x // x ∈ zpowers g } (G ⧸ H)
k : ZMod (Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q))
hk : k ≠ 0
⊢ ↑ϕ
      {
        val :=
          (g ^ ↑k * 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 * Quotient.out' (Quotient.out' q),
        property :=
          (_ :
            (fun x => x ∈ H)
              ((g ^ ↑k * 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 * Quotient.out' (Quotient.out' q))) } =
    1

tactic: exact map_one ϕ
state_before: G : Type u_1
inst✝³ : Group G
H : Subgroup G
A : Type u_2
inst✝² : CommGroup A
ϕ : { x // x ∈ H } →* A
T : ↑(leftTransversals ↑H)
inst✝¹ : FiniteIndex H
g : G
inst✝ : Fintype (Quotient (orbitRel { x // x ∈ zpowers g } (G ⧸ H)))
this : Fintype (G ⧸ H) := fintypeQuotientOfFiniteIndex H
q : orbitRel.Quotient { x // x ∈ zpowers g } (G ⧸ H)
k : ZMod (Function.minimalPeriod ((fun x x_1 => x • x_1) g) (Quotient.out' q))
hk : k ≠ 0
⊢ ↑ϕ { val := 1, property := (_ : (fun x => x ∈ H) 1) } = 1