mathlib3 documentation

data.polynomial.eval

Theory of univariate polynomials #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

The main defs here are eval₂, eval, and map. We give several lemmas about their interaction with each other and with module operations.

@[irreducible]
def polynomial.eval₂ {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) (p : polynomial R) :
S

Evaluate a polynomial p given a ring hom f from the scalar ring to the target and a value x for the variable in the target

Equations
theorem polynomial.eval₂_eq_sum {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] {f : R →+* S} {x : S} :
polynomial.eval₂ f x p = p.sum (λ (e : ) (a : R), f a * x ^ e)
theorem polynomial.eval₂_congr {R : Type u_1} {S : Type u_2} [semiring R] [semiring S] {f g : R →+* S} {s t : S} {φ ψ : polynomial R} :
f = g s = t φ = ψ polynomial.eval₂ f s φ = polynomial.eval₂ g t ψ
@[simp]
theorem polynomial.eval₂_at_zero {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) :
@[simp]
theorem polynomial.eval₂_zero {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_C {R : Type u} {S : Type v} {a : R} [semiring R] [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_X {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_monomial {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) {n : } {r : R} :
@[simp]
theorem polynomial.eval₂_X_pow {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) {n : } :
@[simp]
theorem polynomial.eval₂_add {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_one {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_bit0 {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_bit1 {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_smul {R : Type u} {S : Type v} [semiring R] [semiring S] (g : R →+* S) (p : polynomial R) (x : S) {s : R} :
def polynomial.eval₂_add_monoid_hom {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) :

eval₂_add_monoid_hom (f : R →+* S) (x : S) is the add_monoid_hom from R[X] to S obtained by evaluating the pushforward of p along f at x.

Equations
@[simp]
@[simp]
theorem polynomial.eval₂_nat_cast {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) (n : ) :
theorem polynomial.eval₂_sum {R : Type u} {S : Type v} {T : Type w} [semiring R] [semiring S] (f : R →+* S) [semiring T] (p : polynomial T) (g : T polynomial R) (x : S) :
polynomial.eval₂ f x (p.sum g) = p.sum (λ (n : ) (a : T), polynomial.eval₂ f x (g n a))
theorem polynomial.eval₂_list_sum {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (l : list (polynomial R)) (x : S) :
theorem polynomial.eval₂_multiset_sum {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (s : multiset (polynomial R)) (x : S) :
theorem polynomial.eval₂_finset_sum {R : Type u} {S : Type v} {ι : Type y} [semiring R] [semiring S] (f : R →+* S) (s : finset ι) (g : ι polynomial R) (x : S) :
polynomial.eval₂ f x (s.sum (λ (i : ι), g i)) = s.sum (λ (i : ι), polynomial.eval₂ f x (g i))
theorem polynomial.eval₂_mul_noncomm {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [semiring S] (f : R →+* S) (x : S) (hf : (k : ), commute (f (q.coeff k)) x) :
@[simp]
theorem polynomial.eval₂_mul_X {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) :
@[simp]
theorem polynomial.eval₂_X_mul {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) :
theorem polynomial.eval₂_mul_C' {R : Type u} {S : Type v} {a : R} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) (h : commute (f a) x) :
theorem polynomial.eval₂_list_prod_noncomm {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) (ps : list (polynomial R)) (hf : (p : polynomial R), p ps (k : ), commute (f (p.coeff k)) x) :
def polynomial.eval₂_ring_hom' {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (x : S) (hf : (a : R), commute (f a) x) :

eval₂ as a ring_hom for noncommutative rings

Equations

We next prove that eval₂ is multiplicative as long as target ring is commutative (even if the source ring is not).

theorem polynomial.eval₂_eq_sum_range {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) :
polynomial.eval₂ f x p = (finset.range (p.nat_degree + 1)).sum (λ (i : ), f (p.coeff i) * x ^ i)
theorem polynomial.eval₂_eq_sum_range' {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) {p : polynomial R} {n : } (hn : p.nat_degree < n) (x : S) :
polynomial.eval₂ f x p = (finset.range n).sum (λ (i : ), f (p.coeff i) * x ^ i)
@[simp]
theorem polynomial.eval₂_mul {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [comm_semiring S] (f : R →+* S) (x : S) :
theorem polynomial.eval₂_mul_eq_zero_of_left {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [comm_semiring S] (f : R →+* S) (x : S) (q : polynomial R) (hp : polynomial.eval₂ f x p = 0) :
polynomial.eval₂ f x (p * q) = 0
theorem polynomial.eval₂_mul_eq_zero_of_right {R : Type u} {S : Type v} [semiring R] {q : polynomial R} [comm_semiring S] (f : R →+* S) (x : S) (p : polynomial R) (hq : polynomial.eval₂ f x q = 0) :
polynomial.eval₂ f x (p * q) = 0
noncomputable def polynomial.eval₂_ring_hom {R : Type u} {S : Type v} [semiring R] [comm_semiring S] (f : R →+* S) (x : S) :

eval₂ as a ring_hom

Equations
@[simp]
theorem polynomial.eval₂_pow {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [comm_semiring S] (f : R →+* S) (x : S) (n : ) :
theorem polynomial.eval₂_dvd {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [comm_semiring S] (f : R →+* S) (x : S) :
theorem polynomial.eval₂_eq_zero_of_dvd_of_eval₂_eq_zero {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [comm_semiring S] (f : R →+* S) (x : S) (h : p q) (h0 : polynomial.eval₂ f x p = 0) :
theorem polynomial.eval₂_list_prod {R : Type u} {S : Type v} [semiring R] [comm_semiring S] (f : R →+* S) (l : list (polynomial R)) (x : S) :
def polynomial.eval {R : Type u} [semiring R] :

eval x p is the evaluation of the polynomial p at x

Equations
theorem polynomial.eval_eq_sum {R : Type u} [semiring R] {p : polynomial R} {x : R} :
polynomial.eval x p = p.sum (λ (e : ) (a : R), a * x ^ e)
theorem polynomial.eval_eq_sum_range {R : Type u} [semiring R] {p : polynomial R} (x : R) :
polynomial.eval x p = (finset.range (p.nat_degree + 1)).sum (λ (i : ), p.coeff i * x ^ i)
theorem polynomial.eval_eq_sum_range' {R : Type u} [semiring R] {p : polynomial R} {n : } (hn : p.nat_degree < n) (x : R) :
polynomial.eval x p = (finset.range n).sum (λ (i : ), p.coeff i * x ^ i)
@[simp]
theorem polynomial.eval₂_at_apply {R : Type u} [semiring R] {p : polynomial R} {S : Type u_1} [semiring S] (f : R →+* S) (r : R) :
@[simp]
theorem polynomial.eval₂_at_one {R : Type u} [semiring R] {p : polynomial R} {S : Type u_1} [semiring S] (f : R →+* S) :
@[simp]
theorem polynomial.eval₂_at_nat_cast {R : Type u} [semiring R] {p : polynomial R} {S : Type u_1} [semiring S] (f : R →+* S) (n : ) :
@[simp]
theorem polynomial.eval_C {R : Type u} {a : R} [semiring R] {x : R} :
@[simp]
theorem polynomial.eval_nat_cast {R : Type u} [semiring R] {x : R} {n : } :
@[simp]
theorem polynomial.eval_X {R : Type u} [semiring R] {x : R} :
@[simp]
theorem polynomial.eval_monomial {R : Type u} [semiring R] {x : R} {n : } {a : R} :
@[simp]
theorem polynomial.eval_zero {R : Type u} [semiring R] {x : R} :
@[simp]
theorem polynomial.eval_add {R : Type u} [semiring R] {p q : polynomial R} {x : R} :
@[simp]
theorem polynomial.eval_one {R : Type u} [semiring R] {x : R} :
@[simp]
theorem polynomial.eval_bit0 {R : Type u} [semiring R] {p : polynomial R} {x : R} :
@[simp]
theorem polynomial.eval_bit1 {R : Type u} [semiring R] {p : polynomial R} {x : R} :
@[simp]
theorem polynomial.eval_smul {R : Type u} {S : Type v} [semiring R] [monoid S] [distrib_mul_action S R] [is_scalar_tower S R R] (s : S) (p : polynomial R) (x : R) :
@[simp]
theorem polynomial.eval_C_mul {R : Type u} {a : R} [semiring R] {p : polynomial R} {x : R} :
theorem polynomial.eval_monomial_one_add_sub {S : Type v} [comm_ring S] (d : ) (y : S) :
polynomial.eval (1 + y) ((polynomial.monomial d) (d + 1)) - polynomial.eval y ((polynomial.monomial d) (d + 1)) = (finset.range (d + 1)).sum (λ (x_1 : ), ((d + 1).choose x_1) * (x_1 * y ^ (x_1 - 1)))

A reformulation of the expansion of (1 + y)^d: $$(d + 1) (1 + y)^d - (d + 1)y^d = \sum_{i = 0}^d {d + 1 \choose i} \cdot i \cdot y^{i - 1}.$$

@[simp]
theorem polynomial.leval_apply {R : Type u_1} [semiring R] (r : R) (f : polynomial R) :
def polynomial.leval {R : Type u_1} [semiring R] (r : R) :

polynomial.eval as linear map

Equations
@[simp]
theorem polynomial.eval_nat_cast_mul {R : Type u} [semiring R] {p : polynomial R} {x : R} {n : } :
@[simp]
theorem polynomial.eval_mul_X {R : Type u} [semiring R] {p : polynomial R} {x : R} :
@[simp]
theorem polynomial.eval_mul_X_pow {R : Type u} [semiring R] {p : polynomial R} {x : R} {k : } :
theorem polynomial.eval_sum {R : Type u} [semiring R] (p : polynomial R) (f : R polynomial R) (x : R) :
polynomial.eval x (p.sum f) = p.sum (λ (n : ) (a : R), polynomial.eval x (f n a))
theorem polynomial.eval_finset_sum {R : Type u} {ι : Type y} [semiring R] (s : finset ι) (g : ι polynomial R) (x : R) :
polynomial.eval x (s.sum (λ (i : ι), g i)) = s.sum (λ (i : ι), polynomial.eval x (g i))
def polynomial.is_root {R : Type u} [semiring R] (p : polynomial R) (a : R) :
Prop

is_root p x implies x is a root of p. The evaluation of p at x is zero

Equations
Instances for polynomial.is_root
@[protected, instance]
def polynomial.is_root.decidable {R : Type u} {a : R} [semiring R] {p : polynomial R} [decidable_eq R] :
Equations
@[simp]
theorem polynomial.is_root.def {R : Type u} {a : R} [semiring R] {p : polynomial R} :
theorem polynomial.is_root.eq_zero {R : Type u} [semiring R] {p : polynomial R} {x : R} (h : p.is_root x) :
theorem polynomial.is_root.dvd {R : Type u_1} [comm_semiring R] {p q : polynomial R} {x : R} (h : p.is_root x) (hpq : p q) :
theorem polynomial.not_is_root_C {R : Type u} [semiring R] (r a : R) (hr : r 0) :
noncomputable def polynomial.comp {R : Type u} [semiring R] (p q : polynomial R) :

The composition of polynomials as a polynomial.

Equations
theorem polynomial.comp_eq_sum_left {R : Type u} [semiring R] {p q : polynomial R} :
p.comp q = p.sum (λ (e : ) (a : R), polynomial.C a * q ^ e)
@[simp]
theorem polynomial.comp_X {R : Type u} [semiring R] {p : polynomial R} :
@[simp]
theorem polynomial.X_comp {R : Type u} [semiring R] {p : polynomial R} :
@[simp]
theorem polynomial.comp_C {R : Type u} {a : R} [semiring R] {p : polynomial R} :
@[simp]
theorem polynomial.C_comp {R : Type u} {a : R} [semiring R] {p : polynomial R} :
@[simp]
theorem polynomial.nat_cast_comp {R : Type u} [semiring R] {p : polynomial R} {n : } :
@[simp]
@[simp]
theorem polynomial.zero_comp {R : Type u} [semiring R] {p : polynomial R} :
0.comp p = 0
@[simp]
@[simp]
theorem polynomial.one_comp {R : Type u} [semiring R] {p : polynomial R} :
1.comp p = 1
@[simp]
theorem polynomial.add_comp {R : Type u} [semiring R] {p q r : polynomial R} :
(p + q).comp r = p.comp r + q.comp r
@[simp]
theorem polynomial.monomial_comp {R : Type u} {a : R} [semiring R] {p : polynomial R} (n : ) :
@[simp]
theorem polynomial.mul_X_comp {R : Type u} [semiring R] {p r : polynomial R} :
(p * polynomial.X).comp r = p.comp r * r
@[simp]
theorem polynomial.X_pow_comp {R : Type u} [semiring R] {p : polynomial R} {k : } :
(polynomial.X ^ k).comp p = p ^ k
@[simp]
theorem polynomial.mul_X_pow_comp {R : Type u} [semiring R] {p r : polynomial R} {k : } :
(p * polynomial.X ^ k).comp r = p.comp r * r ^ k
@[simp]
theorem polynomial.C_mul_comp {R : Type u} {a : R} [semiring R] {p r : polynomial R} :
@[simp]
theorem polynomial.nat_cast_mul_comp {R : Type u} [semiring R] {p r : polynomial R} {n : } :
(n * p).comp r = n * p.comp r
@[simp]
theorem polynomial.mul_comp {R : Type u_1} [comm_semiring R] (p q r : polynomial R) :
(p * q).comp r = p.comp r * q.comp r
@[simp]
theorem polynomial.pow_comp {R : Type u_1} [comm_semiring R] (p q : polynomial R) (n : ) :
(p ^ n).comp q = p.comp q ^ n
@[simp]
theorem polynomial.bit0_comp {R : Type u} [semiring R] {p q : polynomial R} :
(bit0 p).comp q = bit0 (p.comp q)
@[simp]
theorem polynomial.bit1_comp {R : Type u} [semiring R] {p q : polynomial R} :
(bit1 p).comp q = bit1 (p.comp q)
@[simp]
theorem polynomial.smul_comp {R : Type u} {S : Type v} [semiring R] [monoid S] [distrib_mul_action S R] [is_scalar_tower S R R] (s : S) (p q : polynomial R) :
(s p).comp q = s p.comp q
theorem polynomial.comp_assoc {R : Type u_1} [comm_semiring R] (φ ψ χ : polynomial R) :
(φ.comp ψ).comp χ = φ.comp (ψ.comp χ)
noncomputable def polynomial.map {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) :

map f p maps a polynomial p across a ring hom f

Equations
Instances for polynomial.map
@[simp]
theorem polynomial.map_C {R : Type u} {S : Type v} {a : R} [semiring R] [semiring S] (f : R →+* S) :
@[simp]
theorem polynomial.map_X {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) :
@[simp]
theorem polynomial.map_monomial {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) {n : } {a : R} :
@[protected, simp]
theorem polynomial.map_zero {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) :
@[protected, simp]
theorem polynomial.map_add {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [semiring S] (f : R →+* S) :
@[protected, simp]
theorem polynomial.map_one {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) :
@[protected, simp]
theorem polynomial.map_mul {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [semiring S] (f : R →+* S) :
@[protected, simp]
theorem polynomial.map_smul {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (r : R) :
noncomputable def polynomial.map_ring_hom {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) :

polynomial.map as a ring_hom.

Equations
@[simp]
@[protected, simp]
theorem polynomial.map_nat_cast {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (n : ) :
@[protected, simp]
theorem polynomial.map_bit0 {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) :
@[protected, simp]
theorem polynomial.map_bit1 {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) :
theorem polynomial.map_dvd {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) {x y : polynomial R} :
@[simp]
theorem polynomial.coeff_map {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (n : ) :
(polynomial.map f p).coeff n = f (p.coeff n)
noncomputable def polynomial.map_equiv {R : Type u} {S : Type v} [semiring R] [semiring S] (e : R ≃+* S) :

If R and S are isomorphic, then so are their polynomial rings.

Equations
@[simp]
theorem polynomial.map_equiv_apply {R : Type u} {S : Type v} [semiring R] [semiring S] (e : R ≃+* S) (a : polynomial R) :
@[simp]
theorem polynomial.map_equiv_symm_apply {R : Type u} {S : Type v} [semiring R] [semiring S] (e : R ≃+* S) (a : polynomial S) :
theorem polynomial.map_map {R : Type u} {S : Type v} {T : Type w} [semiring R] [semiring S] (f : R →+* S) [semiring T] (g : S →+* T) (p : polynomial R) :
@[simp]
theorem polynomial.map_id {R : Type u} [semiring R] {p : polynomial R} :
theorem polynomial.eval₂_eq_eval_map {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) {x : S} :
theorem polynomial.degree_map_le {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p : polynomial R) :
theorem polynomial.nat_degree_map_le {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p : polynomial R) :
@[protected]
theorem polynomial.map_eq_zero_iff {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] {f : R →+* S} (hf : function.injective f) :
polynomial.map f p = 0 p = 0
@[protected]
theorem polynomial.map_ne_zero_iff {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] {f : R →+* S} (hf : function.injective f) :
theorem polynomial.map_monic_eq_zero_iff {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] {f : R →+* S} (hp : p.monic) :
polynomial.map f p = 0 (x : R), f x = 0
theorem polynomial.map_monic_ne_zero {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] {f : R →+* S} (hp : p.monic) [nontrivial S] :
@[simp]
@[protected]
theorem polynomial.map_list_prod {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (L : list (polynomial R)) :
@[protected, simp]
theorem polynomial.map_pow {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (n : ) :
theorem polynomial.mem_map_srange {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) {p : polynomial S} :
theorem polynomial.mem_map_range {R : Type u_1} {S : Type u_2} [ring R] [ring S] (f : R →+* S) {p : polynomial S} :
theorem polynomial.eval₂_map {R : Type u} {S : Type v} {T : Type w} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) [semiring T] (g : S →+* T) (x : T) :
theorem polynomial.eval_map {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : S) :
@[protected]
theorem polynomial.map_sum {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) {ι : Type u_1} (g : ι polynomial R) (s : finset ι) :
polynomial.map f (s.sum (λ (i : ι), g i)) = s.sum (λ (i : ι), polynomial.map f (g i))
theorem polynomial.map_comp {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p q : polynomial R) :
@[simp]
theorem polynomial.eval_zero_map {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p : polynomial R) :
@[simp]
theorem polynomial.eval_one_map {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p : polynomial R) :
@[simp]
theorem polynomial.eval_nat_cast_map {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p : polynomial R) (n : ) :
@[simp]
theorem polynomial.eval_int_cast_map {R : Type u_1} {S : Type u_2} [ring R] [ring S] (f : R →+* S) (p : polynomial R) (i : ) :

we have made eval₂ irreducible from the start.

Perhaps we can make also eval, comp, and map irreducible too?

theorem polynomial.hom_eval₂ {R : Type u} {S : Type v} {T : Type w} [semiring R] (p : polynomial R) [semiring S] [semiring T] (f : R →+* S) (g : S →+* T) (x : S) :
theorem polynomial.eval₂_hom {R : Type u} {S : Type v} [semiring R] {p : polynomial R} [semiring S] (f : R →+* S) (x : R) :
theorem polynomial.eval₂_comp {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [comm_semiring S] (f : R →+* S) {x : S} :
@[simp]
theorem polynomial.iterate_comp_eval₂ {R : Type u} {S : Type v} [semiring R] {p q : polynomial R} [comm_semiring S] (f : R →+* S) (k : ) (t : S) :
polynomial.eval₂ f t (p.comp^[k] q) = (λ (x : S), polynomial.eval₂ f x p)^[k] (polynomial.eval₂ f t q)
@[simp]
theorem polynomial.eval_mul {R : Type u} [comm_semiring R] {p q : polynomial R} {x : R} :
noncomputable def polynomial.eval_ring_hom {R : Type u} [comm_semiring R] :

eval r, regarded as a ring homomorphism from R[X] to R.

Equations
@[simp]
theorem polynomial.eval_pow {R : Type u} [comm_semiring R] {p : polynomial R} {x : R} (n : ) :
@[simp]
theorem polynomial.eval_comp {R : Type u} [comm_semiring R] {p q : polynomial R} {x : R} :
@[simp]
theorem polynomial.iterate_comp_eval {R : Type u} [comm_semiring R] {p q : polynomial R} (k : ) (t : R) :
polynomial.eval t (p.comp^[k] q) = (λ (x : R), polynomial.eval x p)^[k] (polynomial.eval t q)

comp p, regarded as a ring homomorphism from R[X] to itself.

Equations
@[simp]
theorem polynomial.coe_comp_ring_hom {R : Type u} [comm_semiring R] (q : polynomial R) :
(q.comp_ring_hom) = λ (p : polynomial R), p.comp q
theorem polynomial.root_mul_left_of_is_root {R : Type u} {a : R} [comm_semiring R] (p : polynomial R) {q : polynomial R} :
q.is_root a (p * q).is_root a
theorem polynomial.root_mul_right_of_is_root {R : Type u} {a : R} [comm_semiring R] {p : polynomial R} (q : polynomial R) :
p.is_root a (p * q).is_root a
theorem polynomial.eval₂_finset_prod {R : Type u} {S : Type v} {ι : Type y} [comm_semiring R] [comm_semiring S] (f : R →+* S) (s : finset ι) (g : ι polynomial R) (x : S) :
polynomial.eval₂ f x (s.prod (λ (i : ι), g i)) = s.prod (λ (i : ι), polynomial.eval₂ f x (g i))

Polynomial evaluation commutes with list.prod

Polynomial evaluation commutes with multiset.prod

theorem polynomial.eval_prod {R : Type u} [comm_semiring R] {ι : Type u_1} (s : finset ι) (p : ι polynomial R) (x : R) :
polynomial.eval x (s.prod (λ (j : ι), p j)) = s.prod (λ (j : ι), polynomial.eval x (p j))

Polynomial evaluation commutes with finset.prod

theorem polynomial.list_prod_comp {R : Type u} [comm_semiring R] (l : list (polynomial R)) (q : polynomial R) :
l.prod.comp q = (list.map (λ (p : polynomial R), p.comp q) l).prod
theorem polynomial.multiset_prod_comp {R : Type u} [comm_semiring R] (s : multiset (polynomial R)) (q : polynomial R) :
s.prod.comp q = (multiset.map (λ (p : polynomial R), p.comp q) s).prod
theorem polynomial.prod_comp {R : Type u} [comm_semiring R] {ι : Type u_1} (s : finset ι) (p : ι polynomial R) (q : polynomial R) :
(s.prod (λ (j : ι), p j)).comp q = s.prod (λ (j : ι), (p j).comp q)
theorem polynomial.is_root_prod {R : Type u_1} [comm_ring R] [is_domain R] {ι : Type u_2} (s : finset ι) (p : ι polynomial R) (x : R) :
(s.prod (λ (j : ι), p j)).is_root x (i : ι) (H : i s), (p i).is_root x
theorem polynomial.eval_dvd {R : Type u} [comm_semiring R] {p q : polynomial R} {x : R} :
@[simp]
theorem polynomial.eval_geom_sum {R : Type u_1} [comm_semiring R] {n : } {x : R} :
polynomial.eval x ((finset.range n).sum (λ (i : ), polynomial.X ^ i)) = (finset.range n).sum (λ (i : ), x ^ i)
theorem polynomial.support_map_subset {R : Type u} {S : Type v} [semiring R] [semiring S] (f : R →+* S) (p : polynomial R) :
@[protected]
@[protected]
theorem polynomial.map_prod {R : Type u} {S : Type v} [comm_semiring R] [comm_semiring S] (f : R →+* S) {ι : Type u_1} (g : ι polynomial R) (s : finset ι) :
polynomial.map f (s.prod (λ (i : ι), g i)) = s.prod (λ (i : ι), polynomial.map f (g i))
theorem polynomial.is_root.map {R : Type u} {S : Type v} [comm_semiring R] [comm_semiring S] {f : R →+* S} {x : R} {p : polynomial R} (h : p.is_root x) :
theorem polynomial.is_root.of_map {S : Type v} [comm_semiring S] {R : Type u_1} [comm_ring R] {f : R →+* S} {x : R} {p : polynomial R} (h : (polynomial.map f p).is_root (f x)) (hf : function.injective f) :
theorem polynomial.is_root_map_iff {S : Type v} [comm_semiring S] {R : Type u_1} [comm_ring R] {f : R →+* S} {x : R} {p : polynomial R} (hf : function.injective f) :
theorem polynomial.C_neg {R : Type u} {a : R} [ring R] :
theorem polynomial.C_sub {R : Type u} {a b : R} [ring R] :
@[protected, simp]
theorem polynomial.map_sub {R : Type u} [ring R] {p q : polynomial R} {S : Type u_1} [ring S] (f : R →+* S) :
@[protected, simp]
theorem polynomial.map_neg {R : Type u} [ring R] {p : polynomial R} {S : Type u_1} [ring S] (f : R →+* S) :
@[simp]
theorem polynomial.map_int_cast {R : Type u} [ring R] {S : Type u_1} [ring S] (f : R →+* S) (n : ) :
@[simp]
theorem polynomial.eval_int_cast {R : Type u} [ring R] {n : } {x : R} :
@[simp]
theorem polynomial.eval₂_neg {R : Type u} [ring R] {p : polynomial R} {S : Type u_1} [ring S] (f : R →+* S) {x : S} :
@[simp]
theorem polynomial.eval₂_sub {R : Type u} [ring R] {p q : polynomial R} {S : Type u_1} [ring S] (f : R →+* S) {x : S} :
@[simp]
theorem polynomial.eval_neg {R : Type u} [ring R] (p : polynomial R) (x : R) :
@[simp]
theorem polynomial.eval_sub {R : Type u} [ring R] (p q : polynomial R) (x : R) :
theorem polynomial.root_X_sub_C {R : Type u} {a b : R} [ring R] :
@[simp]
theorem polynomial.neg_comp {R : Type u} [ring R] {p q : polynomial R} :
(-p).comp q = -p.comp q
@[simp]
theorem polynomial.sub_comp {R : Type u} [ring R] {p q r : polynomial R} :
(p - q).comp r = p.comp r - q.comp r
@[simp]
theorem polynomial.cast_int_comp {R : Type u} [ring R] {p : polynomial R} (i : ) :