-- Module: Mathlib.GroupTheory.SpecificGroups.Cyclic.Basic
Goal:
α : Type u_1
G : Type u_2
G' : Type u_3
a : α
inst : Group α
inst_1 : Group G
inst_2 : Group G'
M : Type u_4
inst_3 : Monoid M
inst_4 : IsCyclic G
inst_5 : MulDistribMulAction M G
n_1 : ℕ
hn : Nat.card G = n_1
m n : M
g : G
hg : orderOf g = Nat.card G
rw :
  Eq (α := ZMod n_1)
    (↑(Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯) : ZMod n_1)
    (↑(Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯ *
          Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯) :
      ZMod n_1)
rw₁ :
  Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ ≡
    Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯ *
      Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯ [ZMOD
    (↑n_1 : ℤ)]
rw₂ :
  Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ ≡
    Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯ *
      Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯ [ZMOD
    (↑(Nat.card G) : ℤ)]
rw₃ :
  Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ ≡
    Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯ *
      Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯ [ZMOD
    (↑(orderOf g) : ℤ)]
rw₄ :
  g ^ Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ =
    g ^
      (Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯ *
        Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯)
rw₅ :
  g ^ Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ =
    (g ^ Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯) ^
      Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯
rw₆ :
  g ^ Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ =
    (toMonoidHom G m : (a : G) → G)
      (g ^ Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯)
rw₇ :
  g ^ Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯ =
    (toMonoidHom G m : (a : G) → G) ((toMonoidHom G n : (a : G) → G) g : G)
rw₈ :
  Eq (α := G) ((toMonoidHom G (m * n) : (a : G) → G) g : G)
    ((toMonoidHom G m : (a : G) → G) ((toMonoidHom G n : (a : G) → G) g : G) : G)
rw₉ : (m * n) • g = (toMonoidHom G m : (a : G) → G) ((toMonoidHom G n : (a : G) → G) g : G)
rw₁₀ : (m * n) • g = HSMul.hSMul (β := G) m ((toMonoidHom G n : (a : G) → G) g : G)
rw₁₁ : (m * n) • g = m • n • g
rw₁₂ rw₁₃ : m • n • g = m • n • g
⊢ (↑(Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G (m * n) : (a : G) → G) g = g ^ m_1) ⋯) : ZMod n_1) =
    HMul.hMul (α := ZMod n_1)
      (↑(Exists.choose (p := fun (m_1 : ℤ) ↦ ∀ (g : G), (toMonoidHom G m : (a : G) → G) g = g ^ m_1) ⋯) : ZMod n_1)
      (↑(Exists.choose (p := fun (m : ℤ) ↦ ∀ (g : G), (toMonoidHom G n : (a : G) → G) g = g ^ m) ⋯) : ZMod n_1)

Tactic:
rw [← Int.cast_mul, ZMod.intCast_eq_intCast_iff, ← hn, ← hg, ← zpow_eq_zpow_iff_modEq,
      zpow_mul', ← (MulDistribMulAction.toMonoidHom G m).map_cyclic.choose_spec,
      ← (MulDistribMulAction.toMonoidHom G n).map_cyclic.choose_spec,
      ← (MulDistribMulAction.toMonoidHom G (m * n)).map_cyclic.choose_spec,
      MulDistribMulAction.toMonoidHom_apply, MulDistribMulAction.toMonoidHom_apply,
      MulDistribMulAction.toMonoidHom_apply, mul_smul]

Premises used: Exists.choose_spec, HMul.hMul, zpow_mul', MonoidHom.map_cyclic, ZMod.intCast_eq_intCast_iff, Int.cast_mul, zpow_eq_zpow_iff_modEq, SemigroupAction.mul_smul, MulDistribMulAction.toMonoidHom, MulDistribMulAction.toMonoidHom_apply