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;
77 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
79 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
80 EXPECT_EQ(first_polynomial[0], round_challenge_0);
81 EXPECT_EQ(first_polynomial[1],
FF(0));
83 FF round_challenge_1 = 2;
84 FF expected_val = expected_lo * (
FF(1) - round_challenge_1) + expected_hi * round_challenge_1;
86 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
87 EXPECT_EQ(first_polynomial[0], expected_val);
97 static constexpr size_t multivariate_d(2);
98 static constexpr size_t multivariate_n(1 << multivariate_d);
106 f0.template copy_vector<FF>({ v00, v10, v01, v11 });
111 full_polynomials.q_m = f0;
112 std::vector<FF> gate_challenges{ 1, 1 };
115 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
118 FF expected_lo = v00 * (
FF(1) - round_challenge_0) + v10 * round_challenge_0;
119 FF expected_hi = v01 * (
FF(1) - round_challenge_0) + v11 * round_challenge_0;
122 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
123 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
125 EXPECT_EQ(first_polynomial[0], expected_lo);
126 EXPECT_EQ(first_polynomial[1], expected_hi);
129 FF expected_val = expected_lo * (
FF(1) - round_challenge_1) + expected_hi * round_challenge_1;
130 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
131 EXPECT_EQ(first_polynomial[0], expected_val);
163 static constexpr size_t multivariate_d(3);
164 static constexpr size_t multivariate_n(1 << multivariate_d);
176 f0.template copy_vector<FF>({ v000, v100, v010, v110, v001, v101, v011, v111 });
179 full_polynomials.q_m = f0;
183 std::vector<FF> gate_challenges{ 1, 1, 1 };
186 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
188 FF round_challenge_0 = 1;
189 FF expected_q1 = v000 * (
FF(1) - round_challenge_0) + v100 * round_challenge_0;
190 FF expected_q2 = v010 * (
FF(1) - round_challenge_0) + v110 * round_challenge_0;
191 FF expected_q3 = v001 * (
FF(1) - round_challenge_0) + v101 * round_challenge_0;
192 FF expected_q4 = v011 * (
FF(1) - round_challenge_0) + v111 * round_challenge_0;
195 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
197 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
198 EXPECT_EQ(first_polynomial[0], expected_q1);
199 EXPECT_EQ(first_polynomial[1], expected_q2);
200 EXPECT_EQ(first_polynomial[2], expected_q3);
201 EXPECT_EQ(first_polynomial[3], expected_q4);
203 FF round_challenge_1 = 2;
204 FF expected_lo = expected_q1 * (
FF(1) - round_challenge_1) + expected_q2 * round_challenge_1;
205 FF expected_hi = expected_q3 * (
FF(1) - round_challenge_1) + expected_q4 * round_challenge_1;
207 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
208 EXPECT_EQ(first_polynomial[0], expected_lo);
209 EXPECT_EQ(first_polynomial[1], expected_hi);
211 FF round_challenge_2 = 3;
212 FF expected_val = expected_lo * (
FF(1) - round_challenge_2) + expected_hi * round_challenge_2;
213 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_2);
214 EXPECT_EQ(first_polynomial[0], expected_val);
224 static constexpr size_t multivariate_d(3);
225 static constexpr size_t multivariate_n(1 << multivariate_d);
237 f0.template copy_vector<FF>({ v000, v100, v010, v110, v001, v101, v011, v111 });
240 full_polynomials.q_m = f0;
244 std::vector<FF> gate_challenges{ 1, 1, 1 };
247 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
250 FF expected_q1 = v000 * (
FF(1) - round_challenge_0) + v100 * round_challenge_0;
251 FF expected_q2 = v010 * (
FF(1) - round_challenge_0) + v110 * round_challenge_0;
252 FF expected_q3 = v001 * (
FF(1) - round_challenge_0) + v101 * round_challenge_0;
253 FF expected_q4 = v011 * (
FF(1) - round_challenge_0) + v111 * round_challenge_0;
256 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
257 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
259 EXPECT_EQ(first_polynomial[0], expected_q1);
260 EXPECT_EQ(first_polynomial[1], expected_q2);
261 EXPECT_EQ(first_polynomial[2], expected_q3);
262 EXPECT_EQ(first_polynomial[3], expected_q4);
265 FF expected_lo = expected_q1 * (
FF(1) - round_challenge_1) + expected_q2 * round_challenge_1;
266 FF expected_hi = expected_q3 * (
FF(1) - round_challenge_1) + expected_q4 * round_challenge_1;
268 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
269 EXPECT_EQ(first_polynomial[0], expected_lo);
270 EXPECT_EQ(first_polynomial[1], expected_hi);
273 FF expected_val = expected_lo * (
FF(1) - round_challenge_2) + expected_hi * round_challenge_2;
274 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_2);
275 EXPECT_EQ(first_polynomial[0], expected_val);
278TYPED_TEST(PartialEvaluationTests, ThreeRoundsGenericMultiplePolys)
285 static constexpr size_t multivariate_d(3);
286 static constexpr size_t multivariate_n(1 << multivariate_d);
287 std::array<FF, 3> v000;
288 std::array<FF, 3> v100;
289 std::array<FF, 3> v010;
290 std::array<FF, 3> v110;
291 std::array<FF, 3> v001;
292 std::array<FF, 3> v101;
293 std::array<FF, 3> v011;
294 std::array<FF, 3> v111;
296 for (
size_t i = 0; i < 3; i++) {
307 f0.template copy_vector<FF>({ v000[0], v100[0], v010[0], v110[0], v001[0], v101[0], v011[0], v111[0] });
308 f1.template copy_vector<FF>({ v000[1], v100[1], v010[1], v110[1], v001[1], v101[1], v011[1], v111[1] });
309 f2.template copy_vector<FF>({ v000[2], v100[2], v010[2], v110[2], v001[2], v101[2], v011[2], v111[2] });
313 full_polynomials.q_m = f0;
314 full_polynomials.q_c = f1;
315 full_polynomials.q_l = f2;
318 std::vector<FF> gate_challenges{ 1, 1, 1 };
321 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
323 std::array<FF, 3> expected_q1;
324 std::array<FF, 3> expected_q2;
325 std::array<FF, 3> expected_q3;
326 std::array<FF, 3> expected_q4;
328 for (
size_t i = 0; i < 3; i++) {
329 expected_q1[i] = v000[i] * (
FF(1) - round_challenge_0) + v100[i] * round_challenge_0;
330 expected_q2[i] = v010[i] * (
FF(1) - round_challenge_0) + v110[i] * round_challenge_0;
331 expected_q3[i] = v001[i] * (
FF(1) - round_challenge_0) + v101[i] * round_challenge_0;
332 expected_q4[i] = v011[i] * (
FF(1) - round_challenge_0) + v111[i] * round_challenge_0;
336 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
337 auto polynomial_get_all = sumcheck.partially_evaluated_polynomials.get_all();
338 for (
size_t i = 0; i < 3; i++) {
339 EXPECT_EQ((polynomial_get_all[i])[0], expected_q1[i]);
340 EXPECT_EQ((polynomial_get_all[i])[1], expected_q2[i]);
341 EXPECT_EQ((polynomial_get_all[i])[2], expected_q3[i]);
342 EXPECT_EQ((polynomial_get_all[i])[3], expected_q4[i]);
346 std::array<FF, 3> expected_lo;
347 std::array<FF, 3> expected_hi;
348 for (
size_t i = 0; i < 3; i++) {
349 expected_lo[i] = expected_q1[i] * (
FF(1) - round_challenge_1) + expected_q2[i] * round_challenge_1;
350 expected_hi[i] = expected_q3[i] * (
FF(1) - round_challenge_1) + expected_q4[i] * round_challenge_1;
352 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
353 for (
size_t i = 0; i < 3; i++) {
354 EXPECT_EQ((polynomial_get_all[i])[0], expected_lo[i]);
355 EXPECT_EQ((polynomial_get_all[i])[1], expected_hi[i]);
358 std::array<FF, 3> expected_val;
359 for (
size_t i = 0; i < 3; i++) {
360 expected_val[i] = expected_lo[i] * (
FF(1) - round_challenge_2) + expected_hi[i] * round_challenge_2;
362 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_2);
363 for (
size_t i = 0; i < 3; i++) {
364 EXPECT_EQ((polynomial_get_all[i])[0], expected_val[i]);