-- Mathlib/RingTheory/Polynomial/Dickson.lean
theorem dickson_one_one_mul (m n : ℕ) :
    dickson 1 (1 : R) (m * n) = (dickson 1 1 m).comp (dickson 1 1 n)

Proof state:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
⊢ 1 = (Int.castRingHom R) 1

Tactic:
simp only [eq_intCast, Int.cast_one]

Result:
no goals

Proof state:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ dickson 1 1 (m * n) = (dickson 1 1 m).comp (dickson 1 1 n)

Tactic:
rw [h]

Result:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ dickson 1 ((Int.castRingHom R) 1) (m * n) =
    (dickson 1 ((Int.castRingHom R) 1) m).comp (dickson 1 ((Int.castRingHom R) 1) n)

Proof state:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ ((Chebyshev.T ℚ ↑m + Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n)).comp (C ⅟2 * X) =
    ((Chebyshev.T ℚ ↑m + Chebyshev.T ℚ ↑m).comp (C ⅟2 * X)).comp ((Chebyshev.T ℚ ↑n + Chebyshev.T ℚ ↑n).comp (C ⅟2 * X))

Tactic:
simp only [← two_mul, ← comp_assoc]

Result:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ ((2 * Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n)).comp (C ⅟2 * X) =
    (((2 * Chebyshev.T ℚ ↑m).comp (C ⅟2 * X)).comp (2 * Chebyshev.T ℚ ↑n)).comp (C ⅟2 * X)

Proof state:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ dickson 1 ((Int.castRingHom R) 1) (m * n) =
    (dickson 1 ((Int.castRingHom R) 1) m).comp (dickson 1 ((Int.castRingHom R) 1) n)

Tactic:
simp only [← map_dickson (Int.castRingHom R), ← map_comp]

Result:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ map (Int.castRingHom R) (dickson 1 1 (m * n)) = map (Int.castRingHom R) ((dickson 1 1 m).comp (dickson 1 1 n))

Proof state:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ Chebyshev.T ℚ ↑n = (C ⅟2 * X).comp (2 * Chebyshev.T ℚ ↑n)

Tactic:
rw [mul_comp, C_comp, X_comp, ← mul_assoc, C_half_mul_two_eq_one, one_mul]

Result:
no goals

Proof state:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
⊢ dickson 1 1 (m * n) = (dickson 1 1 m).comp (dickson 1 1 n)

Tactic:
have h : (1 : R) = Int.castRingHom R 1 := by simp only [eq_intCast, Int.cast_one]

Result:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ dickson 1 1 (m * n) = (dickson 1 1 m).comp (dickson 1 1 n)

Proof state:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ map (Int.castRingHom R) (dickson 1 1 (m * n)) = map (Int.castRingHom R) ((dickson 1 1 m).comp (dickson 1 1 n))

Tactic:
congr 1

Result:
case e_a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ dickson 1 1 (m * n) = (dickson 1 1 m).comp (dickson 1 1 n)

Proof state:
case e_a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ dickson 1 1 (m * n) = (dickson 1 1 m).comp (dickson 1 1 n)

Tactic:
apply map_injective (Int.castRingHom ℚ) Int.cast_injective

Result:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ map (Int.castRingHom ℚ) (dickson 1 1 (m * n)) = map (Int.castRingHom ℚ) ((dickson 1 1 m).comp (dickson 1 1 n))

Proof state:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ (2 * Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n) = ((2 * Chebyshev.T ℚ ↑m).comp (C ⅟2 * X)).comp (2 * Chebyshev.T ℚ ↑n)

Tactic:
rw [comp_assoc]

Result:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ (2 * Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n) = (2 * Chebyshev.T ℚ ↑m).comp ((C ⅟2 * X).comp (2 * Chebyshev.T ℚ ↑n))

Proof state:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ ((2 * Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n)).comp (C ⅟2 * X) =
    (((2 * Chebyshev.T ℚ ↑m).comp (C ⅟2 * X)).comp (2 * Chebyshev.T ℚ ↑n)).comp (C ⅟2 * X)

Tactic:
apply eval₂_congr rfl rfl

Result:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ (2 * Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n) = ((2 * Chebyshev.T ℚ ↑m).comp (C ⅟2 * X)).comp (2 * Chebyshev.T ℚ ↑n)

Proof state:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ map (Int.castRingHom ℚ) (dickson 1 1 (m * n)) = map (Int.castRingHom ℚ) ((dickson 1 1 m).comp (dickson 1 1 n))

Tactic:
simp only [map_dickson, map_comp, eq_intCast, Int.cast_one, dickson_one_one_eq_chebyshev_T,
  Nat.cast_mul, Chebyshev.T_mul, two_mul, ← add_comp]

Result:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ ((Chebyshev.T ℚ ↑m + Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n)).comp (C ⅟2 * X) =
    ((Chebyshev.T ℚ ↑m + Chebyshev.T ℚ ↑m).comp (C ⅟2 * X)).comp ((Chebyshev.T ℚ ↑n + Chebyshev.T ℚ ↑n).comp (C ⅟2 * X))

Proof state:
case e_a.a
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ (2 * Chebyshev.T ℚ ↑m).comp (Chebyshev.T ℚ ↑n) = (2 * Chebyshev.T ℚ ↑m).comp ((C ⅟2 * X).comp (2 * Chebyshev.T ℚ ↑n))

Tactic:
apply eval₂_congr rfl _ rfl

Result:
R : Type u_1
inst✝ : CommRing R
m n : ℕ
h : 1 = (Int.castRingHom R) 1
⊢ Chebyshev.T ℚ ↑n = (C ⅟2 * X).comp (2 * Chebyshev.T ℚ ↑n)