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 cycle_group_ct
b(x_death, y_normal, is_infinity_normal,
true);
98 EXPECT_THROW(
b.get_origin_tag(), std::runtime_error);
312 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
313 cycle_group_ct input_a = cycle_group_ct::from_witness(&
builder, Element::random_element());
314 cycle_group_ct input_b = cycle_group_ct::from_witness(&
builder, affine_infinity);
315 cycle_group_ct input_c = cycle_group_ct(Element::random_element());
316 cycle_group_ct input_d = cycle_group_ct(affine_infinity);
320 cycle_group_ct input_e = cycle_group_ct(x, y,
true,
true);
321 cycle_group_ct input_f = cycle_group_ct(x, y, bool_ct(
witness_ct(&
builder,
true)),
true);
324 input_a.set_origin_tag(submitted_value_origin_tag);
325 input_b.set_origin_tag(challenge_origin_tag);
326 input_c.set_origin_tag(next_challenge_tag);
327 input_d.set_origin_tag(first_two_merged_tag);
329 input_a.standardize();
330 auto standard_a = input_a;
331 input_b.standardize();
332 auto standard_b = input_b;
333 input_c.standardize();
334 auto standard_c = input_c;
335 input_d.standardize();
336 auto standard_d = input_d;
337 input_e.standardize();
338 auto standard_e = input_e;
339 input_f.standardize();
340 auto standard_f = input_f;
342 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
false);
343 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
344 EXPECT_EQ(standard_c.is_point_at_infinity().get_value(),
false);
345 EXPECT_EQ(standard_d.is_point_at_infinity().get_value(),
true);
346 EXPECT_EQ(standard_e.is_point_at_infinity().get_value(),
true);
347 EXPECT_EQ(standard_f.is_point_at_infinity().get_value(),
true);
350 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
351 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
352 EXPECT_EQ(standard_c.get_origin_tag(), next_challenge_tag);
353 EXPECT_EQ(standard_d.get_origin_tag(), first_two_merged_tag);
355 auto input_a_x = input_a.x().get_value();
356 auto input_a_y = input_a.y().get_value();
357 auto input_c_x = input_c.x().get_value();
358 auto input_c_y = input_c.y().get_value();
360 auto standard_a_x = standard_a.x().get_value();
361 auto standard_a_y = standard_a.y().get_value();
363 auto standard_b_x = standard_b.x().get_value();
364 auto standard_b_y = standard_b.y().get_value();
366 auto standard_c_x = standard_c.x().get_value();
367 auto standard_c_y = standard_c.y().get_value();
369 auto standard_d_x = standard_d.x().get_value();
370 auto standard_d_y = standard_d.y().get_value();
372 auto standard_e_x = standard_e.x().get_value();
373 auto standard_e_y = standard_e.y().get_value();
375 auto standard_f_x = standard_f.x().get_value();
376 auto standard_f_y = standard_f.y().get_value();
378 EXPECT_EQ(input_a_x, standard_a_x);
379 EXPECT_EQ(input_a_y, standard_a_y);
380 EXPECT_EQ(standard_b_x, 0);
381 EXPECT_EQ(standard_b_y, 0);
382 EXPECT_EQ(input_c_x, standard_c_x);
383 EXPECT_EQ(input_c_y, standard_c_y);
384 EXPECT_EQ(standard_d_x, 0);
385 EXPECT_EQ(standard_d_y, 0);
386 EXPECT_EQ(standard_e_x, 0);
387 EXPECT_EQ(standard_e_y, 0);
388 EXPECT_EQ(standard_f_x, 0);
389 EXPECT_EQ(standard_f_y, 0);
391 check_circuit_and_gate_count(
builder, 24);
398 auto lhs = TestFixture::generators[0];
399 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
400 cycle_group_ct
b = cycle_group_ct(lhs);
402 a.set_origin_tag(submitted_value_origin_tag);
403 b.set_origin_tag(challenge_origin_tag);
406 for (
size_t i = 0; i < 3; ++i) {
410 AffineElement expected(
Element(lhs).dbl());
411 AffineElement result = c.get_value();
412 EXPECT_EQ(result, expected);
413 EXPECT_EQ(d.get_value(), expected);
415 check_circuit_and_gate_count(
builder, 15);
418 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
419 EXPECT_EQ(d.get_origin_tag(), challenge_origin_tag);
429 auto lhs = TestFixture::generators[0];
430 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
433 AffineElement hint(doubled_element);
435 cycle_group_ct result =
a.dbl(hint);
437 EXPECT_EQ(result.get_value(), hint);
438 EXPECT_FALSE(result.is_point_at_infinity().get_value());
440 check_circuit_and_gate_count(
builder, 9);
446 auto lhs = TestFixture::generators[1];
447 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
449 cycle_group_ct result =
a.dbl();
452 AffineElement expected(expected_element);
453 EXPECT_EQ(result.get_value(), expected);
454 EXPECT_FALSE(result.is_point_at_infinity().get_value());
457 check_circuit_and_gate_count(
builder, 9);
463 AffineElement infinity_element;
464 infinity_element.self_set_infinity();
466 cycle_group_ct infinity = cycle_group_ct::from_witness(&
builder, infinity_element);
468 cycle_group_ct result = infinity.dbl();
470 EXPECT_TRUE(result.is_point_at_infinity().get_value());
473 EXPECT_EQ(result.x().get_value(), 0);
476 check_circuit_and_gate_count(
builder, 9);
487 auto lhs = TestFixture::generators[0];
488 cycle_group_ct
a(lhs);
491 AffineElement hint(doubled_element);
493 cycle_group_ct result =
a.dbl(hint);
495 EXPECT_EQ(result.get_value(), hint);
496 EXPECT_TRUE(result.is_constant());
497 EXPECT_FALSE(result.is_point_at_infinity().get_value());
499 check_circuit_and_gate_count(
builder, 0);
505 auto lhs = TestFixture::generators[1];
506 cycle_group_ct
a(lhs);
508 cycle_group_ct result =
a.dbl();
511 AffineElement expected(expected_element);
512 EXPECT_EQ(result.get_value(), expected);
513 EXPECT_TRUE(result.is_constant());
514 EXPECT_FALSE(result.is_point_at_infinity().get_value());
516 check_circuit_and_gate_count(
builder, 0);
522 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
524 cycle_group_ct result = infinity.dbl();
526 EXPECT_TRUE(result.is_point_at_infinity().get_value());
527 EXPECT_TRUE(result.is_constant());
528 EXPECT_EQ(result.x().get_value(), 0);
529 EXPECT_EQ(result.y().get_value(), 0);
531 check_circuit_and_gate_count(
builder, 0);
537 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
540 hint.self_set_infinity();
542 cycle_group_ct result = infinity.dbl(hint);
544 EXPECT_TRUE(result.is_point_at_infinity().get_value());
545 EXPECT_TRUE(result.is_constant());
546 EXPECT_EQ(result.x().get_value(), 0);
547 EXPECT_EQ(result.y().get_value(), 0);
549 check_circuit_and_gate_count(
builder, 0);
581 auto lhs = TestFixture::generators[0];
582 auto rhs = TestFixture::generators[1];
583 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
584 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
586 cycle_group_ct result =
a.unconditional_add(
b);
589 AffineElement expected(expected_element);
590 EXPECT_EQ(result.get_value(), expected);
591 EXPECT_FALSE(result.is_point_at_infinity().get_value());
593 check_circuit_and_gate_count(
builder, 14);
599 auto lhs = TestFixture::generators[2];
600 auto rhs = TestFixture::generators[3];
601 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
602 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
605 AffineElement hint(sum_element);
607 cycle_group_ct result =
a.unconditional_add(
b, hint);
609 EXPECT_EQ(result.get_value(), hint);
610 EXPECT_FALSE(result.is_point_at_infinity().get_value());
612 check_circuit_and_gate_count(
builder, 14);
618 auto lhs = TestFixture::generators[0];
619 auto rhs = TestFixture::generators[1];
620 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
621 cycle_group_ct
b(rhs);
623 cycle_group_ct result =
a.unconditional_add(
b);
626 AffineElement expected(expected_element);
627 EXPECT_EQ(result.get_value(), expected);
628 EXPECT_FALSE(result.is_constant());
629 EXPECT_FALSE(result.is_point_at_infinity().get_value());
631 check_circuit_and_gate_count(
builder, 10);
642 auto lhs = TestFixture::generators[0];
643 auto rhs = TestFixture::generators[1];
644 cycle_group_ct
a(lhs);
645 cycle_group_ct
b(rhs);
647 cycle_group_ct result =
a.unconditional_add(
b);
650 AffineElement expected(expected_element);
651 EXPECT_EQ(result.get_value(), expected);
652 EXPECT_TRUE(result.is_constant());
653 EXPECT_FALSE(result.is_point_at_infinity().get_value());
655 check_circuit_and_gate_count(
builder, 0);
661 auto lhs = TestFixture::generators[2];
662 auto rhs = TestFixture::generators[3];
663 cycle_group_ct
a(lhs);
664 cycle_group_ct
b(rhs);
667 AffineElement hint(sum_element);
669 cycle_group_ct result =
a.unconditional_add(
b, hint);
671 EXPECT_EQ(result.get_value(), hint);
672 EXPECT_TRUE(result.is_constant());
673 EXPECT_FALSE(result.is_point_at_infinity().get_value());
675 check_circuit_and_gate_count(
builder, 0);
686 auto lhs = TestFixture::generators[0];
687 auto rhs = TestFixture::generators[1];
688 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
689 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
691 cycle_group_ct result =
a.unconditional_subtract(
b);
694 AffineElement expected(expected_element);
695 EXPECT_EQ(result.get_value(), expected);
696 EXPECT_FALSE(result.is_point_at_infinity().get_value());
698 check_circuit_and_gate_count(
builder, 14);
704 auto lhs = TestFixture::generators[2];
705 auto rhs = TestFixture::generators[3];
706 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
707 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
710 AffineElement hint(diff_element);
712 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
714 EXPECT_EQ(result.get_value(), hint);
715 EXPECT_FALSE(result.is_point_at_infinity().get_value());
718 check_circuit_and_gate_count(
builder, 14);
724 auto lhs = TestFixture::generators[0];
725 auto rhs = TestFixture::generators[1];
726 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
727 cycle_group_ct
b(rhs);
729 cycle_group_ct result =
a.unconditional_subtract(
b);
732 AffineElement expected(expected_element);
733 EXPECT_EQ(result.get_value(), expected);
734 EXPECT_FALSE(result.is_constant());
735 EXPECT_FALSE(result.is_point_at_infinity().get_value());
737 check_circuit_and_gate_count(
builder, 10);
748 auto lhs = TestFixture::generators[0];
749 auto rhs = TestFixture::generators[1];
750 cycle_group_ct
a(lhs);
751 cycle_group_ct
b(rhs);
753 cycle_group_ct result =
a.unconditional_subtract(
b);
756 AffineElement expected(expected_element);
757 EXPECT_EQ(result.get_value(), expected);
758 EXPECT_TRUE(result.is_constant());
759 EXPECT_FALSE(result.is_point_at_infinity().get_value());
761 check_circuit_and_gate_count(
builder, 0);
767 auto lhs = TestFixture::generators[2];
768 auto rhs = TestFixture::generators[3];
769 cycle_group_ct
a(lhs);
770 cycle_group_ct
b(rhs);
773 AffineElement hint(diff_element);
775 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
777 EXPECT_EQ(result.get_value(), hint);
778 EXPECT_TRUE(result.is_constant());
779 EXPECT_FALSE(result.is_point_at_infinity().get_value());
781 check_circuit_and_gate_count(
builder, 0);
791 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
792 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
793 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
795 a.set_origin_tag(submitted_value_origin_tag);
796 b.set_origin_tag(challenge_origin_tag);
797 cycle_group_ct c =
a.unconditional_add(
b);
799 AffineElement result = c.get_value();
800 EXPECT_EQ(result, expected);
802 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
805 add(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
806 add(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
807 add(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
808 add(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
810 check_circuit_and_gate_count(
builder, 34);
933 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
935 cycle_group_ct point_at_infinity1 = cycle_group_ct::from_witness(&
builder, affine_infinity);
937 cycle_group_ct point_at_infinity2 = cycle_group_ct::from_witness(&
builder, affine_infinity);
939 cycle_group_ct
a = point_at_infinity1;
940 cycle_group_ct
b = point_at_infinity2;
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, 47);
1008 auto lhs = TestFixture::generators[5];
1009 auto rhs = TestFixture::generators[6];
1011 cycle_group_ct
a(lhs);
1012 cycle_group_ct
b(rhs);
1014 cycle_group_ct result =
a +
b;
1017 EXPECT_EQ(result.get_value(), expected);
1018 EXPECT_TRUE(result.is_constant());
1021 check_circuit_and_gate_count(
builder, 0);
1027 auto lhs = TestFixture::generators[7];
1029 cycle_group_ct
a(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_TRUE(result.is_constant());
1038 check_circuit_and_gate_count(
builder, 0);
1052 auto lhs = TestFixture::generators[10];
1054 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1055 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1057 cycle_group_ct result =
a +
b;
1059 EXPECT_EQ(result.get_value(), lhs);
1060 EXPECT_FALSE(result.is_constant());
1063 check_circuit_and_gate_count(
builder, 6);
1069 auto lhs = TestFixture::generators[11];
1070 auto rhs = TestFixture::generators[12];
1072 cycle_group_ct
a(lhs);
1073 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1075 cycle_group_ct result =
a +
b;
1078 EXPECT_EQ(result.get_value(), expected);
1079 EXPECT_FALSE(result.is_constant());
1082 check_circuit_and_gate_count(
builder, 23);
1094 auto point = TestFixture::generators[0];
1095 auto neg_point = -point;
1097 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1098 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, neg_point);
1100 cycle_group_ct result =
a +
b;
1103 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1104 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1109 cycle_group_ct inf1 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1110 cycle_group_ct inf2 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1112 cycle_group_ct result = inf1 + inf2;
1115 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1116 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1121 auto point = TestFixture::generators[1];
1123 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1124 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1126 cycle_group_ct result =
a +
b;
1129 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1130 EXPECT_EQ(result.get_value(), point);
1135 auto point = TestFixture::generators[2];
1137 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1138 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1140 cycle_group_ct result =
a +
b;
1143 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1144 EXPECT_EQ(result.get_value(), point);
1149 auto point = TestFixture::generators[3];
1151 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1152 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1154 cycle_group_ct result =
a +
b;
1157 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1159 AffineElement expected(
Element(point).dbl());
1160 EXPECT_EQ(result.get_value(), expected);
1163 check_circuit_and_gate_count(
builder, 235);
1172 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
1173 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
1174 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
1176 a.set_origin_tag(submitted_value_origin_tag);
1177 b.set_origin_tag(challenge_origin_tag);
1179 cycle_group_ct c =
a.unconditional_subtract(
b);
1181 AffineElement result = c.get_value();
1182 EXPECT_EQ(result, expected);
1184 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1187 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
1188 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
1189 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
1190 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
1192 check_circuit_and_gate_count(
builder, 34);
1239 auto lhs = TestFixture::generators[0];
1240 auto rhs = -TestFixture::generators[1];
1241 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1243 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
1247 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1248 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1250 a.set_origin_tag(submitted_value_origin_tag);
1251 b.set_origin_tag(challenge_origin_tag);
1253 cycle_group_ct c =
a -
b;
1255 AffineElement result = c.get_value();
1256 EXPECT_EQ(result, expected);
1258 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1263 cycle_group_ct
a = point_at_infinity;
1264 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1265 a.set_origin_tag(submitted_value_origin_tag);
1266 b.set_origin_tag(challenge_origin_tag);
1268 cycle_group_ct c =
a -
b;
1269 AffineElement result = c.get_value();
1270 EXPECT_EQ(result, -rhs);
1271 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1276 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1277 cycle_group_ct
b = point_at_infinity;
1278 a.set_origin_tag(submitted_value_origin_tag);
1279 b.set_origin_tag(challenge_origin_tag);
1281 cycle_group_ct c =
a -
b;
1282 AffineElement result = c.get_value();
1283 EXPECT_EQ(result, lhs);
1284 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1289 cycle_group_ct
a = point_at_infinity;
1290 cycle_group_ct
b = point_at_infinity;
1291 a.set_origin_tag(submitted_value_origin_tag);
1292 b.set_origin_tag(challenge_origin_tag);
1294 cycle_group_ct c =
a -
b;
1295 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1296 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1297 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1302 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1303 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
1304 a.set_origin_tag(submitted_value_origin_tag);
1305 b.set_origin_tag(challenge_origin_tag);
1307 cycle_group_ct c =
a -
b;
1308 AffineElement expected((
Element(lhs)).dbl());
1309 AffineElement result = c.get_value();
1310 EXPECT_EQ(result, expected);
1311 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1316 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1317 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
1318 a.set_origin_tag(submitted_value_origin_tag);
1319 b.set_origin_tag(challenge_origin_tag);
1321 cycle_group_ct c =
a -
b;
1322 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1323 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1324 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1327 check_circuit_and_gate_count(
builder, 261);
1338 auto lhs = TestFixture::generators[5];
1339 auto rhs = TestFixture::generators[6];
1341 cycle_group_ct
a(lhs);
1342 cycle_group_ct
b(rhs);
1344 cycle_group_ct result =
a -
b;
1347 EXPECT_EQ(result.get_value(), expected);
1348 EXPECT_TRUE(result.is_constant());
1351 check_circuit_and_gate_count(
builder, 0);
1357 auto lhs = TestFixture::generators[7];
1359 cycle_group_ct
a(lhs);
1360 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1362 cycle_group_ct result =
a -
b;
1364 EXPECT_EQ(result.get_value(), lhs);
1365 EXPECT_TRUE(result.is_constant());
1368 check_circuit_and_gate_count(
builder, 0);
1374 auto rhs = TestFixture::generators[7];
1376 cycle_group_ct
a = cycle_group_ct::constant_infinity(&
builder);
1377 cycle_group_ct
b(rhs);
1379 cycle_group_ct result =
a -
b;
1381 EXPECT_EQ(result.get_value(), -rhs);
1382 EXPECT_TRUE(result.is_constant());
1385 check_circuit_and_gate_count(
builder, 0);
1414 const size_t num_muls = 1;
1418 Element expected = Group::point_at_infinity;
1420 for (
size_t i = 0; i < num_muls; ++i) {
1421 auto element = TestFixture::generators[i];
1422 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1425 expected += (element * scalar);
1426 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1427 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1430 expected += (element * scalar);
1431 points.emplace_back(cycle_group_ct(element));
1432 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1435 expected += (element * scalar);
1436 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1437 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1440 expected += (element * scalar);
1441 points.emplace_back(cycle_group_ct(element));
1442 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1448 auto result = cycle_group_ct::batch_mul(points, scalars);
1449 EXPECT_EQ(result.get_value(), AffineElement(expected));
1451 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1455 check_circuit_and_gate_count(
builder, 4393);
1457 check_circuit_and_gate_count(
builder, 4396);
1470 auto element = TestFixture::generators[0];
1471 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1472 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1473 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1475 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1476 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, -scalar));
1480 auto result = cycle_group_ct::batch_mul(points, scalars);
1481 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1483 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1487 check_circuit_and_gate_count(
builder, 4019);
1489 check_circuit_and_gate_count(
builder, 4022);
1529 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1530 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1534 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, affine_infinity);
1535 points.emplace_back(point);
1536 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1540 cycle_group_ct point = cycle_group_ct(affine_infinity);
1541 points.emplace_back(point);
1542 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1546 auto result = cycle_group_ct::batch_mul(points, scalars);
1547 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1548 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1552 check_circuit_and_gate_count(
builder, 3542);
1554 check_circuit_and_gate_count(
builder, 3545);
1563 const size_t num_muls = 1;
1569 Element expected = Group::point_at_infinity;
1570 for (
size_t i = 0; i < num_muls; ++i) {
1572 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1575 expected += (element * scalar);
1576 points.emplace_back(element);
1577 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1578 scalars_native.emplace_back(
uint256_t(scalar));
1582 expected += (element * scalar);
1583 points.emplace_back(element);
1584 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1585 scalars_native.emplace_back(
uint256_t(scalar));
1588 auto result = cycle_group_ct::batch_mul(points, scalars);
1589 EXPECT_EQ(result.get_value(), AffineElement(expected));
1591 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1593 check_circuit_and_gate_count(
builder, 2822);
1601 const size_t num_muls = 1;
1607 Element expected = Group::point_at_infinity;
1608 for (
size_t i = 0; i < num_muls; ++i) {
1610 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1613 expected += (element * scalar);
1614 points.emplace_back(element);
1615 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1616 scalars_native.emplace_back(scalar);
1620 expected += (element * scalar);
1621 points.emplace_back(element);
1622 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1623 scalars_native.emplace_back(scalar);
1626 scalar = Group::Fr::random_element(&
engine);
1627 element = Group::one * Group::Fr::random_element(&
engine);
1628 expected += (element * scalar);
1629 points.emplace_back(element);
1630 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1631 scalars_native.emplace_back(scalar);
1634 auto result = cycle_group_ct::batch_mul(points, scalars);
1635 EXPECT_EQ(result.get_value(), AffineElement(expected));
1636 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1640 check_circuit_and_gate_count(
builder, 3395);
1642 check_circuit_and_gate_count(
builder, 3398);
1681 const size_t num_muls = 5;
1685 cycle_group_ct point;
1686 typename cycle_group_ct::cycle_scalar scalar;
1687 cycle_group_ct result;
1688 for (
size_t i = 0; i < num_muls; ++i) {
1689 auto element = TestFixture::generators[i];
1690 typename Group::Fr native_scalar = Group::Fr::random_element(&
engine);
1694 point = (cycle_group_ct::from_witness(&
builder, element));
1695 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1696 point.set_origin_tag(submitted_value_origin_tag);
1697 scalar.set_origin_tag(challenge_origin_tag);
1698 result = point * scalar;
1702 point = (cycle_group_ct(element));
1703 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1704 result = point * scalar;
1708 point = (cycle_group_ct::from_witness(&
builder, element));
1709 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1710 result = point * scalar;
1714 point = (cycle_group_ct(element));
1715 scalar = (
typename cycle_group_ct::cycle_scalar(native_scalar));
1716 result = point * scalar;
1723 check_circuit_and_gate_count(
builder, 12933);
1725 check_circuit_and_gate_count(
builder, 12936);
1780 const auto run_test = [](
bool construct_witnesses) {
1787 if (construct_witnesses) {
1788 big_scalar1 = FF_ct::from_witness(&
builder, scalar1);
1789 big_scalar2 = FF_ct::from_witness(&
builder, scalar2);
1791 big_scalar1 = FF_ct(scalar1);
1792 big_scalar2 = FF_ct(scalar2);
1794 cycle_group_ct result1 = cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1795 { big_scalar1, big_scalar2 });
1797 cycle_group_ct result2 =
1798 cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1799 { cycle_scalar_ct(big_scalar1), cycle_scalar_ct(big_scalar2) });
1801 AffineElement result1_native = result1.get_value();
1802 AffineElement result2_native = result2.get_value();
1803 EXPECT_EQ(result1_native.x, result2_native.x);
1804 EXPECT_EQ(result1_native.y, result2_native.y);
1805 if (construct_witnesses) {
1806 EXPECT_FALSE(result1.is_constant());
1807 EXPECT_FALSE(result2.is_constant());
1810 check_circuit_and_gate_count(
builder, 5285);
1812 check_circuit_and_gate_count(
builder, 5288);