Skip to content

Commit 588a751

Browse files
committed
feat(Algebra/Polynomial): misc lemma about mod (#31634)
Added the following - `degree_mod_lt`, `add_mod`, `sub_mod`, `mod_eq_of_dvd_sub`: corresponding to existing lemma on `modByMonic` - `mul_mod`, `mul_modByMonic`: similar to [Nat.mul_mod](https://leanprover-community.github.io/mathlib4_docs/Init/Data/Nat/Lemmas.html#Nat.mul_mod)
1 parent 8d63eaa commit 588a751

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

Mathlib/Algebra/Polynomial/Div.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,17 @@ lemma neg_modByMonic (p q : R[X]) : (-p) %ₘ q = - (p %ₘ q) := by
667667
lemma sub_modByMonic (p₁ p₂ q : R[X]) : (p₁ - p₂) %ₘ q = p₁ %ₘ q - p₂ %ₘ q := by
668668
simp [sub_eq_add_neg, add_modByMonic, neg_modByMonic]
669669

670+
lemma mul_modByMonic (p₁ p₂ q : R[X]) : (p₁ * p₂) %ₘ q = (p₁ %ₘ q) * (p₂ %ₘ q) %ₘ q := by
671+
by_cases! h : ¬ q.Monic
672+
· simp [Polynomial.modByMonic_eq_of_not_monic _ h]
673+
apply Polynomial.modByMonic_eq_of_dvd_sub h
674+
have : p₁ * p₂ - p₁ %ₘ q * (p₂ %ₘ q) = (p₁ %ₘ q) * (p₂ - p₂ %ₘ q) + p₂ * (p₁ - p₁ %ₘ q) := by ring
675+
rw [this]
676+
apply dvd_add
677+
all_goals
678+
· apply dvd_mul_of_dvd_right
679+
simp [Polynomial.modByMonic_eq_sub_mul_div _ h]
680+
670681
lemma eval_divByMonic_eq_trailingCoeff_comp {p : R[X]} {t : R} :
671682
(p /ₘ (X - C t) ^ p.rootMultiplicity t).eval t = (p.comp (X + C t)).trailingCoeff := by
672683
obtain rfl | hp := eq_or_ne p 0

Mathlib/Algebra/Polynomial/FieldDivision.lean

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,21 @@ lemma natDegree_mod_lt [Field k] (p : k[X]) {q : k[X]} (hq : q.natDegree ≠ 0)
429429
simp [hq]
430430
· exact natDegree_mul_C_le q q.leadingCoeff⁻¹
431431

432+
theorem degree_mod_lt (p : R[X]) {q : R[X]} (hq : q ≠ 0) : (p % q).degree < q.degree := by
433+
rw [Polynomial.mod_def]
434+
refine (Polynomial.degree_modByMonic_lt p ?_).trans_eq (by simp)
435+
simp [Polynomial.Monic.def, hq]
436+
437+
theorem add_mod (p₁ p₂ q : R[X]) : (p₁ + p₂) % q = p₁ % q + p₂ % q := by
438+
simp [Polynomial.mod_def, Polynomial.add_modByMonic]
439+
440+
theorem sub_mod (p₁ p₂ q : R[X]) : (p₁ - p₂) % q = p₁ % q - p₂ % q := by
441+
simp [Polynomial.mod_def, Polynomial.sub_modByMonic]
442+
443+
theorem mul_mod (p₁ p₂ q : R[X]) : (p₁ * p₂) % q = (p₁ % q) * (p₂ % q) % q := by
444+
simp_rw [Polynomial.mod_def]
445+
apply Polynomial.mul_modByMonic
446+
432447
section
433448

434449
open EuclideanDomain
@@ -705,6 +720,14 @@ theorem monic_mapAlg_iff [Semiring S] [Nontrivial S] [Algebra R S] {p : R[X]} :
705720
(mapAlg R S p).Monic ↔ p.Monic := by
706721
simp [mapAlg_eq_map, monic_map_iff]
707722

723+
theorem mod_eq_of_dvd_sub {p₁ p₂ q : R[X]} (h : q ∣ p₁ - p₂) : p₁ % q = p₂ % q := by
724+
obtain rfl | hq := eq_or_ne q 0
725+
· simpa [sub_eq_zero] using h
726+
simp_rw [Polynomial.mod_def]
727+
apply Polynomial.modByMonic_eq_of_dvd_sub (by simp [Polynomial.Monic.def, hq])
728+
rw [mul_comm]
729+
exact (Polynomial.C_mul_dvd (by simpa using hq)).mpr h
730+
708731
end Field
709732

710733
end Polynomial

0 commit comments

Comments
 (0)