7#include <gtest/gtest.h>
24 EXPECT_EQ(r.size(), u.size());
26 for (
size_t i = 0; i < r.size(); ++i) {
27 const FF term = (
FF(1) - r[i]) * (
FF(1) - u[i]) + r[i] * u[i];
37 for (
size_t i = 0; i < d; ++i) {
38 v[i] =
FF((mask >> i) & 1ULL);
46 std::vector<FF> g(r.size());
47 for (
size_t i = 0; i < r.size(); ++i) {
48 g[i] = r[i] * (
FF(1) - r[i]).invert();
60 const std::vector<FF> r = { 0, 1, 2, 3 };
63 ASSERT_EQ(eq.
r.size(), 4);
64 ASSERT_EQ(eq.
a.size(), 4);
65 ASSERT_EQ(eq.
b.size(), 4);
68 EXPECT_EQ(eq.
a[0],
FF(-1));
69 EXPECT_EQ(eq.
a[1],
FF(1));
70 EXPECT_EQ(eq.
a[2],
FF(3));
71 EXPECT_EQ(eq.
a[3],
FF(5));
73 EXPECT_EQ(eq.
b[0],
FF(1));
74 EXPECT_EQ(eq.
b[1],
FF(0));
75 EXPECT_EQ(eq.
b[2],
FF(-1));
76 EXPECT_EQ(eq.
b[3],
FF(-2));
81 const std::vector<FF> r = { 0, 1, 2, 3, 4 };
82 const std::vector<FF> u = { 5, 6, 7, 8, 9 };
86 const FF expect = eq_manual(r, u);
88 EXPECT_EQ(got, expect);
93 const std::vector<FF> r = { 2, 0, 5, 1 };
94 const std::vector<FF> u = { 3, 7, 4, 6 };
105 const std::vector<FF> r = { 0, 2, 4, 6, 8 };
106 const std::vector<FF> u = { 1, 3, 5, 7, 9 };
121 const auto make_bool_vec = [&](
size_t mask) {
122 std::vector<FF> v(d);
123 for (
size_t i = 0; i < d; ++i) {
124 v[i] =
FF((mask >> i) & 1);
129 for (
size_t R = 0; R < (1u << d); ++R) {
130 const auto r = make_bool_vec(R);
132 for (
size_t U = 0; U < (1u << d); ++U) {
133 const auto u = make_bool_vec(U);
136 EXPECT_EQ(val,
FF(1)) <<
"R=" << R <<
" U=" << U;
138 EXPECT_EQ(val,
FF(0)) <<
"R=" << R <<
" U=" << U;
148 std::vector<FF> r, u;
150 EXPECT_EQ(val,
FF(1));
155 const std::vector<FF> r = { 2 };
156 const std::vector<FF> u = { 7 };
157 const FF expect = (
FF(1) - r[0]) * (
FF(1) - u[0]) + r[0] * u[0];
161 EXPECT_EQ(got, expect);
166 const std::vector<FF> r(8,
FF(0));
167 const std::vector<FF> u(8,
FF(0));
174 const std::vector<FF> r(8,
FF(1));
175 const std::vector<FF> u(8,
FF(1));
182 const std::vector<FF> r = { 0, 1, 0, 1, 0, 1, 0, 1 };
183 const std::vector<FF> u = { 1, 0, 1, 0, 1, 0, 1, 0 };
197 std::vector<FF> r(d);
198 for (
size_t i = 0; i < d; ++i) {
199 r[i] =
FF(2 * i + 7);
206 for (uint64_t ell = 0; ell < (1ULL << d); ++ell) {
207 const auto u = bool_vec_from_mask(d, ell);
209 const FF got_prov = peq.at(ell);
210 EXPECT_EQ(got_prov, got_ver) <<
"ell=" << ell;
218 std::vector<FF> r(d), u(d);
219 for (
size_t i = 0; i < d; ++i) {
221 u[i] =
FF(17 + 2 * i);
229 for (
size_t i = 0; i < d; ++i) {
232 const auto gamma = to_gamma(r);
235 for (
size_t i = 0; i < d; ++i) {
236 prov_val *= (
FF(1) + u[i] * (gamma[i] -
FF(1)));
238 prov_val =
C * prov_val;
240 EXPECT_EQ(ver_val, prov_val);
245 constexpr size_t d = 21;
246 std::vector<FF> r(d);
247 std::vector<FF> u(d);
248 std::vector<FF> u_part(d);
249 for (
size_t i = 0; i < d; i++) {
250 r[i] = FF::random_element();
251 u[i] = FF::random_element();
256 for (
size_t i = 0; i < d; i++) {
259 current_element = current_element + u[i] * (new_element - current_element);
272 constexpr size_t d = 5;
274 std::vector<FF> betas(d);
275 for (
auto& beta : betas) {
276 beta = FF::random_element();
282 for (
auto& u_i : variables) {
283 u_i = FF::random_element();
287 FF expected_eval =
FF(1);
288 for (
size_t i = 0; i < d; ++i) {
289 expected_eval *= (
FF(1) - variables[i]) + variables[i] * betas[i];
297 const std::vector<FF> betas{
FF(2),
FF(4),
FF(16) };
300 const std::vector<FF> expected_values{
312 const size_t N = 1UL << d;
314 const std::vector<FF> r(d,
FF(1));
317 ASSERT_EQ(coeffs.size(), N);
319 const size_t all_ones_mask = N - 1;
321 for (
size_t m = 0; m < N; ++m) {
322 const FF got = coeffs.get(m);
323 const FF expect = (m == all_ones_mask) ?
FF(1) :
FF(0);
324 EXPECT_EQ(got, expect) <<
"mask=" << m;
334 const size_t N = 1UL << d;
335 std::vector<FF> r = {
FF(7),
FF(1),
FF(9),
FF(1),
FF(11) };
336 const std::vector<size_t> forced = { 1, 3 };
339 ASSERT_EQ(coeffs.size(), N);
343 for (
size_t mask = 0; mask < N; ++mask) {
345 const auto u = bool_vec_from_mask(d, mask);
349 const bool has_all_forced = std::ranges::all_of(forced, [&](
size_t bit) {
return ((mask >> bit) & 1U) != 0; });
351 const FF table_val = coeffs.get(mask);
353 if (!has_all_forced) {
354 EXPECT_EQ(table_val,
FF(0)) <<
"mask missing forced bits, mask=" << mask;
357 EXPECT_EQ(table_val, verifier_val) <<
"mask=" << mask;
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 .....
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)