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())) {
259 for (
size_t i = 0; i < multivariate_n / 2; i++) {
261 pe_poly.at(i) = full_poly[2 * i] + (u_0 * (full_poly[(2 * i) + 1] - full_poly[2 * i]));
265 SumcheckRound round(multivariate_n / 2);
270 EXPECT_EQ(row_disabling_polynomial.
eval_at_0,
FF(1));
271 EXPECT_EQ(row_disabling_polynomial.
eval_at_1,
FF(1));
277 EXPECT_EQ(row_disabling_polynomial.
eval_at_0,
FF(0));
278 EXPECT_EQ(row_disabling_polynomial.
eval_at_1,
FF(1));
283 std::vector<FF> challenges(multivariate_d);
284 for (
auto& c : challenges) {
303 FF expected_sum_lagranges =
FF(1);
304 for (
size_t i = 2; i < multivariate_d; i++) {
305 expected_sum_lagranges *= challenges[i];
308 FF expected_eval =
FF(1) - expected_sum_lagranges;
310 EXPECT_EQ(eval, expected_eval) <<
"Row disabling polynomial should equal (1 - X_2 * X_3 * ... * X_{d-1})";
312 info(
"Verified: L_{n-1} + L_{n-2} + L_{n-3} + L_{n-4} = X_2 × X_3 × ... × X_{d-1}");
326 const size_t NUM_RANDOM_ROWS = 4;
327 const size_t multivariate_d = 4;
328 const size_t multivariate_n = 1 << multivariate_d;
329 const size_t virtual_log_n = multivariate_d;
331 const size_t valid_rows = multivariate_n - NUM_RANDOM_ROWS;
334 std::vector<FF> w_l(multivariate_n);
335 std::vector<FF> w_r(multivariate_n);
336 std::vector<FF> w_o(multivariate_n);
337 std::vector<FF> w_4(multivariate_n);
338 std::vector<FF> q_m(multivariate_n);
339 std::vector<FF> q_l(multivariate_n);
340 std::vector<FF> q_r(multivariate_n);
341 std::vector<FF> q_o(multivariate_n);
342 std::vector<FF> q_c(multivariate_n);
343 std::vector<FF> q_arith(multivariate_n);
346 for (
size_t i = 0; i < valid_rows; i++) {
349 w_o[i] = -
FF((2 * i) + 1);
360 for (
size_t i = valid_rows; i < multivariate_n; i++) {
377 for (
auto& poly : random_polynomials) {
379 for (
size_t i = 0; i < multivariate_n; i++) {
385 for (
auto [full_poly, random_poly] :
zip_view(full_polynomials.get_all(), random_polynomials)) {
386 full_poly = random_poly.share();
406 auto prover_transcript = Flavor::Transcript::prover_init_empty();
407 FF prover_alpha = prover_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
409 std::vector<FF> prover_gate_challenges(virtual_log_n);
410 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
411 prover_gate_challenges[idx] =
412 prover_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
419 prover_gate_challenges,
426 auto verifier_transcript = Flavor::Transcript::verifier_init_empty(prover_transcript);
429 FF verifier_alpha = verifier_transcript->template get_challenge<FF>(
"Sumcheck:alpha");
430 std::vector<FF> verifier_gate_challenges(virtual_log_n);
431 for (
size_t idx = 0; idx < virtual_log_n; idx++) {
432 verifier_gate_challenges[idx] =
433 verifier_transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
438 std::vector<FF> padding_indicator_array(virtual_log_n,
FF(1));
440 auto verifier_output =
441 sumcheck_verifier.verify(relation_parameters, verifier_gate_challenges, padding_indicator_array);
444 EXPECT_FALSE(verifier_output.verified)
445 <<
"Non-ZK Sumcheck should FAIL when random values break relations (no RowDisablingPolynomial)";