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);
232 auto x_death = element_ct::BaseField::from_witness(&
builder, input_death.x);
233 auto y_normal = element_ct::BaseField::from_witness(&
builder, input_death.y);
234 y_normal.set_origin_tag(constant_tag);
235 element_ct death_point(x_death, y_normal,
false);
237 death_point.x().set_origin_tag(instant_death_tag);
238 EXPECT_THROW(death_point + death_point, std::runtime_error);
269 for (
size_t i = 0; i < 3; ++i) {
274 point.assert_coordinates_in_field();
289 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.x);
290 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.y);
295 x_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
300 point.assert_coordinates_in_field();
311 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.x);
312 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.y);
317 y_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
322 point.assert_coordinates_in_field();
333 size_t num_repetitions = 10;
334 for (
size_t i = 0; i < num_repetitions; ++i) {
338 uint64_t before =
builder.get_num_finalized_gates_inefficient();
340 uint64_t after =
builder.get_num_finalized_gates_inefficient();
342 if (i == num_repetitions - 1) {
343 benchmark_info(Builder::NAME_STRING,
"Biggroup",
"ADD",
"Gate Count", after - before);
348 uint256_t c_x_u256 = c.x().get_value().lo;
349 uint256_t c_y_u256 = c.y().get_value().lo;
351 fq c_x_result(c_x_u256);
352 fq c_y_result(c_y_u256);
354 EXPECT_EQ(c_x_result, c_expected.x);
355 EXPECT_EQ(c_y_result, c_expected.y);
364 size_t num_repetitions = 10;
365 for (
size_t i = 0; i < num_repetitions; ++i) {
376 EXPECT_EQ(
fq(result_x), expected.x);
377 EXPECT_EQ(
fq(result_y), expected.y);
385 size_t num_repetitions = 1;
386 for (
size_t i = 0; i < num_repetitions; ++i) {
389 input_b.self_set_infinity();
409 EXPECT_EQ(c.get_value(), c_expected);
410 EXPECT_EQ(d.get_value(), d_expected);
411 EXPECT_EQ(e.get_value(), e_expected);
412 EXPECT_EQ(f.get_value(), f_expected);
413 EXPECT_EQ(g.get_value(), g_expected);
414 EXPECT_EQ(h.get_value(), h_expected);
426 size_t num_repetitions = 5;
427 for (
size_t i = 0; i < num_repetitions; ++i) {
430 element_ct input_b = element_ct::from_witness(&
builder, affine_element::infinity());
432 auto standard_a = input_a.get_standard_form();
433 auto standard_b = input_b.get_standard_form();
438 fq standard_a_x = standard_a.x().get_value().lo;
439 fq standard_a_y = standard_a.y().get_value().lo;
441 fq standard_b_x = standard_b.x().get_value().lo;
442 fq standard_b_y = standard_b.y().get_value().lo;
445 EXPECT_EQ(standard_a_x, 0);
446 EXPECT_EQ(standard_a_y, 0);
447 EXPECT_EQ(standard_b_x, 0);
448 EXPECT_EQ(standard_b_y, 0);
457 size_t num_repetitions = 10;
458 for (
size_t i = 0; i < num_repetitions; ++i) {
466 uint256_t c_x_u256 = c.x().get_value().lo;
467 uint256_t c_y_u256 = c.y().get_value().lo;
469 fq c_x_result(c_x_u256);
470 fq c_y_result(c_y_u256);
472 EXPECT_EQ(c_x_result, c_expected.x);
473 EXPECT_EQ(c_y_result, c_expected.y);
482 size_t num_repetitions = 10;
483 for (
size_t i = 0; i < num_repetitions; ++i) {
493 EXPECT_EQ(
fq(result_x), expected.x);
494 EXPECT_EQ(
fq(result_y), expected.y);
502 size_t num_repetitions = 1;
503 for (
size_t i = 0; i < num_repetitions; ++i) {
506 input_b.self_set_infinity();
526 EXPECT_EQ(c.get_value(), c_expected);
527 EXPECT_EQ(d.get_value(), d_expected);
528 EXPECT_EQ(e.get_value(), e_expected);
529 EXPECT_EQ(f.get_value(), f_expected);
530 EXPECT_EQ(g.get_value(), g_expected);
531 EXPECT_EQ(h.get_value(), h_expected);
541 size_t num_repetitions = 10;
542 for (
size_t i = 0; i < num_repetitions; ++i) {
549 uint256_t result_x = result.x().get_value().lo;
550 uint256_t result_y = result.y().get_value().lo;
552 EXPECT_EQ(
fq(result_x), expected.x);
553 EXPECT_EQ(
fq(result_y), expected.y);
562 size_t num_repetitions = 10;
563 for (
size_t i = 0; i < num_repetitions; ++i) {
567 element_ct result =
a.checked_unconditional_subtract(
b);
570 uint256_t result_x = result.x().get_value().lo;
571 uint256_t result_y = result.y().get_value().lo;
573 EXPECT_EQ(
fq(result_x), expected.x);
574 EXPECT_EQ(
fq(result_y), expected.y);
583 size_t num_repetitions = 10;
584 for (
size_t i = 0; i < num_repetitions; ++i) {
596 uint256_t diff_x = diff.x().get_value().lo;
597 uint256_t diff_y = diff.y().get_value().lo;
599 EXPECT_EQ(
fq(sum_x), expected_sum.x);
600 EXPECT_EQ(
fq(sum_y), expected_sum.y);
601 EXPECT_EQ(
fq(diff_x), expected_diff.x);
602 EXPECT_EQ(
fq(diff_y), expected_diff.y);
610 size_t num_repetitions = 10;
611 for (
size_t i = 0; i < num_repetitions; ++i) {
618 uint256_t c_x_u256 = c.x().get_value().lo;
619 uint256_t c_y_u256 = c.y().get_value().lo;
621 fq c_x_result(c_x_u256);
622 fq c_y_result(c_y_u256);
624 EXPECT_EQ(c_x_result, c_expected.x);
625 EXPECT_EQ(c_y_result, c_expected.y);
636 input_infinity.self_set_infinity();
639 element_ct result_infinity = a_infinity.dbl();
656 uint256_t result_x = result_normal.x().get_value().lo;
657 uint256_t result_y = result_normal.y().get_value().lo;
658 fq expected_x(result_x);
659 fq expected_y(result_y);
660 EXPECT_EQ(expected_x, expected_normal.x);
661 EXPECT_EQ(expected_y, expected_normal.y);
678 auto x_coord = element_ct::BaseField::from_witness(&
builder, test_point.x);
679 auto y_coord = element_ct::BaseField::from_witness(&
builder,
fq(0));
693 size_t num_repetitions = 5;
694 for (
size_t i = 0; i < num_repetitions; ++i) {
703 uint256_t dbl_x = doubled.x().get_value().lo;
704 uint256_t dbl_y = doubled.y().get_value().lo;
706 EXPECT_EQ(
fq(sum_x),
fq(dbl_x));
707 EXPECT_EQ(
fq(sum_y),
fq(dbl_y));
717 size_t num_repetitions = 5;
718 for (
size_t i = 0; i < num_repetitions; ++i) {
726 uint256_t result_x = result.x().get_value().lo;
727 uint256_t result_y = result.y().get_value().lo;
728 uint256_t expected_x = expected.x().get_value().lo;
729 uint256_t expected_y = expected.y().get_value().lo;
731 EXPECT_EQ(
fq(result_x),
fq(expected_x));
732 EXPECT_EQ(
fq(result_y),
fq(expected_y));
742 size_t num_repetitions = 10;
743 for (
size_t i = 0; i < num_repetitions; ++i) {
749 auto acc = element_ct::chain_add_start(
a,
b);
750 auto acc_out = element_ct::chain_add(c, acc);
751 element_ct result = element_ct::chain_add_end(acc_out);
755 uint256_t result_x = result.x().get_value().lo;
756 uint256_t result_y = result.y().get_value().lo;
757 EXPECT_EQ(
fq(result_x), expected.x);
758 EXPECT_EQ(
fq(result_y), expected.y);
761 auto lambda_prev = (input_b.y - input_a.y) / (input_b.x - input_a.x);
762 auto x3_prev = lambda_prev * lambda_prev - input_b.x - input_a.x;
763 auto y3_prev = lambda_prev * (input_a.x - x3_prev) - input_a.y;
764 auto lambda = (y3_prev - input_c.y) / (x3_prev - input_c.x);
765 auto x3 = lambda * lambda - x3_prev - input_c.x;
767 uint256_t x3_u256 = acc_out.x3_prev.get_value().lo;
768 uint256_t lambda_u256 = acc_out.lambda_prev.get_value().lo;
770 fq x3_result(x3_u256);
771 fq lambda_result(lambda_u256);
773 EXPECT_EQ(x3_result, x3);
774 EXPECT_EQ(lambda_result, lambda);
783 size_t num_repetitions = 10;
784 for (
size_t i = 0; i < num_repetitions; ++i) {
789 for (
size_t j = 0; j < i; ++j) {
794 typename element_ct::chain_add_accumulator add_1 =
795 element_ct::chain_add_start(add_1_big_0, add_2_big_0);
796 to_add.emplace_back(add_1);
798 acc_big.multiple_montgomery_ladder(to_add);
807 size_t num_repetitions = 10;
808 for (
size_t i = 0; i < num_repetitions; ++i) {
816 uint256_t x_after = normalized.x().get_value().lo;
817 uint256_t y_after = normalized.y().get_value().lo;
819 EXPECT_EQ(
fq(x_before),
fq(x_after));
820 EXPECT_EQ(
fq(y_before),
fq(y_after));
828 size_t num_repetitions = 10;
829 for (
size_t i = 0; i < num_repetitions; ++i) {
837 uint256_t x_after = reduced.x().get_value().lo;
838 uint256_t y_after = reduced.y().get_value().lo;
840 EXPECT_EQ(
fq(x_before),
fq(x_after));
841 EXPECT_EQ(
fq(y_before),
fq(y_after));
859 EXPECT_EQ(
fq(neg_x), expected.x);
860 EXPECT_EQ(
fq(neg_y), expected.y);
869 size_t num_repetitions = 10;
870 for (
size_t i = 0; i < num_repetitions; ++i) {
882 EXPECT_EQ(c.get_value(), c_expected);
892 size_t num_repetitions = 10;
893 for (
size_t i = 0; i < num_repetitions; ++i) {
904 EXPECT_EQ(c.get_value(), c_expected);
914 size_t num_repetitions = 10;
915 for (
size_t i = 0; i < num_repetitions; ++i) {
920 a.incomplete_assert_equal(
b,
"elements don't match");
927 size_t num_repetitions = 10;
928 for (
size_t i = 0; i < num_repetitions; ++i) {
930 input_a.self_set_infinity();
934 a.incomplete_assert_equal(
b,
"elements don't match");
944 a.incomplete_assert_equal(
a,
"self assertion test");
958 while (input_a == input_b) {
959 input_b = element::random_element();
964 a.incomplete_assert_equal(
b,
"elements don't match");
968 EXPECT_EQ(
builder.failed(),
true);
969 EXPECT_EQ(
builder.err(),
"elements don't match (x coordinate)");
980 input_b.y = -input_a.y;
983 auto x_coord = element_ct::BaseField::from_witness(&
builder, input_a.x);
984 auto y_coord_a = element_ct::BaseField::from_witness(&
builder, input_a.y);
985 auto y_coord_b = element_ct::BaseField::from_witness(&
builder, input_b.y);
991 a.incomplete_assert_equal(
b,
"elements don't match");
994 EXPECT_EQ(
builder.failed(),
true);
995 EXPECT_EQ(
builder.err(),
"elements don't match (y coordinate)");
1003 input_a.self_set_infinity();
1007 a.incomplete_assert_equal(
b,
"infinity flag mismatch test");
1009 EXPECT_EQ(
builder.failed(),
true);
1012 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (x coordinate)");
1014 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (infinity flag)");
1022 size_t max_num_bits = 254;
1023 for (
size_t length = 2; length < max_num_bits; length += 1) {
1028 scalar_raw = scalar_raw >> (256 - length);
1030 scalar_val =
fr(scalar_raw);
1033 if (scalar_val ==
fr(0)) {
1037 auto naf = element_ct::compute_naf(scalar, length);
1040 fr reconstructed_val(0);
1041 for (
size_t i = 0; i < length; i++) {
1042 reconstructed_val += (
fr(1) -
fr(2) *
fr(naf[i].get_value())) *
fr(
uint256_t(1) << (length - 1 - i));
1044 reconstructed_val -=
fr(naf[length].get_value());
1045 EXPECT_EQ(scalar_val, reconstructed_val);
1060 auto naf = element_ct::compute_naf(scalar, length);
1063 fr reconstructed_val(0);
1065 for (
size_t i = 0; i < length; i++) {
1066 reconstructed_val += (
fr(1) -
fr(2) *
fr(naf[i].get_value())) *
fr(
uint256_t(1) << (length - 1 - i));
1067 reconstructed_u256 +=
1070 reconstructed_val -=
fr(naf[length].get_value());
1071 EXPECT_EQ(scalar_val, reconstructed_val);
1087 scalar_raw = (scalar_raw >> 136) << 136;
1088 fr scalar_val =
fr(scalar_raw);
1090 scalar.set_origin_tag(submitted_value_origin_tag);
1096 auto naf = element_ct::compute_naf(scalar, length);
1099 for (
const auto& bit : naf) {
1100 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1104 fr reconstructed_val(0);
1105 for (
size_t i = 0; i < length; i++) {
1106 reconstructed_val += (
fr(1) -
fr(2) *
fr(naf[i].get_value())) *
fr(
uint256_t(1) << (length - 1 - i));
1108 reconstructed_val -=
fr(naf[length].get_value());
1110 EXPECT_EQ(scalar_val, reconstructed_val);
1117 size_t num_repetitions = 1;
1118 for (
size_t i = 0; i < num_repetitions; ++i) {
1127 fq c_x_result(c.x().get_value().lo);
1128 fq c_y_result(c.y().get_value().lo);
1130 EXPECT_EQ(c_x_result, c_expected.x);
1131 EXPECT_EQ(c_y_result, c_expected.y);
1148 bool expected_is_inf = expected.is_point_at_infinity();
1150 EXPECT_EQ(result_is_inf, expected_is_inf);
1153 if (!expected_is_inf) {
1154 uint256_t result_x = result.x().get_value().lo;
1155 uint256_t result_y = result.y().get_value().lo;
1157 EXPECT_EQ(
fq(result_x), expected.x);
1158 EXPECT_EQ(
fq(result_y), expected.y);
1168 run_mul_and_check(P, x, expected_infinity);
1174 P = element_ct::constant_infinity(&
builder);
1176 input.self_set_infinity();
1177 P = element_ct::from_witness(&
builder, input);
1182 run_mul_and_check(P, x, expected_infinity);
1189 run_mul_and_check(P, one, input);
1194 fr neg_one = -
fr(1);
1198 run_mul_and_check(P, neg_one_ct, expected);
1208 std::vector<size_t> test_lengths = { 2, 3, 10, 11, 31, 32, 63, 64, 127, 128, 252, 253 };
1210 for (
size_t i : test_lengths) {
1215 scalar_raw = scalar_raw >> (256 - i);
1216 fr scalar =
fr(scalar_raw);
1219 if (scalar ==
fr(0)) {
1232 fq c_x_result(c.x().get_value().lo);
1233 fq c_y_result(c.y().get_value().lo);
1235 EXPECT_EQ(c_x_result, c_expected.x);
1237 EXPECT_EQ(c_y_result, c_expected.y);
1252 points[0] = element::infinity();
1253 points[1] = element::random_element();
1255 std::vector<size_t> gates(2);
1258 bool expect_infinity =
true;
1260 for (
auto [point, num_gates] :
zip_view(points, gates)) {
1263 const size_t max_num_bits = 128;
1267 scalar_raw = scalar_raw >> (256 - max_num_bits);
1268 fr scalar =
fr(scalar_raw);
1274 element_ct c = P.scalar_mul(x, max_num_bits);
1276 num_gates =
builder.get_num_finalized_gates_inefficient();
1281 expect_infinity =
false;
1285 EXPECT_GT(gates[0], gates[1]);
1291 size_t num_repetitions = 1;
1292 for (
size_t i = 0; i < num_repetitions; ++i) {
1297 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1300 if ((
uint256_t(scalar_b).get_bit(0) & 1) == 0) {
1308 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b });
1313 fq c_x_result(c.x().get_value().lo);
1314 fq c_y_result(c.y().get_value().lo);
1316 EXPECT_EQ(c_x_result, expected.x);
1317 EXPECT_EQ(c_y_result, expected.y);
1325 size_t num_repetitions = 1;
1326 for (
size_t i = 0; i < num_repetitions; ++i) {
1329 input_b.self_set_infinity();
1332 const size_t max_num_bits = 128;
1334 scalar_raw_a = scalar_raw_a >> (256 - max_num_bits);
1335 fr scalar_a =
fr(scalar_raw_a);
1338 scalar_raw_b = scalar_raw_b >> (256 - max_num_bits);
1339 fr scalar_b =
fr(scalar_raw_b);
1346 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b }, 128);
1351 fq c_x_result(c.x().get_value().lo);
1352 fq c_y_result(c.y().get_value().lo);
1354 EXPECT_EQ(c_x_result, expected.x);
1355 EXPECT_EQ(c_y_result, expected.y);
1378 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1382 for (
size_t i = 0; i < 3; ++i) {
1384 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1385 scalars.emplace_back(scalar);
1386 points.emplace_back(point);
1399 fq c_x_result(c.x().get_value().lo);
1400 fq c_y_result(c.y().get_value().lo);
1402 EXPECT_EQ(c_x_result, expected.x);
1403 EXPECT_EQ(c_y_result, expected.y);
1422 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1426 for (
size_t i = 0; i < 3; ++i) {
1428 points.emplace_back(point);
1430 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1431 scalars.emplace_back(scalar);
1436 element_ct::batch_mul(points, scalars, 4,
false);
1439 EXPECT_EQ(
builder.err(),
"bigfield: prime limb diff is zero, but expected non-zero");
1445 size_t num_repetitions = 1;
1446 for (
size_t i = 0; i < num_repetitions; ++i) {
1448 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1456 fq c_x_result(c.x().get_value().lo);
1457 fq c_y_result(c.y().get_value().lo);
1459 EXPECT_EQ(c_x_result, expected.x);
1460 EXPECT_EQ(c_y_result, expected.y);
1468 const bool short_scalars =
false,
1469 const bool with_edgecases =
false)
1478 const bool short_scalars =
false,
1479 const bool with_edgecases =
false)
1483 const size_t num_points = point_types.size();
1485 std::vector<fr> scalars;
1489 for (
size_t i = 0; i < num_points; ++i) {
1491 if (short_scalars) {
1493 scalars.push_back(input_scalar);
1494 circuit_scalars.push_back(x);
1497 scalars.push_back(input_scalar);
1498 circuit_scalars.push_back(x);
1503 points.push_back(input_point);
1504 circuit_points.push_back(P);
1508 element_ct::batch_mul(circuit_points, circuit_scalars, 0, with_edgecases);
1512 for (
size_t i = 0; i < num_points; ++i) {
1513 expected_point += (
element(points[i]) * scalars[i]);
1516 expected_point = expected_point.normalize();
1517 fq result_x(result_point.x().get_value().lo);
1518 fq result_y(result_point.y().get_value().lo);
1520 EXPECT_EQ(result_x, expected_point.x);
1521 EXPECT_EQ(result_y, expected_point.y);
1528 const size_t num_points = 5;
1531 std::vector<fr> scalars;
1532 for (
size_t i = 0; i < num_points; ++i) {
1539 for (
size_t i = 0; i < num_points; ++i) {
1540 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1541 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1544 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
1548 for (
size_t i = 0; i < num_points; ++i) {
1549 expected_point += (
element(points[i]) * scalars[i]);
1552 expected_point = expected_point.normalize();
1553 fq result_x(result_point.x().get_value().lo);
1554 fq result_y(result_point.y().get_value().lo);
1556 EXPECT_EQ(result_x, expected_point.x);
1557 EXPECT_EQ(result_y, expected_point.y);
1564 const size_t num_points = 5;
1567 std::vector<fr> scalars;
1568 for (
size_t i = 0; i < num_points; ++i) {
1575 for (
size_t i = 0; i < num_points; ++i) {
1576 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1577 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1581 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1585 for (
size_t i = 0; i < num_points; ++i) {
1586 expected_point += (
element(points[i]) * scalars[i]);
1589 expected_point = expected_point.normalize();
1591 fq result2_x(result_point2.x().get_value().lo);
1592 fq result2_y(result_point2.y().get_value().lo);
1594 EXPECT_EQ(result2_x, expected_point.x);
1595 EXPECT_EQ(result2_y, expected_point.y);
1602 const auto test_repeated_points = [](
const uint32_t num_points) {
1604 info(
"num points: ", num_points);
1606 std::vector<fr> scalars;
1607 for (
size_t idx = 0; idx < num_points; idx++) {
1608 points.push_back(affine_element::one());
1609 scalars.push_back(1);
1613 ASSERT_EQ(points.size(), scalars.size());
1617 for (
size_t i = 0; i < num_points; ++i) {
1618 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1619 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1622 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1624 auto expected_point = element::infinity();
1625 for (
const auto& point : points) {
1626 expected_point += point;
1628 expected_point = expected_point.normalize();
1630 fq result_x(result_point.x().get_value().lo);
1631 fq result_y(result_point.y().get_value().lo);
1633 EXPECT_EQ(result_x, expected_point.x);
1634 EXPECT_EQ(result_y, expected_point.y);
1638 test_repeated_points(2);
1639 test_repeated_points(3);
1640 test_repeated_points(4);
1641 test_repeated_points(5);
1642 test_repeated_points(6);
1643 test_repeated_points(7);
1650 points.push_back(affine_element::infinity());
1652 std::vector<fr> scalars;
1653 scalars.push_back(1);
1654 scalars.push_back(1);
1657 ASSERT_EQ(points.size(), scalars.size());
1658 const size_t num_points = points.size();
1662 for (
size_t i = 0; i < num_points; ++i) {
1663 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1664 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1668 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1670 element expected_point = points[1];
1671 expected_point = expected_point.normalize();
1673 fq result_x(result_point.x().get_value().lo);
1674 fq result_y(result_point.y().get_value().lo);
1676 EXPECT_EQ(result_x, expected_point.x);
1677 EXPECT_EQ(result_y, expected_point.y);
1686 std::vector<fr> scalars;
1687 scalars.push_back(0);
1688 scalars.push_back(1);
1691 ASSERT_EQ(points.size(), scalars.size());
1692 const size_t num_points = points.size();
1696 for (
size_t i = 0; i < num_points; ++i) {
1697 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1698 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1702 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1704 element expected_point = points[1];
1705 expected_point = expected_point.normalize();
1707 fq result_x(result_point.x().get_value().lo);
1708 fq result_y(result_point.y().get_value().lo);
1710 EXPECT_EQ(result_x, expected_point.x);
1711 EXPECT_EQ(result_y, expected_point.y);
1722 std::vector<fr> scalars;
1724 for (
size_t i = 0; i < 5; ++i) {
1725 points.push_back(affine_element::infinity());
1732 for (
size_t i = 0; i < points.size(); ++i) {
1733 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1734 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1737 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1749 std::vector<fr> scalars;
1751 for (
size_t i = 0; i < 5; ++i) {
1759 for (
size_t i = 0; i < points.size(); ++i) {
1760 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1761 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1764 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1776 std::vector<fr> scalars;
1778 for (
size_t i = 0; i < 6; ++i) {
1787 for (
size_t i = 0; i < points.size(); ++i) {
1788 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1789 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1792 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1795 element expected = element::infinity();
1796 for (
size_t i = 0; i < points.size(); ++i) {
1797 expected += (
element(points[i]) * scalars[i]);
1801 uint256_t result_x = result.x().get_value().lo;
1802 uint256_t result_y = result.y().get_value().lo;
1804 EXPECT_EQ(
fq(result_x), expected_affine.x);
1805 EXPECT_EQ(
fq(result_y), expected_affine.y);
1815 std::vector<fr> scalars;
1817 for (
size_t i = 0; i < 6; ++i) {
1819 points.push_back((i % 2 == 0) ? affine_element::infinity() :
affine_element(element::random_element()));
1826 for (
size_t i = 0; i < points.size(); ++i) {
1827 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1828 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1831 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1834 element expected = element::infinity();
1835 for (
size_t i = 0; i < points.size(); ++i) {
1836 if (!points[i].is_point_at_infinity()) {
1837 expected += (
element(points[i]) * scalars[i]);
1842 uint256_t result_x = result.x().get_value().lo;
1843 uint256_t result_y = result.y().get_value().lo;
1845 EXPECT_EQ(
fq(result_x), expected_affine.x);
1846 EXPECT_EQ(
fq(result_y), expected_affine.y);
1856 std::vector<fr> scalars;
1863 points.push_back(P);
1864 scalars.push_back(scalar);
1865 points.push_back(neg_P);
1866 scalars.push_back(scalar);
1869 for (
size_t i = 0; i < 3; ++i) {
1877 for (
size_t i = 0; i < points.size(); ++i) {
1878 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1879 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1882 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1885 element expected = element::infinity();
1886 for (
size_t i = 0; i < points.size(); ++i) {
1887 expected += (
element(points[i]) * scalars[i]);
1891 uint256_t result_x = result.x().get_value().lo;
1892 uint256_t result_y = result.y().get_value().lo;
1894 EXPECT_EQ(
fq(result_x), expected_affine.x);
1895 EXPECT_EQ(
fq(result_y), expected_affine.y);
1905 std::vector<fr> scalars_native;
1910 for (
size_t i = 0; i < 3; ++i) {
1913 points_native.push_back(point);
1914 scalars_native.push_back(scalar);
1915 circuit_points.push_back(point_ct);
1920 for (
size_t i = 0; i < 3; ++i) {
1923 points_native.push_back(point);
1924 scalars_native.push_back(scalar);
1925 circuit_points.push_back(point_ct);
1930 for (
size_t i = 0; i < 4; ++i) {
1933 points_native.push_back(point);
1934 scalars_native.push_back(scalar);
1935 circuit_points.push_back(
element_ct(point.x, point.y));
1936 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalar));
1940 for (
size_t i = 0; i < 4; ++i) {
1943 points_native.push_back(point);
1944 scalars_native.push_back(scalar);
1945 circuit_points.push_back(point_ct);
1949 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
1952 element expected = element::infinity();
1953 for (
size_t i = 0; i < points_native.size(); ++i) {
1954 expected += (
element(points_native[i]) * scalars_native[i]);
1958 uint256_t result_x = result.x().get_value().lo;
1959 uint256_t result_y = result.y().get_value().lo;
1961 EXPECT_EQ(
fq(result_x), expected_affine.x);
1962 EXPECT_EQ(
fq(result_y), expected_affine.y);
1972 std::vector<fr> scalars;
1973 constexpr size_t num_points = 20;
1975 for (
size_t i = 0; i < num_points; ++i) {
1983 for (
size_t i = 0; i < points.size(); ++i) {
1984 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1985 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1988 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
1991 element expected = element::infinity();
1992 for (
size_t i = 0; i < points.size(); ++i) {
1993 expected += (
element(points[i]) * scalars[i]);
1997 uint256_t result_x = result.x().get_value().lo;
1998 uint256_t result_y = result.y().get_value().lo;
2000 EXPECT_EQ(
fq(result_x), expected_affine.x);
2001 EXPECT_EQ(
fq(result_y), expected_affine.y);
2016 EXPECT_EQ(
fq(inf.x().get_value().lo),
fq(0));
2017 EXPECT_EQ(
fq(inf.y().get_value().lo),
fq(0));
2029 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2030 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2040 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2041 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2051 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2052 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2061 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2062 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2083 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2084 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2098 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2099 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2113 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2114 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2132 element_ct result =
a.conditional_select(inf, pred);
2135 EXPECT_EQ(
fq(result.x().get_value().lo), input_a.x);
2136 EXPECT_EQ(
fq(result.y().get_value().lo), input_a.y);
2142 element_ct result =
a.conditional_select(inf, pred);
2151 element_ct result = inf.conditional_select(inf2, pred);
2169 element_ct result = inf.conditional_negate(pred);
2172 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2173 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2179 element_ct result = inf.conditional_negate(pred);
2198 EXPECT_EQ(
fq(P.x().get_value().lo),
fq(0));
2199 EXPECT_EQ(
fq(P.y().get_value().lo),
fq(0));
2203 element_ct standardized = P.get_standard_form();
2205 EXPECT_EQ(
fq(standardized.x().get_value().lo),
fq(0));
2206 EXPECT_EQ(
fq(standardized.y().get_value().lo),
fq(0));
2217 auto x_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2218 auto y_zero = element_ct::BaseField::from_witness(&
builder,
fq(0));
2240 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2241 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2252 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2253 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2280 element_ct::from_witness(&
builder, P),
2281 element_ct::from_witness(&
builder, Q),
2282 element_ct::from_witness(&
builder, P),
2283 element_ct::from_witness(&
builder, Q),
2287 scalar_ct::from_witness(&
builder,
b),
2288 scalar_ct::from_witness(&
builder, -
a),
2289 scalar_ct::from_witness(&
builder, -
b) };
2291 element_ct result = element_ct::batch_mul(points, scalars, 0,
true);
2294 EXPECT_EQ(
fq(result.x().get_value().lo),
fq(0));
2295 EXPECT_EQ(
fq(result.y().get_value().lo),
fq(0));
2313 EXPECT_EQ(
fq(result.x().get_value().lo), input.x);
2314 EXPECT_EQ(
fq(result.y().get_value().lo), input.y);
2319 EXPECT_EQ(
fq(result2.x().get_value().lo), input.x);
2320 EXPECT_EQ(
fq(result2.y().get_value().lo), input.y);
2341 EXPECT_EQ(
fq(result.x().get_value().lo), input2.x);
2342 EXPECT_EQ(
fq(result.y().get_value().lo), input2.y);
2346 EXPECT_EQ(
fq(result2.x().get_value().lo), input2.x);
2347 EXPECT_EQ(
fq(result2.y().get_value().lo), input2.y);
2389 using Builder = TestFixture::Builder;
2390 using element_ct = TestFixture::element_ct;
2391 using Fq = TestFixture::Curve::BaseField;
2392 using FqNative = TestFixture::Curve::BaseFieldNative;
2393 using GroupNative = TestFixture::Curve::GroupNative;
2396 auto [native_point, witness_point] = TestFixture::get_random_witness_point(&
builder);
2399 Fq expected_zero = witness_point.validate_on_curve(
"biggroup::validate_on_curve",
false);
2400 expected_zero.assert_equal(
Fq::zero());
2401 EXPECT_EQ(expected_zero.get_value(),
static_cast<uint512_t>(FqNative::zero()));
2404 Fq random_x = Fq::from_witness(&
builder, FqNative::random_element());
2405 Fq random_y = Fq::from_witness(&
builder, FqNative::random_element());
2406 element_ct invalid_point(random_x, random_y,
false);
2407 Fq expected_non_zero = invalid_point.validate_on_curve(
"biggroup::validate_on_curve",
false);
2408 Fq expected_value = -random_y.
sqr() + random_x.
pow(3) +
Fq(
uint256_t(GroupNative::curve_b));
2409 if constexpr (GroupNative::has_a) {
2410 expected_value += random_x *
Fq(
uint256_t(GroupNative::curve_a));
2412 expected_non_zero.assert_equal(expected_value);
2415 expected_non_zero.self_reduce();
2416 expected_value.self_reduce();
2417 EXPECT_EQ(expected_non_zero.get_value(), expected_value.get_value());
2419 TestFixture::EXPECT_CIRCUIT_CORRECTNESS(
builder);
2422 [[maybe_unused]]
Fq _ = invalid_point.validate_on_curve();
2423 TestFixture::EXPECT_CIRCUIT_CORRECTNESS(
builder,
false);
2429 TestFixture::test_basic_tag_logic();
2434 TestFixture::test_assert_coordinates_in_field();
2440 TestFixture::test_add();
2450 TestFixture::test_add_points_at_infinity();
2454 TestFixture::test_standard_form_of_point_at_infinity();
2460 TestFixture::test_sub();
2470 TestFixture::test_sub_points_at_infinity();
2474 TestFixture::test_dbl();
2482 TestFixture::test_dbl_with_infinity();
2487 GTEST_SKIP() <<
"mega builder does not support this edge case";
2489 TestFixture::test_dbl_with_y_zero();
2494 TestFixture::test_add_equals_dbl();
2498 TestFixture::test_sub_neg_equals_double();
2505 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2507 TestFixture::test_chain_add();
2513 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2530 GTEST_SKIP() <<
"mega builder does not implement multiple_montgomery_ladder function";
2532 TestFixture::test_multiple_montgomery_ladder();
2539 TestFixture::test_normalize();
2549 TestFixture::test_reduce();
2614 TestFixture::test_checked_unconditional_add_sub();
2625 TestFixture::test_conditional_negate();
2636 TestFixture::test_conditional_select();
2650 TestFixture::test_incomplete_assert_equal();
2654 TestFixture::test_incomplete_assert_equal_failure();
2660 size_t num_repetitions = 1;
2661 for (
size_t i = 0; i < num_repetitions; i++) {
2662 TestFixture::test_compute_naf();
2665 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2672 TestFixture::test_compute_naf_zero();
2674 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2681 TestFixture::test_compute_naf_overflow_lower_half();
2683 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2689 TestFixture::test_mul();
2699 TestFixture::test_mul_edge_cases();
2711 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2713 TestFixture::test_short_scalar_mul_with_bit_lengths();
2720 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2722 TestFixture::test_short_scalar_mul_infinity();
2730 TestFixture::test_helper_batch_mul(1);
2736 TestFixture::test_helper_batch_mul(2);
2740 TestFixture::test_helper_batch_mul(2,
true);
2744 TestFixture::test_helper_batch_mul(2,
false,
true);
2748 TestFixture::test_helper_batch_mul(2,
true,
true);
2759 TestFixture::test_helper_batch_mul(3);
2765 TestFixture::test_helper_batch_mul(4);
2771 TestFixture::test_helper_batch_mul(5);
2775 TestFixture::test_helper_batch_mul(5,
false,
true);
2779 TestFixture::test_helper_batch_mul(5,
true);
2783 TestFixture::test_helper_batch_mul(5,
true,
true);
2787 TestFixture::test_helper_batch_mul(
2795 TestFixture::test_helper_batch_mul(6);
2800 TestFixture::test_twin_mul();
2805 TestFixture::test_twin_mul_with_infinity();
2810 TestFixture::test_batch_mul_linearly_dependent_generators();
2816 GTEST_SKIP() <<
"this failure test is designed for ultra builder only";
2818 TestFixture::test_batch_mul_linearly_dependent_generators_failure();
2824 TestFixture::test_one();
2829 TestFixture::test_batch_mul();
2834 TestFixture::test_batch_mul_edgecase_equivalence();
2838 TestFixture::test_batch_mul_edge_case_set1();
2843 TestFixture::test_batch_mul_edge_case_set2();
2849 TestFixture::test_batch_mul_all_infinity();
2854 TestFixture::test_batch_mul_all_zero_scalars();
2859 TestFixture::test_batch_mul_mixed_zero_scalars();
2864 TestFixture::test_batch_mul_mixed_infinity();
2869 TestFixture::test_batch_mul_cancellation();
2874 TestFixture::test_batch_mul_mixed_constant_witness();
2879 TestFixture::test_batch_mul_large_number_of_points();
2885 TestFixture::test_infinity_canonical_representation();
2890 TestFixture::test_infinity_chained_operations();
2895 TestFixture::test_conditional_select_with_infinity();
2900 TestFixture::test_conditional_negate_with_infinity();
2905 TestFixture::test_get_standard_form_normalizes_infinity();
2910 TestFixture::test_infinity_auto_detection_in_constructor();
2915 TestFixture::test_scalar_mul_infinity_edge_cases();
2920 TestFixture::test_batch_mul_complete_cancellation();
2925 TestFixture::test_add_constant_infinity();
2930 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.
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)