sonobe_primitives/algebra/ops/
poly.rs1use ark_ff::{Field, PrimeField, Zero};
4use ark_poly::{DenseMultilinearExtension, EvaluationDomain, GeneralEvaluationDomain};
5use ark_r1cs_std::fields::{FieldVar, fp::FpVar};
6use ark_relations::gr1cs::SynthesisError;
7use ark_std::log2;
8
9use super::pow::Pow;
10
11pub trait MLEHelper<F> {
13 fn from_evaluations(evaluations: &[F]) -> Self;
17}
18
19impl<F: Field> MLEHelper<F> for DenseMultilinearExtension<F> {
20 fn from_evaluations(evaluations: &[F]) -> Self {
21 let l = evaluations.len();
22 let pad = vec![Zero::zero(); l.next_power_of_two() - l];
23 Self::from_evaluations_vec(log2(l) as usize, [evaluations, &pad].concat())
24 }
25}
26
27pub trait EvaluationDomainGadget<F: PrimeField> {
30 fn evaluate_all_lagrange_coefficients_var(
35 &self,
36 tau: &FpVar<F>,
37 ) -> Result<Vec<FpVar<F>>, SynthesisError>;
38
39 fn evaluate_vanishing_polynomial_var(&self, tau: &FpVar<F>)
44 -> Result<FpVar<F>, SynthesisError>;
45}
46
47impl<F: PrimeField> EvaluationDomainGadget<F> for GeneralEvaluationDomain<F> {
48 fn evaluate_all_lagrange_coefficients_var(
49 &self,
50 tau: &FpVar<F>,
51 ) -> Result<Vec<FpVar<F>>, SynthesisError> {
52 let size = self.size() as u64;
53 let size_inv = self.size_inv();
54 let offset = self.coset_offset();
55 let offset_inv = self.coset_offset_inv();
56 let group_gen = self.group_gen();
57
58 let l_i = (tau.pow_by_constant([size])? * offset_inv.pow([size - 1]) - offset) * size_inv;
61
62 group_gen
63 .powers(size as usize)
64 .into_iter()
65 .map(|g| (&l_i * g).mul_by_inverse(&(tau - offset * g)))
66 .collect()
67 }
68
69 fn evaluate_vanishing_polynomial_var(
70 &self,
71 tau: &FpVar<F>,
72 ) -> Result<FpVar<F>, SynthesisError> {
73 Ok(tau.pow_by_constant([self.size() as u64])? - self.coset_offset_pow_size())
74 }
75}