Skip to content

Commit c488d66

Browse files
committed
Updated name of chebyshevNode and removed hypothesis from node_lt
1 parent b14808f commit c488d66

1 file changed

Lines changed: 51 additions & 52 deletions

File tree

  • Mathlib/Analysis/SpecialFunctions/Trigonometric/Chebyshev

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

Lines changed: 51 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,26 @@ namespace Polynomial.Chebyshev
3030

3131
open 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
3434
polynomial 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

9897
theorem 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

124123
theorem 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

179178
theorem 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

186185
theorem 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

193192
end Polynomial.Chebyshev

0 commit comments

Comments
 (0)