4#include "../biggroup/biggroup.hpp"
23 using fq =
typename Curve::BaseFieldNative;
24 using fr =
typename Curve::ScalarFieldNative;
25 using g1 =
typename Curve::GroupNative;
32 info(
"builder gates = ",
builder.get_num_finalized_gates_inefficient());
44 const size_t num_points = 5;
45 const size_t edge_case_points = 3;
49 std::vector<fr> scalars;
50 for (
size_t i = 0; i < num_points; ++i) {
58 points.push_back(element::random_element());
63 for (
size_t i = 0; i < num_points + edge_case_points; ++i) {
64 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
65 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
68 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
72 for (
size_t i = 0; i < num_points + edge_case_points; ++i) {
73 expected_point += (
element(points[i]) * scalars[i]);
76 expected_point = expected_point.normalize();
77 fq result_x(result_point.x().get_value().lo);
78 fq result_y(result_point.y().get_value().lo);
80 EXPECT_EQ(result_x, expected_point.x);
81 EXPECT_EQ(result_y, expected_point.y);
88 const size_t num_points = 5;
92 std::vector<fr> scalars;
93 for (
size_t i = 0; i < num_points; ++i) {
97 for (
size_t i = 0; i < num_points; ++i) {
98 points.push_back(points[i]);
99 scalars.push_back(-scalars[i]);
103 for (
size_t i = 0; i < num_points * 2; ++i) {
104 circuit_points.push_back(element_ct::from_witness(&
builder, points[i]));
105 circuit_scalars.push_back(scalar_ct::from_witness(&
builder, scalars[i]));
108 element_ct result_point = element_ct::batch_mul(circuit_points, circuit_scalars);
123 for (
size_t i = 0; i < 100; ++i) {
135 EXPECT_EQ(out_ct.get_value(), expected);
138 EXPECT_TRUE(zero_ct.get_value().is_point_at_infinity());
141 EXPECT_TRUE(zero_ct2.get_value().is_point_at_infinity());
144 EXPECT_EQ(out2_ct.get_value(), -rhs);
147 EXPECT_EQ(out3_ct.get_value(), lhs);
149 auto lhs_infinity_ct = element_ct::constant_infinity(&
builder);
150 auto rhs_infinity_ct = element_ct::constant_infinity(&
builder);
151 element_ct out4_ct = lhs_infinity_ct - rhs_infinity_ct;
152 EXPECT_TRUE(out4_ct.get_value().is_point_at_infinity());
172 {{ 0x01624731e1195570, 0x3ba491482db4da14, 0x59e26bcea0d48bac, 0x0 }},
173 {{ 0x02c48e63c232aadf, 0x774922905b69b428, 0xb3c4d79d41a91758, 0x0 }},
174 {{ 0x0426d595a34c004e, 0xb2edb3d8891e8e3c, 0x0da7436be27da304, 0x1 }},
178 for (
const auto& limbs : boundary_cases) {
179 fr base_scalar(
uint256_t{ limbs[0], limbs[1], limbs[2], limbs[3] });
190 for (
const auto& scalar : scalars) {
194 element_ct result = element_ct::batch_mul({ pt }, { sc });
200 for (
const auto& scalar : scalars) {
224 EXPECT_EQ(result_ct.get_value(), expected);
233using TestTypes = testing::Types<stdlib::bn254<bb::MegaCircuitBuilder>>;
239 TestFixture::test_goblin_style_batch_mul();
244 TestFixture::test_goblin_style_batch_mul_to_zero();
249 TestFixture::test_goblin_style_sub();
254 TestFixture::test_goblin_style_neg();
259 TestFixture::test_endomorphism_negative_k2_regression();
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
typename Group::element Element
BB_INLINE constexpr void self_set_infinity() noexcept
group_elements::affine_element< Fq, Fr, Params > affine_element
static constexpr element one
group_elements::element< Fq, Fr, Params > element
static constexpr affine_element affine_point_at_infinity
static void test_goblin_style_neg()
Check goblin-style negate works as intended, including with points at infinity.
static constexpr auto EXPECT_CIRCUIT_CORRECTNESS
static void test_goblin_style_sub()
Test goblin-style sub.
typename Curve::ScalarField scalar_ct
typename Curve::ScalarFieldNative fr
typename Curve::Element element_ct
static void test_goblin_style_batch_mul()
Test goblin-style batch mul.
typename g1::element element
typename g1::affine_element affine_element
static void test_endomorphism_negative_k2_regression()
Regression test: negative-k2 edge-case scalar through the stdlib biggroup path.
typename Curve::GroupNative g1
typename Curve::Builder Builder
static void test_goblin_style_batch_mul_to_zero()
typename Curve::BaseFieldNative fq
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
testing::Types< VKTestParams< UltraFlavor, stdlib::recursion::honk::DefaultIO< UltraCircuitBuilder > >, VKTestParams< UltraFlavor, stdlib::recursion::honk::RollupIO >, VKTestParams< UltraKeccakFlavor, stdlib::recursion::honk::DefaultIO< UltraCircuitBuilder > >, VKTestParams< MegaFlavor, stdlib::recursion::honk::DefaultIO< MegaCircuitBuilder > > > TestTypes
static field random_element(numeric::RNG *engine=nullptr) noexcept