295 cycle_group_ct input_a = cycle_group_ct::from_witness(&
builder, Element::random_element());
296 cycle_group_ct input_b = cycle_group_ct::from_witness(&
builder, Element::random_element());
297 cycle_group_ct input_c = cycle_group_ct(Element::random_element());
298 cycle_group_ct input_d = cycle_group_ct(Element::random_element());
300 input_b.set_point_at_infinity(
true);
301 input_d.set_point_at_infinity(
true);
305 cycle_group_ct input_e = cycle_group_ct(x, y,
true);
309 input_a.set_origin_tag(submitted_value_origin_tag);
310 input_b.set_origin_tag(challenge_origin_tag);
311 input_c.set_origin_tag(next_challenge_tag);
312 input_d.set_origin_tag(first_two_merged_tag);
314 auto standard_a = input_a.get_standard_form();
315 auto standard_b = input_b.get_standard_form();
316 auto standard_c = input_c.get_standard_form();
317 auto standard_d = input_d.get_standard_form();
318 auto standard_e = input_e.get_standard_form();
319 auto standard_f = input_f.get_standard_form();
321 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
false);
322 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
323 EXPECT_EQ(standard_c.is_point_at_infinity().get_value(),
false);
324 EXPECT_EQ(standard_d.is_point_at_infinity().get_value(),
true);
325 EXPECT_EQ(standard_e.is_point_at_infinity().get_value(),
true);
326 EXPECT_EQ(standard_f.is_point_at_infinity().get_value(),
true);
329 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
330 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
331 EXPECT_EQ(standard_c.get_origin_tag(), next_challenge_tag);
332 EXPECT_EQ(standard_d.get_origin_tag(), first_two_merged_tag);
334 auto input_a_x = input_a.x.get_value();
335 auto input_a_y = input_a.y.get_value();
336 auto input_c_x = input_c.x.get_value();
337 auto input_c_y = input_c.y.get_value();
339 auto standard_a_x = standard_a.x.get_value();
340 auto standard_a_y = standard_a.y.get_value();
342 auto standard_b_x = standard_b.x.get_value();
343 auto standard_b_y = standard_b.y.get_value();
345 auto standard_c_x = standard_c.x.get_value();
346 auto standard_c_y = standard_c.y.get_value();
348 auto standard_d_x = standard_d.x.get_value();
349 auto standard_d_y = standard_d.y.get_value();
351 auto standard_e_x = standard_e.x.get_value();
352 auto standard_e_y = standard_e.y.get_value();
354 auto standard_f_x = standard_f.x.get_value();
355 auto standard_f_y = standard_f.y.get_value();
357 EXPECT_EQ(input_a_x, standard_a_x);
358 EXPECT_EQ(input_a_y, standard_a_y);
359 EXPECT_EQ(standard_b_x, 0);
360 EXPECT_EQ(standard_b_y, 0);
361 EXPECT_EQ(input_c_x, standard_c_x);
362 EXPECT_EQ(input_c_y, standard_c_y);
363 EXPECT_EQ(standard_d_x, 0);
364 EXPECT_EQ(standard_d_y, 0);
365 EXPECT_EQ(standard_e_x, 0);
366 EXPECT_EQ(standard_e_y, 0);
367 EXPECT_EQ(standard_f_x, 0);
368 EXPECT_EQ(standard_f_y, 0);
477 auto lhs = TestFixture::generators[0];
478 auto rhs = -TestFixture::generators[1];
480 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, rhs);
485 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
486 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
488 a.set_origin_tag(submitted_value_origin_tag);
489 b.set_origin_tag(challenge_origin_tag);
490 cycle_group_ct c =
a +
b;
492 AffineElement result = c.get_value();
493 EXPECT_EQ(result, expected);
495 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
500 cycle_group_ct
a = point_at_infinity;
501 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
502 a.set_origin_tag(submitted_value_origin_tag);
503 b.set_origin_tag(challenge_origin_tag);
505 cycle_group_ct c =
a +
b;
506 AffineElement result = c.get_value();
507 EXPECT_EQ(result, rhs);
508 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
513 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
514 cycle_group_ct
b = point_at_infinity;
515 a.set_origin_tag(submitted_value_origin_tag);
516 b.set_origin_tag(challenge_origin_tag);
518 cycle_group_ct c =
a +
b;
519 AffineElement result = c.get_value();
520 EXPECT_EQ(result, lhs);
521 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
526 cycle_group_ct
a = point_at_infinity;
527 cycle_group_ct
b = point_at_infinity;
528 a.set_origin_tag(submitted_value_origin_tag);
529 b.set_origin_tag(challenge_origin_tag);
531 cycle_group_ct c =
a +
b;
532 EXPECT_TRUE(c.is_point_at_infinity().get_value());
533 EXPECT_TRUE(c.get_value().is_point_at_infinity());
534 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
539 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
540 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
541 a.set_origin_tag(submitted_value_origin_tag);
542 b.set_origin_tag(challenge_origin_tag);
544 cycle_group_ct c =
a +
b;
545 EXPECT_TRUE(c.is_point_at_infinity().get_value());
546 EXPECT_TRUE(c.get_value().is_point_at_infinity());
547 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
552 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
553 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
554 a.set_origin_tag(submitted_value_origin_tag);
555 b.set_origin_tag(challenge_origin_tag);
557 cycle_group_ct c =
a +
b;
558 AffineElement expected((
Element(lhs)).dbl());
559 AffineElement result = c.get_value();
560 EXPECT_EQ(result, expected);
561 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
565 EXPECT_EQ(proof_result,
true);
644 auto lhs = TestFixture::generators[0];
645 auto rhs = -TestFixture::generators[1];
647 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, rhs);
652 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
653 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
655 a.set_origin_tag(submitted_value_origin_tag);
656 b.set_origin_tag(challenge_origin_tag);
658 cycle_group_ct c =
a -
b;
660 AffineElement result = c.get_value();
661 EXPECT_EQ(result, expected);
663 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
668 cycle_group_ct
a = point_at_infinity;
669 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
670 a.set_origin_tag(submitted_value_origin_tag);
671 b.set_origin_tag(challenge_origin_tag);
673 cycle_group_ct c =
a -
b;
674 AffineElement result = c.get_value();
675 EXPECT_EQ(result, -rhs);
676 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
681 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
682 cycle_group_ct
b = point_at_infinity;
683 a.set_origin_tag(submitted_value_origin_tag);
684 b.set_origin_tag(challenge_origin_tag);
686 cycle_group_ct c =
a -
b;
687 AffineElement result = c.get_value();
688 EXPECT_EQ(result, lhs);
689 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
694 cycle_group_ct
a = point_at_infinity;
695 cycle_group_ct
b = point_at_infinity;
696 a.set_origin_tag(submitted_value_origin_tag);
697 b.set_origin_tag(challenge_origin_tag);
699 cycle_group_ct c =
a -
b;
700 EXPECT_TRUE(c.is_point_at_infinity().get_value());
701 EXPECT_TRUE(c.get_value().is_point_at_infinity());
702 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
707 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
708 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
709 a.set_origin_tag(submitted_value_origin_tag);
710 b.set_origin_tag(challenge_origin_tag);
712 cycle_group_ct c =
a -
b;
713 AffineElement expected((
Element(lhs)).dbl());
714 AffineElement result = c.get_value();
715 EXPECT_EQ(result, expected);
716 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
721 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
722 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
723 a.set_origin_tag(submitted_value_origin_tag);
724 b.set_origin_tag(challenge_origin_tag);
726 cycle_group_ct c =
a -
b;
727 EXPECT_TRUE(c.is_point_at_infinity().get_value());
728 EXPECT_TRUE(c.get_value().is_point_at_infinity());
729 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
733 EXPECT_EQ(proof_result,
true);
741 const size_t num_muls = 1;
748 auto assign_and_merge_tags = [](
auto& points,
auto& scalars) {
750 for (
size_t i = 0; i < points.size(); i++) {
751 const auto point_tag =
OriginTag(0, i,
true);
752 const auto scalar_tag =
OriginTag(0, i,
false);
755 points[i].set_origin_tag(point_tag);
756 scalars[i].set_origin_tag(scalar_tag);
764 Element expected = Group::point_at_infinity;
766 for (
size_t i = 0; i < num_muls; ++i) {
767 auto element = TestFixture::generators[i];
768 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
771 expected += (element * scalar);
772 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
773 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
776 expected += (element * scalar);
777 points.emplace_back(cycle_group_ct(element));
778 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
781 expected += (element * scalar);
782 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
783 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
786 expected += (element * scalar);
787 points.emplace_back(cycle_group_ct(element));
788 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
792 const auto expected_tag = assign_and_merge_tags(points, scalars);
794 auto result = cycle_group_ct::batch_mul(points, scalars);
795 EXPECT_EQ(result.get_value(), AffineElement(expected));
797 EXPECT_EQ(result.get_origin_tag(), expected_tag);
805 auto element = TestFixture::generators[0];
806 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
807 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
808 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
810 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
811 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, -scalar));
813 const auto expected_tag = assign_and_merge_tags(points, scalars);
815 auto result = cycle_group_ct::batch_mul(points, scalars);
816 EXPECT_TRUE(result.is_point_at_infinity().get_value());
818 EXPECT_EQ(result.get_origin_tag(), expected_tag);
826 auto element = TestFixture::generators[0];
827 typename Group::Fr scalar = 0;
828 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
829 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
831 const auto expected_tag = assign_and_merge_tags(points, scalars);
832 auto result = cycle_group_ct::batch_mul(points, scalars);
833 EXPECT_TRUE(result.is_point_at_infinity().get_value());
834 EXPECT_EQ(result.get_origin_tag(), expected_tag);
842 auto element = TestFixture::generators[0];
843 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
847 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, element);
849 points.emplace_back(point);
850 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
854 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, element);
855 point.set_point_at_infinity(
true);
856 points.emplace_back(point);
857 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
860 const auto expected_tag = assign_and_merge_tags(points, scalars);
861 auto result = cycle_group_ct::batch_mul(points, scalars);
862 EXPECT_TRUE(result.is_point_at_infinity().get_value());
863 EXPECT_EQ(result.get_origin_tag(), expected_tag);
872 Element expected = Group::point_at_infinity;
873 for (
size_t i = 0; i < num_muls; ++i) {
875 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
878 expected += (element * scalar);
879 points.emplace_back(element);
880 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
881 scalars_native.emplace_back(
uint256_t(scalar));
885 expected += (element * scalar);
886 points.emplace_back(element);
887 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
888 scalars_native.emplace_back(
uint256_t(scalar));
890 const auto expected_tag = assign_and_merge_tags(points, scalars);
891 auto result = cycle_group_ct::batch_mul(points, scalars);
892 EXPECT_EQ(result.get_value(), AffineElement(expected));
894 EXPECT_EQ(result.get_origin_tag(), expected_tag);
903 Element expected = Group::point_at_infinity;
904 for (
size_t i = 0; i < num_muls; ++i) {
906 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
909 expected += (element * scalar);
910 points.emplace_back(element);
911 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
912 scalars_native.emplace_back(scalar);
916 expected += (element * scalar);
917 points.emplace_back(element);
918 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
919 scalars_native.emplace_back(scalar);
922 scalar = Group::Fr::random_element(&
engine);
923 element = Group::one * Group::Fr::random_element(&
engine);
924 expected += (element * scalar);
925 points.emplace_back(element);
926 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
927 scalars_native.emplace_back(scalar);
929 const auto expected_tag = assign_and_merge_tags(points, scalars);
930 auto result = cycle_group_ct::batch_mul(points, scalars);
931 EXPECT_EQ(result.get_value(), AffineElement(expected));
932 EXPECT_EQ(result.get_origin_tag(), expected_tag);
940 for (
size_t i = 0; i < num_muls; ++i) {
942 typename Group::Fr scalar = 0;
945 points.emplace_back((element));
946 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
949 points.emplace_back((element));
950 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
952 const auto expected_tag = assign_and_merge_tags(points, scalars);
953 auto result = cycle_group_ct::batch_mul(points, scalars);
954 EXPECT_EQ(result.is_point_at_infinity().get_value(),
true);
955 EXPECT_EQ(result.get_origin_tag(), expected_tag);
959 EXPECT_EQ(check_result,
true);
1059 const auto run_test = [](
bool construct_witnesses) {
1061 auto scalar1 = FF::random_element(&
engine);
1062 auto scalar2 = FF::random_element(&
engine);
1066 if (construct_witnesses) {
1067 big_scalar1 = FF_ct::from_witness(&
builder, scalar1);
1068 big_scalar2 = FF_ct::from_witness(&
builder, scalar2);
1070 big_scalar1 = FF_ct(scalar1);
1071 big_scalar2 = FF_ct(scalar2);
1073 cycle_group_ct result1 = cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1074 { big_scalar1, big_scalar2 });
1076 cycle_group_ct result2 =
1077 cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1078 { cycle_scalar_ct(big_scalar1), cycle_scalar_ct(big_scalar2) });
1080 AffineElement result1_native = result1.get_value();
1081 AffineElement result2_native = result2.get_value();
1082 EXPECT_EQ(result1_native.x, result2_native.x);
1083 EXPECT_EQ(result1_native.y, result2_native.y);
1084 if (construct_witnesses) {