72 auto lhs = TestFixture::generators[0];
78 x.set_origin_tag(submitted_value_origin_tag);
79 y.set_origin_tag(challenge_origin_tag);
80 is_infinity.set_origin_tag(next_challenge_tag);
83 cycle_group_ct
a(x, y, is_infinity,
true);
86 EXPECT_EQ(
a.get_origin_tag(), first_second_third_merged_tag);
92 auto is_infinity_normal = bool_ct(
witness_ct(&
builder, TestFixture::generators[1].is_point_at_infinity()));
94 x_death.set_origin_tag(instant_death_tag);
96 y_normal.set_origin_tag(constant_tag);
97 is_infinity_normal.set_origin_tag(constant_tag);
100 cycle_group_ct
b(x_death, y_normal, is_infinity_normal,
false);
102 EXPECT_THROW(
b.get_origin_tag(), std::runtime_error);
316 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
317 cycle_group_ct input_a = cycle_group_ct::from_witness(&
builder, Element::random_element());
318 cycle_group_ct input_b = cycle_group_ct::from_witness(&
builder, affine_infinity);
319 cycle_group_ct input_c = cycle_group_ct(Element::random_element());
320 cycle_group_ct input_d = cycle_group_ct(affine_infinity);
324 cycle_group_ct input_e = cycle_group_ct(x, y,
true,
true);
325 cycle_group_ct input_f = cycle_group_ct(x, y, bool_ct(
witness_ct(&
builder,
true)),
true);
328 input_a.set_origin_tag(submitted_value_origin_tag);
329 input_b.set_origin_tag(challenge_origin_tag);
330 input_c.set_origin_tag(next_challenge_tag);
331 input_d.set_origin_tag(first_two_merged_tag);
333 input_a.standardize();
334 auto standard_a = input_a;
335 input_b.standardize();
336 auto standard_b = input_b;
337 input_c.standardize();
338 auto standard_c = input_c;
339 input_d.standardize();
340 auto standard_d = input_d;
341 input_e.standardize();
342 auto standard_e = input_e;
343 input_f.standardize();
344 auto standard_f = input_f;
346 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
false);
347 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
348 EXPECT_EQ(standard_c.is_point_at_infinity().get_value(),
false);
349 EXPECT_EQ(standard_d.is_point_at_infinity().get_value(),
true);
350 EXPECT_EQ(standard_e.is_point_at_infinity().get_value(),
true);
351 EXPECT_EQ(standard_f.is_point_at_infinity().get_value(),
true);
354 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
355 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
356 EXPECT_EQ(standard_c.get_origin_tag(), next_challenge_tag);
357 EXPECT_EQ(standard_d.get_origin_tag(), first_two_merged_tag);
359 auto input_a_x = input_a.x().get_value();
360 auto input_a_y = input_a.y().get_value();
361 auto input_c_x = input_c.x().get_value();
362 auto input_c_y = input_c.y().get_value();
364 auto standard_a_x = standard_a.x().get_value();
365 auto standard_a_y = standard_a.y().get_value();
367 auto standard_b_x = standard_b.x().get_value();
368 auto standard_b_y = standard_b.y().get_value();
370 auto standard_c_x = standard_c.x().get_value();
371 auto standard_c_y = standard_c.y().get_value();
373 auto standard_d_x = standard_d.x().get_value();
374 auto standard_d_y = standard_d.y().get_value();
376 auto standard_e_x = standard_e.x().get_value();
377 auto standard_e_y = standard_e.y().get_value();
379 auto standard_f_x = standard_f.x().get_value();
380 auto standard_f_y = standard_f.y().get_value();
382 EXPECT_EQ(input_a_x, standard_a_x);
383 EXPECT_EQ(input_a_y, standard_a_y);
384 EXPECT_EQ(standard_b_x, 0);
385 EXPECT_EQ(standard_b_y, 0);
386 EXPECT_EQ(input_c_x, standard_c_x);
387 EXPECT_EQ(input_c_y, standard_c_y);
388 EXPECT_EQ(standard_d_x, 0);
389 EXPECT_EQ(standard_d_y, 0);
390 EXPECT_EQ(standard_e_x, 0);
391 EXPECT_EQ(standard_e_y, 0);
392 EXPECT_EQ(standard_f_x, 0);
393 EXPECT_EQ(standard_f_y, 0);
395 check_circuit_and_gate_count(
builder, 24);
402 auto lhs = TestFixture::generators[0];
403 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
404 cycle_group_ct
b = cycle_group_ct(lhs);
406 a.set_origin_tag(submitted_value_origin_tag);
407 b.set_origin_tag(challenge_origin_tag);
410 for (
size_t i = 0; i < 3; ++i) {
414 AffineElement expected(
Element(lhs).dbl());
415 AffineElement result = c.get_value();
416 EXPECT_EQ(result, expected);
417 EXPECT_EQ(d.get_value(), expected);
419 check_circuit_and_gate_count(
builder, 15);
422 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
423 EXPECT_EQ(d.get_origin_tag(), challenge_origin_tag);
433 auto lhs = TestFixture::generators[0];
434 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
437 AffineElement hint(doubled_element);
439 cycle_group_ct result =
a.dbl(hint);
441 EXPECT_EQ(result.get_value(), hint);
442 EXPECT_FALSE(result.is_point_at_infinity().get_value());
444 check_circuit_and_gate_count(
builder, 9);
450 auto lhs = TestFixture::generators[1];
451 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
453 cycle_group_ct result =
a.dbl();
456 AffineElement expected(expected_element);
457 EXPECT_EQ(result.get_value(), expected);
458 EXPECT_FALSE(result.is_point_at_infinity().get_value());
461 check_circuit_and_gate_count(
builder, 9);
467 AffineElement infinity_element;
468 infinity_element.self_set_infinity();
470 cycle_group_ct infinity = cycle_group_ct::from_witness(&
builder, infinity_element);
472 cycle_group_ct result = infinity.dbl();
474 EXPECT_TRUE(result.is_point_at_infinity().get_value());
477 EXPECT_EQ(result.x().get_value(), 0);
480 check_circuit_and_gate_count(
builder, 9);
491 auto lhs = TestFixture::generators[0];
492 cycle_group_ct
a(lhs);
495 AffineElement hint(doubled_element);
497 cycle_group_ct result =
a.dbl(hint);
499 EXPECT_EQ(result.get_value(), hint);
500 EXPECT_TRUE(result.is_constant());
501 EXPECT_FALSE(result.is_point_at_infinity().get_value());
503 check_circuit_and_gate_count(
builder, 0);
509 auto lhs = TestFixture::generators[1];
510 cycle_group_ct
a(lhs);
512 cycle_group_ct result =
a.dbl();
515 AffineElement expected(expected_element);
516 EXPECT_EQ(result.get_value(), expected);
517 EXPECT_TRUE(result.is_constant());
518 EXPECT_FALSE(result.is_point_at_infinity().get_value());
520 check_circuit_and_gate_count(
builder, 0);
526 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
528 cycle_group_ct result = infinity.dbl();
530 EXPECT_TRUE(result.is_point_at_infinity().get_value());
531 EXPECT_TRUE(result.is_constant());
532 EXPECT_EQ(result.x().get_value(), 0);
533 EXPECT_EQ(result.y().get_value(), 0);
535 check_circuit_and_gate_count(
builder, 0);
541 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
544 hint.self_set_infinity();
546 cycle_group_ct result = infinity.dbl(hint);
548 EXPECT_TRUE(result.is_point_at_infinity().get_value());
549 EXPECT_TRUE(result.is_constant());
550 EXPECT_EQ(result.x().get_value(), 0);
551 EXPECT_EQ(result.y().get_value(), 0);
553 check_circuit_and_gate_count(
builder, 0);
585 auto lhs = TestFixture::generators[0];
586 auto rhs = TestFixture::generators[1];
587 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
588 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
590 cycle_group_ct result =
a.unconditional_add(
b);
593 AffineElement expected(expected_element);
594 EXPECT_EQ(result.get_value(), expected);
595 EXPECT_FALSE(result.is_point_at_infinity().get_value());
597 check_circuit_and_gate_count(
builder, 14);
603 auto lhs = TestFixture::generators[2];
604 auto rhs = TestFixture::generators[3];
605 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
606 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
609 AffineElement hint(sum_element);
611 cycle_group_ct result =
a.unconditional_add(
b, hint);
613 EXPECT_EQ(result.get_value(), hint);
614 EXPECT_FALSE(result.is_point_at_infinity().get_value());
616 check_circuit_and_gate_count(
builder, 14);
622 auto lhs = TestFixture::generators[0];
623 auto rhs = TestFixture::generators[1];
624 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
625 cycle_group_ct
b(rhs);
627 cycle_group_ct result =
a.unconditional_add(
b);
630 AffineElement expected(expected_element);
631 EXPECT_EQ(result.get_value(), expected);
632 EXPECT_FALSE(result.is_constant());
633 EXPECT_FALSE(result.is_point_at_infinity().get_value());
635 check_circuit_and_gate_count(
builder, 10);
646 auto lhs = TestFixture::generators[0];
647 auto rhs = TestFixture::generators[1];
648 cycle_group_ct
a(lhs);
649 cycle_group_ct
b(rhs);
651 cycle_group_ct result =
a.unconditional_add(
b);
654 AffineElement expected(expected_element);
655 EXPECT_EQ(result.get_value(), expected);
656 EXPECT_TRUE(result.is_constant());
657 EXPECT_FALSE(result.is_point_at_infinity().get_value());
659 check_circuit_and_gate_count(
builder, 0);
665 auto lhs = TestFixture::generators[2];
666 auto rhs = TestFixture::generators[3];
667 cycle_group_ct
a(lhs);
668 cycle_group_ct
b(rhs);
671 AffineElement hint(sum_element);
673 cycle_group_ct result =
a.unconditional_add(
b, hint);
675 EXPECT_EQ(result.get_value(), hint);
676 EXPECT_TRUE(result.is_constant());
677 EXPECT_FALSE(result.is_point_at_infinity().get_value());
679 check_circuit_and_gate_count(
builder, 0);
690 auto lhs = TestFixture::generators[0];
691 auto rhs = TestFixture::generators[1];
692 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
693 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
695 cycle_group_ct result =
a.unconditional_subtract(
b);
698 AffineElement expected(expected_element);
699 EXPECT_EQ(result.get_value(), expected);
700 EXPECT_FALSE(result.is_point_at_infinity().get_value());
702 check_circuit_and_gate_count(
builder, 14);
708 auto lhs = TestFixture::generators[2];
709 auto rhs = TestFixture::generators[3];
710 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
711 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
714 AffineElement hint(diff_element);
716 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
718 EXPECT_EQ(result.get_value(), hint);
719 EXPECT_FALSE(result.is_point_at_infinity().get_value());
722 check_circuit_and_gate_count(
builder, 14);
728 auto lhs = TestFixture::generators[0];
729 auto rhs = TestFixture::generators[1];
730 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
731 cycle_group_ct
b(rhs);
733 cycle_group_ct result =
a.unconditional_subtract(
b);
736 AffineElement expected(expected_element);
737 EXPECT_EQ(result.get_value(), expected);
738 EXPECT_FALSE(result.is_constant());
739 EXPECT_FALSE(result.is_point_at_infinity().get_value());
741 check_circuit_and_gate_count(
builder, 10);
752 auto lhs = TestFixture::generators[0];
753 auto rhs = TestFixture::generators[1];
754 cycle_group_ct
a(lhs);
755 cycle_group_ct
b(rhs);
757 cycle_group_ct result =
a.unconditional_subtract(
b);
760 AffineElement expected(expected_element);
761 EXPECT_EQ(result.get_value(), expected);
762 EXPECT_TRUE(result.is_constant());
763 EXPECT_FALSE(result.is_point_at_infinity().get_value());
765 check_circuit_and_gate_count(
builder, 0);
771 auto lhs = TestFixture::generators[2];
772 auto rhs = TestFixture::generators[3];
773 cycle_group_ct
a(lhs);
774 cycle_group_ct
b(rhs);
777 AffineElement hint(diff_element);
779 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
781 EXPECT_EQ(result.get_value(), hint);
782 EXPECT_TRUE(result.is_constant());
783 EXPECT_FALSE(result.is_point_at_infinity().get_value());
785 check_circuit_and_gate_count(
builder, 0);
795 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
796 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
797 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
799 a.set_origin_tag(submitted_value_origin_tag);
800 b.set_origin_tag(challenge_origin_tag);
801 cycle_group_ct c =
a.unconditional_add(
b);
803 AffineElement result = c.get_value();
804 EXPECT_EQ(result, expected);
806 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
809 add(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
810 add(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
811 add(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
812 add(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
814 check_circuit_and_gate_count(
builder, 34);
937 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
939 cycle_group_ct point_at_infinity1 = cycle_group_ct::from_witness(&
builder, affine_infinity);
941 cycle_group_ct point_at_infinity2 = cycle_group_ct::from_witness(&
builder, affine_infinity);
943 cycle_group_ct
a = point_at_infinity1;
944 cycle_group_ct
b = point_at_infinity2;
946 a.set_origin_tag(submitted_value_origin_tag);
947 b.set_origin_tag(challenge_origin_tag);
949 cycle_group_ct c =
a +
b;
951 EXPECT_TRUE(c.is_point_at_infinity().get_value());
952 EXPECT_TRUE(c.get_value().is_point_at_infinity());
953 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
955 check_circuit_and_gate_count(
builder, 47);
1012 auto lhs = TestFixture::generators[5];
1013 auto rhs = TestFixture::generators[6];
1015 cycle_group_ct
a(lhs);
1016 cycle_group_ct
b(rhs);
1018 cycle_group_ct result =
a +
b;
1021 EXPECT_EQ(result.get_value(), expected);
1022 EXPECT_TRUE(result.is_constant());
1025 check_circuit_and_gate_count(
builder, 0);
1031 auto lhs = TestFixture::generators[7];
1033 cycle_group_ct
a(lhs);
1034 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1036 cycle_group_ct result =
a +
b;
1038 EXPECT_EQ(result.get_value(), lhs);
1039 EXPECT_TRUE(result.is_constant());
1042 check_circuit_and_gate_count(
builder, 0);
1056 auto lhs = TestFixture::generators[10];
1058 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1059 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1061 cycle_group_ct result =
a +
b;
1063 EXPECT_EQ(result.get_value(), lhs);
1064 EXPECT_FALSE(result.is_constant());
1067 check_circuit_and_gate_count(
builder, 6);
1073 auto lhs = TestFixture::generators[11];
1074 auto rhs = TestFixture::generators[12];
1076 cycle_group_ct
a(lhs);
1077 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1079 cycle_group_ct result =
a +
b;
1082 EXPECT_EQ(result.get_value(), expected);
1083 EXPECT_FALSE(result.is_constant());
1086 check_circuit_and_gate_count(
builder, 23);
1098 auto point = TestFixture::generators[0];
1099 auto neg_point = -point;
1101 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1102 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, neg_point);
1104 cycle_group_ct result =
a +
b;
1107 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1108 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1113 cycle_group_ct inf1 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1114 cycle_group_ct inf2 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1116 cycle_group_ct result = inf1 + inf2;
1119 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1120 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1125 auto point = TestFixture::generators[1];
1127 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1128 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1130 cycle_group_ct result =
a +
b;
1133 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1134 EXPECT_EQ(result.get_value(), point);
1139 auto point = TestFixture::generators[2];
1141 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1142 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1144 cycle_group_ct result =
a +
b;
1147 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1148 EXPECT_EQ(result.get_value(), point);
1153 auto point = TestFixture::generators[3];
1155 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1156 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1158 cycle_group_ct result =
a +
b;
1161 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1163 AffineElement expected(
Element(point).dbl());
1164 EXPECT_EQ(result.get_value(), expected);
1167 check_circuit_and_gate_count(
builder, 235);
1176 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
1177 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
1178 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
1180 a.set_origin_tag(submitted_value_origin_tag);
1181 b.set_origin_tag(challenge_origin_tag);
1183 cycle_group_ct c =
a.unconditional_subtract(
b);
1185 AffineElement result = c.get_value();
1186 EXPECT_EQ(result, expected);
1188 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1191 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
1192 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
1193 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
1194 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
1196 check_circuit_and_gate_count(
builder, 34);
1243 auto lhs = TestFixture::generators[0];
1244 auto rhs = -TestFixture::generators[1];
1245 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1247 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
1251 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1252 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1254 a.set_origin_tag(submitted_value_origin_tag);
1255 b.set_origin_tag(challenge_origin_tag);
1257 cycle_group_ct c =
a -
b;
1259 AffineElement result = c.get_value();
1260 EXPECT_EQ(result, expected);
1262 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1267 cycle_group_ct
a = point_at_infinity;
1268 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1269 a.set_origin_tag(submitted_value_origin_tag);
1270 b.set_origin_tag(challenge_origin_tag);
1272 cycle_group_ct c =
a -
b;
1273 AffineElement result = c.get_value();
1274 EXPECT_EQ(result, -rhs);
1275 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1280 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1281 cycle_group_ct
b = point_at_infinity;
1282 a.set_origin_tag(submitted_value_origin_tag);
1283 b.set_origin_tag(challenge_origin_tag);
1285 cycle_group_ct c =
a -
b;
1286 AffineElement result = c.get_value();
1287 EXPECT_EQ(result, lhs);
1288 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1293 cycle_group_ct
a = point_at_infinity;
1294 cycle_group_ct
b = point_at_infinity;
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);
1306 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1307 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
1308 a.set_origin_tag(submitted_value_origin_tag);
1309 b.set_origin_tag(challenge_origin_tag);
1311 cycle_group_ct c =
a -
b;
1312 AffineElement expected((
Element(lhs)).dbl());
1313 AffineElement result = c.get_value();
1314 EXPECT_EQ(result, expected);
1315 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1320 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1321 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
1322 a.set_origin_tag(submitted_value_origin_tag);
1323 b.set_origin_tag(challenge_origin_tag);
1325 cycle_group_ct c =
a -
b;
1326 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1327 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1328 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1331 check_circuit_and_gate_count(
builder, 261);
1342 auto lhs = TestFixture::generators[5];
1343 auto rhs = TestFixture::generators[6];
1345 cycle_group_ct
a(lhs);
1346 cycle_group_ct
b(rhs);
1348 cycle_group_ct result =
a -
b;
1351 EXPECT_EQ(result.get_value(), expected);
1352 EXPECT_TRUE(result.is_constant());
1355 check_circuit_and_gate_count(
builder, 0);
1361 auto lhs = TestFixture::generators[7];
1363 cycle_group_ct
a(lhs);
1364 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1366 cycle_group_ct result =
a -
b;
1368 EXPECT_EQ(result.get_value(), lhs);
1369 EXPECT_TRUE(result.is_constant());
1372 check_circuit_and_gate_count(
builder, 0);
1378 auto rhs = TestFixture::generators[7];
1380 cycle_group_ct
a = cycle_group_ct::constant_infinity(&
builder);
1381 cycle_group_ct
b(rhs);
1383 cycle_group_ct result =
a -
b;
1385 EXPECT_EQ(result.get_value(), -rhs);
1386 EXPECT_TRUE(result.is_constant());
1389 check_circuit_and_gate_count(
builder, 0);
1418 const size_t num_muls = 1;
1422 Element expected = Group::point_at_infinity;
1424 for (
size_t i = 0; i < num_muls; ++i) {
1425 auto element = TestFixture::generators[i];
1426 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1429 expected += (element * scalar);
1430 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1431 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1434 expected += (element * scalar);
1435 points.emplace_back(cycle_group_ct(element));
1436 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1439 expected += (element * scalar);
1440 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1441 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1444 expected += (element * scalar);
1445 points.emplace_back(cycle_group_ct(element));
1446 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1452 auto result = cycle_group_ct::batch_mul(points, scalars);
1453 EXPECT_EQ(result.get_value(), AffineElement(expected));
1455 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1459 check_circuit_and_gate_count(
builder, 4393);
1461 check_circuit_and_gate_count(
builder, 4396);
1474 auto element = TestFixture::generators[0];
1475 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1476 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1477 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1479 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1480 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, -scalar));
1484 auto result = cycle_group_ct::batch_mul(points, scalars);
1485 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1487 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1491 check_circuit_and_gate_count(
builder, 4019);
1493 check_circuit_and_gate_count(
builder, 4022);
1533 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1534 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1538 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, affine_infinity);
1539 points.emplace_back(point);
1540 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1544 cycle_group_ct point = cycle_group_ct(affine_infinity);
1545 points.emplace_back(point);
1546 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1550 auto result = cycle_group_ct::batch_mul(points, scalars);
1551 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1552 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1556 check_circuit_and_gate_count(
builder, 3542);
1558 check_circuit_and_gate_count(
builder, 3545);
1567 const size_t num_muls = 1;
1573 Element expected = Group::point_at_infinity;
1574 for (
size_t i = 0; i < num_muls; ++i) {
1576 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1579 expected += (element * scalar);
1580 points.emplace_back(element);
1581 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1582 scalars_native.emplace_back(
uint256_t(scalar));
1586 expected += (element * scalar);
1587 points.emplace_back(element);
1588 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1589 scalars_native.emplace_back(
uint256_t(scalar));
1592 auto result = cycle_group_ct::batch_mul(points, scalars);
1593 EXPECT_EQ(result.get_value(), AffineElement(expected));
1595 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1597 check_circuit_and_gate_count(
builder, 2822);
1605 const size_t num_muls = 1;
1611 Element expected = Group::point_at_infinity;
1612 for (
size_t i = 0; i < num_muls; ++i) {
1614 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1617 expected += (element * scalar);
1618 points.emplace_back(element);
1619 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1620 scalars_native.emplace_back(scalar);
1624 expected += (element * scalar);
1625 points.emplace_back(element);
1626 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1627 scalars_native.emplace_back(scalar);
1630 scalar = Group::Fr::random_element(&
engine);
1631 element = Group::one * Group::Fr::random_element(&
engine);
1632 expected += (element * scalar);
1633 points.emplace_back(element);
1634 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1635 scalars_native.emplace_back(scalar);
1638 auto result = cycle_group_ct::batch_mul(points, scalars);
1639 EXPECT_EQ(result.get_value(), AffineElement(expected));
1640 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1644 check_circuit_and_gate_count(
builder, 3395);
1646 check_circuit_and_gate_count(
builder, 3398);
1685 const size_t num_muls = 5;
1689 cycle_group_ct point;
1690 typename cycle_group_ct::cycle_scalar scalar;
1691 cycle_group_ct result;
1692 for (
size_t i = 0; i < num_muls; ++i) {
1693 auto element = TestFixture::generators[i];
1694 typename Group::Fr native_scalar = Group::Fr::random_element(&
engine);
1698 point = (cycle_group_ct::from_witness(&
builder, element));
1699 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1700 point.set_origin_tag(submitted_value_origin_tag);
1701 scalar.set_origin_tag(challenge_origin_tag);
1702 result = point * scalar;
1706 point = (cycle_group_ct(element));
1707 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1708 result = point * scalar;
1712 point = (cycle_group_ct::from_witness(&
builder, element));
1713 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1714 result = point * scalar;
1718 point = (cycle_group_ct(element));
1719 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1720 result = point * scalar;
1727 check_circuit_and_gate_count(
builder, 12933);
1729 check_circuit_and_gate_count(
builder, 12936);
1784 const auto run_test = [](
bool construct_witnesses) {
1791 if (construct_witnesses) {
1792 big_scalar1 = FF_ct::from_witness(&
builder, scalar1);
1793 big_scalar2 = FF_ct::from_witness(&
builder, scalar2);
1795 big_scalar1 = FF_ct(scalar1);
1796 big_scalar2 = FF_ct(scalar2);
1798 cycle_group_ct result1 = cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1799 { big_scalar1, big_scalar2 });
1801 cycle_group_ct result2 =
1802 cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1803 { cycle_scalar_ct(big_scalar1), cycle_scalar_ct(big_scalar2) });
1805 AffineElement result1_native = result1.get_value();
1806 AffineElement result2_native = result2.get_value();
1807 EXPECT_EQ(result1_native.x, result2_native.x);
1808 EXPECT_EQ(result1_native.y, result2_native.y);
1809 if (construct_witnesses) {
1810 EXPECT_FALSE(result1.is_constant());
1811 EXPECT_FALSE(result2.is_constant());
1814 check_circuit_and_gate_count(
builder, 5285);
1816 check_circuit_and_gate_count(
builder, 5288);