use crate::field::extension_field::target::{ExtensionAlgebraTarget, ExtensionTarget}; use crate::field::extension_field::Extendable; use crate::iop::target::Target; use crate::plonk::circuit_builder::CircuitBuilder; use crate::util::reducing::ReducingFactorTarget; pub struct PolynomialCoeffsExtTarget(pub Vec>); impl PolynomialCoeffsExtTarget { pub fn len(&self) -> usize { self.0.len() } pub fn eval_scalar>( &self, builder: &mut CircuitBuilder, point: Target, ) -> ExtensionTarget { let point = builder.convert_to_ext(point); let mut point = ReducingFactorTarget::new(point); point.reduce(&self.0, builder) } pub fn eval>( &self, builder: &mut CircuitBuilder, point: ExtensionTarget, ) -> ExtensionTarget { let mut point = ReducingFactorTarget::new(point); point.reduce(&self.0, builder) } } pub struct PolynomialCoeffsExtAlgebraTarget(pub Vec>); impl PolynomialCoeffsExtAlgebraTarget { pub fn eval_scalar( &self, builder: &mut CircuitBuilder, point: ExtensionTarget, ) -> ExtensionAlgebraTarget where F: Extendable, { let mut acc = builder.zero_ext_algebra(); for &c in self.0.iter().rev() { acc = builder.scalar_mul_add_ext_algebra(point, acc, c); } acc } pub fn eval( &self, builder: &mut CircuitBuilder, point: ExtensionAlgebraTarget, ) -> ExtensionAlgebraTarget where F: Extendable, { let mut acc = builder.zero_ext_algebra(); for &c in self.0.iter().rev() { acc = builder.mul_add_ext_algebra(point, acc, c); } acc } /// Evaluate the polynomial at a point given its powers. The first power is the point itself, not 1. pub fn eval_with_powers( &self, builder: &mut CircuitBuilder, powers: &[ExtensionAlgebraTarget], ) -> ExtensionAlgebraTarget where F: Extendable, { debug_assert_eq!(self.0.len(), powers.len() + 1); let acc = self.0[0]; self.0[1..] .iter() .zip(powers) .fold(acc, |acc, (&x, &c)| builder.mul_add_ext_algebra(c, x, acc)) } }