Skip to content

Commit 8fd5c88

Browse files
committed
chore: golf Polynomial.degree_mul_le (#6263)
And other similar lemmas With thanks to @adomani for adding these lemmas.
1 parent 444b9f3 commit 8fd5c88

3 files changed

Lines changed: 13 additions & 39 deletions

File tree

Mathlib/Data/MvPolynomial/Variables.lean

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Johannes Hölzl, Johan Commelin, Mario Carneiro
55
-/
6+
import Mathlib.Algebra.MonoidAlgebra.Degree
67
import Mathlib.Algebra.BigOperators.Order
78
import Mathlib.Data.MvPolynomial.Rename
89

@@ -640,13 +641,7 @@ set_option linter.uppercaseLean3 false in
640641

641642
theorem totalDegree_add (a b : MvPolynomial σ R) :
642643
(a + b).totalDegree ≤ max a.totalDegree b.totalDegree :=
643-
Finset.sup_le fun n hn => by
644-
classical
645-
have := Finsupp.support_add hn
646-
rw [Finset.mem_union] at this
647-
cases' this with h h
648-
· exact le_max_of_le_left (le_totalDegree h)
649-
· exact le_max_of_le_right (le_totalDegree h)
644+
AddMonoidAlgebra.sup_support_add_le _ _ _
650645
#align mv_polynomial.total_degree_add MvPolynomial.totalDegree_add
651646

652647
theorem totalDegree_add_eq_left_of_totalDegree_lt {p q : MvPolynomial σ R}
@@ -679,18 +674,8 @@ theorem totalDegree_add_eq_right_of_totalDegree_lt {p q : MvPolynomial σ R}
679674

680675
theorem totalDegree_mul (a b : MvPolynomial σ R) :
681676
(a * b).totalDegree ≤ a.totalDegree + b.totalDegree :=
682-
Finset.sup_le fun n hn => by
683-
classical
684-
have := AddMonoidAlgebra.support_mul a b hn
685-
simp only [Finset.mem_biUnion, Finset.mem_singleton] at this
686-
rcases this with ⟨a₁, h₁, a₂, h₂, rfl⟩
687-
rw [Finsupp.sum_add_index']
688-
· dsimp [totalDegree]
689-
exact add_le_add (le_totalDegree h₁) (le_totalDegree h₂)
690-
· intro _
691-
rfl
692-
· intro _ b₁ b₂
693-
rfl
677+
AddMonoidAlgebra.sup_support_mul_le
678+
(by exact (Finsupp.sum_add_index' (fun _ => rfl) (fun _ _ _ => rfl)).le) _ _
694679
#align mv_polynomial.total_degree_mul MvPolynomial.totalDegree_mul
695680

696681
theorem totalDegree_smul_le [CommSemiring S] [DistribMulAction R S] (a : R) (f : MvPolynomial σ S) :

Mathlib/Data/Polynomial/Basic.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,8 @@ def support : R[X] → Finset ℕ
392392
theorem support_ofFinsupp (p) : support (⟨p⟩ : R[X]) = p.support := by rw [support]
393393
#align polynomial.support_of_finsupp Polynomial.support_ofFinsupp
394394

395+
theorem support_toFinsupp (p : R[X]) : p.toFinsupp.support = p.support := by rw [support]
396+
395397
@[simp]
396398
theorem support_zero : (0 : R[X]).support = ∅ :=
397399
rfl

Mathlib/Data/Polynomial/Degree/Definitions.lean

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Copyright (c) 2018 Chris Hughes. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Chris Hughes, Johannes Hölzl, Scott Morrison, Jens Wagemaker
55
-/
6+
import Mathlib.Algebra.MonoidAlgebra.Degree
67
import Mathlib.Data.Fintype.BigOperators
78
import Mathlib.Data.Nat.WithBot
89
import Mathlib.Data.Polynomial.Monomial
@@ -626,11 +627,9 @@ theorem degree_le_zero_iff : degree p ≤ 0 ↔ p = C (coeff p 0) :=
626627
⟨eq_C_of_degree_le_zero, fun h => h.symm ▸ degree_C_le⟩
627628
#align polynomial.degree_le_zero_iff Polynomial.degree_le_zero_iff
628629

629-
theorem degree_add_le (p q : R[X]) : degree (p + q) ≤ max (degree p) (degree q) :=
630-
calc
631-
degree (p + q) = (p + q).support.sup WithBot.some := rfl
632-
_ ≤ (p.support ∪ q.support).sup WithBot.some := (sup_mono support_add)
633-
_ = p.support.sup WithBot.some ⊔ q.support.sup WithBot.some := sup_union
630+
theorem degree_add_le (p q : R[X]) : degree (p + q) ≤ max (degree p) (degree q) := by
631+
simpa only [degree, ←support_toFinsupp, toFinsupp_add]
632+
using AddMonoidAlgebra.sup_support_add_le _ _ _
634633
#align polynomial.degree_add_le Polynomial.degree_add_le
635634

636635
theorem degree_add_le_of_degree_le {p q : R[X]} {n : ℕ} (hp : degree p ≤ n) (hq : degree q ≤ n) :
@@ -776,21 +775,9 @@ theorem degree_sum_le (s : Finset ι) (f : ι → R[X]) :
776775
_ ≤ _ := by rw [sup_insert, sup_eq_max]; exact max_le_max le_rfl ih
777776
#align polynomial.degree_sum_le Polynomial.degree_sum_le
778777

779-
theorem degree_mul_le (p q : R[X]) : degree (p * q) ≤ degree p + degree q :=
780-
calc
781-
degree (p * q) ≤
782-
p.support.sup fun i => degree (sum q fun j a => C (coeff p i * a) * X ^ (i + j)) := by
783-
-- Porting note: Was `simp only [..]; convert ..; exact mul_eq_sum_sum`.
784-
simp only [← C_mul_X_pow_eq_monomial.symm, mul_eq_sum_sum (p := p) (q := q)]
785-
exact degree_sum_le _ _
786-
_ ≤ p.support.sup fun i => q.support.sup fun j =>
787-
degree (C (coeff p i * coeff q j) * X ^ (i + j)) :=
788-
(Finset.sup_mono_fun fun i _hi => degree_sum_le _ _)
789-
_ ≤ degree p + degree q := by
790-
refine Finset.sup_le fun a ha ↦ Finset.sup_le fun b hb ↦ (degree_C_mul_X_pow_le _ _).trans ?_
791-
rw [Nat.cast_add]
792-
rw [mem_support_iff] at ha hb
793-
exact add_le_add (le_degree_of_ne_zero ha) (le_degree_of_ne_zero hb)
778+
theorem degree_mul_le (p q : R[X]) : degree (p * q) ≤ degree p + degree q := by
779+
simpa only [degree, ←support_toFinsupp, toFinsupp_mul]
780+
using AddMonoidAlgebra.sup_support_mul_le (WithBot.coe_add _ _).le _ _
794781
#align polynomial.degree_mul_le Polynomial.degree_mul_le
795782

796783
theorem degree_mul_le_of_le {a b : WithBot ℕ} (hp : degree p ≤ a) (hq : degree q ≤ b) :

0 commit comments

Comments
 (0)