Theory of monic polynomials #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
We give several tools for proving that polynomials are monic, e.g.
monic.mul, monic.map, monic.pow.
    
theorem
polynomial.monic.as_sum
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic) :
p = polynomial.X ^ p.nat_degree + (finset.range p.nat_degree).sum (λ (i : ℕ), ⇑polynomial.C (p.coeff i) * polynomial.X ^ i)
    
theorem
polynomial.ne_zero_of_ne_zero_of_monic
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p ≠ 0)
    (hq : q.monic) :
q ≠ 0
    
theorem
polynomial.monic.map
    {R : Type u}
    {S : Type v}
    [semiring R]
    {p : polynomial R}
    [semiring S]
    (f : R →+* S)
    (hp : p.monic) :
(polynomial.map f p).monic
    
theorem
polynomial.monic_C_mul_of_mul_leading_coeff_eq_one
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    {b : R}
    (hp : b * p.leading_coeff = 1) :
(⇑polynomial.C b * p).monic
    
theorem
polynomial.monic_mul_C_of_leading_coeff_mul_eq_one
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    {b : R}
    (hp : p.leading_coeff * b = 1) :
(p * ⇑polynomial.C b).monic
    
theorem
polynomial.monic_X_pow_add
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    {n : ℕ}
    (H : p.degree ≤ ↑n) :
(polynomial.X ^ (n + 1) + p).monic
    
theorem
polynomial.monic.mul
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p.monic)
    (hq : q.monic) :
    
theorem
polynomial.monic.of_mul_monic_left
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p.monic)
    (hpq : (p * q).monic) :
q.monic
    
theorem
polynomial.monic.of_mul_monic_right
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hq : q.monic)
    (hpq : (p * q).monic) :
p.monic
@[simp]
    
theorem
polynomial.monic.nat_degree_eq_zero_iff_eq_one
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic) :
p.nat_degree = 0 ↔ p = 1
@[simp]
    
theorem
polynomial.monic.degree_le_zero_iff_eq_one
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic) :
    
theorem
polynomial.monic.nat_degree_mul
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p.monic)
    (hq : q.monic) :
(p * q).nat_degree = p.nat_degree + q.nat_degree
    
theorem
polynomial.monic.degree_mul_comm
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic)
    (q : polynomial R) :
    
theorem
polynomial.monic.nat_degree_mul'
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p.monic)
    (hq : q ≠ 0) :
(p * q).nat_degree = p.nat_degree + q.nat_degree
    
theorem
polynomial.monic.nat_degree_mul_comm
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic)
    (q : polynomial R) :
(p * q).nat_degree = (q * p).nat_degree
    
theorem
polynomial.monic.not_dvd_of_nat_degree_lt
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p.monic)
    (h0 : q ≠ 0)
    (hl : q.nat_degree < p.nat_degree) :
    
theorem
polynomial.monic.next_coeff_mul
    {R : Type u}
    [semiring R]
    {p q : polynomial R}
    (hp : p.monic)
    (hq : q.monic) :
(p * q).next_coeff = p.next_coeff + q.next_coeff
    
theorem
polynomial.monic.eq_one_of_map_eq_one
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    {S : Type u_1}
    [semiring S]
    [nontrivial S]
    (f : R →+* S)
    (hp : p.monic)
    (map_eq : polynomial.map f p = 1) :
p = 1
    
theorem
polynomial.monic.nat_degree_pow
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic)
    (n : ℕ) :
(p ^ n).nat_degree = n * p.nat_degree
@[simp]
    
theorem
polynomial.nat_degree_pow_X_add_C
    {R : Type u}
    [semiring R]
    [nontrivial R]
    (n : ℕ)
    (r : R) :
((polynomial.X + ⇑polynomial.C r) ^ n).nat_degree = n
    
theorem
polynomial.monic.eq_one_of_is_unit
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hm : p.monic)
    (hpu : is_unit p) :
p = 1
    
theorem
polynomial.monic_multiset_prod_of_monic
    {R : Type u}
    {ι : Type y}
    [comm_semiring R]
    (t : multiset ι)
    (f : ι → polynomial R)
    (ht : ∀ (i : ι), i ∈ t → (f i).monic) :
(multiset.map f t).prod.monic
    
theorem
polynomial.monic_prod_of_monic
    {R : Type u}
    {ι : Type y}
    [comm_semiring R]
    (s : finset ι)
    (f : ι → polynomial R)
    (hs : ∀ (i : ι), i ∈ s → (f i).monic) :
    
theorem
polynomial.monic.next_coeff_multiset_prod
    {R : Type u}
    {ι : Type y}
    [comm_semiring R]
    (t : multiset ι)
    (f : ι → polynomial R)
    (h : ∀ (i : ι), i ∈ t → (f i).monic) :
(multiset.map f t).prod.next_coeff = (multiset.map (λ (i : ι), (f i).next_coeff) t).sum
    
theorem
polynomial.monic.next_coeff_prod
    {R : Type u}
    {ι : Type y}
    [comm_semiring R]
    (s : finset ι)
    (f : ι → polynomial R)
    (h : ∀ (i : ι), i ∈ s → (f i).monic) :
