mathlib documentation

data.​polynomial.​div

data.​polynomial.​div

Division of univariate polynomials

The main defs are div_by_monic and mod_by_monic. The compatibility between these is given by mod_by_monic_add_div. We also define root_multiplicity.

The coercion turning a polynomial into the function which reports the coefficient of a given monomial X^n

Equations
theorem polynomial.​apply_eq_coeff {R : Type u} {n : ℕ} [semiring R] {p : polynomial R} :
⇑p n = p.coeff n

def polynomial.​div_X {R : Type u} [semiring R] :

div_X p return a polynomial q such that q * X + C (p.coeff 0) = p. It can be used in a semiring where the usual division algorithm is not possible

Equations
@[simp]
theorem polynomial.​div_X_C {R : Type u} [semiring R] (a : R) :

theorem polynomial.​div_X_eq_zero_iff {R : Type u} [semiring R] {p : polynomial R} :

theorem polynomial.​div_X_add {R : Type u} [semiring R] {p q : polynomial R} :
(p + q).div_X = p.div_X + q.div_X

theorem polynomial.​degree_div_X_lt {R : Type u} [semiring R] {p : polynomial R} :
p ≠ 0 → p.div_X.degree < p.degree

def polynomial.​rec_on_horner {R : Type u} [semiring R] {M : polynomial R → Sort u_1} (p : polynomial R) :
M 0 → (Π (p : polynomial R) (a : R), p.coeff 0 = 0 → a ≠ 0 → M p → M (p + ⇑polynomial.C a)) → (Π (p : polynomial R), p ≠ 0 → M p → M (p * polynomial.X)) → M p

An induction principle for polynomials, valued in Sort* instead of Prop.

Equations
theorem polynomial.​degree_pos_induction_on {R : Type u} [semiring R] {P : polynomial R → Prop} (p : polynomial R) :
0 < p.degree → (∀ {a : R}, a ≠ 0 → P (⇑polynomial.C a * polynomial.X)) → (∀ {p : polynomial R}, 0 < p.degree → P p → P (p * polynomial.X)) → (∀ {p : polynomial R} {a : R}, 0 < p.degree → P p → P (p + ⇑polynomial.C a)) → P p

theorem polynomial.​X_dvd_iff {α : Type u} [comm_semiring α] {f : polynomial α} :

def polynomial.​div_mod_by_monic_aux {R : Type u} [ring R] (p : polynomial R) {q : polynomial R} :

See div_by_monic.

Equations
def polynomial.​div_by_monic {R : Type u} [ring R] :

div_by_monic gives the quotient of p by a monic polynomial q.

Equations
def polynomial.​mod_by_monic {R : Type u} [ring R] :

mod_by_monic gives the remainder of p by a monic polynomial q.

Equations
theorem polynomial.​degree_mod_by_monic_lt {R : Type u} [ring R] (p : polynomial R) {q : polynomial R} :
q.monic → q ≠ 0 → (p %ₘ q).degree < q.degree

@[simp]
theorem polynomial.​zero_mod_by_monic {R : Type u} [ring R] (p : polynomial R) :
0 %ₘ p = 0

@[simp]
theorem polynomial.​zero_div_by_monic {R : Type u} [ring R] (p : polynomial R) :
0 /ₘ p = 0

@[simp]
theorem polynomial.​mod_by_monic_zero {R : Type u} [ring R] (p : polynomial R) :
p %ₘ 0 = p

@[simp]
theorem polynomial.​div_by_monic_zero {R : Type u} [ring R] (p : polynomial R) :
p /ₘ 0 = 0

theorem polynomial.​div_by_monic_eq_of_not_monic {R : Type u} [ring R] {q : polynomial R} (p : polynomial R) :
¬q.monic → p /ₘ q = 0

theorem polynomial.​mod_by_monic_eq_of_not_monic {R : Type u} [ring R] {q : polynomial R} (p : polynomial R) :
¬q.monic → p %ₘ q = p

