Skip to main content

zinc_poly/
univariate.rs

1use crypto_primitives::PrimeField;
2use zinc_utils::from_ref::FromRef;
3
4pub mod binary_ref;
5pub mod binary_u64;
6pub mod dense;
7pub mod dynamic;
8pub mod nat_evaluation;
9
10/// Shared projection helper for binary polynomials.
11/// `get_coeff` should return true if the i-th coefficient is 1.
12fn prepare_projection<F, P, GetCoeff, const N: usize>(
13    sampled_value: &F,
14    get_coeff: GetCoeff,
15) -> impl Fn(&P) -> F + 'static
16where
17    F: PrimeField + FromRef<F> + 'static,
18    GetCoeff: Fn(&P, usize) -> bool + 'static,
19{
20    let field_cfg = sampled_value.cfg().clone();
21    let r_powers = {
22        let mut r_powers = Vec::with_capacity(N);
23        let mut curr = F::one_with_cfg(&field_cfg);
24        r_powers.push(curr.clone());
25        for _ in 1..N {
26            curr *= sampled_value;
27            r_powers.push(curr.clone());
28        }
29        r_powers
30    };
31    move |poly: &P| {
32        let mut acc = F::zero_with_cfg(&field_cfg);
33        for (i, r) in r_powers.iter().enumerate() {
34            if get_coeff(poly, i) {
35                acc += r.clone();
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}