7#include "../bool/bool.hpp"
8#include "../byte_array/byte_array.hpp"
9#include "../field/field.hpp"
18#include <gtest/gtest.h>
42template <
template <
typename,
typename>
class BigField,
typename Builder,
typename Params>
47template <
template <
typename,
typename>
class BigField,
typename Builder,
typename Params>
71 fq_ct var = fq_ct::create_from_u512_as_witness(&
builder, 1);
73 fq_ct mixed =
fq_ct(1).add_to_lower_limb(small_var, 1);
86 r = constant * constant;
87 r = constant / constant;
94 EXPECT_EQ(result,
true);
104 fq_ct tval1 = tval - tval;
105 fq_ct tval2 = tval1 / tval;
108 EXPECT_EQ(result,
true);
116 fq_ct tval1 = tval - tval;
117 fq_ct tval2 = tval1 / tval;
120 EXPECT_EQ(result,
true);
131 fr elt_native_hi =
fr(
uint256_t(elt_native).
slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4));
134 elt_ct.unset_free_witness_tag();
166 bool reduce_input =
false)
170 for (
size_t i = 0; i < num; ++i) {
173 big_elts[i] = big_elt;
180 bool reduce_input =
false)
184 for (
size_t i = 0; i < num; ++i) {
187 big_elts[i] = big_elt;
195 bool reduce_input =
false)
199 for (
size_t i = 0; i < num; ++i) {
202 big_elts[i] = big_elt;
214 a_ct.binary_basis_limbs[0].element.set_origin_tag(submitted_value_origin_tag);
215 a_ct.binary_basis_limbs[1].element.set_origin_tag(challenge_origin_tag);
216 a_ct.prime_basis_limb.set_origin_tag(next_challenge_tag);
217 EXPECT_EQ(a_ct.get_origin_tag(), first_second_third_merged_tag);
223 a_ct.set_origin_tag(submitted_value_origin_tag);
224 EXPECT_EQ(a_ct.binary_basis_limbs[0].element.get_origin_tag(), submitted_value_origin_tag);
225 EXPECT_EQ(a_ct.binary_basis_limbs[1].element.get_origin_tag(), submitted_value_origin_tag);
226 EXPECT_EQ(a_ct.binary_basis_limbs[2].element.get_origin_tag(), submitted_value_origin_tag);
227 EXPECT_EQ(a_ct.binary_basis_limbs[3].element.get_origin_tag(), submitted_value_origin_tag);
228 EXPECT_EQ(a_ct.prime_basis_limb.get_origin_tag(), submitted_value_origin_tag);
235 a.set_origin_tag(submitted_value_origin_tag);
236 b.set_origin_tag(challenge_origin_tag);
237 c.set_origin_tag(next_challenge_tag);
240 EXPECT_EQ((
a +
b).get_origin_tag(), first_two_merged_tag);
241 EXPECT_EQ((
a -
b).get_origin_tag(), first_two_merged_tag);
242 EXPECT_EQ((
a *
b).get_origin_tag(), first_two_merged_tag);
247 tmp.set_origin_tag(submitted_value_origin_tag);
249 other.set_origin_tag(challenge_origin_tag);
251 EXPECT_EQ(tmp.get_origin_tag(), first_two_merged_tag);
255 EXPECT_EQ(
a.add_two(
b, c).get_origin_tag(), first_second_third_merged_tag);
262 s1.set_origin_tag(submitted_value_origin_tag);
263 s2.set_origin_tag(challenge_origin_tag);
264 to_sum.push_back(s1);
265 to_sum.push_back(s2);
266 EXPECT_EQ(fq_ct::sum(to_sum).get_origin_tag(), first_two_merged_tag);
270 EXPECT_EQ(
a.madd(
b, { c }).get_origin_tag(), first_second_third_merged_tag);
273 EXPECT_EQ(
a.sqradd({ b }).get_origin_tag(), first_two_merged_tag);
280 EXPECT_EQ(fq_ct::mult_madd(left, right, to_add).get_origin_tag(), first_second_third_merged_tag);
287 d.set_origin_tag(submitted_value_origin_tag);
288 e.set_origin_tag(challenge_origin_tag);
289 EXPECT_EQ(fq_ct::dual_madd(
a,
b,
a,
b, { c }).get_origin_tag(), first_second_third_merged_tag);
293 EXPECT_EQ(
a.div_without_denominator_check(
b).get_origin_tag(), first_two_merged_tag);
298 predicate.set_origin_tag(next_challenge_tag);
299 EXPECT_EQ(
a.conditional_select(
b, predicate).get_origin_tag(), first_second_third_merged_tag);
305 predicate.set_origin_tag(challenge_origin_tag);
306 EXPECT_EQ(
a.conditional_negate(predicate).get_origin_tag(), first_two_merged_tag);
312 tmp.set_origin_tag(submitted_value_origin_tag);
314 EXPECT_EQ(tmp.get_origin_tag(), submitted_value_origin_tag);
320 tmp.set_origin_tag(submitted_value_origin_tag);
321 tmp.assert_is_in_field();
322 EXPECT_EQ(tmp.get_origin_tag(), submitted_value_origin_tag);
328 std::vector<uint8_t> input_bytes(
sizeof(
fq_native));
332 fq_ct from_bytes(input_arr);
333 EXPECT_EQ(from_bytes.get_origin_tag(), submitted_value_origin_tag);
337 EXPECT_EQ(
a.
pow(5).get_origin_tag(), submitted_value_origin_tag);
343 death.set_origin_tag(instant_death_tag);
344 EXPECT_THROW(death + death, std::runtime_error);
355 fq_ct elt_witness_ct =
365 4 * fq_ct::NUM_LIMB_BITS - 3);
369 4 * fq_ct::NUM_LIMB_BITS - 3);
372 EXPECT_EQ(result,
true);
390 fq_ct result = fq_ct::unsafe_construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_4_ct);
392 fr expected_prime_limb = limb_1_native;
393 expected_prime_limb += (limb_2_native * fq_ct::shift_1);
394 expected_prime_limb += (limb_3_native * fq_ct::shift_2);
395 expected_prime_limb += (limb_4_native * fq_ct::shift_3);
396 EXPECT_EQ(expected_prime_limb, result.prime_basis_limb.get_value());
399 fq_ct result_1 = fq_ct::unsafe_construct_from_limbs(
401 EXPECT_EQ(result.binary_basis_limbs[0].element.get_value(), result_1.binary_basis_limbs[0].element.get_value());
404 EXPECT_EQ(result_check,
true);
422 fq_ct result = fq_ct::construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_4_ct);
424 fr expected_prime_limb = limb_1_native;
425 expected_prime_limb += (limb_2_native * fq_ct::shift_1);
426 expected_prime_limb += (limb_3_native * fq_ct::shift_2);
427 expected_prime_limb += (limb_4_native * fq_ct::shift_3);
428 EXPECT_EQ(expected_prime_limb, result.prime_basis_limb.get_value());
431 fq_ct result_1 = fq_ct::construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_3_ct,
true);
432 EXPECT_EQ(result.binary_basis_limbs[0].element.get_value(), result_1.binary_basis_limbs[0].element.get_value());
435 EXPECT_EQ(result_check,
true);
455 fq_ct result = fq_ct::construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_4_ct);
456 fr expected_prime_limb = limb_1_native;
457 expected_prime_limb += (limb_2_native * fq_ct::shift_1);
458 expected_prime_limb += (limb_3_native * fq_ct::shift_2);
459 expected_prime_limb += (limb_4_native * fq_ct::shift_3);
460 EXPECT_EQ(expected_prime_limb, result.prime_basis_limb.get_value());
463 EXPECT_EQ(result_check,
false);
464 EXPECT_EQ(
builder.err(),
"bigfield::construct_from_limbs: limb 0 or 1 too large: lo limb.");
470 size_t num_repetitions = 10;
471 for (
size_t i = 0; i < num_repetitions; ++i) {
477 if (i == num_repetitions - 1) {
479 d_ct = a_ct.add_two(b_ct, c_ct);
482 d_ct = a_ct.add_two(b_ct, c_ct);
490 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
491 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
492 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
493 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
494 EXPECT_EQ(result.
hi.
data[0], 0ULL);
495 EXPECT_EQ(result.
hi.
data[1], 0ULL);
496 EXPECT_EQ(result.
hi.
data[2], 0ULL);
497 EXPECT_EQ(result.
hi.
data[3], 0ULL);
500 EXPECT_EQ(result,
true);
506 std::vector<size_t> num_elements_to_sum = { 1, 2, 10, 20 };
508 for (
size_t num_elements : num_elements_to_sum) {
513 for (
size_t j = 0; j < num_elements; ++j) {
514 to_sum.push_back(a_ct[j]);
517 to_sum.push_back(b_ct[j]);
522 if (num_elements == 20) {
524 c_ct = fq_ct::sum(to_sum);
527 c_ct = fq_ct::sum(to_sum);
534 for (
size_t j = 0; j < num_elements; ++j) {
535 expected += a_native[j];
538 expected += b_native[j];
544 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
545 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
546 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
547 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
548 EXPECT_EQ(result.
hi.
data[0], 0ULL);
549 EXPECT_EQ(result.
hi.
data[1], 0ULL);
550 EXPECT_EQ(result.
hi.
data[2], 0ULL);
551 EXPECT_EQ(result.
hi.
data[3], 0ULL);
555 EXPECT_EQ(result,
true);
559 template <
typename CircuitOpFunc,
typename NativeOpFunc>
562 CircuitOpFunc circuit_op,
563 NativeOpFunc native_op,
565 size_t num_repetitions = 10,
566 bool need_reduced_inputs =
false,
567 bool need_reduction_after =
false)
570 for (
size_t i = 0; i < num_repetitions; ++i) {
575 if (i == num_repetitions - 1) {
576 std::string bench_name = std::string(op_name);
578 c_ct = circuit_op(a_ct, b_ct);
581 c_ct = circuit_op(a_ct, b_ct);
585 if (need_reduction_after) {
589 fq_native expected = native_op(a_native, b_native);
590 if (need_reduction_after) {
596 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
597 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
598 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
599 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
600 EXPECT_EQ(result.
hi.
data[0], 0ULL);
601 EXPECT_EQ(result.
hi.
data[1], 0ULL);
602 EXPECT_EQ(result.
hi.
data[2], 0ULL);
603 EXPECT_EQ(result.
hi.
data[3], 0ULL);
606 EXPECT_EQ(result,
true);
609#define BINARY_OP_TEST(op_name, bench_name, op_symbol, repetitions, reduced_inputs, reduction_after) \
610 static void test_##op_name(InputType a_type, InputType b_type) \
612 test_binary_operator_generic( \
615 [](const fq_ct& a, const fq_ct& b) { return a op_symbol b; }, \
616 [](const fq_native& a, const fq_native& b) { return a op_symbol b; }, \
656 template <
typename CircuitOpFunc,
typename NativeOpFunc>
659 CircuitOpFunc circuit_op,
660 NativeOpFunc native_op,
662 size_t num_repetitions = 4,
663 bool need_reduced_inputs =
false,
664 bool need_reduction_after =
false)
667 for (
size_t i = 0; i < num_repetitions; ++i) {
671 if (i == num_repetitions - 1) {
672 std::string bench_name = std::string(op_name);
674 circuit_op(a_ct, b_ct);
677 circuit_op(a_ct, b_ct);
683 fq_native expected = native_op(a_native, b_native);
684 if (need_reduction_after) {
690 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
691 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
692 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
693 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
694 EXPECT_EQ(result.
hi.
data[0], 0ULL);
695 EXPECT_EQ(result.
hi.
data[1], 0ULL);
696 EXPECT_EQ(result.
hi.
data[2], 0ULL);
697 EXPECT_EQ(result.
hi.
data[3], 0ULL);
700 EXPECT_EQ(result,
true);
703#define ASSIGNMENT_OP_TEST(op_name, bench_name, op_symbol, repetitions, reduced_inputs, reduction_after) \
704 static void test_##op_name(InputType a_type, InputType b_type) \
706 test_assign_operator_generic( \
709 [](fq_ct& a, const fq_ct& b) { a op_symbol## = b; }, \
710 [](const fq_native& a, const fq_native& b) { return a op_symbol b; }, \
726 size_t num_repetitions = 4;
727 for (
size_t i = 0; i < num_repetitions; ++i) {
733 if (i == num_repetitions - 1) {
735 d_ct = a_ct.madd(b_ct, { c_ct });
738 d_ct = a_ct.madd(b_ct, { c_ct });
741 fq_native expected = (a_native * b_native) + c_native;
745 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
746 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
747 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
748 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
749 EXPECT_EQ(result.
hi.
data[0], 0ULL);
750 EXPECT_EQ(result.
hi.
data[1], 0ULL);
751 EXPECT_EQ(result.
hi.
data[2], 0ULL);
752 EXPECT_EQ(result.
hi.
data[3], 0ULL);
755 EXPECT_EQ(result,
true);
761 size_t num_repetitions = 4;
762 for (
size_t i = 0; i < num_repetitions; ++i) {
767 if (i == num_repetitions - 1) {
769 c_ct = a_ct.sqradd({ b_ct });
772 c_ct = a_ct.sqradd({ b_ct });
776 fq_native expected = (a_native.sqr()) + b_native;
780 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
781 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
782 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
783 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
784 EXPECT_EQ(result.
hi.
data[0], 0ULL);
785 EXPECT_EQ(result.
hi.
data[1], 0ULL);
786 EXPECT_EQ(result.
hi.
data[2], 0ULL);
787 EXPECT_EQ(result.
hi.
data[3], 0ULL);
790 EXPECT_EQ(result,
true);
796 size_t num_repetitions = 1;
797 const size_t number_of_madds = 16;
798 for (
size_t i = 0; i < num_repetitions; ++i) {
800 auto [mul_left_native, mul_left_ct] =
803 &
builder, right_type, number_of_madds);
805 &
builder, to_add_type, number_of_madds);
813 mul_right_native[number_of_madds - 1] = extra_right_native;
814 mul_left_native[number_of_madds - 1] = extra_left_native;
815 to_add_native[number_of_madds - 1] = extra_to_add_native;
816 mul_left_ct[number_of_madds - 1] = extra_left_ct;
817 mul_right_ct[number_of_madds - 1] = extra_right_ct;
818 to_add_ct[number_of_madds - 1] = extra_to_add_ct;
822 if (i == num_repetitions - 1) {
824 f_ct = fq_ct::mult_madd(mul_left_ct, mul_right_ct, to_add_ct);
827 f_ct = fq_ct::mult_madd(mul_left_ct, mul_right_ct, to_add_ct);
832 for (
size_t j = 0; j < number_of_madds; j++) {
833 expected += mul_left_native[j] * mul_right_native[j];
834 expected += to_add_native[j];
839 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
840 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
841 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
842 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
843 EXPECT_EQ(result.
hi.
data[0], 0ULL);
844 EXPECT_EQ(result.
hi.
data[1], 0ULL);
845 EXPECT_EQ(result.
hi.
data[2], 0ULL);
846 EXPECT_EQ(result.
hi.
data[3], 0ULL);
849 info(
"Builder failed with error: ",
builder.err());
852 EXPECT_EQ(result,
true);
858 size_t num_repetitions = 1;
859 for (
size_t i = 0; i < num_repetitions; ++i) {
867 if (i == num_repetitions - 1) {
869 f_ct = fq_ct::dual_madd(a_ct, b_ct, c_ct, d_ct, { e_ct });
872 f_ct = fq_ct::dual_madd(a_ct, b_ct, c_ct, d_ct, { e_ct });
875 fq_native expected = (a_native * b_native) + (c_native * d_native) + e_native;
879 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
880 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
881 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
882 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
883 EXPECT_EQ(result.
hi.
data[0], 0ULL);
884 EXPECT_EQ(result.
hi.
data[1], 0ULL);
885 EXPECT_EQ(result.
hi.
data[2], 0ULL);
886 EXPECT_EQ(result.
hi.
data[3], 0ULL);
889 info(
"Builder failed with error: ",
builder.err());
892 EXPECT_EQ(result,
true);
898 size_t num_repetitions = 10;
899 for (
size_t i = 0; i < num_repetitions; ++i) {
905 if (i == num_repetitions - 1) {
907 c_ct = a_ct.div_without_denominator_check(b_ct);
910 c_ct = a_ct.div_without_denominator_check(b_ct);
913 fq_native expected = (a_native / b_native);
918 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
919 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
920 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
921 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
922 EXPECT_EQ(result.
hi.
data[0], 0ULL);
923 EXPECT_EQ(result.
hi.
data[1], 0ULL);
924 EXPECT_EQ(result.
hi.
data[2], 0ULL);
925 EXPECT_EQ(result.
hi.
data[3], 0ULL);
928 EXPECT_EQ(result,
true);
934 size_t num_repetitions = 1;
935 for (
size_t i = 0; i < num_repetitions; ++i) {
942 fq_ct e = (a_ct + b_ct) / (c_ct + d_ct);
944 fq_native expected = (a_native + b_native) / (c_native + d_native);
949 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
950 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
951 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
952 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
953 EXPECT_EQ(result.
hi.
data[0], 0ULL);
954 EXPECT_EQ(result.
hi.
data[1], 0ULL);
955 EXPECT_EQ(result.
hi.
data[2], 0ULL);
956 EXPECT_EQ(result.
hi.
data[3], 0ULL);
959 EXPECT_EQ(result,
true);
965 size_t num_repetitions = 10;
966 for (
size_t i = 0; i < num_repetitions; ++i) {
973 fq_ct e = (a_ct + b_ct) * (c_ct + d_ct);
975 fq_native expected = (a_native + b_native) * (c_native + d_native);
979 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
980 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
981 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
982 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
983 EXPECT_EQ(result.
hi.
data[0], 0ULL);
984 EXPECT_EQ(result.
hi.
data[1], 0ULL);
985 EXPECT_EQ(result.
hi.
data[2], 0ULL);
986 EXPECT_EQ(result.
hi.
data[3], 0ULL);
989 EXPECT_EQ(result,
true);
995 size_t num_repetitions = 10;
996 for (
size_t i = 0; i < num_repetitions; ++i) {
1002 fq_ct e = (a_ct - b_ct) * (c_ct - d_ct);
1004 fq_native expected = (a_native - b_native) * (c_native - d_native);
1009 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
1010 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
1011 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
1012 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
1013 EXPECT_EQ(result.
hi.
data[0], 0ULL);
1014 EXPECT_EQ(result.
hi.
data[1], 0ULL);
1015 EXPECT_EQ(result.
hi.
data[2], 0ULL);
1016 EXPECT_EQ(result.
hi.
data[3], 0ULL);
1019 EXPECT_EQ(result,
true);
1024 size_t num_repetitions = 8;
1025 for (
size_t i = 0; i < num_repetitions; ++i) {
1036 if (i == num_repetitions - 1) {
1038 result_ct = fq_ct::msub_div(
1039 { mul_l_ct }, { mul_r1_ct - mul_r2_ct }, divisor1_ct - divisor2_ct, { to_sub1_ct, to_sub2_ct });
1042 result_ct = fq_ct::msub_div(
1043 { mul_l_ct }, { mul_r1_ct - mul_r2_ct }, divisor1_ct - divisor2_ct, { to_sub1_ct, to_sub2_ct });
1046 fq_native expected = (-(mul_l * (mul_r1 - mul_r2) + to_sub1 + to_sub2)) / (divisor1 - divisor2);
1047 EXPECT_EQ(result_ct.get_value().lo,
uint256_t(expected));
1048 EXPECT_EQ(result_ct.get_value().hi,
uint256_t(0));
1051 EXPECT_EQ(result,
true);
1058 size_t num_repetitions = 1;
1059 for (
size_t i = 0; i < num_repetitions; ++i) {
1071 fq_ct c = fq_ct::conditional_assign(predicate_a, a_ct, b_ct);
1072 fq_ct d = fq_ct::conditional_assign(!predicate_a, a_ct, b_ct);
1084 EXPECT_EQ(result_c, a_native);
1085 EXPECT_EQ(result_d, b_native);
1086 EXPECT_EQ(result_e,
fq_native(a_native + b_native));
1089 EXPECT_EQ(result,
true);
1095 size_t num_repetitions = 1;
1096 for (
size_t i = 0; i < num_repetitions; ++i) {
1108 fq_ct c = a_ct.conditional_select(b_ct, predicate_a);
1109 fq_ct d = a_ct.conditional_select(b_ct, !predicate_a);
1121 EXPECT_EQ(result_c, b_native);
1122 EXPECT_EQ(result_d, a_native);
1123 EXPECT_EQ(result_e,
fq_native(a_native + b_native));
1126 EXPECT_EQ(result,
true);
1132 size_t num_repetitions = 1;
1133 for (
size_t i = 0; i < num_repetitions; ++i) {
1144 fq_ct c = a_ct.conditional_negate(predicate_a);
1145 fq_ct d = a_ct.conditional_negate(!predicate_a);
1162 EXPECT_EQ(result_c, expected_c);
1163 EXPECT_EQ(result_d, expected_d);
1167 EXPECT_EQ(result,
true);
1173 size_t num_repetitions = 1;
1174 for (
size_t i = 0; i < num_repetitions; ++i) {
1192 uint64_t before =
builder.get_num_finalized_gates_inefficient();
1193 fq_ct lambda = (y2 - y1) / (x2 - x1);
1194 fq_ct x3 = lambda.sqr() - (x2 + x1);
1195 fq_ct y3 = (x1 - x3) * lambda - y1;
1196 uint64_t after =
builder.get_num_finalized_gates_inefficient();
1201 fq expected_x = P3.
x;
1202 fq expected_y = P3.
y;
1205 uint512_t result_x = x3.get_value() % fq_ct::modulus_u512;
1206 uint512_t result_y = y3.get_value() % fq_ct::modulus_u512;
1207 EXPECT_EQ(result_x.
lo.
data[0], expected_x.
data[0]);
1208 EXPECT_EQ(result_x.
lo.
data[1], expected_x.
data[1]);
1209 EXPECT_EQ(result_x.
lo.
data[2], expected_x.
data[2]);
1210 EXPECT_EQ(result_x.
lo.
data[3], expected_x.
data[3]);
1211 EXPECT_EQ(result_y.
lo.
data[0], expected_y.
data[0]);
1212 EXPECT_EQ(result_y.
lo.
data[1], expected_y.
data[1]);
1213 EXPECT_EQ(result_y.
lo.
data[2], expected_y.
data[2]);
1214 EXPECT_EQ(result_y.
lo.
data[3], expected_y.
data[3]);
1217 EXPECT_EQ(result,
true);
1223 size_t num_repetitions = 10;
1224 for (
size_t i = 0; i < num_repetitions; ++i) {
1230 for (
size_t i = 0; i < 16; ++i) {
1231 c_ct = b_ct * b_ct + c_ct;
1232 expected = b_native * b_native + expected;
1238 EXPECT_EQ(result, expected);
1239 EXPECT_EQ(c_ct.get_value().get_msb() < (fq_ct::modulus.get_msb() + 1),
true);
1242 EXPECT_EQ(result,
true);
1248 size_t num_repetitions = 10;
1249 for (
size_t i = 0; i < num_repetitions; ++i) {
1256 bool_ct equality_with_self = (a_ct == another_a_ct);
1257 EXPECT_EQ(equality_with_self.
get_value(),
true);
1260 bool expected = (a_native == b_native);
1261 bool_ct result = (a_ct == b_ct);
1262 EXPECT_EQ(result.
get_value(), expected);
1265 EXPECT_EQ(result,
true);
1271 size_t num_repetitions = 10;
1272 for (
size_t i = 0; i < num_repetitions; ++i) {
1284 for (
size_t i = 0; i < 16; ++i) {
1285 c_ct = b_ct * b_ct + c_ct;
1286 expected = b_native * b_native + expected;
1291 c_ct.assert_is_in_field();
1294 d_ct.assert_is_in_field();
1296 uint256_t result = (c_ct.get_value().lo);
1298 EXPECT_EQ(c_ct.get_value().get_msb() < (fq_ct::modulus.get_msb() + 1),
true);
1301 EXPECT_EQ(result,
true);
1307 size_t num_repetitions = 1000;
1308 fq_ct c_ct = fq_ct::zero();
1310 for (
size_t i = 0; i < num_repetitions; ++i) {
1315 for (
size_t i = 0; i < 16; ++i) {
1316 c_ct += a_ct * b_ct;
1317 expected += a_native * b_native;
1321 if (c_ct.get_value() >= fq_ct::modulus) {
1327 c_ct.assert_is_in_field();
1331 uint256_t result_val = c_ct.get_value().lo;
1332 EXPECT_EQ(result_val,
uint256_t(expected));
1335 EXPECT_EQ(result,
false);
1341 size_t num_repetitions = 10;
1342 constexpr size_t num_bits = 200;
1344 for (
size_t i = 0; i < num_repetitions; ++i) {
1356 a_ct.assert_less_than(bit_mask + 1);
1357 b_ct.assert_less_than(bit_mask + 1);
1358 EXPECT_EQ(a_ct.get_value().get_msb() < num_bits,
true);
1359 EXPECT_EQ(b_ct.get_value().get_msb() < num_bits,
true);
1362 EXPECT_EQ(result,
true);
1368 constexpr size_t num_bits = 200;
1371 size_t num_repetitions = 1000;
1372 fq_ct c_ct = fq_ct::zero();
1374 for (
size_t i = 0; i < num_repetitions; ++i) {
1386 for (
size_t i = 0; i < 16; ++i) {
1387 c_ct += a_ct * b_ct;
1392 if (c_ct.get_value().get_msb() >= num_bits) {
1398 c_ct.assert_less_than(bit_mask + 1);
1402 uint256_t result_val = c_ct.get_value().lo;
1403 EXPECT_EQ(result_val,
uint256_t(expected));
1406 EXPECT_EQ(result,
false);
1412 size_t num_repetitions = 10;
1413 for (
size_t i = 0; i < num_repetitions; ++i) {
1422 for (
size_t i = 0; i < 16; ++i) {
1423 c_ct = b_ct * b_ct + c_ct;
1424 expected = b_native * b_native + expected;
1429 if (i == num_repetitions - 1) {
1431 c_ct.reduce_mod_target_modulus();
1434 c_ct.reduce_mod_target_modulus();
1437 uint256_t result = (c_ct.get_value().lo);
1439 EXPECT_EQ(c_ct.get_value() < fq_ct::modulus,
true);
1442 EXPECT_EQ(result,
true);
1448 size_t num_repetitions = 10;
1449 for (
size_t i = 0; i < num_repetitions; ++i) {
1454 std::vector<uint8_t> input_a(
sizeof(
fq_native));
1456 std::vector<uint8_t> input_b(
sizeof(
fq_native));
1462 fq_ct a_ct(input_arr_a);
1463 fq_ct b_ct(input_arr_b);
1465 fq_ct c_ct = a_ct * b_ct;
1467 fq_native expected = a_native * b_native;
1468 uint256_t result = (c_ct.get_value().lo);
1472 EXPECT_EQ(result,
true);
1480 uint256_t(0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0x3fffffffffffffff);
1490 for (
auto i = 0; i < 8; i++) {
1504 auto d = a2.sqradd({});
1507 auto e = a3.madd(a3, {});
1510 auto f = fq_ct::mult_madd({ a4 }, { a4 }, {},
false);
1514 EXPECT_EQ(result,
true);
1533 fq_ct ret = fq_ct::div_check_denominator_nonzero({}, a_ct);
1534 EXPECT_NE(ret.get_context(),
nullptr);
1553 size_t num_repetitions = 10;
1554 for (
size_t i = 0; i < num_repetitions; ++i) {
1563 fq_ct t0 = a_ct + a_ct;
1564 fq_ct t1 = a_ct * two_ct;
1566 t0.assert_equal(t1);
1567 t0.assert_is_not_equal(c_ct);
1568 t0.assert_is_not_equal(d_ct);
1575 EXPECT_EQ(result,
true);
1595 zero_ct.assert_zero_if(predicate);
1598 EXPECT_EQ(result,
true);
1607 bool expect_circuit_check_pass)
1627 nonzero_ct.assert_zero_if(predicate);
1630 EXPECT_EQ(result, expect_circuit_check_pass);
1643 fq_ct zero_ct = a_ct - b_ct;
1646 zero_ct.self_reduce();
1652 zero_ct.assert_zero_if(predicate);
1655 EXPECT_EQ(result,
true);
1665 exponent_val |=
static_cast<uint32_t
>(1) << 31;
1667 fq_ct base_witness_ct = fq_ct::from_witness(&
builder,
typename fq_ct::native(base_val));
1669 for (
size_t i = 0; i <= 32; i += 4) {
1670 uint32_t current_exponent_val = exponent_val >> i;
1671 fq_native expected = base_val.
pow(current_exponent_val);
1674 fq_ct result_constant_base = base_constant.
pow(current_exponent_val);
1675 EXPECT_EQ(
fq_native(result_constant_base.get_value()), expected);
1678 fq_ct result_witness_base = base_witness_ct.pow(current_exponent_val);
1679 EXPECT_EQ(
fq_native(result_witness_base.get_value()), expected);
1683 EXPECT_EQ(check_result,
true);
1692 uint32_t current_exponent_val = 1;
1694 fq_ct base_witness_ct = fq_ct::from_witness(&
builder,
typename fq_ct::native(base_val));
1695 fq_native expected = base_val.
pow(current_exponent_val);
1698 fq_ct result_constant_base = base_constant_ct.
pow(current_exponent_val);
1699 EXPECT_EQ(
fq_native(result_constant_base.get_value()), expected);
1702 fq_ct result_witness_base = base_witness_ct.pow(current_exponent_val);
1703 EXPECT_EQ(
fq_native(result_witness_base.get_value()), expected);
1706 EXPECT_EQ(check_result,
true);
1712 size_t num_repetitions = 10;
1713 constexpr size_t num_bits = 200;
1715 for (
size_t i = 0; i < num_repetitions; ++i) {
1729 EXPECT_EQ(a_ct.get_value().get_msb() < num_bits,
true);
1730 EXPECT_EQ(b_ct.get_value().get_msb() < num_bits,
true);
1753 EXPECT_EQ(result,
true);
1761 constexpr size_t num_bits = 200;
1770 EXPECT_EQ(result,
false);
1775 constexpr size_t num_bits = 200;
1786 EXPECT_EQ(result,
false);
1807 EXPECT_EQ(result,
false);
1826 auto [q_native_1024, r_native_1024] = native_sum.
divmod(
uint1024_t(fq_ct::modulus));
1829 fq_ct q_ct = fq_ct::create_from_u512_as_witness(&
builder, q_native_512,
true);
1830 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_512,
true);
1840 fq_ct modified_c_ct = fq_ct::create_from_u512_as_witness(&
builder, modified_c_native,
true);
1841 fq_ct modified_r_ct = fq_ct::create_from_u512_as_witness(&
builder, modified_r_native,
true);
1845 a_ct, b_ct, { modified_c_ct }, q_ct, { modified_r_ct });
1848 fq_native expected_lhs = a_native * b_native + c_native;
1850 EXPECT_EQ(expected_lhs, expected_rhs);
1854 uint1024_t rhs_1024 = q_native_512 * fq_ct::modulus + r_native_512;
1855 auto [quotient_lhs, remainder_lhs] = lhs_1024.
divmod(fq_ct::binary_basis.modulus);
1856 auto [quotient_rhs, remainder_rhs] = rhs_1024.
divmod(fq_ct::binary_basis.modulus);
1857 EXPECT_EQ(remainder_lhs, remainder_rhs);
1860 fr expected_lhs_fr =
fr(a_native) *
fr(b_native) +
fr(c_native);
1861 fr expected_rhs_fr =
fr(q_native_512) *
fr(fq_ct::modulus) +
fr(r_native_512);
1862 EXPECT_EQ(expected_lhs_fr, expected_rhs_fr);
1866 EXPECT_EQ(result,
true);
1884 auto [q_native_uint512_t, r_native_uint512_t] = native_sum.
divmod(
uint512_t(fq_ct::modulus));
1885 fq_ct q_ct = fq_ct::create_from_u512_as_witness(
1887 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_uint512_t,
true);
1894 EXPECT_EQ(result,
false);
1895 EXPECT_EQ(
builder.err(),
"bigfield: prime limb identity failed");
1905 size_t num_terms = 3;
1911 for (
size_t i = 0; i < num_terms; ++i) {
1914 a_natives.push_back(a_native);
1915 b_natives.push_back(b_native);
1916 a_cts.push_back(a_ct);
1917 b_cts.push_back(b_ct);
1924 for (
size_t i = 0; i < num_terms; ++i) {
1927 auto [q_native_1024, r_native_1024] = native_sum.
divmod(
uint512_t(fq_ct::modulus));
1930 fq_ct q_ct = fq_ct::create_from_u512_as_witness(&
builder, q_native_512,
true);
1931 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_512,
true);
1938 for (
size_t i = 0; i < num_terms; ++i) {
1942 EXPECT_EQ(expected_lhs, expected_rhs);
1946 for (
size_t i = 0; i < num_terms; ++i) {
1949 uint1024_t rhs_1024 = q_native_512 * fq_ct::modulus + r_native_512;
1950 auto [quotient_lhs, remainder_lhs] = lhs_1024.
divmod(fq_ct::binary_basis.modulus);
1951 auto [quotient_rhs, remainder_rhs] = rhs_1024.
divmod(fq_ct::binary_basis.modulus);
1952 EXPECT_EQ(remainder_lhs, remainder_rhs);
1955 fr expected_lhs_fr =
fr(c_native);
1956 for (
size_t i = 0; i < num_terms; ++i) {
1957 expected_lhs_fr +=
fr(a_natives[i]) *
fr(b_natives[i]);
1959 fr expected_rhs_fr =
fr(q_native_512) *
fr(fq_ct::modulus) +
fr(r_native_512);
1960 EXPECT_EQ(expected_lhs_fr, expected_rhs_fr);
1964 EXPECT_EQ(result,
true);
1974 size_t num_terms = 3;
1980 for (
size_t i = 0; i < num_terms; ++i) {
1983 a_natives.push_back(a_native);
1984 b_natives.push_back(b_native);
1985 a_cts.push_back(a_ct);
1986 b_cts.push_back(b_ct);
1993 for (
size_t i = 0; i < num_terms; ++i) {
1996 auto [q_native_1024, r_native_1024] = native_sum.
divmod(
uint1024_t(fq_ct::modulus));
1997 fq_ct q_ct = fq_ct::create_from_u512_as_witness(
1999 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_1024.lo,
true);
2006 EXPECT_EQ(result,
false);
2007 EXPECT_EQ(
builder.err(),
"bigfield: prime limb identity failed");
2016 fq_ct z(zero + two_to_68, zero);
2019 for (
auto zi : z.binary_basis_limbs) {
2020 EXPECT_LE(
uint256_t(zi.element.get_value()), zi.maximum_value);
2028 fq_ct constant_one(1);
2029 fq_ct::msub_div({ witness_one }, { witness_one }, constant_one, { witness_one },
true);
2031 EXPECT_EQ(result,
true);
2039 fq_ct w0 = fq_ct::from_witness(&
builder,
typename fq_ct::native(1));
2040 w0 = w0.conditional_negate(bool_t(&
builder,
true));
2041 w0 = w0.conditional_negate(bool_t(&
builder,
false));
2042 w0 = w0.conditional_negate(bool_t(&
builder,
true));
2043 w0 = w0.conditional_negate(bool_t(&
builder,
true));
2044 fq_ct w4 = w0.conditional_negate(bool_t(&
builder,
false));
2045 w4 = w4.conditional_negate(bool_t(&
builder,
true));
2046 w4 = w4.conditional_negate(bool_t(&
builder,
true));
2058 numerator.binary_basis_limbs[0].maximum_value = 0;
2059 numerator.binary_basis_limbs[1].maximum_value =
uint256_t(1) << 67;
2060 numerator.binary_basis_limbs[2].maximum_value = 0;
2061 numerator.binary_basis_limbs[3].maximum_value = 0;
2063 for (
size_t i = 0; i < 9; i++) {
2064 numerator = numerator + numerator;
2067 fq_ct result = numerator / denominator;
2075 uint256_t dlimb0_value =
uint256_t(
"0x00000000000000000000000000000000000000000000000bef7fa109038857fc");
2076 uint256_t dlimb0_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000fffffffffffffffff");
2077 uint256_t dlimb1_value =
uint256_t(
"0x0000000000000000000000000000000000000000000000056f10535779f56339");
2078 uint256_t dlimb1_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000fffffffffffffffff");
2079 uint256_t dlimb2_value =
uint256_t(
"0x00000000000000000000000000000000000000000000000c741f60a1ec4e114e");
2080 uint256_t dlimb2_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000fffffffffffffffff");
2081 uint256_t dlimb3_value =
uint256_t(
"0x000000000000000000000000000000000000000000000000000286b3cd344d8b");
2082 uint256_t dlimb3_max =
uint256_t(
"0x0000000000000000000000000000000000000000000000000003ffffffffffff");
2083 uint256_t dlimb_prime =
uint256_t(
"0x286b3cd344d8bc741f60a1ec4e114e56f10535779f56339bef7fa109038857fc");
2085 uint256_t nlimb0_value =
uint256_t(
"0x00000000000000000000000000000000000000000000080a84d9bea2b012417c");
2086 uint256_t nlimb0_max =
uint256_t(
"0x000000000000000000000000000000000000000000000ff7c7469df4081b61fc");
2087 uint256_t nlimb1_value =
uint256_t(
"0x00000000000000000000000000000000000000000000080f50ee84526e8e5ba7");
2088 uint256_t nlimb1_max =
uint256_t(
"0x000000000000000000000000000000000000000000000ffef965c67ba5d5893c");
2089 uint256_t nlimb2_value =
uint256_t(
"0x00000000000000000000000000000000000000000000080aba136ca8eaf6dc1b");
2090 uint256_t nlimb2_max =
uint256_t(
"0x000000000000000000000000000000000000000000000ff8171d22fd607249ea");
2091 uint256_t nlimb3_value =
uint256_t(
"0x00000000000000000000000000000000000000000000000001f0042419843c29");
2092 uint256_t nlimb3_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000003e00636264659ff");
2093 uint256_t nlimb_prime =
uint256_t(
"0x000000000000000000000000000000474da776b8ee19a56b08186bdcf01240d8");
2100 w0.binary_basis_limbs[0].maximum_value = dlimb0_max;
2101 w0.binary_basis_limbs[1].maximum_value = dlimb1_max;
2102 w0.binary_basis_limbs[2].maximum_value = dlimb2_max;
2103 w0.binary_basis_limbs[3].maximum_value = dlimb3_max;
2111 w1.binary_basis_limbs[0].maximum_value = nlimb0_max;
2112 w1.binary_basis_limbs[1].maximum_value = nlimb1_max;
2113 w1.binary_basis_limbs[2].maximum_value = nlimb2_max;
2114 w1.binary_basis_limbs[3].maximum_value = nlimb3_max;
2126 fq_ct alsozero = fq_ct::create_from_u512_as_witness(&
builder, fq_ct::modulus_u512);
2127 for (
size_t i = 0; i < 4; i++) {
2128 zero.binary_basis_limbs[i].maximum_value = zero.binary_basis_limbs[i].element.get_value();
2129 alsozero.binary_basis_limbs[i].maximum_value = alsozero.binary_basis_limbs[i].element.get_value();
2131 zero.assert_is_not_equal(alsozero);
2133 EXPECT_EQ(result,
false);
2138using CircuitTypes = testing::Types<typename bb::stdlib::bn254<UltraCircuitBuilder>::BaseField,
2148 TestFixture::test_assert_not_equal_regression();
2153 TestFixture::test_add_to_lower_limb_regression();
2157 TestFixture::test_bad_mul();
2162 TestFixture::test_division_formula_bug();
2166 TestFixture::test_basic_tag_logic();
2170 TestFixture::test_constructor_from_two_elements();
2174 TestFixture::test_unsafe_construct_from_limbs();
2178 TestFixture::test_construct_from_limbs();
2182 TestFixture::test_construct_from_limbs_fails();
2347 TestFixture::test_dual_madd();
2361 TestFixture::test_add_and_div();
2381 TestFixture::test_msub_div(
2386 TestFixture::test_msub_div(
2388 TestFixture::test_msub_div(
2390 TestFixture::test_msub_div(
2392 TestFixture::test_msub_div(
2394 TestFixture::test_msub_div(
2396 TestFixture::test_msub_div(
2427 TestFixture::test_msub_div_ctx_crash_regression();
2443 GTEST_SKIP() <<
"skipping group operations test for non-bn254 base field";
2445 TestFixture::test_group_operations();
2449 TestFixture::test_reduce();
2464 TestFixture::test_unsafe_assert_less_than();
2468 TestFixture::test_unsafe_assert_less_than_fails();
2472 TestFixture::test_unsafe_evaluate_multiply_add();
2476 TestFixture::test_unsafe_evaluate_multiply_add_fails();
2480 TestFixture::test_unsafe_multiple_multiply_add();
2484 TestFixture::test_unsafe_multiple_multiply_add_fails();
2489 TestFixture::test_assert_is_in_field_success();
2493 TestFixture::test_assert_is_in_field_fails();
2497 TestFixture::test_assert_less_than_success();
2501 TestFixture::test_assert_less_than_fails();
2505 TestFixture::test_reduce_mod_target_modulus();
2509 TestFixture::test_byte_array_constructors();
2513 TestFixture::test_quotient_completeness();
2518 TestFixture::test_conditional_select_regression();
2523 TestFixture::test_division_context();
2528 TestFixture::test_inversion();
2533 TestFixture::test_assert_equal_not_equal();
2538 TestFixture::test_pow();
2543 TestFixture::test_pow_one();
2547 TestFixture::test_nonnormalized_field_bug_regression();
2552 TestFixture::test_internal_div_regression();
2553 TestFixture::test_internal_div_regression2();
2554 TestFixture::test_internal_div_regression3();
2592 TestFixture::test_assert_zero_if_computed_zero();
2597 using Builder = TypeParam::field_ct::Builder;
2598 using fq_ct = TypeParam;
2603 auto [c_native, c_ct] = TestFixture::get_random_witness(&
builder);
2607 auto is_ok = c_ct.is_less_than(fq_ct::modulus);
2611 auto is_not_ok = c_ct.is_less_than(c_native);
2615 auto is_ok_edge_case = c_ct.is_less_than(c_native + 1);
2619 std::vector<uint8_t> c_bytes(32, 0xff);
2621 fq_ct reconstructed_from_bytes(c_byte_array);
2622 auto is_not_ok_larger_than_modulus = reconstructed_from_bytes.is_less_than(fq_ct::modulus);
2626 EXPECT_FALSE(
builder.failed());
#define BB_ASSERT_LT(left, right,...)
#define BINARY_OP_TEST(op_name, bench_name, op_symbol, repetitions, reduced_inputs, reduction_after)
typename extract_builder< BigField >::type builder_t
typename extract_fq_params< BigField >::type params_t
constexpr InputType operator!(InputType type)
#define ASSIGNMENT_OP_TEST(op_name, bench_name, op_symbol, repetitions, reduced_inputs, reduction_after)
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
virtual uint8_t get_random_uint8()=0
virtual uint32_t get_random_uint32()=0
virtual uint256_t get_random_uint256()=0
constexpr uint256_t slice(uint64_t start, uint64_t end) const
std::pair< uintx, uintx > divmod(const uintx &b) const
static void unsafe_evaluate_multiple_multiply_add(const std::vector< bigfield > &input_left, const std::vector< bigfield > &input_right, const std::vector< bigfield > &to_add, const bigfield &input_quotient, const std::vector< bigfield > &input_remainders)
static void unsafe_evaluate_multiply_add(const bigfield &input_left, const bigfield &input_to_mul, const std::vector< bigfield > &to_add, const bigfield &input_quotient, const std::vector< bigfield > &input_remainders)
static void unsafe_assert_less_than(const bigfield &input, const uint256_t &upper_limit)
Implements boolean logic in-circuit.
Represents a dynamic array of bytes in-circuit.
void set_origin_tag(bb::OriginTag tag)
static witness_t create_constant_witness(Builder *parent_context, const bb::fr &in)
typename bb::stdlib::bn254< Builder >::ScalarField fr_ct
static void test_nonnormalized_field_bug_regression()
static void test_internal_div_regression3()
static void test_conditional_assign(InputType a_type, InputType b_type, InputType predicate_type)
static void test_reduce_mod_target_modulus()
static void test_group_operations()
static void test_assert_zero_if_zero_value(bool predicate_value, InputType predicate_type)
static void test_sum(InputType a_type, bool mixed_inputs=false)
static void test_assert_is_in_field_fails()
static void test_construct_from_limbs()
static void test_bad_mul()
static void test_add_to_lower_limb_regression()
static void test_assert_less_than_fails()
static void test_equality_operator(InputType a_type, InputType b_type)
static void test_conditional_select(InputType a_type, InputType b_type, InputType predicate_type)
static void test_add_and_mul(InputType summand_type)
static std::pair< std::vector< fq_native >, std::vector< fq_ct > > get_random_witnesses(Builder *builder, size_t num, bool reduce_input=false)
static void test_unsafe_multiple_multiply_add()
static void test_quotient_completeness()
static void test_unsafe_evaluate_multiply_add()
static void test_msub_div_ctx_crash_regression()
static void test_unsafe_multiple_multiply_add_fails()
static void test_constructor_from_two_elements()
static void test_reduce()
static void test_assert_less_than_success()
static std::pair< fq_native, fq_ct > get_random_constant(Builder *builder, bool reduce_input=false)
static void test_sqradd(InputType a_type, InputType b_type)
builder_t< BigField > Builder
static void test_assert_is_in_field_success()
static void test_add_two(InputType a_type, InputType b_type, InputType c_type)
static void test_inversion()
static void test_add_and_div()
static void test_byte_array_constructors()
static void test_negate(InputType a_type)
static void test_msub_div(InputType multiplicand_type, InputType to_sub_type, InputType divisor_type)
static void test_binary_operator_generic(InputType a_type, InputType b_type, CircuitOpFunc circuit_op, NativeOpFunc native_op, const char *op_name, size_t num_repetitions=10, bool need_reduced_inputs=false, bool need_reduction_after=false)
static std::pair< fq_native, fq_ct > get_random_element(Builder *builder, bool reduce_input=false)
static std::pair< fq_native, fq_ct > get_random_witness(Builder *builder, bool reduce_input=false)
static std::pair< std::vector< fq_native >, std::vector< fq_ct > > get_random_elements(Builder *builder, InputType type, size_t num, bool reduce_input=false)
static void test_sqr(InputType a_type)
static std::pair< fq_native, fq_ct > get_random_element(Builder *builder, InputType type, bool reduce_input=false)
static void test_div_without_denominator_check(InputType a_type, InputType b_type)
static void test_sub_and_mul(InputType subtrahend_type)
static void test_assert_not_equal_regression()
static void test_internal_div_regression2()
static void test_basic_tag_logic()
static void test_madd(InputType a_type, InputType b_type, InputType c_type)
static void test_conditional_negate(InputType a_type, InputType predicate_type)
static void test_unsafe_construct_from_limbs()
stdlib::bool_t< Builder > bool_ct
static void test_assert_zero_if_nonzero_value(bool predicate_value, InputType value_type, InputType predicate_type, bool expect_circuit_check_pass)
static std::pair< std::vector< fq_native >, std::vector< fq_ct > > get_random_constants(Builder *builder, size_t num, bool reduce_input=false)
static void test_assign_operator_generic(InputType a_type, InputType b_type, CircuitOpFunc circuit_op, NativeOpFunc native_op, const char *op_name, size_t num_repetitions=4, bool need_reduced_inputs=false, bool need_reduction_after=false)
static void test_internal_div_regression()
static void test_assert_zero_if_computed_zero()
static void test_dual_madd()
static void test_mult_madd(InputType left_type, InputType right_type, InputType to_add_type, bool edge_case=false)
stdlib::witness_t< Builder > witness_ct
static void test_unsafe_assert_less_than_fails()
static void test_unsafe_assert_less_than()
static void test_construct_from_limbs_fails()
static void test_assert_equal_not_equal()
static void test_unsafe_evaluate_multiply_add_fails()
static void test_conditional_select_regression()
static void test_division_context()
static void test_division_formula_bug()
bb::field< params_t< BigField > > fq_native
static void test_pow_one()
#define BENCH_GATE_COUNT_END(builder, op_name)
#define BENCH_GATE_COUNT_START(builder, op_name)
ECCVMCircuitBuilder Builder
stdlib::byte_array< Builder > byte_array_ct
crypto::Poseidon2Bn254ScalarFieldParams Params
uintx< uint256_t > uint512_t
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
uintx< uint512_t > uint1024_t
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
@ SUB
Subtract two field elements.
@ DIV
Divide two field elements.
@ MUL
Multiply two field elements.
@ ADD_ASSIGN
Add-assign operation.
@ DIV_ASSIGN
Divide-assign operation.
@ MUL_ASSIGN
Multiply-assign operation.
@ ADD
Add two field elements.
@ SUB_ASSIGN
Subtract-assign operation.
field< Bn254FrParams > fr
C slice(C const &container, size_t start)
Inner sum(Cont< Inner, Args... > const &in)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
#define STANDARD_TESTING_TAGS
testing::Types< bb::MegaCircuitBuilder, bb::UltraCircuitBuilder > CircuitTypes
General class for prime fields see Prime field documentation["field documentation"] for general imple...
BB_INLINE constexpr field from_montgomery_form_reduced() const noexcept
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 field sqr() const noexcept
static void serialize_to_buffer(const field &value, uint8_t *buffer)
BB_INLINE constexpr field reduce_once() const noexcept
static constexpr field zero()