51 static constexpr size_t multivariate_d(2);
52 static constexpr size_t multivariate_n(1 << multivariate_d);
60 f0.template copy_vector<FF>({ v00, v10, v01, v11 });
63 full_polynomials.q_m = f0;
66 std::vector<FF> gate_challenges{ 1, 1 };
69 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
71 FF round_challenge_0 = { 0x6c7301b49d85a46c, 0x44311531e39c64f6, 0xb13d66d8d6c1a24c, 0x04410c360230a295 };
72 round_challenge_0.self_to_montgomery_form();
73 FF expected_lo = v00 * (
FF(1) - round_challenge_0) + v10 * round_challenge_0;
74 FF expected_hi = v01 * (
FF(1) - round_challenge_0) + v11 * round_challenge_0;
78 auto& first_polynomial = partially_evaluated_polynomials.get_all()[0];
79 EXPECT_EQ(first_polynomial[0], round_challenge_0);
80 EXPECT_EQ(first_polynomial[1],
FF(0));
82 FF round_challenge_1 = 2;
83 FF expected_val = expected_lo * (
FF(1) - round_challenge_1) + expected_hi * round_challenge_1;
85 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_1);
86 EXPECT_EQ(first_polynomial[0], expected_val);
96 static constexpr size_t multivariate_d(2);
97 static constexpr size_t multivariate_n(1 << multivariate_d);
105 f0.template copy_vector<FF>({ v00, v10, v01, v11 });
110 full_polynomials.q_m = f0;
111 std::vector<FF> gate_challenges{ 1, 1 };
114 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
117 FF expected_lo = v00 * (
FF(1) - round_challenge_0) + v10 * round_challenge_0;
118 FF expected_hi = v01 * (
FF(1) - round_challenge_0) + v11 * round_challenge_0;
121 auto& first_polynomial = partially_evaluated_polynomials.get_all()[0];
123 EXPECT_EQ(first_polynomial[0], expected_lo);
124 EXPECT_EQ(first_polynomial[1], expected_hi);
127 FF expected_val = expected_lo * (
FF(1) - round_challenge_1) + expected_hi * round_challenge_1;
128 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_1);
129 EXPECT_EQ(first_polynomial[0], expected_val);
161 static constexpr size_t multivariate_d(3);
162 static constexpr size_t multivariate_n(1 << multivariate_d);
174 f0.template copy_vector<FF>({ v000, v100, v010, v110, v001, v101, v011, v111 });
177 full_polynomials.q_m = f0;
181 std::vector<FF> gate_challenges{ 1, 1, 1 };
184 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
186 FF round_challenge_0 = 1;
187 FF expected_q1 = v000 * (
FF(1) - round_challenge_0) + v100 * round_challenge_0;
188 FF expected_q2 = v010 * (
FF(1) - round_challenge_0) + v110 * round_challenge_0;
189 FF expected_q3 = v001 * (
FF(1) - round_challenge_0) + v101 * round_challenge_0;
190 FF expected_q4 = v011 * (
FF(1) - round_challenge_0) + v111 * round_challenge_0;
194 auto& first_polynomial = partially_evaluated_polynomials.get_all()[0];
195 EXPECT_EQ(first_polynomial[0], expected_q1);
196 EXPECT_EQ(first_polynomial[1], expected_q2);
197 EXPECT_EQ(first_polynomial[2], expected_q3);
198 EXPECT_EQ(first_polynomial[3], expected_q4);
200 FF round_challenge_1 = 2;
201 FF expected_lo = expected_q1 * (
FF(1) - round_challenge_1) + expected_q2 * round_challenge_1;
202 FF expected_hi = expected_q3 * (
FF(1) - round_challenge_1) + expected_q4 * round_challenge_1;
204 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_1);
205 EXPECT_EQ(first_polynomial[0], expected_lo);
206 EXPECT_EQ(first_polynomial[1], expected_hi);
208 FF round_challenge_2 = 3;
209 FF expected_val = expected_lo * (
FF(1) - round_challenge_2) + expected_hi * round_challenge_2;
210 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_2);
211 EXPECT_EQ(first_polynomial[0], expected_val);
221 static constexpr size_t multivariate_d(3);
222 static constexpr size_t multivariate_n(1 << multivariate_d);
234 f0.template copy_vector<FF>({ v000, v100, v010, v110, v001, v101, v011, v111 });
237 full_polynomials.q_m = f0;
241 std::vector<FF> gate_challenges{ 1, 1, 1 };
244 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
247 FF expected_q1 = v000 * (
FF(1) - round_challenge_0) + v100 * round_challenge_0;
248 FF expected_q2 = v010 * (
FF(1) - round_challenge_0) + v110 * round_challenge_0;
249 FF expected_q3 = v001 * (
FF(1) - round_challenge_0) + v101 * round_challenge_0;
250 FF expected_q4 = v011 * (
FF(1) - round_challenge_0) + v111 * round_challenge_0;
253 auto& first_polynomial = partially_evaluated_polynomials.get_all()[0];
255 EXPECT_EQ(first_polynomial[0], expected_q1);
256 EXPECT_EQ(first_polynomial[1], expected_q2);
257 EXPECT_EQ(first_polynomial[2], expected_q3);
258 EXPECT_EQ(first_polynomial[3], expected_q4);
261 FF expected_lo = expected_q1 * (
FF(1) - round_challenge_1) + expected_q2 * round_challenge_1;
262 FF expected_hi = expected_q3 * (
FF(1) - round_challenge_1) + expected_q4 * round_challenge_1;
264 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_1);
265 EXPECT_EQ(first_polynomial[0], expected_lo);
266 EXPECT_EQ(first_polynomial[1], expected_hi);
269 FF expected_val = expected_lo * (
FF(1) - round_challenge_2) + expected_hi * round_challenge_2;
270 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_2);
271 EXPECT_EQ(first_polynomial[0], expected_val);
274TYPED_TEST(PartialEvaluationTests, ThreeRoundsGenericMultiplePolys)
281 static constexpr size_t multivariate_d(3);
282 static constexpr size_t multivariate_n(1 << multivariate_d);
283 std::array<FF, 3> v000;
284 std::array<FF, 3> v100;
285 std::array<FF, 3> v010;
286 std::array<FF, 3> v110;
287 std::array<FF, 3> v001;
288 std::array<FF, 3> v101;
289 std::array<FF, 3> v011;
290 std::array<FF, 3> v111;
292 for (
size_t i = 0; i < 3; i++) {
303 f0.template copy_vector<FF>({ v000[0], v100[0], v010[0], v110[0], v001[0], v101[0], v011[0], v111[0] });
304 f1.template copy_vector<FF>({ v000[1], v100[1], v010[1], v110[1], v001[1], v101[1], v011[1], v111[1] });
305 f2.template copy_vector<FF>({ v000[2], v100[2], v010[2], v110[2], v001[2], v101[2], v011[2], v111[2] });
309 full_polynomials.q_m = f0;
310 full_polynomials.q_c = f1;
311 full_polynomials.q_l = f2;
314 std::vector<FF> gate_challenges{ 1, 1, 1 };
317 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
319 std::array<FF, 3> expected_q1;
320 std::array<FF, 3> expected_q2;
321 std::array<FF, 3> expected_q3;
322 std::array<FF, 3> expected_q4;
324 for (
size_t i = 0; i < 3; i++) {
325 expected_q1[i] = v000[i] * (
FF(1) - round_challenge_0) + v100[i] * round_challenge_0;
326 expected_q2[i] = v010[i] * (
FF(1) - round_challenge_0) + v110[i] * round_challenge_0;
327 expected_q3[i] = v001[i] * (
FF(1) - round_challenge_0) + v101[i] * round_challenge_0;
328 expected_q4[i] = v011[i] * (
FF(1) - round_challenge_0) + v111[i] * round_challenge_0;
331 auto partially_evaluated_polynomials = sumcheck.partially_evaluate_first_round(full_polynomials, round_challenge_0);
332 auto polynomial_get_all = partially_evaluated_polynomials.get_all();
333 for (
size_t i = 0; i < 3; i++) {
334 EXPECT_EQ((polynomial_get_all[i])[0], expected_q1[i]);
335 EXPECT_EQ((polynomial_get_all[i])[1], expected_q2[i]);
336 EXPECT_EQ((polynomial_get_all[i])[2], expected_q3[i]);
337 EXPECT_EQ((polynomial_get_all[i])[3], expected_q4[i]);
341 std::array<FF, 3> expected_lo;
342 std::array<FF, 3> expected_hi;
343 for (
size_t i = 0; i < 3; i++) {
344 expected_lo[i] = expected_q1[i] * (
FF(1) - round_challenge_1) + expected_q2[i] * round_challenge_1;
345 expected_hi[i] = expected_q3[i] * (
FF(1) - round_challenge_1) + expected_q4[i] * round_challenge_1;
347 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_1);
348 for (
size_t i = 0; i < 3; i++) {
349 EXPECT_EQ((polynomial_get_all[i])[0], expected_lo[i]);
350 EXPECT_EQ((polynomial_get_all[i])[1], expected_hi[i]);
353 std::array<FF, 3> expected_val;
354 for (
size_t i = 0; i < 3; i++) {
355 expected_val[i] = expected_lo[i] * (
FF(1) - round_challenge_2) + expected_hi[i] * round_challenge_2;
357 sumcheck.partially_evaluate_in_place(partially_evaluated_polynomials, round_challenge_2);
358 for (
size_t i = 0; i < 3; i++) {
359 EXPECT_EQ((polynomial_get_all[i])[0], expected_val[i]);