Skip to content

Commit 8a22187

Browse files
acmepjzalreadydone
andcommitted
feat(Data/Polynomial/RingDivision): improvements to Polynomial.rootMultiplicity (#8563)
Main changes: - add `Monic.mem_nonZeroDivisors` and `mem_nonZeroDivisors_of_leadingCoeff` which states that a monic polynomial (resp. a polynomial whose leading coefficient is not zero divisor) is not a zero divisor. - add `rootMultiplicity_mul_X_sub_C_pow` which states that `* (X - a) ^ n` adds the root multiplicity at `a` by `n`. - change the conditions in `rootMultiplicity_X_sub_C_self`, `rootMultiplicity_X_sub_C` and `rootMultiplicity_X_sub_C_pow` from `IsDomain` to `Nontrivial`. - add `rootMultiplicity_eq_natTrailingDegree` which relates `rootMultiplicity` and `natTrailingDegree`, and `eval_divByMonic_eq_trailingCoeff_comp`. - add `le_rootMultiplicity_mul` which is similar to `le_trailingDegree_mul`. - add `rootMultiplicity_mul'` which slightly generalizes `rootMultiplicity_mul` In `Data/Polynomial/FieldDivision`: - add `rootMultiplicity_sub_one_le_derivative_rootMultiplicity_of_ne_zero` which slightly generalizes `rootMultiplicity_sub_one_le_derivative_rootMultiplicity`. - add `derivative_rootMultiplicity_of_root_of_mem_nonZeroDivisors` which slightly generalizes `derivative_rootMultiplicity_of_root`. - add several theorems relating roots of iterate derivative to `rootMultiplicity` In addition: - move `eq_of_monic_of_associated` from RingDivision to Monic and generalize. - add `dvd_cancel` lemmas to NonZeroDivisors. - add `algEquivOfCompEqX`: two polynomials that compose to X both ways induces an isomorphism of the polynomial algebra. - add divisibility lemmas to Polynomial/Derivative. Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
1 parent c4988d1 commit 8a22187

File tree

10 files changed

+326
-76
lines changed

10 files changed

+326
-76
lines changed

Mathlib/Algebra/Divisibility/Basic.lean

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,18 @@ theorem dvd_of_mul_right_dvd (h : a * b ∣ c) : a ∣ c :=
9595

9696
section map_dvd
9797

98-
variable {M N : Type*} [Monoid M] [Monoid N]
98+
variable {M N : Type*}
9999

100-
theorem map_dvd {F : Type*} [MulHomClass F M N] (f : F) {a b} : a ∣ b → f a ∣ f b
100+
theorem map_dvd [Semigroup M] [Semigroup N] {F : Type*} [MulHomClass F M N] (f : F) {a b} :
101+
a ∣ b → f a ∣ f b
101102
| ⟨c, h⟩ => ⟨f c, h.symm ▸ map_mul f a c⟩
102103
#align map_dvd map_dvd
103104

104-
theorem MulHom.map_dvd (f : M →ₙ* N) {a b} : a ∣ b → f a ∣ f b :=
105+
theorem MulHom.map_dvd [Semigroup M] [Semigroup N] (f : M →ₙ* N) {a b} : a ∣ b → f a ∣ f b :=
105106
_root_.map_dvd f
106107
#align mul_hom.map_dvd MulHom.map_dvd
107108

108-
theorem MonoidHom.map_dvd (f : M →* N) {a b} : a ∣ b → f a ∣ f b :=
109+
theorem MonoidHom.map_dvd [Monoid M] [Monoid N] (f : M →* N) {a b} : a ∣ b → f a ∣ f b :=
109110
_root_.map_dvd f
110111
#align monoid_hom.map_dvd MonoidHom.map_dvd
111112

Mathlib/Algebra/GroupWithZero/NonZeroDivisors.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,20 @@ theorem mul_cancel_left_coe_nonZeroDivisors {x y : R'} {c : R'⁰} : (c : R') *
141141
mul_cancel_left_mem_nonZeroDivisors c.prop
142142
#align mul_cancel_left_coe_non_zero_divisor mul_cancel_left_coe_nonZeroDivisors
143143

144+
theorem dvd_cancel_right_mem_nonZeroDivisors {x y r : R'} (hr : r ∈ R'⁰) : x * r ∣ y * r ↔ x ∣ y :=
145+
fun ⟨z, _⟩ ↦ ⟨z, by rwa [← mul_cancel_right_mem_nonZeroDivisors hr, mul_assoc, mul_comm z r,
146+
← mul_assoc]⟩, fun ⟨z, h⟩ ↦ ⟨z, by rw [h, mul_assoc, mul_comm z r, ← mul_assoc]⟩⟩
147+
148+
theorem dvd_cancel_right_coe_nonZeroDivisors {x y : R'} {c : R'⁰} : x * c ∣ y * c ↔ x ∣ y :=
149+
dvd_cancel_right_mem_nonZeroDivisors c.prop
150+
151+
theorem dvd_cancel_left_mem_nonZeroDivisors {x y r : R'} (hr : r ∈ R'⁰) : r * x ∣ r * y ↔ x ∣ y :=
152+
fun ⟨z, _⟩ ↦ ⟨z, by rwa [← mul_cancel_left_mem_nonZeroDivisors hr, ← mul_assoc]⟩,
153+
fun ⟨z, h⟩ ↦ ⟨z, by rw [h, ← mul_assoc]⟩⟩
154+
155+
theorem dvd_cancel_left_coe_nonZeroDivisors {x y : R'} {c : R'⁰} : c * x ∣ c * y ↔ x ∣ y :=
156+
dvd_cancel_left_mem_nonZeroDivisors c.prop
157+
144158
theorem nonZeroDivisors.ne_zero [Nontrivial M] {x} (hx : x ∈ M⁰) : x ≠ 0 := fun h ↦
145159
one_ne_zero (hx _ <| (one_mul _).trans h)
146160
#align non_zero_divisors.ne_zero nonZeroDivisors.ne_zero

Mathlib/Algebra/Ring/Divisibility/Basic.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ imports. Further results about divisibility in rings may be found in
2020

2121
variable {α β : Type*}
2222

23+
theorem map_dvd_iff [Semigroup α] [Semigroup β] {F : Type*} [MulEquivClass F α β] (f : F) {a b} :
24+
f a ∣ f b ↔ a ∣ b :=
25+
let f := MulEquivClass.toMulEquiv f
26+
fun h ↦ by rw [← f.left_inv a, ← f.left_inv b]; exact map_dvd f.symm h, map_dvd f⟩
27+
2328
section DistribSemigroup
2429

2530
variable [Add α] [Semigroup α]

Mathlib/Data/Polynomial/AlgebraMap.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,26 @@ theorem aeval_mul : aeval x (p * q) = aeval x p * aeval x q :=
257257
AlgHom.map_mul _ _ _
258258
#align polynomial.aeval_mul Polynomial.aeval_mul
259259

260+
theorem comp_eq_aeval : p.comp q = aeval q p := rfl
261+
260262
theorem aeval_comp {A : Type*} [CommSemiring A] [Algebra R A] (x : A) :
261263
aeval x (p.comp q) = aeval (aeval x q) p :=
262264
eval₂_comp (algebraMap R A)
263265
#align polynomial.aeval_comp Polynomial.aeval_comp
264266

267+
/-- Two polynomials `p` and `q` such that `p(q(X))=X` and `q(p(X))=X`
268+
induces an automorphism of the polynomial algebra. -/
269+
@[simps!]
270+
def algEquivOfCompEqX (p q : R[X]) (hpq : p.comp q = X) (hqp : q.comp p = X) : R[X] ≃ₐ[R] R[X] := by
271+
refine AlgEquiv.ofAlgHom (aeval p) (aeval q) ?_ ?_ <;>
272+
exact AlgHom.ext fun _ ↦ by simp [← comp_eq_aeval, comp_assoc, hpq, hqp]
273+
274+
/-- The automorphism of the polynomial algebra given by `p(X) ↦ p(X+t)`,
275+
with inverse `p(X) ↦ p(X-t)`. -/
276+
@[simps!]
277+
def algEquivAevalXAddC {R} [CommRing R] (t : R) : R[X] ≃ₐ[R] R[X] :=
278+
algEquivOfCompEqX (X + C t) (X - C t) (by simp) (by simp)
279+
265280
theorem aeval_algHom (f : A →ₐ[R] B) (x : A) : aeval (f x) = f.comp (aeval x) :=
266281
algHom_ext <| by simp only [aeval_X, AlgHom.comp_apply]
267282
#align polynomial.aeval_alg_hom Polynomial.aeval_algHom

Mathlib/Data/Polynomial/Derivative.lean

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,23 @@ theorem derivative_sq (p : R[X]) : derivative (p ^ 2) = C 2 * p * derivative p :
475475
rw [derivative_pow_succ, Nat.cast_one, one_add_one_eq_two, pow_one]
476476
#align polynomial.derivative_sq Polynomial.derivative_sq
477477

478+
theorem pow_sub_one_dvd_derivative_of_pow_dvd {p q : R[X]} {n : ℕ}
479+
(dvd : q ^ n ∣ p) : q ^ (n - 1) ∣ derivative p := by
480+
obtain ⟨r, rfl⟩ := dvd
481+
rw [derivative_mul, derivative_pow]
482+
exact (((dvd_mul_left _ _).mul_right _).mul_right _).add ((pow_dvd_pow q n.pred_le).mul_right _)
483+
484+
theorem pow_sub_dvd_iterate_derivative_of_pow_dvd {p q : R[X]} {n : ℕ} (m : ℕ)
485+
(dvd : q ^ n ∣ p) : q ^ (n - m) ∣ derivative^[m] p := by
486+
revert p
487+
induction' m with m ih <;> intro p h
488+
· exact h
489+
· rw [Nat.sub_succ, Function.iterate_succ']
490+
exact pow_sub_one_dvd_derivative_of_pow_dvd (ih h)
491+
492+
theorem pow_sub_dvd_iterate_derivative_pow (p : R[X]) (n m : ℕ) :
493+
p ^ (n - m) ∣ derivative^[m] (p ^ n) := pow_sub_dvd_iterate_derivative_of_pow_dvd m dvd_rfl
494+
478495
theorem dvd_iterate_derivative_pow (f : R[X]) (n : ℕ) {m : ℕ} (c : R) (hm : m ≠ 0) :
479496
(n : R) ∣ eval c (derivative^[m] (f ^ n)) := by
480497
obtain ⟨m, rfl⟩ := Nat.exists_eq_succ_of_ne_zero hm
@@ -658,11 +675,15 @@ set_option linter.uppercaseLean3 false in
658675
#align polynomial.derivative_X_sub_C_sq Polynomial.derivative_X_sub_C_sq
659676

660677
theorem iterate_derivative_X_sub_pow (n k : ℕ) (c : R) :
661-
(derivative^[k]) ((X - C c) ^ n : R[X]) = n.descFactorial k • (X - C c) ^ (n - k) := by
678+
derivative^[k] ((X - C c) ^ n) = n.descFactorial k • (X - C c) ^ (n - k) := by
662679
rw [sub_eq_add_neg, ← C_neg, iterate_derivative_X_add_pow]
663680
set_option linter.uppercaseLean3 false in
664681
#align polynomial.iterate_derivative_X_sub_pow Polynomial.iterate_derivative_X_sub_powₓ
665682

683+
theorem iterate_derivative_X_sub_pow_self (n : ℕ) (c : R) :
684+
derivative^[n] ((X - C c) ^ n) = n.factorial := by
685+
rw [iterate_derivative_X_sub_pow, n.sub_self, pow_zero, nsmul_one, n.descFactorial_self]
686+
666687
end CommRing
667688

668689
end Derivative

Mathlib/Data/Polynomial/Div.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,12 @@ theorem pow_mul_divByMonic_rootMultiplicity_eq (p : R[X]) (a : R) :
540540
simp
541541
#align polynomial.div_by_monic_mul_pow_root_multiplicity_eq Polynomial.pow_mul_divByMonic_rootMultiplicity_eq
542542

543+
theorem exists_eq_pow_rootMultiplicity_mul_and_not_dvd (p : R[X]) (hp : p ≠ 0) (a : R) :
544+
∃ q : R[X], p = (X - C a) ^ p.rootMultiplicity a * q ∧ ¬ (X - C a) ∣ q := by
545+
classical
546+
rw [rootMultiplicity_eq_multiplicity, dif_neg hp]
547+
apply multiplicity.exists_eq_pow_mul_and_not_dvd
548+
543549
end multiplicity
544550

545551
end Ring

Mathlib/Data/Polynomial/FieldDivision.lean

Lines changed: 126 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,34 +27,125 @@ universe u v w y z
2727

2828
variable {R : Type u} {S : Type v} {k : Type y} {A : Type z} {a b : R} {n : ℕ}
2929

30+
section CommRing
31+
32+
variable [CommRing R]
33+
34+
theorem rootMultiplicity_sub_one_le_derivative_rootMultiplicity_of_ne_zero
35+
(p : R[X]) (t : R) (hnezero : derivative p ≠ 0) :
36+
p.rootMultiplicity t - 1 ≤ p.derivative.rootMultiplicity t :=
37+
(le_rootMultiplicity_iff hnezero).2 <|
38+
pow_sub_one_dvd_derivative_of_pow_dvd (p.pow_rootMultiplicity_dvd t)
39+
40+
theorem derivative_rootMultiplicity_of_root_of_mem_nonZeroDivisors
41+
{p : R[X]} {t : R} (hpt : Polynomial.IsRoot p t)
42+
(hnzd : (p.rootMultiplicity t : R) ∈ nonZeroDivisors R) :
43+
(derivative p).rootMultiplicity t = p.rootMultiplicity t - 1 := by
44+
by_cases h : p = 0
45+
· simp only [h, map_zero, rootMultiplicity_zero]
46+
obtain ⟨g, hp, hndvd⟩ := p.exists_eq_pow_rootMultiplicity_mul_and_not_dvd h t
47+
set m := p.rootMultiplicity t
48+
have hm : m - 1 + 1 = m := Nat.sub_add_cancel <| (rootMultiplicity_pos h).2 hpt
49+
have hndvd : ¬(X - C t) ^ m ∣ derivative p := by
50+
rw [hp, derivative_mul, dvd_add_left (dvd_mul_right _ _),
51+
derivative_X_sub_C_pow, ← hm, pow_succ', hm, mul_comm (C _), mul_assoc,
52+
dvd_cancel_left_mem_nonZeroDivisors (monic_X_sub_C t |>.pow _ |>.mem_nonZeroDivisors)]
53+
rw [dvd_iff_isRoot, IsRoot] at hndvd ⊢
54+
rwa [eval_mul, eval_C, mul_left_mem_nonZeroDivisors_eq_zero_iff hnzd]
55+
have hnezero : derivative p ≠ 0 := fun h ↦ hndvd (by rw [h]; exact dvd_zero _)
56+
exact le_antisymm (by rwa [rootMultiplicity_le_iff hnezero, hm])
57+
(rootMultiplicity_sub_one_le_derivative_rootMultiplicity_of_ne_zero _ t hnezero)
58+
59+
theorem isRoot_iterate_derivative_of_lt_rootMultiplicity {p : R[X]} {t : R} {n : ℕ}
60+
(hn : n < p.rootMultiplicity t) : (derivative^[n] p).IsRoot t :=
61+
dvd_iff_isRoot.mp <| (dvd_pow_self _ <| Nat.sub_ne_zero_of_lt hn).trans
62+
(pow_sub_dvd_iterate_derivative_of_pow_dvd _ <| p.pow_rootMultiplicity_dvd t)
63+
64+
open Finset in
65+
theorem eval_iterate_derivative_rootMultiplicity {p : R[X]} {t : R} :
66+
(derivative^[p.rootMultiplicity t] p).eval t =
67+
(p.rootMultiplicity t).factorial • (p /ₘ (X - C t) ^ p.rootMultiplicity t).eval t := by
68+
set m := p.rootMultiplicity t with hm
69+
conv_lhs => rw [← p.pow_mul_divByMonic_rootMultiplicity_eq t, ← hm]
70+
rw [iterate_derivative_mul, eval_finset_sum, sum_eq_single_of_mem _ (mem_range.mpr m.succ_pos)]
71+
· rw [m.choose_zero_right, one_smul, eval_mul, m.sub_zero, iterate_derivative_X_sub_pow_self,
72+
eval_nat_cast, nsmul_eq_mul]; rfl
73+
· intro b hb hb0
74+
rw [iterate_derivative_X_sub_pow, eval_smul, eval_mul, eval_smul, eval_pow,
75+
Nat.sub_sub_self (mem_range_succ_iff.mp hb), eval_sub, eval_X, eval_C, sub_self,
76+
zero_pow' b hb0, smul_zero, zero_mul, smul_zero]
77+
78+
theorem lt_rootMultiplicity_of_isRoot_iterate_derivative_of_mem_nonZeroDivisors
79+
{p : R[X]} {t : R} {n : ℕ} (h : p ≠ 0)
80+
(hroot : ∀ m ≤ n, (derivative^[m] p).IsRoot t)
81+
(hnzd : (n.factorial : R) ∈ nonZeroDivisors R) :
82+
n < p.rootMultiplicity t := by
83+
by_contra! h'
84+
replace hroot := hroot _ h'
85+
simp only [IsRoot, eval_iterate_derivative_rootMultiplicity] at hroot
86+
obtain ⟨q, hq⟩ := Nat.coe_nat_dvd (α := R) <| Nat.factorial_dvd_factorial h'
87+
rw [hq, mul_mem_nonZeroDivisors] at hnzd
88+
rw [nsmul_eq_mul, mul_left_mem_nonZeroDivisors_eq_zero_iff hnzd.1] at hroot
89+
exact eval_divByMonic_pow_rootMultiplicity_ne_zero t h hroot
90+
91+
theorem lt_rootMultiplicity_of_isRoot_iterate_derivative_of_mem_nonZeroDivisors'
92+
{p : R[X]} {t : R} {n : ℕ} (h : p ≠ 0)
93+
(hroot : ∀ m ≤ n, (derivative^[m] p).IsRoot t)
94+
(hnzd : ∀ m ≤ n, m ≠ 0 → (m : R) ∈ nonZeroDivisors R) :
95+
n < p.rootMultiplicity t := by
96+
apply lt_rootMultiplicity_of_isRoot_iterate_derivative_of_mem_nonZeroDivisors h hroot
97+
clear hroot
98+
induction' n with n ih
99+
· simp only [Nat.zero_eq, Nat.factorial_zero, Nat.cast_one]
100+
exact Submonoid.one_mem _
101+
· rw [Nat.factorial_succ, Nat.cast_mul, mul_mem_nonZeroDivisors]
102+
exact ⟨hnzd _ le_rfl n.succ_ne_zero, ih fun m h ↦ hnzd m (h.trans n.le_succ)⟩
103+
104+
theorem lt_rootMultiplicity_iff_isRoot_iterate_derivative_of_mem_nonZeroDivisors
105+
{p : R[X]} {t : R} {n : ℕ} (h : p ≠ 0)
106+
(hnzd : (n.factorial : R) ∈ nonZeroDivisors R) :
107+
n < p.rootMultiplicity t ↔ ∀ m ≤ n, (derivative^[m] p).IsRoot t :=
108+
fun hn _ hm ↦ isRoot_iterate_derivative_of_lt_rootMultiplicity <| hm.trans_lt hn,
109+
fun hr ↦ lt_rootMultiplicity_of_isRoot_iterate_derivative_of_mem_nonZeroDivisors h hr hnzd⟩
110+
111+
theorem lt_rootMultiplicity_iff_isRoot_iterate_derivative_of_mem_nonZeroDivisors'
112+
{p : R[X]} {t : R} {n : ℕ} (h : p ≠ 0)
113+
(hnzd : ∀ m ≤ n, m ≠ 0 → (m : R) ∈ nonZeroDivisors R) :
114+
n < p.rootMultiplicity t ↔ ∀ m ≤ n, (derivative^[m] p).IsRoot t :=
115+
fun hn _ hm ↦ isRoot_iterate_derivative_of_lt_rootMultiplicity <| Nat.lt_of_le_of_lt hm hn,
116+
fun hr ↦ lt_rootMultiplicity_of_isRoot_iterate_derivative_of_mem_nonZeroDivisors' h hr hnzd⟩
117+
118+
theorem one_lt_rootMultiplicity_iff_isRoot_iterate_derivative
119+
{p : R[X]} {t : R} (h : p ≠ 0) :
120+
1 < p.rootMultiplicity t ↔ ∀ m ≤ 1, (derivative^[m] p).IsRoot t :=
121+
lt_rootMultiplicity_iff_isRoot_iterate_derivative_of_mem_nonZeroDivisors h
122+
(by rw [Nat.factorial_one, Nat.cast_one]; exact Submonoid.one_mem _)
123+
124+
theorem one_lt_rootMultiplicity_iff_isRoot
125+
{p : R[X]} {t : R} (h : p ≠ 0) :
126+
1 < p.rootMultiplicity t ↔ p.IsRoot t ∧ (derivative p).IsRoot t := by
127+
rw [one_lt_rootMultiplicity_iff_isRoot_iterate_derivative h]
128+
refine ⟨fun h ↦ ⟨h 0 (by norm_num), h 1 (by norm_num)⟩, fun ⟨h0, h1⟩ m hm ↦ ?_⟩
129+
obtain (_|_|m) := m
130+
exacts [h0, h1, by linarith [hm]]
131+
132+
end CommRing
133+
30134
section IsDomain
31135

32136
variable [CommRing R] [IsDomain R]
33137

138+
theorem one_lt_rootMultiplicity_iff_isRoot_gcd
139+
[GCDMonoid R[X]] {p : R[X]} {t : R} (h : p ≠ 0) :
140+
1 < p.rootMultiplicity t ↔ (gcd p (derivative p)).IsRoot t := by
141+
simp_rw [one_lt_rootMultiplicity_iff_isRoot h, ← dvd_iff_isRoot, dvd_gcd_iff]
142+
34143
theorem derivative_rootMultiplicity_of_root [CharZero R] {p : R[X]} {t : R} (hpt : p.IsRoot t) :
35144
p.derivative.rootMultiplicity t = p.rootMultiplicity t - 1 := by
36-
rcases eq_or_ne p 0 with (rfl | hp)
37-
· simp
38-
nth_rw 1 [← p.pow_mul_divByMonic_rootMultiplicity_eq t, mul_comm]
39-
simp only [derivative_pow, derivative_mul, derivative_sub, derivative_X, derivative_C, sub_zero,
40-
mul_one]
41-
set n := p.rootMultiplicity t - 1
42-
have hn : n + 1 = _ := tsub_add_cancel_of_le ((rootMultiplicity_pos hp).mpr hpt)
43-
rw [← hn]
44-
set q := p /ₘ (X - C t) ^ (n + 1) with _hq
45-
convert_to rootMultiplicity t ((X - C t) ^ n * (derivative q * (X - C t) + q * C ↑(n + 1))) = n
46-
· congr
47-
rw [mul_add, mul_left_comm <| (X - C t) ^ n, ← pow_succ']
48-
congr 1
49-
rw [mul_left_comm <| (X - C t) ^ n, mul_comm <| (X - C t) ^ n]
50-
have h : eval t (derivative q * (X - C t) + q * C (R := R) ↑(n + 1)) ≠ 0 := by
51-
suffices eval t q * ↑(n + 1) ≠ 0 by simpa
52-
refine' mul_ne_zero _ (Nat.cast_ne_zero.mpr n.succ_ne_zero)
53-
convert eval_divByMonic_pow_rootMultiplicity_ne_zero t hp
54-
rw [rootMultiplicity_mul, rootMultiplicity_X_sub_C_pow, rootMultiplicity_eq_zero h, add_zero]
55-
refine' mul_ne_zero (pow_ne_zero n <| X_sub_C_ne_zero t) _
56-
contrapose! h
57-
rw [h, eval_zero]
145+
by_cases h : p = 0
146+
· rw [h, map_zero, rootMultiplicity_zero]
147+
exact derivative_rootMultiplicity_of_root_of_mem_nonZeroDivisors hpt <|
148+
mem_nonZeroDivisors_of_ne_zero <| Nat.cast_ne_zero.2 ((rootMultiplicity_pos h).2 hpt).ne'
58149
#align polynomial.derivative_root_multiplicity_of_root Polynomial.derivative_rootMultiplicity_of_root
59150

60151
theorem rootMultiplicity_sub_one_le_derivative_rootMultiplicity [CharZero R] (p : R[X]) (t : R) :
@@ -65,6 +156,19 @@ theorem rootMultiplicity_sub_one_le_derivative_rootMultiplicity [CharZero R] (p
65156
exact zero_le _
66157
#align polynomial.root_multiplicity_sub_one_le_derivative_root_multiplicity Polynomial.rootMultiplicity_sub_one_le_derivative_rootMultiplicity
67158

159+
theorem lt_rootMultiplicity_of_isRoot_iterate_derivative
160+
[CharZero R] {p : R[X]} {t : R} {n : ℕ} (h : p ≠ 0)
161+
(hroot : ∀ m ≤ n, (derivative^[m] p).IsRoot t) :
162+
n < p.rootMultiplicity t :=
163+
lt_rootMultiplicity_of_isRoot_iterate_derivative_of_mem_nonZeroDivisors h hroot <|
164+
mem_nonZeroDivisors_of_ne_zero <| Nat.cast_ne_zero.2 <| Nat.factorial_ne_zero n
165+
166+
theorem lt_rootMultiplicity_iff_isRoot_iterate_derivative
167+
[CharZero R] {p : R[X]} {t : R} {n : ℕ} (h : p ≠ 0) :
168+
n < p.rootMultiplicity t ↔ ∀ m ≤ n, (derivative^[m] p).IsRoot t :=
169+
fun hn _ hm ↦ isRoot_iterate_derivative_of_lt_rootMultiplicity <| Nat.lt_of_le_of_lt hm hn,
170+
fun hr ↦ lt_rootMultiplicity_of_isRoot_iterate_derivative h hr⟩
171+
68172
section NormalizationMonoid
69173

70174
variable [NormalizationMonoid R]

Mathlib/Data/Polynomial/Monic.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,11 @@ theorem Monic.isUnit_iff (hm : p.Monic) : IsUnit p ↔ p = 1 :=
254254
⟨hm.eq_one_of_isUnit, fun h => h.symm ▸ isUnit_one⟩
255255
#align polynomial.monic.is_unit_iff Polynomial.Monic.isUnit_iff
256256

257+
theorem eq_of_monic_of_associated (hp : p.Monic) (hq : q.Monic) (hpq : Associated p q) : p = q := by
258+
obtain ⟨u, rfl⟩ := hpq
259+
rw [(hp.of_mul_monic_left hq).eq_one_of_isUnit u.isUnit, mul_one]
260+
#align polynomial.eq_of_monic_of_associated Polynomial.eq_of_monic_of_associated
261+
257262
end Semiring
258263

259264
section CommSemiring

0 commit comments

Comments
 (0)