Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions Mathlib/RingTheory/MvPolynomial/MonomialOrder.lean
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,13 @@ theorem leadingCoeff_pow_of_pow_leadingCoeff_ne_zero {f : MvPolynomial σ R} {n
m.leadingCoeff (f ^ n) = m.leadingCoeff f ^ n := by
rw [leadingCoeff, degree_pow_of_pow_leadingCoeff_ne_zero hf, coeff_pow_nsmul_degree]

/-- Leading term of powers -/
theorem leadingTerm_pow_of_pow_leadingCoeff_ne_zero {f : MvPolynomial σ R} {n : ℕ}
(hf : m.leadingCoeff f ^ n ≠ 0) :
m.leadingTerm (f ^ n) = m.leadingTerm f ^ n := by
simp [leadingTerm, hf, degree_pow_of_pow_leadingCoeff_ne_zero,
leadingCoeff_pow_of_pow_leadingCoeff_ne_zero, monomial_pow]

protected theorem Monic.pow {f : MvPolynomial σ R} {n : ℕ} (hf : m.Monic f) :
m.Monic (f ^ n) := by
nontriviality R
Expand All @@ -590,6 +597,11 @@ theorem leadingCoeff_pow [IsReduced R] (f : MvPolynomial σ R) (n : ℕ) :
m.leadingCoeff (f ^ n) = m.leadingCoeff f ^ n := by
rw [leadingCoeff, degree_pow, coeff_pow_nsmul_degree]

/-- Leading term of powers (in a reduced ring) -/
theorem leadingTerm_pow [IsReduced R] (f : MvPolynomial σ R) (n : ℕ) :
m.leadingTerm (f ^ n) = m.leadingTerm f ^ n := by
simp [leadingTerm, degree_pow, leadingCoeff_pow, monomial_pow]

theorem degree_smul_le {r : R} {f : MvPolynomial σ R} :
m.degree (r • f) ≼[m] m.degree f := by
rw [smul_eq_C_mul]
Expand Down Expand Up @@ -713,6 +725,14 @@ lemma leadingTerm_eq_zero_iff (p : MvPolynomial σ R) : m.leadingTerm p = 0 ↔
lemma leadingTerm_zero : m.leadingTerm (0 : MvPolynomial σ R) = 0 := by
rw [leadingTerm_eq_zero_iff]

@[simp]
lemma leadingTerm_one : m.leadingTerm (1 : MvPolynomial σ R) = 1 := by
simp [leadingTerm]

@[simp]
lemma leadingTerm_subsingleton [Subsingleton R] {f : MvPolynomial σ R} : m.leadingTerm f = f := by
simp [leadingTerm, (m.degree_eq_zero_iff.mp degree_subsingleton).symm]

/--
The set of leading terms of non-zero polynomials within a set `B` is equal to the set of
leading terms of all polynomials within `B`, excluding zero.
Expand Down Expand Up @@ -758,6 +778,10 @@ lemma leadingTerm_monomial (s : σ →₀ ℕ) (c : R) :
classical
by_cases h : c = 0 <;> simp [leadingTerm, degree_monomial, h]

@[simp]
lemma leadingTerm_X {s : σ} : m.leadingTerm (X s : MvPolynomial σ R) = X s := by
simp [X]

@[simp]
lemma degree_leadingTerm_mul [NoZeroDivisors R] (p q : MvPolynomial σ R) :
m.degree (m.leadingTerm p * q) = m.degree (p * q) := by
Expand Down Expand Up @@ -810,13 +834,67 @@ lemma leadingTerm_eq_leadingTerm_iff {p q : MvPolynomial σ R} :
rw [leadingTerm, leadingTerm, monomial_eq_monomial_iff]
aesop

/-- Multiplicativity of leading terms -/
theorem leadingTerm_mul_of_mul_leadingCoeff_ne_zero {f g : MvPolynomial σ R}
(hfg : m.leadingCoeff f * m.leadingCoeff g ≠ 0) :
m.leadingTerm (f * g) = m.leadingTerm f * m.leadingTerm g := by
simp [leadingTerm, hfg, leadingCoeff_mul_of_mul_leadingCoeff_ne_zero,
degree_mul_of_mul_leadingCoeff_ne_zero]

theorem leadingTerm_mul_of_left_mem_nonZeroDivisors {f g : MvPolynomial σ R}
(hf : m.leadingCoeff f ∈ R⁰) :
m.leadingTerm (f * g) = m.leadingTerm f * m.leadingTerm g := by
by_cases hg : g = 0
· simp [hg]
· simp [leadingTerm, hf, hg, leadingCoeff_mul_of_left_mem_nonZeroDivisors,
degree_mul_of_left_mem_nonZeroDivisors]

theorem leadingTerm_mul_of_right_mem_nonZeroDivisors {f g : MvPolynomial σ R}
(hg : m.leadingCoeff g ∈ R⁰) :
m.leadingTerm (f * g) = m.leadingTerm f * m.leadingTerm g := by
by_cases hf : f = 0
· simp [hf]
· simp [leadingTerm, hf, hg, leadingCoeff_mul_of_right_mem_nonZeroDivisors,
degree_mul_of_right_mem_nonZeroDivisors]

theorem leadingTerm_mul_of_isRegular_left {f g : MvPolynomial σ R}
(hf : IsRegular (m.leadingCoeff f)) :
m.leadingTerm (f * g) = m.leadingTerm f * m.leadingTerm g := by
by_cases hg : g = 0
· simp [hg]
· simp [leadingTerm, hf, hg, leadingCoeff_mul_of_isRegular_left, degree_mul_of_isRegular_left]

theorem leadingTerm_mul_of_isRegular_right {f g : MvPolynomial σ R}
(hg : IsRegular (m.leadingCoeff g)) :
m.leadingTerm (f * g) = m.leadingTerm f * m.leadingTerm g := by
by_cases hf : f = 0
· simp [hf]
· simp [leadingTerm, hf, hg, leadingCoeff_mul_of_isRegular_right, degree_mul_of_isRegular_right]

@[simp]
theorem leadingTerm_mul [NoZeroDivisors R] (p q : MvPolynomial σ R) :
m.leadingTerm (p * q) = m.leadingTerm p * m.leadingTerm q := by
by_cases! h0 : p * q = 0
· simp [h0, zero_eq_mul.mp]
simp [leadingTerm, m.degree_mul' h0]

theorem leadingTerm_prod_of_mem_nonZeroDivisors {ι : Type*}
{P : ι → MvPolynomial σ R} {s : Finset ι}
(H : ∀ i ∈ s, m.leadingCoeff (P i) ∈ R⁰) :
m.leadingTerm (∏ i ∈ s, P i) = ∏ i ∈ s, m.leadingTerm (P i) := by
simp [leadingTerm, degree_prod_of_mem_nonZeroDivisors H, monomial_sum_prod,
leadingCoeff_prod_of_mem_nonZeroDivisors H]

-- TODO : it suffices that all leading coefficients but one are regular
theorem leadingTerm_prod_of_regular {ι : Type*}
{P : ι → MvPolynomial σ R} {s : Finset ι} (H : ∀ i ∈ s, IsRegular (m.leadingCoeff (P i))) :
m.leadingTerm (∏ i ∈ s, P i) = ∏ i ∈ s, m.leadingTerm (P i) := by
simp [leadingTerm, degree_prod_of_regular H, leadingCoeff_prod_of_regular H, monomial_sum_prod]

theorem leadingTerm_add_of_lt {f g : MvPolynomial σ R} (h : m.degree g ≺[m] m.degree f) :
m.leadingTerm (f + g) = m.leadingTerm f := by
simp [leadingTerm, h, degree_add_of_lt, leadingCoeff_add_of_lt]

@[simp, nontriviality]
lemma monic_of_subsingleton [Subsingleton R] (p : MvPolynomial σ R) :
m.Monic p := by
Expand Down Expand Up @@ -899,6 +977,11 @@ theorem leadingCoeff_neg {f : MvPolynomial σ R} :
m.leadingCoeff (-f) = - m.leadingCoeff f := by
simp only [leadingCoeff, degree_neg, coeff_neg]

@[simp]
theorem leadingTerm_neg {f : MvPolynomial σ R} :
m.leadingTerm (-f) = - m.leadingTerm f := by
simp [leadingTerm]

theorem degree_sub_le {f g : MvPolynomial σ R} :
m.toSyn (m.degree (f - g)) ≤ m.toSyn (m.degree f) ⊔ m.toSyn (m.degree g) := by
rw [sub_eq_add_neg]
Expand All @@ -917,6 +1000,10 @@ theorem leadingCoeff_sub_of_lt {f g : MvPolynomial σ R} (h : m.degree g ≺[m]
apply leadingCoeff_add_of_lt
simp only [degree_neg, h]

theorem leadingTerm_sub_of_lt {f g : MvPolynomial σ R} (h : m.degree g ≺[m] m.degree f) :
m.leadingTerm (f - g) = m.leadingTerm f := by
simp [leadingTerm, h, degree_sub_of_lt, leadingCoeff_sub_of_lt]

theorem degree_sub_leadingTerm_le (f : MvPolynomial σ R) :
m.degree (f - m.leadingTerm f) ≼[m] m.degree f := by
apply le_trans degree_sub_le
Expand Down
Loading