2#include "../bool/bool.hpp"
8#include <gtest/gtest.h>
21template <
typename Builder>
class stdlib_field :
public testing::Test {
32 const size_t num_gates =
builder.get_num_finalized_gates_inefficient();
38 EXPECT_TRUE(
builder.get_num_finalized_gates_inefficient() == num_gates);
42 for (
size_t i = 0; i < 17; ++i) {
52 uint64_t cc = aa +
bb;
54 for (
size_t i = 0; i < 17; ++i) {
68 for (
size_t i = 0; i < (num_gates / 4) - 4; ++i) {
94 EXPECT_TRUE(
sum.get_value() ==
a.get_value() +
b.get_value());
95 EXPECT_FALSE(
sum.is_constant());
104 sum_with_constant = c +
sum;
109 field_ct sum_with_same_witness_index = sum_with_constant +
sum;
110 EXPECT_TRUE(sum_with_same_witness_index.
get_value() ==
sum.get_value() + sum_with_constant.
get_value());
122 auto run_test = [&](
fr elt,
size_t num_bits,
bool expect_verified) {
125 a.create_range_constraint(num_bits,
"field_tests: range_constraint on a fails");
128 EXPECT_EQ(verified, expect_verified);
129 if (verified != expect_verified) {
130 info(
"Range constraint malfunction on ", elt,
" with num_bits ", num_bits);
134 run_test(2, 1,
false);
135 run_test(2, 2,
true);
136 run_test(3, 2,
true);
138 for (
size_t num_bits = 1; num_bits < 17; num_bits++) {
139 run_test(130, num_bits, num_bits >= 8);
144 run_test(-1, 128,
false);
155 for (
size_t idx = 0; idx < 4; idx++) {
156 bool expected_to_be_constant = (idx < 2);
161 EXPECT_TRUE(converted.
is_constant() == expected_to_be_constant);
164 if (!expected_to_be_constant) {
174 "Assertion failed: (additive_constant == bb::fr::one() || additive_constant == bb::fr::zero())");
178 "Assertion failed: ((witness == bb::fr::zero()) || (witness == bb::fr::one()) == true)");
209 auto check_conditional_assign =
211 size_t num_gates_before =
builder.get_num_finalized_gates_inefficient();
213 EXPECT_TRUE(result.
get_value() == (predicate.get_value() ? lhs.get_value() : rhs.get_value()));
215 size_t expected_num_gates = 0;
217 if (!predicate.is_constant()) {
220 int num_witnesses =
static_cast<int>(!rhs.is_constant()) +
static_cast<int>(!lhs.is_constant());
222 expected_num_gates +=
static_cast<size_t>(num_witnesses);
226 EXPECT_TRUE(
builder.get_num_finalized_gates_inefficient() - num_gates_before == expected_num_gates);
233 for (
auto& predicate : predicates) {
234 for (
size_t i = 0; i < 4; i++) {
235 check_conditional_assign(
builder, predicate, lhs_in[i], rhs_in[i], i > 2);
247 auto check_that_conditional_assign_result_is_constant = [](
bool_ct& predicate) {
264 for (
auto& predicate : predicates) {
265 check_that_conditional_assign_result_is_constant(predicate);
280 EXPECT_TRUE(
a.multiplicative_constant ==
bb::fr::one());
281 EXPECT_TRUE(
b.multiplicative_constant ==
bb::fr::one());
283 EXPECT_TRUE(c.multiplicative_constant ==
bb::fr::one());
285 EXPECT_TRUE(c.multiplicative_constant ==
bb::fr::one());
287 EXPECT_TRUE(c.multiplicative_constant ==
bb::fr::one());
295 auto run_test = [](
bool constrain,
bool true_when_y_val_zero =
true) {
311 if (true_when_y_val_zero) {
320 .const_scaling = 0 });
331 .const_scaling = -1 });
348 run_test(
true,
true);
349 run_test(
true,
false);
360 EXPECT_NO_THROW(
a.assert_equal(
b));
373 size_t num_gates_start =
builder.get_num_finalized_gates_inefficient();
379 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient() - num_gates_start, 1);
385 size_t num_gates_start =
builder.get_num_finalized_gates_inefficient();
391 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient() - num_gates_start, 1);
397 size_t num_gates_start =
builder.get_num_finalized_gates_inefficient();
404 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient() - num_gates_start, 0);
410 size_t num_gates_start =
builder.get_num_finalized_gates_inefficient();
418 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient() - num_gates_start, 1);
419 EXPECT_EQ(
builder.err(),
"field_t::assert_equal");
426 auto gates_before =
builder.get_num_finalized_gates_inefficient();
428 auto gates_after =
builder.get_num_finalized_gates_inefficient();
429 auto& block =
builder.blocks.arithmetic;
430 EXPECT_EQ(
builder.get_variable(block.w_o()[block.size() - 1]),
fr(expected));
431 info(
"Number of gates added", gates_after - gates_before);
433 EXPECT_EQ(result,
true);
450 EXPECT_EQ(out.
get_value(),
b.get_value() /
a.get_value());
457 EXPECT_EQ(out.
get_value(),
b.get_value() /
a.get_value());
460 out =
a /
b.get_value();
461 EXPECT_EQ(out.
get_value(),
a.get_value() /
b.get_value());
470 EXPECT_EQ(result,
true);
481 EXPECT_EQ(
a.get_value() /
b.get_value(), q.
get_value());
517 EXPECT_TRUE(
a.is_constant() && (
b.get_value() *
a.get_value() == 1));
524 EXPECT_TRUE((
b.multiplicative_constant == 1) && (
b.additive_constant == 0));
526 EXPECT_TRUE(
a.get_value() *
b.get_value() == 1);
538 EXPECT_EQ(
builder.err(),
"field_t::invert denominator is 0");
552 EXPECT_EQ(
b.get_value(), 10);
553 EXPECT_EQ(
a.get_value(), 11);
554 EXPECT_TRUE(!
b.is_constant());
567 EXPECT_EQ(
b.get_value(), 11);
568 EXPECT_EQ(
a.get_value(), 11);
571 EXPECT_EQ(result,
true);
582 for (
size_t i = 0; i < 16; ++i) {
591 EXPECT_EQ(result,
true);
613 ASSERT_TRUE(verified);
619 auto gates_before =
builder.get_num_finalized_gates_inefficient();
624 auto gates_after =
builder.get_num_finalized_gates_inefficient();
634 EXPECT_EQ(gates_after - gates_before, 4UL);
637 EXPECT_EQ(result,
true);
644 auto gates_before =
builder.get_num_finalized_gates_inefficient();
648 auto gates_after =
builder.get_num_finalized_gates_inefficient();
657 EXPECT_EQ(gates_after - gates_before, 4UL);
666 auto gates_before =
builder.get_num_finalized_gates_inefficient();
672 auto gates_after =
builder.get_num_finalized_gates_inefficient();
673 EXPECT_EQ(gates_after - gates_before, 3UL);
674 r = r && (
b + 1 ==
a);
677 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient() - gates_after, 4UL);
689 EXPECT_EQ(result,
true);
699 const size_t old_n =
builder.get_num_finalized_gates_inefficient();
702 const size_t new_n =
builder.get_num_finalized_gates_inefficient();
703 EXPECT_EQ(old_n, new_n);
717 b = (
b - c_1 - c_2) / c_4;
719 EXPECT_TRUE(
a.additive_constant != 0 ||
a.multiplicative_constant != 1);
720 EXPECT_TRUE(
b.additive_constant != 0 ||
b.multiplicative_constant != 1);
730 EXPECT_EQ(a_normalized_zero.
get_value(),
false);
731 EXPECT_EQ(b_normalized_zero.
get_value(),
true);
736 EXPECT_EQ(result,
true);
742 size_t num_gates_before =
builder.get_num_finalized_gates_inefficient();
744 if (
a.get_value() == 0) {
747 a.assert_is_not_zero();
749 EXPECT_TRUE(
builder.get_num_finalized_gates_inefficient() - num_gates_before == 0);
751 a.assert_is_not_zero();
752 EXPECT_TRUE(
builder.get_num_finalized_gates_inefficient() - num_gates_before == 1);
756 a.assert_is_not_zero();
760 a.assert_is_not_zero();
765 a.assert_is_not_zero();
820 EXPECT_EQ(result,
true);
836 {
true,
true,
true,
false }, {
true,
true,
false,
false }, {
true,
false,
true,
false },
837 {
false,
true,
true,
false }, {
true,
false,
false,
true }, {
false,
true,
false,
true },
838 {
false,
false,
true,
true }, {
false,
false,
false,
true },
841 for (
const auto& [a_const, b_const, c_const, expect_gate] : cases) {
844 auto a = a_const ? make_constant(
builder, 1) : make_witness(
builder, 1);
845 auto b = b_const ? make_constant(
builder, 2) : make_witness(
builder, 2);
846 auto c = c_const ? make_constant(
builder, 3) : make_witness(
builder, 3);
848 size_t before =
builder.get_num_finalized_gates_inefficient();
850 size_t after =
builder.get_num_finalized_gates_inefficient();
851 bool gate_added = (after - before == 1);
852 EXPECT_EQ(gate_added, expect_gate);
854 before =
builder.get_num_finalized_gates_inefficient();
856 after =
builder.get_num_finalized_gates_inefficient();
858 gate_added = (after - before == 1);
859 EXPECT_EQ(gate_added, expect_gate);
870 for (
auto& predicate : predicates) {
872 const bool predicate_is_witness = !predicate.is_constant();
875 size_t num_gates_before =
builder.get_num_finalized_gates_inefficient();
880 EXPECT_TRUE(result.is_constant() == predicate.is_constant());
882 EXPECT_TRUE(
builder.get_num_finalized_gates_inefficient() - num_gates_before == 0);
885 num_gates_before =
builder.get_num_finalized_gates_inefficient();
890 EXPECT_FALSE(result.is_constant());
892 EXPECT_TRUE(
builder.get_num_finalized_gates_inefficient() - num_gates_before == predicate_is_witness);
913 EXPECT_EQ(result_a.
get_value(),
a.get_value());
914 EXPECT_EQ(result_b.
get_value(),
b.get_value());
919 EXPECT_EQ(result,
true);
927 std::vector<size_t> test_bit_sizes = { 8, 16, 32, 100, 252 };
930 auto check_split_at = [&](
const field_ct&
a,
size_t start,
size_t num_bits) {
932 auto split_data =
a.no_wrap_split_at(start, num_bits);
933 EXPECT_EQ(split_data.first.get_value(), a_native & ((
uint256_t(1) << start) - 1));
934 EXPECT_EQ(split_data.second.get_value(), (a_native >> start) & ((
uint256_t(1) << num_bits) - 1));
936 if (
a.is_constant()) {
937 EXPECT_TRUE(split_data.first.is_constant());
938 EXPECT_TRUE(split_data.second.is_constant());
942 EXPECT_TRUE(split_data.first.is_constant());
943 EXPECT_TRUE(split_data.first.get_value() == 0);
944 EXPECT_EQ(split_data.second.get_value(),
a.get_value());
948 for (
size_t num_bits : test_bit_sizes) {
953 check_split_at(a_constant, 0, num_bits);
954 check_split_at(a_constant, num_bits / 4, num_bits);
955 check_split_at(a_constant, num_bits / 3, num_bits);
956 check_split_at(a_constant, num_bits / 2, num_bits);
957 check_split_at(a_constant, num_bits - 1, num_bits);
961 check_split_at(a_witness, 0, num_bits);
962 check_split_at(a_witness, num_bits / 4, num_bits);
963 check_split_at(a_witness, num_bits / 3, num_bits);
964 check_split_at(a_witness, num_bits / 2, num_bits);
965 check_split_at(a_witness, num_bits - 1, num_bits);
969 EXPECT_EQ(result,
true);
998 EXPECT_EQ(result_a.
get_value(),
a.get_value());
999 EXPECT_EQ(result_b.
get_value(),
b.get_value());
1004 EXPECT_EQ(result_g.
get_value(), g.get_value());
1008 EXPECT_EQ(result,
true);
1022 a.assert_is_in_set(set);
1023 info(
"num gates = ",
builder.get_num_finalized_gates_inefficient());
1026 EXPECT_EQ(result,
true);
1043 info(
"num gates = ",
builder.get_num_finalized_gates_inefficient());
1045 EXPECT_EQ(result,
false);
1058 for (
auto& base : base_values) {
1059 for (
auto& exponent : const_exponent_values) {
1066 result = witness_base.
pow(exponent);
1068 if (exponent != 0) {
1078 for (
auto& exponent : witness_exponent_values) {
1088 result = witness_base.
pow(exponent);
1104 exponent_val += (uint64_t(1) << 32);
1130 info(
"num gates = ",
builder.get_num_finalized_gates_inefficient());
1133 EXPECT_EQ(result,
true);
1164 for (
size_t max_vector_length = 1; max_vector_length < 100; max_vector_length++) {
1166 std::vector<bb::fr> native_input(max_vector_length, 0);
1167 for (
auto& entry : native_input) {
1172 bb::fr native_sum = std::accumulate(native_input.begin(), native_input.end(),
bb::fr::zero());
1176 for (
auto& native_entry : native_input) {
1178 input.emplace_back(entry);
1183 EXPECT_EQ(native_sum,
sum.get_value());
1186 if (!
sum.is_constant()) {
1187 EXPECT_TRUE(
sum.multiplicative_constant == 1 &&
sum.additive_constant == 0);
1193 size_t num_witnesses = max_vector_length - (max_vector_length + 4) / 5;
1194 size_t padding = (3 - (num_witnesses % 3)) % 3;
1195 size_t expected_num_gates = (num_witnesses + padding) / 3;
1197 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient(
false) - 1, expected_num_gates);
1201 for (
auto& entry : input) {
1202 if (entry.is_constant()) {
1203 constant_input.emplace_back(entry);
1235 EXPECT_TRUE(
builder.blocks.arithmetic.q_c().back() == -witness.
get_value());
1242 for (
size_t i = 0; i < 10; ++i) {
1271 a.create_range_constraint(8);
1272 b.create_range_constraint(8);
1273 bool_ct result =
a.template ranged_less_than<8>(
b);
1274 bool expected = a_val < b_val;
1276 EXPECT_EQ(result.
get_value(), expected);
1279 EXPECT_EQ(check_result,
true);
1290 constexpr size_t max_valid_num_bits = modulus.
get_msb() - 1;
1294 constexpr size_t num_bits = max_valid_num_bits;
1296 auto result =
a.template ranged_less_than<num_bits>(
b);
1297 EXPECT_EQ(result.get_value(),
true);
1313 auto sum_ct = x_1_ct.
add_two(x_2_ct, x_3_ct);
1315 EXPECT_EQ(sum_ct.get_value(), x_1 + x_2 + x_3);
1318 EXPECT_TRUE(circuit_checks);
1328 EXPECT_TRUE(
a.get_origin_tag().is_free_witness());
1329 EXPECT_TRUE(
b.get_origin_tag().is_free_witness());
1330 const size_t parent_id = 0;
1332 const auto submitted_value_origin_tag =
OriginTag(parent_id, 0,
true);
1333 const auto challenge_origin_tag =
OriginTag(parent_id, 0,
false);
1334 const auto next_challenge_tag =
OriginTag(parent_id, 1,
false);
1336 const auto first_two_merged_tag =
OriginTag(submitted_value_origin_tag, challenge_origin_tag);
1337 const auto first_and_third_merged_tag =
OriginTag(submitted_value_origin_tag, next_challenge_tag);
1338 const auto first_second_third_merged_tag =
OriginTag(first_two_merged_tag, next_challenge_tag);
1340 a.set_origin_tag(submitted_value_origin_tag);
1341 b.set_origin_tag(challenge_origin_tag);
1343 EXPECT_EQ(
a.get_origin_tag(), submitted_value_origin_tag);
1344 EXPECT_EQ(
b.get_origin_tag(), challenge_origin_tag);
1348 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1352 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
1356 EXPECT_EQ(e.get_origin_tag(), first_two_merged_tag);
1361 EXPECT_EQ(f.get_origin_tag(), first_two_merged_tag);
1366 exponent.set_origin_tag(challenge_origin_tag);
1367 auto g =
a.
pow(exponent);
1368 EXPECT_EQ(g.get_origin_tag(), first_two_merged_tag);
1372 h.set_origin_tag(next_challenge_tag);
1373 auto i =
a.madd(
b, h);
1374 EXPECT_EQ(i.get_origin_tag(), first_second_third_merged_tag);
1377 auto j =
a.add_two(
b, h);
1378 EXPECT_EQ(j.get_origin_tag(), first_second_third_merged_tag);
1382 EXPECT_EQ(j.normalize().get_origin_tag(), j.get_origin_tag());
1386 EXPECT_EQ(
a.
is_zero().get_origin_tag(),
a.get_origin_tag());
1390 EXPECT_EQ((
a ==
b).get_origin_tag(), first_two_merged_tag);
1391 EXPECT_EQ((
a !=
b).get_origin_tag(), first_two_merged_tag);
1396 k.set_origin_tag(next_challenge_tag);
1397 auto l =
a.conditional_negate(k);
1398 EXPECT_EQ(l.get_origin_tag(), first_and_third_merged_tag);
1401 EXPECT_EQ(m.get_origin_tag(), first_second_third_merged_tag);
1404 const size_t MAX_ACCUMULATED_ELEMENTS = 16;
1410 accumulated_tags.push_back(current_tag);
1412 accumulated_tags.emplace_back(accumulated_tags[
index - 1], current_tag);
1415 element.set_origin_tag(current_tag);
1416 elements.emplace_back(element);
1419 for (
size_t index = MAX_ACCUMULATED_ELEMENTS - 1;
index > 0;
index--) {
1421 elements.pop_back();
1426 auto split_data =
a.no_wrap_split_at(num_bits / 2, num_bits);
1427 EXPECT_EQ(split_data.first.get_origin_tag(), submitted_value_origin_tag);
1428 EXPECT_EQ(split_data.second.get_origin_tag(), submitted_value_origin_tag);
1433 o.set_origin_tag(submitted_value_origin_tag);
1435 EXPECT_EQ(p.get_origin_tag(), submitted_value_origin_tag);
1437 o.set_origin_tag(challenge_origin_tag);
1440 EXPECT_EQ(o.get_origin_tag(), submitted_value_origin_tag);
1443 auto poisoned_tag = challenge_origin_tag;
1444 poisoned_tag.poison();
1445 q.set_origin_tag(poisoned_tag);
1447 EXPECT_THROW(q + q, std::runtime_error);
1458 auto null =
static_cast<Builder*
>(
nullptr);
1462 Builder* result = validate_context(null, null, null);
1463 EXPECT_EQ(result,
nullptr);
1468 Builder* result = validate_context(&builder1);
1469 EXPECT_EQ(result, &builder1);
1474 Builder* result = validate_context(null, null, &builder1);
1475 EXPECT_EQ(result, &builder1);
1480 Builder* result = validate_context(&builder1, null, null);
1481 EXPECT_EQ(result, &builder1);
1486 Builder* result = validate_context(&builder1, &builder1, &builder1);
1487 EXPECT_EQ(result, &builder1);
1493 "Pointers refer to different builder objects!");
1499 "Pointers refer to different builder objects!");
1504 Builder* result = validate_context(null, &builder1, &builder1);
1505 EXPECT_EQ(result, &builder1);
1510 Builder* result = validate_context(&builder1, null, &builder1, null);
1511 EXPECT_EQ(result, &builder1);
1520 Builder* ctx = validate_context<Builder>(empty);
1521 EXPECT_EQ(ctx,
nullptr);
1532 Builder* ctx = validate_context<Builder>(fields);
1543 Builder* ctx = validate_context<Builder>(fields);
1558 EXPECT_THROW_OR_ABORT(validate_context<Builder>(fields),
"Pointers refer to different builder objects!");
1568 TestFixture::test_accumulate();
1572 TestFixture::test_add();
1576 TestFixture::test_add_mul_with_constants();
1580 TestFixture::test_add_two();
1584 TestFixture::test_assert_equal();
1588 TestFixture::test_assert_equal_with_gate_count();
1592 TestFixture::test_assert_is_in_set();
1596 TestFixture::test_assert_is_in_set_fails();
1600 TestFixture::test_assert_is_zero();
1604 TestFixture::test_assert_is_not_zero();
1608 TestFixture::test_bool_conversion();
1612 TestFixture::test_bool_conversion_regression();
1616 TestFixture::test_conditional_assign();
1620 TestFixture::test_conditional_assign_regression();
1624 TestFixture::test_conditional_negate();
1628 TestFixture::test_constructor_from_witness();
1632 TestFixture::test_copy_as_new_witness();
1636 TestFixture::create_range_constraint();
1640 TestFixture::test_div();
1644 TestFixture::test_div_edge_cases();
1648 TestFixture::test_equality();
1652 TestFixture::test_equality_false();
1656 TestFixture::test_equality_with_constants();
1660 TestFixture::test_field_fibbonaci();
1664 TestFixture::test_field_pythagorean();
1668 TestFixture::test_fix_witness();
1672 TestFixture::test_invert();
1676 TestFixture::test_invert_zero();
1680 TestFixture::test_is_zero();
1684 TestFixture::test_larger_circuit();
1688 TestFixture::test_madd();
1692 TestFixture::test_madd_add_two_gate_count();
1696 TestFixture::test_multiplicative_constant_regression();
1700 TestFixture::test_origin_tag_consistency();
1704 TestFixture::test_postfix_increment();
1708 TestFixture::test_pow();
1712 TestFixture::test_pow_exponent_out_of_range();
1716 TestFixture::test_prefix_increment();
1720 TestFixture::test_ranged_less_than();
1724 TestFixture::test_ranged_less_than_max_num_bits();
1728 TestFixture::test_split_at();
1732 TestFixture::test_three_bit_table();
1736 TestFixture::test_two_bit_table();
1740 TestFixture::test_validate_context();
1744 TestFixture::test_validate_container_context();
#define EXPECT_THROW_OR_ABORT(statement, matcher)
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
virtual uint8_t get_random_uint8()=0
virtual uint32_t get_random_uint32()=0
virtual uint256_t get_random_uint256()=0
constexpr uint64_t get_msb() const
Implements boolean logic in-circuit.
void assert_is_zero(std::string const &msg="field_t::assert_is_zero") const
Enforce a copy constraint between *this and 0 stored at zero_idx of the Builder.
field_t conditional_negate(const bool_t< Builder > &predicate) const
If predicate's value == true, negate the value, else keep it unchanged.
void assert_is_in_set(const std::vector< field_t > &set, std::string const &msg="field_t::assert_not_in_set") const
Constrain *this \in set by enforcing that P(X) = \prod_{s \in set} (X - s) is 0 at X = *this.
uint32_t set_public() const
void assert_equal(const field_t &rhs, std::string const &msg="field_t::assert_equal") const
Copy constraint: constrain that *this field is equal to rhs element.
field_t madd(const field_t &to_mul, const field_t &to_add) const
static field_t select_from_three_bit_table(const std::array< field_t, 8 > &table, const bool_t< Builder > &t2, const bool_t< Builder > &t1, const bool_t< Builder > &t0)
Given a multilinear polynomial in 3 variables, which is represented by a table of monomial coefficien...
static field_t accumulate(const std::vector< field_t > &input)
Efficiently compute the sum of vector entries. Using big_add_gate we reduce the number of gates neede...
static bool witness_indices_match(const field_t &a, const field_t &b)
Check if two field elements have the same witness index (for identity checks).
static std::array< field_t, 8 > preprocess_three_bit_table(const field_t &T0, const field_t &T1, const field_t &T2, const field_t &T3, const field_t &T4, const field_t &T5, const field_t &T6, const field_t &T7)
Given a table T of size 8, outputs the monomial coefficients of the multilinear polynomial in t0,...
bb::fr multiplicative_constant
static field_t copy_as_new_witness(Builder &context, field_t const &other)
static field_t conditional_assign_internal(const bool_t< Builder > &predicate, const field_t &lhs, const field_t &rhs)
If predicate == true then return lhs, else return rhs.
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
field_t normalize() const
Return a new element, where the in-circuit witness contains the actual represented value (multiplicat...
static field_t select_from_two_bit_table(const std::array< field_t, 4 > &table, const bool_t< Builder > &t1, const bool_t< Builder > &t0)
Given a multilinear polynomial in 2 variables, which is represented by a table of monomial coefficien...
static field_t from_witness(Builder *ctx, const bb::fr &input)
bool_t< Builder > is_zero() const
Validate whether a field_t element is zero.
field_t pow(const uint32_t &exponent) const
Raise this field element to the power of the provided uint32_t exponent.
static std::array< field_t, 4 > preprocess_two_bit_table(const field_t &T0, const field_t &T1, const field_t &T2, const field_t &T3)
Given a table T of size 4, outputs the monomial coefficients of the multilinear polynomial in t0,...
field_t add_two(const field_t &add_b, const field_t &add_c) const
Efficiently compute (this + a + b) using big_mul gate.
uint32_t get_witness_index() const
Get the witness index of the current field element.
static void test_bool_conversion()
static void test_conditional_assign_regression()
Test that conditional assign doesn't produce a new witness if lhs and rhs are constant.
void test_validate_container_context()
static void test_fix_witness()
static void test_assert_is_zero()
static void test_conditional_assign()
static uint64_t fidget(Builder &builder)
static void test_div_edge_cases()
static void create_range_constraint()
static void test_prefix_increment()
static void test_equality()
static void test_invert()
stdlib::public_witness_t< Builder > public_witness_ct
static void test_split_at()
static void test_equality_false()
static void build_test_circuit(Builder &builder, size_t num_gates)
static void test_ranged_less_than_max_num_bits()
static void test_larger_circuit()
static void test_accumulate()
static void test_field_fibbonaci()
void test_validate_context()
static void test_copy_as_new_witness()
static void test_is_zero()
stdlib::witness_t< Builder > witness_ct
static void test_assert_equal()
Demonstrate current behavior of assert_equal.
stdlib::bool_t< Builder > bool_ct
static void test_invert_zero()
void test_assert_equal_with_gate_count()
static void test_constructor_from_witness()
static void test_assert_is_in_set()
static void test_conditional_negate()
static void test_origin_tag_consistency()
static void test_add_two()
static void test_add_mul_with_constants()
static void test_multiplicative_constant_regression()
Test that multiplicative_constant of constants is no longer affected by any arithimetic operation.
static void test_assert_is_in_set_fails()
static void test_equality_with_constants()
static void test_three_bit_table()
static void test_two_bit_table()
static void test_field_pythagorean()
static void test_ranged_less_than()
static void test_postfix_increment()
static void test_assert_is_not_zero()
static void test_bool_conversion_regression()
Test that bool is converted correctly.
stdlib::field_t< Builder > field_ct
static void test_madd_add_two_gate_count()
static void test_pow_exponent_out_of_range()
ECCVMCircuitBuilder Builder
constexpr size_t MAX_NO_WRAP_INTEGER_BIT_LENGTH
constexpr T get_msb(const T in)
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
T * validate_context(T *ptr)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
field< Bn254FrParams > fr
Inner sum(Cont< Inner, Args... > const &in)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
testing::Types< bb::MegaCircuitBuilder, bb::UltraCircuitBuilder > CircuitTypes
static constexpr field neg_one()
static constexpr field one()
static constexpr uint256_t modulus
BB_INLINE constexpr field pow(const uint256_t &exponent) const noexcept
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr bool is_zero() const noexcept
static constexpr field zero()