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}