1#include "../biggroup/biggroup.hpp"
2#include "../bigfield/bigfield.hpp"
3#include "../bool/bool.hpp"
4#include "../field/field.hpp"
39template <
typename Curve_,
typename ScalarField_,
bool use_bigfield>
struct TestType {
44 element<typename Curve::Builder, typename Curve::BaseField, ScalarField_, typename Curve::GroupNative>;
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);
1396 fq c_x_result(c.x().get_value().lo);
1397 fq c_y_result(c.y().get_value().lo);
1399 EXPECT_EQ(c_x_result, expected.x);
1400 EXPECT_EQ(c_y_result, expected.y);
1419 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1423 for (
size_t i = 0; i < 3; ++i) {
1425 points.emplace_back(point);
1427 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1428 scalars.emplace_back(scalar);
1433 element_ct::batch_mul(points, scalars, 4,
false);
1436 EXPECT_EQ(
builder.err(),
"bigfield: prime limb diff is zero, but expected non-zero");
1442 size_t num_repetitions = 1;
1443 for (
size_t i = 0; i < num_repetitions; ++i) {
1445 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1453 fq c_x_result(c.x().get_value().lo);
1454 fq c_y_result(c.y().get_value().lo);
1456 EXPECT_EQ(c_x_result, expected.x);
1457 EXPECT_EQ(c_y_result, expected.y);
1465 const bool short_scalars =
false,
1466 const bool with_edgecases =
false)
1475 const bool short_scalars =
false,
1476 const bool with_edgecases =
false)
1480 const size_t num_points = point_types.size();
1482 std::vector<fr> scalars;
1486 for (
size_t i = 0; i < num_points; ++i) {
1488 if (short_scalars) {
1490 scalars.push_back(input_scalar);
1491 circuit_scalars.push_back(x);
1494 scalars.push_back(input_scalar);
1495 circuit_scalars.push_back(x);
1500 points.push_back(input_point);
1501 circuit_points.push_back(P);
1505 element_ct::batch_mul(circuit_points, circuit_scalars, 0, with_edgecases);
1509 for (
size_t i = 0; i < num_points; ++i) {
1510 expected_point += (
element(points[i]) * scalars[i]);
1513 expected_point = expected_point.normalize();
1514 fq result_x(result_point.x().get_value().lo);
1515 fq result_y(result_point.y().get_value().lo);
1517 EXPECT_EQ(result_x, expected_point.x);
1518 EXPECT_EQ(result_y, expected_point.y);
1525 const size_t num_points = 5;
1528 std::vector<fr> scalars;
1529 for (
size_t i = 0; i < num_points; ++i) {
1536 for (
size_t i = 0; i < num_points; ++i) {
1537 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1538 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1541 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
1545 for (
size_t i = 0; i < num_points; ++i) {
1546 expected_point += (
element(points[i]) * scalars[i]);
1549 expected_point = expected_point.normalize();
1550 fq result_x(result_point.x().get_value().lo);
1551 fq result_y(result_point.y().get_value().lo);
1553 EXPECT_EQ(result_x, expected_point.x);
1554 EXPECT_EQ(result_y, expected_point.y);
1561 const size_t num_points = 5;
1564 std::vector<fr> scalars;
1565 for (
size_t i = 0; i < num_points; ++i) {
1572 for (
size_t i = 0; i < num_points; ++i) {
1573 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1574 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1578 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1582 for (
size_t i = 0; i < num_points; ++i) {
1583 expected_point += (
element(points[i]) * scalars[i]);
1586 expected_point = expected_point.normalize();
1588 fq result2_x(result_point2.x().get_value().lo);
1589 fq result2_y(result_point2.y().get_value().lo);
1591 EXPECT_EQ(result2_x, expected_point.x);
1592 EXPECT_EQ(result2_y, expected_point.y);
1599 const auto test_repeated_points = [](
const uint32_t num_points) {
1601 info(
"num points: ", num_points);
1603 std::vector<fr> scalars;
1604 for (
size_t idx = 0; idx < num_points; idx++) {
1605 points.push_back(affine_element::one());
1606 scalars.push_back(1);
1610 ASSERT_EQ(points.size(), scalars.size());
1614 for (
size_t i = 0; i < num_points; ++i) {
1615 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1616 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1619 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1621 auto expected_point = element::infinity();
1622 for (
const auto& point : points) {
1623 expected_point += point;
1625 expected_point = expected_point.normalize();
1627 fq result_x(result_point.x().get_value().lo);
1628 fq result_y(result_point.y().get_value().lo);
1630 EXPECT_EQ(result_x, expected_point.x);
1631 EXPECT_EQ(result_y, expected_point.y);
1635 test_repeated_points(2);
1636 test_repeated_points(3);
1637 test_repeated_points(4);
1638 test_repeated_points(5);
1639 test_repeated_points(6);
1640 test_repeated_points(7);
1647 points.push_back(affine_element::infinity());
1649 std::vector<fr> scalars;
1650 scalars.push_back(1);
1651 scalars.push_back(1);
1654 ASSERT_EQ(points.size(), scalars.size());
1655 const size_t num_points = points.size();
1659 for (
size_t i = 0; i < num_points; ++i) {
1660 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1661 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1665 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1667 element expected_point = points[1];
1668 expected_point = expected_point.normalize();
1670 fq result_x(result_point.x().get_value().lo);
1671 fq result_y(result_point.y().get_value().lo);
1673 EXPECT_EQ(result_x, expected_point.x);
1674 EXPECT_EQ(result_y, expected_point.y);
1683 std::vector<fr> scalars;
1684 scalars.push_back(0);
1685 scalars.push_back(1);
1688 ASSERT_EQ(points.size(), scalars.size());
1689 const size_t num_points = points.size();
1693 for (
size_t i = 0; i < num_points; ++i) {
1694 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1695 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1699 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1701 element expected_point = points[1];
1702 expected_point = expected_point.normalize();
1704 fq result_x(result_point.x().get_value().lo);
1705 fq result_y(result_point.y().get_value().lo);
1707 EXPECT_EQ(result_x, expected_point.x);
1708 EXPECT_EQ(result_y, expected_point.y);
1719 std::vector<fr> scalars;
1721 for (
size_t i = 0; i < 5; ++i) {
1722 points.push_back(affine_element::infinity());
1729 for (
size_t i = 0; i < points.size(); ++i) {
1730 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1731 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1734 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1746 std::vector<fr> scalars;
1748 for (
size_t i = 0; i < 5; ++i) {
1756 for (
size_t i = 0; i < points.size(); ++i) {
1757 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1758 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1761 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1773 std::vector<fr> scalars;
1775 for (
size_t i = 0; i < 6; ++i) {
1784 for (
size_t i = 0; i < points.size(); ++i) {
1785 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1786 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1789 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1792 element expected = element::infinity();
1793 for (
size_t i = 0; i < points.size(); ++i) {
1794 expected += (
element(points[i]) * scalars[i]);
1798 uint256_t result_x = result.x().get_value().lo;
1799 uint256_t result_y = result.y().get_value().lo;
1801 EXPECT_EQ(
fq(result_x), expected_affine.x);
1802 EXPECT_EQ(
fq(result_y), expected_affine.y);
1812 std::vector<fr> scalars;
1814 for (
size_t i = 0; i < 6; ++i) {
1816 points.push_back((i % 2 == 0) ? affine_element::infinity() :
affine_element(element::random_element()));
1823 for (
size_t i = 0; i < points.size(); ++i) {
1824 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1825 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1828 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1831 element expected = element::infinity();
1832 for (
size_t i = 0; i < points.size(); ++i) {
1833 if (!points[i].is_point_at_infinity()) {
1834 expected += (
element(points[i]) * scalars[i]);
1839 uint256_t result_x = result.x().get_value().lo;
1840 uint256_t result_y = result.y().get_value().lo;
1842 EXPECT_EQ(
fq(result_x), expected_affine.x);
1843 EXPECT_EQ(
fq(result_y), expected_affine.y);
1853 std::vector<fr> scalars;
1860 points.push_back(P);
1861 scalars.push_back(scalar);
1862 points.push_back(neg_P);
1863 scalars.push_back(scalar);
1866 for (
size_t i = 0; i < 3; ++i) {
1874 for (
size_t i = 0; i < points.size(); ++i) {
1875 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1876 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1879 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1882 element expected = element::infinity();
1883 for (
size_t i = 0; i < points.size(); ++i) {
1884 expected += (
element(points[i]) * scalars[i]);
1888 uint256_t result_x = result.x().get_value().lo;
1889 uint256_t result_y = result.y().get_value().lo;
1891 EXPECT_EQ(
fq(result_x), expected_affine.x);
1892 EXPECT_EQ(
fq(result_y), expected_affine.y);
1902 std::vector<fr> scalars_native;
1907 for (
size_t i = 0; i < 3; ++i) {
1910 points_native.push_back(point);
1911 scalars_native.push_back(scalar);
1912 circuit_points.push_back(point_ct);
1917 for (
size_t i = 0; i < 3; ++i) {
1920 points_native.push_back(point);
1921 scalars_native.push_back(scalar);
1922 circuit_points.push_back(point_ct);
1927 for (
size_t i = 0; i < 4; ++i) {
1930 points_native.push_back(point);
1931 scalars_native.push_back(scalar);
1932 circuit_points.push_back(
element_ct(point.x, point.y));
1933 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalar));
1937 for (
size_t i = 0; i < 4; ++i) {
1940 points_native.push_back(point);
1941 scalars_native.push_back(scalar);
1942 circuit_points.push_back(point_ct);
1946 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
1949 element expected = element::infinity();
1950 for (
size_t i = 0; i < points_native.size(); ++i) {
1951 expected += (
element(points_native[i]) * scalars_native[i]);
1955 uint256_t result_x = result.x().get_value().lo;
1956 uint256_t result_y = result.y().get_value().lo;
1958 EXPECT_EQ(
fq(result_x), expected_affine.x);
1959 EXPECT_EQ(
fq(result_y), expected_affine.y);
1969 std::vector<fr> scalars;
1970 constexpr size_t num_points = 20;
1972 for (
size_t i = 0; i < num_points; ++i) {
1980 for (
size_t i = 0; i < points.size(); ++i) {
1981 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1982 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1985 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
1988 element expected = element::infinity();
1989 for (
size_t i = 0; i < points.size(); ++i) {
1990 expected += (
element(points[i]) * scalars[i]);
1994 uint256_t result_x = result.x().get_value().lo;
1995 uint256_t result_y = result.y().get_value().lo;
1997 EXPECT_EQ(
fq(result_x), expected_affine.x);
1998 EXPECT_EQ(
fq(result_y), expected_affine.y);
2013 EXPECT_EQ(
fq(inf.x().get_value().lo),
fq(0));
2014 EXPECT_EQ(
fq(inf.y().get_value().lo),
fq(0));
2026 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2027 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2037 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2038 EXPECT_EQ(
fq(result.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));
2058 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2059 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));
2095 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2096 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2110 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2111 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2129 element_ct result =
a.conditional_select(inf, pred);
2132 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2133 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2139 element_ct result =
a.conditional_select(inf, pred);
2148 element_ct result = inf.conditional_select(inf2, pred);
2166 element_ct result = inf.conditional_negate(pred);
2169 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2170 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2176 element_ct result = inf.conditional_negate(pred);
2195 EXPECT_EQ(
fq(P.x().get_value().lo),
fq(0));
2196 EXPECT_EQ(
fq(P.y().get_value().lo),
fq(0));
2200 element_ct standardized = P.get_standard_form();
2202 EXPECT_EQ(
fq(standardized.x().get_value().lo),
fq(0));
2203 EXPECT_EQ(
fq(standardized.y().get_value().lo),
fq(0));
2214 auto x_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2215 auto y_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2237 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2238 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2249 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2250 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2277 element_ct::from_witness(&
builder, P),
2278 element_ct::from_witness(&
builder, Q),
2279 element_ct::from_witness(&
builder, P),
2280 element_ct::from_witness(&
builder, Q),
2284 scalar_ct::from_witness(&
builder,
b),
2285 scalar_ct::from_witness(&
builder, -
a),
2286 scalar_ct::from_witness(&
builder, -
b) };
2288 element_ct result = element_ct::batch_mul(points, scalars, 0,
true);
2291 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2292 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2310 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2311 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2316 EXPECT_EQ(
fq(result2.x().get_value().lo), input.x);
2317 EXPECT_EQ(
fq(result2.y().get_value().lo), input.y);
2338 EXPECT_EQ(
fq(result.x().get_value().lo), input2.x);
2339 EXPECT_EQ(
fq(result.y().get_value().lo), input2.y);
2343 EXPECT_EQ(
fq(result2.x().get_value().lo), input2.x);
2344 EXPECT_EQ(
fq(result2.y().get_value().lo), input2.y);
2386 using Builder = TestFixture::Builder;
2387 using element_ct = TestFixture::element_ct;
2388 using Fq = TestFixture::Curve::BaseField;
2389 using FqNative = TestFixture::Curve::BaseFieldNative;
2390 using GroupNative = TestFixture::Curve::GroupNative;
2393 auto [native_point, witness_point] = TestFixture::get_random_witness_point(&
builder);
2396 Fq expected_zero = witness_point.validate_on_curve(
"biggroup::validate_on_curve",
false);
2397 expected_zero.assert_equal(
Fq::zero());
2398 EXPECT_EQ(expected_zero.get_value(),
static_cast<uint512_t>(FqNative::zero()));
2401 Fq random_x = Fq::from_witness(&
builder, FqNative::random_element());
2402 Fq random_y = Fq::from_witness(&
builder, FqNative::random_element());
2403 element_ct invalid_point(random_x, random_y,
false);
2404 Fq expected_non_zero = invalid_point.validate_on_curve(
"biggroup::validate_on_curve",
false);
2405 Fq expected_value = -random_y.
sqr() + random_x.
pow(3) +
Fq(
uint256_t(GroupNative::curve_b));
2406 if constexpr (GroupNative::has_a) {
2407 expected_value += random_x *
Fq(
uint256_t(GroupNative::curve_a));
2409 expected_non_zero.assert_equal(expected_value);
2412 expected_non_zero.self_reduce();
2413 expected_value.self_reduce();
2414 EXPECT_EQ(expected_non_zero.get_value(), expected_value.get_value());
2416 TestFixture::EXPECT_CIRCUIT_CORRECTNESS(
builder);
2419 [[maybe_unused]]
Fq _ = invalid_point.validate_on_curve();
2420 TestFixture::EXPECT_CIRCUIT_CORRECTNESS(
builder,
false);
2426 TestFixture::test_basic_tag_logic();
2431 TestFixture::test_assert_coordinates_in_field();
2437 TestFixture::test_add();
2447 TestFixture::test_add_points_at_infinity();
2451 TestFixture::test_standard_form_of_point_at_infinity();
2457 TestFixture::test_sub();
2467 TestFixture::test_sub_points_at_infinity();
2471 TestFixture::test_dbl();
2479 TestFixture::test_dbl_with_infinity();
2484 GTEST_SKIP() <<
"mega builder does not support this edge case";
2486 TestFixture::test_dbl_with_y_zero();
2491 TestFixture::test_add_equals_dbl();
2495 TestFixture::test_sub_neg_equals_double();
2502 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2504 TestFixture::test_chain_add();
2510 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2527 GTEST_SKIP() <<
"mega builder does not implement multiple_montgomery_ladder function";
2529 TestFixture::test_multiple_montgomery_ladder();
2536 TestFixture::test_normalize();
2546 TestFixture::test_reduce();
2611 TestFixture::test_checked_unconditional_add_sub();
2622 TestFixture::test_conditional_negate();
2633 TestFixture::test_conditional_select();
2647 TestFixture::test_incomplete_assert_equal();
2651 TestFixture::test_incomplete_assert_equal_failure();
2657 size_t num_repetitions = 1;
2658 for (
size_t i = 0; i < num_repetitions; i++) {
2659 TestFixture::test_compute_naf();
2662 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2669 TestFixture::test_compute_naf_zero();
2671 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2678 TestFixture::test_compute_naf_overflow_lower_half();
2680 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2686 TestFixture::test_mul();
2696 TestFixture::test_mul_edge_cases();
2708 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2710 TestFixture::test_short_scalar_mul_with_bit_lengths();
2717 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2719 TestFixture::test_short_scalar_mul_infinity();
2727 TestFixture::test_helper_batch_mul(1);
2733 TestFixture::test_helper_batch_mul(2);
2737 TestFixture::test_helper_batch_mul(2,
true);
2741 TestFixture::test_helper_batch_mul(2,
false,
true);
2745 TestFixture::test_helper_batch_mul(2,
true,
true);
2756 TestFixture::test_helper_batch_mul(3);
2762 TestFixture::test_helper_batch_mul(4);
2768 TestFixture::test_helper_batch_mul(5);
2772 TestFixture::test_helper_batch_mul(5,
false,
true);
2776 TestFixture::test_helper_batch_mul(5,
true);
2780 TestFixture::test_helper_batch_mul(5,
true,
true);
2784 TestFixture::test_helper_batch_mul(
2792 TestFixture::test_helper_batch_mul(6);
2797 TestFixture::test_twin_mul();
2802 TestFixture::test_twin_mul_with_infinity();
2807 TestFixture::test_batch_mul_linearly_dependent_generators();
2813 GTEST_SKIP() <<
"this failure test is designed for ultra builder only";
2815 TestFixture::test_batch_mul_linearly_dependent_generators_failure();
2821 TestFixture::test_one();
2826 TestFixture::test_batch_mul();
2831 TestFixture::test_batch_mul_edgecase_equivalence();
2835 TestFixture::test_batch_mul_edge_case_set1();
2840 TestFixture::test_batch_mul_edge_case_set2();
2846 TestFixture::test_batch_mul_all_infinity();
2851 TestFixture::test_batch_mul_all_zero_scalars();
2856 TestFixture::test_batch_mul_mixed_zero_scalars();
2861 TestFixture::test_batch_mul_mixed_infinity();
2866 TestFixture::test_batch_mul_cancellation();
2871 TestFixture::test_batch_mul_mixed_constant_witness();
2876 TestFixture::test_batch_mul_large_number_of_points();
2882 TestFixture::test_infinity_canonical_representation();
2887 TestFixture::test_infinity_chained_operations();
2892 TestFixture::test_conditional_select_with_infinity();
2897 TestFixture::test_conditional_negate_with_infinity();
2902 TestFixture::test_get_standard_form_normalizes_infinity();
2907 TestFixture::test_infinity_auto_detection_in_constructor();
2912 TestFixture::test_scalar_mul_infinity_edge_cases();
2917 TestFixture::test_batch_mul_complete_cancellation();
2922 TestFixture::test_add_constant_infinity();
2927 TestFixture::test_witness_infinity_from_operations();
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
#define BB_DISABLE_ASSERTS()
TestType< stdlib::secp256r1< bb::UltraCircuitBuilder >, stdlib::secp256r1< bb::UltraCircuitBuilder >::ScalarField, false > secp256r1_with_ultra
TestType< stdlib::bn254< bb::UltraCircuitBuilder >, stdlib::bn254< bb::UltraCircuitBuilder >::ScalarField, false > bn254_with_ultra
TestType< stdlib::bn254< bb::UltraCircuitBuilder >, bb::stdlib::bigfield< bb::UltraCircuitBuilder, bb::Bn254FrParams >, true > bn254_with_ultra_scalar_bigfield
TestType< stdlib::bn254< bb::MegaCircuitBuilder >, stdlib::bn254< bb::MegaCircuitBuilder >::ScalarField, false > bn254_with_mega
constexpr InputType operator!(InputType type)
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 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
bb::stdlib::element< typename Curve::Builder, typename Curve::BaseField, ScalarField_, typename Curve::GroupNative > bigfield_element
std::conditional_t< use_bigfield, bigfield_element, typename Curve::Group > element_ct
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