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
10fn 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}