@@ -70,6 +70,9 @@ lemma single_eq_C_mul_X : ∀{n}, single n a = C a * X^n
70
70
... = (C a * X^n) * X : by rw [single_eq_C_mul_X]
71
71
... = C a * X^(n+1 ) : by simp [pow_add, mul_assoc]
72
72
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
+
73
76
@[elab_as_eliminator] protected lemma induction_on {M : polynomial α → Prop } (p : polynomial α)
74
77
(h_C : ∀a, M (C a))
75
78
(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,
1146
1149
1147
1150
end field
1148
1151
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
+
1149
1225
end polynomial
0 commit comments