1#include "../biggroup/biggroup.hpp"
2#include "../bigfield/bigfield.hpp"
3#include "../bool/bool.hpp"
4#include "../field/field.hpp"
39template <
typename _Curve,
bool _use_bigfield = false>
struct TestType {
44 typename std::conditional<_use_bigfield, typename Curve::g1_bigfr_ct, typename Curve::Group>::type;
47 typename std::conditional<_use_bigfield, typename Curve::bigfr_ct, typename Curve::ScalarField>::type;
57 using fq =
typename Curve::BaseFieldNative;
58 using fr =
typename Curve::ScalarFieldNative;
59 using g1 =
typename Curve::GroupNative;
69 info(
"num gates = ",
builder.get_num_finalized_gates_inefficient());
79 return e.get_value().is_point_at_infinity();
81 return e.is_point_at_infinity().get_value();
98 using Fq =
typename element_ct::BaseField;
118 if (even &&
uint256_t(scalar_native).get_bit(0)) {
119 scalar_native -=
fr(1);
129 if (even &&
uint256_t(scalar_native).get_bit(0)) {
130 scalar_native -=
fr(1);
148 scalar_u256 = scalar_u256 >> (256 - num_bits);
150 fr scalar_native(scalar_u256);
153 scalar_ct_val = scalar_ct::from_witness(
builder, scalar_native);
170 a.set_origin_tag(submitted_value_origin_tag);
171 b.set_origin_tag(challenge_origin_tag);
174 EXPECT_EQ(
a.get_origin_tag(), submitted_value_origin_tag);
175 EXPECT_EQ(
b.get_origin_tag(), challenge_origin_tag);
178 EXPECT_EQ((
a +
b).get_origin_tag(), first_two_merged_tag);
179 EXPECT_EQ((
a -
b).get_origin_tag(), first_two_merged_tag);
182 EXPECT_EQ(
a.dbl().get_origin_tag(), submitted_value_origin_tag);
183 EXPECT_EQ((-
a).get_origin_tag(), submitted_value_origin_tag);
187 scalar.set_origin_tag(challenge_origin_tag);
188 EXPECT_EQ((
a * scalar).get_origin_tag(), first_two_merged_tag);
192 predicate.set_origin_tag(challenge_origin_tag);
193 EXPECT_EQ(
a.conditional_negate(predicate).get_origin_tag(), first_two_merged_tag);
196 predicate.set_origin_tag(next_challenge_tag);
197 EXPECT_EQ(
a.conditional_select(
b, predicate).get_origin_tag(), first_second_third_merged_tag);
201 auto x = element_ct::BaseField::from_witness(&
builder, input_c.x);
202 auto y = element_ct::BaseField::from_witness(&
builder, input_c.y);
205 x.set_origin_tag(submitted_value_origin_tag);
206 y.set_origin_tag(challenge_origin_tag);
213 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
217 auto naf_scalar = scalar_ct::from_witness(&
builder,
fr(12345));
218 naf_scalar.set_origin_tag(submitted_value_origin_tag);
219 auto naf = element_ct::compute_naf(naf_scalar, 16);
220 for (
const auto& bit : naf) {
221 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
228 auto x_death = element_ct::BaseField::from_witness(&
builder, input_death.x);
229 auto y_normal = element_ct::BaseField::from_witness(&
builder, input_death.y);
231 x_death.set_origin_tag(instant_death_tag);
232 y_normal.set_origin_tag(constant_tag);
233 pif_normal.set_origin_tag(constant_tag);
234 element_ct death_point(x_death, y_normal, pif_normal,
false);
235 EXPECT_THROW(death_point + death_point, std::runtime_error);
266 for (
size_t i = 0; i < 3; ++i) {
271 point.assert_coordinates_in_field();
286 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.x);
287 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.y);
292 x_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
297 point.assert_coordinates_in_field();
308 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.x);
309 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.y);
314 y_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
319 point.assert_coordinates_in_field();
330 size_t num_repetitions = 10;
331 for (
size_t i = 0; i < num_repetitions; ++i) {
335 uint64_t before =
builder.get_num_finalized_gates_inefficient();
337 uint64_t after =
builder.get_num_finalized_gates_inefficient();
339 if (i == num_repetitions - 1) {
340 benchmark_info(Builder::NAME_STRING,
"Biggroup",
"ADD",
"Gate Count", after - before);
345 uint256_t c_x_u256 = c.x().get_value().lo;
346 uint256_t c_y_u256 = c.y().get_value().lo;
348 fq c_x_result(c_x_u256);
349 fq c_y_result(c_y_u256);
351 EXPECT_EQ(c_x_result, c_expected.x);
352 EXPECT_EQ(c_y_result, c_expected.y);
361 size_t num_repetitions = 10;
362 for (
size_t i = 0; i < num_repetitions; ++i) {
373 EXPECT_EQ(
fq(result_x), expected.x);
374 EXPECT_EQ(
fq(result_y), expected.y);
382 size_t num_repetitions = 1;
383 for (
size_t i = 0; i < num_repetitions; ++i) {
386 input_b.self_set_infinity();
406 EXPECT_EQ(c.get_value(), c_expected);
407 EXPECT_EQ(d.get_value(), d_expected);
408 EXPECT_EQ(e.get_value(), e_expected);
409 EXPECT_EQ(f.get_value(), f_expected);
410 EXPECT_EQ(g.get_value(), g_expected);
411 EXPECT_EQ(h.get_value(), h_expected);
423 size_t num_repetitions = 5;
424 for (
size_t i = 0; i < num_repetitions; ++i) {
427 element_ct input_b = element_ct::from_witness(&
builder, affine_element::infinity());
429 auto standard_a = input_a.get_standard_form();
430 auto standard_b = input_b.get_standard_form();
435 fq standard_a_x = standard_a.x().get_value().lo;
436 fq standard_a_y = standard_a.y().get_value().lo;
438 fq standard_b_x = standard_b.x().get_value().lo;
439 fq standard_b_y = standard_b.y().get_value().lo;
442 EXPECT_EQ(standard_a_x, 0);
443 EXPECT_EQ(standard_a_y, 0);
444 EXPECT_EQ(standard_b_x, 0);
445 EXPECT_EQ(standard_b_y, 0);
454 size_t num_repetitions = 10;
455 for (
size_t i = 0; i < num_repetitions; ++i) {
463 uint256_t c_x_u256 = c.x().get_value().lo;
464 uint256_t c_y_u256 = c.y().get_value().lo;
466 fq c_x_result(c_x_u256);
467 fq c_y_result(c_y_u256);
469 EXPECT_EQ(c_x_result, c_expected.x);
470 EXPECT_EQ(c_y_result, c_expected.y);
479 size_t num_repetitions = 10;
480 for (
size_t i = 0; i < num_repetitions; ++i) {
490 EXPECT_EQ(
fq(result_x), expected.x);
491 EXPECT_EQ(
fq(result_y), expected.y);
499 size_t num_repetitions = 1;
500 for (
size_t i = 0; i < num_repetitions; ++i) {
503 input_b.self_set_infinity();
523 EXPECT_EQ(c.get_value(), c_expected);
524 EXPECT_EQ(d.get_value(), d_expected);
525 EXPECT_EQ(e.get_value(), e_expected);
526 EXPECT_EQ(f.get_value(), f_expected);
527 EXPECT_EQ(g.get_value(), g_expected);
528 EXPECT_EQ(h.get_value(), h_expected);
538 size_t num_repetitions = 10;
539 for (
size_t i = 0; i < num_repetitions; ++i) {
546 uint256_t result_x = result.x().get_value().lo;
547 uint256_t result_y = result.y().get_value().lo;
549 EXPECT_EQ(
fq(result_x), expected.x);
550 EXPECT_EQ(
fq(result_y), expected.y);
559 size_t num_repetitions = 10;
560 for (
size_t i = 0; i < num_repetitions; ++i) {
564 element_ct result =
a.checked_unconditional_subtract(
b);
567 uint256_t result_x = result.x().get_value().lo;
568 uint256_t result_y = result.y().get_value().lo;
570 EXPECT_EQ(
fq(result_x), expected.x);
571 EXPECT_EQ(
fq(result_y), expected.y);
580 size_t num_repetitions = 10;
581 for (
size_t i = 0; i < num_repetitions; ++i) {
593 uint256_t diff_x = diff.x().get_value().lo;
594 uint256_t diff_y = diff.y().get_value().lo;
596 EXPECT_EQ(
fq(sum_x), expected_sum.x);
597 EXPECT_EQ(
fq(sum_y), expected_sum.y);
598 EXPECT_EQ(
fq(diff_x), expected_diff.x);
599 EXPECT_EQ(
fq(diff_y), expected_diff.y);
607 size_t num_repetitions = 10;
608 for (
size_t i = 0; i < num_repetitions; ++i) {
615 uint256_t c_x_u256 = c.x().get_value().lo;
616 uint256_t c_y_u256 = c.y().get_value().lo;
618 fq c_x_result(c_x_u256);
619 fq c_y_result(c_y_u256);
621 EXPECT_EQ(c_x_result, c_expected.x);
622 EXPECT_EQ(c_y_result, c_expected.y);
633 input_infinity.self_set_infinity();
636 element_ct result_infinity = a_infinity.dbl();
653 uint256_t result_x = result_normal.x().get_value().lo;
654 uint256_t result_y = result_normal.y().get_value().lo;
655 fq expected_x(result_x);
656 fq expected_y(result_y);
657 EXPECT_EQ(expected_x, expected_normal.x);
658 EXPECT_EQ(expected_y, expected_normal.y);
675 auto x_coord = element_ct::BaseField::from_witness(&
builder, test_point.x);
676 auto y_coord = element_ct::BaseField::from_witness(&
builder,
fq(0));
690 size_t num_repetitions = 5;
691 for (
size_t i = 0; i < num_repetitions; ++i) {
700 uint256_t dbl_x = doubled.x().get_value().lo;
701 uint256_t dbl_y = doubled.y().get_value().lo;
703 EXPECT_EQ(
fq(sum_x),
fq(dbl_x));
704 EXPECT_EQ(
fq(sum_y),
fq(dbl_y));
714 size_t num_repetitions = 5;
715 for (
size_t i = 0; i < num_repetitions; ++i) {
723 uint256_t result_x = result.x().get_value().lo;
724 uint256_t result_y = result.y().get_value().lo;
725 uint256_t expected_x = expected.x().get_value().lo;
726 uint256_t expected_y = expected.y().get_value().lo;
728 EXPECT_EQ(
fq(result_x),
fq(expected_x));
729 EXPECT_EQ(
fq(result_y),
fq(expected_y));
739 size_t num_repetitions = 10;
740 for (
size_t i = 0; i < num_repetitions; ++i) {
746 auto acc = element_ct::chain_add_start(
a,
b);
747 auto acc_out = element_ct::chain_add(c, acc);
748 element_ct result = element_ct::chain_add_end(acc_out);
752 uint256_t result_x = result.x().get_value().lo;
753 uint256_t result_y = result.y().get_value().lo;
754 EXPECT_EQ(
fq(result_x), expected.x);
755 EXPECT_EQ(
fq(result_y), expected.y);
758 auto lambda_prev = (input_b.y - input_a.y) / (input_b.x - input_a.x);
759 auto x3_prev = lambda_prev * lambda_prev - input_b.x - input_a.x;
760 auto y3_prev = lambda_prev * (input_a.x - x3_prev) - input_a.y;
761 auto lambda = (y3_prev - input_c.y) / (x3_prev - input_c.x);
762 auto x3 = lambda * lambda - x3_prev - input_c.x;
764 uint256_t x3_u256 = acc_out.x3_prev.get_value().lo;
765 uint256_t lambda_u256 = acc_out.lambda_prev.get_value().lo;
767 fq x3_result(x3_u256);
768 fq lambda_result(lambda_u256);
770 EXPECT_EQ(x3_result, x3);
771 EXPECT_EQ(lambda_result, lambda);
780 size_t num_repetitions = 10;
781 for (
size_t i = 0; i < num_repetitions; ++i) {
786 for (
size_t j = 0; j < i; ++j) {
791 typename element_ct::chain_add_accumulator add_1 =
792 element_ct::chain_add_start(add_1_big_0, add_2_big_0);
793 to_add.emplace_back(add_1);
795 acc_big.multiple_montgomery_ladder(to_add);
804 size_t num_repetitions = 10;
805 for (
size_t i = 0; i < num_repetitions; ++i) {
813 uint256_t x_after = normalized.x().get_value().lo;
814 uint256_t y_after = normalized.y().get_value().lo;
816 EXPECT_EQ(
fq(x_before),
fq(x_after));
817 EXPECT_EQ(
fq(y_before),
fq(y_after));
825 size_t num_repetitions = 10;
826 for (
size_t i = 0; i < num_repetitions; ++i) {
834 uint256_t x_after = reduced.x().get_value().lo;
835 uint256_t y_after = reduced.y().get_value().lo;
837 EXPECT_EQ(
fq(x_before),
fq(x_after));
838 EXPECT_EQ(
fq(y_before),
fq(y_after));
856 EXPECT_EQ(
fq(neg_x), expected.x);
857 EXPECT_EQ(
fq(neg_y), expected.y);
866 size_t num_repetitions = 10;
867 for (
size_t i = 0; i < num_repetitions; ++i) {
879 EXPECT_EQ(c.get_value(), c_expected);
889 size_t num_repetitions = 10;
890 for (
size_t i = 0; i < num_repetitions; ++i) {
901 EXPECT_EQ(c.get_value(), c_expected);
911 size_t num_repetitions = 10;
912 for (
size_t i = 0; i < num_repetitions; ++i) {
917 a.incomplete_assert_equal(
b,
"elements don't match");
924 size_t num_repetitions = 10;
925 for (
size_t i = 0; i < num_repetitions; ++i) {
927 input_a.self_set_infinity();
931 a.incomplete_assert_equal(
b,
"elements don't match");
941 a.incomplete_assert_equal(
a,
"self assertion test");
955 while (input_a == input_b) {
956 input_b = element::random_element();
961 a.incomplete_assert_equal(
b,
"elements don't match");
965 EXPECT_EQ(
builder.failed(),
true);
966 EXPECT_EQ(
builder.err(),
"elements don't match (x coordinate)");
977 input_b.y = -input_a.y;
980 auto x_coord = element_ct::BaseField::from_witness(&
builder, input_a.x);
981 auto y_coord_a = element_ct::BaseField::from_witness(&
builder, input_a.y);
982 auto y_coord_b = element_ct::BaseField::from_witness(&
builder, input_b.y);
988 a.incomplete_assert_equal(
b,
"elements don't match");
991 EXPECT_EQ(
builder.failed(),
true);
992 EXPECT_EQ(
builder.err(),
"elements don't match (y coordinate)");
1000 input_a.self_set_infinity();
1004 a.incomplete_assert_equal(
b,
"infinity flag mismatch test");
1006 EXPECT_EQ(
builder.failed(),
true);
1009 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (x coordinate)");
1011 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (infinity flag)");
1019 size_t max_num_bits = 254;
1025 scalar_raw = scalar_raw >> (256 -
length);
1027 scalar_val =
fr(scalar_raw);
1030 if (scalar_val ==
fr(0)) {
1034 auto naf = element_ct::compute_naf(scalar,
length);
1037 fr reconstructed_val(0);
1038 for (
size_t i = 0; i <
length; i++) {
1041 reconstructed_val -=
fr(naf[
length].get_value());
1042 EXPECT_EQ(scalar_val, reconstructed_val);
1057 auto naf = element_ct::compute_naf(scalar,
length);
1060 fr reconstructed_val(0);
1062 for (
size_t i = 0; i <
length; i++) {
1064 reconstructed_u256 +=
1067 reconstructed_val -=
fr(naf[
length].get_value());
1068 EXPECT_EQ(scalar_val, reconstructed_val);
1084 scalar_raw = (scalar_raw >> 136) << 136;
1085 fr scalar_val =
fr(scalar_raw);
1087 scalar.set_origin_tag(submitted_value_origin_tag);
1093 auto naf = element_ct::compute_naf(scalar,
length);
1096 for (
const auto& bit : naf) {
1097 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1101 fr reconstructed_val(0);
1102 for (
size_t i = 0; i <
length; i++) {
1105 reconstructed_val -=
fr(naf[
length].get_value());
1107 EXPECT_EQ(scalar_val, reconstructed_val);
1114 size_t num_repetitions = 1;
1115 for (
size_t i = 0; i < num_repetitions; ++i) {
1124 fq c_x_result(c.x().get_value().lo);
1125 fq c_y_result(c.y().get_value().lo);
1127 EXPECT_EQ(c_x_result, c_expected.x);
1128 EXPECT_EQ(c_y_result, c_expected.y);
1145 bool expected_is_inf = expected.is_point_at_infinity();
1147 EXPECT_EQ(result_is_inf, expected_is_inf);
1150 if (!expected_is_inf) {
1151 uint256_t result_x = result.x().get_value().lo;
1152 uint256_t result_y = result.y().get_value().lo;
1154 EXPECT_EQ(
fq(result_x), expected.x);
1155 EXPECT_EQ(
fq(result_y), expected.y);
1165 run_mul_and_check(P, x, expected_infinity);
1171 P = element_ct::constant_infinity(&
builder);
1173 input.self_set_infinity();
1174 P = element_ct::from_witness(&
builder, input);
1179 run_mul_and_check(P, x, expected_infinity);
1186 run_mul_and_check(P, one, input);
1191 fr neg_one = -
fr(1);
1195 run_mul_and_check(P, neg_one_ct, expected);
1205 std::vector<size_t> test_lengths = { 2, 3, 10, 11, 31, 32, 63, 64, 127, 128, 252, 253 };
1207 for (
size_t i : test_lengths) {
1212 scalar_raw = scalar_raw >> (256 - i);
1213 fr scalar =
fr(scalar_raw);
1216 if (scalar ==
fr(0)) {
1229 fq c_x_result(c.x().get_value().lo);
1230 fq c_y_result(c.y().get_value().lo);
1232 EXPECT_EQ(c_x_result, c_expected.x);
1234 EXPECT_EQ(c_y_result, c_expected.y);
1249 points[0] = element::infinity();
1250 points[1] = element::random_element();
1252 std::vector<size_t> gates(2);
1255 bool expect_infinity =
true;
1257 for (
auto [point, num_gates] :
zip_view(points, gates)) {
1260 const size_t max_num_bits = 128;
1264 scalar_raw = scalar_raw >> (256 - max_num_bits);
1265 fr scalar =
fr(scalar_raw);
1271 element_ct c = P.scalar_mul(x, max_num_bits);
1273 num_gates =
builder.get_num_finalized_gates_inefficient();
1278 expect_infinity =
false;
1282 EXPECT_GT(gates[0], gates[1]);
1288 size_t num_repetitions = 1;
1289 for (
size_t i = 0; i < num_repetitions; ++i) {
1294 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1297 if ((
uint256_t(scalar_b).get_bit(0) & 1) == 0) {
1305 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b });
1310 fq c_x_result(c.x().get_value().lo);
1311 fq c_y_result(c.y().get_value().lo);
1313 EXPECT_EQ(c_x_result, expected.x);
1314 EXPECT_EQ(c_y_result, expected.y);
1322 size_t num_repetitions = 1;
1323 for (
size_t i = 0; i < num_repetitions; ++i) {
1326 input_b.self_set_infinity();
1329 const size_t max_num_bits = 128;
1331 scalar_raw_a = scalar_raw_a >> (256 - max_num_bits);
1332 fr scalar_a =
fr(scalar_raw_a);
1335 scalar_raw_b = scalar_raw_b >> (256 - max_num_bits);
1336 fr scalar_b =
fr(scalar_raw_b);
1343 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b }, 128);
1348 fq c_x_result(c.x().get_value().lo);
1349 fq c_y_result(c.y().get_value().lo);
1351 EXPECT_EQ(c_x_result, expected.x);
1352 EXPECT_EQ(c_y_result, expected.y);
1375 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1379 for (
size_t i = 0; i < 3; ++i) {
1381 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1382 scalars.emplace_back(scalar);
1383 points.emplace_back(point);
1388 const auto get_128_bit_scalar = []() {
1392 fr scalar(scalar_u256);
1395 fr masking_scalar = get_128_bit_scalar();
1396 scalar_ct masking_scalar_ct = scalar_ct::from_witness(&
builder, masking_scalar);
1407 fq c_x_result(c.x().get_value().lo);
1408 fq c_y_result(c.y().get_value().lo);
1410 EXPECT_EQ(c_x_result, expected.x);
1411 EXPECT_EQ(c_y_result, expected.y);
1430 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1434 for (
size_t i = 0; i < 3; ++i) {
1436 points.emplace_back(point);
1438 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1439 scalars.emplace_back(scalar);
1444 element_ct::batch_mul(points, scalars, 4,
false);
1447 EXPECT_EQ(
builder.err(),
"bigfield: prime limb diff is zero, but expected non-zero");
1453 size_t num_repetitions = 1;
1454 for (
size_t i = 0; i < num_repetitions; ++i) {
1456 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1464 fq c_x_result(c.x().get_value().lo);
1465 fq c_y_result(c.y().get_value().lo);
1467 EXPECT_EQ(c_x_result, expected.x);
1468 EXPECT_EQ(c_y_result, expected.y);
1476 const bool short_scalars =
false,
1477 const bool with_edgecases =
false)
1486 const bool short_scalars =
false,
1487 const bool with_edgecases =
false)
1491 const size_t num_points = point_types.size();
1493 std::vector<fr> scalars;
1497 for (
size_t i = 0; i < num_points; ++i) {
1499 if (short_scalars) {
1501 scalars.push_back(input_scalar);
1502 circuit_scalars.push_back(x);
1505 scalars.push_back(input_scalar);
1506 circuit_scalars.push_back(x);
1511 points.push_back(input_point);
1512 circuit_points.push_back(P);
1516 const auto get_128_bit_scalar = []() {
1520 fr scalar(scalar_u256);
1523 fr masking_scalar = with_edgecases ? get_128_bit_scalar() :
fr(1);
1527 element_ct result_point = element_ct::batch_mul(
1528 circuit_points, circuit_scalars, 0, with_edgecases, masking_scalar_ct);
1532 for (
size_t i = 0; i < num_points; ++i) {
1533 expected_point += (
element(points[i]) * scalars[i]);
1536 expected_point = expected_point.normalize();
1537 fq result_x(result_point.x().get_value().lo);
1538 fq result_y(result_point.y().get_value().lo);
1540 EXPECT_EQ(result_x, expected_point.x);
1541 EXPECT_EQ(result_y, expected_point.y);
1548 const size_t num_points = 5;
1551 std::vector<fr> scalars;
1552 for (
size_t i = 0; i < num_points; ++i) {
1559 for (
size_t i = 0; i < num_points; ++i) {
1560 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1561 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1564 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
1568 for (
size_t i = 0; i < num_points; ++i) {
1569 expected_point += (
element(points[i]) * scalars[i]);
1572 expected_point = expected_point.normalize();
1573 fq result_x(result_point.x().get_value().lo);
1574 fq result_y(result_point.y().get_value().lo);
1576 EXPECT_EQ(result_x, expected_point.x);
1577 EXPECT_EQ(result_y, expected_point.y);
1584 const size_t num_points = 5;
1587 std::vector<fr> scalars;
1588 for (
size_t i = 0; i < num_points; ++i) {
1595 for (
size_t i = 0; i < num_points; ++i) {
1596 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1597 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1601 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1605 for (
size_t i = 0; i < num_points; ++i) {
1606 expected_point += (
element(points[i]) * scalars[i]);
1609 expected_point = expected_point.normalize();
1611 fq result2_x(result_point2.x().get_value().lo);
1612 fq result2_y(result_point2.y().get_value().lo);
1614 EXPECT_EQ(result2_x, expected_point.x);
1615 EXPECT_EQ(result2_y, expected_point.y);
1622 const auto test_repeated_points = [](
const uint32_t num_points) {
1624 info(
"num points: ", num_points);
1626 std::vector<fr> scalars;
1627 for (
size_t idx = 0; idx < num_points; idx++) {
1628 points.push_back(affine_element::one());
1629 scalars.push_back(1);
1633 ASSERT_EQ(points.size(), scalars.size());
1637 for (
size_t i = 0; i < num_points; ++i) {
1638 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1639 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1642 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1644 auto expected_point = element::infinity();
1645 for (
const auto& point : points) {
1646 expected_point += point;
1648 expected_point = expected_point.normalize();
1650 fq result_x(result_point.x().get_value().lo);
1651 fq result_y(result_point.y().get_value().lo);
1653 EXPECT_EQ(result_x, expected_point.x);
1654 EXPECT_EQ(result_y, expected_point.y);
1658 test_repeated_points(2);
1659 test_repeated_points(3);
1660 test_repeated_points(4);
1661 test_repeated_points(5);
1662 test_repeated_points(6);
1663 test_repeated_points(7);
1670 points.push_back(affine_element::infinity());
1672 std::vector<fr> scalars;
1673 scalars.push_back(1);
1674 scalars.push_back(1);
1677 ASSERT_EQ(points.size(), scalars.size());
1678 const size_t num_points = points.size();
1682 for (
size_t i = 0; i < num_points; ++i) {
1683 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1684 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1688 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1690 element expected_point = points[1];
1691 expected_point = expected_point.normalize();
1693 fq result_x(result_point.x().get_value().lo);
1694 fq result_y(result_point.y().get_value().lo);
1696 EXPECT_EQ(result_x, expected_point.x);
1697 EXPECT_EQ(result_y, expected_point.y);
1706 std::vector<fr> scalars;
1707 scalars.push_back(0);
1708 scalars.push_back(1);
1711 ASSERT_EQ(points.size(), scalars.size());
1712 const size_t num_points = points.size();
1716 for (
size_t i = 0; i < num_points; ++i) {
1717 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1718 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1722 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1724 element expected_point = points[1];
1725 expected_point = expected_point.normalize();
1727 fq result_x(result_point.x().get_value().lo);
1728 fq result_y(result_point.y().get_value().lo);
1730 EXPECT_EQ(result_x, expected_point.x);
1731 EXPECT_EQ(result_y, expected_point.y);
1742 std::vector<fr> scalars;
1744 for (
size_t i = 0; i < 5; ++i) {
1745 points.push_back(affine_element::infinity());
1752 for (
size_t i = 0; i < points.size(); ++i) {
1753 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1754 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1757 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1769 std::vector<fr> scalars;
1771 for (
size_t i = 0; i < 5; ++i) {
1779 for (
size_t i = 0; i < points.size(); ++i) {
1780 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1781 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1784 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1796 std::vector<fr> scalars;
1798 for (
size_t i = 0; i < 6; ++i) {
1807 for (
size_t i = 0; i < points.size(); ++i) {
1808 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1809 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1812 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1815 element expected = element::infinity();
1816 for (
size_t i = 0; i < points.size(); ++i) {
1817 expected += (
element(points[i]) * scalars[i]);
1821 uint256_t result_x = result.x().get_value().lo;
1822 uint256_t result_y = result.y().get_value().lo;
1824 EXPECT_EQ(
fq(result_x), expected_affine.x);
1825 EXPECT_EQ(
fq(result_y), expected_affine.y);
1835 std::vector<fr> scalars;
1837 for (
size_t i = 0; i < 6; ++i) {
1839 points.push_back((i % 2 == 0) ? affine_element::infinity() :
affine_element(element::random_element()));
1846 for (
size_t i = 0; i < points.size(); ++i) {
1847 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1848 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1851 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1854 element expected = element::infinity();
1855 for (
size_t i = 0; i < points.size(); ++i) {
1856 if (!points[i].is_point_at_infinity()) {
1857 expected += (
element(points[i]) * scalars[i]);
1862 uint256_t result_x = result.x().get_value().lo;
1863 uint256_t result_y = result.y().get_value().lo;
1865 EXPECT_EQ(
fq(result_x), expected_affine.x);
1866 EXPECT_EQ(
fq(result_y), expected_affine.y);
1876 std::vector<fr> scalars;
1883 points.push_back(P);
1884 scalars.push_back(scalar);
1885 points.push_back(neg_P);
1886 scalars.push_back(scalar);
1889 for (
size_t i = 0; i < 3; ++i) {
1897 for (
size_t i = 0; i < points.size(); ++i) {
1898 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1899 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1902 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1905 element expected = element::infinity();
1906 for (
size_t i = 0; i < points.size(); ++i) {
1907 expected += (
element(points[i]) * scalars[i]);
1911 uint256_t result_x = result.x().get_value().lo;
1912 uint256_t result_y = result.y().get_value().lo;
1914 EXPECT_EQ(
fq(result_x), expected_affine.x);
1915 EXPECT_EQ(
fq(result_y), expected_affine.y);
1925 std::vector<fr> scalars_native;
1930 for (
size_t i = 0; i < 3; ++i) {
1933 points_native.push_back(point);
1934 scalars_native.push_back(scalar);
1935 circuit_points.push_back(point_ct);
1940 for (
size_t i = 0; i < 3; ++i) {
1943 points_native.push_back(point);
1944 scalars_native.push_back(scalar);
1945 circuit_points.push_back(point_ct);
1950 for (
size_t i = 0; i < 4; ++i) {
1953 points_native.push_back(point);
1954 scalars_native.push_back(scalar);
1955 circuit_points.push_back(
element_ct(point.x, point.y));
1956 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalar));
1960 for (
size_t i = 0; i < 4; ++i) {
1963 points_native.push_back(point);
1964 scalars_native.push_back(scalar);
1965 circuit_points.push_back(point_ct);
1969 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
1972 element expected = element::infinity();
1973 for (
size_t i = 0; i < points_native.size(); ++i) {
1974 expected += (
element(points_native[i]) * scalars_native[i]);
1978 uint256_t result_x = result.x().get_value().lo;
1979 uint256_t result_y = result.y().get_value().lo;
1981 EXPECT_EQ(
fq(result_x), expected_affine.x);
1982 EXPECT_EQ(
fq(result_y), expected_affine.y);
1992 std::vector<fr> scalars;
1993 constexpr size_t num_points = 20;
1995 for (
size_t i = 0; i < num_points; ++i) {
2003 for (
size_t i = 0; i < points.size(); ++i) {
2004 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2005 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2008 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
2011 element expected = element::infinity();
2012 for (
size_t i = 0; i < points.size(); ++i) {
2013 expected += (
element(points[i]) * scalars[i]);
2017 uint256_t result_x = result.x().get_value().lo;
2018 uint256_t result_y = result.y().get_value().lo;
2020 EXPECT_EQ(
fq(result_x), expected_affine.x);
2021 EXPECT_EQ(
fq(result_y), expected_affine.y);
2036 EXPECT_EQ(
fq(inf.x().get_value().lo),
fq(0));
2037 EXPECT_EQ(
fq(inf.y().get_value().lo),
fq(0));
2049 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2050 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2060 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2061 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2071 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2072 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2081 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2082 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2103 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2104 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2118 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2119 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2133 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2134 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2152 element_ct result =
a.conditional_select(inf, pred);
2155 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2156 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2162 element_ct result =
a.conditional_select(inf, pred);
2171 element_ct result = inf.conditional_select(inf2, pred);
2189 element_ct result = inf.conditional_negate(pred);
2192 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2193 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2199 element_ct result = inf.conditional_negate(pred);
2218 EXPECT_EQ(
fq(P.x().get_value().lo),
fq(0));
2219 EXPECT_EQ(
fq(P.y().get_value().lo),
fq(0));
2223 element_ct standardized = P.get_standard_form();
2225 EXPECT_EQ(
fq(standardized.x().get_value().lo),
fq(0));
2226 EXPECT_EQ(
fq(standardized.y().get_value().lo),
fq(0));
2237 auto x_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2238 auto y_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2260 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2261 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2272 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2273 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2300 element_ct::from_witness(&
builder, P),
2301 element_ct::from_witness(&
builder, Q),
2302 element_ct::from_witness(&
builder, P),
2303 element_ct::from_witness(&
builder, Q),
2307 scalar_ct::from_witness(&
builder,
b),
2308 scalar_ct::from_witness(&
builder, -
a),
2309 scalar_ct::from_witness(&
builder, -
b) };
2311 element_ct result = element_ct::batch_mul(points, scalars, 0,
true);
2314 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2315 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2333 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2334 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2339 EXPECT_EQ(
fq(result2.x().get_value().lo), input.x);
2340 EXPECT_EQ(
fq(result2.y().get_value().lo), input.y);
2361 EXPECT_EQ(
fq(result.x().get_value().lo), input2.x);
2362 EXPECT_EQ(
fq(result.y().get_value().lo), input2.y);
2366 EXPECT_EQ(
fq(result2.x().get_value().lo), input2.x);
2367 EXPECT_EQ(
fq(result2.y().get_value().lo), input2.y);
2401 TestFixture::test_basic_tag_logic();
2406 TestFixture::test_assert_coordinates_in_field();
2412 TestFixture::test_add();
2422 TestFixture::test_add_points_at_infinity();
2426 TestFixture::test_standard_form_of_point_at_infinity();
2432 TestFixture::test_sub();
2442 TestFixture::test_sub_points_at_infinity();
2446 TestFixture::test_dbl();
2454 TestFixture::test_dbl_with_infinity();
2459 GTEST_SKIP() <<
"mega builder does not support this edge case";
2461 TestFixture::test_dbl_with_y_zero();
2466 TestFixture::test_add_equals_dbl();
2470 TestFixture::test_sub_neg_equals_double();
2477 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2479 TestFixture::test_chain_add();
2485 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2502 GTEST_SKIP() <<
"mega builder does not implement multiple_montgomery_ladder function";
2504 TestFixture::test_multiple_montgomery_ladder();
2511 TestFixture::test_normalize();
2521 TestFixture::test_reduce();
2586 TestFixture::test_checked_unconditional_add_sub();
2597 TestFixture::test_conditional_negate();
2608 TestFixture::test_conditional_select();
2622 TestFixture::test_incomplete_assert_equal();
2626 TestFixture::test_incomplete_assert_equal_failure();
2632 size_t num_repetitions = 1;
2633 for (
size_t i = 0; i < num_repetitions; i++) {
2634 TestFixture::test_compute_naf();
2637 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2644 TestFixture::test_compute_naf_zero();
2646 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2653 TestFixture::test_compute_naf_overflow_lower_half();
2655 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2661 TestFixture::test_mul();
2671 TestFixture::test_mul_edge_cases();
2683 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2685 TestFixture::test_short_scalar_mul_with_bit_lengths();
2692 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2694 TestFixture::test_short_scalar_mul_infinity();
2702 TestFixture::test_helper_batch_mul(1);
2708 TestFixture::test_helper_batch_mul(2);
2712 TestFixture::test_helper_batch_mul(2,
true);
2716 TestFixture::test_helper_batch_mul(2,
false,
true);
2720 TestFixture::test_helper_batch_mul(2,
true,
true);
2731 TestFixture::test_helper_batch_mul(3);
2737 TestFixture::test_helper_batch_mul(4);
2743 TestFixture::test_helper_batch_mul(5);
2747 TestFixture::test_helper_batch_mul(5,
false,
true);
2751 TestFixture::test_helper_batch_mul(5,
true);
2755 TestFixture::test_helper_batch_mul(5,
true,
true);
2759 TestFixture::test_helper_batch_mul(
2767 TestFixture::test_helper_batch_mul(6);
2772 TestFixture::test_twin_mul();
2777 TestFixture::test_twin_mul_with_infinity();
2782 TestFixture::test_batch_mul_linearly_dependent_generators();
2788 GTEST_SKIP() <<
"this failure test is designed for ultra builder only";
2790 TestFixture::test_batch_mul_linearly_dependent_generators_failure();
2796 TestFixture::test_one();
2801 TestFixture::test_batch_mul();
2806 TestFixture::test_batch_mul_edgecase_equivalence();
2810 TestFixture::test_batch_mul_edge_case_set1();
2815 TestFixture::test_batch_mul_edge_case_set2();
2821 TestFixture::test_batch_mul_all_infinity();
2826 TestFixture::test_batch_mul_all_zero_scalars();
2831 TestFixture::test_batch_mul_mixed_zero_scalars();
2836 TestFixture::test_batch_mul_mixed_infinity();
2841 TestFixture::test_batch_mul_cancellation();
2846 TestFixture::test_batch_mul_mixed_constant_witness();
2851 TestFixture::test_batch_mul_large_number_of_points();
2857 TestFixture::test_infinity_canonical_representation();
2862 TestFixture::test_infinity_chained_operations();
2867 TestFixture::test_conditional_select_with_infinity();
2872 TestFixture::test_conditional_negate_with_infinity();
2877 TestFixture::test_get_standard_form_normalizes_infinity();
2882 TestFixture::test_infinity_auto_detection_in_constructor();
2887 TestFixture::test_scalar_mul_infinity_edge_cases();
2892 TestFixture::test_batch_mul_complete_cancellation();
2897 TestFixture::test_add_constant_infinity();
2902 TestFixture::test_witness_infinity_from_operations();
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
stdlib_biggroup< TestType< stdlib::bn254< bb::UltraCircuitBuilder >, false > > bn254_with_ultra
stdlib_biggroup< TestType< stdlib::bn254< bb::UltraCircuitBuilder >, true > > bn254_with_ultra_scalar_bigfield
stdlib_biggroup< TestType< stdlib::secp256r1< bb::UltraCircuitBuilder >, true > > secp256r1_with_ultra
constexpr InputType operator!(InputType type)
stdlib_biggroup< TestType< stdlib::bn254< bb::MegaCircuitBuilder >, false > > bn254_with_mega
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
BB_INLINE constexpr void self_set_infinity() noexcept
group_elements::affine_element< Fq, Fr, Params > affine_element
static constexpr element one
group_elements::element< Fq, Fr, Params > element
virtual uint64_t get_random_uint64()=0
virtual uint8_t get_random_uint8()=0
virtual uint256_t get_random_uint256()=0
constexpr uint64_t get_msb() const
Implements boolean logic in-circuit.
static auto checked_unconditional_add_sub(const element< C, Fq, Fr, G > &elem1, const element< C, Fq, Fr, G > &elem2)
static field_t from_witness(Builder *ctx, const bb::fr &input)
static void test_checked_unconditional_add_sub(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_sub_points_at_infinity()
static void test_sub_neg_equals_double()
static void test_helper_batch_mul(std::vector< InputType > point_types, std::vector< InputType > scalar_types, const bool short_scalars=false, const bool with_edgecases=false)
static void test_conditional_negate(InputType point_type=InputType::WITNESS, InputType predicate_type=InputType::WITNESS)
static void test_batch_mul_edgecase_equivalence()
static void test_reduce(InputType point_type=InputType::WITNESS)
static void test_twin_mul()
static void test_witness_infinity_from_operations()
static void test_add_points_at_infinity()
static void test_chain_add(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS, InputType c_type=InputType::WITNESS)
static void test_conditional_negate_with_infinity()
static void test_compute_naf()
typename g1::element element
static void test_multiple_montgomery_ladder()
static void test_batch_mul_cancellation()
static void test_add_constant_infinity()
static void test_dbl_with_infinity()
static std::pair< affine_element, element_ct > get_random_constant_point(Builder *builder)
static void test_compute_naf_zero()
static void test_mul(InputType scalar_type=InputType::WITNESS, InputType point_type=InputType::WITNESS)
static void test_batch_mul_mixed_infinity()
typename Curve::ScalarFieldNative fr
static void test_batch_mul_edge_case_set2()
static std::pair< fr, scalar_ct > get_random_constant_scalar(Builder *builder, bool even=false)
static void test_get_standard_form_normalizes_infinity()
typename TestType::element_ct element_ct
static void test_assert_coordinates_in_field()
static std::pair< affine_element, element_ct > get_random_witness_point(Builder *builder)
static void test_infinity_auto_detection_in_constructor()
static void test_mul_edge_cases(InputType scalar_type=InputType::WITNESS, InputType point_type=InputType::WITNESS)
typename g1::affine_element affine_element
typename TestType::Curve Curve
static std::pair< fr, scalar_ct > get_random_witness_scalar(Builder *builder, bool even=false)
static void test_batch_mul_linearly_dependent_generators()
static void test_conditional_select(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS, InputType predicate_type=InputType::WITNESS)
static void test_basic_tag_logic()
static void test_add(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
typename Curve::Builder Builder
static void test_conditional_select_with_infinity()
static void test_incomplete_assert_equal()
static void test_batch_mul_mixed_constant_witness()
static void test_twin_mul_with_infinity()
static void test_unary_negate(InputType a_type=InputType::WITNESS)
typename TestType::scalar_ct scalar_ct
stdlib::bool_t< Builder > bool_ct
static std::pair< fr, scalar_ct > get_random_scalar(Builder *builder, InputType type, bool even=false)
static void test_batch_mul_edge_case_set1()
static void test_checked_unconditional_subtract(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_short_scalar_mul_with_bit_lengths()
static void test_short_scalar_mul_infinity()
static void test_dbl(InputType a_type=InputType::WITNESS)
static void test_normalize(InputType point_type=InputType::WITNESS)
static void test_infinity_chained_operations()
static void test_incomplete_assert_equal_failure()
static bool is_infinity(const element_ct &e)
static std::pair< fr, scalar_ct > get_random_short_scalar(Builder *builder, InputType type, size_t num_bits)
stdlib::witness_t< Builder > witness_ct
static void test_standard_form_of_point_at_infinity()
Check that converting a point at infinity into standard form ensures the coordinates are zeroes.
typename Curve::GroupNative g1
static void test_scalar_mul_infinity_edge_cases()
typename Curve::BaseFieldNative fq
static void test_batch_mul_mixed_zero_scalars()
static void test_add_assign(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static std::pair< affine_element, element_ct > get_random_point(Builder *builder, InputType type)
static void test_batch_mul_large_number_of_points()
static void test_dbl_with_y_zero()
static void test_sub_assign(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_batch_mul()
static void test_batch_mul_all_zero_scalars()
static void test_compute_naf_overflow_lower_half()
static void test_batch_mul_complete_cancellation()
static void test_add_equals_dbl()
static void test_helper_batch_mul(size_t num_points, const bool short_scalars=false, const bool with_edgecases=false)
static void test_sub(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
static void test_batch_mul_linearly_dependent_generators_failure()
static constexpr auto EXPECT_CIRCUIT_CORRECTNESS
static void test_infinity_canonical_representation()
static void test_batch_mul_all_infinity()
static void test_checked_unconditional_add(InputType a_type=InputType::WITNESS, InputType b_type=InputType::WITNESS)
void benchmark_info(Args...)
Info used to store circuit statistics during CI/CD with concrete structure. Writes straight to log.
uint8_t const size_t length
uintx< uint256_t > uint512_t
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
Inner sum(Cont< Inner, Args... > const &in)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
testing::Types< VKTestParams< UltraFlavor, stdlib::recursion::honk::DefaultIO< UltraCircuitBuilder > >, VKTestParams< UltraFlavor, stdlib::recursion::honk::RollupIO >, VKTestParams< UltraKeccakFlavor, stdlib::recursion::honk::DefaultIO< UltraCircuitBuilder > >, VKTestParams< MegaFlavor, stdlib::recursion::honk::DefaultIO< MegaCircuitBuilder > > > TestTypes
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
#define STANDARD_TESTING_TAGS
typename std::conditional< _use_bigfield, typename Curve::g1_bigfr_ct, typename Curve::Group >::type element_ct
typename std::conditional< _use_bigfield, typename Curve::bigfr_ct, typename Curve::ScalarField >::type scalar_ct
static const bool use_bigfield
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field reduce() const noexcept
reduce once, i.e., if the value is bigger than the modulus, subtract off the modulus once.
static constexpr field zero()
#define HEAVY_TYPED_TEST(x, y)