306 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
307 cycle_group_ct input_a = cycle_group_ct::from_witness(&
builder, Element::random_element());
308 cycle_group_ct input_b = cycle_group_ct::from_witness(&
builder, affine_infinity);
309 cycle_group_ct input_c = cycle_group_ct(Element::random_element());
310 cycle_group_ct input_d = cycle_group_ct(affine_infinity);
314 cycle_group_ct input_e = cycle_group_ct(x, y,
true);
318 input_a.set_origin_tag(submitted_value_origin_tag);
319 input_b.set_origin_tag(challenge_origin_tag);
320 input_c.set_origin_tag(next_challenge_tag);
321 input_d.set_origin_tag(first_two_merged_tag);
323 auto standard_a = input_a.get_standard_form();
324 auto standard_b = input_b.get_standard_form();
325 auto standard_c = input_c.get_standard_form();
326 auto standard_d = input_d.get_standard_form();
327 auto standard_e = input_e.get_standard_form();
328 auto standard_f = input_f.get_standard_form();
330 EXPECT_EQ(standard_a.is_point_at_infinity().get_value(),
false);
331 EXPECT_EQ(standard_b.is_point_at_infinity().get_value(),
true);
332 EXPECT_EQ(standard_c.is_point_at_infinity().get_value(),
false);
333 EXPECT_EQ(standard_d.is_point_at_infinity().get_value(),
true);
334 EXPECT_EQ(standard_e.is_point_at_infinity().get_value(),
true);
335 EXPECT_EQ(standard_f.is_point_at_infinity().get_value(),
true);
338 EXPECT_EQ(standard_a.get_origin_tag(), submitted_value_origin_tag);
339 EXPECT_EQ(standard_b.get_origin_tag(), challenge_origin_tag);
340 EXPECT_EQ(standard_c.get_origin_tag(), next_challenge_tag);
341 EXPECT_EQ(standard_d.get_origin_tag(), first_two_merged_tag);
343 auto input_a_x = input_a.x.get_value();
344 auto input_a_y = input_a.y.get_value();
345 auto input_c_x = input_c.x.get_value();
346 auto input_c_y = input_c.y.get_value();
348 auto standard_a_x = standard_a.x.get_value();
349 auto standard_a_y = standard_a.y.get_value();
351 auto standard_b_x = standard_b.x.get_value();
352 auto standard_b_y = standard_b.y.get_value();
354 auto standard_c_x = standard_c.x.get_value();
355 auto standard_c_y = standard_c.y.get_value();
357 auto standard_d_x = standard_d.x.get_value();
358 auto standard_d_y = standard_d.y.get_value();
360 auto standard_e_x = standard_e.x.get_value();
361 auto standard_e_y = standard_e.y.get_value();
363 auto standard_f_x = standard_f.x.get_value();
364 auto standard_f_y = standard_f.y.get_value();
366 EXPECT_EQ(input_a_x, standard_a_x);
367 EXPECT_EQ(input_a_y, standard_a_y);
368 EXPECT_EQ(standard_b_x, 0);
369 EXPECT_EQ(standard_b_y, 0);
370 EXPECT_EQ(input_c_x, standard_c_x);
371 EXPECT_EQ(input_c_y, standard_c_y);
372 EXPECT_EQ(standard_d_x, 0);
373 EXPECT_EQ(standard_d_y, 0);
374 EXPECT_EQ(standard_e_x, 0);
375 EXPECT_EQ(standard_e_y, 0);
376 EXPECT_EQ(standard_f_x, 0);
377 EXPECT_EQ(standard_f_y, 0);
379 check_circuit_and_gate_count(
builder, 15);
386 auto lhs = TestFixture::generators[0];
387 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
388 cycle_group_ct
b = cycle_group_ct(lhs);
390 a.set_origin_tag(submitted_value_origin_tag);
391 b.set_origin_tag(challenge_origin_tag);
394 for (
size_t i = 0; i < 3; ++i) {
398 AffineElement expected(
Element(lhs).dbl());
399 AffineElement result = c.get_value();
400 EXPECT_EQ(result, expected);
401 EXPECT_EQ(d.get_value(), expected);
403 check_circuit_and_gate_count(
builder, 15);
406 EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag);
407 EXPECT_EQ(d.get_origin_tag(), challenge_origin_tag);
417 auto lhs = TestFixture::generators[0];
418 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
421 AffineElement hint(doubled_element);
423 cycle_group_ct result =
a.dbl(hint);
425 EXPECT_EQ(result.get_value(), hint);
426 EXPECT_FALSE(result.is_point_at_infinity().get_value());
428 check_circuit_and_gate_count(
builder, 9);
434 auto lhs = TestFixture::generators[1];
435 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
437 cycle_group_ct result =
a.dbl();
440 AffineElement expected(expected_element);
441 EXPECT_EQ(result.get_value(), expected);
442 EXPECT_FALSE(result.is_point_at_infinity().get_value());
445 check_circuit_and_gate_count(
builder, 9);
451 AffineElement infinity_element;
452 infinity_element.self_set_infinity();
454 cycle_group_ct infinity = cycle_group_ct::from_witness(&
builder, infinity_element);
456 cycle_group_ct result = infinity.dbl();
458 EXPECT_TRUE(result.is_point_at_infinity().get_value());
461 EXPECT_EQ(result.x.get_value(), 0);
464 check_circuit_and_gate_count(
builder, 9);
475 auto lhs = TestFixture::generators[0];
476 cycle_group_ct
a(lhs);
479 AffineElement hint(doubled_element);
481 cycle_group_ct result =
a.dbl(hint);
483 EXPECT_EQ(result.get_value(), hint);
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 auto lhs = TestFixture::generators[1];
494 cycle_group_ct
a(lhs);
496 cycle_group_ct result =
a.dbl();
499 AffineElement expected(expected_element);
500 EXPECT_EQ(result.get_value(), expected);
501 EXPECT_TRUE(result.is_constant());
502 EXPECT_FALSE(result.is_point_at_infinity().get_value());
504 check_circuit_and_gate_count(
builder, 0);
510 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
512 cycle_group_ct result = infinity.dbl();
514 EXPECT_TRUE(result.is_point_at_infinity().get_value());
515 EXPECT_TRUE(result.is_constant());
516 EXPECT_EQ(result.x.get_value(), 0);
517 EXPECT_EQ(result.y.get_value(), 0);
519 check_circuit_and_gate_count(
builder, 0);
525 cycle_group_ct infinity = cycle_group_ct::constant_infinity(
nullptr);
528 hint.self_set_infinity();
530 cycle_group_ct result = infinity.dbl(hint);
532 EXPECT_TRUE(result.is_point_at_infinity().get_value());
533 EXPECT_TRUE(result.is_constant());
534 EXPECT_EQ(result.x.get_value(), 0);
535 EXPECT_EQ(result.y.get_value(), 0);
537 check_circuit_and_gate_count(
builder, 0);
574 auto lhs = TestFixture::generators[0];
575 auto rhs = TestFixture::generators[1];
576 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
577 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
579 cycle_group_ct result =
a.unconditional_add(
b);
582 AffineElement expected(expected_element);
583 EXPECT_EQ(result.get_value(), expected);
584 EXPECT_FALSE(result.is_point_at_infinity().get_value());
586 check_circuit_and_gate_count(
builder, 14);
592 auto lhs = TestFixture::generators[2];
593 auto rhs = TestFixture::generators[3];
594 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
595 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
598 AffineElement hint(sum_element);
600 cycle_group_ct result =
a.unconditional_add(
b, hint);
602 EXPECT_EQ(result.get_value(), hint);
603 EXPECT_FALSE(result.is_point_at_infinity().get_value());
605 check_circuit_and_gate_count(
builder, 14);
611 auto lhs = TestFixture::generators[0];
612 auto rhs = TestFixture::generators[1];
613 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
614 cycle_group_ct
b(rhs);
616 cycle_group_ct result =
a.unconditional_add(
b);
619 AffineElement expected(expected_element);
620 EXPECT_EQ(result.get_value(), expected);
621 EXPECT_FALSE(result.is_constant());
622 EXPECT_FALSE(result.is_point_at_infinity().get_value());
624 check_circuit_and_gate_count(
builder, 10);
635 auto lhs = TestFixture::generators[0];
636 auto rhs = TestFixture::generators[1];
637 cycle_group_ct
a(lhs);
638 cycle_group_ct
b(rhs);
640 cycle_group_ct result =
a.unconditional_add(
b);
643 AffineElement expected(expected_element);
644 EXPECT_EQ(result.get_value(), expected);
645 EXPECT_TRUE(result.is_constant());
646 EXPECT_FALSE(result.is_point_at_infinity().get_value());
648 check_circuit_and_gate_count(
builder, 0);
654 auto lhs = TestFixture::generators[2];
655 auto rhs = TestFixture::generators[3];
656 cycle_group_ct
a(lhs);
657 cycle_group_ct
b(rhs);
660 AffineElement hint(sum_element);
662 cycle_group_ct result =
a.unconditional_add(
b, hint);
664 EXPECT_EQ(result.get_value(), hint);
665 EXPECT_TRUE(result.is_constant());
666 EXPECT_FALSE(result.is_point_at_infinity().get_value());
668 check_circuit_and_gate_count(
builder, 0);
679 auto lhs = TestFixture::generators[0];
680 auto rhs = TestFixture::generators[1];
681 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
682 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
684 cycle_group_ct result =
a.unconditional_subtract(
b);
687 AffineElement expected(expected_element);
688 EXPECT_EQ(result.get_value(), expected);
689 EXPECT_FALSE(result.is_point_at_infinity().get_value());
691 check_circuit_and_gate_count(
builder, 14);
697 auto lhs = TestFixture::generators[2];
698 auto rhs = TestFixture::generators[3];
699 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
700 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
703 AffineElement hint(diff_element);
705 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
707 EXPECT_EQ(result.get_value(), hint);
708 EXPECT_FALSE(result.is_point_at_infinity().get_value());
711 check_circuit_and_gate_count(
builder, 14);
717 auto lhs = TestFixture::generators[0];
718 auto rhs = TestFixture::generators[1];
719 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
720 cycle_group_ct
b(rhs);
722 cycle_group_ct result =
a.unconditional_subtract(
b);
725 AffineElement expected(expected_element);
726 EXPECT_EQ(result.get_value(), expected);
727 EXPECT_FALSE(result.is_constant());
728 EXPECT_FALSE(result.is_point_at_infinity().get_value());
730 check_circuit_and_gate_count(
builder, 10);
741 auto lhs = TestFixture::generators[0];
742 auto rhs = TestFixture::generators[1];
743 cycle_group_ct
a(lhs);
744 cycle_group_ct
b(rhs);
746 cycle_group_ct result =
a.unconditional_subtract(
b);
749 AffineElement expected(expected_element);
750 EXPECT_EQ(result.get_value(), expected);
751 EXPECT_TRUE(result.is_constant());
752 EXPECT_FALSE(result.is_point_at_infinity().get_value());
754 check_circuit_and_gate_count(
builder, 0);
760 auto lhs = TestFixture::generators[2];
761 auto rhs = TestFixture::generators[3];
762 cycle_group_ct
a(lhs);
763 cycle_group_ct
b(rhs);
766 AffineElement hint(diff_element);
768 cycle_group_ct result =
a.unconditional_subtract(
b, hint);
770 EXPECT_EQ(result.get_value(), hint);
771 EXPECT_TRUE(result.is_constant());
772 EXPECT_FALSE(result.is_point_at_infinity().get_value());
774 check_circuit_and_gate_count(
builder, 0);
784 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
785 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
786 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
788 a.set_origin_tag(submitted_value_origin_tag);
789 b.set_origin_tag(challenge_origin_tag);
790 cycle_group_ct c =
a.unconditional_add(
b);
792 AffineElement result = c.get_value();
793 EXPECT_EQ(result, expected);
795 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
798 add(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
799 add(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
800 add(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
801 add(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
803 check_circuit_and_gate_count(
builder, 34);
1045 auto lhs = TestFixture::generators[10];
1047 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1048 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1050 cycle_group_ct result =
a +
b;
1052 EXPECT_EQ(result.get_value(), lhs);
1053 EXPECT_FALSE(result.is_constant());
1056 check_circuit_and_gate_count(
builder, 6);
1062 auto lhs = TestFixture::generators[11];
1063 auto rhs = TestFixture::generators[12];
1065 cycle_group_ct
a(lhs);
1066 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1068 cycle_group_ct result =
a +
b;
1071 EXPECT_EQ(result.get_value(), expected);
1072 EXPECT_FALSE(result.is_constant());
1075 check_circuit_and_gate_count(
builder, 23);
1087 auto point = TestFixture::generators[0];
1088 auto neg_point = -point;
1090 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1091 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, neg_point);
1093 cycle_group_ct result =
a +
b;
1096 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1097 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1102 cycle_group_ct inf1 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1103 cycle_group_ct inf2 = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1105 cycle_group_ct result = inf1 + inf2;
1108 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1109 EXPECT_TRUE(result.get_value().is_point_at_infinity());
1114 auto point = TestFixture::generators[1];
1116 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1117 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1119 cycle_group_ct result =
a +
b;
1122 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1123 EXPECT_EQ(result.get_value(), point);
1128 auto point = TestFixture::generators[2];
1130 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, Group::affine_point_at_infinity);
1131 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1133 cycle_group_ct result =
a +
b;
1136 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1137 EXPECT_EQ(result.get_value(), point);
1142 auto point = TestFixture::generators[3];
1144 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, point);
1145 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, point);
1147 cycle_group_ct result =
a +
b;
1150 EXPECT_FALSE(result.is_point_at_infinity().get_value());
1152 AffineElement expected(
Element(point).dbl());
1153 EXPECT_EQ(result.get_value(), expected);
1156 check_circuit_and_gate_count(
builder, 235);
1165 [&](
const AffineElement& lhs,
const AffineElement& rhs,
const bool lhs_constant,
const bool rhs_constant) {
1166 cycle_group_ct
a = lhs_constant ? cycle_group_ct(lhs) : cycle_group_ct::from_witness(&
builder, lhs);
1167 cycle_group_ct
b = rhs_constant ? cycle_group_ct(rhs) : cycle_group_ct::from_witness(&
builder, rhs);
1169 a.set_origin_tag(submitted_value_origin_tag);
1170 b.set_origin_tag(challenge_origin_tag);
1172 cycle_group_ct c =
a.unconditional_subtract(
b);
1174 AffineElement result = c.get_value();
1175 EXPECT_EQ(result, expected);
1177 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1180 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
false);
1181 subtract(TestFixture::generators[0], TestFixture::generators[1],
false,
true);
1182 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
false);
1183 subtract(TestFixture::generators[0], TestFixture::generators[1],
true,
true);
1185 check_circuit_and_gate_count(
builder, 34);
1232 auto lhs = TestFixture::generators[0];
1233 auto rhs = -TestFixture::generators[1];
1234 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1236 cycle_group_ct point_at_infinity = cycle_group_ct::from_witness(&
builder, affine_infinity);
1240 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1241 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1243 a.set_origin_tag(submitted_value_origin_tag);
1244 b.set_origin_tag(challenge_origin_tag);
1246 cycle_group_ct c =
a -
b;
1248 AffineElement result = c.get_value();
1249 EXPECT_EQ(result, expected);
1251 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1256 cycle_group_ct
a = point_at_infinity;
1257 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, rhs);
1258 a.set_origin_tag(submitted_value_origin_tag);
1259 b.set_origin_tag(challenge_origin_tag);
1261 cycle_group_ct c =
a -
b;
1262 AffineElement result = c.get_value();
1263 EXPECT_EQ(result, -rhs);
1264 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1269 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1270 cycle_group_ct
b = point_at_infinity;
1271 a.set_origin_tag(submitted_value_origin_tag);
1272 b.set_origin_tag(challenge_origin_tag);
1274 cycle_group_ct c =
a -
b;
1275 AffineElement result = c.get_value();
1276 EXPECT_EQ(result, lhs);
1277 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1282 cycle_group_ct
a = point_at_infinity;
1283 cycle_group_ct
b = point_at_infinity;
1284 a.set_origin_tag(submitted_value_origin_tag);
1285 b.set_origin_tag(challenge_origin_tag);
1287 cycle_group_ct c =
a -
b;
1288 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1289 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1290 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1295 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1296 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, -lhs);
1297 a.set_origin_tag(submitted_value_origin_tag);
1298 b.set_origin_tag(challenge_origin_tag);
1300 cycle_group_ct c =
a -
b;
1301 AffineElement expected((
Element(lhs)).dbl());
1302 AffineElement result = c.get_value();
1303 EXPECT_EQ(result, expected);
1304 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1309 cycle_group_ct
a = cycle_group_ct::from_witness(&
builder, lhs);
1310 cycle_group_ct
b = cycle_group_ct::from_witness(&
builder, lhs);
1311 a.set_origin_tag(submitted_value_origin_tag);
1312 b.set_origin_tag(challenge_origin_tag);
1314 cycle_group_ct c =
a -
b;
1315 EXPECT_TRUE(c.is_point_at_infinity().get_value());
1316 EXPECT_TRUE(c.get_value().is_point_at_infinity());
1317 EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag);
1320 check_circuit_and_gate_count(
builder, 267);
1331 auto lhs = TestFixture::generators[5];
1332 auto rhs = TestFixture::generators[6];
1334 cycle_group_ct
a(lhs);
1335 cycle_group_ct
b(rhs);
1337 cycle_group_ct result =
a -
b;
1340 EXPECT_EQ(result.get_value(), expected);
1341 EXPECT_TRUE(result.is_constant());
1344 check_circuit_and_gate_count(
builder, 0);
1350 auto lhs = TestFixture::generators[7];
1352 cycle_group_ct
a(lhs);
1353 cycle_group_ct
b = cycle_group_ct::constant_infinity(&
builder);
1355 cycle_group_ct result =
a -
b;
1357 EXPECT_EQ(result.get_value(), lhs);
1358 EXPECT_TRUE(result.is_constant());
1361 check_circuit_and_gate_count(
builder, 0);
1367 auto rhs = TestFixture::generators[7];
1369 cycle_group_ct
a = cycle_group_ct::constant_infinity(&
builder);
1370 cycle_group_ct
b(rhs);
1372 cycle_group_ct result =
a -
b;
1374 EXPECT_EQ(result.get_value(), -rhs);
1375 EXPECT_TRUE(result.is_constant());
1378 check_circuit_and_gate_count(
builder, 0);
1407 const size_t num_muls = 1;
1411 Element expected = Group::point_at_infinity;
1413 for (
size_t i = 0; i < num_muls; ++i) {
1414 auto element = TestFixture::generators[i];
1415 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1418 expected += (element * scalar);
1419 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1420 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1423 expected += (element * scalar);
1424 points.emplace_back(cycle_group_ct(element));
1425 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1428 expected += (element * scalar);
1429 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1430 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1433 expected += (element * scalar);
1434 points.emplace_back(cycle_group_ct(element));
1435 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1441 auto result = cycle_group_ct::batch_mul(points, scalars);
1442 EXPECT_EQ(result.get_value(), AffineElement(expected));
1444 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1448 check_circuit_and_gate_count(
builder, 4393);
1450 check_circuit_and_gate_count(
builder, 4396);
1463 auto element = TestFixture::generators[0];
1464 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1465 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1466 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1468 points.emplace_back(cycle_group_ct::from_witness(&
builder, element));
1469 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, -scalar));
1473 auto result = cycle_group_ct::batch_mul(points, scalars);
1474 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1476 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1480 check_circuit_and_gate_count(
builder, 4019);
1482 check_circuit_and_gate_count(
builder, 4022);
1522 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1523 auto affine_infinity = cycle_group_ct::AffineElement::infinity();
1527 cycle_group_ct point = cycle_group_ct::from_witness(&
builder, affine_infinity);
1528 points.emplace_back(point);
1529 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1533 cycle_group_ct point = cycle_group_ct(affine_infinity);
1534 points.emplace_back(point);
1535 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1539 auto result = cycle_group_ct::batch_mul(points, scalars);
1540 EXPECT_TRUE(result.is_point_at_infinity().get_value());
1541 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1545 check_circuit_and_gate_count(
builder, 3542);
1547 check_circuit_and_gate_count(
builder, 3545);
1556 const size_t num_muls = 1;
1562 Element expected = Group::point_at_infinity;
1563 for (
size_t i = 0; i < num_muls; ++i) {
1565 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1568 expected += (element * scalar);
1569 points.emplace_back(element);
1570 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1571 scalars_native.emplace_back(
uint256_t(scalar));
1575 expected += (element * scalar);
1576 points.emplace_back(element);
1577 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1578 scalars_native.emplace_back(
uint256_t(scalar));
1581 auto result = cycle_group_ct::batch_mul(points, scalars);
1582 EXPECT_EQ(result.get_value(), AffineElement(expected));
1584 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1586 check_circuit_and_gate_count(
builder, 2822);
1594 const size_t num_muls = 1;
1600 Element expected = Group::point_at_infinity;
1601 for (
size_t i = 0; i < num_muls; ++i) {
1603 typename Group::Fr scalar = Group::Fr::random_element(&
engine);
1606 expected += (element * scalar);
1607 points.emplace_back(element);
1608 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1609 scalars_native.emplace_back(scalar);
1613 expected += (element * scalar);
1614 points.emplace_back(element);
1615 scalars.emplace_back(
typename cycle_group_ct::cycle_scalar(scalar));
1616 scalars_native.emplace_back(scalar);
1619 scalar = Group::Fr::random_element(&
engine);
1620 element = Group::one * Group::Fr::random_element(&
engine);
1621 expected += (element * scalar);
1622 points.emplace_back(element);
1623 scalars.emplace_back(cycle_group_ct::cycle_scalar::from_witness(&
builder, scalar));
1624 scalars_native.emplace_back(scalar);
1627 auto result = cycle_group_ct::batch_mul(points, scalars);
1628 EXPECT_EQ(result.get_value(), AffineElement(expected));
1629 EXPECT_EQ(result.get_origin_tag(), expected_tag);
1633 check_circuit_and_gate_count(
builder, 3395);
1635 check_circuit_and_gate_count(
builder, 3398);
1674 const size_t num_muls = 5;
1678 cycle_group_ct point;
1679 typename cycle_group_ct::cycle_scalar scalar;
1680 cycle_group_ct result;
1681 for (
size_t i = 0; i < num_muls; ++i) {
1682 auto element = TestFixture::generators[i];
1683 typename Group::Fr native_scalar = Group::Fr::random_element(&
engine);
1687 point = (cycle_group_ct::from_witness(&
builder, element));
1688 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1689 point.set_origin_tag(submitted_value_origin_tag);
1690 scalar.set_origin_tag(challenge_origin_tag);
1691 result = point * scalar;
1696 point = (cycle_group_ct(element));
1697 scalar = (cycle_group_ct::cycle_scalar::from_witness(&
builder, native_scalar));
1702 point = (cycle_group_ct::from_witness(&
builder, element));
1706 point = (cycle_group_ct(element));
1713 check_circuit_and_gate_count(
builder, 6594);
1715 check_circuit_and_gate_count(
builder, 6597);
1770 const auto run_test = [](
bool construct_witnesses) {
1772 auto scalar1 = FF::random_element(&
engine);
1773 auto scalar2 = FF::random_element(&
engine);
1777 if (construct_witnesses) {
1778 big_scalar1 = FF_ct::from_witness(&
builder, scalar1);
1779 big_scalar2 = FF_ct::from_witness(&
builder, scalar2);
1781 big_scalar1 = FF_ct(scalar1);
1782 big_scalar2 = FF_ct(scalar2);
1784 cycle_group_ct result1 = cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1785 { big_scalar1, big_scalar2 });
1787 cycle_group_ct result2 =
1788 cycle_group_ct::batch_mul({ TestFixture::generators[0], TestFixture::generators[1] },
1789 { cycle_scalar_ct(big_scalar1), cycle_scalar_ct(big_scalar2) });
1791 AffineElement result1_native = result1.get_value();
1792 AffineElement result2_native = result2.get_value();
1793 EXPECT_EQ(result1_native.x, result2_native.x);
1794 EXPECT_EQ(result1_native.y, result2_native.y);
1795 if (construct_witnesses) {
1796 EXPECT_FALSE(result1.is_constant());
1797 EXPECT_FALSE(result2.is_constant());
1800 check_circuit_and_gate_count(
builder, 5285);
1802 check_circuit_and_gate_count(
builder, 5288);
1824 points.push_back(cycle_group_ct::from_witness(&
builder, TestFixture::generators[0]));
1825 points.push_back(cycle_group_ct::from_witness(&
builder, TestFixture::generators[1]));
1831 auto scalar1_value = FF::random_element(&
engine);
1832 auto scalar1 = FF_ct::from_witness(&
builder, scalar1_value);
1833 scalars.emplace_back(scalar1);
1834 EXPECT_EQ(scalars[0].num_bits(), cycle_scalar_ct::NUM_BITS);
1838 scalars.push_back(cycle_scalar_ct::from_u256_witness(&
builder, scalar2_value));
1839 EXPECT_EQ(scalars[1].num_bits(), 256);
1842 EXPECT_NE(scalars[0].num_bits(), scalars[1].num_bits());
1843 EXPECT_THROW_OR_ABORT(cycle_group_ct::batch_mul(points, scalars),
"Assertion failed: (s.num_bits() == num_bits)");