6#include <gtest/gtest.h>
31 static inline std::vector<ScalarField>
scalars{};
47 std::vector<AffineElement> points(num_pts, base_point);
48 std::vector<ScalarField> test_scalars(num_pts);
51 for (
size_t i = 0; i < num_pts; ++i) {
53 scalar_sum += test_scalars[i];
58 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
61 EXPECT_EQ(
AffineElement(result), expected) <<
"Failed for size " << num_pts;
74 const size_t num_pts = num_pairs * 2;
76 std::vector<AffineElement> points(num_pts);
77 std::vector<ScalarField> test_scalars(num_pts);
80 for (
size_t i = 0; i < num_pairs; ++i) {
83 test_scalars[2 * i] = ScalarField::one();
84 test_scalars[2 * i + 1] = ScalarField::one();
89 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
91 EXPECT_EQ(
AffineElement(result), Group::affine_point_at_infinity) <<
"Failed for " << num_pairs <<
" pairs";
105 for (
size_t scale : {
size_t{ 1 },
size_t{ 5 } }) {
106 const size_t num_dup = 4 * scale;
107 const size_t num_cancel_pairs = 2 * scale;
108 const size_t num_unique = 4 * scale;
109 const size_t num_pts = num_dup + num_cancel_pairs * 2 + num_unique;
111 std::vector<AffineElement> points(num_pts);
112 std::vector<ScalarField> test_scalars(num_pts);
116 for (
size_t i = 0; i < num_dup; ++i) {
118 test_scalars[idx] =
scalars[i];
122 for (
size_t i = 0; i < num_cancel_pairs; ++i) {
125 test_scalars[idx] = ScalarField::one();
126 test_scalars[idx + 1] = ScalarField::one();
130 for (
size_t i = 0; i < num_unique; ++i) {
132 test_scalars[idx] =
scalars[100 + i];
138 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
142 expected.self_set_infinity();
145 for (
size_t i = 0; i < num_dup; ++i) {
150 for (
size_t i = 0; i < num_unique; ++i) {
161 for (
size_t num_pts : {
size_t{ 10 },
size_t{ 50 } }) {
164 std::vector<AffineElement> points(num_pts, base_point);
165 std::vector<ScalarField> test_scalars(num_pts);
168 for (
size_t i = 0; i < num_pts; ++i) {
169 test_scalars[i] = ScalarField::random_element(&
engine);
170 scalar_sum += test_scalars[i];
175 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
178 EXPECT_EQ(
AffineElement(result), expected) <<
"Failed for size " << num_pts;
184 std::vector<AffineElement> points;
185 std::vector<ScalarField> test_scalars;
189 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
191 EXPECT_EQ(
AffineElement(result), Group::affine_point_at_infinity);
197 for (
size_t num_pts : {
size_t{ 10 },
size_t{ 50 } }) {
198 std::vector<AffineElement> points(num_pts);
199 std::vector<ScalarField> test_scalars(num_pts);
203 expected.self_set_infinity();
205 for (
size_t i = 0; i < num_pts; ++i) {
208 test_scalars[i] = ScalarField::zero();
218 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
227 for (
size_t num_pts : {
size_t{ 10 },
size_t{ 50 } }) {
228 std::vector<AffineElement> points(num_pts);
229 std::vector<ScalarField> test_scalars(num_pts, ScalarField::zero());
231 for (
size_t i = 0; i < num_pts; ++i) {
237 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
239 EXPECT_EQ(
AffineElement(result), Group::affine_point_at_infinity) <<
"Failed for size " << num_pts;
246 for (
size_t num_pts : {
size_t{ 12 },
size_t{ 51 } }) {
247 std::vector<AffineElement> points(num_pts);
248 std::vector<ScalarField> test_scalars(num_pts);
251 expected.self_set_infinity();
253 for (
size_t i = 0; i < num_pts; ++i) {
256 points[i] = Group::affine_point_at_infinity;
267 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
276 for (
size_t num_pts : {
size_t{ 10 },
size_t{ 50 } }) {
277 std::vector<AffineElement> points(num_pts, Group::affine_point_at_infinity);
278 std::vector<ScalarField> test_scalars(num_pts);
280 for (
size_t i = 0; i < num_pts; ++i) {
286 auto result = scalar_multiplication::pippenger<Curve>(scalar_span, points,
true);
288 EXPECT_EQ(
AffineElement(result), Group::affine_point_at_infinity) <<
"Failed for size " << num_pts;
293using CurveTypes = ::testing::Types<bb::curve::BN254, bb::curve::Grumpkin>;
298 TestFixture::test_duplicate_points();
302 TestFixture::test_point_and_negation();
306 TestFixture::test_mixed_duplicates_and_unique();
310 TestFixture::test_all_same_point_different_scalars();
314 TestFixture::test_empty_input();
318 TestFixture::test_zero_scalars();
322 TestFixture::test_all_zero_scalars();
326 TestFixture::test_points_at_infinity_in_input();
330 TestFixture::test_all_points_at_infinity();
Tests for pippenger safe mode (handle_edge_cases=true) which is used in native batch_mul....
void test_duplicate_points_helper(size_t num_pts)
void test_all_same_point_different_scalars()
static void SetUpTestSuite()
void test_point_and_negation()
void test_duplicate_points()
typename Curve::Group Group
void test_all_zero_scalars()
void test_point_and_negation_helper(size_t num_pairs)
void test_mixed_duplicates_and_unique()
typename Curve::Element Element
void test_points_at_infinity_in_input()
static std::vector< ScalarField > scalars
typename Curve::ScalarField ScalarField
typename Curve::AffineElement AffineElement
void test_all_points_at_infinity()
static constexpr size_t num_points
static std::vector< AffineElement > generators
typename Group::element Element
typename grumpkin::g1 Group
typename Group::affine_element AffineElement
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
::testing::Types< curve::BN254, curve::Grumpkin > CurveTypes
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)