Skip to main content

zinc_poly/
univariate.rs

1pub mod binary_ref;
2pub mod binary_u64;
3pub mod dense;
4pub mod dynamic;
5pub mod nat_evaluation;
6
7use crypto_primitives::FieldConfig;
8
9/// Shared projection helper for binary polynomials.
10/// `get_coeff` should return true if the i-th coefficient is 1.
11fn prepare_projection<C, P, GetCoeff, const N: usize>(
12    cfg: &C,
13    sampled_value: &C::Element,
14    get_coeff: GetCoeff,
15) -> impl Fn(&P) -> C::Element
16where
17    C: FieldConfig + 'static,
18    GetCoeff: Fn(&P, usize) -> bool + Send + Sync + 'static,
19{
20    let cfg = cfg.clone();
21    let r_powers = {
22        let mut r_powers = Vec::with_capacity(N);
23        let mut curr = cfg.one();
24        r_powers.push(curr.clone());
25        for _ in 1..N {
26            cfg.mul_assign(&mut curr, sampled_value);
27            r_powers.push(curr.clone());
28        }
29        r_powers
30    };
31    move |poly: &P| {
32        let mut acc = cfg.zero();
33        for (i, r) in r_powers.iter().enumerate() {
34            if get_coeff(poly, i) {
35                cfg.add_assign(&mut acc, r);
36            }
37        }
38        acc
39    }
40}
41pub mod binary {
42    #[cfg(not(feature = "simd"))]
43    pub use crate::univariate::binary_ref::{
44        BinaryRefPoly as BinaryPoly, BinaryRefPolyInnerProduct as BinaryPolyInnerProduct,
45    };
46    #[cfg(feature = "simd")]
47    pub use crate::univariate::binary_u64::{
48        BinaryU64Poly as BinaryPoly, BinaryU64PolyInnerProduct as BinaryPolyInnerProduct,
49    };
50}