@@ -5,20 +5,23 @@ Authors: Yuval Filmus
55-/
66import Mathlib.RingTheory.Polynomial.Chebyshev.Basic
77import Mathlib.Data.Real.Basic
8+ import Mathlib.Algebra.Polynomial.Roots
89import Mathlib.Analysis.SpecialFunctions.Trigonometric.Basic
910import Mathlib.Analysis.SpecialFunctions.Trigonometric.Inverse
10- import Mathlib.Analysis.SpecialFunctions.Log.Basic
1111import Mathlib.Analysis.SpecialFunctions.Trigonometric.Deriv
1212import Mathlib.Analysis.SpecialFunctions.Trigonometric.Complex
13- import Mathlib.Algebra.Polynomial.Roots
13+ import Mathlib.Analysis.SpecialFunctions.Trigonometric.Chebyshev
14+ import Mathlib.Analysis.SpecialFunctions.Log.Basic
15+
16+ -- FIX ME:
17+ -- some of the results are available here:
18+ -- Mathlib.Analysis.SpecialFunctions.Trigonometric.Chebyshev
1419
1520/-!
1621# Chebyshev polynomials over the reals
1722
1823## Main statements
1924
20- * Trigonometric identities satisfied by Chebyshev polynomials:
21- `Polynomial.Chebyshev.T_cos`, `Polynomial.Chebyshev.U_cos`
2225* T_n(x) ∈ [-1, 1] iff x ∈ [-1, 1]
2326* Zeroes of T and U
2427* Extrema of T
@@ -66,35 +69,10 @@ theorem T_natDegree_real (n : ℤ) : (T ℝ n).natDegree = n.natAbs := by
6669theorem T_leadingCoeff_real (n : ℤ) : (T ℝ n).leadingCoeff = 2 ^(n.natAbs - 1 ) := by
6770 exact T_leadingCoeff ℝ (by simp) n
6871
69- @[simp]
70- theorem T_cos (n : ℤ) (θ : ℝ) : (T ℝ n).eval (cos θ) = cos (n * θ) := by
71- induction n using Chebyshev.induct' with
72- | zero => simp
73- | one => simp
74- | add_two n ih1 ih2 =>
75- rw [T_add_two, eval_sub, eval_mul, eval_mul, eval_ofNat, eval_X, ih1, ih2]
76- apply sub_eq_iff_eq_add.mpr
77- rw [Real.cos_add_cos, mul_assoc, mul_comm θ.cos, ←mul_assoc]
78- push_cast; congr 3 <;> ring
79- | neg n ih => simp [T_neg, ih]
80-
81- @[simp]
82- theorem T_cosh (n : ℤ) (θ : ℝ) : (T ℝ n).eval (cosh θ) = cosh (n * θ) := by
83- induction n using Chebyshev.induct' with
84- | zero => simp
85- | one => simp
86- | add_two n ih1 ih2 =>
87- rw [T_add_two, eval_sub, eval_mul, eval_mul, eval_ofNat, eval_X, ih1, ih2]
88- apply sub_eq_iff_eq_add.mpr
89- trans cosh ((n + 1 ) * θ + θ) + cosh ((n + 1 ) * θ - θ)
90- · rw [cosh_add, cosh_sub]; push_cast; ring
91- · congr <;> (push_cast; ring)
92- | neg n ih => simp [T_neg, ih]
93-
9472theorem T_bounded_of_bounded (n : ℤ) {x : ℝ} (hx : x ∈ Set.Icc (-1 ) 1 ) :
9573 (T ℝ n).eval x ∈ Set.Icc (-1 ) 1 := by
9674 rw [Set.mem_Icc] at hx
97- rw [←cos_arccos hx.1 hx.2 , T_cos ]
75+ rw [←cos_arccos hx.1 hx.2 , T_real_cos ]
9876 apply cos_mem_Icc
9977
10078theorem T_bounded_of_bounded' (n : ℤ) {x : ℝ} (hx : |x| ≤ 1 ) :
@@ -119,12 +97,12 @@ theorem cosh_arccosh {x : ℝ} (hx : 1 ≤ x) : cosh (arccosh x) = x := by
11997
12098theorem T_ge_of_ge_one (n : ℤ) {x : ℝ} (hx : x ≥ 1 ) :
12199 (T ℝ n).eval x ≥ 1 := by
122- rw [←cosh_arccosh hx, T_cosh ]
100+ rw [←cosh_arccosh hx, T_real_cosh ]
123101 apply one_le_cosh
124102
125103theorem T_gt_of_gt_one {n : ℤ} (hn : n ≠ 0 ) {x : ℝ} (hx : x > 1 ) :
126104 (T ℝ n).eval x > 1 := by
127- rw [←cosh_arccosh (le_of_lt hx), T_cosh ]
105+ rw [←cosh_arccosh (le_of_lt hx), T_real_cosh ]
128106 apply one_lt_cosh.mpr
129107 apply mul_ne_zero_iff.mpr
130108 constructor
@@ -218,9 +196,9 @@ theorem T_eq_cos_of_bounded {n : ℤ} (hn : n ≠ 0) {y : ℝ} (hy : |y| ≤ 1)
218196 use arccos x
219197 constructor
220198 · exact cos_arccos (neg_le_of_abs_le hx) (le_of_abs_le hx)
221- · rw [←h, ←T_cos n (arccos x), cos_arccos (neg_le_of_abs_le hx) (le_of_abs_le hx)]
199+ · rw [←h, ←T_real_cos (arccos x), cos_arccos (neg_le_of_abs_le hx) (le_of_abs_le hx)]
222200 · rintro ⟨θ, hx, hy⟩
223- rw [← hx, T_cos n , hy]
201+ rw [← hx, T_real_cos , hy]
224202
225203theorem T_eq_zero_iff {n : ℤ} (hn : n ≠ 0 ) (x : ℝ) :
226204 (T ℝ n).eval x = 0 ↔ ∃ (k : ℤ), x = cos ((2 * k + 1 ) * π / (2 * n)) := by
@@ -334,7 +312,7 @@ theorem T_eq_neg_one_iff {n : ℤ} (hn : n ≠ 0) (x : ℝ) :
334312@[simp]
335313theorem T_node_eval {n : ℤ} (hn : n ≠ 0 ) (k : ℤ) :
336314 (T ℝ n).eval (cos (k * π / n)) = (-1 )^k := by
337- rw [T_cos ]
315+ rw [T_real_cos ]
338316 trans cos (k * π)
339317 · congr 1 ; field_simp
340318 calc cos (k * π) = cos (0 + k * π) := by rw [zero_add]
@@ -355,7 +333,7 @@ theorem T_abs_eq_one_iff {n : ℤ} (hn : n ≠ 0) (x : ℝ) :
355333 use 2 * k + 1
356334 rw [hx]; congr; push_cast; rfl
357335 · rintro ⟨k, hx⟩
358- rw [hx, T_cos ]
336+ rw [hx, T_real_cos ]
359337 trans |cos (k * π)|
360338 · congr 2 ; field_simp
361339 exact abs_cos_int_mul_pi _
@@ -480,63 +458,11 @@ theorem U_natDegree_real (n : ℤ) :
480458theorem U_leadingCoeff_nat_real (n : ℕ) : (U ℝ n).leadingCoeff = 2 ^n := by
481459 exact U_leadingCoeff_nat ℝ (by simp) n
482460
483- @[simp]
484- theorem U_cos (n : ℤ) (θ : ℝ) : (U ℝ n).eval (cos θ) * sin θ = sin ((n+1 ) * θ) := by
485- induction n using Chebyshev.induct with
486- | zero => simp
487- | one => norm_num; rw [sin_two_mul]; ring
488- | add_two n ih1 ih2 =>
489- norm_num
490- rw [sub_mul]
491- trans 2 * θ.cos * ((U ℝ (n+1 )).eval θ.cos * θ.sin) - (U ℝ n).eval θ.cos * θ.sin
492- · ring
493- rw [ih1, ih2]
494- apply sub_eq_iff_eq_add.mpr
495- rw [Real.sin_add_sin, mul_assoc, mul_comm θ.cos, ←mul_assoc]
496- push_cast; congr 3 <;> ring
497- | neg_add_one n ih1 ih2 =>
498- rw [U_sub_one]
499- norm_num
500- rw [sub_mul]
501- trans 2 * θ.cos * ((U ℝ (-n)).eval θ.cos * θ.sin) - (U ℝ (-n+1 )).eval θ.cos * θ.sin
502- · ring
503- rw [ih1, ih2]
504- apply sub_eq_iff_eq_add.mpr
505- rw [←sin_neg, ←cos_neg, sin_add_sin, mul_assoc, mul_comm (-θ).cos, ←mul_assoc]
506- push_cast; congr 3 <;> ring
507-
508- theorem U_cosh (n : ℤ) (θ : ℝ) : (U ℝ n).eval (cosh θ) * sinh θ = sinh ((n+1 ) * θ) := by
509- induction n using Chebyshev.induct with
510- | zero => simp
511- | one => norm_num; rw [sinh_two_mul]; ring
512- | add_two n ih1 ih2 =>
513- norm_num
514- rw [sub_mul]
515- trans 2 * θ.cosh * ((U ℝ (n+1 )).eval θ.cosh * θ.sinh) - (U ℝ n).eval θ.cosh * θ.sinh
516- · ring
517- rw [ih1, ih2]
518- apply sub_eq_iff_eq_add.mpr
519- trans sinh ((n + 2 ) * θ + θ) + sinh ((n + 2 ) * θ - θ)
520- · rw [sinh_add, sinh_sub]; push_cast; ring_nf
521- · congr <;> (push_cast; ring)
522- | neg_add_one n ih1 ih2 =>
523- rw [U_sub_one]
524- norm_num
525- rw [sub_mul]
526- trans 2 * θ.cosh * ((U ℝ (-n)).eval θ.cosh * θ.sinh) - (U ℝ (-n+1 )).eval θ.cosh * θ.sinh
527- · ring
528- rw [ih1, ih2]
529- apply sub_eq_iff_eq_add.mpr
530- rw [←sinh_neg]
531- trans sinh ((-n + 1 ) * θ - θ) + sinh ((-n + 1 ) * θ + θ)
532- · rw [sinh_add, sinh_sub]; push_cast; ring
533- · congr <;> (push_cast; ring)
534-
535461theorem U_eq_zero_if (n : ℕ) {k : ℕ} (hk1 : 1 ≤ k) (hkn : k ≤ n) :
536462 (U ℝ n).eval (cos (k * π / (n + 1 ))) = 0 := by
537463 have hn1 : (n + 1 : ℝ) ≠ 0 := by norm_cast
538464 have hpi := Real.pi_ne_zero
539- have := U_cos n (k * π / (n + 1 ))
465+ have := U_real_cos (k * π / (n + 1 )) n
540466 push_cast at this
541467 rw [mul_div_cancel₀ _ hn1, (@sin_eq_zero_iff (k*π)).mpr ⟨k, rfl⟩] at this
542468 refine (mul_eq_zero_iff_right ?_).mp this
0 commit comments