(s.prod (λ (i : ι), f i)).next_coeff = s.sum (λ (i : ι), (f i).next_coeff)
@[simp]
    
theorem
polynomial.monic.nat_degree_map
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    [nontrivial S]
    {P : polynomial R}
    (hmo : P.monic)
    (f : R →+* S) :
(polynomial.map f P).nat_degree = P.nat_degree
@[simp]
    
theorem
polynomial.monic.degree_map
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    [nontrivial S]
    {P : polynomial R}
    (hmo : P.monic)
    (f : R →+* S) :
(polynomial.map f P).degree = P.degree
    
theorem
polynomial.degree_map_eq_of_injective
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    (p : polynomial R) :
(polynomial.map f p).degree = p.degree
    
theorem
polynomial.nat_degree_map_eq_of_injective
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    (p : polynomial R) :
(polynomial.map f p).nat_degree = p.nat_degree
    
theorem
polynomial.leading_coeff_map'
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    (p : polynomial R) :
(polynomial.map f p).leading_coeff = ⇑f p.leading_coeff
    
theorem
polynomial.next_coeff_map
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    (p : polynomial R) :
(polynomial.map f p).next_coeff = ⇑f p.next_coeff
    
theorem
polynomial.leading_coeff_of_injective
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    (p : polynomial R) :
(polynomial.map f p).leading_coeff = ⇑f p.leading_coeff
    
theorem
polynomial.monic_of_injective
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    {p : polynomial R}
    (hp : (polynomial.map f p).monic) :
p.monic
    
theorem
function.injective.monic_map_iff
    {R : Type u}
    {S : Type v}
    [semiring R]
    [semiring S]
    {f : R →+* S}
    (hf : function.injective ⇑f)
    {p : polynomial R} :
p.monic ↔ (polynomial.map f p).monic
    
theorem
polynomial.monic_X_pow_sub
    {R : Type u}
    [ring R]
    {p : polynomial R}
    {n : ℕ}
    (H : p.degree ≤ ↑n) :
(polynomial.X ^ (n + 1) - p).monic
    
theorem
polynomial.monic_X_pow_sub_C
    {R : Type u}
    [ring R]
    (a : R)
    {n : ℕ}
    (h : n ≠ 0) :
(polynomial.X ^ n - ⇑polynomial.C a).monic
X ^ n - a is monic.
    
theorem
polynomial.not_is_unit_X_pow_sub_one
    (R : Type u_1)
    [comm_ring R]
    [nontrivial R]
    (n : ℕ) :
¬is_unit (polynomial.X ^ n - 1)
    
theorem
polynomial.monic.sub_of_right
    {R : Type u}
    [ring R]
    {p q : polynomial R}
    (hq : q.leading_coeff = -1)
    (hpq : p.degree < q.degree) :
@[simp]
    
theorem
polynomial.monic.mul_left_ne_zero
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic)
    {q : polynomial R}
    (hq : q ≠ 0) :
    
theorem
polynomial.monic.mul_right_ne_zero
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (hp : p.monic)
    {q : polynomial R}
    (hq : q ≠ 0) :
    
theorem
polynomial.monic.mul_nat_degree_lt_iff
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (h : p.monic)
    {q : polynomial R} :
(p * q).nat_degree < p.nat_degree ↔ p ≠ 1 ∧ q = 0
    
theorem
polynomial.monic.mul_right_eq_zero_iff
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (h : p.monic)
    {q : polynomial R} :
    
theorem
polynomial.monic.mul_left_eq_zero_iff
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (h : p.monic)
    {q : polynomial R} :
    
theorem
polynomial.degree_smul_of_smul_regular
    {R : Type u}
    [semiring R]
    {S : Type u_1}
    [monoid S]
    [distrib_mul_action S R]
    {k : S}
    (p : polynomial R)
    (h : is_smul_regular R k) :
    
theorem
polynomial.nat_degree_smul_of_smul_regular
    {R : Type u}
    [semiring R]
    {S : Type u_1}
    [monoid S]
    [distrib_mul_action S R]
    {k : S}
    (p : polynomial R)
    (h : is_smul_regular R k) :
(k • p).nat_degree = p.nat_degree
    
theorem
polynomial.leading_coeff_smul_of_smul_regular
    {R : Type u}
    [semiring R]
    {S : Type u_1}
    [monoid S]
    [distrib_mul_action S R]
    {k : S}
    (p : polynomial R)
    (h : is_smul_regular R k) :
(k • p).leading_coeff = k • p.leading_coeff
    
theorem
polynomial.monic_of_is_unit_leading_coeff_inv_smul
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (h : is_unit p.leading_coeff) :
    
theorem
polynomial.is_unit_leading_coeff_mul_right_eq_zero_iff
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (h : is_unit p.leading_coeff)
    {q : polynomial R} :
    
theorem
polynomial.is_unit_leading_coeff_mul_left_eq_zero_iff
    {R : Type u}
    [semiring R]
    {p : polynomial R}
    (h : is_unit p.leading_coeff)
    {q : polynomial R} :