theorem polynomial.​mod_by_monic_eq_self_iff {R : Type u} [ring R] {p q : polynomial R} :
q.monic → q ≠ 0 → (p %ₘ q = p ↔ p.degree < q.degree)

theorem polynomial.​degree_mod_by_monic_le {R : Type u} [ring R] (p : polynomial R) {q : polynomial R} :
q.monic → (p %ₘ q).degree ≤ q.degree

theorem polynomial.​mod_by_monic_eq_sub_mul_div {R : Type u} [comm_ring R] (p : polynomial R) {q : polynomial R} :
q.monic → p %ₘ q = p - q * (p /ₘ q)

theorem polynomial.​mod_by_monic_add_div {R : Type u} [comm_ring R] (p : polynomial R) {q : polynomial R} :
q.monic → p %ₘ q + q * (p /ₘ q) = p

theorem polynomial.​div_by_monic_eq_zero_iff {R : Type u} [comm_ring R] {p q : polynomial R} :
q.monic → q ≠ 0 → (p /ₘ q = 0 ↔ p.degree < q.degree)

theorem polynomial.​degree_add_div_by_monic {R : Type u} [comm_ring R] {p q : polynomial R} :
q.monic → q.degree ≤ p.degree → q.degree + (p /ₘ q).degree = p.degree

theorem polynomial.​degree_div_by_monic_le {R : Type u} [comm_ring R] (p q : polynomial R) :

theorem polynomial.​degree_div_by_monic_lt {R : Type u} [comm_ring R] (p : polynomial R) {q : polynomial R} :
q.monic → p ≠ 0 → 0 < q.degree → (p /ₘ q).degree < p.degree

theorem polynomial.​div_mod_by_monic_unique {R : Type u} [comm_ring R] {f g : polynomial R} (q r : polynomial R) :
g.monic → r + g * q = f ∧ r.degree < g.degree → f /ₘ g = q ∧ f %ₘ g = r

theorem polynomial.​map_mod_div_by_monic {R : Type u} {S : Type v} [comm_ring R] {p q : polynomial R} [comm_ring S] (f : R →+* S) :

theorem polynomial.​map_div_by_monic {R : Type u} {S : Type v} [comm_ring R] {p q : polynomial R} [comm_ring S] (f : R →+* S) :

theorem polynomial.​map_mod_by_monic {R : Type u} {S : Type v} [comm_ring R] {p q : polynomial R} [comm_ring S] (f : R →+* S) :

theorem polynomial.​dvd_iff_mod_by_monic_eq_zero {R : Type u} [comm_ring R] {p q : polynomial R} :
q.monic → (p %ₘ q = 0 ↔ q ∣ p)

theorem polynomial.​map_dvd_map {R : Type u} {S : Type v} [comm_ring R] [comm_ring S] (f : R →+* S) (hf : function.injective ⇑f) {x y : polynomial R} :

@[simp]
theorem polynomial.​mod_by_monic_one {R : Type u} [comm_ring R] (p : polynomial R) :
p %ₘ 1 = 0

@[simp]
theorem polynomial.​div_by_monic_one {R : Type u} [comm_ring R] (p : polynomial R) :
p /ₘ 1 = p

def polynomial.​decidable_dvd_monic {R : Type u} [comm_ring R] {q : polynomial R} (p : polynomial R) :
q.monic → decidable (q ∣ p)

An algorithm for deciding polynomial divisibility. The algorithm is "compute p %ₘ q and compare to 0". Seepolynomial.mod_by_monicfor the algorithm that computes%ₘ`.

Equations
def polynomial.​root_multiplicity {R : Type u} [comm_ring R] :
R → polynomial R → ℕ

The largest power of X - C a which divides p. This is computable via the divisibility algorithm decidable_dvd_monic.

Equations
theorem polynomial.​root_multiplicity_eq_multiplicity {R : Type u} [comm_ring R] (p : polynomial R) (a : R) :
polynomial.root_multiplicity a p = dite (p = 0) (λ (h0 : p = 0), 0) (λ (h0 : ¬p = 0), (multiplicity (polynomial.X - ⇑polynomial.C a) p).get _)