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_estimated_num_finalized_gates());
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::point_at_infinity(&
builder);
150 auto rhs_infinity_ct = element_ct::point_at_infinity(&
builder);
151 element_ct out4_ct = lhs_infinity_ct - rhs_infinity_ct;
152 EXPECT_TRUE(out4_ct.get_value().is_point_at_infinity());
153 EXPECT_TRUE(out4_ct.is_point_at_infinity().get_value());
171 EXPECT_EQ(result_ct.get_value(), expected);
180using TestTypes = testing::Types<stdlib::bn254<bb::MegaCircuitBuilder>>;
186 TestFixture::test_goblin_style_batch_mul();
191 TestFixture::test_goblin_style_batch_mul_to_zero();
196 TestFixture::test_goblin_style_sub();
201 TestFixture::test_goblin_style_neg();
testing::Types< TestType< stdlib::bn254< bb::UltraCircuitBuilder >, UseBigfield::Yes >, TestType< stdlib::bn254< bb::MegaCircuitBuilder >, UseBigfield::No > > TestTypes
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
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(ShpleminiTest, TestSettings)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept