arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
miden-crypto/src/gkr/multivariate/eq_poly.rs
src/gkr/multivariate/eq_poly.rsRaw
 1use super::FieldElement;
 2
 3pub struct EqPolynomial<E> {
 4    r: Vec<E>,
 5}
 6
 7impl<E: FieldElement> EqPolynomial<E> {
 8    pub fn new(r: Vec<E>) -> Self {
 9        EqPolynomial { r }
10    }
11
12    pub fn evaluate(&self, rho: &[E]) -> E {
13        assert_eq!(self.r.len(), rho.len());
14        (0..rho.len())
15            .map(|i| self.r[i] * rho[i] + (E::ONE - self.r[i]) * (E::ONE - rho[i]))
16            .fold(E::ONE, |acc, term| acc * term)
17    }
18
19    pub fn evaluations(&self) -> Vec<E> {
20        let nu = self.r.len();
21
22        let mut evals: Vec<E> = vec![E::ONE; 1 << nu];
23        let mut size = 1;
24        for j in 0..nu {
25            size *= 2;
26            for i in (0..size).rev().step_by(2) {
27                let scalar = evals[i / 2];
28                evals[i] = scalar * self.r[j];
29                evals[i - 1] = scalar - evals[i];
30            }
31        }
32        evals
33    }
34}