@@ -177,6 +177,15 @@ begin
177
177
exact ih _ this (this.trans_le $ nat.le_of_lt_succ hx) rfl
178
178
end
179
179
180
+ @[simp] lemma iterate_derivative_C {k} (h : 0 < k) : (derivative^[k] (C a : R[X])) = 0 :=
181
+ iterate_derivative_eq_zero $ (nat_degree_C _).trans_lt h
182
+
183
+ @[simp] lemma iterate_derivative_one {k} (h : 0 < k) : (derivative^[k] (1 : R[X])) = 0 :=
184
+ iterate_derivative_C h
185
+
186
+ @[simp] lemma iterate_derivative_X {k} (h : 1 < k) : (derivative^[k] (X : R[X])) = 0 :=
187
+ iterate_derivative_eq_zero $ nat_degree_X_le.trans_lt h
188
+
180
189
theorem nat_degree_eq_zero_of_derivative_eq_zero [no_zero_divisors R] [char_zero R] {f : R[X]}
181
190
(h : f.derivative = 0 ) : f.nat_degree = 0 :=
182
191
begin
@@ -280,6 +289,87 @@ begin
280
289
exact hp }
281
290
end
282
291
292
+ lemma coeff_iterate_derivative_as_prod_Ico {k} (p : R[X]) :
293
+ ∀ m : ℕ, (derivative^[k] p).coeff m = (∏ i in Ico m.succ (m + k.succ), i) • (p.coeff (m + k)) :=
294
+ begin
295
+ induction k with k ih,
296
+ { simp only [add_zero, forall_const, one_smul, Ico_self, eq_self_iff_true,
297
+ function.iterate_zero_apply, prod_empty] },
298
+ { intro m, rw [function.iterate_succ_apply', coeff_derivative, ih (m+1 ), ← nat.cast_add_one,
299
+ ← nsmul_eq_mul', smul_smul, mul_comm],
300
+ apply congr_arg2,
301
+ { have set_eq : (Ico m.succ (m + k.succ.succ)) = (Ico (m + 1 ).succ (m + 1 + k.succ)) ∪ {m+1 },
302
+ { simp_rw [← nat.Ico_succ_singleton, union_comm, nat.succ_eq_add_one, add_comm (k + 1 ),
303
+ add_assoc],
304
+ rw [Ico_union_Ico_eq_Ico]; simp_rw [add_le_add_iff_left, le_add_self], },
305
+ rw [set_eq, prod_union, prod_singleton],
306
+ { rw [disjoint_singleton_right, mem_Ico],
307
+ exact λ h, (nat.lt_succ_self _).not_le h.1 } },
308
+ { exact congr_arg _ (nat.succ_add m k) } },
309
+ end
310
+
311
+ lemma coeff_iterate_derivative_as_prod_range {k} (p : R[X]) :
312
+ ∀ m : ℕ, (derivative^[k] p).coeff m = (∏ i in range k, (m + k - i)) • p.coeff (m + k) :=
313
+ begin
314
+ induction k with k ih,
315
+ { simp },
316
+ intro m,
317
+ calc (derivative^[k + 1 ] p).coeff m
318
+ = (∏ i in range k, (m + k.succ - i)) • p.coeff (m + k.succ) * (m + 1 ) :
319
+ by rw [function.iterate_succ_apply', coeff_derivative, ih m.succ, nat.succ_add, nat.add_succ]
320
+ ... = ((∏ i in range k, (m + k.succ - i)) * (m + 1 )) • p.coeff (m + k.succ) :
321
+ by rw [← nat.cast_add_one, ← nsmul_eq_mul', smul_smul, mul_comm]
322
+ ... = (∏ i in range k.succ, (m + k.succ - i)) • p.coeff (m + k.succ) :
323
+ by rw [prod_range_succ, add_tsub_assoc_of_le k.le_succ, nat.succ_sub le_rfl, tsub_self]
324
+ end
325
+
326
+ lemma iterate_derivative_mul {n} (p q : R[X]) :
327
+ derivative^[n] (p * q) =
328
+ ∑ k in range n.succ,
329
+ n.choose k • ((derivative^[n - k] p) * (derivative^[k] q)) :=
330
+ begin
331
+ induction n with n IH,
332
+ { simp },
333
+
334
+ calc derivative^[n + 1 ] (p * q)
335
+ = (∑ (k : ℕ) in range n.succ,
336
+ (n.choose k) • ((derivative^[n - k] p) * (derivative^[k] q))).derivative :
337
+ by rw [function.iterate_succ_apply', IH]
338
+ ... = ∑ (k : ℕ) in range n.succ,
339
+ (n.choose k) • ((derivative^[n - k + 1 ] p) * (derivative^[k] q)) +
340
+ ∑ (k : ℕ) in range n.succ,
341
+ (n.choose k) • ((derivative^[n - k] p) * (derivative^[k + 1 ] q)) :
342
+ by simp_rw [derivative_sum, derivative_smul, derivative_mul, function.iterate_succ_apply',
343
+ smul_add, sum_add_distrib]
344
+ ... = (∑ (k : ℕ) in range n.succ,
345
+ (n.choose k.succ) • ((derivative^[n - k] p) * (derivative^[k + 1 ] q)) +
346
+ 1 • ((derivative^[n + 1 ] p) * (derivative^[0 ] q))) +
347
+ ∑ (k : ℕ) in range n.succ,
348
+ (n.choose k) • ((derivative^[n - k] p) * (derivative^[k + 1 ] q)) : _
349
+ ... = ∑ (k : ℕ) in range n.succ,
350
+ (n.choose k) • ((derivative^[n - k] p) * (derivative^[k + 1 ] q)) +
351
+ ∑ (k : ℕ) in range n.succ,
352
+ (n.choose k.succ) • ((derivative^[n - k] p) * (derivative^[k + 1 ] q)) +
353
+ 1 • ((derivative^[n + 1 ] p) * (derivative^[0 ] q)) :
354
+ by rw [add_comm, add_assoc]
355
+ ... = ∑ (i : ℕ) in range n.succ,
356
+ ((n+1 ).choose (i+1 )) • ((derivative^[n + 1 - (i + 1 )] p) * (derivative^[i + 1 ] q)) +
357
+ 1 • ((derivative^[n + 1 ] p) * (derivative^[0 ] q)) :
358
+ by simp_rw [nat.choose_succ_succ, nat.succ_sub_succ, add_smul, sum_add_distrib]
359
+ ... = ∑ (k : ℕ) in range n.succ.succ,
360
+ (n.succ.choose k) • (derivative^[n.succ - k] p * (derivative^[k] q)) :
361
+ by rw [sum_range_succ' _ n.succ, nat.choose_zero_right, tsub_zero],
362
+
363
+ congr,
364
+ refine (sum_range_succ' _ _).trans (congr_arg2 (+) _ _),
365
+ { rw [sum_range_succ, nat.choose_succ_self, zero_smul, add_zero],
366
+ refine sum_congr rfl (λ k hk, _),
367
+ rw mem_range at hk,
368
+ congr,
369
+ rw [tsub_add_eq_add_tsub (nat.succ_le_of_lt hk), nat.succ_sub_succ] },
370
+ { rw [nat.choose_zero_right, tsub_zero] },
371
+ end
372
+
283
373
end semiring
284
374
285
375
section comm_semiring
0 commit comments