52 static constexpr size_t multivariate_d(2);
53 static constexpr size_t multivariate_n(1 << multivariate_d);
61 f0.template copy_vector<FF>({ v00, v10, v01, v11 });
64 full_polynomials.q_m = f0;
66 SubrelationSeparators alpha{ 1 };
67 std::vector<FF> gate_challenges{ 1, 1 };
70 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
72 FF round_challenge_0 = { 0x6c7301b49d85a46c, 0x44311531e39c64f6, 0xb13d66d8d6c1a24c, 0x04410c360230a295 };
73 round_challenge_0.self_to_montgomery_form();
74 FF expected_lo = v00 * (
FF(1) - round_challenge_0) + v10 * round_challenge_0;
75 FF expected_hi = v01 * (
FF(1) - round_challenge_0) + v11 * round_challenge_0;
78 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
80 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
81 EXPECT_EQ(first_polynomial[0], round_challenge_0);
82 EXPECT_EQ(first_polynomial[1],
FF(0));
84 FF round_challenge_1 = 2;
85 FF expected_val = expected_lo * (
FF(1) - round_challenge_1) + expected_hi * round_challenge_1;
87 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
88 EXPECT_EQ(first_polynomial[0], expected_val);
99 static constexpr size_t multivariate_d(2);
100 static constexpr size_t multivariate_n(1 << multivariate_d);
102 FF v00 = FF::random_element();
103 FF v10 = FF::random_element();
104 FF v01 = FF::random_element();
105 FF v11 = FF::random_element();
108 f0.template copy_vector<FF>({ v00, v10, v01, v11 });
111 SubrelationSeparators alpha{ 1 };
113 full_polynomials.q_m = f0;
114 std::vector<FF> gate_challenges{ 1, 1 };
117 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
119 FF round_challenge_0 = FF::random_element();
120 FF expected_lo = v00 * (
FF(1) - round_challenge_0) + v10 * round_challenge_0;
121 FF expected_hi = v01 * (
FF(1) - round_challenge_0) + v11 * round_challenge_0;
124 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
125 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
127 EXPECT_EQ(first_polynomial[0], expected_lo);
128 EXPECT_EQ(first_polynomial[1], expected_hi);
130 FF round_challenge_1 = FF::random_element();
131 FF expected_val = expected_lo * (
FF(1) - round_challenge_1) + expected_hi * round_challenge_1;
132 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
133 EXPECT_EQ(first_polynomial[0], expected_val);
166 static constexpr size_t multivariate_d(3);
167 static constexpr size_t multivariate_n(1 << multivariate_d);
179 f0.template copy_vector<FF>({ v000, v100, v010, v110, v001, v101, v011, v111 });
182 full_polynomials.q_m = f0;
184 SubrelationSeparators alpha{ 1 };
186 std::vector<FF> gate_challenges{ 1, 1, 1 };
189 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
191 FF round_challenge_0 = 1;
192 FF expected_q1 = v000 * (
FF(1) - round_challenge_0) + v100 * round_challenge_0;
193 FF expected_q2 = v010 * (
FF(1) - round_challenge_0) + v110 * round_challenge_0;
194 FF expected_q3 = v001 * (
FF(1) - round_challenge_0) + v101 * round_challenge_0;
195 FF expected_q4 = v011 * (
FF(1) - round_challenge_0) + v111 * round_challenge_0;
198 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
200 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
201 EXPECT_EQ(first_polynomial[0], expected_q1);
202 EXPECT_EQ(first_polynomial[1], expected_q2);
203 EXPECT_EQ(first_polynomial[2], expected_q3);
204 EXPECT_EQ(first_polynomial[3], expected_q4);
206 FF round_challenge_1 = 2;
207 FF expected_lo = expected_q1 * (
FF(1) - round_challenge_1) + expected_q2 * round_challenge_1;
208 FF expected_hi = expected_q3 * (
FF(1) - round_challenge_1) + expected_q4 * round_challenge_1;
210 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
211 EXPECT_EQ(first_polynomial[0], expected_lo);
212 EXPECT_EQ(first_polynomial[1], expected_hi);
214 FF round_challenge_2 = 3;
215 FF expected_val = expected_lo * (
FF(1) - round_challenge_2) + expected_hi * round_challenge_2;
216 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_2);
217 EXPECT_EQ(first_polynomial[0], expected_val);
228 static constexpr size_t multivariate_d(3);
229 static constexpr size_t multivariate_n(1 << multivariate_d);
231 FF v000 = FF::random_element();
232 FF v100 = FF::random_element();
233 FF v010 = FF::random_element();
234 FF v110 = FF::random_element();
235 FF v001 = FF::random_element();
236 FF v101 = FF::random_element();
237 FF v011 = FF::random_element();
238 FF v111 = FF::random_element();
241 f0.template copy_vector<FF>({ v000, v100, v010, v110, v001, v101, v011, v111 });
244 full_polynomials.q_m = f0;
247 SubrelationSeparators alpha{ 1 };
248 std::vector<FF> gate_challenges{ 1, 1, 1 };
251 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
253 FF round_challenge_0 = FF::random_element();
254 FF expected_q1 = v000 * (
FF(1) - round_challenge_0) + v100 * round_challenge_0;
255 FF expected_q2 = v010 * (
FF(1) - round_challenge_0) + v110 * round_challenge_0;
256 FF expected_q3 = v001 * (
FF(1) - round_challenge_0) + v101 * round_challenge_0;
257 FF expected_q4 = v011 * (
FF(1) - round_challenge_0) + v111 * round_challenge_0;
260 auto& first_polynomial = sumcheck.partially_evaluated_polynomials.get_all()[0];
261 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
263 EXPECT_EQ(first_polynomial[0], expected_q1);
264 EXPECT_EQ(first_polynomial[1], expected_q2);
265 EXPECT_EQ(first_polynomial[2], expected_q3);
266 EXPECT_EQ(first_polynomial[3], expected_q4);
268 FF round_challenge_1 = FF::random_element();
269 FF expected_lo = expected_q1 * (
FF(1) - round_challenge_1) + expected_q2 * round_challenge_1;
270 FF expected_hi = expected_q3 * (
FF(1) - round_challenge_1) + expected_q4 * round_challenge_1;
272 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
273 EXPECT_EQ(first_polynomial[0], expected_lo);
274 EXPECT_EQ(first_polynomial[1], expected_hi);
276 FF round_challenge_2 = FF::random_element();
277 FF expected_val = expected_lo * (
FF(1) - round_challenge_2) + expected_hi * round_challenge_2;
278 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_2);
279 EXPECT_EQ(first_polynomial[0], expected_val);
282TYPED_TEST(PartialEvaluationTests, ThreeRoundsGenericMultiplePolys)
290 static constexpr size_t multivariate_d(3);
291 static constexpr size_t multivariate_n(1 << multivariate_d);
292 std::array<FF, 3> v000;
293 std::array<FF, 3> v100;
294 std::array<FF, 3> v010;
295 std::array<FF, 3> v110;
296 std::array<FF, 3> v001;
297 std::array<FF, 3> v101;
298 std::array<FF, 3> v011;
299 std::array<FF, 3> v111;
301 for (
size_t i = 0; i < 3; i++) {
302 v000[i] = FF::random_element();
303 v100[i] = FF::random_element();
304 v010[i] = FF::random_element();
305 v110[i] = FF::random_element();
306 v001[i] = FF::random_element();
307 v101[i] = FF::random_element();
308 v011[i] = FF::random_element();
309 v111[i] = FF::random_element();
312 f0.template copy_vector<FF>({ v000[0], v100[0], v010[0], v110[0], v001[0], v101[0], v011[0], v111[0] });
313 f1.template copy_vector<FF>({ v000[1], v100[1], v010[1], v110[1], v001[1], v101[1], v011[1], v111[1] });
314 f2.template copy_vector<FF>({ v000[2], v100[2], v010[2], v110[2], v001[2], v101[2], v011[2], v111[2] });
318 full_polynomials.q_m = f0;
319 full_polynomials.q_c = f1;
320 full_polynomials.q_l = f2;
322 SubrelationSeparators alpha{ 1 };
323 std::vector<FF> gate_challenges{ 1, 1, 1 };
326 multivariate_n, full_polynomials, transcript, alpha, gate_challenges, {}, multivariate_d);
328 std::array<FF, 3> expected_q1;
329 std::array<FF, 3> expected_q2;
330 std::array<FF, 3> expected_q3;
331 std::array<FF, 3> expected_q4;
332 FF round_challenge_0 = FF::random_element();
333 for (
size_t i = 0; i < 3; i++) {
334 expected_q1[i] = v000[i] * (
FF(1) - round_challenge_0) + v100[i] * round_challenge_0;
335 expected_q2[i] = v010[i] * (
FF(1) - round_challenge_0) + v110[i] * round_challenge_0;
336 expected_q3[i] = v001[i] * (
FF(1) - round_challenge_0) + v101[i] * round_challenge_0;
337 expected_q4[i] = v011[i] * (
FF(1) - round_challenge_0) + v111[i] * round_challenge_0;
341 sumcheck.partially_evaluate(full_polynomials, round_challenge_0);
342 auto polynomial_get_all = sumcheck.partially_evaluated_polynomials.get_all();
343 for (
size_t i = 0; i < 3; i++) {
344 EXPECT_EQ((polynomial_get_all[i])[0], expected_q1[i]);
345 EXPECT_EQ((polynomial_get_all[i])[1], expected_q2[i]);
346 EXPECT_EQ((polynomial_get_all[i])[2], expected_q3[i]);
347 EXPECT_EQ((polynomial_get_all[i])[3], expected_q4[i]);
350 FF round_challenge_1 = FF::random_element();
351 std::array<FF, 3> expected_lo;
352 std::array<FF, 3> expected_hi;
353 for (
size_t i = 0; i < 3; i++) {
354 expected_lo[i] = expected_q1[i] * (
FF(1) - round_challenge_1) + expected_q2[i] * round_challenge_1;
355 expected_hi[i] = expected_q3[i] * (
FF(1) - round_challenge_1) + expected_q4[i] * round_challenge_1;
357 sumcheck.
partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_1);
358 for (
size_t i = 0; i < 3; i++) {
359 EXPECT_EQ((polynomial_get_all[i])[0], expected_lo[i]);
360 EXPECT_EQ((polynomial_get_all[i])[1], expected_hi[i]);
362 FF round_challenge_2 = FF::random_element();
363 std::array<FF, 3> expected_val;
364 for (
size_t i = 0; i < 3; i++) {
365 expected_val[i] = expected_lo[i] * (
FF(1) - round_challenge_2) + expected_hi[i] * round_challenge_2;
367 sumcheck.partially_evaluate(sumcheck.partially_evaluated_polynomials, round_challenge_2);
368 for (
size_t i = 0; i < 3; i++) {
369 EXPECT_EQ((polynomial_get_all[i])[0], expected_val[i]);