1#include "../biggroup/biggroup.hpp"
2#include "../bigfield/bigfield.hpp"
3#include "../bool/bool.hpp"
4#include "../field/field.hpp"
38template <
typename _Curve,
bool _use_bigfield = false>
struct TestType {
43 typename std::conditional<_use_bigfield, typename Curve::g1_bigfr_ct, typename Curve::Group>::type;
46 typename std::conditional<_use_bigfield, typename Curve::bigfr_ct, typename Curve::ScalarField>::type;
56 using fq =
typename Curve::BaseFieldNative;
57 using fr =
typename Curve::ScalarFieldNative;
58 using g1 =
typename Curve::GroupNative;
68 info(
"num gates = ",
builder.get_num_finalized_gates_inefficient());
85 using Fq =
typename element_ct::BaseField;
105 if (even &&
uint256_t(scalar_native).get_bit(0)) {
106 scalar_native -=
fr(1);
116 if (even &&
uint256_t(scalar_native).get_bit(0)) {
117 scalar_native -=
fr(1);
135 scalar_u256 = scalar_u256 >> (256 - num_bits);
137 fr scalar_native(scalar_u256);
140 scalar_ct_val = scalar_ct::from_witness(
builder, scalar_native);
154 a.set_origin_tag(next_submitted_value_origin_tag);
156 EXPECT_EQ(
a.get_origin_tag(), next_submitted_value_origin_tag);
161 auto x = element_ct::BaseField::from_witness(&
builder, input_c.
x);
162 auto y = element_ct::BaseField::from_witness(&
builder, input_c.
y);
166 x.set_origin_tag(submitted_value_origin_tag);
167 y.set_origin_tag(challenge_origin_tag);
168 pif.set_origin_tag(next_challenge_tag);
174 EXPECT_EQ(c.get_origin_tag(), first_second_third_merged_tag);
179 auto x_death = element_ct::BaseField::from_witness(&
builder, input_b.
x);
180 auto y_normal = element_ct::BaseField::from_witness(&
builder, input_b.
y);
183 x_death.set_origin_tag(instant_death_tag);
187 EXPECT_THROW(
b +
b, std::runtime_error);
201 for (
size_t i = 0; i < 3; ++i) {
206 point.assert_coordinates_in_field();
221 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
x);
222 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
y);
227 x_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
231 point.assert_coordinates_in_field();
242 auto x_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
x);
243 auto y_coord = element_ct::BaseField::from_witness(&
builder, valid_point.
y);
248 y_coord.binary_basis_limbs[3].maximum_value =
uint256_t(1) << 68;
252 point.assert_coordinates_in_field();
263 size_t num_repetitions = 10;
264 for (
size_t i = 0; i < num_repetitions; ++i) {
269 a.set_origin_tag(submitted_value_origin_tag);
270 b.set_origin_tag(challenge_origin_tag);
272 uint64_t before =
builder.get_num_finalized_gates_inefficient();
274 uint64_t after =
builder.get_num_finalized_gates_inefficient();
277 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
278 if (i == num_repetitions - 1) {
279 benchmark_info(Builder::NAME_STRING,
"Biggroup",
"ADD",
"Gate Count", after - before);
284 uint256_t c_x_u256 = c.x().get_value().lo;
285 uint256_t c_y_u256 = c.y().get_value().lo;
287 fq c_x_result(c_x_u256);
288 fq c_y_result(c_y_u256);
290 EXPECT_EQ(c_x_result, c_expected.
x);
291 EXPECT_EQ(c_y_result, c_expected.
y);
300 size_t num_repetitions = 10;
301 for (
size_t i = 0; i < num_repetitions; ++i) {
312 EXPECT_EQ(
fq(result_x), expected.
x);
313 EXPECT_EQ(
fq(result_y), expected.
y);
321 size_t num_repetitions = 1;
322 for (
size_t i = 0; i < num_repetitions; ++i) {
334 a.set_origin_tag(submitted_value_origin_tag);
335 b.set_origin_tag(challenge_origin_tag);
336 a_alternate.set_origin_tag(next_challenge_tag);
338 const auto second_round_challenge_tag =
340 a_negated.set_origin_tag(second_round_challenge_tag);
350 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
351 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
352 EXPECT_EQ(e.get_origin_tag(), challenge_origin_tag);
353 EXPECT_EQ(f.get_origin_tag(), submitted_value_origin_tag);
354 EXPECT_EQ(g.get_origin_tag(), first_and_third_merged_tag);
355 EXPECT_EQ(h.get_origin_tag(),
OriginTag(submitted_value_origin_tag, second_round_challenge_tag));
364 EXPECT_EQ(c.get_value(), c_expected);
365 EXPECT_EQ(d.get_value(), d_expected);
366 EXPECT_EQ(e.get_value(), e_expected);
367 EXPECT_EQ(f.get_value(), f_expected);
368 EXPECT_EQ(g.get_value(), g_expected);
369 EXPECT_EQ(h.get_value(), h_expected);
381 size_t num_repetitions = 5;
382 for (
size_t i = 0; i < num_repetitions; ++i) {
384 element_ct input_a(element::random_element());
385 element_ct input_b = element_ct::from_witness(&
builder, element::random_element());
386 input_a.set_point_at_infinity(
true);
387 input_b.set_point_at_infinity(
true);
390 input_a.set_origin_tag(submitted_value_origin_tag);
391 input_b.set_origin_tag(challenge_origin_tag);
393 auto standard_a = input_a.get_standard_form();
394 auto standard_b = input_b.get_standard_form();
397 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
398 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
400 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
true);
401 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
403 fq standard_a_x = standard_a.x().get_value().lo;
404 fq standard_a_y = standard_a.y().get_value().lo;
406 fq standard_b_x = standard_b.x().get_value().lo;
407 fq standard_b_y = standard_b.y().get_value().lo;
409 EXPECT_EQ(standard_a_x, 0);
410 EXPECT_EQ(standard_a_y, 0);
411 EXPECT_EQ(standard_b_x, 0);
412 EXPECT_EQ(standard_b_y, 0);
421 size_t num_repetitions = 10;
422 for (
size_t i = 0; i < num_repetitions; ++i) {
427 a.set_origin_tag(submitted_value_origin_tag);
428 b.set_origin_tag(challenge_origin_tag);
433 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
437 uint256_t c_x_u256 = c.x().get_value().lo;
438 uint256_t c_y_u256 = c.y().get_value().lo;
440 fq c_x_result(c_x_u256);
441 fq c_y_result(c_y_u256);
443 EXPECT_EQ(c_x_result, c_expected.
x);
444 EXPECT_EQ(c_y_result, c_expected.
y);
453 size_t num_repetitions = 10;
454 for (
size_t i = 0; i < num_repetitions; ++i) {
464 EXPECT_EQ(
fq(result_x), expected.
x);
465 EXPECT_EQ(
fq(result_y), expected.
y);
473 size_t num_repetitions = 1;
474 for (
size_t i = 0; i < num_repetitions; ++i) {
486 a.set_origin_tag(submitted_value_origin_tag);
487 b.set_origin_tag(challenge_origin_tag);
488 a_alternate.set_origin_tag(next_challenge_tag);
490 const auto second_round_challenge_tag =
492 a_negated.set_origin_tag(second_round_challenge_tag);
502 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
503 EXPECT_EQ(d.get_origin_tag(), first_two_merged_tag);
504 EXPECT_EQ(e.get_origin_tag(), challenge_origin_tag);
505 EXPECT_EQ(f.get_origin_tag(), submitted_value_origin_tag);
506 EXPECT_EQ(g.get_origin_tag(), first_and_third_merged_tag);
507 EXPECT_EQ(h.get_origin_tag(),
OriginTag(submitted_value_origin_tag, second_round_challenge_tag));
516 EXPECT_EQ(c.get_value(), c_expected);
517 EXPECT_EQ(d.get_value(), d_expected);
518 EXPECT_EQ(e.get_value(), e_expected);
519 EXPECT_EQ(f.get_value(), f_expected);
520 EXPECT_EQ(g.get_value(), g_expected);
521 EXPECT_EQ(h.get_value(), h_expected);
531 size_t num_repetitions = 10;
532 for (
size_t i = 0; i < num_repetitions; ++i) {
539 uint256_t result_x = result.x().get_value().lo;
540 uint256_t result_y = result.y().get_value().lo;
542 EXPECT_EQ(
fq(result_x), expected.
x);
543 EXPECT_EQ(
fq(result_y), expected.
y);
552 size_t num_repetitions = 10;
553 for (
size_t i = 0; i < num_repetitions; ++i) {
557 element_ct result =
a.checked_unconditional_subtract(
b);
560 uint256_t result_x = result.x().get_value().lo;
561 uint256_t result_y = result.y().get_value().lo;
563 EXPECT_EQ(
fq(result_x), expected.
x);
564 EXPECT_EQ(
fq(result_y), expected.
y);
573 size_t num_repetitions = 10;
574 for (
size_t i = 0; i < num_repetitions; ++i) {
586 uint256_t diff_x = diff.x().get_value().lo;
587 uint256_t diff_y = diff.y().get_value().lo;
589 EXPECT_EQ(
fq(sum_x), expected_sum.
x);
590 EXPECT_EQ(
fq(sum_y), expected_sum.
y);
591 EXPECT_EQ(
fq(diff_x), expected_diff.
x);
592 EXPECT_EQ(
fq(diff_y), expected_diff.
y);
600 size_t num_repetitions = 10;
601 for (
size_t i = 0; i < num_repetitions; ++i) {
604 a.set_origin_tag(submitted_value_origin_tag);
609 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
613 uint256_t c_x_u256 = c.x().get_value().lo;
614 uint256_t c_y_u256 = c.y().get_value().lo;
616 fq c_x_result(c_x_u256);
617 fq c_y_result(c_y_u256);
619 EXPECT_EQ(c_x_result, c_expected.
x);
620 EXPECT_EQ(c_y_result, c_expected.
y);
633 a_infinity.set_origin_tag(submitted_value_origin_tag);
635 element_ct result_infinity = a_infinity.dbl();
638 EXPECT_EQ(result_infinity.get_origin_tag(), submitted_value_origin_tag);
641 EXPECT_TRUE(result_infinity.is_point_at_infinity().get_value());
647 a_normal.set_origin_tag(submitted_value_origin_tag);
652 EXPECT_EQ(result_normal.get_origin_tag(), submitted_value_origin_tag);
655 EXPECT_FALSE(result_normal.is_point_at_infinity().get_value());
659 uint256_t result_x = result_normal.x().get_value().lo;
660 uint256_t result_y = result_normal.y().get_value().lo;
661 fq expected_x(result_x);
662 fq expected_y(result_y);
663 EXPECT_EQ(expected_x, expected_normal.
x);
664 EXPECT_EQ(expected_y, expected_normal.
y);
681 auto x_coord = element_ct::BaseField::from_witness(&
builder, test_point.
x);
682 auto y_coord = element_ct::BaseField::from_witness(&
builder,
fq(0));
686 a.set_origin_tag(submitted_value_origin_tag);
697 size_t num_repetitions = 5;
698 for (
size_t i = 0; i < num_repetitions; ++i) {
707 uint256_t dbl_x = doubled.x().get_value().lo;
708 uint256_t dbl_y = doubled.y().get_value().lo;
710 EXPECT_EQ(
fq(sum_x),
fq(dbl_x));
711 EXPECT_EQ(
fq(sum_y),
fq(dbl_y));
712 EXPECT_EQ(
sum.is_point_at_infinity().get_value(), doubled.is_point_at_infinity().get_value());
721 size_t num_repetitions = 5;
722 for (
size_t i = 0; i < num_repetitions; ++i) {
730 uint256_t result_x = result.x().get_value().lo;
731 uint256_t result_y = result.y().get_value().lo;
732 uint256_t expected_x = expected.x().get_value().lo;
733 uint256_t expected_y = expected.y().get_value().lo;
735 EXPECT_EQ(
fq(result_x),
fq(expected_x));
736 EXPECT_EQ(
fq(result_y),
fq(expected_y));
746 size_t num_repetitions = 10;
747 for (
size_t i = 0; i < num_repetitions; ++i) {
753 auto acc = element_ct::chain_add_start(
a,
b);
754 auto acc_out = element_ct::chain_add(c, acc);
755 element_ct result = element_ct::chain_add_end(acc_out);
759 uint256_t result_x = result.x().get_value().lo;
760 uint256_t result_y = result.y().get_value().lo;
761 EXPECT_EQ(
fq(result_x), expected.
x);
762 EXPECT_EQ(
fq(result_y), expected.
y);
765 auto lambda_prev = (input_b.y - input_a.y) / (input_b.x - input_a.x);
766 auto x3_prev = lambda_prev * lambda_prev - input_b.x - input_a.x;
767 auto y3_prev = lambda_prev * (input_a.x - x3_prev) - input_a.y;
768 auto lambda = (y3_prev - input_c.y) / (x3_prev - input_c.x);
769 auto x3 = lambda * lambda - x3_prev - input_c.x;
771 uint256_t x3_u256 = acc_out.x3_prev.get_value().lo;
772 uint256_t lambda_u256 = acc_out.lambda_prev.get_value().lo;
774 fq x3_result(x3_u256);
775 fq lambda_result(lambda_u256);
777 EXPECT_EQ(x3_result, x3);
778 EXPECT_EQ(lambda_result, lambda);
787 size_t num_repetitions = 10;
788 for (
size_t i = 0; i < num_repetitions; ++i) {
793 for (
size_t j = 0; j < i; ++j) {
798 typename element_ct::chain_add_accumulator add_1 =
799 element_ct::chain_add_start(add_1_big_0, add_2_big_0);
800 to_add.emplace_back(add_1);
802 acc_big.multiple_montgomery_ladder(to_add);
811 size_t num_repetitions = 10;
812 for (
size_t i = 0; i < num_repetitions; ++i) {
820 uint256_t x_after = normalized.x().get_value().lo;
821 uint256_t y_after = normalized.y().get_value().lo;
823 EXPECT_EQ(
fq(x_before),
fq(x_after));
824 EXPECT_EQ(
fq(y_before),
fq(y_after));
832 size_t num_repetitions = 10;
833 for (
size_t i = 0; i < num_repetitions; ++i) {
841 uint256_t x_after = reduced.x().get_value().lo;
842 uint256_t y_after = reduced.y().get_value().lo;
844 EXPECT_EQ(
fq(x_before),
fq(x_after));
845 EXPECT_EQ(
fq(y_before),
fq(y_after));
863 EXPECT_EQ(
fq(neg_x), expected.
x);
864 EXPECT_EQ(
fq(neg_y), expected.
y);
873 size_t num_repetitions = 10;
874 for (
size_t i = 0; i < num_repetitions; ++i) {
877 a.set_origin_tag(submitted_value_origin_tag);
888 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
891 EXPECT_EQ(c.get_value(), c_expected);
901 size_t num_repetitions = 10;
902 for (
size_t i = 0; i < num_repetitions; ++i) {
911 a.set_origin_tag(submitted_value_origin_tag);
912 b.set_origin_tag(challenge_origin_tag);
918 EXPECT_EQ(c.get_origin_tag(), first_second_third_merged_tag);
921 EXPECT_EQ(c.get_value(), c_expected);
931 size_t num_repetitions = 10;
932 for (
size_t i = 0; i < num_repetitions; ++i) {
938 a.set_origin_tag(submitted_value_origin_tag);
939 b.set_origin_tag(challenge_origin_tag);
941 a.incomplete_assert_equal(
b,
"elements don't match");
948 size_t num_repetitions = 10;
949 for (
size_t i = 0; i < num_repetitions; ++i) {
955 a.set_origin_tag(submitted_value_origin_tag);
956 b.set_origin_tag(challenge_origin_tag);
961 a.incomplete_assert_equal(
b,
"elements don't match");
971 a.incomplete_assert_equal(
a,
"self assertion test");
985 while (input_a == input_b) {
986 input_b = element::random_element();
992 a.set_origin_tag(submitted_value_origin_tag);
993 b.set_origin_tag(challenge_origin_tag);
995 a.incomplete_assert_equal(
b,
"elements don't match");
999 EXPECT_EQ(
builder.failed(),
true);
1000 EXPECT_EQ(
builder.err(),
"elements don't match (x coordinate)");
1011 input_b.
y = -input_a.
y;
1014 auto x_coord = element_ct::BaseField::from_witness(&
builder, input_a.
x);
1015 auto y_coord_a = element_ct::BaseField::from_witness(&
builder, input_a.
y);
1016 auto y_coord_b = element_ct::BaseField::from_witness(&
builder, input_b.
y);
1022 a.set_origin_tag(submitted_value_origin_tag);
1023 b.set_origin_tag(challenge_origin_tag);
1025 a.incomplete_assert_equal(
b,
"elements don't match");
1028 EXPECT_EQ(
builder.failed(),
true);
1029 EXPECT_EQ(
builder.err(),
"elements don't match (y coordinate)");
1044 a.incomplete_assert_equal(
b,
"infinity flag mismatch test");
1046 EXPECT_EQ(
builder.failed(),
true);
1047 EXPECT_EQ(
builder.err(),
"infinity flag mismatch test (infinity flag)");
1059 while (input_a == input_b) {
1060 input_b = element::random_element();
1066 a.set_point_at_infinity(is_infinity);
1067 b.set_point_at_infinity(is_infinity);
1070 a.set_origin_tag(submitted_value_origin_tag);
1071 b.set_origin_tag(challenge_origin_tag);
1073 a.incomplete_assert_equal(
b,
"points at infinity with different x,y should not be equal");
1076 EXPECT_EQ(
builder.failed(),
true);
1077 EXPECT_EQ(
builder.err(),
"points at infinity with different x,y should not be equal (x coordinate)");
1083 size_t max_num_bits = 254;
1089 scalar_raw = scalar_raw >> (256 -
length);
1091 scalar_val =
fr(scalar_raw);
1094 if (scalar_val ==
fr(0)) {
1099 scalar.set_origin_tag(submitted_value_origin_tag);
1100 auto naf = element_ct::compute_naf(scalar,
length);
1102 for (
const auto& bit : naf) {
1104 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1107 fr reconstructed_val(0);
1108 for (
size_t i = 0; i <
length; i++) {
1111 reconstructed_val -=
fr(naf[
length].get_value());
1112 EXPECT_EQ(scalar_val, reconstructed_val);
1129 scalar.set_origin_tag(submitted_value_origin_tag);
1130 auto naf = element_ct::compute_naf(scalar,
length);
1132 for (
const auto& bit : naf) {
1134 EXPECT_EQ(bit.get_origin_tag(), submitted_value_origin_tag);
1138 fr reconstructed_val(0);
1140 for (
size_t i = 0; i <
length; i++) {
1142 reconstructed_u256 +=
1145 reconstructed_val -=
fr(naf[
length].get_value());
1146 EXPECT_EQ(scalar_val, reconstructed_val);
1155 size_t num_repetitions = 1;
1156 for (
size_t i = 0; i < num_repetitions; ++i) {
1161 x.set_origin_tag(challenge_origin_tag);
1162 P.set_origin_tag(submitted_value_origin_tag);
1170 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1171 fq c_x_result(c.x().get_value().lo);
1172 fq c_y_result(c.y().get_value().lo);
1174 EXPECT_EQ(c_x_result, c_expected.
x);
1175 EXPECT_EQ(c_y_result, c_expected.
y);
1188 x.set_origin_tag(challenge_origin_tag);
1189 P.set_origin_tag(submitted_value_origin_tag);
1195 EXPECT_EQ(result.get_origin_tag(), first_two_merged_tag);
1198 bool result_is_inf = result.is_point_at_infinity().get_value();
1199 bool expected_is_inf = expected.is_point_at_infinity();
1201 EXPECT_EQ(result_is_inf, expected_is_inf);
1204 if (!expected_is_inf) {
1205 uint256_t result_x = result.x().get_value().lo;
1206 uint256_t result_y = result.y().get_value().lo;
1208 EXPECT_EQ(
fq(result_x), expected.x);
1209 EXPECT_EQ(
fq(result_y), expected.y);
1219 run_mul_and_check(P, x, expected_infinity);
1225 P.set_point_at_infinity(
bool_ct(
true));
1232 P = P.get_standard_form();
1237 run_mul_and_check(P, x, expected_infinity);
1244 run_mul_and_check(P, one, input);
1249 fr neg_one = -
fr(1);
1253 run_mul_and_check(P, neg_one_ct, expected);
1263 std::vector<size_t> test_lengths = { 2, 3, 10, 11, 31, 32, 63, 64, 127, 128, 252, 253 };
1265 for (
size_t i : test_lengths) {
1270 scalar_raw = scalar_raw >> (256 - i);
1271 fr scalar =
fr(scalar_raw);
1274 if (scalar ==
fr(0)) {
1282 x.set_origin_tag(challenge_origin_tag);
1283 P.set_origin_tag(submitted_value_origin_tag);
1292 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1293 fq c_x_result(c.x().get_value().lo);
1294 fq c_y_result(c.y().get_value().lo);
1296 EXPECT_EQ(c_x_result, c_expected.
x);
1298 EXPECT_EQ(c_y_result, c_expected.
y);
1313 points[0] = element::infinity();
1314 points[1] = element::random_element();
1316 std::vector<size_t> gates(2);
1319 bool expect_infinity =
true;
1321 for (
auto [point, num_gates] :
zip_view(points, gates)) {
1324 const size_t max_num_bits = 128;
1328 scalar_raw = scalar_raw >> (256 - max_num_bits);
1329 fr scalar =
fr(scalar_raw);
1335 x.set_origin_tag(challenge_origin_tag);
1336 P.set_origin_tag(submitted_value_origin_tag);
1339 element_ct c = P.scalar_mul(x, max_num_bits);
1341 num_gates =
builder.get_num_finalized_gates_inefficient();
1343 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1345 EXPECT_EQ(c.is_point_at_infinity().get_value(), expect_infinity);
1348 expect_infinity =
false;
1352 EXPECT_GT(gates[0], gates[1]);
1358 size_t num_repetitions = 1;
1359 for (
size_t i = 0; i < num_repetitions; ++i) {
1364 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1367 if ((
uint256_t(scalar_b).get_bit(0) & 1) == 0) {
1376 P_a.set_origin_tag(submitted_value_origin_tag);
1377 x_a.set_origin_tag(challenge_origin_tag);
1378 P_b.set_origin_tag(next_submitted_value_origin_tag);
1379 x_b.set_origin_tag(next_challenge_tag);
1381 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b });
1384 EXPECT_EQ(c.get_origin_tag(), first_to_fourth_merged_tag);
1388 fq c_x_result(c.x().get_value().lo);
1389 fq c_y_result(c.y().get_value().lo);
1391 EXPECT_EQ(c_x_result, expected.
x);
1392 EXPECT_EQ(c_y_result, expected.
y);
1400 size_t num_repetitions = 1;
1401 for (
size_t i = 0; i < num_repetitions; ++i) {
1407 const size_t max_num_bits = 128;
1409 scalar_raw_a = scalar_raw_a >> (256 - max_num_bits);
1410 fr scalar_a =
fr(scalar_raw_a);
1413 scalar_raw_b = scalar_raw_b >> (256 - max_num_bits);
1414 fr scalar_b =
fr(scalar_raw_b);
1422 P_a.set_origin_tag(submitted_value_origin_tag);
1423 x_a.set_origin_tag(challenge_origin_tag);
1424 P_b.set_origin_tag(next_submitted_value_origin_tag);
1425 x_b.set_origin_tag(next_challenge_tag);
1427 element_ct c = element_ct::batch_mul({ P_a, P_b }, { x_a, x_b }, 128);
1430 EXPECT_EQ(c.get_origin_tag(), first_to_fourth_merged_tag);
1434 fq c_x_result(c.x().get_value().lo);
1435 fq c_y_result(c.y().get_value().lo);
1437 EXPECT_EQ(c_x_result, expected.
x);
1438 EXPECT_EQ(c_y_result, expected.
y);
1461 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1466 for (
size_t i = 0; i < 3; ++i) {
1468 point.set_origin_tag(
OriginTag(0, i,
true));
1469 tag_union =
OriginTag(tag_union, point.get_origin_tag());
1471 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1472 scalar.set_origin_tag(
OriginTag(0, i,
false));
1473 tag_union =
OriginTag(tag_union, scalar.get_origin_tag());
1475 scalars.emplace_back(scalar);
1476 points.emplace_back(point);
1481 const auto get_128_bit_scalar = []() {
1485 fr scalar(scalar_u256);
1488 fr masking_scalar = get_128_bit_scalar();
1489 scalar_ct masking_scalar_ct = scalar_ct::from_witness(&
builder, masking_scalar);
1497 EXPECT_EQ(c.get_origin_tag(), tag_union);
1503 fq c_x_result(c.x().get_value().lo);
1504 fq c_y_result(c.y().get_value().lo);
1506 EXPECT_EQ(c_x_result, expected.
x);
1507 EXPECT_EQ(c_y_result, expected.
y);
1526 std::vector<fr> input_scalars = { scalar_a, scalar_b, scalar_c };
1530 for (
size_t i = 0; i < 3; ++i) {
1532 points.emplace_back(point);
1534 const scalar_ct scalar = scalar_ct::from_witness(&
builder, input_scalars[i]);
1535 scalars.emplace_back(scalar);
1540 element_ct::batch_mul(points, scalars, 4,
false);
1543 EXPECT_EQ(
builder.err(),
"bigfield: prime limb diff is zero, but expected non-zero");
1549 size_t num_repetitions = 1;
1550 for (
size_t i = 0; i < num_repetitions; ++i) {
1552 if ((
uint256_t(scalar_a).get_bit(0) & 1) == 1) {
1558 P_a.set_origin_tag(submitted_value_origin_tag);
1562 x_a.set_origin_tag(challenge_origin_tag);
1566 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1568 fq c_x_result(c.x().get_value().lo);
1569 fq c_y_result(c.y().get_value().lo);
1571 EXPECT_EQ(c_x_result, expected.
x);
1572 EXPECT_EQ(c_y_result, expected.
y);
1580 const bool short_scalars =
false,
1581 const bool with_edgecases =
false)
1590 const bool short_scalars =
false,
1591 const bool with_edgecases =
false)
1595 const size_t num_points = point_types.size();
1597 std::vector<fr> scalars;
1601 for (
size_t i = 0; i < num_points; ++i) {
1603 if (short_scalars) {
1605 scalars.push_back(input_scalar);
1606 circuit_scalars.push_back(x);
1609 scalars.push_back(input_scalar);
1610 circuit_scalars.push_back(x);
1615 points.push_back(input_point);
1616 circuit_points.push_back(P);
1620 for (
size_t i = 0; i < num_points; ++i) {
1622 circuit_points[i].set_origin_tag(
OriginTag(0, i,
true));
1623 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1626 circuit_scalars[i].set_origin_tag(
OriginTag(0, i,
false));
1627 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1631 const auto get_128_bit_scalar = []() {
1635 fr scalar(scalar_u256);
1638 fr masking_scalar = with_edgecases ? get_128_bit_scalar() :
fr(1);
1642 element_ct result_point = element_ct::batch_mul(
1643 circuit_points, circuit_scalars, 0, with_edgecases, masking_scalar_ct);
1646 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1650 for (
size_t i = 0; i < num_points; ++i) {
1651 expected_point += (
element(points[i]) * scalars[i]);
1654 expected_point = expected_point.normalize();
1655 fq result_x(result_point.x().get_value().lo);
1656 fq result_y(result_point.y().get_value().lo);
1658 EXPECT_EQ(result_x, expected_point.x);
1659 EXPECT_EQ(result_y, expected_point.y);
1666 const size_t num_points = 5;
1669 std::vector<fr> scalars;
1670 for (
size_t i = 0; i < num_points; ++i) {
1678 for (
size_t i = 0; i < num_points; ++i) {
1679 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1682 circuit_points[i].set_origin_tag(
OriginTag(0, i,
true));
1683 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1684 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1687 circuit_scalars[i].set_origin_tag(
OriginTag(0, i,
false));
1688 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1691 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
1694 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1698 for (
size_t i = 0; i < num_points; ++i) {
1699 expected_point += (
element(points[i]) * scalars[i]);
1702 expected_point = expected_point.normalize();
1703 fq result_x(result_point.x().get_value().lo);
1704 fq result_y(result_point.y().get_value().lo);
1706 EXPECT_EQ(result_x, expected_point.x);
1707 EXPECT_EQ(result_y, expected_point.y);
1714 const size_t num_points = 5;
1717 std::vector<fr> scalars;
1718 for (
size_t i = 0; i < num_points; ++i) {
1727 for (
size_t i = 0; i < num_points; ++i) {
1728 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1731 circuit_points[i].set_origin_tag(
OriginTag(0, i,
true));
1732 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1733 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1736 circuit_scalars[i].set_origin_tag(
OriginTag(0, i,
false));
1737 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1741 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1744 EXPECT_EQ(result_point2.get_origin_tag(), tag_union);
1747 for (
size_t i = 0; i < num_points; ++i) {
1748 expected_point += (
element(points[i]) * scalars[i]);
1751 expected_point = expected_point.normalize();
1753 fq result2_x(result_point2.x().get_value().lo);
1754 fq result2_y(result_point2.y().get_value().lo);
1756 EXPECT_EQ(result2_x, expected_point.x);
1757 EXPECT_EQ(result2_y, expected_point.y);
1764 const auto test_repeated_points = [](
const uint32_t num_points) {
1766 info(
"num points: ", num_points);
1768 std::vector<fr> scalars;
1769 for (
size_t idx = 0; idx < num_points; idx++) {
1771 scalars.push_back(1);
1775 ASSERT_EQ(points.size(), scalars.size());
1781 for (
size_t i = 0; i < num_points; ++i) {
1782 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1785 circuit_points[i].set_origin_tag(
1787 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1788 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1791 circuit_scalars[i].set_origin_tag(
1793 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1796 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1799 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1801 auto expected_point = element::infinity();
1802 for (
const auto& point : points) {
1803 expected_point += point;
1805 expected_point = expected_point.normalize();
1807 fq result_x(result_point.x().get_value().lo);
1808 fq result_y(result_point.y().get_value().lo);
1810 EXPECT_EQ(result_x, expected_point.x);
1811 EXPECT_EQ(result_y, expected_point.y);
1815 test_repeated_points(2);
1816 test_repeated_points(3);
1817 test_repeated_points(4);
1818 test_repeated_points(5);
1819 test_repeated_points(6);
1820 test_repeated_points(7);
1829 std::vector<fr> scalars;
1830 scalars.push_back(1);
1831 scalars.push_back(1);
1834 ASSERT_EQ(points.size(), scalars.size());
1835 const size_t num_points = points.size();
1841 for (
size_t i = 0; i < num_points; ++i) {
1842 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1845 circuit_points[i].set_origin_tag(
1847 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1848 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1851 circuit_scalars[i].set_origin_tag(
1853 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1857 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1860 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1862 element expected_point = points[1];
1863 expected_point = expected_point.normalize();
1865 fq result_x(result_point.x().get_value().lo);
1866 fq result_y(result_point.y().get_value().lo);
1868 EXPECT_EQ(result_x, expected_point.x);
1869 EXPECT_EQ(result_y, expected_point.y);
1878 std::vector<fr> scalars;
1879 scalars.push_back(0);
1880 scalars.push_back(1);
1883 ASSERT_EQ(points.size(), scalars.size());
1884 const size_t num_points = points.size();
1889 for (
size_t i = 0; i < num_points; ++i) {
1890 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1893 circuit_points[i].set_origin_tag(
1895 tag_union =
OriginTag(tag_union, circuit_points[i].get_origin_tag());
1896 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1899 circuit_scalars[i].set_origin_tag(
1901 tag_union =
OriginTag(tag_union, circuit_scalars[i].get_origin_tag());
1905 element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1908 EXPECT_EQ(result_point.get_origin_tag(), tag_union);
1910 element expected_point = points[1];
1911 expected_point = expected_point.normalize();
1913 fq result_x(result_point.x().get_value().lo);
1914 fq result_y(result_point.y().get_value().lo);
1916 EXPECT_EQ(result_x, expected_point.x);
1917 EXPECT_EQ(result_y, expected_point.y);
1928 std::vector<fr> scalars;
1930 for (
size_t i = 0; i < 5; ++i) {
1938 for (
size_t i = 0; i < points.size(); ++i) {
1939 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1940 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1943 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1946 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1955 std::vector<fr> scalars;
1957 for (
size_t i = 0; i < 5; ++i) {
1965 for (
size_t i = 0; i < points.size(); ++i) {
1966 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1967 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1970 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
1973 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1982 std::vector<fr> scalars;
1984 for (
size_t i = 0; i < 6; ++i) {
1993 for (
size_t i = 0; i < points.size(); ++i) {
1994 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
1995 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
1998 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2001 element expected = element::infinity();
2002 for (
size_t i = 0; i < points.size(); ++i) {
2003 expected += (
element(points[i]) * scalars[i]);
2007 uint256_t result_x = result.x().get_value().lo;
2008 uint256_t result_y = result.y().get_value().lo;
2010 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2011 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2021 std::vector<fr> scalars;
2023 for (
size_t i = 0; i < 6; ++i) {
2032 for (
size_t i = 0; i < points.size(); ++i) {
2033 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2034 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2037 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2040 element expected = element::infinity();
2041 for (
size_t i = 0; i < points.size(); ++i) {
2042 if (!points[i].is_point_at_infinity()) {
2043 expected += (
element(points[i]) * scalars[i]);
2048 uint256_t result_x = result.x().get_value().lo;
2049 uint256_t result_y = result.y().get_value().lo;
2051 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2052 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2062 std::vector<fr> scalars;
2069 points.push_back(P);
2070 scalars.push_back(scalar);
2071 points.push_back(neg_P);
2072 scalars.push_back(scalar);
2075 for (
size_t i = 0; i < 3; ++i) {
2083 for (
size_t i = 0; i < points.size(); ++i) {
2084 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2085 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2088 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars, 0,
true);
2091 element expected = element::infinity();
2092 for (
size_t i = 0; i < points.size(); ++i) {
2093 expected += (
element(points[i]) * scalars[i]);
2097 uint256_t result_x = result.x().get_value().lo;
2098 uint256_t result_y = result.y().get_value().lo;
2100 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2101 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2111 std::vector<fr> scalars_native;
2116 for (
size_t i = 0; i < 3; ++i) {
2119 points_native.push_back(point);
2120 scalars_native.push_back(scalar);
2121 circuit_points.push_back(point_ct);
2126 for (
size_t i = 0; i < 3; ++i) {
2129 points_native.push_back(point);
2130 scalars_native.push_back(scalar);
2131 circuit_points.push_back(point_ct);
2136 for (
size_t i = 0; i < 4; ++i) {
2139 points_native.push_back(point);
2140 scalars_native.push_back(scalar);
2142 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalar));
2146 for (
size_t i = 0; i < 4; ++i) {
2149 points_native.push_back(point);
2150 scalars_native.push_back(scalar);
2151 circuit_points.push_back(point_ct);
2155 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
2158 element expected = element::infinity();
2159 for (
size_t i = 0; i < points_native.size(); ++i) {
2160 expected += (
element(points_native[i]) * scalars_native[i]);
2164 uint256_t result_x = result.x().get_value().lo;
2165 uint256_t result_y = result.y().get_value().lo;
2167 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2168 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2178 std::vector<fr> scalars;
2179 constexpr size_t num_points = 20;
2181 for (
size_t i = 0; i < num_points; ++i) {
2189 for (
size_t i = 0; i < points.size(); ++i) {
2190 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
2191 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
2194 element_ct result = element_ct::batch_mul(circuit_points, circuit_scalars);
2197 element expected = element::infinity();
2198 for (
size_t i = 0; i < points.size(); ++i) {
2199 expected += (
element(points[i]) * scalars[i]);
2203 uint256_t result_x = result.x().get_value().lo;
2204 uint256_t result_y = result.y().get_value().lo;
2206 EXPECT_EQ(
fq(result_x), expected_affine.
x);
2207 EXPECT_EQ(
fq(result_y), expected_affine.
y);
2241 TestFixture::test_basic_tag_logic();
2246 TestFixture::test_assert_coordinates_in_field();
2252 TestFixture::test_add();
2262 TestFixture::test_add_points_at_infinity();
2266 TestFixture::test_standard_form_of_point_at_infinity();
2272 TestFixture::test_sub();
2282 TestFixture::test_sub_points_at_infinity();
2286 TestFixture::test_dbl();
2294 TestFixture::test_dbl_with_infinity();
2299 GTEST_SKIP() <<
"mega builder does not support this edge case";
2301 TestFixture::test_dbl_with_y_zero();
2306 TestFixture::test_add_equals_dbl();
2310 TestFixture::test_sub_neg_equals_double();
2317 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2319 TestFixture::test_chain_add();
2325 GTEST_SKIP() <<
"mega builder does not implement chain_add function";
2342 GTEST_SKIP() <<
"mega builder does not implement multiple_montgomery_ladder function";
2344 TestFixture::test_multiple_montgomery_ladder();
2351 TestFixture::test_normalize();
2361 TestFixture::test_reduce();
2426 TestFixture::test_checked_unconditional_add_sub();
2437 TestFixture::test_conditional_negate();
2448 TestFixture::test_conditional_select();
2462 TestFixture::test_incomplete_assert_equal();
2466 TestFixture::test_incomplete_assert_equal_failure();
2470 TestFixture::test_incomplete_assert_equal_edge_cases();
2476 size_t num_repetitions = 1;
2477 for (
size_t i = 0; i < num_repetitions; i++) {
2478 TestFixture::test_compute_naf();
2481 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2488 TestFixture::test_compute_naf_zero();
2490 GTEST_SKIP() <<
"mega builder does not implement compute_naf function";
2496 TestFixture::test_mul();
2506 TestFixture::test_mul_edge_cases();
2518 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2520 TestFixture::test_short_scalar_mul_with_bit_lengths();
2527 GTEST_SKIP() <<
"mega builder does not implement scalar_mul function";
2529 TestFixture::test_short_scalar_mul_infinity();
2537 TestFixture::test_helper_batch_mul(1);
2543 TestFixture::test_helper_batch_mul(2);
2547 TestFixture::test_helper_batch_mul(2,
true);
2551 TestFixture::test_helper_batch_mul(2,
false,
true);
2555 TestFixture::test_helper_batch_mul(2,
true,
true);
2566 TestFixture::test_helper_batch_mul(3);
2572 TestFixture::test_helper_batch_mul(4);
2578 TestFixture::test_helper_batch_mul(5);
2582 TestFixture::test_helper_batch_mul(5,
false,
true);
2586 TestFixture::test_helper_batch_mul(5,
true);
2590 TestFixture::test_helper_batch_mul(5,
true,
true);
2594 TestFixture::test_helper_batch_mul(
2602 TestFixture::test_helper_batch_mul(6);
2607 TestFixture::test_twin_mul();
2612 TestFixture::test_twin_mul_with_infinity();
2617 TestFixture::test_batch_mul_linearly_dependent_generators();
2623 GTEST_SKIP() <<
"this failure test is designed for ultra builder only";
2625 TestFixture::test_batch_mul_linearly_dependent_generators_failure();
2631 TestFixture::test_one();
2636 TestFixture::test_batch_mul();
2641 TestFixture::test_batch_mul_edgecase_equivalence();
2645 TestFixture::test_batch_mul_edge_case_set1();
2650 TestFixture::test_batch_mul_edge_case_set2();
2656 TestFixture::test_batch_mul_all_infinity();
2661 TestFixture::test_batch_mul_all_zero_scalars();
2666 TestFixture::test_batch_mul_mixed_zero_scalars();
2671 TestFixture::test_batch_mul_mixed_infinity();
2676 TestFixture::test_batch_mul_cancellation();
2681 TestFixture::test_batch_mul_mixed_constant_witness();
2686 TestFixture::test_batch_mul_large_number_of_points();
#define EXPECT_THROW_OR_ABORT(statement, matcher)
stdlib_biggroup< TestType< stdlib::bn254< bb::UltraCircuitBuilder >, false > > bn254_with_ultra
testing::Types< bn254_with_ultra, bn254_with_ultra_scalar_bigfield, bn254_with_mega, secp256r1_with_ultra, secp256k1_with_ultra > TestTypes
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.
static affine_element infinity()
constexpr void self_set_infinity() noexcept
static constexpr affine_element one() noexcept
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.
void set_origin_tag(const OriginTag &new_tag) const
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_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_compute_naf()
typename g1::element element
static void test_multiple_montgomery_ladder()
static void test_batch_mul_cancellation()
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)
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_mul_edge_cases(InputType scalar_type=InputType::WITNESS, InputType point_type=InputType::WITNESS)
typename g1::affine_element affine_element
typename TestType::Curve Curve
static void test_incomplete_assert_equal_edge_cases()
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_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_incomplete_assert_equal_failure()
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
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_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_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(ShpleminiTest, TestSettings)
Inner sum(Cont< Inner, Args... > const &in)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
#define STANDARD_TESTING_TAGS
typename std::conditional< _use_bigfield, typename Curve::g1_bigfr_ct, typename Curve::Group >::type element_ct
typename std::conditional< _use_bigfield, typename Curve::bigfr_ct, typename Curve::ScalarField >::type scalar_ct
static const bool use_bigfield
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field reduce() const noexcept
static constexpr field zero()
#define HEAVY_TYPED_TEST(x, y)