@@ -10,6 +10,7 @@ public import Mathlib.Algebra.Polynomial.Derivative
1010public import Mathlib.Algebra.Polynomial.Degree.Lemmas
1111public import Mathlib.Algebra.Ring.NegOnePow
1212public import Mathlib.Tactic.LinearCombination
13+ public import Mathlib.LinearAlgebra.Span.Basic
1314
1415/-!
1516# Chebyshev polynomials
@@ -501,6 +502,24 @@ theorem T_eq_X_mul_U_sub_U (n : ℤ) : T R (n + 2) = X * U R (n + 1) - U R n :=
501502 show n + 2 + 1 - 2 = n + 1 by ring] at h
502503 linear_combination (norm := ring_nf) h
503504
505+ theorem two_mul_T_eq_U_sub_U (n : ℤ) : 2 * T R (n + 2 ) = U R (n + 2 ) - U R n := by
506+ linear_combination (norm := ring_nf) (T_eq_U_sub_X_mul_U R (n + 2 )) + (T_eq_X_mul_U_sub_U R n)
507+
508+ theorem U_eq_two_mul_T_add_U (n : ℤ) : U R (n + 2 ) = 2 * T R (n + 2 ) + U R n := by
509+ linear_combination (norm := ring_nf) - (two_mul_T_eq_U_sub_U R n)
510+
511+ theorem U_mem_span_T (n : ℕ) : U R n ∈ Submodule.span ℕ ((fun m : ℕ => T R m) '' Set.Icc 0 n) := by
512+ induction n using Nat.twoStepInduction with
513+ | zero => simp
514+ | one =>
515+ rw [show U R (1 : ℕ) = 2 * T R 1 by simp, ← smul_eq_mul]; norm_cast
516+ exact Submodule.smul_of_tower_mem _ 2 (Submodule.mem_span_of_mem ⟨1 , by simp⟩)
517+ | more n h₀ _ =>
518+ push_cast; rw [U_eq_two_mul_T_add_U, ← smul_eq_mul]; norm_cast
519+ refine Submodule.add_mem _ ?_ ((Submodule.span_mono (by grind)) h₀)
520+ · exact Submodule.smul_of_tower_mem _ 2
521+ (Submodule.mem_span_of_mem ⟨n + 2 , by simp⟩)
522+
504523/-- `C n` is the `n`th rescaled Chebyshev polynomial of the first kind (also known as a Vieta–Lucas
505524polynomial), given by $C_n(2x) = 2T_n(x)$. See `Polynomial.Chebyshev.C_comp_two_mul_X`. -/
506525noncomputable def C : ℤ → R[X]
@@ -865,6 +884,31 @@ theorem T_derivative_eq_U (n : ℤ) : derivative (T R n) = n * U R (n - 1) := by
865884 linear_combination (norm := (push_cast; ring_nf))
866885 -ih2 + 2 * (X : R[X]) * ih1 + h₁ + 2 * h₃ + (n + 1 ) * h₂
867886
887+ theorem T_derivative_mem_span_T (n : ℕ) :
888+ derivative (T R n) ∈ Submodule.span ℕ ((fun m : ℕ => T R m) '' Set.Ico 0 n) := by
889+ by_cases! hn : n = 0
890+ · simp [hn]
891+ rw [T_derivative_eq_U, ← smul_eq_mul]; norm_cast
892+ refine Submodule.smul_of_tower_mem _ n ?_
893+ convert U_mem_span_T R (n - 1 ) using 2 <;> grind
894+
895+ theorem T_iterate_derivative_mem_span_T (n k : ℕ) :
896+ derivative^[k] (T R n) ∈ Submodule.span ℕ ((fun m : ℕ => T R m) '' Set.Icc 0 (n - k)) := by
897+ induction k
898+ case zero =>
899+ rw [Function.iterate_zero_apply]
900+ exact Submodule.mem_span_of_mem ⟨n, by simp⟩
901+ case succ k ih =>
902+ rw [Function.iterate_succ_apply']
903+ suffices Submodule.span ℕ ((fun m : ℕ => derivative (T R m)) '' Set.Icc 0 (n - k)) ≤
904+ Submodule.span ℕ ((fun m : ℕ => T R m) '' Set.Icc 0 (n - (k + 1 ))) by
905+ apply this
906+ convert Submodule.apply_mem_span_image_of_mem_span (derivative.restrictScalars ℕ) ih using 2
907+ simp [Set.image]
908+ refine Submodule.span_le.mpr (fun x hx => ?_)
909+ obtain ⟨m, hm, rfl⟩ := hx
910+ refine (Submodule.span_mono (by grind)) (T_derivative_mem_span_T (R := R) m)
911+
868912theorem one_sub_X_sq_mul_derivative_T_eq_poly_in_T (n : ℤ) :
869913 (1 - X ^ 2 ) * derivative (T R (n + 1 )) = (n + 1 : R[X]) * (T R n - X * T R (n + 1 )) := by
870914 have H₁ := one_sub_X_sq_mul_U_eq_pol_in_T R n
0 commit comments