89 const size_t multivariate_d = 3;
90 const size_t multivariate_n = 1 << multivariate_d;
91 const size_t virtual_log_n = multivariate_d;
109 for (
size_t i = 0; i < NUM_DISABLED_ROWS_IN_SUMCHECK; i++) {
128 for (
auto& poly : zero_polynomials) {
134 for (
auto [full_poly, zero_poly] :
zip_view(full_polynomials.get_all(), zero_polynomials)) {
135 full_poly = zero_poly.share();
157 auto prover_transcript = Flavor::Transcript::test_prover_init_empty();
158 FF prover_alpha = prover_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
160 std::vector<FF> prover_gate_challenges(virtual_log_n);
161 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
162 prover_gate_challenges[idx] =
163 prover_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
170 prover_gate_challenges,
175 ZKData zk_sumcheck_data = ZKData(multivariate_d, prover_transcript);
179 auto verifier_transcript = Flavor::Transcript::test_verifier_init_empty(prover_transcript);
182 FF verifier_alpha = verifier_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
183 std::vector<FF> verifier_gate_challenges(virtual_log_n);
184 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
185 verifier_gate_challenges[idx] =
186 verifier_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
191 auto verifier_output = sumcheck_verifier.verify(relation_parameters, verifier_gate_challenges);
194 EXPECT_TRUE(verifier_output.verified)
195 <<
"ZK Sumcheck should succeed with RowDisablingPolynomial masking random padding rows";
198 EXPECT_EQ(prover_output.
challenge.size(), verifier_output.challenge.size());
199 for (
size_t i = 0; i < prover_output.
challenge.size(); i++) {
200 EXPECT_EQ(prover_output.
challenge[i], verifier_output.challenge[i]);
215 using SumcheckRound =
typename TestFixture::SumcheckRound;
217 const size_t multivariate_d = 4;
218 const size_t multivariate_n = 1 << multivariate_d;
220 const size_t NUM_DISABLED_ROWS = 4;
224 for (
auto& poly : test_polynomials) {
227 for (
size_t i = 0; i < NUM_DISABLED_ROWS; i++) {
228 poly.at(i) =
FF(i + 1);
233 for (
auto [full_poly, test_poly] :
zip_view(full_polynomials.get_all(), test_polynomials)) {
234 full_poly = test_poly.share();
238 auto setup = TestFixture::create_sumcheck_setup(multivariate_d);
249 for (
auto [pe_poly, full_poly] :
zip_view(partially_evaluated.get_all(), full_polynomials.get_all())) {
251 for (
size_t i = 0; i < multivariate_n / 2; i++) {
253 pe_poly.at(i) = full_poly[2 * i] + (u_0 * (full_poly[(2 * i) + 1] - full_poly[2 * i]));
257 SumcheckRound round(multivariate_n / 2);
262 EXPECT_EQ(row_disabling_polynomial.
eval_at_0,
FF(1));
263 EXPECT_EQ(row_disabling_polynomial.
eval_at_1,
FF(1));
269 EXPECT_EQ(row_disabling_polynomial.
eval_at_0,
FF(1));
270 EXPECT_EQ(row_disabling_polynomial.
eval_at_1,
FF(0));
275 std::vector<FF> challenges(multivariate_d);
276 for (
auto& c : challenges) {
291 FF expected_sum_lagranges =
FF(1);
292 for (
size_t i = 2; i < multivariate_d; i++) {
293 expected_sum_lagranges *= (
FF(1) - challenges[i]);
296 FF expected_eval =
FF(1) - expected_sum_lagranges;
298 EXPECT_EQ(eval, expected_eval) <<
"Row disabling polynomial should equal 1 - ∏_{i≥2}(1 - X_i)";
312 const size_t NUM_RANDOM_ROWS = 4;
313 const size_t multivariate_d = 4;
314 const size_t multivariate_n = 1 << multivariate_d;
315 const size_t virtual_log_n = multivariate_d;
317 const size_t valid_rows = multivariate_n - NUM_RANDOM_ROWS;
320 std::vector<FF> w_l(multivariate_n);
321 std::vector<FF> w_r(multivariate_n);
322 std::vector<FF> w_o(multivariate_n);
323 std::vector<FF> w_4(multivariate_n);
324 std::vector<FF> q_m(multivariate_n);
325 std::vector<FF> q_l(multivariate_n);
326 std::vector<FF> q_r(multivariate_n);
327 std::vector<FF> q_o(multivariate_n);
328 std::vector<FF> q_c(multivariate_n);
329 std::vector<FF> q_arith(multivariate_n);
332 for (
size_t i = 0; i < valid_rows; i++) {
335 w_o[i] = -
FF((2 * i) + 1);
346 for (
size_t i = valid_rows; i < multivariate_n; i++) {
363 for (
auto& poly : random_polynomials) {
365 for (
size_t i = 0; i < multivariate_n; i++) {
371 for (
auto [full_poly, random_poly] :
zip_view(full_polynomials.get_all(), random_polynomials)) {
372 full_poly = random_poly.share();
392 auto prover_transcript = Flavor::Transcript::test_prover_init_empty();
393 FF prover_alpha = prover_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
395 std::vector<FF> prover_gate_challenges(virtual_log_n);
396 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
397 prover_gate_challenges[idx] =
398 prover_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
405 prover_gate_challenges,
412 auto verifier_transcript = Flavor::Transcript::test_verifier_init_empty(prover_transcript);
415 FF verifier_alpha = verifier_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
416 std::vector<FF> verifier_gate_challenges(virtual_log_n);
417 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
418 verifier_gate_challenges[idx] =
419 verifier_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
424 auto verifier_output = sumcheck_verifier.verify(relation_parameters, verifier_gate_challenges);
427 EXPECT_FALSE(verifier_output.verified)
428 <<
"Non-ZK Sumcheck should FAIL when random values break relations (no RowDisablingPolynomial)";