Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit f651d75

Browse files
chore(data/polynomial/derivative): merge iterated_deriv.lean into derivative.lean (#16022)
iterated_deriv.lean was not used anywhere, and derivative.lean already had independent variants of several of the lemmas there, without the `iterated_deriv` indirecion. It seems better to consolidate these results.
1 parent 2cf5d19 commit f651d75

File tree

2 files changed

+90
-207
lines changed

2 files changed

+90
-207
lines changed

src/data/polynomial/derivative.lean

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,15 @@ begin
177177
exact ih _ this (this.trans_le $ nat.le_of_lt_succ hx) rfl
178178
end
179179

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+
180189
theorem nat_degree_eq_zero_of_derivative_eq_zero [no_zero_divisors R] [char_zero R] {f : R[X]}
181190
(h : f.derivative = 0) : f.nat_degree = 0 :=
182191
begin
@@ -280,6 +289,87 @@ begin
280289
exact hp }
281290
end
282291

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+
283373
end semiring
284374

285375
section comm_semiring

src/data/polynomial/iterated_deriv.lean

Lines changed: 0 additions & 207 deletions
This file was deleted.

0 commit comments

Comments
 (0)