diff --git a/src/spartan/ppsnark.rs b/src/spartan/ppsnark.rs index 109a7b2c0..56edc70e6 100644 --- a/src/spartan/ppsnark.rs +++ b/src/spartan/ppsnark.rs @@ -927,13 +927,15 @@ impl> RelaxedR1CSSNARKTrait for Relax let eval_X = { // constant term - let mut poly_X = vec![(0, U.u)]; - //remaining inputs - poly_X.extend( - (0..U.X.len()) - .map(|i| (i + 1, U.X[i])) - .collect::>(), - ); + let poly_X = std::iter::once((0, U.u)) + .chain( + //remaining inputs + (0..U.X.len()) + // filter_map uses the sparsity of the polynomial, if irrelevant + // we should replace by UniPoly + .filter_map(|i| (!U.X[i].is_zero_vartime()).then_some((i + 1, U.X[i]))), + ) + .collect(); SparsePolynomial::new(vk.num_vars.log_2(), poly_X).evaluate(&rand_sc_unpad[1..]) };