2#include "../bool/bool.hpp"
9#include <gtest/gtest.h>
22template <
typename Builder>
class stdlib_field :
public testing::Test {
33 const size_t num_gates =
builder.get_estimated_num_finalized_gates();
39 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() == num_gates);
43 for (
size_t i = 0; i < 17; ++i) {
53 uint64_t cc = aa +
bb;
55 for (
size_t i = 0; i < 17; ++i) {
69 for (
size_t i = 0; i < (num_gates / 4) - 4; ++i) {
95 EXPECT_TRUE(
sum.get_value() ==
a.get_value() +
b.get_value());
96 EXPECT_FALSE(
sum.is_constant());
105 sum_with_constant = c +
sum;
110 field_ct sum_with_same_witness_index = sum_with_constant +
sum;
111 EXPECT_TRUE(sum_with_same_witness_index.
get_value() ==
sum.get_value() + sum_with_constant.
get_value());
123 auto run_test = [&](
fr elt,
size_t num_bits,
bool expect_verified) {
126 a.create_range_constraint(num_bits,
"field_tests: range_constraint on a fails");
129 EXPECT_EQ(verified, expect_verified);
130 if (verified != expect_verified) {
131 info(
"Range constraint malfunction on ", elt,
" with num_bits ", num_bits);
135 run_test(2, 1,
false);
136 run_test(2, 2,
true);
137 run_test(3, 2,
true);
139 for (
size_t num_bits = 1; num_bits < 17; num_bits++) {
140 run_test(130, num_bits, num_bits >= 8);
145 run_test(-1, 128,
false);
156 for (
size_t idx = 0; idx < 4; idx++) {
157 bool expected_to_be_constant = (idx < 2);
162 EXPECT_TRUE(converted.
is_constant() == expected_to_be_constant);
165 if (!expected_to_be_constant) {
175 "Assertion failed: (additive_constant == bb::fr::one() || additive_constant == bb::fr::zero())");
179 "Assertion failed: ((witness == bb::fr::zero()) || (witness == bb::fr::one()) == true)");
210 auto check_conditional_assign =
212 size_t num_gates_before =
builder.get_estimated_num_finalized_gates();
214 EXPECT_TRUE(result.
get_value() == (predicate.get_value() ? lhs.get_value() : rhs.get_value()));
216 size_t expected_num_gates = 0;
218 if (!predicate.is_constant()) {
221 int num_witnesses =
static_cast<int>(!rhs.is_constant()) +
static_cast<int>(!lhs.is_constant());
223 expected_num_gates +=
static_cast<size_t>(num_witnesses);
227 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() - num_gates_before == expected_num_gates);
234 for (
auto& predicate : predicates) {
235 for (
size_t i = 0; i < 4; i++) {
236 check_conditional_assign(
builder, predicate, lhs_in[i], rhs_in[i], i > 2);
248 auto check_that_conditional_assign_result_is_constant = [](
bool_ct& predicate) {
265 for (
auto& predicate : predicates) {
266 check_that_conditional_assign_result_is_constant(predicate);
281 EXPECT_TRUE(
a.multiplicative_constant ==
bb::fr::one());
282 EXPECT_TRUE(
b.multiplicative_constant ==
bb::fr::one());
284 EXPECT_TRUE(c.multiplicative_constant ==
bb::fr::one());
286 EXPECT_TRUE(c.multiplicative_constant ==
bb::fr::one());
288 EXPECT_TRUE(c.multiplicative_constant ==
bb::fr::one());
296 auto run_test = [](
bool constrain,
bool true_when_y_val_zero =
true) {
312 if (true_when_y_val_zero) {
321 .const_scaling = 0 });
332 .const_scaling = -1 });
349 run_test(
true,
true);
350 run_test(
true,
false);
361 EXPECT_NO_THROW(
a.assert_equal(
b));
380 EXPECT_EQ(
builder.get_estimated_num_finalized_gates() - num_gates_start, 1);
392 EXPECT_EQ(
builder.get_estimated_num_finalized_gates() - num_gates_start, 1);
405 EXPECT_EQ(
builder.get_estimated_num_finalized_gates() - num_gates_start, 0);
419 EXPECT_EQ(
builder.get_estimated_num_finalized_gates() - num_gates_start, 1);
420 EXPECT_EQ(
builder.err(),
"field_t::assert_equal");
427 auto gates_before =
builder.get_estimated_num_finalized_gates();
429 auto gates_after =
builder.get_estimated_num_finalized_gates();
430 auto& block =
builder.blocks.arithmetic;
431 EXPECT_EQ(
builder.get_variable(block.w_o()[block.size() - 1]),
fr(expected));
432 info(
"Number of gates added", gates_after - gates_before);
434 EXPECT_EQ(result,
true);
451 EXPECT_EQ(out.
get_value(),
b.get_value() /
a.get_value());
458 EXPECT_EQ(out.
get_value(),
b.get_value() /
a.get_value());
462 EXPECT_EQ(out.
get_value(),
a.get_value() /
b.get_value());
471 EXPECT_EQ(result,
true);
482 EXPECT_EQ(
a.get_value() /
b.get_value(), q.
get_value());
518 EXPECT_TRUE(
a.is_constant() && (
b.get_value() *
a.get_value() == 1));
525 EXPECT_TRUE((
b.multiplicative_constant == 1) && (
b.additive_constant == 0));
527 EXPECT_TRUE(
a.get_value() *
b.get_value() == 1);
539 EXPECT_EQ(
builder.err(),
"field_t::invert denominator is 0");
553 EXPECT_EQ(
b.get_value(), 10);
554 EXPECT_EQ(
a.get_value(), 11);
555 EXPECT_TRUE(!
b.is_constant());
568 EXPECT_EQ(
b.get_value(), 11);
569 EXPECT_EQ(
a.get_value(), 11);
572 EXPECT_EQ(result,
true);
583 for (
size_t i = 0; i < 16; ++i) {
592 EXPECT_EQ(result,
true);
614 ASSERT_TRUE(verified);
620 auto gates_before =
builder.get_estimated_num_finalized_gates();
625 auto gates_after =
builder.get_estimated_num_finalized_gates();
635 EXPECT_EQ(gates_after - gates_before, 4UL);
638 EXPECT_EQ(result,
true);
645 auto gates_before =
builder.get_estimated_num_finalized_gates();
649 auto gates_after =
builder.get_estimated_num_finalized_gates();
658 EXPECT_EQ(gates_after - gates_before, 4UL);
667 auto gates_before =
builder.get_estimated_num_finalized_gates();
673 auto gates_after =
builder.get_estimated_num_finalized_gates();
674 EXPECT_EQ(gates_after - gates_before, 3UL);
675 r = r && (
b + 1 ==
a);
678 EXPECT_EQ(
builder.get_estimated_num_finalized_gates() - gates_after, 4UL);
690 EXPECT_EQ(result,
true);
700 const size_t old_n =
builder.get_estimated_num_finalized_gates();
703 const size_t new_n =
builder.get_estimated_num_finalized_gates();
704 EXPECT_EQ(old_n, new_n);
718 b = (
b - c_1 - c_2) / c_4;
720 EXPECT_TRUE(
a.additive_constant != 0 ||
a.multiplicative_constant != 1);
721 EXPECT_TRUE(
b.additive_constant != 0 ||
b.multiplicative_constant != 1);
731 EXPECT_EQ(a_normalized_zero.
get_value(),
false);
732 EXPECT_EQ(b_normalized_zero.
get_value(),
true);
737 EXPECT_EQ(result,
true);
743 size_t num_gates_before =
builder.get_estimated_num_finalized_gates();
745 if (
a.get_value() == 0) {
748 a.assert_is_not_zero();
750 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() - num_gates_before == 0);
752 a.assert_is_not_zero();
753 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() - num_gates_before == 1);
757 a.assert_is_not_zero();
761 a.assert_is_not_zero();
766 a.assert_is_not_zero();
821 EXPECT_EQ(result,
true);
837 {
true,
true,
true,
false }, {
true,
true,
false,
false }, {
true,
false,
true,
false },
838 {
false,
true,
true,
false }, {
true,
false,
false,
true }, {
false,
true,
false,
true },
839 {
false,
false,
true,
true }, {
false,
false,
false,
true },
842 for (
const auto& [a_const, b_const, c_const, expect_gate] : cases) {
845 auto a = a_const ? make_constant(
builder, 1) : make_witness(
builder, 1);
846 auto b = b_const ? make_constant(
builder, 2) : make_witness(
builder, 2);
847 auto c = c_const ? make_constant(
builder, 3) : make_witness(
builder, 3);
849 size_t before =
builder.get_estimated_num_finalized_gates();
851 size_t after =
builder.get_estimated_num_finalized_gates();
852 bool gate_added = (after - before == 1);
853 EXPECT_EQ(gate_added, expect_gate);
855 before =
builder.get_estimated_num_finalized_gates();
857 after =
builder.get_estimated_num_finalized_gates();
859 gate_added = (after - before == 1);
860 EXPECT_EQ(gate_added, expect_gate);
871 for (
auto& predicate : predicates) {
873 const bool predicate_is_witness = !predicate.is_constant();
876 size_t num_gates_before =
builder.get_estimated_num_finalized_gates();
881 EXPECT_TRUE(result.is_constant() == predicate.is_constant());
883 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() - num_gates_before == 0);
886 num_gates_before =
builder.get_estimated_num_finalized_gates();
891 EXPECT_FALSE(result.is_constant());
893 EXPECT_TRUE(
builder.get_estimated_num_finalized_gates() - num_gates_before == predicate_is_witness);
914 EXPECT_EQ(result_a.
get_value(),
a.get_value());
915 EXPECT_EQ(result_b.
get_value(),
b.get_value());
920 EXPECT_EQ(result,
true);
928 std::vector<size_t> test_bit_sizes = { 8, 16, 32, 100, 252 };
931 auto check_split_at = [&](
const field_ct&
a,
size_t start,
size_t num_bits) {
933 auto split_data =
a.split_at(start, num_bits);
934 EXPECT_EQ(split_data.first.get_value(), a_native & ((
uint256_t(1) << start) - 1));
935 EXPECT_EQ(split_data.second.get_value(), (a_native >> start) & ((
uint256_t(1) << num_bits) - 1));
937 if (
a.is_constant()) {
938 EXPECT_TRUE(split_data.first.is_constant());
939 EXPECT_TRUE(split_data.second.is_constant());
943 EXPECT_TRUE(split_data.first.is_constant());
944 EXPECT_TRUE(split_data.first.get_value() == 0);
945 EXPECT_EQ(split_data.second.get_value(),
a.get_value());
949 for (
size_t num_bits : test_bit_sizes) {
954 check_split_at(a_constant, 0, num_bits);
955 check_split_at(a_constant, num_bits / 4, num_bits);
956 check_split_at(a_constant, num_bits / 3, num_bits);
957 check_split_at(a_constant, num_bits / 2, num_bits);
958 check_split_at(a_constant, num_bits - 1, num_bits);
962 check_split_at(a_witness, 0, num_bits);
963 check_split_at(a_witness, num_bits / 4, num_bits);
964 check_split_at(a_witness, num_bits / 3, num_bits);
965 check_split_at(a_witness, num_bits / 2, num_bits);
966 check_split_at(a_witness, num_bits - 1, num_bits);
970 EXPECT_EQ(result,
true);
999 EXPECT_EQ(result_a.
get_value(),
a.get_value());
1000 EXPECT_EQ(result_b.
get_value(),
b.get_value());
1005 EXPECT_EQ(result_g.
get_value(), g.get_value());
1009 EXPECT_EQ(result,
true);
1024 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
1027 EXPECT_EQ(result,
true);
1044 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
1046 EXPECT_EQ(result,
false);
1059 for (
auto& base : base_values) {
1060 for (
auto& exponent : const_exponent_values) {
1067 result = witness_base.
pow(exponent);
1069 if (exponent != 0) {
1079 for (
auto& exponent : witness_exponent_values) {
1089 result = witness_base.
pow(exponent);
1105 exponent_val += (uint64_t(1) << 32);
1131 info(
"num gates = ",
builder.get_estimated_num_finalized_gates());
1134 EXPECT_EQ(result,
true);
1165 for (
size_t max_vector_length = 1; max_vector_length < 100; max_vector_length++) {
1168 for (
auto& entry : native_input) {
1173 bb::fr native_sum = std::accumulate(native_input.begin(), native_input.end(),
bb::fr::zero());
1177 for (
auto& native_entry : native_input) {
1179 input.emplace_back(entry);
1184 EXPECT_EQ(native_sum,
sum.get_value());
1187 if (!
sum.is_constant()) {
1188 EXPECT_TRUE(
sum.multiplicative_constant == 1 &&
sum.additive_constant == 0);
1194 size_t num_witnesses = max_vector_length - (max_vector_length + 4) / 5;
1195 size_t padding = (3 - (num_witnesses % 3)) % 3;
1196 size_t expected_num_gates = (num_witnesses + padding) / 3;
1198 EXPECT_EQ(
builder.get_estimated_num_finalized_gates() - 1, expected_num_gates);
1202 for (
auto& entry : input) {
1203 if (entry.is_constant()) {
1204 constant_input.emplace_back(entry);
1236 EXPECT_TRUE(
builder.blocks.arithmetic.q_c().back() == -witness.
get_value());
1243 for (
size_t i = 0; i < 10; ++i) {
1272 a.create_range_constraint(8);
1273 b.create_range_constraint(8);
1274 bool_ct result =
a.template ranged_less_than<8>(
b);
1275 bool expected = a_val < b_val;
1277 EXPECT_EQ(result.
get_value(), expected);
1280 EXPECT_EQ(check_result,
true);
1291 constexpr size_t max_valid_num_bits = modulus.
get_msb() - 1;
1295 constexpr size_t num_bits = max_valid_num_bits;
1297 auto result =
a.template ranged_less_than<num_bits>(
b);
1298 EXPECT_EQ(result.get_value(),
true);
1314 auto sum_ct = x_1_ct.
add_two(x_2_ct, x_3_ct);
1316 EXPECT_EQ(sum_ct.get_value(), x_1 + x_2 + x_3);
1319 EXPECT_TRUE(circuit_checks);
1329 EXPECT_TRUE(
a.get_origin_tag().is_empty());
1330 EXPECT_TRUE(
b.get_origin_tag().is_empty());
1331 const size_t parent_id = 0;
1333 const auto submitted_value_origin_tag =
OriginTag(parent_id, 0,
true);
1334 const auto challenge_origin_tag =
OriginTag(parent_id, 0,
false);
1335 const auto next_challenge_tag =
OriginTag(parent_id, 1,
false);
1337 const auto first_two_merged_tag =
OriginTag(submitted_value_origin_tag, challenge_origin_tag);
1338 const auto first_and_third_merged_tag =
OriginTag(submitted_value_origin_tag, next_challenge_tag);
1339 const auto first_second_third_merged_tag =
OriginTag(first_two_merged_tag, next_challenge_tag);
1341 a.set_origin_tag(submitted_value_origin_tag);
1342 b.set_origin_tag(challenge_origin_tag);
1344 EXPECT_EQ(
a.get_origin_tag(), submitted_value_origin_tag);
1345 EXPECT_EQ(
b.get_origin_tag(), challenge_origin_tag);
1349 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1353 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
1357 EXPECT_EQ(e.get_origin_tag(), first_two_merged_tag);
1362 EXPECT_EQ(f.get_origin_tag(), first_two_merged_tag);
1367 exponent.set_origin_tag(challenge_origin_tag);
1368 auto g =
a.pow(exponent);
1369 EXPECT_EQ(g.get_origin_tag(), first_two_merged_tag);
1373 h.set_origin_tag(next_challenge_tag);
1374 auto i =
a.madd(
b, h);
1375 EXPECT_EQ(i.get_origin_tag(), first_second_third_merged_tag);
1378 auto j =
a.add_two(
b, h);
1379 EXPECT_EQ(j.get_origin_tag(), first_second_third_merged_tag);
1383 EXPECT_EQ(j.normalize().get_origin_tag(), j.get_origin_tag());
1387 EXPECT_EQ(
a.is_zero().get_origin_tag(),
a.get_origin_tag());
1391 EXPECT_EQ((
a ==
b).get_origin_tag(), first_two_merged_tag);
1392 EXPECT_EQ((
a !=
b).get_origin_tag(), first_two_merged_tag);
1397 k.set_origin_tag(next_challenge_tag);
1398 auto l =
a.conditional_negate(k);
1399 EXPECT_EQ(l.get_origin_tag(), first_and_third_merged_tag);
1402 EXPECT_EQ(m.get_origin_tag(), first_second_third_merged_tag);
1405 const size_t MAX_ACCUMULATED_ELEMENTS = 16;
1408 for (
size_t index = 0; index < MAX_ACCUMULATED_ELEMENTS; index++) {
1409 const auto current_tag =
OriginTag(parent_id, index >> 1, !(index & 1));
1411 accumulated_tags.push_back(current_tag);
1413 accumulated_tags.emplace_back(accumulated_tags[index - 1], current_tag);
1416 element.set_origin_tag(current_tag);
1417 elements.emplace_back(element);
1420 for (
size_t index = MAX_ACCUMULATED_ELEMENTS - 1; index > 0; index--) {
1422 elements.pop_back();
1427 auto split_data =
a.split_at(num_bits / 2, num_bits);
1428 EXPECT_EQ(split_data.first.get_origin_tag(), submitted_value_origin_tag);
1429 EXPECT_EQ(split_data.second.get_origin_tag(), submitted_value_origin_tag);
1434 o.set_origin_tag(submitted_value_origin_tag);
1436 EXPECT_EQ(p.get_origin_tag(), submitted_value_origin_tag);
1438 o.set_origin_tag(challenge_origin_tag);
1441 EXPECT_EQ(o.get_origin_tag(), submitted_value_origin_tag);
1444 auto poisoned_tag = challenge_origin_tag;
1445 poisoned_tag.poison();
1446 q.set_origin_tag(poisoned_tag);
1448 EXPECT_THROW(q + q, std::runtime_error);
1459 auto null =
static_cast<Builder*
>(
nullptr);
1463 Builder* result = validate_context(null, null, null);
1464 EXPECT_EQ(result,
nullptr);
1469 Builder* result = validate_context(&builder1);
1470 EXPECT_EQ(result, &builder1);
1475 Builder* result = validate_context(null, null, &builder1);
1476 EXPECT_EQ(result, &builder1);
1481 Builder* result = validate_context(&builder1, null, null);
1482 EXPECT_EQ(result, &builder1);
1487 Builder* result = validate_context(&builder1, &builder1, &builder1);
1488 EXPECT_EQ(result, &builder1);
1494 "Pointers refer to different builder objects!");
1500 "Pointers refer to different builder objects!");
1505 Builder* result = validate_context(null, &builder1, &builder1);
1506 EXPECT_EQ(result, &builder1);
1511 Builder* result = validate_context(&builder1, null, &builder1, null);
1512 EXPECT_EQ(result, &builder1);
1521 Builder* ctx = validate_context<Builder>(empty);
1522 EXPECT_EQ(ctx,
nullptr);
1533 Builder* ctx = validate_context<Builder>(fields);
1544 Builder* ctx = validate_context<Builder>(fields);
1559 EXPECT_THROW_OR_ABORT(validate_context<Builder>(fields),
"Pointers refer to different builder objects!");
1569 TestFixture::test_accumulate();
1573 TestFixture::test_add();
1577 TestFixture::test_add_mul_with_constants();
1581 TestFixture::test_add_two();
1585 TestFixture::test_assert_equal();
1589 TestFixture::test_assert_equal_with_gate_count();
1593 TestFixture::test_assert_is_in_set();
1597 TestFixture::test_assert_is_in_set_fails();
1601 TestFixture::test_assert_is_zero();
1605 TestFixture::test_assert_is_not_zero();
1609 TestFixture::test_bool_conversion();
1613 TestFixture::test_bool_conversion_regression();
1617 TestFixture::test_conditional_assign();
1621 TestFixture::test_conditional_assign_regression();
1625 TestFixture::test_conditional_negate();
1629 TestFixture::test_constructor_from_witness();
1633 TestFixture::test_copy_as_new_witness();
1637 TestFixture::create_range_constraint();
1641 TestFixture::test_div();
1645 TestFixture::test_div_edge_cases();
1649 TestFixture::test_equality();
1653 TestFixture::test_equality_false();
1657 TestFixture::test_equality_with_constants();
1661 TestFixture::test_field_fibbonaci();
1665 TestFixture::test_field_pythagorean();
1669 TestFixture::test_fix_witness();
1673 TestFixture::test_invert();
1677 TestFixture::test_invert_zero();
1681 TestFixture::test_is_zero();
1685 TestFixture::test_larger_circuit();
1689 TestFixture::test_madd();
1693 TestFixture::test_madd_add_two_gate_count();
1697 TestFixture::test_multiplicative_constant_regression();
1701 TestFixture::test_origin_tag_consistency();
1705 TestFixture::test_postfix_increment();
1709 TestFixture::test_pow();
1713 TestFixture::test_pow_exponent_out_of_range();
1717 TestFixture::test_prefix_increment();
1721 TestFixture::test_ranged_less_than();
1725 TestFixture::test_ranged_less_than_max_num_bits();
1729 TestFixture::test_split_at();
1733 TestFixture::test_three_bit_table();
1737 TestFixture::test_two_bit_table();
1741 TestFixture::test_validate_context();
1745 TestFixture::test_validate_container_context();
#define EXPECT_THROW_OR_ABORT(statement, matcher)
size_t get_estimated_num_finalized_gates() const
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.
bool_t normalize() const
A bool_t element is normalized if witness_inverted == false. For a given *this, output its normalized...
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 field_t conditional_assign(const bool_t< Builder > &predicate, const field_t &lhs, const field_t &rhs)
If predicate == true then return lhs, else return rhs.
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)
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::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
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()