Skip to content

Commit b7fcb00

Browse files
committed
feat(Chebyshev/RootsExtrema): bound iterated derivatives of Chebyshev T on [-1, 1] (#34364)
1 parent f622314 commit b7fcb00

2 files changed

Lines changed: 72 additions & 4 deletions

File tree

Mathlib/Analysis/SpecialFunctions/Trigonometric/Chebyshev/RootsExtrema.lean

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ import Mathlib.NumberTheory.Niven
2121
2222
## Main statements
2323
24-
* T_n(x) ∈ [-1, 1] iff x ∈ [-1, 1]: `abs_eval_T_real_le_one_iff`
25-
* Zeroes of T and U: `roots_T_real`, `roots_U_real`
26-
* Local extrema of T: `isLocalExtr_T_real_iff`, `isExtrOn_T_real_iff`
27-
* Irrationality of zeroes of T other than zero: `irrational_of_isRoot_T_real`
24+
* `T_n(x) ∈ [-1, 1]` iff `x ∈ [-1, 1]`: abs_eval_T_real_le_one_iff
25+
* Zeroes of `T` and `U`: roots_T_real, roots_U_real
26+
* Local extrema of `T`: isLocalExtr_T_real_iff, isExtrOn_T_real_iff
27+
* Irrationality of zeroes of `T` other than zero: irrational_of_isRoot_T_real
28+
* `|T_n^{(k)} (x)| ≤ T_n^{(k)} (1)` for `x ∈ [-1, 1]`: abs_iterate_derivative_T_real_le
29+
30+
## TODO
31+
32+
Show that the bound on `T_n^{(k)} (x)` is achieved only at `x = ±1`
2833
-/
2934

3035
public section
@@ -318,4 +323,23 @@ theorem irrational_of_isRoot_T_real {n : ℕ} {x : ℝ} (hroot : (T ℝ n).IsRoo
318323
Nat.eq_of_dvd_of_div_eq_one (Nat.gcd_dvd_left ..) (by grind [Rat.den_pos])) (by grind)
319324
rw_mod_cast [← hk₂, hn]; convert cos_pi_div_two using 2; push_cast; field_simp
320325

326+
theorem abs_iterate_derivative_T_real_le (n : ℤ) (k : ℕ) {x : ℝ} (hx : |x| ≤ 1) :
327+
|(derivative^[k] (T ℝ n)).eval x| ≤ (derivative^[k] (T ℝ n)).eval 1 := by
328+
wlog hn : 0 ≤ n
329+
· convert this (-n) k hx (by grind) using 1 <;> rw [T_neg]
330+
lift n to ℕ using hn
331+
have := T_iterate_derivative_mem_span_T (R := ℝ) n k
332+
obtain ⟨f, hfsupp, hfderiv⟩ := Submodule.mem_span_set.mp this
333+
replace hfderiv : ∑ p ∈ f.support, f p • p = derivative^[k] (T ℝ n) := by rw [← hfderiv]; rfl
334+
have hf (y : ℝ) :
335+
∑ p ∈ f.support, f p • p.eval y = (derivative^[k] (T ℝ n)).eval y := by
336+
rw [← hfderiv, Polynomial.eval_finset_sum]
337+
simp_rw [Polynomial.eval_smul]
338+
rw [← hf x, ← hf 1]
339+
grw [Finset.abs_sum_le_sum_abs]
340+
refine Finset.sum_le_sum (fun i hi => ?_)
341+
obtain ⟨m, hm, hi⟩ := (Set.mem_image ..).mp (hfsupp hi)
342+
grw [abs_nsmul, ← hi, abs_eval_T_real_le_one m hx]
343+
simp
344+
321345
end Polynomial.Chebyshev

Mathlib/RingTheory/Polynomial/Chebyshev.lean

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public import Mathlib.Algebra.Polynomial.Derivative
1010
public import Mathlib.Algebra.Polynomial.Degree.Lemmas
1111
public import Mathlib.Algebra.Ring.NegOnePow
1212
public 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
505524
polynomial), given by $C_n(2x) = 2T_n(x)$. See `Polynomial.Chebyshev.C_comp_two_mul_X`. -/
506525
noncomputable 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+
868912
theorem 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

Comments
 (0)