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

Commit eb20fd0

Browse files
committed
feat(data/polynomial): derivative on polynomials
1 parent fd43fe0 commit eb20fd0

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

data/polynomial.lean

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ lemma single_eq_C_mul_X : ∀{n}, single n a = C a * X^n
7070
... = (C a * X^n) * X : by rw [single_eq_C_mul_X]
7171
... = C a * X^(n+1) : by simp [pow_add, mul_assoc]
7272

73+
lemma sum_C_mul_X_eq (p : polynomial α) : p.sum (λn a, C a * X^n) = p :=
74+
eq.trans (sum_congr rfl $ assume n hn, single_eq_C_mul_X.symm) finsupp.sum_single
75+
7376
@[elab_as_eliminator] protected lemma induction_on {M : polynomial α → Prop} (p : polynomial α)
7477
(h_C : ∀a, M (C a))
7578
(h_add : ∀p q, M p → M q → M (p + q))
@@ -1146,4 +1149,77 @@ by conv {to_rhs, rw [← euclidean_domain.div_add_mod p q, add_comm,
11461149

11471150
end field
11481151

1152+
section derivative
1153+
variables [comm_semiring α] {β : Type*}
1154+
1155+
/-- `derivative p` formal derivative of the polynomial `p` -/
1156+
def derivative (p : polynomial α) : polynomial α := p.sum (λn a, C (a * n) * X^(n - 1))
1157+
1158+
@[simp] lemma derivative_zero : derivative (0 : polynomial α) = 0 :=
1159+
finsupp.sum_zero_index
1160+
1161+
lemma derivative_monomial (a : α) (n : ℕ) : derivative (C a * X ^ n) = C (a * n) * X^(n - 1) :=
1162+
by rw [← single_eq_C_mul_X, ← single_eq_C_mul_X, derivative, sum_single_index, single_eq_C_mul_X];
1163+
simp; refl
1164+
1165+
@[simp] lemma derivative_C {a : α} : derivative (C a) = 0 :=
1166+
suffices derivative (C a * X^0) = C (a * 0:α) * X ^ 0, by simpa,
1167+
derivative_monomial a 0
1168+
1169+
@[simp] lemma derivative_X : derivative (X : polynomial α) = 1 :=
1170+
suffices derivative (C (1:α) * X^1) = C (1 * (1:ℕ)) * X ^ (1 - 1), by simpa,
1171+
derivative_monomial 1 1
1172+
1173+
@[simp] lemma derivative_one : derivative (1 : polynomial α) = 0 :=
1174+
derivative_C
1175+
1176+
@[simp] lemma derivative_add {f g : polynomial α} :
1177+
derivative (f + g) = derivative f + derivative g :=
1178+
by refine finsupp.sum_add_index _ _; simp [add_mul]
1179+
1180+
@[simp] lemma derivative_sum {s : finset β} {f : β → polynomial α} :
1181+
derivative (s.sum f) = s.sum (λb, derivative (f b)) :=
1182+
begin
1183+
apply (finset.sum_hom derivative _ _).symm,
1184+
exact derivative_zero,
1185+
exact assume x y, derivative_add
1186+
end
1187+
1188+
@[simp] lemma derivative_mul {f g : polynomial α} :
1189+
derivative (f * g) = derivative f * g + f * derivative g :=
1190+
calc derivative (f * g) = f.sum (λn a, g.sum (λm b, C ((a * b) * (n + m : ℕ)) * X^((n + m) - 1))) :
1191+
begin
1192+
transitivity, exact derivative_sum,
1193+
transitivity, { apply finset.sum_congr rfl, assume x hx, exact derivative_sum },
1194+
apply finset.sum_congr rfl, assume n hn, apply finset.sum_congr rfl, assume m hm,
1195+
dsimp,
1196+
transitivity,
1197+
{ apply congr_arg, exact single_eq_C_mul_X },
1198+
exact derivative_monomial _ _
1199+
end
1200+
... = f.sum (λn a, g.sum (λm b,
1201+
(C (a * n) * X^(n - 1)) * (C b * X^m) + (C (b * m) * X^(m - 1)) * (C a * X^n))) :
1202+
sum_congr rfl $ assume n hn, sum_congr rfl $ assume m hm,
1203+
by cases n; cases m; simp [mul_add, add_mul, mul_assoc, mul_comm, mul_left_comm,
1204+
add_assoc, add_comm, add_left_comm, pow_add, pow_succ]
1205+
... = derivative f * g + f * derivative g :
1206+
begin
1207+
simp [finsupp.sum_add],
1208+
conv {
1209+
to_rhs,
1210+
congr,
1211+
{ rw [← sum_C_mul_X_eq f, derivative] },
1212+
{ rw [← sum_C_mul_X_eq g, derivative] },
1213+
},
1214+
simp [finsupp.mul_sum, finsupp.sum_mul],
1215+
simp [finsupp.sum, mul_assoc, mul_comm, mul_left_comm]
1216+
end
1217+
1218+
/-
1219+
@[simp] lemma degree_derivative (p : polynomial α) (hp : 0 < nat_degree p) :
1220+
nat_degree (derivative p) = nat_degree p - 1 :=
1221+
_
1222+
-/
1223+
end derivative
1224+
11491225
end polynomial

0 commit comments

Comments
 (0)