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);
95 x_death.set_origin_tag(instant_death_tag);
97 y_normal.set_origin_tag(constant_tag);
98 is_infinity_normal.set_origin_tag(constant_tag);
101 cycle_group_ct
b(x_death, y_normal, is_infinity_normal,
false);
103 EXPECT_THROW(
b.get_origin_tag(), std::runtime_error);
171 auto c1 = cycle_group_ct(AffineElement::one());
172 auto cw8 = cycle_group_ct::from_constant_witness(&
builder, AffineElement::one() * 0);
173 auto w11 = cycle_group_ct::from_witness(&
builder, TestFixture::generators[0]);
179 auto w27 = w10 - w11;
182 check_circuit_and_gate_count(
builder, 44);
210 auto c0 = cycle_group_ct(TestFixture::generators[0]);
211 auto c1 = cycle_group_ct(-TestFixture::generators[0]);
212 auto w2 = cycle_group_ct::conditional_assign(bool_ct(
witness_ct(&
builder,
true)), c0, c1);
213 EXPECT_FALSE(w2.x().is_constant());
214 EXPECT_FALSE(w2.y().is_constant());
215 EXPECT_TRUE(w2.is_point_at_infinity().is_constant());
218 check_circuit_and_gate_count(
builder, 5);
304 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
305 cycle_group_ct input_a = cycle_group_ct::from_witness(&
builder, Element::random_element());
306 cycle_group_ct input_b = cycle_group_ct::from_witness(&
builder, affine_infinity);
307 cycle_group_ct input_c = cycle_group_ct(Element::random_element());
308 cycle_group_ct input_d = cycle_group_ct(affine_infinity);
311 input_a.set_origin_tag(submitted_value_origin_tag);
312 input_b.set_origin_tag(challenge_origin_tag);
313 input_c.set_origin_tag(next_challenge_tag);
314 input_d.set_origin_tag(first_two_merged_tag);
316 input_a.standardize();
317 auto standard_a = input_a;
318 input_b.standardize();
319 auto standard_b = input_b;
320 input_c.standardize();
321 auto standard_c = input_c;
322 input_d.standardize();
323 auto standard_d = input_d;
325 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
false);
326 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
327 EXPECT_EQ(standard_c.is_point_at_infinity().get_value(),
false);
328 EXPECT_EQ(standard_d.is_point_at_infinity().get_value(),
true);
331 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
332 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
333 EXPECT_EQ(standard_c.get_origin_tag(), next_challenge_tag);
334 EXPECT_EQ(standard_d.get_origin_tag(), first_two_merged_tag);
336 auto input_a_x = input_a.x().get_value();
337 auto input_a_y = input_a.y().get_value();
338 auto input_c_x = input_c.x().get_value();
339 auto input_c_y = input_c.y().get_value();
341 auto standard_a_x = standard_a.x().get_value();
342 auto standard_a_y = standard_a.y().get_value();
344 auto standard_b_x = standard_b.x().get_value();
345 auto standard_b_y = standard_b.y().get_value();
347 auto standard_c_x = standard_c.x().get_value();
348 auto standard_c_y = standard_c.y().get_value();
350 auto standard_d_x = standard_d.x().get_value();
351 auto standard_d_y = standard_d.y().get_value();
353 EXPECT_EQ(input_a_x, standard_a_x);
354 EXPECT_EQ(input_a_y, standard_a_y);
355 EXPECT_EQ(standard_b_x, 0);
356 EXPECT_EQ(standard_b_y, 0);
357 EXPECT_EQ(input_c_x, standard_c_x);
358 EXPECT_EQ(input_c_y, standard_c_y);
359 EXPECT_EQ(standard_d_x, 0);
360 EXPECT_EQ(standard_d_y, 0);
362 check_circuit_and_gate_count(
builder, 24);
369 auto lhs = TestFixture::generators[0];
370 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
371 cycle_group_ct
b = cycle_group_ct(lhs);
373 a.set_origin_tag(submitted_value_origin_tag);
374 b.set_origin_tag(challenge_origin_tag);
377 for (
size_t i = 0; i < 3; ++i) {
381 AffineElement expected(
Element(lhs).dbl());
382 AffineElement result = c.get_value();
383 EXPECT_EQ(result, expected);
384 EXPECT_EQ(d.get_value(), expected);
386 check_circuit_and_gate_count(
builder, 19);
389 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
390 EXPECT_EQ(d.get_origin_tag(), challenge_origin_tag);
400 auto lhs = TestFixture::generators[0];
401 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
404 AffineElement hint(doubled_element);
406 cycle_group_ct result =
a.dbl(hint);
408 EXPECT_EQ(result.get_value(), hint);
409 EXPECT_FALSE(result.is_point_at_infinity().get_value());
411 check_circuit_and_gate_count(
builder, 13);
417 auto lhs = TestFixture::generators[1];
418 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
420 cycle_group_ct result =
a.dbl();
423 AffineElement expected(expected_element);
424 EXPECT_EQ(result.get_value(), expected);
425 EXPECT_FALSE(result.is_point_at_infinity().get_value());
428 check_circuit_and_gate_count(
builder, 13);
434 AffineElement infinity_element;
435 infinity_element.self_set_infinity();
437 cycle_group_ct infinity = cycle_group_ct::from_witness(&
builder, infinity_element);
439 cycle_group_ct result = infinity.dbl();
441 EXPECT_TRUE(result.is_point_at_infinity().get_value());
444 EXPECT_EQ(result.x().get_value(), 0);
447 check_circuit_and_gate_count(
builder, 13);
458 auto lhs = TestFixture::generators[0];
459 cycle_group_ct
a(lhs);
462 AffineElement hint(doubled_element);
464 cycle_group_ct result =
a.dbl(hint);
466 EXPECT_EQ(result.get_value(), hint);
467 EXPECT_TRUE(result.is_constant());
468 EXPECT_FALSE(result.is_point_at_infinity().get_value());
470 check_circuit_and_gate_count(
builder, 0);
476 auto lhs = TestFixture::generators[1];
477 cycle_group_ct
a(lhs);
479 cycle_group_ct result =
a.dbl();
482 AffineElement expected(expected_element);
483 EXPECT_EQ(result.get_value(), expected);
484 EXPECT_TRUE(result.is_constant());
485 EXPECT_FALSE(result.is_point_at_infinity().get_value());
487 check_circuit_and_gate_count(
builder, 0);
493 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
495 cycle_group_ct result = infinity.dbl();
497 EXPECT_TRUE(result.is_point_at_infinity().get_value());
498 EXPECT_TRUE(result.is_constant());
499 EXPECT_EQ(result.x().get_value(), 0);
500 EXPECT_EQ(result.y().get_value(), 0);
502 check_circuit_and_gate_count(
builder, 0);
508 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
511 hint.self_set_infinity();
513 cycle_group_ct result = infinity.dbl(hint);
515 EXPECT_TRUE(result.is_point_at_infinity().get_value());
516 EXPECT_TRUE(result.is_constant());
517 EXPECT_EQ(result.x().get_value(), 0);
518 EXPECT_EQ(result.y().get_value(), 0);
520 check_circuit_and_gate_count(
builder, 0);
553 auto lhs = TestFixture::generators[0];
554 auto rhs = TestFixture::generators[1];
555 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
556 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
558 cycle_group_ct result =
a.unconditional_add(
b);
561 AffineElement expected(expected_element);
562 EXPECT_EQ(result.get_value(), expected);
563 EXPECT_FALSE(result.is_point_at_infinity().get_value());
565 check_circuit_and_gate_count(
builder, 22);
571 auto lhs = TestFixture::generators[2];
572 auto rhs = TestFixture::generators[3];
573 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
574 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
577 AffineElement hint(sum_element);
579 cycle_group_ct result =
a.unconditional_add(
b, hint);
581 EXPECT_EQ(result.get_value(), hint);
582 EXPECT_FALSE(result.is_point_at_infinity().get_value());
584 check_circuit_and_gate_count(
builder, 22);
590 auto lhs = TestFixture::generators[0];
591 auto rhs = TestFixture::generators[1];
592 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
593 cycle_group_ct
b(rhs);
595 cycle_group_ct result =
a.unconditional_add(
b);
598 AffineElement expected(expected_element);
599 EXPECT_EQ(result.get_value(), expected);
600 EXPECT_FALSE(result.is_constant());
601 EXPECT_FALSE(result.is_point_at_infinity().get_value());
603 check_circuit_and_gate_count(
builder, 14);
614 auto lhs = TestFixture::generators[0];
615 auto rhs = TestFixture::generators[1];
616 cycle_group_ct
a(lhs);
617 cycle_group_ct
b(rhs);
619 cycle_group_ct result =
a.unconditional_add(
b);
622 AffineElement expected(expected_element);
623 EXPECT_EQ(result.get_value(), expected);
624 EXPECT_TRUE(result.is_constant());
625 EXPECT_FALSE(result.is_point_at_infinity().get_value());
627 check_circuit_and_gate_count(
builder, 0);
633 auto lhs = TestFixture::generators[2];
634 auto rhs = TestFixture::generators[3];
635 cycle_group_ct
a(lhs);
636 cycle_group_ct
b(rhs);
639 AffineElement hint(sum_element);
641 cycle_group_ct result =
a.unconditional_add(
b, hint);
643 EXPECT_EQ(result.get_value(), hint);
644 EXPECT_TRUE(result.is_constant());
645 EXPECT_FALSE(result.is_point_at_infinity().get_value());
647 check_circuit_and_gate_count(
builder, 0);
658 auto lhs = TestFixture::generators[0];
659 auto rhs = TestFixture::generators[1];
660 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
661 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
663 cycle_group_ct result =
a.unconditional_subtract(
b);
666 AffineElement expected(expected_element);
667 EXPECT_EQ(result.get_value(), expected);
668 EXPECT_FALSE(result.is_point_at_infinity().get_value());
670 check_circuit_and_gate_count(
builder, 22);
676 auto lhs = TestFixture::generators[2];
677 auto rhs = TestFixture::generators[3];
678 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
679 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
682 AffineElement hint(diff_element);
684 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
686 EXPECT_EQ(result.get_value(), hint);
687 EXPECT_FALSE(result.is_point_at_infinity().get_value());
690 check_circuit_and_gate_count(
builder, 22);
696 auto lhs = TestFixture::generators[0];
697 auto rhs = TestFixture::generators[1];
698 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
699 cycle_group_ct
b(rhs);
701 cycle_group_ct result =
a.unconditional_subtract(
b);
704 AffineElement expected(expected_element);
705 EXPECT_EQ(result.get_value(), expected);
706 EXPECT_FALSE(result.is_constant());
707 EXPECT_FALSE(result.is_point_at_infinity().get_value());
709 check_circuit_and_gate_count(
builder, 14);
720 auto lhs = TestFixture::generators[0];
721 auto rhs = TestFixture::generators[1];
722 cycle_group_ct
a(lhs);
723 cycle_group_ct
b(rhs);
725 cycle_group_ct result =
a.unconditional_subtract(
b);
728 AffineElement expected(expected_element);
729 EXPECT_EQ(result.get_value(), expected);
730 EXPECT_TRUE(result.is_constant());
731 EXPECT_FALSE(result.is_point_at_infinity().get_value());
733 check_circuit_and_gate_count(
builder, 0);
739 auto lhs = TestFixture::generators[2];
740 auto rhs = TestFixture::generators[3];
741 cycle_group_ct
a(lhs);
742 cycle_group_ct
b(rhs);
745 AffineElement hint(diff_element);
747 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
749 EXPECT_EQ(result.get_value(), hint);
750 EXPECT_TRUE(result.is_constant());
751 EXPECT_FALSE(result.is_point_at_infinity().get_value());
753 check_circuit_and_gate_count(
builder, 0);
763 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
764 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
765 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
767 a.set_origin_tag(submitted_value_origin_tag);
768 b.set_origin_tag(challenge_origin_tag);
769 cycle_group_ct c =
a.unconditional_add(
b);
771 AffineElement result = c.get_value();
772 EXPECT_EQ(result, expected);
774 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
777 add(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
778 add(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
779 add(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
780 add(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
782 check_circuit_and_gate_count(
builder, 50);
790 auto lhs = TestFixture::generators[0];
791 auto rhs = TestFixture::generators[1];
794 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
795 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
796 cycle_group_ct c =
a.checked_unconditional_add(
b);
798 AffineElement result = c.get_value();
799 EXPECT_EQ(result, expected);
801 check_circuit_and_gate_count(
builder, 24);
829 auto lhs = TestFixture::generators[0];
830 auto rhs = -TestFixture::generators[1];
832 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
833 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
836 a.set_origin_tag(submitted_value_origin_tag);
837 b.set_origin_tag(challenge_origin_tag);
839 cycle_group_ct c =
a +
b;
842 EXPECT_EQ(c.get_value(), expected);
843 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
845 check_circuit_and_gate_count(
builder, 55);
854 auto rhs = -TestFixture::generators[1];
855 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
857 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
859 cycle_group_ct
a = point_at_infinity;
860 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
862 a.set_origin_tag(submitted_value_origin_tag);
863 b.set_origin_tag(challenge_origin_tag);
865 cycle_group_ct c =
a +
b;
868 EXPECT_EQ(c.get_value(), rhs);
869 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
871 check_circuit_and_gate_count(
builder, 55);
880 auto lhs = TestFixture::generators[0];
881 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
883 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
885 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
886 cycle_group_ct
b = point_at_infinity;
888 a.set_origin_tag(submitted_value_origin_tag);
889 b.set_origin_tag(challenge_origin_tag);
891 cycle_group_ct c =
a +
b;
894 EXPECT_EQ(c.get_value(), lhs);
895 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
898 check_circuit_and_gate_count(
builder, 55);
907 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
909 cycle_group_ct point_at_infinity1 = cycle_group_ct::from_witness(&
builder, affine_infinity);
911 cycle_group_ct point_at_infinity2 = cycle_group_ct::from_witness(&
builder, affine_infinity);
913 cycle_group_ct
a = point_at_infinity1;
914 cycle_group_ct
b = point_at_infinity2;
916 a.set_origin_tag(submitted_value_origin_tag);
917 b.set_origin_tag(challenge_origin_tag);
919 cycle_group_ct c =
a +
b;
922 EXPECT_TRUE(c.is_point_at_infinity().get_value());
923 EXPECT_TRUE(c.get_value().is_point_at_infinity());
924 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
926 check_circuit_and_gate_count(
builder, 55);
935 auto lhs = TestFixture::generators[0];
937 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
938 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
940 a.set_origin_tag(submitted_value_origin_tag);
941 b.set_origin_tag(challenge_origin_tag);
943 cycle_group_ct c =
a +
b;
945 EXPECT_TRUE(c.is_point_at_infinity().get_value());
946 EXPECT_TRUE(c.get_value().is_point_at_infinity());
947 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
949 check_circuit_and_gate_count(
builder, 55);
958 auto lhs = TestFixture::generators[0];
960 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
961 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
963 a.set_origin_tag(submitted_value_origin_tag);
964 b.set_origin_tag(challenge_origin_tag);
966 cycle_group_ct c =
a +
b;
968 AffineElement expected((
Element(lhs)).dbl());
969 EXPECT_EQ(c.get_value(), expected);
970 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
972 check_circuit_and_gate_count(
builder, 55);
983 auto lhs = TestFixture::generators[5];
984 auto rhs = TestFixture::generators[6];
986 cycle_group_ct
a(lhs);
987 cycle_group_ct
b(rhs);
989 cycle_group_ct result =
a +
b;
992 EXPECT_EQ(result.get_value(), expected);
993 EXPECT_TRUE(result.is_constant());
996 check_circuit_and_gate_count(
builder, 0);
1002 auto lhs = TestFixture::generators[7];
1004 cycle_group_ct
a(lhs);
1005 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1007 cycle_group_ct result =
a +
b;
1009 EXPECT_EQ(result.get_value(), lhs);
1010 EXPECT_TRUE(result.is_constant());
1013 check_circuit_and_gate_count(
builder, 0);
1027 auto lhs = TestFixture::generators[10];
1029 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1030 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1032 cycle_group_ct result =
a +
b;
1034 EXPECT_EQ(result.get_value(), lhs);
1035 EXPECT_FALSE(result.is_constant());
1038 check_circuit_and_gate_count(
builder, 10);
1044 auto lhs = TestFixture::generators[11];
1045 auto rhs = TestFixture::generators[12];
1047 cycle_group_ct
a(lhs);
1048 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1050 cycle_group_ct result =
a +
b;
1053 EXPECT_EQ(result.get_value(), expected);
1054 EXPECT_FALSE(result.is_constant());
1057 check_circuit_and_gate_count(
builder, 27);
1069 auto point = TestFixture::generators[0];
1070 auto neg_point = -point;
1072 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1073 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, neg_point);
1075 cycle_group_ct result =
a +
b;
1078 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1079 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1084 cycle_group_ct inf1 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1085 cycle_group_ct inf2 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1087 cycle_group_ct result = inf1 + inf2;
1090 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1091 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1096 auto point = TestFixture::generators[1];
1098 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1099 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1101 cycle_group_ct result =
a +
b;
1104 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1105 EXPECT_EQ(result.get_value(), point);
1110 auto point = TestFixture::generators[2];
1112 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1113 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1115 cycle_group_ct result =
a +
b;
1118 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1119 EXPECT_EQ(result.get_value(), point);
1124 auto point = TestFixture::generators[3];
1126 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1127 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1129 cycle_group_ct result =
a +
b;
1132 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1134 AffineElement expected(
Element(point).dbl());
1135 EXPECT_EQ(result.get_value(), expected);
1138 check_circuit_and_gate_count(
builder, 275);
1147 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
1148 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
1149 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
1151 a.set_origin_tag(submitted_value_origin_tag);
1152 b.set_origin_tag(challenge_origin_tag);
1154 cycle_group_ct c =
a.unconditional_subtract(
b);
1156 AffineElement result = c.get_value();
1157 EXPECT_EQ(result, expected);
1159 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1162 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
1163 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
1164 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
1165 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
1167 check_circuit_and_gate_count(
builder, 50);
1175 auto lhs = TestFixture::generators[0];
1176 auto rhs = TestFixture::generators[1];
1179 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1180 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1181 cycle_group_ct c =
a.checked_unconditional_subtract(
b);
1183 AffineElement result = c.get_value();
1184 EXPECT_EQ(result, expected);
1186 check_circuit_and_gate_count(
builder, 24);
1214 auto lhs = TestFixture::generators[0];
1215 auto rhs = -TestFixture::generators[1];
1216 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1218 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
1222 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1223 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1225 a.set_origin_tag(submitted_value_origin_tag);
1226 b.set_origin_tag(challenge_origin_tag);
1228 cycle_group_ct c =
a -
b;
1230 AffineElement result = c.get_value();
1231 EXPECT_EQ(result, expected);
1233 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1238 cycle_group_ct
a = point_at_infinity;
1239 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1240 a.set_origin_tag(submitted_value_origin_tag);
1241 b.set_origin_tag(challenge_origin_tag);
1243 cycle_group_ct c =
a -
b;
1244 AffineElement result = c.get_value();
1245 EXPECT_EQ(result, -rhs);
1246 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1251 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1252 cycle_group_ct
b = point_at_infinity;
1253 a.set_origin_tag(submitted_value_origin_tag);
1254 b.set_origin_tag(challenge_origin_tag);
1256 cycle_group_ct c =
a -
b;
1257 AffineElement result = c.get_value();
1258 EXPECT_EQ(result, lhs);
1259 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1264 cycle_group_ct
a = point_at_infinity;
1265 cycle_group_ct
b = point_at_infinity;
1266 a.set_origin_tag(submitted_value_origin_tag);
1267 b.set_origin_tag(challenge_origin_tag);
1269 cycle_group_ct c =
a -
b;
1270 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1271 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1272 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1277 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1278 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
1279 a.set_origin_tag(submitted_value_origin_tag);
1280 b.set_origin_tag(challenge_origin_tag);
1282 cycle_group_ct c =
a -
b;
1283 AffineElement expected((
Element(lhs)).dbl());
1284 AffineElement result = c.get_value();
1285 EXPECT_EQ(result, expected);
1286 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1291 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1292 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
1293 a.set_origin_tag(submitted_value_origin_tag);
1294 b.set_origin_tag(challenge_origin_tag);
1296 cycle_group_ct c =
a -
b;
1297 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1298 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1299 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1302 check_circuit_and_gate_count(
builder, 297);
1313 auto lhs = TestFixture::generators[5];
1314 auto rhs = TestFixture::generators[6];
1316 cycle_group_ct
a(lhs);
1317 cycle_group_ct
b(rhs);
1319 cycle_group_ct result =
a -
b;
1322 EXPECT_EQ(result.get_value(), expected);
1323 EXPECT_TRUE(result.is_constant());
1326 check_circuit_and_gate_count(
builder, 0);
1332 auto lhs = TestFixture::generators[7];
1334 cycle_group_ct
a(lhs);
1335 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1337 cycle_group_ct result =
a -
b;
1339 EXPECT_EQ(result.get_value(), lhs);
1340 EXPECT_TRUE(result.is_constant());
1343 check_circuit_and_gate_count(
builder, 0);
1349 auto rhs = TestFixture::generators[7];
1351 cycle_group_ct
a = cycle_group_ct::constant_infinity(&
builder);
1352 cycle_group_ct
b(rhs);
1354 cycle_group_ct result =
a -
b;
1356 EXPECT_EQ(result.get_value(), -rhs);
1357 EXPECT_TRUE(result.is_constant());
1360 check_circuit_and_gate_count(
builder, 0);
1389 const size_t num_muls = 1;
1393 Element expected = Group::point_at_infinity;
1395 for (
size_t i = 0; i < num_muls; ++i) {
1396 auto element = TestFixture::generators[i];
1397 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1400 expected += (element * scalar);
1401 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1402 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1405 expected += (element * scalar);
1406 points.emplace_back(cycle_group_ct(element));
1407 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1410 expected += (element * scalar);
1411 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1412 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1415 expected += (element * scalar);
1416 points.emplace_back(cycle_group_ct(element));
1417 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1423 auto result = cycle_group_ct::batch_mul(points, scalars);
1424 EXPECT_EQ(result.get_value(), AffineElement(expected));
1426 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1429 check_circuit_and_gate_count(
builder, 4401);
1431 check_circuit_and_gate_count(
builder, 4404);
1444 auto element = TestFixture::generators[0];
1445 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1446 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1447 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1449 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1450 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, -scalar));
1454 auto result = cycle_group_ct::batch_mul(points, scalars);
1455 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1457 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1460 check_circuit_and_gate_count(
builder, 4027);
1462 check_circuit_and_gate_count(
builder, 4030);
1475 auto element = TestFixture::generators[0];
1476 typename Group::Fr scalar = 0;
1477 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1478 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1481 auto result = cycle_group_ct::batch_mul(points, scalars);
1482 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1483 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1486 check_circuit_and_gate_count(
builder, 3533);
1488 check_circuit_and_gate_count(
builder, 3536);
1501 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1502 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1506 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, affine_infinity);
1507 points.emplace_back(point);
1508 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1512 cycle_group_ct point = cycle_group_ct(affine_infinity);
1513 points.emplace_back(point);
1514 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1518 auto result = cycle_group_ct::batch_mul(points, scalars);
1519 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1520 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1524 check_circuit_and_gate_count(
builder, 3584);
1526 check_circuit_and_gate_count(
builder, 3587);
1535 const size_t num_muls = 1;
1541 Element expected = Group::point_at_infinity;
1542 for (
size_t i = 0; i < num_muls; ++i) {
1544 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1547 expected += (element * scalar);
1548 points.emplace_back(element);
1549 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1550 scalars_native.emplace_back(
uint256_t(scalar));
1554 expected += (element * scalar);
1555 points.emplace_back(element);
1556 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1557 scalars_native.emplace_back(
uint256_t(scalar));
1560 auto result = cycle_group_ct::batch_mul(points, scalars);
1561 EXPECT_EQ(result.get_value(), AffineElement(expected));
1563 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1565 check_circuit_and_gate_count(
builder, 2822);
1573 const size_t num_muls = 1;
1579 Element expected = Group::point_at_infinity;
1580 for (
size_t i = 0; i < num_muls; ++i) {
1582 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1585 expected += (element * scalar);
1586 points.emplace_back(element);
1587 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1588 scalars_native.emplace_back(scalar);
1592 expected += (element * scalar);
1593 points.emplace_back(element);
1594 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1595 scalars_native.emplace_back(scalar);
1598 scalar = Group::Fr::random_element(&
engine);
1599 element = Group::one * Group::Fr::random_element(&
engine);
1600 expected += (element * scalar);
1601 points.emplace_back(element);
1602 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1603 scalars_native.emplace_back(scalar);
1606 auto result = cycle_group_ct::batch_mul(points, scalars);
1607 EXPECT_EQ(result.get_value(), AffineElement(expected));
1608 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1612 check_circuit_and_gate_count(
builder, 3395);
1614 check_circuit_and_gate_count(
builder, 3398);
1623 const size_t num_muls = 1;
1628 for (
size_t i = 0; i < num_muls; ++i) {
1630 typename Group::Fr scalar = 0;
1633 points.emplace_back((element));
1634 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1637 points.emplace_back((element));
1638 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1641 auto result = cycle_group_ct::batch_mul(points, scalars);
1642 EXPECT_EQ(result.is_point_at_infinity().get_value(),
true);
1643 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1645 check_circuit_and_gate_count(
builder, 2837);
1653 const size_t num_muls = 5;
1657 cycle_group_ct point;
1658 typename cycle_group_ct::cycle_scalar scalar;
1659 cycle_group_ct result;
1660 for (
size_t i = 0; i < num_muls; ++i) {
1661 auto element = TestFixture::generators[i];
1662 typename Group::Fr native_scalar = Group::Fr::random_element(&
engine);
1666 point = (cycle_group_ct::from_witness(&
builder, element));
1667 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1668 point.set_origin_tag(submitted_value_origin_tag);
1669 scalar.set_origin_tag(challenge_origin_tag);
1670 result = point * scalar;
1674 point = (cycle_group_ct(element));
1675 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1676 result = point * scalar;
1680 point = (cycle_group_ct::from_witness(&
builder, element));
1681 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1682 result = point * scalar;
1686 point = (cycle_group_ct(element));
1687 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1688 result = point * scalar;
1695 check_circuit_and_gate_count(
builder, 12973);
1697 check_circuit_and_gate_count(
builder, 12976);
1723 const auto run_test = [](
bool construct_witnesses) {
1727 if (construct_witnesses) {
1728 big_elt = FF_ct::from_witness(&
builder, elt);
1730 big_elt = FF_ct(elt);
1732 big_elt.set_origin_tag(submitted_value_origin_tag);
1733 cycle_scalar_ct scalar_from_big_elt(big_elt);
1734 EXPECT_EQ(elt, scalar_from_big_elt.get_value());
1735 EXPECT_EQ(scalar_from_big_elt.get_origin_tag(), big_elt.get_origin_tag());
1736 if (construct_witnesses) {
1737 EXPECT_FALSE(big_elt.is_constant());
1738 EXPECT_FALSE(scalar_from_big_elt.is_constant());
1739 check_circuit_and_gate_count(
builder, 3523);
1752 const auto run_test = [](
bool construct_witnesses) {
1759 if (construct_witnesses) {
1760 big_scalar1 = FF_ct::from_witness(&
builder, scalar1);
1761 big_scalar2 = FF_ct::from_witness(&
builder, scalar2);
1763 big_scalar1 = FF_ct(scalar1);
1764 big_scalar2 = FF_ct(scalar2);
1766 cycle_group_ct result1 = cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1767 { big_scalar1, big_scalar2 });
1769 cycle_group_ct result2 =
1770 cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1771 { cycle_scalar_ct(big_scalar1), cycle_scalar_ct(big_scalar2) });
1773 AffineElement result1_native = result1.get_value();
1774 AffineElement result2_native = result2.get_value();
1775 EXPECT_EQ(result1_native.x, result2_native.x);
1776 EXPECT_EQ(result1_native.y, result2_native.y);
1777 if (construct_witnesses) {
1778 EXPECT_FALSE(result1.is_constant());
1779 EXPECT_FALSE(result2.is_constant());
1782 check_circuit_and_gate_count(
builder, 5285);
1784 check_circuit_and_gate_count(
builder, 5288);
1810 auto scalar1_val = Group::Fr::random_element(&
engine);
1811 auto scalar2_val = Group::Fr::random_element(&
engine);
1813 scalars.push_back(cycle_scalar_ct::from_witness(&
builder, scalar1_val));
1814 scalars.push_back(cycle_scalar_ct::from_witness(&
builder, scalar2_val));
1815 points.push_back(cycle_group_ct(lhs_generator));
1816 points.push_back(cycle_group_ct(rhs_generator));
1818 auto result = cycle_group_ct::batch_mul(points, scalars);
1821 AffineElement expected = lhs_generator * scalar1_val + rhs_generator * scalar2_val;
1823 EXPECT_EQ(result.get_value(), expected);
1825 check_circuit_and_gate_count(
builder, 2908);
1840 auto input = TestFixture::generators[0];
1841 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input);
1842 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
1844 cycle_group_ct temp =
a + inf;
1845 cycle_group_ct result = temp -
a;
1847 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1850 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1855 auto input_a = TestFixture::generators[0];
1856 auto input_b = TestFixture::generators[1];
1857 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input_a);
1858 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, input_b);
1860 cycle_group_ct zero =
b -
b;
1861 cycle_group_ct result =
a + zero;
1863 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1864 EXPECT_EQ(result.get_value().x, input_a.x);
1865 EXPECT_EQ(result.get_value().y, input_a.y);
1870 auto input = TestFixture::generators[0];
1871 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input);
1872 cycle_group_ct inf1 = cycle_group_ct::constant_infinity(&
builder);
1873 cycle_group_ct inf2 = cycle_group_ct::constant_infinity(&
builder);
1875 cycle_group_ct zero = inf1 - inf2;
1876 cycle_group_ct result = zero +
a;
1878 EXPECT_EQ(result.get_value().x, input.x);
1879 EXPECT_EQ(result.get_value().y, input.y);
1882 EXPECT_FALSE(
builder.failed());
1896 auto input = TestFixture::generators[0];
1897 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, input);
1898 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
1904 cycle_group_ct result = cycle_group_ct::conditional_assign(pred, inf,
a);
1906 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1907 EXPECT_EQ(result.get_value().x, input.x);
1908 EXPECT_EQ(result.get_value().y, input.y);
1914 cycle_group_ct result = cycle_group_ct::conditional_assign(pred, inf,
a);
1916 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1917 EXPECT_TRUE(result.x().get_value() == 0);
1918 EXPECT_TRUE(result.y().get_value() == 0);
1923 cycle_group_ct inf2 = cycle_group_ct::constant_infinity(&
builder);
1925 cycle_group_ct result = cycle_group_ct::conditional_assign(pred, inf, inf2);
1927 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1928 EXPECT_TRUE(result.x().get_value() == 0);
1929 EXPECT_TRUE(result.y().get_value() == 0);
1932 EXPECT_FALSE(
builder.failed());
1948 auto input = TestFixture::generators[0];
1949 cycle_group_ct P = cycle_group_ct::from_witness(&
builder, input);
1950 cycle_group_ct witness_inf = P - P;
1952 EXPECT_TRUE(witness_inf.is_point_at_infinity().get_value());
1955 auto input2 = TestFixture::generators[1];
1956 cycle_group_ct Q = cycle_group_ct::from_witness(&
builder, input2);
1959 cycle_group_ct result = Q + witness_inf;
1960 EXPECT_EQ(result.get_value().x, input2.x);
1961 EXPECT_EQ(result.get_value().y, input2.y);
1964 cycle_group_ct result2 = witness_inf + Q;
1965 EXPECT_EQ(result2.get_value().x, input2.x);
1966 EXPECT_EQ(result2.get_value().y, input2.y);
1968 EXPECT_FALSE(
builder.failed());
1981 auto P_val = TestFixture::generators[0];
1982 auto Q_val = TestFixture::generators[1];
1983 auto a = Group::Fr::random_element(&
engine);
1984 auto b = Group::Fr::random_element(&
engine);
1987 cycle_group_ct::from_witness(&
builder, P_val),
1988 cycle_group_ct::from_witness(&
builder, Q_val),
1989 cycle_group_ct::from_witness(&
builder, P_val),
1990 cycle_group_ct::from_witness(&
builder, Q_val),
1994 cycle_scalar_ct::from_witness(&
builder,
a),
1995 cycle_scalar_ct::from_witness(&
builder,
b),
1996 cycle_scalar_ct::from_witness(&
builder, -
a),
1997 cycle_scalar_ct::from_witness(&
builder, -
b),
2000 cycle_group_ct result = cycle_group_ct::batch_mul(points, scalars);
2002 EXPECT_TRUE(result.is_point_at_infinity().get_value());
2004 EXPECT_TRUE(result.get_value().is_point_at_infinity());
2006 EXPECT_FALSE(
builder.failed());
2023 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
2024 EXPECT_TRUE(inf.is_point_at_infinity().get_value());
2025 EXPECT_TRUE(inf.get_value().is_point_at_infinity());
2027 EXPECT_EQ(inf.x().get_value(), 0);
2028 EXPECT_EQ(inf.y().get_value(), 0);
2033 auto input = TestFixture::generators[0];
2034 cycle_group_ct P = cycle_group_ct::from_witness(&
builder, input);
2035 cycle_group_ct neg_P = -P;
2036 cycle_group_ct result = P + neg_P;
2038 EXPECT_TRUE(result.is_point_at_infinity().get_value());
2041 EXPECT_TRUE(result.get_value().is_point_at_infinity());
2046 cycle_group_ct inf = cycle_group_ct::constant_infinity(&
builder);
2047 cycle_group_ct result = inf.dbl();
2049 EXPECT_TRUE(result.is_point_at_infinity().get_value());
2051 EXPECT_TRUE(result.get_value().is_point_at_infinity());
2054 EXPECT_FALSE(
builder.failed());