73 auto lhs = TestFixture::generators[0];
78 x.set_origin_tag(submitted_value_origin_tag);
79 y.set_origin_tag(challenge_origin_tag);
84 cycle_group_ct
a(x, y,
true);
88 EXPECT_EQ(
a.get_origin_tag(), first_two_merged_tag);
96 y_normal.set_origin_tag(constant_tag);
99 cycle_group_ct
b(x_death, y_normal,
false);
102 b.x().set_origin_tag(instant_death_tag);
105 EXPECT_THROW(
b.get_origin_tag(), std::runtime_error);
173 auto c1 = cycle_group_ct(AffineElement::one());
174 auto cw8 = cycle_group_ct::from_constant_witness(&
builder, AffineElement::one() * 0);
175 auto w11 = cycle_group_ct::from_witness(&
builder, TestFixture::generators[0]);
181 auto w27 = w10 - w11;
184 check_circuit_and_gate_count(
builder, 44);
212 auto c0 = cycle_group_ct(TestFixture::generators[0]);
213 auto c1 = cycle_group_ct(-TestFixture::generators[0]);
214 auto w2 = cycle_group_ct::conditional_assign(bool_ct(
witness_ct(&
builder,
true)), c0, c1);
215 EXPECT_FALSE(w2.x().is_constant());
216 EXPECT_FALSE(w2.y().is_constant());
217 EXPECT_TRUE(w2.is_point_at_infinity().is_constant());
220 check_circuit_and_gate_count(
builder, 5);
306 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
307 cycle_group_ct input_a = cycle_group_ct::from_witness(&
builder, Element::random_element());
308 cycle_group_ct input_b = cycle_group_ct::from_witness(&
builder, affine_infinity);
309 cycle_group_ct input_c = cycle_group_ct(Element::random_element());
310 cycle_group_ct input_d = cycle_group_ct(affine_infinity);
313 input_a.set_origin_tag(submitted_value_origin_tag);
314 input_b.set_origin_tag(challenge_origin_tag);
315 input_c.set_origin_tag(next_challenge_tag);
316 input_d.set_origin_tag(first_two_merged_tag);
318 input_a.standardize();
319 auto standard_a = input_a;
320 input_b.standardize();
321 auto standard_b = input_b;
322 input_c.standardize();
323 auto standard_c = input_c;
324 input_d.standardize();
325 auto standard_d = input_d;
327 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
false);
328 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
329 EXPECT_EQ(standard_c.is_point_at_infinity().get_value(),
false);
330 EXPECT_EQ(standard_d.is_point_at_infinity().get_value(),
true);
333 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
334 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
335 EXPECT_EQ(standard_c.get_origin_tag(), next_challenge_tag);
336 EXPECT_EQ(standard_d.get_origin_tag(), first_two_merged_tag);
338 auto input_a_x = input_a.x().get_value();
339 auto input_a_y = input_a.y().get_value();
340 auto input_c_x = input_c.x().get_value();
341 auto input_c_y = input_c.y().get_value();
343 auto standard_a_x = standard_a.x().get_value();
344 auto standard_a_y = standard_a.y().get_value();
346 auto standard_b_x = standard_b.x().get_value();
347 auto standard_b_y = standard_b.y().get_value();
349 auto standard_c_x = standard_c.x().get_value();
350 auto standard_c_y = standard_c.y().get_value();
352 auto standard_d_x = standard_d.x().get_value();
353 auto standard_d_y = standard_d.y().get_value();
355 EXPECT_EQ(input_a_x, standard_a_x);
356 EXPECT_EQ(input_a_y, standard_a_y);
357 EXPECT_EQ(standard_b_x, 0);
358 EXPECT_EQ(standard_b_y, 0);
359 EXPECT_EQ(input_c_x, standard_c_x);
360 EXPECT_EQ(input_c_y, standard_c_y);
361 EXPECT_EQ(standard_d_x, 0);
362 EXPECT_EQ(standard_d_y, 0);
364 check_circuit_and_gate_count(
builder, 24);
371 auto lhs = TestFixture::generators[0];
372 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
373 cycle_group_ct
b = cycle_group_ct(lhs);
375 a.set_origin_tag(submitted_value_origin_tag);
376 b.set_origin_tag(challenge_origin_tag);
379 for (
size_t i = 0; i < 3; ++i) {
383 AffineElement expected(
Element(lhs).dbl());
384 AffineElement result = c.get_value();
385 EXPECT_EQ(result, expected);
386 EXPECT_EQ(d.get_value(), expected);
388 check_circuit_and_gate_count(
builder, 19);
391 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
392 EXPECT_EQ(d.get_origin_tag(), challenge_origin_tag);
402 auto lhs = TestFixture::generators[0];
403 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
406 AffineElement hint(doubled_element);
408 cycle_group_ct result =
a.dbl(hint);
410 EXPECT_EQ(result.get_value(), hint);
411 EXPECT_FALSE(result.is_point_at_infinity().get_value());
413 check_circuit_and_gate_count(
builder, 13);
419 auto lhs = TestFixture::generators[1];
420 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
422 cycle_group_ct result =
a.dbl();
425 AffineElement expected(expected_element);
426 EXPECT_EQ(result.get_value(), expected);
427 EXPECT_FALSE(result.is_point_at_infinity().get_value());
430 check_circuit_and_gate_count(
builder, 13);
436 AffineElement infinity_element;
437 infinity_element.self_set_infinity();
439 cycle_group_ct infinity = cycle_group_ct::from_witness(&
builder, infinity_element);
441 cycle_group_ct result = infinity.dbl();
443 EXPECT_TRUE(result.is_point_at_infinity().get_value());
446 EXPECT_EQ(result.x().get_value(), 0);
449 check_circuit_and_gate_count(
builder, 13);
460 auto lhs = TestFixture::generators[0];
461 cycle_group_ct
a(lhs);
464 AffineElement hint(doubled_element);
466 cycle_group_ct result =
a.dbl(hint);
468 EXPECT_EQ(result.get_value(), hint);
469 EXPECT_TRUE(result.is_constant());
470 EXPECT_FALSE(result.is_point_at_infinity().get_value());
472 check_circuit_and_gate_count(
builder, 0);
478 auto lhs = TestFixture::generators[1];
479 cycle_group_ct
a(lhs);
481 cycle_group_ct result =
a.dbl();
484 AffineElement expected(expected_element);
485 EXPECT_EQ(result.get_value(), expected);
486 EXPECT_TRUE(result.is_constant());
487 EXPECT_FALSE(result.is_point_at_infinity().get_value());
489 check_circuit_and_gate_count(
builder, 0);
495 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
497 cycle_group_ct result = infinity.dbl();
499 EXPECT_TRUE(result.is_point_at_infinity().get_value());
500 EXPECT_TRUE(result.is_constant());
501 EXPECT_EQ(result.x().get_value(), 0);
502 EXPECT_EQ(result.y().get_value(), 0);
504 check_circuit_and_gate_count(
builder, 0);
510 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
513 hint.self_set_infinity();
515 cycle_group_ct result = infinity.dbl(hint);
517 EXPECT_TRUE(result.is_point_at_infinity().get_value());
518 EXPECT_TRUE(result.is_constant());
519 EXPECT_EQ(result.x().get_value(), 0);
520 EXPECT_EQ(result.y().get_value(), 0);
522 check_circuit_and_gate_count(
builder, 0);
555 auto lhs = TestFixture::generators[0];
556 auto rhs = TestFixture::generators[1];
557 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
558 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
560 cycle_group_ct result =
a.unconditional_add(
b);
563 AffineElement expected(expected_element);
564 EXPECT_EQ(result.get_value(), expected);
565 EXPECT_FALSE(result.is_point_at_infinity().get_value());
567 check_circuit_and_gate_count(
builder, 22);
573 auto lhs = TestFixture::generators[2];
574 auto rhs = TestFixture::generators[3];
575 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
576 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
579 AffineElement hint(sum_element);
581 cycle_group_ct result =
a.unconditional_add(
b, hint);
583 EXPECT_EQ(result.get_value(), hint);
584 EXPECT_FALSE(result.is_point_at_infinity().get_value());
586 check_circuit_and_gate_count(
builder, 22);
592 auto lhs = TestFixture::generators[0];
593 auto rhs = TestFixture::generators[1];
594 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
595 cycle_group_ct
b(rhs);
597 cycle_group_ct result =
a.unconditional_add(
b);
600 AffineElement expected(expected_element);
601 EXPECT_EQ(result.get_value(), expected);
602 EXPECT_FALSE(result.is_constant());
603 EXPECT_FALSE(result.is_point_at_infinity().get_value());
605 check_circuit_and_gate_count(
builder, 14);
616 auto lhs = TestFixture::generators[0];
617 auto rhs = TestFixture::generators[1];
618 cycle_group_ct
a(lhs);
619 cycle_group_ct
b(rhs);
621 cycle_group_ct result =
a.unconditional_add(
b);
624 AffineElement expected(expected_element);
625 EXPECT_EQ(result.get_value(), expected);
626 EXPECT_TRUE(result.is_constant());
627 EXPECT_FALSE(result.is_point_at_infinity().get_value());
629 check_circuit_and_gate_count(
builder, 0);
635 auto lhs = TestFixture::generators[2];
636 auto rhs = TestFixture::generators[3];
637 cycle_group_ct
a(lhs);
638 cycle_group_ct
b(rhs);
641 AffineElement hint(sum_element);
643 cycle_group_ct result =
a.unconditional_add(
b, hint);
645 EXPECT_EQ(result.get_value(), hint);
646 EXPECT_TRUE(result.is_constant());
647 EXPECT_FALSE(result.is_point_at_infinity().get_value());
649 check_circuit_and_gate_count(
builder, 0);
660 auto lhs = TestFixture::generators[0];
661 auto rhs = TestFixture::generators[1];
662 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
663 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
665 cycle_group_ct result =
a.unconditional_subtract(
b);
668 AffineElement expected(expected_element);
669 EXPECT_EQ(result.get_value(), expected);
670 EXPECT_FALSE(result.is_point_at_infinity().get_value());
672 check_circuit_and_gate_count(
builder, 22);
678 auto lhs = TestFixture::generators[2];
679 auto rhs = TestFixture::generators[3];
680 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
681 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
684 AffineElement hint(diff_element);
686 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
688 EXPECT_EQ(result.get_value(), hint);
689 EXPECT_FALSE(result.is_point_at_infinity().get_value());
692 check_circuit_and_gate_count(
builder, 22);
698 auto lhs = TestFixture::generators[0];
699 auto rhs = TestFixture::generators[1];
700 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
701 cycle_group_ct
b(rhs);
703 cycle_group_ct result =
a.unconditional_subtract(
b);
706 AffineElement expected(expected_element);
707 EXPECT_EQ(result.get_value(), expected);
708 EXPECT_FALSE(result.is_constant());
709 EXPECT_FALSE(result.is_point_at_infinity().get_value());
711 check_circuit_and_gate_count(
builder, 14);
722 auto lhs = TestFixture::generators[0];
723 auto rhs = TestFixture::generators[1];
724 cycle_group_ct
a(lhs);
725 cycle_group_ct
b(rhs);
727 cycle_group_ct result =
a.unconditional_subtract(
b);
730 AffineElement expected(expected_element);
731 EXPECT_EQ(result.get_value(), expected);
732 EXPECT_TRUE(result.is_constant());
733 EXPECT_FALSE(result.is_point_at_infinity().get_value());
735 check_circuit_and_gate_count(
builder, 0);
741 auto lhs = TestFixture::generators[2];
742 auto rhs = TestFixture::generators[3];
743 cycle_group_ct
a(lhs);
744 cycle_group_ct
b(rhs);
747 AffineElement hint(diff_element);
749 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
751 EXPECT_EQ(result.get_value(), hint);
752 EXPECT_TRUE(result.is_constant());
753 EXPECT_FALSE(result.is_point_at_infinity().get_value());
755 check_circuit_and_gate_count(
builder, 0);
765 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
766 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
767 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
769 a.set_origin_tag(submitted_value_origin_tag);
770 b.set_origin_tag(challenge_origin_tag);
771 cycle_group_ct c =
a.unconditional_add(
b);
773 AffineElement result = c.get_value();
774 EXPECT_EQ(result, expected);
776 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
779 add(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
780 add(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
781 add(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
782 add(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
784 check_circuit_and_gate_count(
builder, 50);
792 auto lhs = TestFixture::generators[0];
793 auto rhs = TestFixture::generators[1];
796 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
797 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
798 cycle_group_ct c =
a.checked_unconditional_add(
b);
800 AffineElement result = c.get_value();
801 EXPECT_EQ(result, expected);
803 check_circuit_and_gate_count(
builder, 24);
831 auto lhs = TestFixture::generators[0];
832 auto rhs = -TestFixture::generators[1];
834 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
835 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
838 a.set_origin_tag(submitted_value_origin_tag);
839 b.set_origin_tag(challenge_origin_tag);
841 cycle_group_ct c =
a +
b;
844 EXPECT_EQ(c.get_value(), expected);
845 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
847 check_circuit_and_gate_count(
builder, 55);
856 auto rhs = -TestFixture::generators[1];
857 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
859 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
861 cycle_group_ct
a = point_at_infinity;
862 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
864 a.set_origin_tag(submitted_value_origin_tag);
865 b.set_origin_tag(challenge_origin_tag);
867 cycle_group_ct c =
a +
b;
870 EXPECT_EQ(c.get_value(), rhs);
871 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
873 check_circuit_and_gate_count(
builder, 55);
882 auto lhs = TestFixture::generators[0];
883 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
885 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
887 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
888 cycle_group_ct
b = point_at_infinity;
890 a.set_origin_tag(submitted_value_origin_tag);
891 b.set_origin_tag(challenge_origin_tag);
893 cycle_group_ct c =
a +
b;
896 EXPECT_EQ(c.get_value(), lhs);
897 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
900 check_circuit_and_gate_count(
builder, 55);
909 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
911 cycle_group_ct point_at_infinity1 = cycle_group_ct::from_witness(&
builder, affine_infinity);
913 cycle_group_ct point_at_infinity2 = cycle_group_ct::from_witness(&
builder, affine_infinity);
915 cycle_group_ct
a = point_at_infinity1;
916 cycle_group_ct
b = point_at_infinity2;
918 a.set_origin_tag(submitted_value_origin_tag);
919 b.set_origin_tag(challenge_origin_tag);
921 cycle_group_ct c =
a +
b;
924 EXPECT_TRUE(c.is_point_at_infinity().get_value());
925 EXPECT_TRUE(c.get_value().is_point_at_infinity());
926 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
928 check_circuit_and_gate_count(
builder, 55);
937 auto lhs = TestFixture::generators[0];
939 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
940 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
942 a.set_origin_tag(submitted_value_origin_tag);
943 b.set_origin_tag(challenge_origin_tag);
945 cycle_group_ct c =
a +
b;
947 EXPECT_TRUE(c.is_point_at_infinity().get_value());
948 EXPECT_TRUE(c.get_value().is_point_at_infinity());
949 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
951 check_circuit_and_gate_count(
builder, 55);
960 auto lhs = TestFixture::generators[0];
962 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
963 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
965 a.set_origin_tag(submitted_value_origin_tag);
966 b.set_origin_tag(challenge_origin_tag);
968 cycle_group_ct c =
a +
b;
970 AffineElement expected((
Element(lhs)).dbl());
971 EXPECT_EQ(c.get_value(), expected);
972 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
974 check_circuit_and_gate_count(
builder, 55);
985 auto lhs = TestFixture::generators[5];
986 auto rhs = TestFixture::generators[6];
988 cycle_group_ct
a(lhs);
989 cycle_group_ct
b(rhs);
991 cycle_group_ct result =
a +
b;
994 EXPECT_EQ(result.get_value(), expected);
995 EXPECT_TRUE(result.is_constant());
998 check_circuit_and_gate_count(
builder, 0);
1004 auto lhs = TestFixture::generators[7];
1006 cycle_group_ct
a(lhs);
1007 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1009 cycle_group_ct result =
a +
b;
1011 EXPECT_EQ(result.get_value(), lhs);
1012 EXPECT_TRUE(result.is_constant());
1015 check_circuit_and_gate_count(
builder, 0);
1029 auto lhs = TestFixture::generators[10];
1031 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1032 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1034 cycle_group_ct result =
a +
b;
1036 EXPECT_EQ(result.get_value(), lhs);
1037 EXPECT_FALSE(result.is_constant());
1040 check_circuit_and_gate_count(
builder, 10);
1046 auto lhs = TestFixture::generators[11];
1047 auto rhs = TestFixture::generators[12];
1049 cycle_group_ct
a(lhs);
1050 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1052 cycle_group_ct result =
a +
b;
1055 EXPECT_EQ(result.get_value(), expected);
1056 EXPECT_FALSE(result.is_constant());
1059 check_circuit_and_gate_count(
builder, 27);
1071 auto point = TestFixture::generators[0];
1072 auto neg_point = -point;
1074 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1075 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, neg_point);
1077 cycle_group_ct result =
a +
b;
1080 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1081 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1086 cycle_group_ct inf1 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1087 cycle_group_ct inf2 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1089 cycle_group_ct result = inf1 + inf2;
1092 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1093 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1098 auto point = TestFixture::generators[1];
1100 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1101 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1103 cycle_group_ct result =
a +
b;
1106 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1107 EXPECT_EQ(result.get_value(), point);
1112 auto point = TestFixture::generators[2];
1114 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1115 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1117 cycle_group_ct result =
a +
b;
1120 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1121 EXPECT_EQ(result.get_value(), point);
1126 auto point = TestFixture::generators[3];
1128 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1129 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1131 cycle_group_ct result =
a +
b;
1134 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1136 AffineElement expected(
Element(point).dbl());
1137 EXPECT_EQ(result.get_value(), expected);
1140 check_circuit_and_gate_count(
builder, 275);
1149 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
1150 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
1151 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
1153 a.set_origin_tag(submitted_value_origin_tag);
1154 b.set_origin_tag(challenge_origin_tag);
1156 cycle_group_ct c =
a.unconditional_subtract(
b);
1158 AffineElement result = c.get_value();
1159 EXPECT_EQ(result, expected);
1161 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1164 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
1165 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
1166 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
1167 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
1169 check_circuit_and_gate_count(
builder, 50);
1177 auto lhs = TestFixture::generators[0];
1178 auto rhs = TestFixture::generators[1];
1181 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1182 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1183 cycle_group_ct c =
a.checked_unconditional_subtract(
b);
1185 AffineElement result = c.get_value();
1186 EXPECT_EQ(result, expected);
1188 check_circuit_and_gate_count(
builder, 24);
1216 auto lhs = TestFixture::generators[0];
1217 auto rhs = -TestFixture::generators[1];
1218 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1220 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
1224 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1225 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1227 a.set_origin_tag(submitted_value_origin_tag);
1228 b.set_origin_tag(challenge_origin_tag);
1230 cycle_group_ct c =
a -
b;
1232 AffineElement result = c.get_value();
1233 EXPECT_EQ(result, expected);
1235 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1240 cycle_group_ct
a = point_at_infinity;
1241 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1242 a.set_origin_tag(submitted_value_origin_tag);
1243 b.set_origin_tag(challenge_origin_tag);
1245 cycle_group_ct c =
a -
b;
1246 AffineElement result = c.get_value();
1247 EXPECT_EQ(result, -rhs);
1248 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1253 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1254 cycle_group_ct
b = point_at_infinity;
1255 a.set_origin_tag(submitted_value_origin_tag);
1256 b.set_origin_tag(challenge_origin_tag);
1258 cycle_group_ct c =
a -
b;
1259 AffineElement result = c.get_value();
1260 EXPECT_EQ(result, lhs);
1261 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1266 cycle_group_ct
a = point_at_infinity;
1267 cycle_group_ct
b = point_at_infinity;
1268 a.set_origin_tag(submitted_value_origin_tag);
1269 b.set_origin_tag(challenge_origin_tag);
1271 cycle_group_ct c =
a -
b;
1272 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1273 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1274 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1279 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1280 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
1281 a.set_origin_tag(submitted_value_origin_tag);
1282 b.set_origin_tag(challenge_origin_tag);
1284 cycle_group_ct c =
a -
b;
1285 AffineElement expected((
Element(lhs)).dbl());
1286 AffineElement result = c.get_value();
1287 EXPECT_EQ(result, expected);
1288 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1293 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1294 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
1295 a.set_origin_tag(submitted_value_origin_tag);
1296 b.set_origin_tag(challenge_origin_tag);
1298 cycle_group_ct c =
a -
b;
1299 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1300 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1301 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1304 check_circuit_and_gate_count(
builder, 297);
1315 auto lhs = TestFixture::generators[5];
1316 auto rhs = TestFixture::generators[6];
1318 cycle_group_ct
a(lhs);
1319 cycle_group_ct
b(rhs);
1321 cycle_group_ct result =
a -
b;
1324 EXPECT_EQ(result.get_value(), expected);
1325 EXPECT_TRUE(result.is_constant());
1328 check_circuit_and_gate_count(
builder, 0);
1334 auto lhs = TestFixture::generators[7];
1336 cycle_group_ct
a(lhs);
1337 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1339 cycle_group_ct result =
a -
b;
1341 EXPECT_EQ(result.get_value(), lhs);
1342 EXPECT_TRUE(result.is_constant());
1345 check_circuit_and_gate_count(
builder, 0);
1351 auto rhs = TestFixture::generators[7];
1353 cycle_group_ct
a = cycle_group_ct::constant_infinity(&
builder);
1354 cycle_group_ct
b(rhs);
1356 cycle_group_ct result =
a -
b;
1358 EXPECT_EQ(result.get_value(), -rhs);
1359 EXPECT_TRUE(result.is_constant());
1362 check_circuit_and_gate_count(
builder, 0);
1391 const size_t num_muls = 1;
1395 Element expected = Group::point_at_infinity;
1397 for (
size_t i = 0; i < num_muls; ++i) {
1398 auto element = TestFixture::generators[i];
1399 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1402 expected += (element * scalar);
1403 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1404 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1407 expected += (element * scalar);
1408 points.emplace_back(cycle_group_ct(element));
1409 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1412 expected += (element * scalar);
1413 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1414 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1417 expected += (element * scalar);
1418 points.emplace_back(cycle_group_ct(element));
1419 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1425 auto result = cycle_group_ct::batch_mul(points, scalars);
1426 EXPECT_EQ(result.get_value(), AffineElement(expected));
1428 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1431 check_circuit_and_gate_count(
builder, 4401);
1433 check_circuit_and_gate_count(
builder, 4404);
1446 auto element = TestFixture::generators[0];
1447 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1448 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1449 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1451 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1452 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, -scalar));
1456 auto result = cycle_group_ct::batch_mul(points, scalars);
1457 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1459 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1462 check_circuit_and_gate_count(
builder, 4027);
1464 check_circuit_and_gate_count(
builder, 4030);
1477 auto element = TestFixture::generators[0];
1478 typename Group::Fr scalar = 0;
1479 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1480 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1483 auto result = cycle_group_ct::batch_mul(points, scalars);
1484 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1485 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1488 check_circuit_and_gate_count(
builder, 3533);
1490 check_circuit_and_gate_count(
builder, 3536);
1503 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1504 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1508 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, affine_infinity);
1509 points.emplace_back(point);
1510 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1514 cycle_group_ct point = cycle_group_ct(affine_infinity);
1515 points.emplace_back(point);
1516 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1520 auto result = cycle_group_ct::batch_mul(points, scalars);
1521 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1522 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1526 check_circuit_and_gate_count(
builder, 3584);
1528 check_circuit_and_gate_count(
builder, 3587);
1537 const size_t num_muls = 1;
1543 Element expected = Group::point_at_infinity;
1544 for (
size_t i = 0; i < num_muls; ++i) {
1546 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1549 expected += (element * scalar);
1550 points.emplace_back(element);
1551 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1552 scalars_native.emplace_back(
uint256_t(scalar));
1556 expected += (element * scalar);
1557 points.emplace_back(element);
1558 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1559 scalars_native.emplace_back(
uint256_t(scalar));
1562 auto result = cycle_group_ct::batch_mul(points, scalars);
1563 EXPECT_EQ(result.get_value(), AffineElement(expected));
1565 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1567 check_circuit_and_gate_count(
builder, 2822);
1575 const size_t num_muls = 1;
1581 Element expected = Group::point_at_infinity;
1582 for (
size_t i = 0; i < num_muls; ++i) {
1584 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1587 expected += (element * scalar);
1588 points.emplace_back(element);
1589 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1590 scalars_native.emplace_back(scalar);
1594 expected += (element * scalar);
1595 points.emplace_back(element);
1596 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1597 scalars_native.emplace_back(scalar);
1600 scalar = Group::Fr::random_element(&
engine);
1601 element = Group::one * Group::Fr::random_element(&
engine);
1602 expected += (element * scalar);
1603 points.emplace_back(element);
1604 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1605 scalars_native.emplace_back(scalar);
1608 auto result = cycle_group_ct::batch_mul(points, scalars);
1609 EXPECT_EQ(result.get_value(), AffineElement(expected));
1610 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1614 check_circuit_and_gate_count(
builder, 3395);
1616 check_circuit_and_gate_count(
builder, 3398);
1625 const size_t num_muls = 1;
1630 for (
size_t i = 0; i < num_muls; ++i) {
1632 typename Group::Fr scalar = 0;
1635 points.emplace_back((element));
1636 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1639 points.emplace_back((element));
1640 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1643 auto result = cycle_group_ct::batch_mul(points, scalars);
1644 EXPECT_EQ(result.is_point_at_infinity().get_value(),
true);
1645 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1647 check_circuit_and_gate_count(
builder, 2837);
1655 const size_t num_muls = 5;
1659 cycle_group_ct point;
1660 typename cycle_group_ct::cycle_scalar scalar;
1661 cycle_group_ct result;
1662 for (
size_t i = 0; i < num_muls; ++i) {
1663 auto element = TestFixture::generators[i];
1664 typename Group::Fr native_scalar = Group::Fr::random_element(&
engine);
1668 point = (cycle_group_ct::from_witness(&
builder, element));
1669 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1670 point.set_origin_tag(submitted_value_origin_tag);
1671 scalar.set_origin_tag(challenge_origin_tag);
1672 result = point * scalar;
1676 point = (cycle_group_ct(element));
1677 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1678 result = point * scalar;
1682 point = (cycle_group_ct::from_witness(&
builder, element));
1683 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1684 result = point * scalar;
1688 point = (cycle_group_ct(element));
1689 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1690 result = point * scalar;
1697 check_circuit_and_gate_count(
builder, 12973);
1699 check_circuit_and_gate_count(
builder, 12976);
1725 const auto run_test = [](
bool construct_witnesses) {
1729 if (construct_witnesses) {
1730 big_elt = FF_ct::from_witness(&
builder, elt);
1732 big_elt = FF_ct(elt);
1734 big_elt.set_origin_tag(submitted_value_origin_tag);
1735 cycle_scalar_ct scalar_from_big_elt(big_elt);
1736 EXPECT_EQ(elt, scalar_from_big_elt.get_value());
1737 EXPECT_EQ(scalar_from_big_elt.get_origin_tag(), big_elt.get_origin_tag());
1738 if (construct_witnesses) {
1739 EXPECT_FALSE(big_elt.is_constant());
1740 EXPECT_FALSE(scalar_from_big_elt.is_constant());
1741 check_circuit_and_gate_count(
builder, 3523);
1754 const auto run_test = [](
bool construct_witnesses) {
1761 if (construct_witnesses) {
1762 big_scalar1 = FF_ct::from_witness(&
builder, scalar1);
1763 big_scalar2 = FF_ct::from_witness(&
builder, scalar2);
1765 big_scalar1 = FF_ct(scalar1);
1766 big_scalar2 = FF_ct(scalar2);
1768 cycle_group_ct result1 = cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1769 { big_scalar1, big_scalar2 });
1771 cycle_group_ct result2 =
1772 cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1773 { cycle_scalar_ct(big_scalar1), cycle_scalar_ct(big_scalar2) });
1775 AffineElement result1_native = result1.get_value();
1776 AffineElement result2_native = result2.get_value();
1777 EXPECT_EQ(result1_native.x, result2_native.x);
1778 EXPECT_EQ(result1_native.y, result2_native.y);
1779 if (construct_witnesses) {
1780 EXPECT_FALSE(result1.is_constant());
1781 EXPECT_FALSE(result2.is_constant());
1784 check_circuit_and_gate_count(
builder, 5285);
1786 check_circuit_and_gate_count(
builder, 5288);
1812 auto scalar1_val = Group::Fr::random_element(&
engine);
1813 auto scalar2_val = Group::Fr::random_element(&
engine);
1815 scalars.push_back(cycle_scalar_ct::from_witness(&
builder, scalar1_val));
1816 scalars.push_back(cycle_scalar_ct::from_witness(&
builder, scalar2_val));
1817 points.push_back(cycle_group_ct(lhs_generator));
1818 points.push_back(cycle_group_ct(rhs_generator));
1820 auto result = cycle_group_ct::batch_mul(points, scalars);
1823 AffineElement expected = lhs_generator * scalar1_val + rhs_generator * scalar2_val;
1825 EXPECT_EQ(result.get_value(), expected);
1827 check_circuit_and_gate_count(
builder, 2908);
1842 auto input = TestFixture::generators[0];
1843 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input);
1844 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
1846 cycle_group_ct temp =
a + inf;
1847 cycle_group_ct result = temp -
a;
1849 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1852 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1857 auto input_a = TestFixture::generators[0];
1858 auto input_b = TestFixture::generators[1];
1859 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input_a);
1860 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, input_b);
1862 cycle_group_ct zero =
b -
b;
1863 cycle_group_ct result =
a + zero;
1865 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1866 EXPECT_EQ(result.get_value().x, input_a.x);
1867 EXPECT_EQ(result.get_value().y, input_a.y);
1872 auto input = TestFixture::generators[0];
1873 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input);
1874 cycle_group_ct inf1 = cycle_group_ct::constant_infinity(&
builder);
1875 cycle_group_ct inf2 = cycle_group_ct::constant_infinity(&
builder);
1877 cycle_group_ct zero = inf1 - inf2;
1878 cycle_group_ct result = zero +
a;
1880 EXPECT_EQ(result.get_value().x, input.x);
1881 EXPECT_EQ(result.get_value().y, input.y);
1884 EXPECT_FALSE(
builder.failed());
1898 auto input = TestFixture::generators[0];
1899 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input);
1900 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
1906 cycle_group_ct result = cycle_group_ct::conditional_assign(pred, inf,
a);
1908 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1909 EXPECT_EQ(result.get_value().x, input.x);
1910 EXPECT_EQ(result.get_value().y, input.y);
1916 cycle_group_ct result = cycle_group_ct::conditional_assign(pred, inf,
a);
1918 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1919 EXPECT_TRUE(result.x().get_value() == 0);
1920 EXPECT_TRUE(result.y().get_value() == 0);
1925 cycle_group_ct inf2 = cycle_group_ct::constant_infinity(&
builder);
1927 cycle_group_ct result = cycle_group_ct::conditional_assign(pred, inf, inf2);
1929 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1930 EXPECT_TRUE(result.x().get_value() == 0);
1931 EXPECT_TRUE(result.y().get_value() == 0);
1934 EXPECT_FALSE(
builder.failed());
1950 auto input = TestFixture::generators[0];
1951 cycle_group_ct P = cycle_group_ct::from_witness(&
builder, input);
1952 cycle_group_ct witness_inf = P - P;
1954 EXPECT_TRUE(witness_inf.is_point_at_infinity().get_value());
1957 auto input2 = TestFixture::generators[1];
1958 cycle_group_ct Q = cycle_group_ct::from_witness(&
builder, input2);
1961 cycle_group_ct result = Q + witness_inf;
1962 EXPECT_EQ(result.get_value().x, input2.x);
1963 EXPECT_EQ(result.get_value().y, input2.y);
1966 cycle_group_ct result2 = witness_inf + Q;
1967 EXPECT_EQ(result2.get_value().x, input2.x);
1968 EXPECT_EQ(result2.get_value().y, input2.y);
1970 EXPECT_FALSE(
builder.failed());
1983 auto P_val = TestFixture::generators[0];
1984 auto Q_val = TestFixture::generators[1];
1985 auto a = Group::Fr::random_element(&
engine);
1986 auto b = Group::Fr::random_element(&
engine);
1989 cycle_group_ct::from_witness(&
builder, P_val),
1990 cycle_group_ct::from_witness(&
builder, Q_val),
1991 cycle_group_ct::from_witness(&
builder, P_val),
1992 cycle_group_ct::from_witness(&
builder, Q_val),
1996 cycle_scalar_ct::from_witness(&
builder,
a),
1997 cycle_scalar_ct::from_witness(&
builder,
b),
1998 cycle_scalar_ct::from_witness(&
builder, -
a),
1999 cycle_scalar_ct::from_witness(&
builder, -
b),
2002 cycle_group_ct result = cycle_group_ct::batch_mul(points, scalars);
2004 EXPECT_TRUE(result.is_point_at_infinity().get_value());
2006 EXPECT_TRUE(result.get_value().is_point_at_infinity());
2008 EXPECT_FALSE(
builder.failed());
2025 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
2026 EXPECT_TRUE(inf.is_point_at_infinity().get_value());
2027 EXPECT_TRUE(inf.get_value().is_point_at_infinity());
2029 EXPECT_EQ(inf.x().get_value(), 0);
2030 EXPECT_EQ(inf.y().get_value(), 0);
2035 auto input = TestFixture::generators[0];
2036 cycle_group_ct P = cycle_group_ct::from_witness(&
builder, input);
2037 cycle_group_ct neg_P = -P;
2038 cycle_group_ct result = P + neg_P;
2040 EXPECT_TRUE(result.is_point_at_infinity().get_value());
2043 EXPECT_TRUE(result.get_value().is_point_at_infinity());
2048 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
2049 cycle_group_ct result = inf.dbl();
2051 EXPECT_TRUE(result.is_point_at_infinity().get_value());
2053 EXPECT_TRUE(result.get_value().is_point_at_infinity());
2056 EXPECT_FALSE(
builder.failed());
2092 constexpr size_t num_points = 8;
2095 Element expected = Group::point_at_infinity;
2097 for (
size_t i = 0; i < num_points; ++i) {
2098 auto element = TestFixture::generators[i];
2099 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
2100 expected += (element * scalar);
2102 points.emplace_back(cycle_group_ct(element));
2103 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
2106 auto result = cycle_group_ct::fixed_batch_mul(points, scalars);
2107 EXPECT_EQ(result.get_value(), AffineElement(expected));
2109 EXPECT_FALSE(
builder.failed());
2121 auto element = TestFixture::generators[0];
2122 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
2123 Element expected = element * scalar;
2129 auto result = cycle_group_ct::fixed_batch_mul(points, scalars);
2130 EXPECT_EQ(result.get_value(), AffineElement(expected));
2132 EXPECT_FALSE(
builder.failed());