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

Commit 76de588

Browse files
committed
feat(data/polynomial): prove degree_derivative_eq
1 parent eb20fd0 commit 76de588

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

algebra/big_operators.lean

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,25 @@ have (s₂ \ s₁).prod f = (s₂ \ s₁).prod (λx, 1),
131131
from prod_congr rfl begin simp [hf] {contextual := tt} end,
132132
by rw [←prod_sdiff h]; simp [this]
133133

134+
@[to_additive sum_eq_single]
135+
lemma prod_eq_single {s : finset α} {f : α → β} (a : α)
136+
(h₀ : ∀b∈s, b ≠ a → f b = 1) (h₁ : a ∉ s → f a = 1) : s.prod f = f a :=
137+
by haveI := classical.dec_eq α;
138+
from classical.by_cases
139+
(assume : a ∈ s,
140+
calc s.prod f = ({a} : finset α).prod f :
141+
begin
142+
refine (prod_subset _ _).symm,
143+
{ simp [finset.subset_iff, this] },
144+
{ simpa using h₀ }
145+
end
146+
... = f a : by simp)
147+
(assume : a ∉ s,
148+
have ∀b, b ∈ s → f b = 1,
149+
from assume b hb, h₀ b hb $ assume eq, this $ eq ▸ hb,
150+
calc s.prod f = (∅ : finset α).prod f : (prod_subset (empty_subset s) $ by simpa).symm
151+
... = f a : (h₁ ‹a ∉ s›).symm)
152+
134153
@[to_additive sum_attach]
135154
lemma prod_attach {f : α → β} : s.attach.prod (λx, f x.val) = s.prod f :=
136155
by haveI := classical.dec_eq α; exact
@@ -367,7 +386,7 @@ finset.induction_on s (by simp [abs_zero]) $
367386
end discrete_linear_ordered_field
368387

369388
@[simp] lemma card_pi [decidable_eq α] {δ : α → Type*}
370-
(s : finset α) (t : Π a, finset (δ a)) :
389+
(s : finset α) (t : Π a, finset (δ a)) :
371390
(s.pi t).card = s.prod (λ a, card (t a)) :=
372391
multiset.card_pi _ _
373392

data/polynomial.lean

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,9 @@ by unfold monic; apply_instance
249249

250250
@[simp] lemma degree_zero : degree (0 : polynomial α) = ⊥ := rfl
251251

252+
@[simp] lemma nat_degree_zero : nat_degree (0 : polynomial α) = 0 :=
253+
by simp [nat_degree]; refl
254+
252255
@[simp] lemma degree_C (ha : a ≠ 0) : degree (C a) = (0 : with_bot ℕ) :=
253256
show sup (ite (a = 0) ∅ {0}) some = 0,
254257
by rw [if_neg ha]; refl
@@ -1155,6 +1158,14 @@ variables [comm_semiring α] {β : Type*}
11551158
/-- `derivative p` formal derivative of the polynomial `p` -/
11561159
def derivative (p : polynomial α) : polynomial α := p.sum (λn a, C (a * n) * X^(n - 1))
11571160

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+
11581169
@[simp] lemma derivative_zero : derivative (0 : polynomial α) = 0 :=
11591170
finsupp.sum_zero_index
11601171

@@ -1215,11 +1226,37 @@ calc derivative (f * g) = f.sum (λn a, g.sum (λm b, C ((a * b) * (n + m : ℕ)
12151226
simp [finsupp.sum, mul_assoc, mul_comm, mul_left_comm]
12161227
end
12171228

1218-
/-
1219-
@[simp] lemma degree_derivative (p : polynomial α) (hp : 0 < nat_degree p) :
1220-
nat_degree (derivative p) = nat_degree p - 1 :=
1221-
_
1222-
-/
12231229
end derivative
12241230

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+
12251262
end polynomial

0 commit comments

Comments
 (0)