Theory of monic polynomials #
We give several tools for proving that polynomials are monic, e.g.
Monic.mul, Monic.map, Monic.pow.
theorem
Polynomial.monic_zero_iff_subsingleton
{R : Type u}
[Semiring R]
:
Monic 0 โ Subsingleton R
theorem
Polynomial.monic_zero_iff_subsingleton'
{R : Type u}
[Semiring R]
:
Monic 0 โ (โ (f g : Polynomial R), f = g) โง โ (a b : R), a = b
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_leadingCoeff_eq_one
{R : Type u}
[Semiring R]
{p : Polynomial R}
{b : R}
(hp : b * p.leadingCoeff = 1)
:
theorem
Polynomial.monic_mul_C_of_leadingCoeff_mul_eq_one
{R : Type u}
[Semiring R]
{p : Polynomial R}
{b : R}
(hp : p.leadingCoeff * b = 1)
:
theorem
Polynomial.monic_X_pow_add
{R : Type u}
[Semiring R]
{p : Polynomial R}
{n : โ}
(H : p.degree < โn)
:
theorem
Polynomial.Monic.mul
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hq : q.Monic)
:
(p * q).Monic
theorem
Polynomial.Monic.pow
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
(n : โ)
:
(p ^ n).Monic
theorem
Polynomial.Monic.add_of_left
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hpq : q.degree < p.degree)
:
(p + q).Monic
theorem
Polynomial.Monic.add_of_right
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hq : q.Monic)
(hpq : p.degree < q.degree)
:
(p + 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
theorem
Polynomial.Monic.comp
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hq : q.Monic)
(h : q.natDegree โ 0)
:
theorem
Polynomial.Monic.comp_X_add_C
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
(r : R)
:
@[deprecated Polynomial.Monic.natDegree_eq_zero (since := "2025-10-26")]
theorem
Polynomial.Monic.natDegree_eq_zero_iff_eq_one
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hf : p.Monic)
:
p.natDegree = 0 โ p = 1
Alias of Polynomial.Monic.natDegree_eq_zero.
@[simp]
theorem
Polynomial.Monic.degree_le_zero_iff_eq_one
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
:
theorem
Polynomial.Monic.natDegree_mul
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hq : q.Monic)
:
theorem
Polynomial.Monic.degree_mul_comm
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
(q : Polynomial R)
:
theorem
Polynomial.Monic.natDegree_mul'
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hq : q โ 0)
:
theorem
Polynomial.Monic.natDegree_mul_comm
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
(q : Polynomial R)
:
theorem
Polynomial.Monic.not_dvd_of_natDegree_lt
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(h0 : q โ 0)
(hl : q.natDegree < p.natDegree)
:
ยฌp โฃ q
theorem
Polynomial.Monic.not_dvd_of_degree_lt
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(h0 : q โ 0)
(hl : q.degree < p.degree)
:
ยฌp โฃ q
theorem
Polynomial.Monic.nextCoeff_mul
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hq : q.Monic)
:
theorem
Polynomial.Monic.nextCoeff_pow
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
(n : โ)
:
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.natDegree_pow
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hp : p.Monic)
(n : โ)
:
@[simp]
theorem
Polynomial.natDegree_pow_X_add_C
{R : Type u}
[Semiring R]
[Nontrivial R]
(n : โ)
(r : R)
:
theorem
Polynomial.Monic.eq_one_of_isUnit
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hm : p.Monic)
(hpu : IsUnit p)
:
p = 1
theorem
Polynomial.Monic.isUnit_iff
{R : Type u}
[Semiring R]
{p : Polynomial R}
(hm : p.Monic)
:
IsUnit p โ p = 1
theorem
Polynomial.eq_of_monic_of_associated
{R : Type u}
[Semiring R]
{p q : Polynomial R}
(hp : p.Monic)
(hq : q.Monic)
(hpq : Associated p q)
:
p = q
@[reducible, inline]
The type of monic polynomials of degree n.
The implementation is slightly different because it is useful to still contain X ^ n when
R is trivial. See MonicDegreeEq.mk for the usual constructor.
Instances For
@[simp]
theorem
Polynomial.MonicDegreeEq.natDegree
{R : Type u}
{n : โ}
[Semiring R]
[Nontrivial R]
(p : MonicDegreeEq R n)
:
(โp).natDegree = n
@[simp]
theorem
Polynomial.MonicDegreeEq.degree
{R : Type u}
{n : โ}
[Semiring R]
[Nontrivial R]
(p : MonicDegreeEq R n)
:
(โp).degree = โn
theorem
Polynomial.MonicDegreeEq.monic
{R : Type u}
{n : โ}
[Semiring R]
(p : MonicDegreeEq R n)
:
(โp).Monic
theorem
Polynomial.MonicDegreeEq.coeff_of_ge
{R : Type u}
{n : โ}
[Semiring R]
(p : MonicDegreeEq R n)
(i : โ)
(hi : n โค i)
:
(โp).coeff i = if i = n then 1 else 0
def
Polynomial.MonicDegreeEq.mk
{R : Type u}
{n : โ}
[Semiring R]
(p : Polynomial R)
(hp : p.Monic)
(hp' : p.natDegree = n)
:
MonicDegreeEq R n
The constructor for MonicDegreeEq given a monic polynomial of degree n.
Instances For
@[simp]
theorem
Polynomial.MonicDegreeEq.mk_coe
{R : Type u}
{n : โ}
[Semiring R]
(p : Polynomial R)
(hp : p.Monic)
(hp' : p.natDegree = n)
:
โ(mk p hp hp') = p
noncomputable def
Polynomial.MonicDegreeEq.map
{R : Type u}
{S : Type v}
{n : โ}
[Semiring R]
[Semiring S]
(p : MonicDegreeEq R n)
(f : R โ+* S)
:
MonicDegreeEq S n
The image of a monic polynomial of degree n under a ring homomorphism.
Instances For
@[simp]
theorem
Polynomial.MonicDegreeEq.map_coe
{R : Type u}
{S : Type v}
{n : โ}
[Semiring R]
[Semiring S]
(p : MonicDegreeEq R n)
(f : R โ+* S)
:
โ(p.map f) = Polynomial.map f โp
theorem
Polynomial.monic_multiset_prod_of_monic
{R : Type u}
{ฮน : Type y}
[CommSemiring R]
(t : Multiset ฮน)
(f : ฮน โ Polynomial R)
(ht : โ i โ t, (f i).Monic)
:
(Multiset.map f t).prod.Monic
theorem
Polynomial.monic_prod_of_monic
{R : Type u}
{ฮน : Type y}
[CommSemiring R]
(s : Finset ฮน)
(f : ฮน โ Polynomial R)
(hs : โ i โ s, (f i).Monic)
:
(โ i โ s, f i).Monic
theorem
Polynomial.monic_finprod_of_monic
{R : Type u}
[CommSemiring R]
(ฮฑ : Type u_1)
(f : ฮฑ โ Polynomial R)
(hf : โ i โ Function.mulSupport f, (f i).Monic)
:
theorem
Polynomial.Monic.nextCoeff_multiset_prod
{R : Type u}
{ฮน : Type y}
[CommSemiring R]
(t : Multiset ฮน)
(f : ฮน โ Polynomial R)
(h : โ i โ t, (f i).Monic)
:
(Multiset.map f t).prod.nextCoeff = (Multiset.map (fun (i : ฮน) => (f i).nextCoeff) t).sum
theorem
Polynomial.Monic.nextCoeff_prod
{R : Type u}
{ฮน : Type y}
[CommSemiring R]
(s : Finset ฮน)
(f : ฮน โ Polynomial R)
(h : โ i โ s, (f i).Monic)
:
theorem
Polynomial.irreducible_of_monic
{R : Type u}
[CommSemiring R]
[NoZeroDivisors R]
{p : Polynomial R}
(hp : p.Monic)
(hp1 : p โ 1)
:
Irreducible p โ โ (f g : Polynomial R), f.Monic โ g.Monic โ f * g = p โ f = 1 โจ g = 1
theorem
Polynomial.Monic.irreducible_iff_natDegree
{R : Type u}
[CommSemiring R]
[NoZeroDivisors R]
{p : Polynomial R}
(hp : p.Monic)
:
Irreducible p โ p โ 1 โง โ (f g : Polynomial R), f.Monic โ g.Monic โ f * g = p โ f.natDegree = 0 โจ g.natDegree = 0
theorem
Polynomial.Monic.irreducible_iff_natDegree'
{R : Type u}
[CommSemiring R]
[NoZeroDivisors R]
{p : Polynomial R}
(hp : p.Monic)
:
Irreducible p โ p โ 1 โง โ (f g : Polynomial R), f.Monic โ g.Monic โ f * g = p โ g.natDegree โ Finset.Ioc 0 (p.natDegree / 2)
theorem
Polynomial.Monic.irreducible_iff_lt_natDegree_lt
{R : Type u}
[CommSemiring R]
[NoZeroDivisors R]
{p : Polynomial R}
(hp : p.Monic)
(hp1 : p โ 1)
:
Irreducible p โ โ (q : Polynomial R), q.Monic โ q.natDegree โ Finset.Ioc 0 (p.natDegree / 2) โ ยฌq โฃ p
Alternate phrasing of Polynomial.Monic.irreducible_iff_natDegree' where we only have to check
one divisor at a time.
theorem
Polynomial.Monic.not_irreducible_iff_exists_add_mul_eq_coeff
{R : Type u}
[CommSemiring R]
[NoZeroDivisors R]
{p : Polynomial R}
(hm : p.Monic)
(hnd : p.natDegree = 2)
:
ยฌIrreducible p โ โ (cโ : R) (cโ : R), p.coeff 0 = cโ * cโ โง p.coeff 1 = cโ + cโ
@[simp]
theorem
Polynomial.Monic.natDegree_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).natDegree = P.natDegree
@[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
@[deprecated Polynomial.leadingCoeff_map_of_injective (since := "2025-10-26")]
theorem
Polynomial.leadingCoeff_map'
{R : Type u}
{S : Type v}
[Semiring R]
[Semiring S]
{f : R โ+* S}
(hf : Function.Injective โf)
(p : Polynomial R)
:
(map f p).leadingCoeff = f p.leadingCoeff
Alias of Polynomial.leadingCoeff_map_of_injective.
@[deprecated Polynomial.leadingCoeff_map_of_injective (since := "2025-10-26")]
theorem
Polynomial.leadingCoeff_of_injective
{R : Type u}
{S : Type v}
[Semiring R]
[Semiring S]
{f : R โ+* S}
(hf : Function.Injective โf)
(p : Polynomial R)
:
(map f p).leadingCoeff = f p.leadingCoeff
Alias of Polynomial.leadingCoeff_map_of_injective.
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 : (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 : 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)
:
X ^ n - a is monic.
theorem
Polynomial.Monic.comp_X_sub_C
{R : Type u}
[Ring R]
{p : Polynomial R}
(hp : p.Monic)
(r : R)
:
theorem
Polynomial.Monic.sub_of_left
{R : Type u}
[Ring R]
{p q : Polynomial R}
(hp : p.Monic)
(hpq : q.degree < p.degree)
:
(p - q).Monic
theorem
Polynomial.Monic.sub_of_right
{R : Type u}
[Ring R]
{p q : Polynomial R}
(hq : q.leadingCoeff = -1)
(hpq : p.degree < q.degree)
:
(p - q).Monic
@[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)
:
q * p โ 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)
:
p * q โ 0
theorem
Polynomial.Monic.mul_natDegree_lt_iff
{R : Type u}
[Semiring R]
{p : Polynomial R}
(h : p.Monic)
{q : Polynomial R}
:
theorem
Polynomial.Monic.mul_right_eq_zero_iff
{R : Type u}
[Semiring R]
{p : Polynomial R}
(h : p.Monic)
{q : Polynomial R}
:
p * q = 0 โ q = 0
theorem
Polynomial.Monic.mul_left_eq_zero_iff
{R : Type u}
[Semiring R]
{p : Polynomial R}
(h : p.Monic)
{q : Polynomial R}
:
q * p = 0 โ q = 0
theorem
Polynomial.degree_smul_of_smul_regular
{R : Type u}
[Semiring R]
{S : Type u_1}
[SMulZeroClass S R]
{k : S}
(p : Polynomial R)
(h : IsSMulRegular R k)
:
theorem
Polynomial.natDegree_smul_of_smul_regular
{R : Type u}
[Semiring R]
{S : Type u_1}
[SMulZeroClass S R]
{k : S}
(p : Polynomial R)
(h : IsSMulRegular R k)
:
theorem
Polynomial.leadingCoeff_smul_of_smul_regular
{R : Type u}
[Semiring R]
{S : Type u_1}
[SMulZeroClass S R]
{k : S}
(p : Polynomial R)
(h : IsSMulRegular R k)
:
(k โข p).leadingCoeff = k โข p.leadingCoeff
theorem
Polynomial.monic_of_isUnit_leadingCoeff_inv_smul
{R : Type u}
[Semiring R]
{p : Polynomial R}
(h : IsUnit p.leadingCoeff)
:
theorem
Polynomial.isUnit_leadingCoeff_mul_right_eq_zero_iff
{R : Type u}
[Semiring R]
{p : Polynomial R}
(h : IsUnit p.leadingCoeff)
{q : Polynomial R}
:
p * q = 0 โ q = 0
theorem
Polynomial.isUnit_leadingCoeff_mul_left_eq_zero_iff
{R : Type u}
[Semiring R]
{p : Polynomial R}
(h : IsUnit p.leadingCoeff)
{q : Polynomial R}
:
q * p = 0 โ q = 0