|
49 | 49 | { simp only [iterated_deriv_succ, ih, derivative_add] }
|
50 | 50 | end
|
51 | 51 |
|
52 |
| -@[simp] lemma iterated_deriv_smul : iterated_deriv (r • p) n = r • iterated_deriv p n := |
| 52 | +@[simp] lemma iterated_deriv_smul {S : Type*} [monoid S] |
| 53 | + [distrib_mul_action S R] [is_scalar_tower S R R] |
| 54 | + (s : S) : iterated_deriv (s • p) n = s • iterated_deriv p n := |
53 | 55 | begin
|
54 | 56 | induction n with n ih,
|
55 | 57 | { simp only [iterated_deriv_zero_right] },
|
@@ -96,120 +98,110 @@ begin
|
96 | 98 | rw eq1, exact iterated_deriv_C _ _ h,
|
97 | 99 | end
|
98 | 100 |
|
99 |
| -end semiring |
100 |
| - |
101 |
| -section ring |
102 |
| -variables [ring R] (p q : R[X]) (n : ℕ) |
103 |
| - |
104 |
| -@[simp] lemma iterated_deriv_neg : iterated_deriv (-p) n = - iterated_deriv p n := |
105 |
| -begin |
106 |
| - induction n with n ih, |
107 |
| - { simp only [iterated_deriv_zero_right] }, |
108 |
| - { simp only [iterated_deriv_succ, ih, derivative_neg] } |
109 |
| -end |
110 |
| - |
111 |
| -@[simp] lemma iterated_deriv_sub : |
112 |
| - iterated_deriv (p - q) n = iterated_deriv p n - iterated_deriv q n := |
113 |
| -by rw [sub_eq_add_neg, iterated_deriv_add, iterated_deriv_neg, ←sub_eq_add_neg] |
114 |
| - |
115 |
| - |
116 |
| -end ring |
117 |
| - |
118 |
| -section comm_semiring |
119 |
| -variable [comm_semiring R] |
120 |
| -variables (f p q : R[X]) (n k : ℕ) |
121 |
| - |
122 | 101 | lemma coeff_iterated_deriv_as_prod_Ico :
|
123 |
| - ∀ m : ℕ, (iterated_deriv f k).coeff m = (∏ i in Ico m.succ (m + k.succ), i) * (f.coeff (m+k)) := |
| 102 | + ∀ m : ℕ, (iterated_deriv f k).coeff m = (∏ i in Ico m.succ (m + k.succ), i) • (f.coeff (m+k)) := |
124 | 103 | begin
|
125 | 104 | induction k with k ih,
|
126 |
| - { simp only [add_zero, forall_const, one_mul, Ico_self, eq_self_iff_true, |
| 105 | + { simp only [add_zero, forall_const, one_smul, Ico_self, eq_self_iff_true, |
127 | 106 | iterated_deriv_zero_right, prod_empty] },
|
128 |
| - { intro m, rw [iterated_deriv_succ, coeff_derivative, ih (m+1), mul_right_comm], |
| 107 | + { intro m, rw [iterated_deriv_succ, coeff_derivative, ih (m+1), ← nat.cast_add_one, |
| 108 | + ← nsmul_eq_mul', smul_smul, mul_comm], |
129 | 109 | apply congr_arg2,
|
130 | 110 | { have set_eq : (Ico m.succ (m + k.succ.succ)) = (Ico (m + 1).succ (m + 1 + k.succ)) ∪ {m+1},
|
131 |
| - { rw [union_comm, ←insert_eq, Ico_insert_succ_left, add_succ, add_succ, add_succ _ k, |
132 |
| - ←succ_eq_add_one, succ_add], |
133 |
| - rw succ_eq_add_one, |
134 |
| - linarith }, |
135 |
| - rw [set_eq, prod_union], |
136 |
| - apply congr_arg2, |
137 |
| - { refl }, |
138 |
| - { simp only [prod_singleton], norm_cast }, |
| 111 | + { simp_rw [← Ico_succ_singleton, union_comm, succ_eq_add_one, add_comm (k + 1), add_assoc], |
| 112 | + rw [Ico_union_Ico_eq_Ico]; simp_rw [add_le_add_iff_left, le_add_self], }, |
| 113 | + rw [set_eq, prod_union, prod_singleton], |
139 | 114 | { rw [disjoint_singleton_right, mem_Ico],
|
140 | 115 | exact λ h, (nat.lt_succ_self _).not_le h.1 } },
|
141 | 116 | { exact congr_arg _ (succ_add m k) } },
|
142 | 117 | end
|
143 | 118 |
|
144 | 119 | lemma coeff_iterated_deriv_as_prod_range :
|
145 |
| - ∀ m : ℕ, (iterated_deriv f k).coeff m = f.coeff (m + k) * (∏ i in range k, ↑(m + k - i)) := |
| 120 | + ∀ m : ℕ, (iterated_deriv f k).coeff m = (∏ i in range k, (m + k - i)) • f.coeff (m + k) := |
146 | 121 | begin
|
147 | 122 | induction k with k ih,
|
148 | 123 | { simp },
|
149 | 124 | intro m,
|
150 | 125 | calc (f.iterated_deriv k.succ).coeff m
|
151 |
| - = f.coeff (m + k.succ) * (∏ i in range k, ↑(m + k.succ - i)) * (m + 1) : |
| 126 | + = (∏ i in range k, (m + k.succ - i)) • f.coeff (m + k.succ) * (m + 1) : |
152 | 127 | by rw [iterated_deriv_succ, coeff_derivative, ih m.succ, succ_add, add_succ]
|
153 |
| - ... = f.coeff (m + k.succ) * (∏ i in range k, ↑(m + k.succ - i)) * ↑(m + 1) : |
154 |
| - by push_cast |
155 |
| - ... = f.coeff (m + k.succ) * (∏ i in range k.succ, ↑(m + k.succ - i)) : |
156 |
| - by rw [prod_range_succ, add_tsub_assoc_of_le k.le_succ, succ_sub le_rfl, tsub_self, mul_assoc] |
| 128 | + ... = ((∏ i in range k, (m + k.succ - i)) * (m + 1)) • f.coeff (m + k.succ) : |
| 129 | + by rw [← nat.cast_add_one, ← nsmul_eq_mul', smul_smul, mul_comm] |
| 130 | + ... = (∏ i in range k.succ, (m + k.succ - i)) • f.coeff (m + k.succ) : |
| 131 | + by rw [prod_range_succ, add_tsub_assoc_of_le k.le_succ, succ_sub le_rfl, tsub_self] |
157 | 132 | end
|
158 | 133 |
|
159 | 134 | lemma iterated_deriv_eq_zero_of_nat_degree_lt (h : f.nat_degree < n) : iterated_deriv f n = 0 :=
|
160 | 135 | begin
|
161 | 136 | ext m,
|
162 |
| - rw [coeff_iterated_deriv_as_prod_range, coeff_zero, coeff_eq_zero_of_nat_degree_lt, zero_mul], |
| 137 | + rw [coeff_iterated_deriv_as_prod_range, coeff_zero, coeff_eq_zero_of_nat_degree_lt, smul_zero], |
163 | 138 | linarith
|
164 | 139 | end
|
165 | 140 |
|
166 | 141 | lemma iterated_deriv_mul :
|
167 | 142 | iterated_deriv (p * q) n =
|
168 | 143 | ∑ k in range n.succ,
|
169 |
| - (C (n.choose k : R)) * iterated_deriv p (n - k) * iterated_deriv q k := |
| 144 | + n.choose k • (iterated_deriv p (n - k) * iterated_deriv q k) := |
170 | 145 | begin
|
171 | 146 | induction n with n IH,
|
172 | 147 | { simp },
|
173 | 148 |
|
174 | 149 | calc (p * q).iterated_deriv n.succ
|
175 | 150 | = (∑ (k : ℕ) in range n.succ,
|
176 |
| - C ↑(n.choose k) * p.iterated_deriv (n - k) * q.iterated_deriv k).derivative : |
| 151 | + (n.choose k) • (p.iterated_deriv (n - k) * q.iterated_deriv k)).derivative : |
177 | 152 | by rw [iterated_deriv_succ, IH]
|
178 | 153 | ... = ∑ (k : ℕ) in range n.succ,
|
179 |
| - C ↑(n.choose k) * p.iterated_deriv (n - k + 1) * q.iterated_deriv k + |
| 154 | + (n.choose k) • (p.iterated_deriv (n - k + 1) * q.iterated_deriv k) + |
180 | 155 | ∑ (k : ℕ) in range n.succ,
|
181 |
| - C ↑(n.choose k) * p.iterated_deriv (n - k) * q.iterated_deriv (k + 1) : |
182 |
| - by simp_rw [derivative_sum, derivative_mul, derivative_C, zero_mul, zero_add, |
183 |
| - iterated_deriv_succ, sum_add_distrib] |
| 156 | + (n.choose k) • (p.iterated_deriv (n - k) * q.iterated_deriv (k + 1)) : |
| 157 | + by simp_rw [derivative_sum, derivative_smul, derivative_mul, iterated_deriv_succ, smul_add, |
| 158 | + sum_add_distrib] |
184 | 159 | ... = (∑ (k : ℕ) in range n.succ,
|
185 |
| - C ↑(n.choose k.succ) * p.iterated_deriv (n - k) * q.iterated_deriv (k + 1) + |
186 |
| - C ↑1 * p.iterated_deriv n.succ * q.iterated_deriv 0) + |
| 160 | + (n.choose k.succ) • (p.iterated_deriv (n - k) * q.iterated_deriv (k + 1)) + |
| 161 | + 1 • (p.iterated_deriv n.succ * q.iterated_deriv 0)) + |
187 | 162 | ∑ (k : ℕ) in range n.succ,
|
188 |
| - C ↑(n.choose k) * p.iterated_deriv (n - k) * q.iterated_deriv (k + 1) : _ |
| 163 | + (n.choose k) • (p.iterated_deriv (n - k) * q.iterated_deriv (k + 1)) : _ |
189 | 164 | ... = ∑ (k : ℕ) in range n.succ,
|
190 |
| - C ↑(n.choose k) * p.iterated_deriv (n - k) * q.iterated_deriv (k + 1) + |
| 165 | + (n.choose k) • (p.iterated_deriv (n - k) * q.iterated_deriv (k + 1)) + |
191 | 166 | ∑ (k : ℕ) in range n.succ,
|
192 |
| - C ↑(n.choose k.succ) * p.iterated_deriv (n - k) * q.iterated_deriv (k + 1) + |
193 |
| - C ↑1 * p.iterated_deriv n.succ * q.iterated_deriv 0 : |
194 |
| - by ring |
| 167 | + (n.choose k.succ) • (p.iterated_deriv (n - k) * q.iterated_deriv (k + 1)) + |
| 168 | + 1 • (p.iterated_deriv n.succ * q.iterated_deriv 0) : |
| 169 | + by rw [add_comm, add_assoc] |
195 | 170 | ... = ∑ (i : ℕ) in range n.succ,
|
196 |
| - C ↑((n+1).choose (i+1)) * p.iterated_deriv (n + 1 - (i+1)) * q.iterated_deriv (i+1) + |
197 |
| - C ↑1 * p.iterated_deriv n.succ * q.iterated_deriv 0 : |
198 |
| - by simp_rw [choose_succ_succ, succ_sub_succ, cast_add, C.map_add, add_mul, sum_add_distrib] |
| 171 | + ((n+1).choose (i+1)) • (p.iterated_deriv (n + 1 - (i+1)) * q.iterated_deriv (i+1)) + |
| 172 | + 1 • (p.iterated_deriv n.succ * q.iterated_deriv 0) : |
| 173 | + by simp_rw [choose_succ_succ, succ_sub_succ, add_smul, sum_add_distrib] |
199 | 174 | ... = ∑ (k : ℕ) in range n.succ.succ,
|
200 |
| - C ↑(n.succ.choose k) * p.iterated_deriv (n.succ - k) * q.iterated_deriv k : |
| 175 | + (n.succ.choose k) • (p.iterated_deriv (n.succ - k) * q.iterated_deriv k) : |
201 | 176 | by rw [sum_range_succ' _ n.succ, choose_zero_right, tsub_zero],
|
202 | 177 |
|
203 | 178 | congr,
|
204 | 179 | refine (sum_range_succ' _ _).trans (congr_arg2 (+) _ _),
|
205 |
| - { rw [sum_range_succ, nat.choose_succ_self, cast_zero, C.map_zero, zero_mul, zero_mul, add_zero], |
| 180 | + { rw [sum_range_succ, nat.choose_succ_self, zero_smul, add_zero], |
206 | 181 | refine sum_congr rfl (λ k hk, _),
|
207 | 182 | rw mem_range at hk,
|
208 | 183 | congr,
|
209 | 184 | rw [tsub_add_eq_add_tsub (nat.succ_le_of_lt hk), nat.succ_sub_succ] },
|
210 | 185 | { rw [choose_zero_right, tsub_zero] },
|
211 | 186 | end
|
212 | 187 |
|
213 |
| -end comm_semiring |
| 188 | +end semiring |
| 189 | + |
| 190 | +section ring |
| 191 | +variables [ring R] (p q : R[X]) (n : ℕ) |
| 192 | + |
| 193 | +@[simp] lemma iterated_deriv_neg : iterated_deriv (-p) n = - iterated_deriv p n := |
| 194 | +begin |
| 195 | + induction n with n ih, |
| 196 | + { simp only [iterated_deriv_zero_right] }, |
| 197 | + { simp only [iterated_deriv_succ, ih, derivative_neg] } |
| 198 | +end |
| 199 | + |
| 200 | +@[simp] lemma iterated_deriv_sub : |
| 201 | + iterated_deriv (p - q) n = iterated_deriv p n - iterated_deriv q n := |
| 202 | +by rw [sub_eq_add_neg, iterated_deriv_add, iterated_deriv_neg, ←sub_eq_add_neg] |
| 203 | + |
| 204 | + |
| 205 | +end ring |
214 | 206 |
|
215 | 207 | end polynomial
|
0 commit comments