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;
212 a_ct.binary_basis_limbs[0].element.set_origin_tag(submitted_value_origin_tag);
213 a_ct.binary_basis_limbs[1].element.set_origin_tag(challenge_origin_tag);
214 a_ct.prime_basis_limb.set_origin_tag(next_challenge_tag);
216 EXPECT_EQ(a_ct.get_origin_tag(), first_second_third_merged_tag);
218 a_ct.set_origin_tag(clear_tag);
219 EXPECT_EQ(a_ct.binary_basis_limbs[0].element.get_origin_tag(), clear_tag);
220 EXPECT_EQ(a_ct.binary_basis_limbs[1].element.get_origin_tag(), clear_tag);
221 EXPECT_EQ(a_ct.binary_basis_limbs[2].element.get_origin_tag(), clear_tag);
222 EXPECT_EQ(a_ct.binary_basis_limbs[3].element.get_origin_tag(), clear_tag);
223 EXPECT_EQ(a_ct.prime_basis_limb.get_origin_tag(), clear_tag);
226 a_ct.set_origin_tag(instant_death_tag);
227 EXPECT_THROW(a_ct + a_ct, std::runtime_error);
237 fq_ct elt_witness_ct =
247 4 * fq_ct::NUM_LIMB_BITS - 3);
251 4 * fq_ct::NUM_LIMB_BITS - 3);
254 EXPECT_EQ(result,
true);
272 fq_ct result = fq_ct::unsafe_construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_4_ct);
274 fr expected_prime_limb = limb_1_native;
275 expected_prime_limb += (limb_2_native * fq_ct::shift_1);
276 expected_prime_limb += (limb_3_native * fq_ct::shift_2);
277 expected_prime_limb += (limb_4_native * fq_ct::shift_3);
278 EXPECT_EQ(expected_prime_limb, result.prime_basis_limb.get_value());
281 fq_ct result_1 = fq_ct::unsafe_construct_from_limbs(
283 EXPECT_EQ(result.binary_basis_limbs[0].element.get_value(), result_1.binary_basis_limbs[0].element.get_value());
286 EXPECT_EQ(result_check,
true);
304 fq_ct result = fq_ct::construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_4_ct);
306 fr expected_prime_limb = limb_1_native;
307 expected_prime_limb += (limb_2_native * fq_ct::shift_1);
308 expected_prime_limb += (limb_3_native * fq_ct::shift_2);
309 expected_prime_limb += (limb_4_native * fq_ct::shift_3);
310 EXPECT_EQ(expected_prime_limb, result.prime_basis_limb.get_value());
313 fq_ct result_1 = fq_ct::construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_3_ct,
true);
314 EXPECT_EQ(result.binary_basis_limbs[0].element.get_value(), result_1.binary_basis_limbs[0].element.get_value());
317 EXPECT_EQ(result_check,
true);
337 fq_ct result = fq_ct::construct_from_limbs(limb_1_ct, limb_2_ct, limb_3_ct, limb_4_ct);
338 fr expected_prime_limb = limb_1_native;
339 expected_prime_limb += (limb_2_native * fq_ct::shift_1);
340 expected_prime_limb += (limb_3_native * fq_ct::shift_2);
341 expected_prime_limb += (limb_4_native * fq_ct::shift_3);
342 EXPECT_EQ(expected_prime_limb, result.prime_basis_limb.get_value());
345 EXPECT_EQ(result_check,
false);
346 EXPECT_EQ(
builder.err(),
"bigfield::construct_from_limbs: limb 0 or 1 too large: lo limb.");
352 size_t num_repetitions = 10;
353 for (
size_t i = 0; i < num_repetitions; ++i) {
358 a_ct.set_origin_tag(submitted_value_origin_tag);
359 b_ct.set_origin_tag(challenge_origin_tag);
362 if (i == num_repetitions - 1) {
364 d_ct = a_ct.add_two(b_ct, c_ct);
367 d_ct = a_ct.add_two(b_ct, c_ct);
372 EXPECT_EQ(d_ct.get_origin_tag(), first_two_merged_tag);
378 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
379 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
380 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
381 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
382 EXPECT_EQ(result.
hi.
data[0], 0ULL);
383 EXPECT_EQ(result.
hi.
data[1], 0ULL);
384 EXPECT_EQ(result.
hi.
data[2], 0ULL);
385 EXPECT_EQ(result.
hi.
data[3], 0ULL);
388 EXPECT_EQ(result,
true);
394 std::vector<size_t> num_elements_to_sum = { 1, 2, 10, 20 };
396 for (
size_t num_elements : num_elements_to_sum) {
401 for (
size_t j = 0; j < num_elements; ++j) {
402 to_sum.push_back(a_ct[j]);
403 to_sum.back().set_origin_tag(submitted_value_origin_tag);
406 to_sum.push_back(b_ct[j]);
407 to_sum.back().set_origin_tag(challenge_origin_tag);
412 if (num_elements == 20) {
414 c_ct = fq_ct::sum(to_sum);
417 c_ct = fq_ct::sum(to_sum);
424 const auto output_tag = (mixed_inputs) ? first_two_merged_tag : submitted_value_origin_tag;
425 EXPECT_EQ(c_ct.get_origin_tag(), output_tag);
428 for (
size_t j = 0; j < num_elements; ++j) {
429 expected += a_native[j];
432 expected += b_native[j];
438 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
439 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
440 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
441 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
442 EXPECT_EQ(result.
hi.
data[0], 0ULL);
443 EXPECT_EQ(result.
hi.
data[1], 0ULL);
444 EXPECT_EQ(result.
hi.
data[2], 0ULL);
445 EXPECT_EQ(result.
hi.
data[3], 0ULL);
449 EXPECT_EQ(result,
true);
453 template <
typename CircuitOpFunc,
typename NativeOpFunc>
456 CircuitOpFunc circuit_op,
457 NativeOpFunc native_op,
459 size_t num_repetitions = 10,
460 bool need_reduced_inputs =
false,
461 bool need_reduction_after =
false,
462 bool do_tags_merge =
true)
465 for (
size_t i = 0; i < num_repetitions; ++i) {
468 a_ct.set_origin_tag(submitted_value_origin_tag);
469 b_ct.set_origin_tag(challenge_origin_tag);
472 if (i == num_repetitions - 1) {
473 std::string bench_name = std::string(op_name);
475 c_ct = circuit_op(a_ct, b_ct);
478 c_ct = circuit_op(a_ct, b_ct);
482 if (need_reduction_after) {
488 EXPECT_EQ(c_ct.get_origin_tag(), first_two_merged_tag);
491 fq_native expected = native_op(a_native, b_native);
492 if (need_reduction_after) {
498 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
499 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
500 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
501 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
502 EXPECT_EQ(result.
hi.
data[0], 0ULL);
503 EXPECT_EQ(result.
hi.
data[1], 0ULL);
504 EXPECT_EQ(result.
hi.
data[2], 0ULL);
505 EXPECT_EQ(result.
hi.
data[3], 0ULL);
508 EXPECT_EQ(result,
true);
511#define BINARY_OP_TEST(op_name, bench_name, op_symbol, repetitions, reduced_inputs, reduction_after) \
512 static void test_##op_name(InputType a_type, InputType b_type) \
514 test_binary_operator_generic( \
517 [](const fq_ct& a, const fq_ct& b) { return a op_symbol b; }, \
518 [](const fq_native& a, const fq_native& b) { return a op_symbol b; }, \
560 template <
typename CircuitOpFunc,
typename NativeOpFunc>
563 CircuitOpFunc circuit_op,
564 NativeOpFunc native_op,
566 size_t num_repetitions = 4,
567 bool need_reduced_inputs =
false,
568 bool need_reduction_after =
false)
571 for (
size_t i = 0; i < num_repetitions; ++i) {
574 a_ct.set_origin_tag(submitted_value_origin_tag);
575 b_ct.set_origin_tag(challenge_origin_tag);
577 if (i == num_repetitions - 1) {
578 std::string bench_name = std::string(op_name);
580 circuit_op(a_ct, b_ct);
583 circuit_op(a_ct, b_ct);
590 EXPECT_EQ(a_ct.get_origin_tag(), first_two_merged_tag);
592 fq_native expected = native_op(a_native, b_native);
593 if (need_reduction_after) {
599 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
600 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
601 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
602 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
603 EXPECT_EQ(result.
hi.
data[0], 0ULL);
604 EXPECT_EQ(result.
hi.
data[1], 0ULL);
605 EXPECT_EQ(result.
hi.
data[2], 0ULL);
606 EXPECT_EQ(result.
hi.
data[3], 0ULL);
609 EXPECT_EQ(result,
true);
612#define ASSIGNMENT_OP_TEST(op_name, bench_name, op_symbol, repetitions, reduced_inputs, reduction_after) \
613 static void test_##op_name(InputType a_type, InputType b_type) \
615 test_assign_operator_generic( \
618 [](fq_ct& a, const fq_ct& b) { a op_symbol## = b; }, \
619 [](const fq_native& a, const fq_native& b) { return a op_symbol b; }, \
635 size_t num_repetitions = 4;
636 for (
size_t i = 0; i < num_repetitions; ++i) {
640 a_ct.set_origin_tag(challenge_origin_tag);
641 b_ct.set_origin_tag(submitted_value_origin_tag);
642 c_ct.set_origin_tag(next_challenge_tag);
645 if (i == num_repetitions - 1) {
647 d_ct = a_ct.madd(b_ct, { c_ct });
650 d_ct = a_ct.madd(b_ct, { c_ct });
654 EXPECT_EQ(d_ct.get_origin_tag(), first_second_third_merged_tag);
656 fq_native expected = (a_native * b_native) + c_native;
660 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
661 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
662 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
663 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
664 EXPECT_EQ(result.
hi.
data[0], 0ULL);
665 EXPECT_EQ(result.
hi.
data[1], 0ULL);
666 EXPECT_EQ(result.
hi.
data[2], 0ULL);
667 EXPECT_EQ(result.
hi.
data[3], 0ULL);
670 EXPECT_EQ(result,
true);
676 size_t num_repetitions = 4;
677 for (
size_t i = 0; i < num_repetitions; ++i) {
680 a_ct.set_origin_tag(challenge_origin_tag);
681 b_ct.set_origin_tag(submitted_value_origin_tag);
684 if (i == num_repetitions - 1) {
686 c_ct = a_ct.sqradd({ b_ct });
689 c_ct = a_ct.sqradd({ b_ct });
693 fq_native expected = (a_native.sqr()) + b_native;
697 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
698 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
699 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
700 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
701 EXPECT_EQ(result.
hi.
data[0], 0ULL);
702 EXPECT_EQ(result.
hi.
data[1], 0ULL);
703 EXPECT_EQ(result.
hi.
data[2], 0ULL);
704 EXPECT_EQ(result.
hi.
data[3], 0ULL);
707 EXPECT_EQ(result,
true);
713 size_t num_repetitions = 1;
714 const size_t number_of_madds = 16;
715 for (
size_t i = 0; i < num_repetitions; ++i) {
717 auto [mul_left_native, mul_left_ct] =
720 &
builder, right_type, number_of_madds);
722 &
builder, to_add_type, number_of_madds);
730 mul_right_native[number_of_madds - 1] = extra_right_native;
731 mul_left_native[number_of_madds - 1] = extra_left_native;
732 to_add_native[number_of_madds - 1] = extra_to_add_native;
733 mul_left_ct[number_of_madds - 1] = extra_left_ct;
734 mul_right_ct[number_of_madds - 1] = extra_right_ct;
735 to_add_ct[number_of_madds - 1] = extra_to_add_ct;
739 mul_left_ct[number_of_madds - 1].set_origin_tag(submitted_value_origin_tag);
740 mul_right_ct[number_of_madds - 1].set_origin_tag(challenge_origin_tag);
741 to_add_ct[number_of_madds - 1].set_origin_tag(next_challenge_tag);
744 if (i == num_repetitions - 1) {
746 f_ct = fq_ct::mult_madd(mul_left_ct, mul_right_ct, to_add_ct);
749 f_ct = fq_ct::mult_madd(mul_left_ct, mul_right_ct, to_add_ct);
753 EXPECT_EQ(f_ct.get_origin_tag(), first_second_third_merged_tag);
757 for (
size_t j = 0; j < number_of_madds; j++) {
758 expected += mul_left_native[j] * mul_right_native[j];
759 expected += to_add_native[j];
764 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
765 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
766 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
767 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
768 EXPECT_EQ(result.
hi.
data[0], 0ULL);
769 EXPECT_EQ(result.
hi.
data[1], 0ULL);
770 EXPECT_EQ(result.
hi.
data[2], 0ULL);
771 EXPECT_EQ(result.
hi.
data[3], 0ULL);
774 info(
"Builder failed with error: ",
builder.err());
777 EXPECT_EQ(result,
true);
783 size_t num_repetitions = 1;
784 for (
size_t i = 0; i < num_repetitions; ++i) {
791 a_ct.set_origin_tag(submitted_value_origin_tag);
792 d_ct.set_origin_tag(challenge_origin_tag);
793 e_ct.set_origin_tag(next_challenge_tag);
796 if (i == num_repetitions - 1) {
798 f_ct = fq_ct::dual_madd(a_ct, b_ct, c_ct, d_ct, { e_ct });
801 f_ct = fq_ct::dual_madd(a_ct, b_ct, c_ct, d_ct, { e_ct });
805 EXPECT_EQ(f_ct.get_origin_tag(), first_second_third_merged_tag);
807 fq_native expected = (a_native * b_native) + (c_native * d_native) + e_native;
811 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
812 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
813 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
814 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
815 EXPECT_EQ(result.
hi.
data[0], 0ULL);
816 EXPECT_EQ(result.
hi.
data[1], 0ULL);
817 EXPECT_EQ(result.
hi.
data[2], 0ULL);
818 EXPECT_EQ(result.
hi.
data[3], 0ULL);
821 info(
"Builder failed with error: ",
builder.err());
824 EXPECT_EQ(result,
true);
830 size_t num_repetitions = 10;
831 for (
size_t i = 0; i < num_repetitions; ++i) {
835 a_ct.set_origin_tag(submitted_value_origin_tag);
836 b_ct.set_origin_tag(challenge_origin_tag);
839 if (i == num_repetitions - 1) {
841 c_ct = a_ct.div_without_denominator_check(b_ct);
844 c_ct = a_ct.div_without_denominator_check(b_ct);
848 EXPECT_EQ(c_ct.get_origin_tag(), first_two_merged_tag);
850 fq_native expected = (a_native / b_native);
855 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
856 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
857 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
858 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
859 EXPECT_EQ(result.
hi.
data[0], 0ULL);
860 EXPECT_EQ(result.
hi.
data[1], 0ULL);
861 EXPECT_EQ(result.
hi.
data[2], 0ULL);
862 EXPECT_EQ(result.
hi.
data[3], 0ULL);
865 EXPECT_EQ(result,
true);
871 size_t num_repetitions = 1;
872 for (
size_t i = 0; i < num_repetitions; ++i) {
878 b_ct.set_origin_tag(submitted_value_origin_tag);
879 c_ct.set_origin_tag(challenge_origin_tag);
880 d_ct.set_origin_tag(next_challenge_tag);
882 fq_ct e = (a_ct + b_ct) / (c_ct + d_ct);
883 EXPECT_EQ(e.get_origin_tag(), first_second_third_merged_tag);
885 fq_native expected = (a_native + b_native) / (c_native + d_native);
890 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
891 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
892 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
893 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
894 EXPECT_EQ(result.
hi.
data[0], 0ULL);
895 EXPECT_EQ(result.
hi.
data[1], 0ULL);
896 EXPECT_EQ(result.
hi.
data[2], 0ULL);
897 EXPECT_EQ(result.
hi.
data[3], 0ULL);
900 EXPECT_EQ(result,
true);
906 size_t num_repetitions = 10;
907 for (
size_t i = 0; i < num_repetitions; ++i) {
913 b_ct.set_origin_tag(submitted_value_origin_tag);
914 c_ct.set_origin_tag(challenge_origin_tag);
915 d_ct.set_origin_tag(next_challenge_tag);
917 fq_ct e = (a_ct + b_ct) * (c_ct + d_ct);
919 EXPECT_EQ(e.get_origin_tag(), first_second_third_merged_tag);
920 fq_native expected = (a_native + b_native) * (c_native + d_native);
924 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
925 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
926 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
927 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
928 EXPECT_EQ(result.
hi.
data[0], 0ULL);
929 EXPECT_EQ(result.
hi.
data[1], 0ULL);
930 EXPECT_EQ(result.
hi.
data[2], 0ULL);
931 EXPECT_EQ(result.
hi.
data[3], 0ULL);
934 EXPECT_EQ(result,
true);
940 size_t num_repetitions = 10;
941 for (
size_t i = 0; i < num_repetitions; ++i) {
947 b_ct.set_origin_tag(submitted_value_origin_tag);
948 c_ct.set_origin_tag(challenge_origin_tag);
949 d_ct.set_origin_tag(next_challenge_tag);
951 fq_ct e = (a_ct - b_ct) * (c_ct - d_ct);
953 EXPECT_EQ(e.get_origin_tag(), first_second_third_merged_tag);
954 fq_native expected = (a_native - b_native) * (c_native - d_native);
959 EXPECT_EQ(result.
lo.
data[0], expected.
data[0]);
960 EXPECT_EQ(result.
lo.
data[1], expected.
data[1]);
961 EXPECT_EQ(result.
lo.
data[2], expected.
data[2]);
962 EXPECT_EQ(result.
lo.
data[3], expected.
data[3]);
963 EXPECT_EQ(result.
hi.
data[0], 0ULL);
964 EXPECT_EQ(result.
hi.
data[1], 0ULL);
965 EXPECT_EQ(result.
hi.
data[2], 0ULL);
966 EXPECT_EQ(result.
hi.
data[3], 0ULL);
969 EXPECT_EQ(result,
true);
974 size_t num_repetitions = 8;
975 for (
size_t i = 0; i < num_repetitions; ++i) {
985 mul_l_ct.set_origin_tag(submitted_value_origin_tag);
986 mul_r1_ct.set_origin_tag(challenge_origin_tag);
987 divisor1_ct.set_origin_tag(next_submitted_value_origin_tag);
988 to_sub1_ct.set_origin_tag(next_challenge_tag);
991 if (i == num_repetitions - 1) {
993 result_ct = fq_ct::msub_div(
994 { mul_l_ct }, { mul_r1_ct - mul_r2_ct }, divisor1_ct - divisor2_ct, { to_sub1_ct, to_sub2_ct });
997 result_ct = fq_ct::msub_div(
998 { mul_l_ct }, { mul_r1_ct - mul_r2_ct }, divisor1_ct - divisor2_ct, { to_sub1_ct, to_sub2_ct });
1001 EXPECT_EQ(result_ct.get_origin_tag(), first_to_fourth_merged_tag);
1002 fq_native expected = (-(mul_l * (mul_r1 - mul_r2) + to_sub1 + to_sub2)) / (divisor1 - divisor2);
1003 EXPECT_EQ(result_ct.get_value().lo,
uint256_t(expected));
1004 EXPECT_EQ(result_ct.get_value().hi,
uint256_t(0));
1007 EXPECT_EQ(result,
true);
1014 size_t num_repetitions = 1;
1015 for (
size_t i = 0; i < num_repetitions; ++i) {
1019 a_ct.set_origin_tag(submitted_value_origin_tag);
1020 b_ct.set_origin_tag(challenge_origin_tag);
1030 fq_ct c = fq_ct::conditional_assign(predicate_a, a_ct, b_ct);
1031 fq_ct d = fq_ct::conditional_assign(!predicate_a, a_ct, b_ct);
1034 EXPECT_EQ(c.get_origin_tag(), first_second_third_merged_tag);
1035 EXPECT_EQ(d.get_origin_tag(), first_second_third_merged_tag);
1047 EXPECT_EQ(result_c, a_native);
1048 EXPECT_EQ(result_d, b_native);
1049 EXPECT_EQ(result_e,
fq_native(a_native + b_native));
1052 EXPECT_EQ(result,
true);
1058 size_t num_repetitions = 1;
1059 for (
size_t i = 0; i < num_repetitions; ++i) {
1063 a_ct.set_origin_tag(submitted_value_origin_tag);
1064 b_ct.set_origin_tag(challenge_origin_tag);
1074 fq_ct c = a_ct.conditional_select(b_ct, predicate_a);
1075 fq_ct d = a_ct.conditional_select(b_ct, !predicate_a);
1078 EXPECT_EQ(c.get_origin_tag(), first_second_third_merged_tag);
1079 EXPECT_EQ(d.get_origin_tag(), first_second_third_merged_tag);
1091 EXPECT_EQ(result_c, b_native);
1092 EXPECT_EQ(result_d, a_native);
1093 EXPECT_EQ(result_e,
fq_native(a_native + b_native));
1096 EXPECT_EQ(result,
true);
1102 size_t num_repetitions = 1;
1103 for (
size_t i = 0; i < num_repetitions; ++i) {
1106 a_ct.set_origin_tag(submitted_value_origin_tag);
1116 fq_ct c = a_ct.conditional_negate(predicate_a);
1117 fq_ct d = a_ct.conditional_negate(!predicate_a);
1120 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1121 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
1138 EXPECT_EQ(result_c, expected_c);
1139 EXPECT_EQ(result_d, expected_d);
1143 EXPECT_EQ(result,
true);
1149 size_t num_repetitions = 1;
1150 for (
size_t i = 0; i < num_repetitions; ++i) {
1168 uint64_t before =
builder.get_estimated_num_finalized_gates();
1169 fq_ct lambda = (y2 - y1) / (x2 - x1);
1170 fq_ct x3 = lambda.sqr() - (x2 + x1);
1171 fq_ct y3 = (x1 - x3) * lambda - y1;
1172 uint64_t after =
builder.get_estimated_num_finalized_gates();
1177 fq expected_x = P3.
x;
1178 fq expected_y = P3.
y;
1181 uint512_t result_x = x3.get_value() % fq_ct::modulus_u512;
1182 uint512_t result_y = y3.get_value() % fq_ct::modulus_u512;
1183 EXPECT_EQ(result_x.
lo.
data[0], expected_x.
data[0]);
1184 EXPECT_EQ(result_x.
lo.
data[1], expected_x.
data[1]);
1185 EXPECT_EQ(result_x.
lo.
data[2], expected_x.
data[2]);
1186 EXPECT_EQ(result_x.
lo.
data[3], expected_x.
data[3]);
1187 EXPECT_EQ(result_y.
lo.
data[0], expected_y.
data[0]);
1188 EXPECT_EQ(result_y.
lo.
data[1], expected_y.
data[1]);
1189 EXPECT_EQ(result_y.
lo.
data[2], expected_y.
data[2]);
1190 EXPECT_EQ(result_y.
lo.
data[3], expected_y.
data[3]);
1193 EXPECT_EQ(result,
true);
1199 size_t num_repetitions = 10;
1200 for (
size_t i = 0; i < num_repetitions; ++i) {
1206 for (
size_t i = 0; i < 16; ++i) {
1207 c_ct = b_ct * b_ct + c_ct;
1208 expected = b_native * b_native + expected;
1211 c_ct.set_origin_tag(challenge_origin_tag);
1215 EXPECT_EQ(c_ct.get_origin_tag(), challenge_origin_tag);
1218 EXPECT_EQ(result, expected);
1219 EXPECT_EQ(c_ct.get_value().get_msb() < (fq_ct::modulus.get_msb() + 1),
true);
1222 EXPECT_EQ(result,
true);
1228 size_t num_repetitions = 10;
1229 for (
size_t i = 0; i < num_repetitions; ++i) {
1236 bool_ct equality_with_self = (a_ct == another_a_ct);
1237 EXPECT_EQ(equality_with_self.
get_value(),
true);
1240 bool expected = (a_native == b_native);
1241 bool_ct result = (a_ct == b_ct);
1242 EXPECT_EQ(result.
get_value(), expected);
1245 EXPECT_EQ(result,
true);
1251 size_t num_repetitions = 10;
1252 for (
size_t i = 0; i < num_repetitions; ++i) {
1264 for (
size_t i = 0; i < 16; ++i) {
1265 c_ct = b_ct * b_ct + c_ct;
1266 expected = b_native * b_native + expected;
1269 c_ct.set_origin_tag(challenge_origin_tag);
1273 c_ct.assert_is_in_field();
1276 d_ct.set_origin_tag(challenge_origin_tag);
1277 d_ct.assert_is_in_field();
1280 EXPECT_EQ(c_ct.get_origin_tag(), challenge_origin_tag);
1281 EXPECT_EQ(d_ct.get_origin_tag(), challenge_origin_tag);
1283 uint256_t result = (c_ct.get_value().lo);
1285 EXPECT_EQ(c_ct.get_value().get_msb() < (fq_ct::modulus.get_msb() + 1),
true);
1288 EXPECT_EQ(result,
true);
1294 size_t num_repetitions = 1000;
1295 fq_ct c_ct = fq_ct::zero();
1297 for (
size_t i = 0; i < num_repetitions; ++i) {
1302 for (
size_t i = 0; i < 16; ++i) {
1303 c_ct += a_ct * b_ct;
1304 expected += a_native * b_native;
1308 if (c_ct.get_value() >= fq_ct::modulus) {
1314 c_ct.assert_is_in_field();
1318 uint256_t result_val = c_ct.get_value().lo;
1319 EXPECT_EQ(result_val,
uint256_t(expected));
1322 EXPECT_EQ(result,
false);
1328 size_t num_repetitions = 10;
1329 constexpr size_t num_bits = 200;
1331 for (
size_t i = 0; i < num_repetitions; ++i) {
1343 a_ct.assert_less_than(bit_mask + 1);
1344 b_ct.assert_less_than(bit_mask + 1);
1345 EXPECT_EQ(a_ct.get_value().get_msb() < num_bits,
true);
1346 EXPECT_EQ(b_ct.get_value().get_msb() < num_bits,
true);
1349 EXPECT_EQ(result,
true);
1355 constexpr size_t num_bits = 200;
1358 size_t num_repetitions = 1000;
1359 fq_ct c_ct = fq_ct::zero();
1361 for (
size_t i = 0; i < num_repetitions; ++i) {
1373 for (
size_t i = 0; i < 16; ++i) {
1374 c_ct += a_ct * b_ct;
1379 if (c_ct.get_value().get_msb() >= num_bits) {
1385 c_ct.assert_less_than(bit_mask + 1);
1389 uint256_t result_val = c_ct.get_value().lo;
1390 EXPECT_EQ(result_val,
uint256_t(expected));
1393 EXPECT_EQ(result,
false);
1399 size_t num_repetitions = 10;
1400 for (
size_t i = 0; i < num_repetitions; ++i) {
1409 for (
size_t i = 0; i < 16; ++i) {
1410 c_ct = b_ct * b_ct + c_ct;
1411 expected = b_native * b_native + expected;
1414 c_ct.set_origin_tag(challenge_origin_tag);
1418 if (i == num_repetitions - 1) {
1420 c_ct.reduce_mod_target_modulus();
1423 c_ct.reduce_mod_target_modulus();
1427 EXPECT_EQ(c_ct.get_origin_tag(), challenge_origin_tag);
1429 uint256_t result = (c_ct.get_value().lo);
1431 EXPECT_EQ(c_ct.get_value() < fq_ct::modulus,
true);
1434 EXPECT_EQ(result,
true);
1440 size_t num_repetitions = 10;
1441 for (
size_t i = 0; i < num_repetitions; ++i) {
1446 std::vector<uint8_t> input_a(
sizeof(
fq_native));
1448 std::vector<uint8_t> input_b(
sizeof(
fq_native));
1457 fq_ct a_ct(input_arr_a);
1458 fq_ct b_ct(input_arr_b);
1460 fq_ct c_ct = a_ct * b_ct;
1462 EXPECT_EQ(c_ct.get_origin_tag(), first_two_merged_tag);
1464 fq_native expected = a_native * b_native;
1465 uint256_t result = (c_ct.get_value().lo);
1469 EXPECT_EQ(result,
true);
1475 size_t num_repetitions = 10;
1476 for (
size_t i = 0; i < num_repetitions; ++i) {
1481 EXPECT_EQ(actual_bytes.size(), 32);
1483 for (
size_t j = 0; j < actual_bytes.size(); ++j) {
1485 EXPECT_EQ(actual_bytes[32 - 1 - j].get_value(), expected);
1489 EXPECT_EQ(result,
true);
1497 uint256_t(0xfffffffffffffffe, 0xffffffffffffffff, 0xffffffffffffffff, 0x3fffffffffffffff);
1507 for (
auto i = 0; i < 8; i++) {
1521 auto d = a2.sqradd({});
1524 auto e = a3.madd(a3, {});
1527 auto f = fq_ct::mult_madd({ a4 }, { a4 }, {},
false);
1531 EXPECT_EQ(result,
true);
1550 fq_ct ret = fq_ct::div_check_denominator_nonzero({}, a_ct);
1551 EXPECT_NE(ret.get_context(),
nullptr);
1557 fq_ct a_inverse =
a.invert();
1570 size_t num_repetitions = 10;
1571 for (
size_t i = 0; i < num_repetitions; ++i) {
1580 fq_ct t0 = a_ct + a_ct;
1581 fq_ct t1 = a_ct * two_ct;
1583 t0.assert_equal(t1);
1584 t0.assert_is_not_equal(c_ct);
1585 t0.assert_is_not_equal(d_ct);
1592 EXPECT_EQ(result,
true);
1600 uint32_t exponent_val =
engine.get_random_uint32();
1602 exponent_val |=
static_cast<uint32_t
>(1) << 31;
1606 for (
size_t i = 0; i <= 32; i += 4) {
1607 uint32_t current_exponent_val = exponent_val >> i;
1608 fq_native expected = base_val.
pow(current_exponent_val);
1611 fq_ct result_constant_base = base_constant.
pow(current_exponent_val);
1612 EXPECT_EQ(
fq_native(result_constant_base.get_value()), expected);
1615 fq_ct result_witness_base = base_witness_ct.pow(current_exponent_val);
1616 EXPECT_EQ(
fq_native(result_witness_base.get_value()), expected);
1618 base_witness_ct.set_origin_tag(submitted_value_origin_tag);
1622 EXPECT_EQ(check_result,
true);
1631 uint32_t current_exponent_val = 1;
1634 fq_native expected = base_val.
pow(current_exponent_val);
1637 fq_ct result_constant_base = base_constant_ct.
pow(current_exponent_val);
1638 EXPECT_EQ(
fq_native(result_constant_base.get_value()), expected);
1641 fq_ct result_witness_base = base_witness_ct.pow(current_exponent_val);
1642 EXPECT_EQ(
fq_native(result_witness_base.get_value()), expected);
1645 EXPECT_EQ(check_result,
true);
1651 size_t num_repetitions = 10;
1652 constexpr size_t num_bits = 200;
1654 for (
size_t i = 0; i < num_repetitions; ++i) {
1668 EXPECT_EQ(a_ct.get_value().get_msb() < num_bits,
true);
1669 EXPECT_EQ(b_ct.get_value().get_msb() < num_bits,
true);
1692 EXPECT_EQ(result,
true);
1700 constexpr size_t num_bits = 200;
1709 EXPECT_EQ(result,
false);
1714 constexpr size_t num_bits = 200;
1725 EXPECT_EQ(result,
false);
1746 EXPECT_EQ(result,
false);
1765 auto [q_native_1024, r_native_1024] = native_sum.
divmod(
uint1024_t(fq_ct::modulus));
1768 fq_ct q_ct = fq_ct::create_from_u512_as_witness(&
builder, q_native_512,
true);
1769 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_512,
true);
1779 fq_ct modified_c_ct = fq_ct::create_from_u512_as_witness(&
builder, modified_c_native,
true);
1780 fq_ct modified_r_ct = fq_ct::create_from_u512_as_witness(&
builder, modified_r_native,
true);
1784 a_ct, b_ct, { modified_c_ct }, q_ct, { modified_r_ct });
1787 fq_native expected_lhs = a_native * b_native + c_native;
1789 EXPECT_EQ(expected_lhs, expected_rhs);
1793 uint1024_t rhs_1024 = q_native_512 * fq_ct::modulus + r_native_512;
1794 auto [quotient_lhs, remainder_lhs] = lhs_1024.
divmod(fq_ct::binary_basis.modulus);
1795 auto [quotient_rhs, remainder_rhs] = rhs_1024.
divmod(fq_ct::binary_basis.modulus);
1796 EXPECT_EQ(remainder_lhs, remainder_rhs);
1799 fr expected_lhs_fr =
fr(a_native) *
fr(b_native) +
fr(c_native);
1800 fr expected_rhs_fr =
fr(q_native_512) *
fr(fq_ct::modulus) +
fr(r_native_512);
1801 EXPECT_EQ(expected_lhs_fr, expected_rhs_fr);
1805 EXPECT_EQ(result,
true);
1823 auto [q_native_uint512_t, r_native_uint512_t] = native_sum.
divmod(
uint512_t(fq_ct::modulus));
1824 fq_ct q_ct = fq_ct::create_from_u512_as_witness(
1826 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_uint512_t,
true);
1833 EXPECT_EQ(result,
false);
1834 EXPECT_EQ(
builder.err(),
"bigfield: prime limb identity failed");
1844 size_t num_terms = 3;
1850 for (
size_t i = 0; i < num_terms; ++i) {
1853 a_natives.push_back(a_native);
1854 b_natives.push_back(b_native);
1855 a_cts.push_back(a_ct);
1856 b_cts.push_back(b_ct);
1863 for (
size_t i = 0; i < num_terms; ++i) {
1866 auto [q_native_1024, r_native_1024] = native_sum.
divmod(
uint512_t(fq_ct::modulus));
1869 fq_ct q_ct = fq_ct::create_from_u512_as_witness(&
builder, q_native_512,
true);
1870 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_512,
true);
1877 for (
size_t i = 0; i < num_terms; ++i) {
1881 EXPECT_EQ(expected_lhs, expected_rhs);
1885 for (
size_t i = 0; i < num_terms; ++i) {
1888 uint1024_t rhs_1024 = q_native_512 * fq_ct::modulus + r_native_512;
1889 auto [quotient_lhs, remainder_lhs] = lhs_1024.
divmod(fq_ct::binary_basis.modulus);
1890 auto [quotient_rhs, remainder_rhs] = rhs_1024.
divmod(fq_ct::binary_basis.modulus);
1891 EXPECT_EQ(remainder_lhs, remainder_rhs);
1894 fr expected_lhs_fr =
fr(c_native);
1895 for (
size_t i = 0; i < num_terms; ++i) {
1896 expected_lhs_fr +=
fr(a_natives[i]) *
fr(b_natives[i]);
1898 fr expected_rhs_fr =
fr(q_native_512) *
fr(fq_ct::modulus) +
fr(r_native_512);
1899 EXPECT_EQ(expected_lhs_fr, expected_rhs_fr);
1903 EXPECT_EQ(result,
true);
1913 size_t num_terms = 3;
1919 for (
size_t i = 0; i < num_terms; ++i) {
1922 a_natives.push_back(a_native);
1923 b_natives.push_back(b_native);
1924 a_cts.push_back(a_ct);
1925 b_cts.push_back(b_ct);
1932 for (
size_t i = 0; i < num_terms; ++i) {
1935 auto [q_native_1024, r_native_1024] = native_sum.
divmod(
uint1024_t(fq_ct::modulus));
1936 fq_ct q_ct = fq_ct::create_from_u512_as_witness(
1938 fq_ct r_ct = fq_ct::create_from_u512_as_witness(&
builder, r_native_1024.lo,
true);
1945 EXPECT_EQ(result,
false);
1946 EXPECT_EQ(
builder.err(),
"bigfield: prime limb identity failed");
1955 fq_ct z(zero + two_to_68, zero);
1958 for (
auto zi : z.binary_basis_limbs) {
1959 EXPECT_LE(
uint256_t(zi.element.get_value()), zi.maximum_value);
1967 fq_ct constant_one(1);
1968 fq_ct::msub_div({ witness_one }, { witness_one }, constant_one, { witness_one },
true);
1970 EXPECT_EQ(result,
true);
1979 w0 = w0.conditional_negate(bool_t(&
builder,
true));
1980 w0 = w0.conditional_negate(bool_t(&
builder,
false));
1981 w0 = w0.conditional_negate(bool_t(&
builder,
true));
1982 w0 = w0.conditional_negate(bool_t(&
builder,
true));
1983 fq_ct w4 = w0.conditional_negate(bool_t(&
builder,
false));
1984 w4 = w4.conditional_negate(bool_t(&
builder,
true));
1985 w4 = w4.conditional_negate(bool_t(&
builder,
true));
1997 numerator.binary_basis_limbs[0].maximum_value = 0;
1998 numerator.binary_basis_limbs[1].maximum_value =
uint256_t(1) << 67;
1999 numerator.binary_basis_limbs[2].maximum_value = 0;
2000 numerator.binary_basis_limbs[3].maximum_value = 0;
2002 for (
size_t i = 0; i < 9; i++) {
2003 numerator = numerator + numerator;
2006 fq_ct result = numerator / denominator;
2014 uint256_t dlimb0_value =
uint256_t(
"0x00000000000000000000000000000000000000000000000bef7fa109038857fc");
2015 uint256_t dlimb0_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000fffffffffffffffff");
2016 uint256_t dlimb1_value =
uint256_t(
"0x0000000000000000000000000000000000000000000000056f10535779f56339");
2017 uint256_t dlimb1_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000fffffffffffffffff");
2018 uint256_t dlimb2_value =
uint256_t(
"0x00000000000000000000000000000000000000000000000c741f60a1ec4e114e");
2019 uint256_t dlimb2_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000fffffffffffffffff");
2020 uint256_t dlimb3_value =
uint256_t(
"0x000000000000000000000000000000000000000000000000000286b3cd344d8b");
2021 uint256_t dlimb3_max =
uint256_t(
"0x0000000000000000000000000000000000000000000000000003ffffffffffff");
2022 uint256_t dlimb_prime =
uint256_t(
"0x286b3cd344d8bc741f60a1ec4e114e56f10535779f56339bef7fa109038857fc");
2024 uint256_t nlimb0_value =
uint256_t(
"0x00000000000000000000000000000000000000000000080a84d9bea2b012417c");
2025 uint256_t nlimb0_max =
uint256_t(
"0x000000000000000000000000000000000000000000000ff7c7469df4081b61fc");
2026 uint256_t nlimb1_value =
uint256_t(
"0x00000000000000000000000000000000000000000000080f50ee84526e8e5ba7");
2027 uint256_t nlimb1_max =
uint256_t(
"0x000000000000000000000000000000000000000000000ffef965c67ba5d5893c");
2028 uint256_t nlimb2_value =
uint256_t(
"0x00000000000000000000000000000000000000000000080aba136ca8eaf6dc1b");
2029 uint256_t nlimb2_max =
uint256_t(
"0x000000000000000000000000000000000000000000000ff8171d22fd607249ea");
2030 uint256_t nlimb3_value =
uint256_t(
"0x00000000000000000000000000000000000000000000000001f0042419843c29");
2031 uint256_t nlimb3_max =
uint256_t(
"0x00000000000000000000000000000000000000000000000003e00636264659ff");
2032 uint256_t nlimb_prime =
uint256_t(
"0x000000000000000000000000000000474da776b8ee19a56b08186bdcf01240d8");
2039 w0.binary_basis_limbs[0].maximum_value = dlimb0_max;
2040 w0.binary_basis_limbs[1].maximum_value = dlimb1_max;
2041 w0.binary_basis_limbs[2].maximum_value = dlimb2_max;
2042 w0.binary_basis_limbs[3].maximum_value = dlimb3_max;
2050 w1.binary_basis_limbs[0].maximum_value = nlimb0_max;
2051 w1.binary_basis_limbs[1].maximum_value = nlimb1_max;
2052 w1.binary_basis_limbs[2].maximum_value = nlimb2_max;
2053 w1.binary_basis_limbs[3].maximum_value = nlimb3_max;
2065 fq_ct alsozero = fq_ct::create_from_u512_as_witness(&
builder, fq_ct::modulus_u512);
2066 for (
size_t i = 0; i < 4; i++) {
2067 zero.binary_basis_limbs[i].maximum_value = zero.binary_basis_limbs[i].element.get_value();
2068 alsozero.binary_basis_limbs[i].maximum_value = alsozero.binary_basis_limbs[i].element.get_value();
2070 zero.assert_is_not_equal(alsozero);
2072 EXPECT_EQ(result,
false);
2077using CircuitTypes = testing::Types<typename bb::stdlib::bn254<UltraCircuitBuilder>::BaseField,
2087 TestFixture::test_assert_not_equal_regression();
2092 TestFixture::test_add_to_lower_limb_regression();
2096 TestFixture::test_bad_mul();
2101 TestFixture::test_division_formula_bug();
2105 TestFixture::test_basic_tag_logic();
2109 TestFixture::test_constructor_from_two_elements();
2113 TestFixture::test_unsafe_construct_from_limbs();
2117 TestFixture::test_construct_from_limbs();
2121 TestFixture::test_construct_from_limbs_fails();
2286 TestFixture::test_dual_madd();
2300 TestFixture::test_add_and_div();
2320 TestFixture::test_msub_div(
2325 TestFixture::test_msub_div(
2327 TestFixture::test_msub_div(
2329 TestFixture::test_msub_div(
2331 TestFixture::test_msub_div(
2333 TestFixture::test_msub_div(
2335 TestFixture::test_msub_div(
2366 TestFixture::test_msub_div_ctx_crash_regression();
2382 GTEST_SKIP() <<
"skipping group operations test for non-bn254 base field";
2384 TestFixture::test_group_operations();
2388 TestFixture::test_reduce();
2403 TestFixture::test_unsafe_assert_less_than();
2407 TestFixture::test_unsafe_assert_less_than_fails();
2411 TestFixture::test_unsafe_evaluate_multiply_add();
2415 TestFixture::test_unsafe_evaluate_multiply_add_fails();
2419 TestFixture::test_unsafe_multiple_multiply_add();
2423 TestFixture::test_unsafe_multiple_multiply_add_fails();
2428 TestFixture::test_assert_is_in_field_success();
2432 TestFixture::test_assert_is_in_field_fails();
2436 TestFixture::test_assert_less_than_success();
2440 TestFixture::test_assert_less_than_fails();
2444 TestFixture::test_reduce_mod_target_modulus();
2448 TestFixture::test_byte_array_constructors();
2452 TestFixture::test_to_byte_array();
2456 TestFixture::test_quotient_completeness();
2461 TestFixture::test_conditional_select_regression();
2466 TestFixture::test_division_context();
2471 TestFixture::test_inversion();
2476 TestFixture::test_assert_equal_not_equal();
2481 TestFixture::test_pow();
2486 TestFixture::test_pow_one();
2490 TestFixture::test_nonnormalized_field_bug_regression();
2495 TestFixture::test_internal_div_regression();
2496 TestFixture::test_internal_div_regression2();
2497 TestFixture::test_internal_div_regression3();
#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....
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.
void set_origin_tag(const OriginTag &new_tag) const
Represents a dynamic array of bytes in-circuit.
void set_origin_tag(bb::OriginTag tag)
bytes_t const & bytes() const
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_sum(InputType a_type, bool mixed_inputs=false)
static void test_assert_is_in_field_fails()
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, bool do_tags_merge=true)
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 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_to_byte_array()
static void test_unsafe_construct_from_limbs()
stdlib::bool_t< Builder > bool_ct
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_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
testing::Types< bb::UltraCircuitBuilder, bb::MegaCircuitBuilder > CircuitTypes
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(ShpleminiTest, TestSettings)
@ 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(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
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
General class for prime fields see Prime field documentation["field documentation"] for general imple...
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
static void serialize_to_buffer(const field &value, uint8_t *buffer)
BB_INLINE constexpr field from_montgomery_form() const noexcept
BB_INLINE constexpr field reduce_once() const noexcept
static constexpr field zero()