@@ -249,6 +249,9 @@ by unfold monic; apply_instance
249
249
250
250
@[simp] lemma degree_zero : degree (0 : polynomial α) = ⊥ := rfl
251
251
252
+ @[simp] lemma nat_degree_zero : nat_degree (0 : polynomial α) = 0 :=
253
+ by simp [nat_degree]; refl
254
+
252
255
@[simp] lemma degree_C (ha : a ≠ 0 ) : degree (C a) = (0 : with_bot ℕ) :=
253
256
show sup (ite (a = 0 ) ∅ {0 }) some = 0 ,
254
257
by rw [if_neg ha]; refl
@@ -1155,6 +1158,14 @@ variables [comm_semiring α] {β : Type*}
1155
1158
/-- `derivative p` formal derivative of the polynomial `p` -/
1156
1159
def derivative (p : polynomial α) : polynomial α := p.sum (λn a, C (a * n) * X^(n - 1 ))
1157
1160
1161
+ lemma derivative_apply (p : polynomial α) (n : ℕ) : (derivative p) n = p (n + 1 ) * (n + 1 ) :=
1162
+ begin
1163
+ rw [derivative],
1164
+ simp [finsupp.sum],
1165
+ rw [sum_eq_single (n + 1 )]; simp {contextual := tt},
1166
+ assume b, cases b; simp [nat.succ_eq_add_one] {contextual := tt},
1167
+ end
1168
+
1158
1169
@[simp] lemma derivative_zero : derivative (0 : polynomial α) = 0 :=
1159
1170
finsupp.sum_zero_index
1160
1171
@@ -1215,11 +1226,37 @@ calc derivative (f * g) = f.sum (λn a, g.sum (λm b, C ((a * b) * (n + m : ℕ)
1215
1226
simp [finsupp.sum, mul_assoc, mul_comm, mul_left_comm]
1216
1227
end
1217
1228
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
1229
end derivative
1224
1230
1231
+ section domain
1232
+ variables [integral_domain α]
1233
+
1234
+ lemma mem_support_derivative [char_zero α] (p : polynomial α) (n : ℕ) :
1235
+ n ∈ (derivative p).support ↔ n + 1 ∈ p.support :=
1236
+ suffices (¬(p (n + 1 ) = 0 ∨ ((1 + n:ℕ) : α) = 0 )) ↔ p (n + 1 ) ≠ 0 , by simpa [derivative_apply],
1237
+ by rw [nat.cast_eq_zero]; simp
1238
+
1239
+ @[simp] lemma degree_derivative_eq [char_zero α] (p : polynomial α) (hp : 0 < nat_degree p) :
1240
+ degree (derivative p) = (nat_degree p - 1 : ℕ) :=
1241
+ le_antisymm
1242
+ (le_trans (degree_sum_le _ _) $ sup_le $ assume n hn,
1243
+ have n ≤ nat_degree p,
1244
+ begin
1245
+ rw [← with_bot.coe_le_coe, ← degree_eq_nat_degree],
1246
+ { refine le_degree_of_ne_zero _, simpa using hn },
1247
+ { assume h, simpa [h] using hn }
1248
+ end ,
1249
+ le_trans (degree_monomial_le _ _) $ with_bot.coe_le_coe.2 $ nat.sub_le_sub_right this _)
1250
+ begin
1251
+ refine le_sup _,
1252
+ rw [mem_support_derivative, nat.sub_add_cancel, mem_support_iff],
1253
+ { show ¬ leading_coeff p = 0 ,
1254
+ rw [leading_coeff_eq_zero],
1255
+ assume h, rw [h, nat_degree_zero] at hp,
1256
+ exact lt_irrefl 0 (lt_of_le_of_lt (zero_le _) hp), },
1257
+ exact hp
1258
+ end
1259
+
1260
+ end domain
1261
+
1225
1262
end polynomial
0 commit comments