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

Commit 70e784d

Browse files
committed
feat(data/polynomial/*): (p * q).trailing_degree = p.trailing_degree + q.trailing_degree (#14384)
We already had a `nat_trailing_degree_mul` lemma, but this PR does things properly, following the analogous results for `degree`. In particular, we now have some useful intermediate results that do not assume `no_zero_divisors`.
1 parent 5aeafaa commit 70e784d

File tree

3 files changed

+57
-12
lines changed

3 files changed

+57
-12
lines changed

src/data/polynomial/degree/trailing_degree.lean

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,50 @@ begin
286286
exact le_trailing_degree_mul,
287287
end
288288

289+
lemma coeff_mul_nat_trailing_degree_add_nat_trailing_degree :
290+
(p * q).coeff (p.nat_trailing_degree + q.nat_trailing_degree) =
291+
p.trailing_coeff * q.trailing_coeff :=
292+
begin
293+
rw coeff_mul,
294+
refine finset.sum_eq_single (p.nat_trailing_degree, q.nat_trailing_degree) _
295+
(λ h, (h (nat.mem_antidiagonal.mpr rfl)).elim),
296+
rintro ⟨i, j⟩ h₁ h₂,
297+
rw nat.mem_antidiagonal at h₁,
298+
by_cases hi : i < p.nat_trailing_degree,
299+
{ rw [coeff_eq_zero_of_lt_nat_trailing_degree hi, zero_mul] },
300+
by_cases hj : j < q.nat_trailing_degree,
301+
{ rw [coeff_eq_zero_of_lt_nat_trailing_degree hj, mul_zero] },
302+
rw not_lt at hi hj,
303+
refine (h₂ (prod.ext_iff.mpr _).symm).elim,
304+
exact (add_eq_add_iff_eq_and_eq hi hj).mp h₁.symm,
305+
end
306+
307+
lemma trailing_degree_mul' (h : p.trailing_coeff * q.trailing_coeff ≠ 0) :
308+
(p * q).trailing_degree = p.trailing_degree + q.trailing_degree :=
309+
begin
310+
have hp : p ≠ 0 := λ hp, h (by rw [hp, trailing_coeff_zero, zero_mul]),
311+
have hq : q ≠ 0 := λ hq, h (by rw [hq, trailing_coeff_zero, mul_zero]),
312+
refine le_antisymm _ le_trailing_degree_mul,
313+
rw [trailing_degree_eq_nat_trailing_degree hp, trailing_degree_eq_nat_trailing_degree hq],
314+
apply le_trailing_degree_of_ne_zero,
315+
rwa coeff_mul_nat_trailing_degree_add_nat_trailing_degree,
316+
end
317+
318+
lemma nat_trailing_degree_mul' (h : p.trailing_coeff * q.trailing_coeff ≠ 0) :
319+
(p * q).nat_trailing_degree = p.nat_trailing_degree + q.nat_trailing_degree :=
320+
begin
321+
have hp : p ≠ 0 := λ hp, h (by rw [hp, trailing_coeff_zero, zero_mul]),
322+
have hq : q ≠ 0 := λ hq, h (by rw [hq, trailing_coeff_zero, mul_zero]),
323+
apply nat_trailing_degree_eq_of_trailing_degree_eq_some,
324+
rw [trailing_degree_mul' h, with_top.coe_add,
325+
←trailing_degree_eq_nat_trailing_degree hp, ←trailing_degree_eq_nat_trailing_degree hq],
326+
end
327+
328+
lemma nat_trailing_degree_mul [no_zero_divisors R] (hp : p ≠ 0) (hq : q ≠ 0) :
329+
(p * q).nat_trailing_degree = p.nat_trailing_degree + q.nat_trailing_degree :=
330+
nat_trailing_degree_mul' (mul_ne_zero (mt trailing_coeff_eq_zero.mp hp)
331+
(mt trailing_coeff_eq_zero.mp hq))
332+
289333
end semiring
290334

291335
section nonzero_semiring

src/data/polynomial/mirror.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ variables {R : Type*} [ring R] (p q : R[X])
160160
lemma mirror_neg : (-p).mirror = -(p.mirror) :=
161161
by rw [mirror, mirror, reverse_neg, nat_trailing_degree_neg, neg_mul_eq_neg_mul]
162162

163-
variables [is_domain R]
163+
variables [no_zero_divisors R]
164164

165165
lemma mirror_mul_of_domain : (p * q).mirror = p.mirror * q.mirror :=
166166
begin
@@ -181,7 +181,7 @@ end ring
181181

182182
section comm_ring
183183

184-
variables {R : Type*} [comm_ring R] [is_domain R] {f : R[X]}
184+
variables {R : Type*} [comm_ring R] [no_zero_divisors R] {f : R[X]}
185185

186186
lemma irreducible_of_mirror (h1 : ¬ is_unit f)
187187
(h2 : ∀ k, f * f.mirror = k * k.mirror → k = f ∨ k = -f ∨ k = f.mirror ∨ k = -f.mirror)

src/data/polynomial/ring_division.lean

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,17 @@ by rw [← with_bot.coe_eq_coe, ← degree_eq_nat_degree (mul_ne_zero hp hq),
110110
with_bot.coe_add, ← degree_eq_nat_degree hp,
111111
← degree_eq_nat_degree hq, degree_mul]
112112

113+
lemma trailing_degree_mul : (p * q).trailing_degree = p.trailing_degree + q.trailing_degree :=
114+
begin
115+
by_cases hp : p = 0,
116+
{ rw [hp, zero_mul, trailing_degree_zero, top_add] },
117+
by_cases hq : q = 0,
118+
{ rw [hq, mul_zero, trailing_degree_zero, add_top] },
119+
rw [trailing_degree_eq_nat_trailing_degree hp, trailing_degree_eq_nat_trailing_degree hq,
120+
trailing_degree_eq_nat_trailing_degree (mul_ne_zero hp hq),
121+
nat_trailing_degree_mul hp hq, with_top.coe_add],
122+
end
123+
113124
@[simp] lemma nat_degree_pow (p : R[X]) (n : ℕ) :
114125
nat_degree (p ^ n) = n * nat_degree p :=
115126
if hp0 : p = 0
@@ -161,16 +172,6 @@ instance : is_domain R[X] :=
161172
{ ..polynomial.no_zero_divisors,
162173
..polynomial.nontrivial, }
163174

164-
lemma nat_trailing_degree_mul (hp : p ≠ 0) (hq : q ≠ 0) :
165-
(p * q).nat_trailing_degree = p.nat_trailing_degree + q.nat_trailing_degree :=
166-
begin
167-
simp only [←tsub_eq_of_eq_add_rev (nat_degree_eq_reverse_nat_degree_add_nat_trailing_degree _)],
168-
rw [reverse_mul_of_domain, nat_degree_mul hp hq, nat_degree_mul (mt reverse_eq_zero.mp hp)
169-
(mt reverse_eq_zero.mp hq), reverse_nat_degree, reverse_nat_degree, tsub_add_eq_tsub_tsub,
170-
nat.add_comm, add_tsub_assoc_of_le (nat.sub_le _ _), add_comm,
171-
add_tsub_assoc_of_le (nat.sub_le _ _)],
172-
end
173-
174175
end ring
175176

176177
section comm_ring

0 commit comments

Comments
 (0)