Documentation

Mathlib.Algebra.Polynomial.Basic

Theory of univariate polynomials #

This file defines Polynomial R, the type of univariate polynomials over the semiring R, builds a semiring structure on it, and gives basic definitions that are expanded in other files in this directory.

Main definitions #

There are often two natural variants of lemmas involving sums, depending on whether one acts on the polynomials, or on the function. The naming convention is that one adds index when acting on the polynomials. For instance,

Implementation #

Polynomials are defined using R[ℕ], where R is a semiring. The variable X commutes with every polynomial p: lemma X_mul proves the identity X * p = p * X. The relationship to R[ℕ] is through a structure to make polynomials irreducible from the point of view of the kernel. Most operations are irreducible since Lean cannot compute anyway with AddMonoidAlgebra. There are two exceptions that we make semireducible:

The raw implementation of the equivalence between R[X] and R[ℕ] is done through ofFinsupp and toFinsupp (or, equivalently, rcases p when p is a polynomial gives an element q of R[ℕ], and conversely ⟨q⟩ gives back p). The equivalence is also registered as a ring equiv in Polynomial.toFinsuppIso. These should in general not be used once the basic API for polynomials is constructed.

@[reducible, inline]
abbrev Polynomial (R : Type u_1) [Semiring R] :
Type u_1

Polynomial R is the type of univariate polynomials over R, denoted as R[X] within the Polynomial namespace.

Polynomials should be seen as (semi-)rings with the additional constructor X. The embedding from R is called C.

