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;
112 for (
size_t i = 4; i < multivariate_n; i++) {
131 for (
auto& poly : zero_polynomials) {
137 for (
auto [full_poly, zero_poly] :
zip_view(full_polynomials.get_all(), zero_polynomials)) {
138 full_poly = zero_poly.share();
160 auto prover_transcript = Flavor::Transcript::prover_init_empty();
161 FF prover_alpha = prover_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
163 std::vector<FF> prover_gate_challenges(virtual_log_n);
164 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
165 prover_gate_challenges[idx] =
166 prover_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
173 prover_gate_challenges,
178 ZKData zk_sumcheck_data = ZKData(multivariate_d, prover_transcript);
182 auto verifier_transcript = Flavor::Transcript::verifier_init_empty(prover_transcript);
185 FF verifier_alpha = verifier_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
186 std::vector<FF> verifier_gate_challenges(virtual_log_n);
187 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
188 verifier_gate_challenges[idx] =
189 verifier_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
195 std::vector<FF> padding_indicator_array(virtual_log_n,
FF(1));
197 auto verifier_output =
198 sumcheck_verifier.verify(relation_parameters, verifier_gate_challenges, padding_indicator_array);
201 EXPECT_TRUE(verifier_output.verified)
202 <<
"ZK Sumcheck should succeed with RowDisablingPolynomial masking random padding rows";
205 EXPECT_EQ(prover_output.
challenge.size(), verifier_output.challenge.size());
206 for (
size_t i = 0; i < prover_output.
challenge.size(); i++) {
207 EXPECT_EQ(prover_output.
challenge[i], verifier_output.challenge[i]);
222 using SumcheckRound =
typename TestFixture::SumcheckRound;
224 const size_t multivariate_d = 4;
225 const size_t multivariate_n = 1 << multivariate_d;
227 const size_t NUM_DISABLED_ROWS = 4;
231 for (
auto& poly : test_polynomials) {
234 for (
size_t i = multivariate_n - NUM_DISABLED_ROWS; i < multivariate_n; i++) {
235 poly.at(i) =
FF(i + 1);
240 for (
auto [full_poly, test_poly] :
zip_view(full_polynomials.get_all(), test_polynomials)) {
241 full_poly = test_poly.share();
245 auto setup = TestFixture::create_sumcheck_setup(multivariate_d);
256 for (
auto [pe_poly, full_poly] :
zip_view(partially_evaluated.get_all(), full_polynomials.get_all())) {
258 for (
size_t i = 0; i < multivariate_n / 2; i++) {
260 pe_poly.at(i) = full_poly[2 * i] + (u_0 * (full_poly[(2 * i) + 1] - full_poly[2 * i]));
264 SumcheckRound round(multivariate_n / 2);
269 EXPECT_EQ(row_disabling_polynomial.
eval_at_0,
FF(1));
270 EXPECT_EQ(row_disabling_polynomial.
eval_at_1,
FF(1));
276 EXPECT_EQ(row_disabling_polynomial.
eval_at_0,
FF(0));
277 EXPECT_EQ(row_disabling_polynomial.
eval_at_1,
FF(1));
282 std::vector<FF> challenges(multivariate_d);
283 for (
auto& c : challenges) {
302 FF expected_sum_lagranges =
FF(1);
303 for (
size_t i = 2; i < multivariate_d; i++) {
304 expected_sum_lagranges *= challenges[i];
307 FF expected_eval =
FF(1) - expected_sum_lagranges;
309 EXPECT_EQ(eval, expected_eval) <<
"Row disabling polynomial should equal (1 - X_2 * X_3 * ... * X_{d-1})";
311 info(
"Verified: L_{n-1} + L_{n-2} + L_{n-3} + L_{n-4} = X_2 × X_3 × ... × X_{d-1}");
325 const size_t NUM_RANDOM_ROWS = 4;
326 const size_t multivariate_d = 4;
327 const size_t multivariate_n = 1 << multivariate_d;
328 const size_t virtual_log_n = multivariate_d;
330 const size_t valid_rows = multivariate_n - NUM_RANDOM_ROWS;
333 std::vector<FF> w_l(multivariate_n);
334 std::vector<FF> w_r(multivariate_n);
335 std::vector<FF> w_o(multivariate_n);
336 std::vector<FF> w_4(multivariate_n);
337 std::vector<FF> q_m(multivariate_n);
338 std::vector<FF> q_l(multivariate_n);
339 std::vector<FF> q_r(multivariate_n);
340 std::vector<FF> q_o(multivariate_n);
341 std::vector<FF> q_c(multivariate_n);
342 std::vector<FF> q_arith(multivariate_n);
345 for (
size_t i = 0; i < valid_rows; i++) {
348 w_o[i] = -
FF((2 * i) + 1);
359 for (
size_t i = valid_rows; i < multivariate_n; i++) {
376 for (
auto& poly : random_polynomials) {
378 for (
size_t i = 0; i < multivariate_n; i++) {
384 for (
auto [full_poly, random_poly] :
zip_view(full_polynomials.get_all(), random_polynomials)) {
385 full_poly = random_poly.share();
405 auto prover_transcript = Flavor::Transcript::prover_init_empty();
406 FF prover_alpha = prover_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
408 std::vector<FF> prover_gate_challenges(virtual_log_n);
409 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
410 prover_gate_challenges[idx] =
411 prover_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
418 prover_gate_challenges,
425 auto verifier_transcript = Flavor::Transcript::verifier_init_empty(prover_transcript);
428 FF verifier_alpha = verifier_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
429 std::vector<FF> verifier_gate_challenges(virtual_log_n);
430 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
431 verifier_gate_challenges[idx] =
432 verifier_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
437 std::vector<FF> padding_indicator_array(virtual_log_n,
FF(1));
439 auto verifier_output =
440 sumcheck_verifier.verify(relation_parameters, verifier_gate_challenges, padding_indicator_array);
443 EXPECT_FALSE(verifier_output.verified)
444 <<
"Non-ZK Sumcheck should FAIL when random values break relations (no RowDisablingPolynomial)";