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());
80 return e.get_value().is_point_at_infinity();
82 return e.is_point_at_infinity().get_value();
99 using Fq =
typename element_ct::BaseField;
119 if (even &&
uint256_t(scalar_native).get_bit(0)) {
120 scalar_native -=
fr(1);
130 if (even &&
uint256_t(scalar_native).get_bit(0)) {
131 scalar_native -=
fr(1);
149 scalar_u256 = scalar_u256 >> (256 - num_bits);
151 fr scalar_native(scalar_u256);
154 scalar_ct_val = scalar_ct::from_witness(
builder, scalar_native);
171 a.set_origin_tag(submitted_value_origin_tag);
172 b.set_origin_tag(challenge_origin_tag);
175 EXPECT_EQ(
a.get_origin_tag(), submitted_value_origin_tag);
176 EXPECT_EQ(
b.get_origin_tag(), challenge_origin_tag);
179 EXPECT_EQ((
a +
b).get_origin_tag(), first_two_merged_tag);
180 EXPECT_EQ((
a -
b).get_origin_tag(), first_two_merged_tag);
183 EXPECT_EQ(
a.dbl().get_origin_tag(), submitted_value_origin_tag);
184 EXPECT_EQ((-
a).get_origin_tag(), submitted_value_origin_tag);
188 scalar.set_origin_tag(challenge_origin_tag);
189 EXPECT_EQ((
a * scalar).get_origin_tag(), first_two_merged_tag);
193 predicate.set_origin_tag(challenge_origin_tag);
194 EXPECT_EQ(
a.conditional_negate(predicate).get_origin_tag(), first_two_merged_tag);
197 predicate.set_origin_tag(next_challenge_tag);
198 EXPECT_EQ(
a.conditional_select(
b, predicate).get_origin_tag(), first_second_third_merged_tag);
202 auto x = element_ct::BaseField::from_witness(&
builder, input_c.x);
203 auto y = element_ct::BaseField::from_witness(&
builder, input_c.y);
206 x.set_origin_tag(submitted_value_origin_tag);
207 y.set_origin_tag(challenge_origin_tag);
214 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
218 auto naf_scalar = scalar_ct::from_witness(&
builder,
fr(12345));
219 naf_scalar.set_origin_tag(submitted_value_origin_tag);
220 auto naf = element_ct::compute_naf(naf_scalar, 16);
221 for (
const auto& bit : naf) {
222 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
229 auto x_death = element_ct::BaseField::from_witness(&
builder, input_death.x);
230 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 element_ct death_point(x_death, y_normal,
false);
234 EXPECT_THROW(death_point + death_point, std::runtime_error);
265 for (
size_t i = 0; i < 3; ++i) {
270 point.assert_coordinates_in_field();
285 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.x);
286 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.y);
291 x_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
296 point.assert_coordinates_in_field();
307 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.x);
308 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.y);
313 y_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
318 point.assert_coordinates_in_field();
329 size_t num_repetitions = 10;
330 for (
size_t i = 0; i < num_repetitions; ++i) {
334 uint64_t before =
builder.get_num_finalized_gates_inefficient();
336 uint64_t after =
builder.get_num_finalized_gates_inefficient();
338 if (i == num_repetitions - 1) {
339 benchmark_info(Builder::NAME_STRING,
"Biggroup",
"ADD",
"Gate Count", after - before);
344 uint256_t c_x_u256 = c.x().get_value().lo;
345 uint256_t c_y_u256 = c.y().get_value().lo;
347 fq c_x_result(c_x_u256);
348 fq c_y_result(c_y_u256);
350 EXPECT_EQ(c_x_result, c_expected.x);
351 EXPECT_EQ(c_y_result, c_expected.y);
360 size_t num_repetitions = 10;
361 for (
size_t i = 0; i < num_repetitions; ++i) {
372 EXPECT_EQ(
fq(result_x), expected.x);
373 EXPECT_EQ(
fq(result_y), expected.y);
381 size_t num_repetitions = 1;
382 for (
size_t i = 0; i < num_repetitions; ++i) {
385 input_b.self_set_infinity();
405 EXPECT_EQ(c.get_value(), c_expected);
406 EXPECT_EQ(d.get_value(), d_expected);
407 EXPECT_EQ(e.get_value(), e_expected);
408 EXPECT_EQ(f.get_value(), f_expected);
409 EXPECT_EQ(g.get_value(), g_expected);
410 EXPECT_EQ(h.get_value(), h_expected);
422 size_t num_repetitions = 5;
423 for (
size_t i = 0; i < num_repetitions; ++i) {
426 element_ct input_b = element_ct::from_witness(&
builder, affine_element::infinity());
428 auto standard_a = input_a.get_standard_form();
429 auto standard_b = input_b.get_standard_form();
434 fq standard_a_x = standard_a.x().get_value().lo;
435 fq standard_a_y = standard_a.y().get_value().lo;
437 fq standard_b_x = standard_b.x().get_value().lo;
438 fq standard_b_y = standard_b.y().get_value().lo;
441 EXPECT_EQ(standard_a_x, 0);
442 EXPECT_EQ(standard_a_y, 0);
443 EXPECT_EQ(standard_b_x, 0);
444 EXPECT_EQ(standard_b_y, 0);
453 size_t num_repetitions = 10;
454 for (
size_t i = 0; i < num_repetitions; ++i) {
462 uint256_t c_x_u256 = c.x().get_value().lo;
463 uint256_t c_y_u256 = c.y().get_value().lo;
465 fq c_x_result(c_x_u256);
466 fq c_y_result(c_y_u256);
468 EXPECT_EQ(c_x_result, c_expected.x);
469 EXPECT_EQ(c_y_result, c_expected.y);
478 size_t num_repetitions = 10;
479 for (
size_t i = 0; i < num_repetitions; ++i) {
489 EXPECT_EQ(
fq(result_x), expected.x);
490 EXPECT_EQ(
fq(result_y), expected.y);
498 size_t num_repetitions = 1;
499 for (
size_t i = 0; i < num_repetitions; ++i) {
502 input_b.self_set_infinity();
522 EXPECT_EQ(c.get_value(), c_expected);
523 EXPECT_EQ(d.get_value(), d_expected);
524 EXPECT_EQ(e.get_value(), e_expected);
525 EXPECT_EQ(f.get_value(), f_expected);
526 EXPECT_EQ(g.get_value(), g_expected);
527 EXPECT_EQ(h.get_value(), h_expected);
537 size_t num_repetitions = 10;
538 for (
size_t i = 0; i < num_repetitions; ++i) {
545 uint256_t result_x = result.x().get_value().lo;
546 uint256_t result_y = result.y().get_value().lo;
548 EXPECT_EQ(
fq(result_x), expected.x);
549 EXPECT_EQ(
fq(result_y), expected.y);
558 size_t num_repetitions = 10;
559 for (
size_t i = 0; i < num_repetitions; ++i) {
563 element_ct result =
a.checked_unconditional_subtract(
b);
566 uint256_t result_x = result.x().get_value().lo;
567 uint256_t result_y = result.y().get_value().lo;
569 EXPECT_EQ(
fq(result_x), expected.x);
570 EXPECT_EQ(
fq(result_y), expected.y);
579 size_t num_repetitions = 10;
580 for (
size_t i = 0; i < num_repetitions; ++i) {
592 uint256_t diff_x = diff.x().get_value().lo;
593 uint256_t diff_y = diff.y().get_value().lo;
595 EXPECT_EQ(
fq(sum_x), expected_sum.x);
596 EXPECT_EQ(
fq(sum_y), expected_sum.y);
597 EXPECT_EQ(
fq(diff_x), expected_diff.x);
598 EXPECT_EQ(
fq(diff_y), expected_diff.y);
606 size_t num_repetitions = 10;
607 for (
size_t i = 0; i < num_repetitions; ++i) {
614 uint256_t c_x_u256 = c.x().get_value().lo;
615 uint256_t c_y_u256 = c.y().get_value().lo;
617 fq c_x_result(c_x_u256);
618 fq c_y_result(c_y_u256);
620 EXPECT_EQ(c_x_result, c_expected.x);
621 EXPECT_EQ(c_y_result, c_expected.y);
632 input_infinity.self_set_infinity();
635 element_ct result_infinity = a_infinity.dbl();
652 uint256_t result_x = result_normal.x().get_value().lo;
653 uint256_t result_y = result_normal.y().get_value().lo;
654 fq expected_x(result_x);
655 fq expected_y(result_y);
656 EXPECT_EQ(expected_x, expected_normal.x);
657 EXPECT_EQ(expected_y, expected_normal.y);
674 auto x_coord = element_ct::BaseField::from_witness(&
builder, test_point.x);
675 auto y_coord = element_ct::BaseField::from_witness(&
builder,
fq(0));
689 size_t num_repetitions = 5;
690 for (
size_t i = 0; i < num_repetitions; ++i) {
699 uint256_t dbl_x = doubled.x().get_value().lo;
700 uint256_t dbl_y = doubled.y().get_value().lo;
702 EXPECT_EQ(
fq(sum_x),
fq(dbl_x));
703 EXPECT_EQ(
fq(sum_y),
fq(dbl_y));
713 size_t num_repetitions = 5;
714 for (
size_t i = 0; i < num_repetitions; ++i) {
722 uint256_t result_x = result.x().get_value().lo;
723 uint256_t result_y = result.y().get_value().lo;
724 uint256_t expected_x = expected.x().get_value().lo;
725 uint256_t expected_y = expected.y().get_value().lo;
727 EXPECT_EQ(
fq(result_x),
fq(expected_x));
728 EXPECT_EQ(
fq(result_y),
fq(expected_y));
738 size_t num_repetitions = 10;
739 for (
size_t i = 0; i < num_repetitions; ++i) {
745 auto acc = element_ct::chain_add_start(
a,
b);
746 auto acc_out = element_ct::chain_add(c, acc);
747 element_ct result = element_ct::chain_add_end(acc_out);
751 uint256_t result_x = result.x().get_value().lo;
752 uint256_t result_y = result.y().get_value().lo;
753 EXPECT_EQ(
fq(result_x), expected.x);
754 EXPECT_EQ(
fq(result_y), expected.y);
757 auto lambda_prev = (input_b.y - input_a.y) / (input_b.x - input_a.x);
758 auto x3_prev = lambda_prev * lambda_prev - input_b.x - input_a.x;
759 auto y3_prev = lambda_prev * (input_a.x - x3_prev) - input_a.y;
760 auto lambda = (y3_prev - input_c.y) / (x3_prev - input_c.x);
761 auto x3 = lambda * lambda - x3_prev - input_c.x;
763 uint256_t x3_u256 = acc_out.x3_prev.get_value().lo;
764 uint256_t lambda_u256 = acc_out.lambda_prev.get_value().lo;
766 fq x3_result(x3_u256);
767 fq lambda_result(lambda_u256);
769 EXPECT_EQ(x3_result, x3);
770 EXPECT_EQ(lambda_result, lambda);
779 size_t num_repetitions = 10;
780 for (
size_t i = 0; i < num_repetitions; ++i) {
785 for (
size_t j = 0; j < i; ++j) {
790 typename element_ct::chain_add_accumulator add_1 =
791 element_ct::chain_add_start(add_1_big_0, add_2_big_0);
792 to_add.emplace_back(add_1);
794 acc_big.multiple_montgomery_ladder(to_add);
803 size_t num_repetitions = 10;
804 for (
size_t i = 0; i < num_repetitions; ++i) {
812 uint256_t x_after = normalized.x().get_value().lo;
813 uint256_t y_after = normalized.y().get_value().lo;
815 EXPECT_EQ(
fq(x_before),
fq(x_after));
816 EXPECT_EQ(
fq(y_before),
fq(y_after));
824 size_t num_repetitions = 10;
825 for (
size_t i = 0; i < num_repetitions; ++i) {
833 uint256_t x_after = reduced.x().get_value().lo;
834 uint256_t y_after = reduced.y().get_value().lo;
836 EXPECT_EQ(
fq(x_before),
fq(x_after));
837 EXPECT_EQ(
fq(y_before),
fq(y_after));
855 EXPECT_EQ(
fq(neg_x), expected.x);
856 EXPECT_EQ(
fq(neg_y), expected.y);
865 size_t num_repetitions = 10;
866 for (
size_t i = 0; i < num_repetitions; ++i) {
878 EXPECT_EQ(c.get_value(), c_expected);
888 size_t num_repetitions = 10;
889 for (
size_t i = 0; i < num_repetitions; ++i) {
900 EXPECT_EQ(c.get_value(), c_expected);
910 size_t num_repetitions = 10;
911 for (
size_t i = 0; i < num_repetitions; ++i) {
916 a.incomplete_assert_equal(
b,
"elements don't match");
923 size_t num_repetitions = 10;
924 for (
size_t i = 0; i < num_repetitions; ++i) {
926 input_a.self_set_infinity();
930 a.incomplete_assert_equal(
b,
"elements don't match");
940 a.incomplete_assert_equal(
a,
"self assertion test");
954 while (input_a == input_b) {
955 input_b = element::random_element();
960 a.incomplete_assert_equal(
b,
"elements don't match");
964 EXPECT_EQ(
builder.failed(),
true);
965 EXPECT_EQ(
builder.err(),
"elements don't match (x coordinate)");
976 input_b.y = -input_a.y;
979 auto x_coord = element_ct::BaseField::from_witness(&
builder, input_a.x);
980 auto y_coord_a = element_ct::BaseField::from_witness(&
builder, input_a.y);
981 auto y_coord_b = element_ct::BaseField::from_witness(&
builder, input_b.y);
987 a.incomplete_assert_equal(
b,
"elements don't match");
990 EXPECT_EQ(
builder.failed(),
true);
991 EXPECT_EQ(
builder.err(),
"elements don't match (y coordinate)");
999 input_a.self_set_infinity();
1003 a.incomplete_assert_equal(
b,
"infinity flag mismatch test");
1005 EXPECT_EQ(
builder.failed(),
true);
1008 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (x coordinate)");
1010 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (infinity flag)");
1018 size_t max_num_bits = 254;
1024 scalar_raw = scalar_raw >> (256 -
length);
1026 scalar_val =
fr(scalar_raw);
1029 if (scalar_val ==
fr(0)) {
1033 auto naf = element_ct::compute_naf(scalar,
length);
1036 fr reconstructed_val(0);
1037 for (
size_t i = 0; i <
length; i++) {
1040 reconstructed_val -=
fr(naf[
length].get_value());
1041 EXPECT_EQ(scalar_val, reconstructed_val);
1056 auto naf = element_ct::compute_naf(scalar,
length);
1059 fr reconstructed_val(0);
1061 for (
size_t i = 0; i <
length; i++) {
1063 reconstructed_u256 +=
1066 reconstructed_val -=
fr(naf[
length].get_value());
1067 EXPECT_EQ(scalar_val, reconstructed_val);
1083 scalar_raw = (scalar_raw >> 136) << 136;
1084 fr scalar_val =
fr(scalar_raw);
1086 scalar.set_origin_tag(submitted_value_origin_tag);
1092 auto naf = element_ct::compute_naf(scalar,
length);
1095 for (
const auto& bit : naf) {
1096 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1100 fr reconstructed_val(0);
1101 for (
size_t i = 0; i <
length; i++) {
1104 reconstructed_val -=
fr(naf[
length].get_value());
1106 EXPECT_EQ(scalar_val, reconstructed_val);
1113 size_t num_repetitions = 1;
1114 for (
size_t i = 0; i < num_repetitions; ++i) {
1123 fq c_x_result(c.x().get_value().lo);
1124 fq c_y_result(c.y().get_value().lo);
1126 EXPECT_EQ(c_x_result, c_expected.x);
1127 EXPECT_EQ(c_y_result, c_expected.y);
1144 bool expected_is_inf = expected.is_point_at_infinity();
1146 EXPECT_EQ(result_is_inf, expected_is_inf);
1149 if (!expected_is_inf) {
1150 uint256_t result_x = result.x().get_value().lo;
1151 uint256_t result_y = result.y().get_value().lo;
1153 EXPECT_EQ(
fq(result_x), expected.x);
1154 EXPECT_EQ(
fq(result_y), expected.y);
1164 run_mul_and_check(P, x, expected_infinity);
1170 P = element_ct::constant_infinity(&
builder);
1172 input.self_set_infinity();
1173 P = element_ct::from_witness(&
builder, input);
1178 run_mul_and_check(P, x, expected_infinity);
1185 run_mul_and_check(P, one, input);
1190 fr neg_one = -
fr(1);
1194 run_mul_and_check(P, neg_one_ct, expected);
1204 std::vector<size_t> test_lengths = { 2, 3, 10, 11, 31, 32, 63, 64, 127, 128, 252, 253 };
1206 for (
size_t i : test_lengths) {
1211 scalar_raw = scalar_raw >> (256 - i);
1212 fr scalar =
fr(scalar_raw);
1215 if (scalar ==
fr(0)) {
1228 fq c_x_result(c.x().get_value().lo);
1229 fq c_y_result(c.y().get_value().lo);
1231 EXPECT_EQ(c_x_result, c_expected.x);
1233 EXPECT_EQ(c_y_result, c_expected.y);
1248 points[0] = element::infinity();
1249 points[1] = element::random_element();
1251 std::vector<size_t> gates(2);
1254 bool expect_infinity =
true;
1256 for (
auto [point, num_gates] :
zip_view(points, gates)) {
1259 const size_t max_num_bits = 128;
1263 scalar_raw = scalar_raw >> (256 - max_num_bits);
1264 fr scalar =
fr(scalar_raw);
1270 element_ct c = P.scalar_mul(x, max_num_bits);
1272 num_gates =
builder.get_num_finalized_gates_inefficient();
1277 expect_infinity =
false;
1281 EXPECT_GT(gates[0], gates[1]);
1287 size_t num_repetitions = 1;
1288 for (
size_t i = 0; i < num_repetitions; ++i) {
1293 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1296 if ((
uint256_t(scalar_b).get_bit(0) & 1) == 0) {
1304 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b });
1309 fq c_x_result(c.x().get_value().lo);
1310 fq c_y_result(c.y().get_value().lo);
1312 EXPECT_EQ(c_x_result, expected.x);
1313 EXPECT_EQ(c_y_result, expected.y);
1321 size_t num_repetitions = 1;
1322 for (
size_t i = 0; i < num_repetitions; ++i) {
1325 input_b.self_set_infinity();
1328 const size_t max_num_bits = 128;
1330 scalar_raw_a = scalar_raw_a >> (256 - max_num_bits);
1331 fr scalar_a =
fr(scalar_raw_a);
1334 scalar_raw_b = scalar_raw_b >> (256 - max_num_bits);
1335 fr scalar_b =
fr(scalar_raw_b);
1342 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b }, 128);
1347 fq c_x_result(c.x().get_value().lo);
1348 fq c_y_result(c.y().get_value().lo);
1350 EXPECT_EQ(c_x_result, expected.x);
1351 EXPECT_EQ(c_y_result, expected.y);
1374 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1378 for (
size_t i = 0; i < 3; ++i) {
1380 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1381 scalars.emplace_back(scalar);
1382 points.emplace_back(point);
1387 const auto get_128_bit_scalar = []() {
1391 fr scalar(scalar_u256);
1394 fr masking_scalar = get_128_bit_scalar();
1395 scalar_ct masking_scalar_ct = scalar_ct::from_witness(&
builder, masking_scalar);
1406 fq c_x_result(c.x().get_value().lo);
1407 fq c_y_result(c.y().get_value().lo);
1409 EXPECT_EQ(c_x_result, expected.x);
1410 EXPECT_EQ(c_y_result, expected.y);
1429 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1433 for (
size_t i = 0; i < 3; ++i) {
1435 points.emplace_back(point);
1437 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1438 scalars.emplace_back(scalar);
1443 element_ct::batch_mul(points, scalars, 4,
false);
1446 EXPECT_EQ(
builder.err(),
"bigfield: prime limb diff is zero, but expected non-zero");
1452 size_t num_repetitions = 1;
1453 for (
size_t i = 0; i < num_repetitions; ++i) {
1455 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1463 fq c_x_result(c.x().get_value().lo);
1464 fq c_y_result(c.y().get_value().lo);
1466 EXPECT_EQ(c_x_result, expected.x);
1467 EXPECT_EQ(c_y_result, expected.y);
1475 const bool short_scalars =
false,
1476 const bool with_edgecases =
false)
1485 const bool short_scalars =
false,
1486 const bool with_edgecases =
false)
1490 const size_t num_points = point_types.size();
1492 std::vector<fr> scalars;
1496 for (
size_t i = 0; i < num_points; ++i) {
1498 if (short_scalars) {
1500 scalars.push_back(input_scalar);
1501 circuit_scalars.push_back(x);
1504 scalars.push_back(input_scalar);
1505 circuit_scalars.push_back(x);
1510 points.push_back(input_point);
1511 circuit_points.push_back(P);
1515 const auto get_128_bit_scalar = []() {
1519 fr scalar(scalar_u256);
1522 fr masking_scalar = with_edgecases ? get_128_bit_scalar() :
fr(1);
1526 element_ct result_point = element_ct::batch_mul(
1527 circuit_points, circuit_scalars, 0, with_edgecases, masking_scalar_ct);
1531 for (
size_t i = 0; i < num_points; ++i) {
1532 expected_point += (
element(points[i]) * scalars[i]);
1535 expected_point = expected_point.normalize();
1536 fq result_x(result_point.x().get_value().lo);
1537 fq result_y(result_point.y().get_value().lo);
1539 EXPECT_EQ(result_x, expected_point.x);
1540 EXPECT_EQ(result_y, expected_point.y);
1547 const size_t num_points = 5;
1550 std::vector<fr> scalars;
1551 for (
size_t i = 0; i < num_points; ++i) {
1558 for (
size_t i = 0; i < num_points; ++i) {
1559 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1560 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1563 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
1567 for (
size_t i = 0; i < num_points; ++i) {
1568 expected_point += (
element(points[i]) * scalars[i]);
1571 expected_point = expected_point.normalize();
1572 fq result_x(result_point.x().get_value().lo);
1573 fq result_y(result_point.y().get_value().lo);
1575 EXPECT_EQ(result_x, expected_point.x);
1576 EXPECT_EQ(result_y, expected_point.y);
1583 const size_t num_points = 5;
1586 std::vector<fr> scalars;
1587 for (
size_t i = 0; i < num_points; ++i) {
1594 for (
size_t i = 0; i < num_points; ++i) {
1595 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1596 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1600 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1604 for (
size_t i = 0; i < num_points; ++i) {
1605 expected_point += (
element(points[i]) * scalars[i]);
1608 expected_point = expected_point.normalize();
1610 fq result2_x(result_point2.x().get_value().lo);
1611 fq result2_y(result_point2.y().get_value().lo);
1613 EXPECT_EQ(result2_x, expected_point.x);
1614 EXPECT_EQ(result2_y, expected_point.y);
1621 const auto test_repeated_points = [](
const uint32_t num_points) {
1623 info(
"num points: ", num_points);
1625 std::vector<fr> scalars;
1626 for (
size_t idx = 0; idx < num_points; idx++) {
1627 points.push_back(affine_element::one());
1628 scalars.push_back(1);
1632 ASSERT_EQ(points.size(), scalars.size());
1636 for (
size_t i = 0; i < num_points; ++i) {
1637 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1638 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1641 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1643 auto expected_point = element::infinity();
1644 for (
const auto& point : points) {
1645 expected_point += point;
1647 expected_point = expected_point.normalize();
1649 fq result_x(result_point.x().get_value().lo);
1650 fq result_y(result_point.y().get_value().lo);
1652 EXPECT_EQ(result_x, expected_point.x);
1653 EXPECT_EQ(result_y, expected_point.y);
1657 test_repeated_points(2);
1658 test_repeated_points(3);
1659 test_repeated_points(4);
1660 test_repeated_points(5);
1661 test_repeated_points(6);
1662 test_repeated_points(7);
1669 points.push_back(affine_element::infinity());
1671 std::vector<fr> scalars;
1672 scalars.push_back(1);
1673 scalars.push_back(1);
1676 ASSERT_EQ(points.size(), scalars.size());
1677 const size_t num_points = points.size();
1681 for (
size_t i = 0; i < num_points; ++i) {
1682 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1683 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1687 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1689 element expected_point = points[1];
1690 expected_point = expected_point.normalize();
1692 fq result_x(result_point.x().get_value().lo);
1693 fq result_y(result_point.y().get_value().lo);
1695 EXPECT_EQ(result_x, expected_point.x);
1696 EXPECT_EQ(result_y, expected_point.y);
1705 std::vector<fr> scalars;
1706 scalars.push_back(0);
1707 scalars.push_back(1);
1710 ASSERT_EQ(points.size(), scalars.size());
1711 const size_t num_points = points.size();
1715 for (
size_t i = 0; i < num_points; ++i) {
1716 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1717 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1721 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1723 element expected_point = points[1];
1724 expected_point = expected_point.normalize();
1726 fq result_x(result_point.x().get_value().lo);
1727 fq result_y(result_point.y().get_value().lo);
1729 EXPECT_EQ(result_x, expected_point.x);
1730 EXPECT_EQ(result_y, expected_point.y);
1741 std::vector<fr> scalars;
1743 for (
size_t i = 0; i < 5; ++i) {
1744 points.push_back(affine_element::infinity());
1751 for (
size_t i = 0; i < points.size(); ++i) {
1752 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1753 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1756 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1768 std::vector<fr> scalars;
1770 for (
size_t i = 0; i < 5; ++i) {
1778 for (
size_t i = 0; i < points.size(); ++i) {
1779 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1780 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1783 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1795 std::vector<fr> scalars;
1797 for (
size_t i = 0; i < 6; ++i) {
1806 for (
size_t i = 0; i < points.size(); ++i) {
1807 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1808 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1811 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1814 element expected = element::infinity();
1815 for (
size_t i = 0; i < points.size(); ++i) {
1816 expected += (
element(points[i]) * scalars[i]);
1820 uint256_t result_x = result.x().get_value().lo;
1821 uint256_t result_y = result.y().get_value().lo;
1823 EXPECT_EQ(
fq(result_x), expected_affine.x);
1824 EXPECT_EQ(
fq(result_y), expected_affine.y);
1834 std::vector<fr> scalars;
1836 for (
size_t i = 0; i < 6; ++i) {
1838 points.push_back((i % 2 == 0) ? affine_element::infinity() :
affine_element(element::random_element()));
1845 for (
size_t i = 0; i < points.size(); ++i) {
1846 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1847 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1850 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1853 element expected = element::infinity();
1854 for (
size_t i = 0; i < points.size(); ++i) {
1855 if (!points[i].is_point_at_infinity()) {
1856 expected += (
element(points[i]) * scalars[i]);
1861 uint256_t result_x = result.x().get_value().lo;
1862 uint256_t result_y = result.y().get_value().lo;
1864 EXPECT_EQ(
fq(result_x), expected_affine.x);
1865 EXPECT_EQ(
fq(result_y), expected_affine.y);
1875 std::vector<fr> scalars;
1882 points.push_back(P);
1883 scalars.push_back(scalar);
1884 points.push_back(neg_P);
1885 scalars.push_back(scalar);
1888 for (
size_t i = 0; i < 3; ++i) {
1896 for (
size_t i = 0; i < points.size(); ++i) {
1897 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1898 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1901 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1904 element expected = element::infinity();
1905 for (
size_t i = 0; i < points.size(); ++i) {
1906 expected += (
element(points[i]) * scalars[i]);
1910 uint256_t result_x = result.x().get_value().lo;
1911 uint256_t result_y = result.y().get_value().lo;
1913 EXPECT_EQ(
fq(result_x), expected_affine.x);
1914 EXPECT_EQ(
fq(result_y), expected_affine.y);
1924 std::vector<fr> scalars_native;
1929 for (
size_t i = 0; i < 3; ++i) {
1932 points_native.push_back(point);
1933 scalars_native.push_back(scalar);
1934 circuit_points.push_back(point_ct);
1939 for (
size_t i = 0; i < 3; ++i) {
1942 points_native.push_back(point);
1943 scalars_native.push_back(scalar);
1944 circuit_points.push_back(point_ct);
1949 for (
size_t i = 0; i < 4; ++i) {
1952 points_native.push_back(point);
1953 scalars_native.push_back(scalar);
1954 circuit_points.push_back(
element_ct(point.x, point.y));
1955 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalar));
1959 for (
size_t i = 0; i < 4; ++i) {
1962 points_native.push_back(point);
1963 scalars_native.push_back(scalar);
1964 circuit_points.push_back(point_ct);
1968 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
1971 element expected = element::infinity();
1972 for (
size_t i = 0; i < points_native.size(); ++i) {
1973 expected += (
element(points_native[i]) * scalars_native[i]);
1977 uint256_t result_x = result.x().get_value().lo;
1978 uint256_t result_y = result.y().get_value().lo;
1980 EXPECT_EQ(
fq(result_x), expected_affine.x);
1981 EXPECT_EQ(
fq(result_y), expected_affine.y);
1991 std::vector<fr> scalars;
1992 constexpr size_t num_points = 20;
1994 for (
size_t i = 0; i < num_points; ++i) {
2002 for (
size_t i = 0; i < points.size(); ++i) {
2003 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2004 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2007 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
2010 element expected = element::infinity();
2011 for (
size_t i = 0; i < points.size(); ++i) {
2012 expected += (
element(points[i]) * scalars[i]);
2016 uint256_t result_x = result.x().get_value().lo;
2017 uint256_t result_y = result.y().get_value().lo;
2019 EXPECT_EQ(
fq(result_x), expected_affine.x);
2020 EXPECT_EQ(
fq(result_y), expected_affine.y);
2035 EXPECT_EQ(
fq(inf.x().get_value().lo),
fq(0));
2036 EXPECT_EQ(
fq(inf.y().get_value().lo),
fq(0));
2048 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2049 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2059 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2060 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2070 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2071 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2080 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2081 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2102 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2103 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2117 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2118 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2132 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2133 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2151 element_ct result =
a.conditional_select(inf, pred);
2154 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2155 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2161 element_ct result =
a.conditional_select(inf, pred);
2170 element_ct result = inf.conditional_select(inf2, pred);
2188 element_ct result = inf.conditional_negate(pred);
2191 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2192 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2198 element_ct result = inf.conditional_negate(pred);
2217 EXPECT_EQ(
fq(P.x().get_value().lo),
fq(0));
2218 EXPECT_EQ(
fq(P.y().get_value().lo),
fq(0));
2222 element_ct standardized = P.get_standard_form();
2224 EXPECT_EQ(
fq(standardized.x().get_value().lo),
fq(0));
2225 EXPECT_EQ(
fq(standardized.y().get_value().lo),
fq(0));
2236 auto x_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2237 auto y_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2259 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2260 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2271 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2272 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2299 element_ct::from_witness(&
builder, P),
2300 element_ct::from_witness(&
builder, Q),
2301 element_ct::from_witness(&
builder, P),
2302 element_ct::from_witness(&
builder, Q),
2306 scalar_ct::from_witness(&
builder,
b),
2307 scalar_ct::from_witness(&
builder, -
a),
2308 scalar_ct::from_witness(&
builder, -
b) };
2310 element_ct result = element_ct::batch_mul(points, scalars, 0,
true);
2313 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2314 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2332 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2333 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2338 EXPECT_EQ(
fq(result2.x().get_value().lo), input.x);
2339 EXPECT_EQ(
fq(result2.y().get_value().lo), input.y);
2360 EXPECT_EQ(
fq(result.x().get_value().lo), input2.x);
2361 EXPECT_EQ(
fq(result.y().get_value().lo), input2.y);
2365 EXPECT_EQ(
fq(result2.x().get_value().lo), input2.x);
2366 EXPECT_EQ(
fq(result2.y().get_value().lo), input2.y);
2403 using Builder = TestFixture::Builder;
2404 using element_ct = TestFixture::element_ct;
2405 using Fq = TestFixture::Curve::BaseField;
2406 using FqNative = TestFixture::Curve::BaseFieldNative;
2407 using GroupNative = TestFixture::Curve::GroupNative;
2410 auto [native_point, witness_point] = TestFixture::get_random_witness_point(&
builder);
2413 Fq expected_zero = witness_point.validate_on_curve(
"biggroup::validate_on_curve",
false);
2414 expected_zero.assert_equal(
Fq::zero());
2415 EXPECT_EQ(expected_zero.get_value(),
static_cast<uint512_t>(FqNative::zero()));
2418 Fq random_x = Fq::from_witness(&
builder, FqNative::random_element());
2419 Fq random_y = Fq::from_witness(&
builder, FqNative::random_element());
2420 element_ct invalid_point(random_x, random_y,
false);
2421 Fq expected_non_zero = invalid_point.validate_on_curve(
"biggroup::validate_on_curve",
false);
2422 Fq expected_value = -random_y.
sqr() + random_x.
pow(3) +
Fq(
uint256_t(GroupNative::curve_b));
2423 if constexpr (GroupNative::has_a) {
2424 expected_value += random_x *
Fq(
uint256_t(GroupNative::curve_a));
2426 expected_non_zero.assert_equal(expected_value);
2429 expected_non_zero.self_reduce();
2430 expected_value.self_reduce();
2431 EXPECT_EQ(expected_non_zero.get_value(), expected_value.get_value());
2433 TestFixture::EXPECT_CIRCUIT_CORRECTNESS(
builder);
2436 [[maybe_unused]]
Fq _ = invalid_point.validate_on_curve();
2437 TestFixture::EXPECT_CIRCUIT_CORRECTNESS(
builder,
false);
2443 TestFixture::test_basic_tag_logic();
2448 TestFixture::test_assert_coordinates_in_field();
2454 TestFixture::test_add();
2464 TestFixture::test_add_points_at_infinity();
2468 TestFixture::test_standard_form_of_point_at_infinity();
2474 TestFixture::test_sub();
2484 TestFixture::test_sub_points_at_infinity();
2488 TestFixture::test_dbl();
2496 TestFixture::test_dbl_with_infinity();
2501 GTEST_SKIP() <<
"mega builder does not support this edge case";
2503 TestFixture::test_dbl_with_y_zero();
2508 TestFixture::test_add_equals_dbl();
2512 TestFixture::test_sub_neg_equals_double();
2519 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2521 TestFixture::test_chain_add();
2527 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2544 GTEST_SKIP() <<
"mega builder does not implement multiple_montgomery_ladder function";
2546 TestFixture::test_multiple_montgomery_ladder();
2553 TestFixture::test_normalize();
2563 TestFixture::test_reduce();
2628 TestFixture::test_checked_unconditional_add_sub();
2639 TestFixture::test_conditional_negate();
2650 TestFixture::test_conditional_select();
2664 TestFixture::test_incomplete_assert_equal();
2668 TestFixture::test_incomplete_assert_equal_failure();
2674 size_t num_repetitions = 1;
2675 for (
size_t i = 0; i < num_repetitions; i++) {
2676 TestFixture::test_compute_naf();
2679 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2686 TestFixture::test_compute_naf_zero();
2688 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2695 TestFixture::test_compute_naf_overflow_lower_half();
2697 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2703 TestFixture::test_mul();
2713 TestFixture::test_mul_edge_cases();
2725 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2727 TestFixture::test_short_scalar_mul_with_bit_lengths();
2734 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2736 TestFixture::test_short_scalar_mul_infinity();
2744 TestFixture::test_helper_batch_mul(1);
2750 TestFixture::test_helper_batch_mul(2);
2754 TestFixture::test_helper_batch_mul(2,
true);
2758 TestFixture::test_helper_batch_mul(2,
false,
true);
2762 TestFixture::test_helper_batch_mul(2,
true,
true);
2773 TestFixture::test_helper_batch_mul(3);
2779 TestFixture::test_helper_batch_mul(4);
2785 TestFixture::test_helper_batch_mul(5);
2789 TestFixture::test_helper_batch_mul(5,
false,
true);
2793 TestFixture::test_helper_batch_mul(5,
true);
2797 TestFixture::test_helper_batch_mul(5,
true,
true);
2801 TestFixture::test_helper_batch_mul(
2809 TestFixture::test_helper_batch_mul(6);
2814 TestFixture::test_twin_mul();
2819 TestFixture::test_twin_mul_with_infinity();
2824 TestFixture::test_batch_mul_linearly_dependent_generators();
2830 GTEST_SKIP() <<
"this failure test is designed for ultra builder only";
2832 TestFixture::test_batch_mul_linearly_dependent_generators_failure();
2838 TestFixture::test_one();
2843 TestFixture::test_batch_mul();
2848 TestFixture::test_batch_mul_edgecase_equivalence();
2852 TestFixture::test_batch_mul_edge_case_set1();
2857 TestFixture::test_batch_mul_edge_case_set2();
2863 TestFixture::test_batch_mul_all_infinity();
2868 TestFixture::test_batch_mul_all_zero_scalars();
2873 TestFixture::test_batch_mul_mixed_zero_scalars();
2878 TestFixture::test_batch_mul_mixed_infinity();
2883 TestFixture::test_batch_mul_cancellation();
2888 TestFixture::test_batch_mul_mixed_constant_witness();
2893 TestFixture::test_batch_mul_large_number_of_points();
2899 TestFixture::test_infinity_canonical_representation();
2904 TestFixture::test_infinity_chained_operations();
2909 TestFixture::test_conditional_select_with_infinity();
2914 TestFixture::test_conditional_negate_with_infinity();
2919 TestFixture::test_get_standard_form_normalizes_infinity();
2924 TestFixture::test_infinity_auto_detection_in_constructor();
2929 TestFixture::test_scalar_mul_infinity_edge_cases();
2934 TestFixture::test_batch_mul_complete_cancellation();
2939 TestFixture::test_add_constant_infinity();
2944 TestFixture::test_witness_infinity_from_operations();
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
#define BB_DISABLE_ASSERTS()
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
BB_INLINE constexpr field pow(const uint256_t &exponent) const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const 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)
curve::BN254::BaseField Fq