3#include <gtest/gtest.h>
10 EXPECT_EQ(actual, expected);
15 fr a{ 0x01, 0x02, 0x03, 0x04 };
16 fr b{ 0x01, 0x02, 0x03, 0x04 };
17 fr c{ 0x01, 0x02, 0x03, 0x05 };
18 fr d{ 0x01, 0x02, 0x04, 0x04 };
19 fr e{ 0x01, 0x03, 0x03, 0x04 };
20 fr f{ 0x02, 0x02, 0x03, 0x04 };
21 EXPECT_EQ((
a ==
b),
true);
22 EXPECT_EQ((
a == c),
false);
23 EXPECT_EQ((
a == d),
false);
24 EXPECT_EQ((
a == e),
false);
25 EXPECT_EQ((
a == f),
false);
40 EXPECT_EQ(
a.is_zero(),
true);
41 EXPECT_EQ(
b.is_zero(),
false);
52 EXPECT_EQ((
a ==
b),
false);
53 EXPECT_EQ(
a.is_zero(),
false);
54 EXPECT_EQ(
b.is_zero(),
false);
59 auto a_uint =
uint256_t{ 0x192f9ddc938ea63, 0x1db93d61007ec4fe, 0xc89284ec31fa49c0, 0x2478d0ff12b04f0f };
60 auto b_uint =
uint256_t{ 0x7aade4892631231c, 0x8e7515681fe70144, 0x98edb76e689b6fd8, 0x5d0886b15fc835fa };
67 EXPECT_EQ((result == expected),
true);
72 auto a_uint =
uint256_t{ 0x192f9ddc938ea63, 0x1db93d61007ec4fe, 0xc89284ec31fa49c0, 0x2478d0ff12b04f0f };
77 EXPECT_EQ((result == expected),
true);
82 fr a{ 0x20565a572c565a66, 0x7bccd0f01f5f7bff, 0x63ec2beaad64711f, 0x624953caaf44a814 };
83 fr b{ 0xa17307a2108adeea, 0x74629976c14c5e2b, 0x9ce6f072ab1740ee, 0x398c753702b2bef0 };
84 fr expected{ 0x7de76c654ce1394f, 0xc7fb821e66f26999, 0x4882d6a6d6fa59b0, 0x6b717a8ed0c5c6db };
92 fr a{ 0xcfbcfcf457cf2d38, 0x7b27af26ce62aa61, 0xf0378e90d48f2b92, 0x4734b22cb21ded };
93 fr b{ 0x569fdb1db5198770, 0x446ddccef8347d52, 0xef215227182d22a, 0x8281b4fb109306 };
94 fr expected{ 0xbcff176a92b5a5c9, 0x5eedbaa04fe79da0, 0x9995bf24e48db1c5, 0x3029017012d32b11 };
97 EXPECT_EQ((result == expected),
true);
102 fr a{ 0x5def, 0x00, 0x00, 0x00 };
105 fr expected = a_copy + 2;
106 EXPECT_EQ((
a == expected),
true);
109 expected = a_copy + 5;
110 EXPECT_EQ((
a == expected),
true);
115 fr a{ 0x5def, 0x00, 0x00, 0x00 };
122 fr a{ 0x5def, 0x00, 0x00, 0x00 };
126 EXPECT_EQ(
a, a_old + 1);
131 fr result{ 0x01, 0x00, 0x00, 0x00 };
133 result.self_to_montgomery_form();
134 EXPECT_EQ((result == expected),
true);
140 fr expected{ 0x01, 0x00, 0x00, 0x00 };
142 EXPECT_EQ((result == expected),
true);
163 result_a = aRR * bRR;
164 result_b = aR * bRRR;
167 EXPECT_EQ((result_a == result_b),
true);
173 EXPECT_EQ((result_a == result_c),
true);
174 EXPECT_EQ((result_a == result_d),
true);
179 fr multiplicand = { 0x09, 0, 0, 0 };
190 expected =
a * multiplicand;
192 EXPECT_EQ((result == expected),
true);
197 fr multiplicand = { 0x05, 0, 0, 0 };
210 expected =
a * multiplicand;
212 EXPECT_EQ((result == expected),
true);
221 lambda_x = lambda_x * lambda;
230 lambda_x_cubed = lambda_x * lambda_x;
231 lambda_x_cubed *= lambda_x;
233 EXPECT_EQ((x_cubed == lambda_x_cubed),
true);
240 fr result = input * inverse;
242 EXPECT_EQ((result ==
fr::one()),
true);
249 EXPECT_EQ((result ==
fr::one()),
true);
255 auto [is_sqr, root] = input.
sqrt();
256 fr result = root.
sqr();
257 EXPECT_EQ(result, input);
263 for (
size_t i = 0; i < n; ++i) {
265 auto [is_sqr, root] = input.
sqrt();
266 fr root_test = root.
sqr();
267 EXPECT_EQ(root_test, input);
275 EXPECT_EQ((result ==
fr::zero()),
true);
283 EXPECT_EQ((result == expected),
true);
293 EXPECT_EQ((result ==
fr::zero()),
true);
299 fr k1 = { 0, 0, 0, 0 };
300 fr k2 = { 0, 0, 0, 0 };
304 fr result{ 0, 0, 0, 0 };
310 result = k2 * lambda;
311 result = k1 - result;
314 EXPECT_EQ(result, k);
317TEST(
fr, SplitIntoEndomorphismScalarsSimple)
320 fr input = { 1, 0, 0, 0 };
321 fr k = { 0, 0, 0, 0 };
322 fr k1 = { 0, 0, 0, 0 };
323 fr k2 = { 0, 0, 0, 0 };
328 fr result{ 0, 0, 0, 0 };
333 result = k2 * lambda;
334 result = k1 - result;
337 for (
size_t i = 0; i < 4; ++i) {
338 EXPECT_EQ(result.data[i], k.
data[i]);
345 std::vector<fr> coeffs(n);
346 std::vector<fr> inverses(n);
348 for (
size_t i = 0; i < n; ++i) {
354 for (
size_t i = 0; i < n; ++i) {
355 coeffs[i] *= inverses[i];
359 for (
size_t i = 0; i < n; ++i) {
360 EXPECT_TRUE(coeffs[i].is_zero());
371 constexpr uint256_t a{ 0x1111, 0x2222, 0x3333, 0x4444 };
376 static_assert(
a == c);
385 auto random_lo =
fr(random_uint512.
lo);
386 auto random_hi =
fr(random_uint512.
hi);
389 EXPECT_EQ(random_lo + pow_2_256 * random_hi,
fr((random_uint512 % r).lo));
uint512_t get_random_uint512()
uintx< uint256_t > uint512_t
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
TEST(MegaCircuitBuilder, CopyConstructor)
field< Bn254FrParams > fr
static constexpr field cube_root_of_unity()
static constexpr field one()
static constexpr uint256_t modulus
BB_INLINE constexpr field to_montgomery_form() const noexcept
static void split_into_endomorphism_scalars(const field &k, field &k1, field &k2)
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const noexcept
constexpr std::pair< bool, field > sqrt() const noexcept
Compute square root of the field element.
static BB_INLINE void __copy(const field &a, field &r) noexcept
BB_INLINE constexpr void self_from_montgomery_form() &noexcept
static constexpr field multiplicative_generator() noexcept
BB_INLINE constexpr bool is_zero() const noexcept
static void batch_invert(std::span< field > coeffs) noexcept
BB_INLINE constexpr void self_to_montgomery_form() &noexcept
BB_INLINE constexpr field reduce_once() const noexcept
static constexpr field zero()
std::pair< T, T > msgpack_roundtrip(const T &object)