Documentation

CompPoly.Multivariate.Eval

Evaluation of computable multivariate polynomials, bundled and over Finsets #

CompPoly records that CMvPolynomial.eval vals respects each ring operation separately (eval_zero, eval_one, eval_add, eval_mul, eval_C, …), which is what simp/grind need to normalize a fixed expression. Two things are missing for reasoning about a family of polynomials: the value of a bare variable, and commutation with Finset.sum / Finset.prod.

Both follow at once from bundling: CMvPolynomial.eval vals is eval₂Hom (RingHom.id R) vals, so map_sum and map_prod apply verbatim. evalHom records that bundling; the two Finset lemmas are its immediate corollaries, stated in unbundled form so that call sites can rewrite without unfolding.

def CPoly.CMvPolynomial.evalHom {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) :

Evaluation at a fixed point, bundled as a ring homomorphism — the identity-coefficient case of eval₂Hom. This is what gives evaluation the map_* API of a RingHom.

Instances For
    @[simp]
    theorem CPoly.CMvPolynomial.evalHom_apply {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) (p : CMvPolynomial n R) :
    (evalHom vals) p = eval vals p
    @[simp]
    theorem CPoly.CMvPolynomial.eval_zero {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) :
    eval vals 0 = 0
    @[simp]
    theorem CPoly.CMvPolynomial.eval_one {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) :
    eval vals 1 = 1
    @[simp]
    theorem CPoly.CMvPolynomial.eval_C {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) (c : R) :
    eval vals (C c) = c
    @[simp]
    theorem CPoly.CMvPolynomial.eval_X {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) (i : Fin n) :
    eval vals (X i) = vals i
    @[simp]
    theorem CPoly.CMvPolynomial.eval_add {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) (p q : CMvPolynomial n R) :
    eval vals (p + q) = eval vals p + eval vals q
    @[simp]
    theorem CPoly.CMvPolynomial.eval_mul {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) (p q : CMvPolynomial n R) :
    eval vals (p * q) = eval vals p * eval vals q
    @[simp]
    theorem CPoly.CMvPolynomial.eval_pow {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) (p : CMvPolynomial n R) (k : ) :
    eval vals (p ^ k) = eval vals p ^ k
    @[simp]
    theorem CPoly.CMvPolynomial.eval_neg {n : } {R : Type} [CommRing R] [BEq R] [LawfulBEq R] (vals : Fin nR) (p : CMvPolynomial n R) :
    eval vals (-p) = -eval vals p
    @[simp]
    theorem CPoly.CMvPolynomial.eval_sub {n : } {R : Type} [CommRing R] [BEq R] [LawfulBEq R] (vals : Fin nR) (p q : CMvPolynomial n R) :
    eval vals (p - q) = eval vals p - eval vals q
    theorem CPoly.CMvPolynomial.eval_sum {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) {ι : Type u_2} (s : Finset ι) (f : ιCMvPolynomial n R) :
    eval vals (∑ is, f i) = is, eval vals (f i)

    Evaluation commutes with a finite sum of polynomials.

    theorem CPoly.CMvPolynomial.eval_prod {n : } {R : Type u_1} [CommSemiring R] [BEq R] [LawfulBEq R] (vals : Fin nR) {ι : Type u_2} (s : Finset ι) (f : ιCMvPolynomial n R) :
    eval vals (∏ is, f i) = is, eval vals (f i)

    Evaluation commutes with a finite product of polynomials.

    Transporting a whole polynomial #

    The lemmas above are enough for statements about values. A statement about degrees is not determined by values (two distinct polynomials agree everywhere over a finite field), so it has to cross the representation boundary at the level of the polynomial itself, through fromCMvPolynomial. That map is the forward direction of polyRingEquiv, hence a ring homomorphism, so it too commutes with Finset.sum and Finset.prod.

    theorem CPoly.CMvPolynomial.eval_ext_univariate {R : Type u_2} [CommRing R] [DecidableEq R] [BEq R] [LawfulBEq R] [IsDomain R] {p q : CMvPolynomial 1 R} {d : } {S : Finset R} (hdeg : MvPolynomial.degreeOf 0 (fromCMvPolynomial p - fromCMvPolynomial q) d) (hagree : d < {rS | eval (fun (x : Fin 1) => r) p = eval (fun (x : Fin 1) => r) q}.card) :
    p = q

    Bridge from univariate eval-extensionality. Two single-variable CMvPolynomials over an integral domain that agree on more than $d$ points of a Finset S are equal, when $d$ bounds the degreeOf 0 of their difference through the CPolynomial.cmvEquiv bridge.

    The hypothesis form matches Schwartz–Zippel usage at call sites: callers typically have a degree bound on the difference polynomial, not on p and q individually.