8#include <gtest/gtest.h>
25 EXPECT_EQ(r.size(), u.size());
27 for (
size_t i = 0; i < r.size(); ++i) {
28 const FF term = (
FF(1) - r[i]) * (
FF(1) - u[i]) + r[i] * u[i];
38 for (
size_t i = 0; i < d; ++i) {
39 v[i] =
FF((mask >> i) & 1ULL);
47 std::vector<FF> g(r.size());
48 for (
size_t i = 0; i < r.size(); ++i) {
49 g[i] = r[i] * (
FF(1) - r[i]).invert();
61 const std::vector<FF> r = { 0, 1, 2, 3 };
64 ASSERT_EQ(eq.
r.size(), 4);
65 ASSERT_EQ(eq.
a.size(), 4);
66 ASSERT_EQ(eq.
b.size(), 4);
69 EXPECT_EQ(eq.
a[0],
FF(-1));
70 EXPECT_EQ(eq.
a[1],
FF(1));
71 EXPECT_EQ(eq.
a[2],
FF(3));
72 EXPECT_EQ(eq.
a[3],
FF(5));
74 EXPECT_EQ(eq.
b[0],
FF(1));
75 EXPECT_EQ(eq.
b[1],
FF(0));
76 EXPECT_EQ(eq.
b[2],
FF(-1));
77 EXPECT_EQ(eq.
b[3],
FF(-2));
82 const std::vector<FF> r = { 0, 1, 2, 3, 4 };
83 const std::vector<FF> u = { 5, 6, 7, 8, 9 };
87 const FF expect = eq_manual(r, u);
89 EXPECT_EQ(got, expect);
94 const std::vector<FF> r = { 2, 0, 5, 1 };
95 const std::vector<FF> u = { 3, 7, 4, 6 };
106 const std::vector<FF> r = { 0, 2, 4, 6, 8 };
107 const std::vector<FF> u = { 1, 3, 5, 7, 9 };
122 const auto make_bool_vec = [&](
size_t mask) {
123 std::vector<FF> v(d);
124 for (
size_t i = 0; i < d; ++i) {
125 v[i] =
FF((mask >> i) & 1);
130 for (
size_t R = 0; R < (1u << d); ++R) {
131 const auto r = make_bool_vec(R);
133 for (
size_t U = 0; U < (1u << d); ++U) {
134 const auto u = make_bool_vec(U);
137 EXPECT_EQ(val,
FF(1)) <<
"R=" << R <<
" U=" << U;
139 EXPECT_EQ(val,
FF(0)) <<
"R=" << R <<
" U=" << U;
149 std::vector<FF> r, u;
151 EXPECT_EQ(val,
FF(1));
156 const std::vector<FF> r = { 2 };
157 const std::vector<FF> u = { 7 };
158 const FF expect = (
FF(1) - r[0]) * (
FF(1) - u[0]) + r[0] * u[0];
162 EXPECT_EQ(got, expect);
167 const std::vector<FF> r(8,
FF(0));
168 const std::vector<FF> u(8,
FF(0));
175 const std::vector<FF> r(8,
FF(1));
176 const std::vector<FF> u(8,
FF(1));
183 const std::vector<FF> r = { 0, 1, 0, 1, 0, 1, 0, 1 };
184 const std::vector<FF> u = { 1, 0, 1, 0, 1, 0, 1, 0 };
198 std::vector<FF> r(d);
199 for (
size_t i = 0; i < d; ++i) {
200 r[i] =
FF(2 * i + 7);
207 for (uint64_t ell = 0; ell < (1ULL << d); ++ell) {
208 const auto u = bool_vec_from_mask(d, ell);
210 const FF got_prov = peq.at(ell);
211 EXPECT_EQ(got_prov, got_ver) <<
"ell=" << ell;
219 std::vector<FF> r(d), u(d);
220 for (
size_t i = 0; i < d; ++i) {
222 u[i] =
FF(17 + 2 * i);
230 for (
size_t i = 0; i < d; ++i) {
233 const auto gamma = to_gamma(r);
236 for (
size_t i = 0; i < d; ++i) {
237 prov_val *= (
FF(1) + u[i] * (gamma[i] -
FF(1)));
239 prov_val =
C * prov_val;
241 EXPECT_EQ(ver_val, prov_val);
246 constexpr size_t d = 21;
247 std::vector<FF> r(d);
248 std::vector<FF> u(d);
249 std::vector<FF> u_part(d);
250 for (
size_t i = 0; i < d; i++) {
257 for (
size_t i = 0; i < d; i++) {
260 current_element = current_element + u[i] * (new_element - current_element);
273 constexpr size_t d = 5;
275 std::vector<FF> betas(d);
276 for (
auto& beta : betas) {
283 for (
auto& u_i : variables) {
288 FF expected_eval =
FF(1);
289 for (
size_t i = 0; i < d; ++i) {
290 expected_eval *= (
FF(1) - variables[i]) + variables[i] * betas[i];
298 const std::vector<FF> betas{
FF(2),
FF(4),
FF(16) };
301 const std::vector<FF> expected_values{
313 const size_t N = 1UL << d;
315 const std::vector<FF> r(d,
FF(1));
318 ASSERT_EQ(coeffs.size(), N);
320 const size_t all_ones_mask = N - 1;
322 for (
size_t m = 0; m < N; ++m) {
323 const FF got = coeffs.get(m);
324 const FF expect = (m == all_ones_mask) ?
FF(1) :
FF(0);
325 EXPECT_EQ(got, expect) <<
"mask=" << m;
335 const size_t N = 1UL << d;
336 std::vector<FF> r = {
FF(7),
FF(1),
FF(9),
FF(1),
FF(11) };
337 const std::vector<size_t> forced = { 1, 3 };
340 ASSERT_EQ(coeffs.size(), N);
344 for (
size_t mask = 0; mask < N; ++mask) {
346 const auto u = bool_vec_from_mask(d, mask);
350 const bool has_all_forced = std::ranges::all_of(forced, [&](
size_t bit) {
return ((mask >> bit) & 1U) != 0; });
352 const FF table_val = coeffs.get(mask);
354 if (!has_all_forced) {
355 EXPECT_EQ(table_val,
FF(0)) <<
"mask missing forced bits, mask=" << mask;
358 EXPECT_EQ(table_val, verifier_val) <<
"mask=" << mask;
366 GTEST_FLAG_SET(death_test_style,
"threadsafe");
367 std::vector<FF> r = {
FF(7),
FF(9) };
374 std::vector<FF> r = {
FF(7),
FF(11),
FF(13),
FF(17),
FF(19) };
375 const size_t log_num_monomials = 3;
377 EXPECT_EQ(coeffs.size(), 1UL << log_num_monomials);
383 std::vector<FF> empty_challenges;
385 ASSERT_EQ(coeffs.size(), 1UL);
386 EXPECT_EQ(coeffs.get(0),
FF(1));
#define ASSERT_THROW_OR_ABORT(statement, matcher)
static FF eq_manual(std::span< const FF > r, std::span< const FF > u)
static std::vector< FF > to_gamma(std::span< const FF > r)
static std::vector< FF > bool_vec_from_mask(size_t d, uint64_t mask)
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
Prover-side eq(X, r) polynomial over Boolean hypercube.
static Polynomial< FF > construct(std::span< const FF > challenges, size_t log_num_monomials)
Construct eq(X, r) coefficient table over Boolean hypercube {0,1}^d.
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Implementation of the methods for the -polynomials used in in Sumcheck.
void partially_evaluate(FF challenge)
Partially evaluate the -polynomial at the new challenge and update .
FF partial_evaluation_result
The value obtained by partially evaluating one variable in the power polynomial at each round....
Polynomial< FF > beta_products
The consecutive evaluations for identified with the integers .
Verifier-side polynomial for division-free evaluation of eq(r, u).
FF evaluate(std::span< const FF > u) const
static FF eval(std::span< const FF > r_in, std::span< const FF > u)
static field random_element(numeric::RNG *engine=nullptr) noexcept