Documentation

Mathlib.Algebra.Polynomial.Factors

Split polynomials #

A polynomial f : R[X] splits if it is a product of constant and monic linear polynomials.

Main definitions #

def Polynomial.Splits {R : Type u_1} [Semiring R] (f : Polynomial R) :

A polynomial Splits if it is a product of constant and monic linear polynomials. This will eventually replace Polynomial.Splits.

Equations
Instances For
    @[simp]
    theorem Polynomial.Splits.C {R : Type u_1} [Semiring R] (a : R) :
    (C a).Splits
    @[simp]
    theorem Polynomial.Splits.zero {R : Type u_1} [Semiring R] :
    @[simp]
    theorem Polynomial.Splits.one {R : Type u_1} [Semiring R] :
    @[simp]
    theorem Polynomial.Splits.X_add_C {R : Type u_1} [Semiring R] (a : R) :
    (X + C a).Splits
    @[simp]
    theorem Polynomial.Splits.X {R : Type u_1} [Semiring R] :
    @[simp]
    theorem Polynomial.Splits.mul {R : Type u_1} [Semiring R] {f g : Polynomial R} (hf : f.Splits) (hg : g.Splits) :
    (f * g).Splits
    theorem Polynomial.Splits.C_mul {R : Type u_1} [Semiring R] {f : Polynomial R} (hf : f.Splits) (a : R) :
    (C a * f).Splits
    @[simp]
    theorem Polynomial.Splits.listProd {R : Type u_1} [Semiring R] {l : List (Polynomial R)} (h : fl, f.Splits) :
    @[simp]
    theorem Polynomial.Splits.pow {R : Type u_1} [Semiring R] {f : Polynomial R} (hf : f.Splits) (n : ) :
    (f ^ n).Splits
    theorem Polynomial.Splits.X_pow {R : Type u_1} [Semiring R] (n : ) :
    (X ^ n).Splits
    theorem Polynomial.Splits.C_mul_X_pow {R : Type u_1} [Semiring R] (a : R) (n : ) :
    (C a * X ^ n).Splits
    @[simp]
    theorem Polynomial.Splits.monomial {R : Type u_1} [Semiring R] (n : ) (a : R) :
    theorem Polynomial.Splits.map {R : Type u_1} [Semiring R] {f : Polynomial R} (hf : f.Splits) {S : Type u_2} [Semiring S] (i : R →+* S) :
    (map i f).Splits
    theorem IsUnit.splits {R : Type u_1} [Semiring R] [NoZeroDivisors R] {f : Polynomial R} (hf : IsUnit f) :
    @[deprecated IsUnit.splits (since := "2025-11-27")]
    theorem Polynomial.splits_of_isUnit {R : Type u_1} [Semiring R] [NoZeroDivisors R] {f : Polynomial R} (hf : IsUnit f) :

    Alias of IsUnit.splits.

    @[simp]
    theorem Polynomial.Splits.multisetProd {R : Type u_1} [CommSemiring R] {m : Multiset (Polynomial R)} (hm : fm, f.Splits) :
    @[simp]
    theorem Polynomial.Splits.prod {R : Type u_1} [CommSemiring R] {ι : Type u_2} {f : ιPolynomial R} {s : Finset ι} (h : is, (f i).Splits) :
    (∏ is, f i).Splits
    theorem Polynomial.Splits.taylor {R : Type u_1} [CommSemiring R] {p : Polynomial R} (hp : p.Splits) (r : R) :
    theorem Polynomial.splits_iff_exists_multiset' {R : Type u_1} [CommSemiring R] {f : Polynomial R} :
    f.Splits ∃ (m : Multiset R), f = C f.leadingCoeff * (Multiset.map (fun (x : R) => X + C x) m).prod

    See splits_iff_exists_multiset for the version with subtraction.

    theorem Polynomial.Splits.comp_of_degree_le_one_of_monic {R : Type u_1} [CommSemiring R] {f g : Polynomial R} (hf : f.Splits) (hg : g.degree 1) (h : g.Monic) :
    (f.comp g).Splits
    theorem Polynomial.Splits.comp_X_add_C {R : Type u_1} [CommSemiring R] {f : Polynomial R} (hf : f.Splits) (a : R) :
    (f.comp (X + C a)).Splits
    @[simp]
    theorem Polynomial.Splits.X_sub_C {R : Type u_1} [Ring R] (a : R) :
    (X - C a).Splits
    theorem Polynomial.Splits.neg {R : Type u_1} [Ring R] {f : Polynomial R} (hf : f.Splits) :
    @[simp]
    theorem Polynomial.splits_neg_iff {R : Type u_1} [Ring R] {f : Polynomial R} :
    theorem Polynomial.Splits.comp_neg_X {R : Type u_1} [Ring R] {f : Polynomial R} (hf : f.Splits) :
    (f.comp (-X)).Splits
    theorem Polynomial.splits_iff_exists_multiset {R : Type u_1} [CommRing R] {f : Polynomial R} :
    f.Splits ∃ (m : Multiset R), f = C f.leadingCoeff * (Multiset.map (fun (x : R) => X - C x) m).prod
    theorem Polynomial.Splits.exists_eval_eq_zero {R : Type u_1} [CommRing R] {f : Polynomial R} (hf : f.Splits) (hf0 : f.degree 0) :
    ∃ (a : R), eval a f = 0
    noncomputable def Polynomial.rootOfSplits {R : Type u_1} [CommRing R] {f : Polynomial R} (hf : f.Splits) (hfd : f.degree 0) :
    R

    Pick a root of a polynomial that splits.

    Equations
    Instances For
      @[simp]
      theorem Polynomial.eval_rootOfSplits {R : Type u_1} [CommRing R] {f : Polynomial R} (hf : f.Splits) (hfd : f.degree 0) :
      eval (rootOfSplits hf hfd) f = 0
      theorem Polynomial.Splits.comp_X_sub_C {R : Type u_1} [CommRing R] {f : Polynomial R} (hf : f.Splits) (a : R) :
      (f.comp (X - C a)).Splits
      theorem Polynomial.Splits.eq_prod_roots {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) :
      f = C f.leadingCoeff * (Multiset.map (fun (x : R) => X - C x) f.roots).prod
      theorem Polynomial.Splits.eq_prod_roots_of_monic {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) (hm : f.Monic) :
      f = (Multiset.map (fun (x : R) => X - C x) f.roots).prod
      theorem Polynomial.Splits.eval_eq_prod_roots {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) (x : R) :
      eval x f = f.leadingCoeff * (Multiset.map (fun (x_1 : R) => x - x_1) f.roots).prod
      theorem Polynomial.Splits.eval_eq_prod_roots_of_monic {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) (hm : f.Monic) (x : R) :
      eval x f = (Multiset.map (fun (x_1 : R) => x - x_1) f.roots).prod
      theorem Polynomial.Splits.aeval_eq_prod_aroots {R : Type u_1} [CommRing R] {f : Polynomial R} {A : Type u_2} [CommRing A] [IsDomain A] [IsSimpleRing R] [Algebra R A] (hf : (map (algebraMap R A) f).Splits) (x : A) :
      (aeval x) f = (algebraMap R A) f.leadingCoeff * (Multiset.map (fun (x_1 : A) => x - x_1) (f.aroots A)).prod
      theorem Polynomial.Splits.aeval_eq_prod_aroots_of_monic {R : Type u_1} [CommRing R] {f : Polynomial R} {A : Type u_2} [CommRing A] [IsDomain A] [IsSimpleRing R] [Algebra R A] (hf : (map (algebraMap R A) f).Splits) (hm : f.Monic) (x : A) :
      (aeval x) f = (Multiset.map (fun (x_1 : A) => x - x_1) (f.aroots A)).prod
      theorem Polynomial.Splits.eval_derivative {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] [DecidableEq R] (hf : f.Splits) (x : R) :
      eval x (derivative f) = f.leadingCoeff * (Multiset.map (fun (a : R) => (Multiset.map (fun (x_1 : R) => x - x_1) (f.roots.erase a)).prod) f.roots).sum
      theorem Polynomial.Splits.eval_root_derivative {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] [DecidableEq R] (hf : f.Splits) (hm : f.Monic) {x : R} (hx : x f.roots) :
      eval x (derivative f) = (Multiset.map (fun (x_1 : R) => x - x_1) (f.roots.erase x)).prod

      Let f be a monic polynomial over that splits. Let x be a root of f. Then $f'(r) = \prod_{a}(x-a)$, where the product in the RHS is taken over all roots of f, with the multiplicity of x reduced by one.

      theorem Polynomial.Splits.of_splits_map {R : Type u_1} [CommRing R] {f : Polynomial R} {S : Type u_2} [CommRing S] [IsDomain S] [IsSimpleRing R] (i : R →+* S) (hf : (map i f).Splits) (hi : a(map i f).roots, a i.range) :
      theorem Polynomial.Splits.eq_X_sub_C_of_single_root {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) {x : R} (hr : f.roots = {x}) :
      f = C f.leadingCoeff * (X - C x)
      theorem Polynomial.Splits.degree_eq_card_roots {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) (hf0 : f 0) :

      A polynomial splits if and only if it has as many roots as its degree.

      theorem Polynomial.Splits.roots_ne_zero {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) (hf0 : f.natDegree 0) :
      theorem Polynomial.Splits.map_roots {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] {S : Type u_2} [CommRing S] [IsDomain S] [IsSimpleRing R] (hf : f.Splits) (i : R →+* S) :
      (map i f).roots = Multiset.map (⇑i) f.roots
      theorem Polynomial.Splits.mem_range_of_isRoot {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] {S : Type u_2} [CommRing S] [IsDomain S] [IsSimpleRing R] (hf : f.Splits) (hf0 : f 0) {i : R →+* S} {x : S} (hx : (map i f).IsRoot x) :
      theorem Polynomial.Splits.image_rootSet {R : Type u_1} [CommRing R] {f : Polynomial R} {A : Type u_2} {B : Type u_3} [CommRing A] [CommRing B] [IsDomain A] [IsDomain B] [IsSimpleRing A] [Algebra R A] [Algebra R B] (hf : (map (algebraMap R A) f).Splits) (g : A →ₐ[R] B) :
      g '' f.rootSet A = f.rootSet B
      theorem Polynomial.Splits.adjoin_rootSet_eq_range {R : Type u_1} [CommRing R] {f : Polynomial R} {A : Type u_2} {B : Type u_3} [CommRing A] [CommRing B] [IsDomain A] [IsDomain B] [IsSimpleRing A] [Algebra R A] [Algebra R B] (hf : (map (algebraMap R A) f).Splits) (g : A →ₐ[R] B) :
      theorem Polynomial.Splits.coeff_zero_eq_prod_roots_of_monic {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) (hm : f.Monic) :
      f.coeff 0 = (-1) ^ f.natDegree * f.roots.prod

      If f is a monic polynomial that splits, then coeff f 0 equals the product of the roots.

      If f is a monic polynomial that splits, then f.nextCoeff equals the negative of the sum of the roots.

      theorem Polynomial.splits_X_sub_C_mul_iff {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] {a : R} :
      ((X - C a) * f).Splits f.Splits
      theorem Polynomial.splits_mul_iff {R : Type u_1} [CommRing R] {f g : Polynomial R} [IsDomain R] (hf₀ : f 0) (hg₀ : g 0) :
      theorem Polynomial.Splits.splits_of_dvd {R : Type u_1} [CommRing R] {f g : Polynomial R} [IsDomain R] (hg : g.Splits) (hg₀ : g 0) (hfg : f g) :
      @[deprecated Polynomial.Splits.splits_of_dvd (since := "2025-11-27")]
      theorem Polynomial.Splits.of_dvd {R : Type u_1} [CommRing R] {f g : Polynomial R} [IsDomain R] (hg : g.Splits) (hg₀ : g 0) (hfg : f g) :

      Alias of Polynomial.Splits.splits_of_dvd.

      theorem Polynomial.splits_prod_iff {R : Type u_1} [CommRing R] [IsDomain R] {ι : Type u_2} {f : ιPolynomial R} {s : Finset ι} (hf : is, f i 0) :
      (∏ xs, f x).Splits xs, (f x).Splits
      theorem Polynomial.Splits.splits {R : Type u_1} [CommRing R] {f : Polynomial R} [IsDomain R] (hf : f.Splits) :
      f = 0 ∀ {g : Polynomial R}, Irreducible gg fg.degree 1
      theorem Polynomial.map_sub_sprod_roots_eq_prod_map_eval {R : Type u_1} [CommRing R] [IsDomain R] (s : Multiset R) (g : Polynomial R) (hg : g.Monic) (hg' : g.Splits) :
      (Multiset.map (fun (ij : R × R) => ij.1 - ij.2) (s ×ˢ g.roots)).prod = (Multiset.map (fun (x : R) => eval x g) s).prod
      theorem Polynomial.map_sub_roots_sprod_eq_prod_map_eval {R : Type u_1} [CommRing R] [IsDomain R] (s : Multiset R) (g : Polynomial R) (hg : g.Monic) (hg' : g.Splits) :
      (Multiset.map (fun (ij : R × R) => ij.1 - ij.2) (g.roots ×ˢ s)).prod = (-1) ^ (s.card * g.roots.card) * (Multiset.map (fun (x : R) => eval x g) s).prod
      theorem Polynomial.Splits.dvd_of_roots_le_roots {R : Type u_1} [Field R] {f g : Polynomial R} (hp : f.Splits) (hp0 : f 0) (hq : f.roots g.roots) :
      f g
      theorem Polynomial.Splits.dvd_iff_roots_le_roots {R : Type u_1} [Field R] {f g : Polynomial R} (hf : f.Splits) (hf0 : f 0) (hg0 : g 0) :
      theorem Polynomial.Splits.comp_of_natDegree_le_one {R : Type u_1} [Field R] {f g : Polynomial R} (hf : f.Splits) (hg : g.natDegree 1) :
      (f.comp g).Splits
      theorem Polynomial.Splits.comp_of_degree_le_one {R : Type u_1} [Field R] {f g : Polynomial R} (hf : f.Splits) (hg : g.degree 1) :
      (f.comp g).Splits
      theorem Polynomial.Splits.eval_derivative_eq_eval_mul_sum {R : Type u_1} [Field R] {f : Polynomial R} (hf : f.Splits) {x : R} (hx : eval x f 0) :
      eval x (derivative f) = eval x f * (Multiset.map (fun (z : R) => 1 / (x - z)) f.roots).sum
      theorem Polynomial.Splits.eval_derivative_div_eval_of_ne_zero {R : Type u_1} [Field R] {f : Polynomial R} (hf : f.Splits) {x : R} (hx : eval x f 0) :
      eval x (derivative f) / eval x f = (Multiset.map (fun (z : R) => 1 / (x - z)) f.roots).sum
      theorem Polynomial.Splits.mem_subfield_of_isRoot {R : Type u_1} [Field R] (F : Subfield R) {f : Polynomial F} (hf : f.Splits) (hf0 : f 0) {x : R} (hx : (map F.subtype f).IsRoot x) :
      x F
      theorem Polynomial.splits_iff_splits {R : Type u_1} [Field R] {f : Polynomial R} :
      f.Splits f = 0 ∀ {g : Polynomial R}, Irreducible gg fg.degree = 1