@@ -30,26 +30,26 @@ namespace Polynomial.Chebyshev
3030
3131open Polynomial Real
3232
33- /-- For `n ≠ 0` and `i ≤ n`, chebyshevNode n i is one of the extremal points of the Chebyhsev T
33+ /-- For `n ≠ 0` and `i ≤ n`, node n i is one of the extremal points of the Chebyhsev T
3434polynomial over the interval `[-1, 1]`. -/
35- noncomputable abbrev chebyshevNode (n i : ℕ) : ℝ := cos (i * π / n)
35+ noncomputable def node (n i : ℕ) : ℝ := cos (i * π / n)
3636
37- lemma chebyshevNode_eq_one {n : ℕ} : chebyshevNode n 0 = 1 := by simp [chebyshevNode ]
37+ lemma node_eq_one {n : ℕ} : node n 0 = 1 := by simp [node ]
3838
39- lemma chebyshevNode_eq_neg_one {n : ℕ} (hn : n ≠ 0 ) : chebyshevNode n n = -1 := by
39+ lemma node_eq_neg_one {n : ℕ} (hn : n ≠ 0 ) : node n n = -1 := by
4040 have : n * π / n = π := by aesop
41- simp [chebyshevNode , this]
41+ simp [node , this]
4242
43- lemma chebyshevNode_mem_Icc {n i : ℕ} : chebyshevNode n i ∈ Set.Icc (-1 ) 1 :=
43+ lemma node_mem_Icc {n i : ℕ} : node n i ∈ Set.Icc (-1 ) 1 :=
4444 Set.mem_Icc.mpr ⟨neg_one_le_cos _, cos_le_one _⟩
4545
46- lemma eval_T_real_chebyshevNode {n i : ℕ} (hn : n ≠ 0 ) :
47- (T ℝ n).eval (chebyshevNode n i) = (-1 ) ^ i := by
46+ lemma eval_T_real_node {n i : ℕ} (hn : n ≠ 0 ) :
47+ (T ℝ n).eval (node n i) = (-1 ) ^ i := by
4848 have : (n : ℤ) * (i * π / n) = i * π := by norm_cast; field
49- rw [T_real_cos, this, cos_nat_mul_pi]
49+ rw [node, T_real_cos, this, cos_nat_mul_pi]
5050
51- lemma strictAntiOn_chebyshevNode (n : ℕ) :
52- StrictAntiOn (chebyshevNode n ·) (Finset.range (n + 1 )) := by
51+ lemma strictAntiOn_node (n : ℕ) :
52+ StrictAntiOn (node n ·) (Finset.range (n + 1 )) := by
5353 wlog! hn : n ≠ 0
5454 · simp [hn]
5555 refine strictAntiOn_cos.comp_strictMonoOn ?_ (fun x hx => Set.mem_Icc.mpr ⟨by positivity, ?_⟩)
@@ -61,25 +61,24 @@ lemma strictAntiOn_chebyshevNode (n : ℕ) :
6161 nth_rewrite 2 [← mul_div_cancel₀ π (Nat.cast_ne_zero.mpr hn)]
6262 exact mul_le_mul_of_nonneg_right (Nat.cast_le.mpr hx) (by positivity)
6363
64- lemma chebyshevNode_lt {n i j : ℕ} (hi : i ≤ n) (hj : j ≤ n) (hij : i < j) :
65- chebyshevNode n j < chebyshevNode n i :=
66- (strictAntiOn_chebyshevNode n) (Finset.mem_coe.mpr (Finset.mem_range_succ_iff.mpr hi ))
64+ lemma node_lt {n i j : ℕ} (hj : j ≤ n) (hij : i < j) :
65+ node n j < node n i :=
66+ (strictAntiOn_node n) (Finset.mem_coe.mpr (Finset.mem_range_succ_iff.mpr ( by grind) ))
6767 (Finset.mem_coe.mpr (Finset.mem_range_succ_iff.mpr hj)) hij
6868
69- lemma zero_lt_prod_chebyshevNode_sub_chebyshevNode {n i : ℕ} (hi : i ≤ n) :
70- 0 < (-1 ) ^ i * ∏ j ∈ (Finset.range (n + 1 )).erase i, (chebyshevNode n i - chebyshevNode n j) :=
69+ lemma zero_lt_prod_node_sub_node {n i : ℕ} (hi : i ≤ n) :
70+ 0 < (-1 ) ^ i * ∏ j ∈ (Finset.range (n + 1 )).erase i, (node n i - node n j) :=
7171 by
7272 wlog! hn : n ≠ 0
7373 · replace hi : i = 0 := Nat.le_zero.mp (le_of_le_of_eq hi hn)
7474 simp [hn, hi]
75- have h₁ : 0 < ∏ j ∈ Finset.range i, ((-1 ) * (chebyshevNode n i - chebyshevNode n j)) :=
75+ have h₁ : 0 < ∏ j ∈ Finset.range i, ((-1 ) * (node n i - node n j)) :=
7676 Finset.prod_pos (fun j hj => mul_pos_of_neg_of_neg neg_one_lt_zero <| sub_neg.mpr <|
77- chebyshevNode_lt (le_trans (le_of_lt <| Finset.mem_range.mp hj) hi) hi
78- (Finset.mem_range.mp hj))
77+ node_lt hi (Finset.mem_range.mp hj))
7978 rw [Finset.prod_mul_distrib, Finset.prod_const, Finset.card_range] at h₁
80- have h₂ : 0 < ∏ j ∈ Finset.Ioc i n, (chebyshevNode n i - chebyshevNode n j) :=
79+ have h₂ : 0 < ∏ j ∈ Finset.Ioc i n, (node n i - node n j) :=
8180 Finset.prod_pos (fun j hj => sub_pos.mpr <|
82- chebyshevNode_lt hi (Finset.mem_Ioc.mp hj).2 (Finset.mem_Ioc.mp hj).1 )
81+ node_lt (Finset.mem_Ioc.mp hj).2 (Finset.mem_Ioc.mp hj).1 )
8382 have union : (Finset.range (n + 1 )).erase i = (Finset.range i) ∪ Finset.Ioc i n := by grind
8483 have disjoint : Disjoint (Finset.range i) (Finset.Ioc i n) := by grind [Finset.disjoint_iff_ne]
8584 rw [union, Finset.prod_union disjoint, ← mul_assoc]
@@ -96,98 +95,98 @@ private lemma negOnePow_mul_le {α : ℝ} {i : ℕ} (hα : α ∈ Set.Icc (-1) 1
9695 exact abs_le.mpr hα
9796
9897theorem apply_le_apply_T_real {n : ℕ} {param : ℝ[X] → ℝ} {c : ℕ → ℝ}
99- (hparam : (P : ℝ[X]) → P.degree = n → param P = ∑ i ≤ n, P.eval (chebyshevNode n i) * (c i))
98+ (hparam : (P : ℝ[X]) → P.degree = n → param P = ∑ i ≤ n, P.eval (node n i) * (c i))
10099 (hcnonneg : ∀ i ≤ n, 0 ≤ (-1 ) ^ i * (c i))
101100 {P : ℝ[X]} (hPdeg : P.degree = n) (hPbnd : ∀ x ∈ Set.Icc (-1 ) 1 , P.eval x ∈ Set.Icc (-1 ) 1 ) :
102101 param P ≤ param (T ℝ n) := by
103102 wlog! hn : n ≠ 0
104103 · rw [hparam P hPdeg, hparam (T ℝ n) (degree_T ℝ n), hn, show Finset.Iic 0 = {0 } by rfl,
105- Nat.cast_zero, T_zero, Finset.sum_singleton, Finset.sum_singleton, chebyshevNode_eq_one ,
104+ Nat.cast_zero, T_zero, Finset.sum_singleton, Finset.sum_singleton, node_eq_one ,
106105 eval_one]
107106 exact mul_le_mul_of_nonneg_right (hPbnd 1 (by simp) |> Set.mem_Icc.mp).2
108107 (le_of_le_of_eq (hcnonneg 0 n.zero_le) (one_mul _))
109108 calc
110- param P = ∑ i ≤ n, P.eval (chebyshevNode n i) * (c i) := hparam P hPdeg
111- _ ≤ ∑ i ≤ n, (T ℝ n).eval (chebyshevNode n i) * (c i) := by
109+ param P = ∑ i ≤ n, P.eval (node n i) * (c i) := hparam P hPdeg
110+ _ ≤ ∑ i ≤ n, (T ℝ n).eval (node n i) * (c i) := by
112111 refine Finset.sum_le_sum (fun i hi => ?_)
113112 calc
114- P.eval (chebyshevNode n i) * (c i) =
115- ((-1 ) ^ i * P.eval (chebyshevNode n i)) * ((-1 ) ^ i * (c i)) :=
113+ P.eval (node n i) * (c i) =
114+ ((-1 ) ^ i * P.eval (node n i)) * ((-1 ) ^ i * (c i)) :=
116115 negOnePow_mul_negOnePow_mul_cancel.symm
117116 _ ≤ 1 * ((-1 ) ^ i * (c i)) :=
118- mul_le_mul_of_nonneg_right (negOnePow_mul_le (hPbnd _ chebyshevNode_mem_Icc ))
117+ mul_le_mul_of_nonneg_right (negOnePow_mul_le (hPbnd _ node_mem_Icc ))
119118 (hcnonneg i (Finset.mem_Iic.mp hi))
120- _ = (T ℝ n).eval (chebyshevNode n i) * (c i) := by
121- rw [eval_T_real_chebyshevNode hn, one_mul]
119+ _ = (T ℝ n).eval (node n i) * (c i) := by
120+ rw [eval_T_real_node hn, one_mul]
122121 _ = param (T ℝ n) := (hparam (T ℝ n) (degree_T ℝ n)).symm
123122
124123theorem apply_eq_apply_T_real_iff {n : ℕ} {param : ℝ[X] → ℝ} {c : ℕ → ℝ}
125- (hparam : (P : ℝ[X]) → P.degree = n → param P = ∑ i ≤ n, P.eval (chebyshevNode n i) * (c i))
124+ (hparam : (P : ℝ[X]) → P.degree = n → param P = ∑ i ≤ n, P.eval (node n i) * (c i))
126125 (hcpos : ∀ i ≤ n, 0 < (-1 ) ^ i * (c i))
127126 {P : ℝ[X]} (hPdeg : P.degree = n) (hPbnd : ∀ x ∈ Set.Icc (-1 ) 1 , P.eval x ∈ Set.Icc (-1 ) 1 ) :
128127 (param P = param (T ℝ n)) ↔ P = T ℝ n := by
129128 refine ⟨fun h => ?_, by intro h; rw [h]⟩
130129 wlog! hn : n ≠ 0
131130 · rw [hparam P hPdeg, hparam (T ℝ n) (degree_T ℝ n), hn, show Finset.Iic 0 = {0 } by rfl,
132- Nat.cast_zero, T_zero, Finset.sum_singleton, Finset.sum_singleton, chebyshevNode_eq_one ,
131+ Nat.cast_zero, T_zero, Finset.sum_singleton, Finset.sum_singleton, node_eq_one ,
133132 eval_one, one_mul] at h
134133 rw [hn, Nat.cast_zero] at hPdeg
135134 rw [hn, Nat.cast_zero, T_zero]
136135 have eval_P_one : P.eval 1 = 1 :=
137136 (mul_eq_right₀ (ne_of_lt <| lt_of_lt_of_eq (hcpos 0 n.zero_le) (one_mul _)).symm).mp h
138137 rw [eq_C_of_degree_eq_zero hPdeg, eval_C] at eval_P_one
139138 rw [eq_C_of_degree_eq_zero hPdeg, eval_P_one, C_1]
140- apply eq_of_degrees_lt_of_eval_finset_eq ((Finset.range (n + 1 )).image (chebyshevNode n ·))
141- · rw [hPdeg, Nat.cast_lt, Finset.card_image_of_injOn (strictAntiOn_chebyshevNode n).injOn,
139+ apply eq_of_degrees_lt_of_eval_finset_eq ((Finset.range (n + 1 )).image (node n ·))
140+ · rw [hPdeg, Nat.cast_lt, Finset.card_image_of_injOn (strictAntiOn_node n).injOn,
142141 Finset.card_range, Nat.lt_succ_iff]
143142 · rw [degree_T, Int.natAbs_natCast, Nat.cast_lt,
144- Finset.card_image_of_injOn (strictAntiOn_chebyshevNode n).injOn,
143+ Finset.card_image_of_injOn (strictAntiOn_node n).injOn,
145144 Finset.card_range, Nat.lt_succ_iff]
146145 rw [hparam P hPdeg, hparam (T ℝ n) (degree_T ℝ n)] at h
147146 replace h := ge_of_eq h
148147 contrapose! h
149148 obtain ⟨x, hx, hPx⟩ := h
150149 obtain ⟨i, hi, hix⟩ := Finset.mem_image.mp hx
151150 replace hi := Finset.mem_Iic.mpr (Finset.mem_range_succ_iff.mp hi)
152- suffices ∑ i ≤ n, ((-1 ) ^ i * P.eval (chebyshevNode n i)) * ((-1 ) ^ i * c i) <
153- ∑ i≤ n, ((-1 ) ^ i * (T ℝ n).eval (chebyshevNode n i)) * ((-1 ) ^ i * c i) by
151+ suffices ∑ i ≤ n, ((-1 ) ^ i * P.eval (node n i)) * ((-1 ) ^ i * c i) <
152+ ∑ i≤ n, ((-1 ) ^ i * (T ℝ n).eval (node n i)) * ((-1 ) ^ i * c i) by
154153 simp_rw [negOnePow_mul_negOnePow_mul_cancel] at this
155154 exact this
156155 have h_le {i : ℕ} (hi : i ∈ Finset.Iic n) :
157- (-1 ) ^ i * P.eval (chebyshevNode n i) * ((-1 ) ^ i * c i) ≤
158- (-1 ) ^ i * (T ℝ n).eval (chebyshevNode n i) * ((-1 ) ^ i * c i) := by
156+ (-1 ) ^ i * P.eval (node n i) * ((-1 ) ^ i * c i) ≤
157+ (-1 ) ^ i * (T ℝ n).eval (node n i) * ((-1 ) ^ i * c i) := by
159158 refine mul_le_mul_of_nonneg_right ?_ (le_of_lt (hcpos i (Finset.mem_Iic.mp hi)))
160- rw [eval_T_real_chebyshevNode hn, ← neg_pow', neg_neg, one_pow]
161- exact negOnePow_mul_le (hPbnd _ chebyshevNode_mem_Icc )
159+ rw [eval_T_real_node hn, ← neg_pow', neg_neg, one_pow]
160+ exact negOnePow_mul_le (hPbnd _ node_mem_Icc )
162161 refine Finset.sum_lt_sum (fun i hi => h_le hi) ⟨i, hi, lt_of_le_of_ne (h_le hi) ?_⟩
163162 have := ne_of_lt (hcpos i (Finset.mem_Iic.mp hi))
164163 grind => ring
165164
166- theorem leadingCoeff_eq_sum_chebyshevNode (n : ℕ) (P : ℝ[X]) (hP : P.degree = n) :
167- P.leadingCoeff = ∑ i ≤ n, (P.eval (chebyshevNode n i)) *
168- (∏ j ∈ (Finset.range (n + 1 )).erase i, (chebyshevNode n i - chebyshevNode n j))⁻¹ := by
169- rw [Lagrange.leadingCoeff_eq_sum (strictAntiOn_chebyshevNode n).injOn (by simp [hP]),
165+ theorem leadingCoeff_eq_sum_node (n : ℕ) (P : ℝ[X]) (hP : P.degree = n) :
166+ P.leadingCoeff = ∑ i ≤ n, (P.eval (node n i)) *
167+ (∏ j ∈ (Finset.range (n + 1 )).erase i, (node n i - node n j))⁻¹ := by
168+ rw [Lagrange.leadingCoeff_eq_sum (strictAntiOn_node n).injOn (by simp [hP]),
170169 show Finset.range (n + 1 ) = Finset.Iic n by grind]
171170 rfl
172171
173- theorem leadingCoeff_eq_sum_chebyshevNode_coeff_pos {n i : ℕ} (hi : i ≤ n) :
172+ theorem leadingCoeff_eq_sum_node_coeff_pos {n i : ℕ} (hi : i ≤ n) :
174173 0 < (-1 ) ^ i *
175- (∏ j ∈ (Finset.range (n + 1 )).erase i, (chebyshevNode n i - chebyshevNode n j))⁻¹ := by
176- have := inv_pos_of_pos <| zero_lt_prod_chebyshevNode_sub_chebyshevNode hi
174+ (∏ j ∈ (Finset.range (n + 1 )).erase i, (node n i - node n j))⁻¹ := by
175+ have := inv_pos_of_pos <| zero_lt_prod_node_sub_node hi
177176 rwa [mul_inv, ← inv_pow, inv_neg_one] at this
178177
179178theorem leadingCoeff_le_of_bounded {n : ℕ} {P : ℝ[X]}
180179 (hPdeg : P.degree = n) (hPbnd : ∀ x ∈ Set.Icc (-1 ) 1 , P.eval x ∈ Set.Icc (-1 ) 1 ) :
181180 P.leadingCoeff ≤ 2 ^ (n - 1 ) := by
182- convert apply_le_apply_T_real (leadingCoeff_eq_sum_chebyshevNode n)
183- (fun i hi => le_of_lt <| leadingCoeff_eq_sum_chebyshevNode_coeff_pos hi) hPdeg hPbnd
181+ convert apply_le_apply_T_real (leadingCoeff_eq_sum_node n)
182+ (fun i hi => le_of_lt <| leadingCoeff_eq_sum_node_coeff_pos hi) hPdeg hPbnd
184183 simp
185184
186185theorem leadingCoeff_eq_iff_of_bounded {n : ℕ} {P : ℝ[X]}
187186 (hPdeg : P.degree = n) (hPbnd : ∀ x ∈ Set.Icc (-1 ) 1 , P.eval x ∈ Set.Icc (-1 ) 1 ) :
188187 P.leadingCoeff = 2 ^ (n - 1 ) ↔ P = T ℝ n := by
189- convert apply_eq_apply_T_real_iff (leadingCoeff_eq_sum_chebyshevNode n)
190- (fun i hi => leadingCoeff_eq_sum_chebyshevNode_coeff_pos hi) hPdeg hPbnd
188+ convert apply_eq_apply_T_real_iff (leadingCoeff_eq_sum_node n)
189+ (fun i hi => leadingCoeff_eq_sum_node_coeff_pos hi) hPdeg hPbnd
191190 simp
192191
193192end Polynomial.Chebyshev
0 commit comments