Equations
Instances For

    Polynomial R is the type of univariate polynomials over R, denoted as R[X] within the Polynomial namespace.

    Polynomials should be seen as (semi-)rings with the additional constructor X. The embedding from R is called C.

    Equations
    Instances For
      @[deprecated id (since := "2026-07-18")]

      The underlying R[ℕ] of a polynomial in R[X]. Now the identity, as R[X] is defeq R[ℕ].

      Equations
      Instances For
        @[deprecated id (since := "2026-07-18")]

        Construct a polynomial in R[X] from an element of R[ℕ]. Now the identity, as R[X] is defeq R[ℕ].

        Equations
        Instances For
          @[deprecated AddMonoidAlgebra.forall (since := "2026-09-11")]
          theorem Polynomial.forall_iff_forall_finsupp {R : Type u} [Semiring R] (P : Polynomial R → Prop) :
          (∀ (p : Polynomial R), P p) ↔ ∀ (q : ℕ →₀ R), P (AddMonoidAlgebra.ofCoeff q)
          @[deprecated AddMonoidAlgebra.exists (since := "2026-09-11")]
          theorem Polynomial.exists_iff_exists_finsupp {R : Type u} [Semiring R] (P : Polynomial R → Prop) :
          (∃ (p : Polynomial R), P p) ↔ ∃ (q : ℕ →₀ R), P (AddMonoidAlgebra.ofCoeff q)
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.eta {R : Type u} [Semiring R] (f : Polynomial R) :

          Conversions to and from AddMonoidAlgebra #

          Since R[X] is not defeq to R[ℕ], but instead is a structure wrapping it, we have to copy across all the arithmetic operators manually, along with the lemmas about how they unfold around Polynomial.ofFinsupp and Polynomial.toFinsupp.

          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.ofFinsupp_smul {R : Type u} [Semiring R] {S : Type u_1} [SMulZeroClass S R] (a : S) (b : AddMonoidAlgebra R ℕ) :
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.ofFinsupp_pow {R : Type u} [Semiring R] (a : AddMonoidAlgebra R ℕ) (n : ℕ) :
          ofFinsupp (a ^ n) = ofFinsupp a ^ n
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_sub {R : Type u} [Ring R] (a b : Polynomial R) :
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_nsmul {R : Type u} [Semiring R] (a : ℕ) (b : Polynomial R) :
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_smul {R : Type u} [Semiring R] {S : Type u_1} [SMulZeroClass S R] (a : S) (b : Polynomial R) :
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_pow {R : Type u} [Semiring R] (a : Polynomial R) (n : ℕ) :
          (a ^ n).toFinsupp = a.toFinsupp ^ n
          theorem IsSMulRegular.polynomial {R : Type u} [Semiring R] {S : Type u_1} [SMulZeroClass S R] {a : S} (ha : IsSMulRegular R a) :
          @[deprecated Function.injective_id (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_inj {R : Type u} [Semiring R] {a b : Polynomial R} :
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_eq_zero {R : Type u} [Semiring R] {a : Polynomial R} :
          a.toFinsupp = 0 ↔ a = 0
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_eq_one {R : Type u} [Semiring R] {a : Polynomial R} :
          a.toFinsupp = 1 ↔ a = 1
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.ofFinsupp_natCast {R : Type u} [Semiring R] (n : ℕ) :
          ofFinsupp ↑n = ↑n
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          theorem Polynomial.toFinsupp_natCast {R : Type u} [Semiring R] (n : ℕ) :
          (↑n).toFinsupp = ↑n
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]
          @[deprecated "Now a tautology" (since := "2026-07-18")]

          Ring isomorphism between R[X] and R[ℕ]. This is just an implementation detail, but it can be useful to transfer results from Finsupp to polynomials.

          Equations
          Instances For
            @[deprecated "Now a tautology" (since := "2026-07-18")]
            @[deprecated "Now a tautology" (since := "2026-07-18")]
            @[deprecated "Now a tautology" (since := "2026-07-18")]

            Linear isomorphism between R[X] and R[ℕ]. This is just an implementation detail, but it can be useful to transfer results from Finsupp to polynomials.

            Equations
            Instances For
              @[deprecated "Now a tautology" (since := "2026-07-18")]
              @[deprecated "Now a tautology" (since := "2026-07-18")]
              @[deprecated "Now a tautology" (since := "2026-10-25")]
              @[deprecated "Now a tautology" (since := "2026-07-18")]
              theorem Polynomial.ofFinsupp_sum {R : Type u} [Semiring R] {ι : Type u_1} (s : Finset ι) (f : ι → AddMonoidAlgebra R ℕ) :
              ofFinsupp (∑ i ∈ s, f i) = ∑ i ∈ s, ofFinsupp (f i)
              @[deprecated "Now a tautology" (since := "2026-07-18")]
              theorem Polynomial.toFinsupp_sum {R : Type u} [Semiring R] {ι : Type u_1} (s : Finset ι) (f : ι → Polynomial R) :
              (∑ i ∈ s, f i).toFinsupp = ∑ i ∈ s, (f i).toFinsupp

              The set of all n such that X^n has a non-zero coefficient.

              Equations
              Instances For
                @[deprecated "Now a tautology" (since := "2026-07-18")]
                @[deprecated "Now a tautology" (since := "2026-07-18")]
                @[simp]
                @[simp]
                theorem Polynomial.support_eq_empty {R : Type u} [Semiring R] {p : Polynomial R} :
                p.support = ∅ ↔ p = 0
                noncomputable def Polynomial.monomial {R : Type u} [Semiring R] (n : ℕ) :

                monomial s a is the monomial a * X^s

                Equations
                Instances For
                  @[simp]
                  theorem Polynomial.coeff_monomial {R : Type u} [Semiring R] (n : ℕ) (r : R) :
                  @[deprecated Polynomial.coeff_monomial (since := "2026-07-18")]
                  @[deprecated Polynomial.single_eq_monomial (since := "2026-07-18")]
                  @[simp]
                  theorem Polynomial.monomial_zero_right {R : Type u} [Semiring R] (n : ℕ) :
                  (monomial n) 0 = 0
                  theorem Polynomial.monomial_mul_monomial {R : Type u} [Semiring R] (n m : ℕ) (r s : R) :
                  (monomial n) r * (monomial m) s = (monomial (n + m)) (r * s)
                  @[simp]
                  theorem Polynomial.monomial_pow {R : Type u} [Semiring R] (n : ℕ) (r : R) (k : ℕ) :
                  (monomial n) r ^ k = (monomial (n * k)) (r ^ k)
                  theorem Polynomial.smul_monomial {R : Type u} [Semiring R] {S : Type u_1} [SMulZeroClass S R] (a : S) (n : ℕ) (b : R) :
                  a • (monomial n) b = (monomial n) (a • b)
                  @[simp]
                  theorem Polynomial.monomial_eq_zero_iff {R : Type u} [Semiring R] (t : R) (n : ℕ) :
                  (monomial n) t = 0 ↔ t = 0
                  theorem Polynomial.monomial_eq_monomial_iff {R : Type u} [Semiring R] {m n : ℕ} {a b : R} :
                  (monomial m) a = (monomial n) b ↔ m = n ∧ a = b ∨ a = 0 ∧ b = 0
                  theorem Polynomial.support_add {R : Type u} [Semiring R] {p q : Polynomial R} :
                  (p + q).support ⊆ p.support ∪ q.support
                  noncomputable def Polynomial.C {R : Type u} [Semiring R] :

                  C a is the constant polynomial a. C is provided as a ring homomorphism.

                  Equations
                  Instances For
                    @[simp]
                    theorem Polynomial.monomial_zero_left {R : Type u} [Semiring R] ⦃a : R⦄ :
                    (monomial 0) a = C a
                    @[deprecated "Use `AddMonoidAlgebra.coeff` directly" (since := "2026-07-18")]
                    theorem Polynomial.C_0 {R : Type u} [Semiring R] :
                    C 0 = 0
                    theorem Polynomial.C_1 {R : Type u} [Semiring R] :
                    C 1 = 1
                    theorem Polynomial.C_mul {R : Type u} {a b : R} [Semiring R] :
                    C (a * b) = C a * C b
                    theorem Polynomial.C_add {R : Type u} {a b : R} [Semiring R] :
                    C (a + b) = C a + C b
                    @[simp]
                    theorem Polynomial.smul_C {R : Type u} [Semiring R] {S : Type u_1} [SMulZeroClass S R] (s : S) (r : R) :
                    s • C r = C (s • r)
                    theorem Polynomial.C_pow {R : Type u} {a : R} {n : ℕ} [Semiring R] :
                    C (a ^ n) = C a ^ n
                    theorem Polynomial.C_eq_natCast {R : Type u} [Semiring R] (n : ℕ) :
                    C ↑n = ↑n
                    @[simp]
                    theorem Polynomial.C_mul_monomial {R : Type u} {a b : R} {n : ℕ} [Semiring R] :
                    C a * (monomial n) b = (monomial n) (a * b)
                    @[simp]
                    theorem Polynomial.monomial_mul_C {R : Type u} {a b : R} {n : ℕ} [Semiring R] :
                    (monomial n) a * C b = (monomial n) (a * b)
                    noncomputable def Polynomial.X {R : Type u} [Semiring R] :

                    X is the polynomial variable (aka indeterminate).

                    Equations
                    Instances For
                      @[deprecated Polynomial.X_eq_single (since := "2026-07-18")]
                      theorem Polynomial.X_ne_C {R : Type u} [Semiring R] [Nontrivial R] (a : R) :
                      X ≠ C a
                      theorem Polynomial.X_mul {R : Type u} [Semiring R] {p : Polynomial R} :
                      X * p = p * X

                      X commutes with everything, even when the coefficients are noncommutative.

                      theorem Polynomial.X_pow_mul {R : Type u} [Semiring R] {p : Polynomial R} {n : ℕ} :
                      X ^ n * p = p * X ^ n
                      @[simp]
                      theorem Polynomial.X_mul_C {R : Type u} [Semiring R] (r : R) :
                      X * C r = C r * X

                      Prefer putting constants to the left of X.

                      This lemma is the loop-avoiding simp version of Polynomial.X_mul.

                      @[simp]
                      theorem Polynomial.X_pow_mul_C {R : Type u} [Semiring R] (r : R) (n : ℕ) :
                      X ^ n * C r = C r * X ^ n

                      Prefer putting constants to the left of X ^ n.

                      This lemma is the loop-avoiding simp version of X_pow_mul.

                      theorem Polynomial.X_pow_mul_assoc {R : Type u} [Semiring R] {p q : Polynomial R} {n : ℕ} :
                      p * X ^ n * q = p * q * X ^ n
                      @[simp]
                      theorem Polynomial.X_pow_mul_assoc_C {R : Type u} [Semiring R] {p : Polynomial R} {n : ℕ} (r : R) :
                      p * X ^ n * C r = p * C r * X ^ n

                      Prefer putting constants to the left of X ^ n.

                      This lemma is the loop-avoiding simp version of X_pow_mul_assoc.

                      theorem Polynomial.commute_X_pow {R : Type u} [Semiring R] (p : Polynomial R) (n : ℕ) :
                      Commute (X ^ n) p
                      @[simp]
                      theorem Polynomial.monomial_mul_X {R : Type u} [Semiring R] (n : ℕ) (r : R) :
                      (monomial n) r * X = (monomial (n + 1)) r
                      @[simp]
                      theorem Polynomial.monomial_mul_X_pow {R : Type u} [Semiring R] (n : ℕ) (r : R) (k : ℕ) :
                      (monomial n) r * X ^ k = (monomial (n + k)) r
                      @[simp]
                      theorem Polynomial.X_mul_monomial {R : Type u} [Semiring R] (n : ℕ) (r : R) :
                      X * (monomial n) r = (monomial (n + 1)) r
                      @[simp]
                      theorem Polynomial.X_pow_mul_monomial {R : Type u} [Semiring R] (k n : ℕ) (r : R) :
                      X ^ k * (monomial n) r = (monomial (n + k)) r
                      @[deprecated "Now a tautology" (since := "2026-07-18")]
                      @[deprecated AddMonoidAlgebra.coeff_injective (since := "2026-10-25")]
                      @[deprecated AddMonoidAlgebra.coeff_inj (since := "2026-10-25")]
                      theorem Polynomial.coeff_inj {R : Type u} [Semiring R] {p q : Polynomial R} :
                      p.coeff = q.coeff ↔ p = q
                      @[deprecated "Now a tautology" (since := "2026-07-18")]
                      theorem Polynomial.toFinsupp_apply {R : Type u} [Semiring R] (f : Polynomial R) (i : ℕ) :
                      @[deprecated Finsupp.finite_range (since := "2026-10-25")]
                      theorem Polynomial.coeff_monomial_apply {R : Type u} {a : R} {m n : ℕ} [Semiring R] :
                      ((monomial n) a).coeff m = if n = m then a else 0
                      theorem Polynomial.coeff_monomial_same {R : Type u} [Semiring R] (n : ℕ) (c : R) :
                      ((monomial n) c).coeff n = c
                      theorem Polynomial.coeff_monomial_of_ne {R : Type u} [Semiring R] {m n : ℕ} (c : R) (h : m ≠ n) :
                      ((monomial n) c).coeff m = 0
                      @[simp]
                      theorem Polynomial.coeff_zero {R : Type u} [Semiring R] (n : ℕ) :
                      theorem Polynomial.coeff_one {R : Type u} [Semiring R] {n : ℕ} :
                      @[deprecated AddMonoidAlgebra.coeff_one_zero (since := "2026-10-25")]
                      @[simp]
                      theorem Polynomial.coeff_X_one {R : Type u} [Semiring R] :
                      X.coeff 1 = 1
                      @[simp]
                      theorem Polynomial.coeff_X_zero {R : Type u} [Semiring R] :
                      X.coeff 0 = 0
                      theorem Polynomial.coeff_monomial_succ {R : Type u} {a : R} {n : ℕ} [Semiring R] :
                      ((monomial (n + 1)) a).coeff 0 = 0
                      theorem Polynomial.coeff_X {R : Type u} {n : ℕ} [Semiring R] :
                      X.coeff n = if 1 = n then 1 else 0
                      theorem Polynomial.coeff_X_of_ne_one {R : Type u} [Semiring R] {n : ℕ} (hn : n ≠ 1) :
                      X.coeff n = 0
                      @[simp]
                      theorem Polynomial.mem_support_iff {R : Type u} {n : ℕ} [Semiring R] {p : Polynomial R} :
                      n ∈ p.support ↔ p.coeff n ≠ 0
                      theorem Polynomial.notMem_support_iff {R : Type u} {n : ℕ} [Semiring R] {p : Polynomial R} :
                      n ∉ p.support ↔ p.coeff n = 0
                      theorem Polynomial.coeff_C {R : Type u} {a : R} {n : ℕ} [Semiring R] :
                      (C a).coeff n = if n = 0 then a else 0
                      @[simp]
                      theorem Polynomial.coeff_C_zero {R : Type u} {a : R} [Semiring R] :
                      (C a).coeff 0 = a
                      theorem Polynomial.coeff_C_of_ne_zero {R : Type u} {a : R} {n : ℕ} [Semiring R] (h : n ≠ 0) :
                      (C a).coeff n = 0
                      @[deprecated Polynomial.coeff_C_of_ne_zero (since := "2026-05-20")]
                      theorem Polynomial.coeff_C_ne_zero {R : Type u} {a : R} {n : ℕ} [Semiring R] (h : n ≠ 0) :
                      (C a).coeff n = 0

                      Alias of Polynomial.coeff_C_of_ne_zero.

                      @[simp]
                      theorem Polynomial.coeff_C_succ {R : Type u} [Semiring R] {r : R} {n : ℕ} :
                      (C r).coeff (n + 1) = 0
                      theorem Polynomial.coeff_natCast_ite {R : Type u} {m n : ℕ} [Semiring R] :
                      (↑m).coeff n = ↑(if n = 0 then m else 0)
                      theorem Polynomial.coeff_ofNat_succ {R : Type u} [Semiring R] (a n : ℕ) [a.AtLeastTwo] :
                      (OfNat.ofNat a).coeff (n + 1) = 0
                      theorem Polynomial.C_mul_X_pow_eq_monomial {R : Type u} {a : R} [Semiring R] {n : ℕ} :
                      C a * X ^ n = (monomial n) a
                      @[deprecated "Now a tautology" (since := "2026-07-18")]
                      theorem Polynomial.C_mul_X_eq_monomial {R : Type u} {a : R} [Semiring R] :
                      C a * X = (monomial 1) a
                      @[deprecated AddMonoidAlgebra.coeff_single (since := "2026-07-18")]
                      @[simp]
                      theorem Polynomial.C_inj {R : Type u} {a b : R} [Semiring R] :
                      C a = C b ↔ a = b
                      @[simp]
                      theorem Polynomial.C_eq_zero {R : Type u} {a : R} [Semiring R] :
                      C a = 0 ↔ a = 0
                      theorem Polynomial.C_ne_zero {R : Type u} {a : R} [Semiring R] :
                      C a ≠ 0 ↔ a ≠ 0
                      theorem Polynomial.forall_eq_iff_forall_eq {R : Type u} [Semiring R] :
                      (∀ (f g : Polynomial R), f = g) ↔ ∀ (a b : R), a = b
                      @[deprecated AddMonoidAlgebra.ext_iff (since := "2026-10-25")]
                      theorem Polynomial.ext_iff {R : Type u} [Semiring R] {p q : Polynomial R} :
                      p = q ↔ ∀ (n : ℕ), p.coeff n = q.coeff n
                      @[deprecated AddMonoidAlgebra.ext (since := "2026-10-25")]
                      theorem Polynomial.ext {R : Type u} [Semiring R] {p q : Polynomial R} :
                      (∀ (n : ℕ), p.coeff n = q.coeff n) → p = q

                      Monomials generate the additive monoid of polynomials.

                      @[deprecated Polynomial.addSubmonoid_closure_setOfPred_eq_monomial (since := "2026-07-09")]

                      Alias of Polynomial.addSubmonoid_closure_setOfPred_eq_monomial.


                      Monomials generate the additive monoid of polynomials.

                      theorem Polynomial.addHom_ext {R : Type u} [Semiring R] {M : Type u_1} [AddZeroClass M] {f g : Polynomial R →+ M} (h : ∀ (n : ℕ) (a : R), f ((monomial n) a) = g ((monomial n) a)) :
                      f = g
                      theorem Polynomial.addHom_ext_iff {R : Type u} [Semiring R] {M : Type u_1} [AddZeroClass M] {f g : Polynomial R →+ M} :
                      f = g ↔ ∀ (n : ℕ) (a : R), f ((monomial n) a) = g ((monomial n) a)
                      theorem Polynomial.addHom_ext' {R : Type u} [Semiring R] {M : Type u_1} [AddZeroClass M] {f g : Polynomial R →+ M} (h : ∀ (n : ℕ), f.comp (monomial n).toAddMonoidHom = g.comp (monomial n).toAddMonoidHom) :
                      f = g
                      theorem Polynomial.addHom_ext'_iff {R : Type u} [Semiring R] {M : Type u_1} [AddZeroClass M] {f g : Polynomial R →+ M} :
                      theorem Polynomial.lhom_ext' {R : Type u} [Semiring R] {M : Type u_1} [AddCommMonoid M] [Module R M] {f g : Polynomial R →ₗ[R] M} (h : ∀ (n : ℕ), f ∘ₗ monomial n = g ∘ₗ monomial n) :
                      f = g
                      theorem Polynomial.lhom_ext'_iff {R : Type u} [Semiring R] {M : Type u_1} [AddCommMonoid M] [Module R M] {f g : Polynomial R →ₗ[R] M} :
                      f = g ↔ ∀ (n : ℕ), f ∘ₗ monomial n = g ∘ₗ monomial n
                      theorem Polynomial.eq_zero_of_eq_zero {R : Type u} [Semiring R] (h : 0 = 1) (p : Polynomial R) :
                      p = 0
                      @[simp]
                      theorem Polynomial.support_monomial {R : Type u} [Semiring R] (n : ℕ) {a : R} (h : a ≠ 0) :
                      ((monomial n) a).support = {n}
                      theorem Polynomial.support_monomial_subset {R : Type u} [Semiring R] (n : ℕ) (a : R) :
                      ((monomial n) a).support ⊆ {n}
                      @[deprecated Polynomial.support_monomial_subset (since := "2026-06-09")]
                      theorem Polynomial.support_monomial' {R : Type u} [Semiring R] (n : ℕ) (a : R) :
                      ((monomial n) a).support ⊆ {n}

                      Alias of Polynomial.support_monomial_subset.

                      @[simp]
                      theorem Polynomial.support_C {R : Type u} [Semiring R] {a : R} (h : a ≠ 0) :
                      (C a).support = {0}
                      theorem Polynomial.support_C_subset {R : Type u} [Semiring R] (a : R) :
                      (C a).support ⊆ {0}
                      @[simp]
                      theorem Polynomial.support_C_mul_X {R : Type u} [Semiring R] {c : R} (h : c ≠ 0) :
                      (C c * X).support = {1}
                      theorem Polynomial.support_C_mul_X_subset {R : Type u} [Semiring R] (c : R) :
                      (C c * X).support ⊆ {1}
                      @[deprecated Polynomial.support_C_mul_X_subset (since := "2026-06-09")]
                      theorem Polynomial.support_C_mul_X' {R : Type u} [Semiring R] (c : R) :
                      (C c * X).support ⊆ {1}

                      Alias of Polynomial.support_C_mul_X_subset.

                      @[simp]
                      theorem Polynomial.support_C_mul_X_pow {R : Type u} [Semiring R] (n : ℕ) {c : R} (h : c ≠ 0) :
                      (C c * X ^ n).support = {n}
                      theorem Polynomial.support_C_mul_X_pow_subset {R : Type u} [Semiring R] (n : ℕ) (c : R) :
                      (C c * X ^ n).support ⊆ {n}
                      @[deprecated Polynomial.support_C_mul_X_pow_subset (since := "2026-06-09")]
                      theorem Polynomial.support_C_mul_X_pow' {R : Type u} [Semiring R] (n : ℕ) (c : R) :
                      (C c * X ^ n).support ⊆ {n}

                      Alias of Polynomial.support_C_mul_X_pow_subset.

                      theorem Polynomial.support_binomial_subset {R : Type u} [Semiring R] (k m : ℕ) (x y : R) :
                      (C x * X ^ k + C y * X ^ m).support ⊆ {k, m}
                      @[deprecated Polynomial.support_binomial_subset (since := "2026-06-09")]
                      theorem Polynomial.support_binomial' {R : Type u} [Semiring R] (k m : ℕ) (x y : R) :
                      (C x * X ^ k + C y * X ^ m).support ⊆ {k, m}

                      Alias of Polynomial.support_binomial_subset.

                      theorem Polynomial.support_trinomial_subset {R : Type u} [Semiring R] (k m n : ℕ) (x y z : R) :
                      (C x * X ^ k + C y * X ^ m + C z * X ^ n).support ⊆ {k, m, n}
                      @[deprecated Polynomial.support_trinomial_subset (since := "2026-06-09")]
                      theorem Polynomial.support_trinomial' {R : Type u} [Semiring R] (k m n : ℕ) (x y z : R) :
                      (C x * X ^ k + C y * X ^ m + C z * X ^ n).support ⊆ {k, m, n}

                      Alias of Polynomial.support_trinomial_subset.

                      theorem Polynomial.X_pow_eq_monomial {R : Type u} [Semiring R] (n : ℕ) :
                      X ^ n = (monomial n) 1
                      @[deprecated "Now a tautology" (since := "2026-07-18")]
                      theorem Polynomial.smul_X_eq_monomial {R : Type u} {a : R} [Semiring R] {n : ℕ} :
                      a • X ^ n = (monomial n) a
                      @[simp]
                      theorem Polynomial.support_X_pow {R : Type u} [Semiring R] [Nontrivial R] (n : ℕ) :
                      (X ^ n).support = {n}
                      theorem Polynomial.support_X_empty {R : Type u} [Semiring R] (H : 1 = 0) :
                      @[simp]
                      theorem Polynomial.monomial_left_inj {R : Type u} [Semiring R] {a : R} (ha : a ≠ 0) {i j : ℕ} :
                      (monomial i) a = (monomial j) a ↔ i = j
                      theorem Polynomial.binomial_eq_binomial {R : Type u} [Semiring R] {k l m n : ℕ} {u v : R} (hu : u ≠ 0) (hv : v ≠ 0) :
                      C u * X ^ k + C v * X ^ l = C u * X ^ m + C v * X ^ n ↔ k = m ∧ l = n ∨ u = v ∧ k = n ∧ l = m ∨ u + v = 0 ∧ k = l ∧ m = n
                      theorem Polynomial.natCast_mul {R : Type u} [Semiring R] (n : ℕ) (p : Polynomial R) :
                      ↑n * p = n • p
                      def Polynomial.sum {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (p : Polynomial R) (f : ℕ → R → S) :
                      S

                      Summing the values of a function applied to the coefficients of a polynomial

                      Equations
                      Instances For
                        theorem Polynomial.sum_def {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (p : Polynomial R) (f : ℕ → R → S) :
                        p.sum f = ∑ n ∈ p.support, f n (p.coeff n)
                        theorem Polynomial.sum_eq_of_subset {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] {p : Polynomial R} (f : ℕ → R → S) (hf : ∀ (i : ℕ), f i 0 = 0) {s : Finset ℕ} (hs : p.support ⊆ s) :
                        p.sum f = ∑ n ∈ s, f n (p.coeff n)
                        theorem Polynomial.mul_eq_sum_sum {R : Type u} [Semiring R] {p q : Polynomial R} :
                        p * q = ∑ i ∈ p.support, q.sum fun (j : ℕ) (a : R) => (monomial (i + j)) (p.coeff i * a)

                        Expressing the product of two polynomials as a double sum.

                        @[simp]
                        theorem Polynomial.sum_zero_index {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (f : ℕ → R → S) :
                        sum 0 f = 0
                        @[simp]
                        theorem Polynomial.sum_monomial_index {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] {n : ℕ} (a : R) (f : ℕ → R → S) (hf : f n 0 = 0) :
                        ((monomial n) a).sum f = f n a
                        @[simp]
                        theorem Polynomial.sum_C_index {R : Type u} [Semiring R] {a : R} {β : Type u_1} [AddCommMonoid β] {f : ℕ → R → β} (h : f 0 0 = 0) :
                        (C a).sum f = f 0 a
                        @[simp]
                        theorem Polynomial.sum_X_index {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] {f : ℕ → R → S} (hf : f 1 0 = 0) :
                        X.sum f = f 1 1
                        theorem Polynomial.sum_add_index {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (p q : Polynomial R) (f : ℕ → R → S) (hf : ∀ (i : ℕ), f i 0 = 0) (h_add : ∀ (a : ℕ) (b₁ b₂ : R), f a (b₁ + b₂) = f a b₁ + f a b₂) :
                        (p + q).sum f = p.sum f + q.sum f
                        @[simp]
                        theorem Polynomial.sum_add' {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (p : Polynomial R) (f g : ℕ → R → S) :
                        p.sum (f + g) = p.sum f + p.sum g

                        See also Polynomial.sum_add.

                        @[simp]
                        theorem Polynomial.sum_add {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (p : Polynomial R) (f g : ℕ → R → S) :
                        (p.sum fun (n : ℕ) (x : R) => f n x + g n x) = p.sum f + p.sum g

                        See also Polynomial.sum_add'.

                        theorem Polynomial.sum_smul_index {R : Type u} [Semiring R] {S : Type u_1} [AddCommMonoid S] (p : Polynomial R) (b : R) (f : ℕ → R → S) (hf : ∀ (i : ℕ), f i 0 = 0) :
                        (b • p).sum f = p.sum fun (n : ℕ) (a : R) => f n (b * a)

                        See also Polynomial.sum_smul_index' for a version using smul on the RHS.

                        theorem Polynomial.sum_smul_index' {R : Type u} [Semiring R] {S : Type u_1} {T : Type u_2} [DistribSMul T R] [AddCommMonoid S] (p : Polynomial R) (b : T) (f : ℕ → R → S) (hf : ∀ (i : ℕ), f i 0 = 0) :
                        (b • p).sum f = p.sum fun (n : ℕ) (a : R) => f n (b • a)

                        See also Polynomial.sum_smul_index for a version using multiplication on the RHS.

                        theorem Polynomial.smul_sum {R : Type u} [Semiring R] {S : Type u_1} {T : Type u_2} [AddCommMonoid S] [DistribSMul T S] (p : Polynomial R) (b : T) (f : ℕ → R → S) :
                        b • p.sum f = p.sum fun (n : ℕ) (a : R) => b • f n a
                        @[simp]
                        theorem Polynomial.sum_monomial_eq {R : Type u} [Semiring R] (p : Polynomial R) :
                        (p.sum fun (n : ℕ) (a : R) => (monomial n) a) = p
                        theorem Polynomial.sum_C_mul_X_pow_eq {R : Type u} [Semiring R] (p : Polynomial R) :
                        (p.sum fun (n : ℕ) (a : R) => C a * X ^ n) = p
                        theorem Polynomial.induction_on {R : Type u} [Semiring R] {motive : Polynomial R → Prop} (p : Polynomial R) (C : ∀ (a : R), motive (C a)) (add : ∀ (p q : Polynomial R), motive p → motive q → motive (p + q)) (monomial : ∀ (n : ℕ) (a : R), motive (Polynomial.C a * X ^ n) → motive (Polynomial.C a * X ^ (n + 1))) :
                        motive p
                        theorem Polynomial.induction_on' {R : Type u} [Semiring R] {motive : Polynomial R → Prop} (p : Polynomial R) (add : ∀ (p q : Polynomial R), motive p → motive q → motive (p + q)) (monomial : ∀ (n : ℕ) (a : R), motive ((monomial n) a)) :
                        motive p

                        To prove something about polynomials, it suffices to show the condition is closed under taking sums, and it holds for monomials.

                        @[deprecated "Now a tautology" (since := "2026-07-18")]
                        @[deprecated "Now a tautology" (since := "2026-07-18")]
                        theorem Polynomial.coeff_erase {R : Type u} [Semiring R] (p : Polynomial R) (n i : ℕ) :
                        @[deprecated AddMonoidAlgebra.erase_zero (since := "2026-10-25")]
                        @[simp]
                        theorem Polynomial.erase_monomial {R : Type u} [Semiring R] {n : ℕ} {a : R} :
                        @[deprecated Finsupp.erase_same (since := "2026-09-17")]
                        theorem Polynomial.erase_same {R : Type u} [Semiring R] (p : Polynomial R) (n : ℕ) :
                        @[deprecated Finsupp.erase_ne (since := "2026-09-17")]
                        theorem Polynomial.erase_ne {R : Type u} [Semiring R] (p : Polynomial R) {n i : ℕ} (h : i ≠ n) :
                        theorem Polynomial.coeff_update {R : Type u} [Semiring R] (p : Polynomial R) (n : ℕ) (a : R) :
                        theorem Polynomial.coeff_update_apply {R : Type u} [Semiring R] (p : Polynomial R) (n : ℕ) (a : R) (i : ℕ) :
                        @[deprecated Function.update_self (since := "2026-09-17")]
                        theorem Polynomial.coeff_update_same {R : Type u} [Semiring R] (p : Polynomial R) (n : ℕ) (a : R) :
                        theorem Polynomial.coeff_update_ne {R : Type u} [Semiring R] (p : Polynomial R) {n i : ℕ} (a : R) (h : i ≠ n) :
                        theorem Polynomial.support_update_ne_zero {R : Type u} [Semiring R] (p : Polynomial R) (n : ℕ) {a : R} (ha : a ≠ 0) :
                        noncomputable def Polynomial.coeffs {R : Type u} [Semiring R] (p : Polynomial R) :

                        The finset of nonzero coefficients of a polynomial.

                        Equations
                        Instances For
                          @[simp]
                          theorem Polynomial.mem_coeffs_iff {R : Type u} [Semiring R] {p : Polynomial R} {c : R} :
                          c ∈ p.coeffs ↔ ∃ n ∈ p.support, c = p.coeff n
                          theorem Polynomial.coe_coeffs_subset_iff {R : Type u} [Semiring R] {p : Polynomial R} {s : Set R} :
                          ↑p.coeffs ⊆ s ↔ ∀ (n : ℕ), p.coeff n ≠ 0 → p.coeff n ∈ s
                          theorem Polynomial.coeffs_subset_iff {R : Type u} [Semiring R] {p : Polynomial R} {s : Finset R} :
                          p.coeffs ⊆ s ↔ ∀ (n : ℕ), p.coeff n ≠ 0 → p.coeff n ∈ s
                          theorem Polynomial.coeffs_one {R : Type u} [Semiring R] :
                          coeffs 1 ⊆ {1}
                          theorem Polynomial.coeff_mem_coeffs {R : Type u} [Semiring R] {p : Polynomial R} {n : ℕ} (h : p.coeff n ≠ 0) :
                          @[simp]
                          theorem Polynomial.coeffs_empty_iff {R : Type u} [Semiring R] {p : Polynomial R} :
                          p.coeffs = ∅ ↔ p = 0
                          theorem Polynomial.coeffs_monomial {R : Type u} [Semiring R] (n : ℕ) {c : R} (hc : c ≠ 0) :
                          ((monomial n) c).coeffs = {c}
                          @[deprecated "Now a tautology" (since := "2026-07-18")]
                          theorem Polynomial.ofFinsupp_zsmul {R : Type u} [Ring R] (a : ℤ) (b : AddMonoidAlgebra R ℕ) :
                          @[deprecated "Now a tautology" (since := "2026-07-18")]
                          theorem Polynomial.toFinsupp_zsmul {R : Type u} [Ring R] (a : ℤ) (b : Polynomial R) :
                          @[deprecated "Now a tautology" (since := "2026-07-18")]
                          theorem Polynomial.ofFinsupp_intCast {R : Type u} [Ring R] (z : ℤ) :
                          ofFinsupp ↑z = ↑z
                          @[deprecated "Now a tautology" (since := "2026-07-18")]
                          theorem Polynomial.toFinsupp_intCast {R : Type u} [Ring R] (z : ℤ) :
                          (↑z).toFinsupp = ↑z
                          @[simp]
                          theorem Polynomial.coeff_neg {R : Type u} [Ring R] (p : Polynomial R) (n : ℕ) :
                          (-p).coeff n = -p.coeff n
                          @[simp]
                          theorem Polynomial.coeff_sub {R : Type u} [Ring R] (p q : Polynomial R) (n : ℕ) :
                          (p - q).coeff n = p.coeff n - q.coeff n
                          @[simp]
                          theorem Polynomial.monomial_neg {R : Type u} [Ring R] (n : ℕ) (a : R) :
                          (monomial n) (-a) = -(monomial n) a
                          theorem Polynomial.monomial_sub {R : Type u} {a b : R} [Ring R] (n : ℕ) :
                          (monomial n) (a - b) = (monomial n) a - (monomial n) b
                          @[simp]
                          theorem Polynomial.support_neg {R : Type u} [Ring R] {p : Polynomial R} :
                          theorem Polynomial.C_eq_intCast {R : Type u} [Ring R] (n : ℤ) :
                          C ↑n = ↑n
                          theorem Polynomial.C_neg {R : Type u} {a : R} [Ring R] :
                          C (-a) = -C a
                          theorem Polynomial.C_sub {R : Type u} {a b : R} [Ring R] :
                          C (a - b) = C a - C b
                          @[simp]
                          theorem Polynomial.X_ne_zero {R : Type u} [Semiring R] [Nontrivial R] :
                          X ≠ 0

                          See also Polynomial.isCancelMulZero_iff: in order for R[X] to have cancellative multiplication (stronger than NoZeroDivisors in general, but equivalent if R is a ring), R must have both cancellative multiplication and cancellative addition.

                          theorem Polynomial.nnqsmul_eq_C_mul {R : Type u} [DivisionSemiring R] (q : ℚ≥0) (f : Polynomial R) :
                          q • f = C ↑q * f
                          theorem Polynomial.qsmul_eq_C_mul {R : Type u} [DivisionRing R] (a : ℚ) (f : Polynomial R) :
                          a • f = C ↑a * f
                          noncomputable def Polynomial.ofMultiset {R : Type u} [CommRing R] :

                          The map sending a collection of roots into a polynomial, as a morphism.

                          Equations
                          Instances For
                            @[simp]
                            theorem Polynomial.ofMultiset_apply {R : Type u} [CommRing R] (s : Multiset R) :
                            ofMultiset s = (Multiset.map (fun (a : R) => X - C a) s).prod
                            @[instance_reducible]
                            instance Polynomial.repr {R : Type u} [Semiring R] [Repr R] [DecidableEq R] :
                            Equations
                            • One or more equations did not get rendered due to their size.