5#include <gtest/gtest.h>
22 EXPECT_EQ(actual, expected);
27 constexpr fq a{ 0x01, 0x02, 0x03, 0x04 };
28 constexpr fq b{ 0x01, 0x02, 0x03, 0x04 };
29 constexpr fq c{ 0x01, 0x02, 0x03, 0x05 };
30 constexpr fq d{ 0x01, 0x02, 0x04, 0x04 };
31 constexpr fq e{ 0x01, 0x03, 0x03, 0x04 };
32 constexpr fq f{ 0x02, 0x02, 0x03, 0x04 };
33 static_assert(
a ==
b);
34 static_assert(!(
a == c));
35 static_assert(!(
a == d));
36 static_assert(!(
a == e));
37 static_assert(!(
a == f));
53 EXPECT_EQ(a_var == a_var,
true);
54 EXPECT_EQ(a_var == b_var,
true);
55 EXPECT_EQ(a_var == c_var,
false);
56 EXPECT_EQ(a_var == d_var,
false);
57 EXPECT_EQ(a_var == e_var,
false);
58 EXPECT_EQ(a_var == f_var,
false);
73 EXPECT_EQ(
a.is_zero(),
true);
74 EXPECT_EQ(
b.is_zero(),
false);
85 EXPECT_EQ(
a ==
b,
false);
86 EXPECT_EQ(
a.is_zero(),
false);
87 EXPECT_EQ(
a.is_zero(),
false);
93 constexpr fq a =
uint256_t{ 0xa9b879029c49e60eUL, 0x2517b72250caa7b3UL, 0x6b86c81105dae2d1UL, 0x3a81735d5aec0c3UL };
95 uint256_t{ 0xa9b879029c49e60eUL, 0x2517b72250caa7b3UL, 0x6b86c81105dae2d1UL, 0x3a81735d5aec0c3UL };
96 constexpr fq b =
uint256_t{ 0x744fc10aec23e56aUL, 0x5dea4788a3b936a6UL, 0xa0a89f4a8af01df1UL, 0x72ae28836807df3UL };
98 uint256_t{ 0x744fc10aec23e56aUL, 0x5dea4788a3b936a6UL, 0xa0a89f4a8af01df1UL, 0x72ae28836807df3UL };
100 constexpr fq const_expected =
101 uint256_t{ 0x6c0a789c0028fd09UL, 0xca9520d84c684efaUL, 0xcbf3f7b023a852b4UL, 0x1b2e4dac41400621UL };
102 constexpr fq const_result =
a *
b;
103 static_assert(const_result == const_expected);
104 static_assert(
a == a_copy);
105 static_assert(
b == b_copy);
111 EXPECT_EQ(c * d, const_expected);
117 constexpr fq a{ 0xa, 0, 0, 0 };
118 constexpr fq b{ 0xb, 0, 0, 0 };
122 fq const_expected = prod_expected;
123 constexpr fq const_result =
a *
b;
124 ASSERT_EQ(const_result, const_expected);
130 EXPECT_EQ(c * d, const_expected);
143 mul_result = t1 * t2;
146 sqr_result = t1 - t2;
147 EXPECT_EQ(mul_result, sqr_result);
152 constexpr fq a =
uint256_t{ 0xa9b879029c49e60eUL, 0x2517b72250caa7b3UL, 0x6b86c81105dae2d1UL, 0x3a81735d5aec0c3UL };
154 constexpr fq expected =
155 uint256_t{ 0x41081a42fdaa7e23UL, 0x44d1140f756ed419UL, 0x53716b0a6f253e63UL, 0xb1a0b04044d75fUL };
156 constexpr fq result =
a.
sqr();
157 static_assert(result == expected);
163 EXPECT_EQ(result, c);
168 constexpr fq a{ 0x7d2e20e82f73d3e8, 0x8e50616a7a9d419d, 0xcdc833531508914b, 0xd510253a2ce62c };
169 constexpr fq b{ 0x2829438b071fd14e, 0xb03ef3f9ff9274e, 0x605b671f6dc7b209, 0x8701f9d971fbc9 };
170 constexpr fq const_expected{ 0xa55764733693a536, 0x995450aa1a9668eb, 0x2e239a7282d04354, 0x15c121f139ee1f6 };
171 constexpr fq const_result =
a +
b;
172 static_assert(const_result == const_expected);
178 EXPECT_EQ(c + d, const_expected);
183 constexpr fq a{ 0xd68d01812313fb7c, 0x2965d7ae7c6070a5, 0x08ef9af6d6ba9a48, 0x0cb8fe2108914f53 };
184 constexpr fq b{ 0x2cd2a2a37e9bf14a, 0xebc86ef589c530f6, 0x75124885b362b8fe, 0x1394324205c7a41d };
185 constexpr fq const_expected{ 0xe5daeaf47cf50779, 0xd51ed34a5b0d0a3c, 0x4c2d9827a4d939a6, 0x29891a51e3fb4b5f };
186 constexpr fq const_result =
a -
b;
187 static_assert(const_result == const_expected);
193 EXPECT_EQ(c - d, const_expected);
212 EXPECT_EQ(result, expected);
219 constexpr fq expected{ 0x01, 0x00, 0x00, 0x00 };
220 EXPECT_EQ(result, expected);
241 result_a = aRR * bRR;
242 result_b = aR * bRRR;
245 EXPECT_EQ((result_a == result_b),
true);
251 EXPECT_EQ((result_a == result_c),
true);
252 EXPECT_EQ((result_a == result_d),
true);
257 fq multiplicand = { 0x09, 0, 0, 0 };
268 expected =
a * multiplicand;
270 EXPECT_EQ((result == expected),
true);
275 fq multiplicand = { 0x05, 0, 0, 0 };
288 expected =
a * multiplicand;
290 EXPECT_EQ((result == expected),
true);
299 beta_x = beta_x * beta;
308 beta_x_cubed = beta_x * beta_x;
309 beta_x_cubed *= beta_x;
311 EXPECT_EQ((x_cubed == beta_x_cubed),
true);
318 fq result = input * inverse;
328 EXPECT_EQ((result ==
fq::one()),
true);
334 auto [is_sqr, root] = input.
sqrt();
335 fq result = root.
sqr();
336 EXPECT_EQ(result, input);
341 for (
size_t i = 0; i < 1; ++i) {
343 auto [is_sqr, root] = input.
sqrt();
344 fq root_test = root.
sqr();
345 EXPECT_EQ(root_test, input);
353 EXPECT_EQ((result ==
fq::zero()),
true);
361 EXPECT_EQ((result == expected),
true);
371 EXPECT_EQ((result ==
fq::zero()),
true);
389 result = k1 - result;
392 EXPECT_EQ(result, k);
395TEST(
fq, SplitIntoEndomorphismScalarsSimple)
398 fq input = { 1, 0, 0, 0 };
399 fq k = { 0, 0, 0, 0 };
400 fq k1 = { 0, 0, 0, 0 };
401 fq k2 = { 0, 0, 0, 0 };
406 fq result{ 0, 0, 0, 0 };
412 result = k1 - result;
415 for (
size_t i = 0; i < 4; ++i) {
416 EXPECT_EQ(result.data[i], k.
data[i]);
422 std::array<uint8_t, 32>
buffer;
423 fq a = { 0x1234567876543210, 0x2345678987654321, 0x3456789a98765432, 0x006789abcba98765 };
428 EXPECT_EQ(
buffer[31], 0x10);
429 EXPECT_EQ(
buffer[30], 0x32);
430 EXPECT_EQ(
buffer[29], 0x54);
431 EXPECT_EQ(
buffer[28], 0x76);
432 EXPECT_EQ(
buffer[27], 0x78);
433 EXPECT_EQ(
buffer[26], 0x56);
434 EXPECT_EQ(
buffer[25], 0x34);
435 EXPECT_EQ(
buffer[24], 0x12);
437 EXPECT_EQ(
buffer[23], 0x21);
438 EXPECT_EQ(
buffer[22], 0x43);
439 EXPECT_EQ(
buffer[21], 0x65);
440 EXPECT_EQ(
buffer[20], 0x87);
441 EXPECT_EQ(
buffer[19], 0x89);
442 EXPECT_EQ(
buffer[18], 0x67);
443 EXPECT_EQ(
buffer[17], 0x45);
444 EXPECT_EQ(
buffer[16], 0x23);
446 EXPECT_EQ(
buffer[15], 0x32);
447 EXPECT_EQ(
buffer[14], 0x54);
448 EXPECT_EQ(
buffer[13], 0x76);
449 EXPECT_EQ(
buffer[12], 0x98);
450 EXPECT_EQ(
buffer[11], 0x9a);
451 EXPECT_EQ(
buffer[10], 0x78);
452 EXPECT_EQ(
buffer[9], 0x56);
453 EXPECT_EQ(
buffer[8], 0x34);
455 EXPECT_EQ(
buffer[7], 0x65);
456 EXPECT_EQ(
buffer[6], 0x87);
457 EXPECT_EQ(
buffer[5], 0xa9);
458 EXPECT_EQ(
buffer[4], 0xcb);
459 EXPECT_EQ(
buffer[3], 0xab);
460 EXPECT_EQ(
buffer[2], 0x89);
461 EXPECT_EQ(
buffer[1], 0x67);
462 EXPECT_EQ(
buffer[0], 0x00);
467 std::array<uint8_t, 32>
buffer;
468 fq expected = { 0x1234567876543210, 0x2345678987654321, 0x3456789a98765432, 0x006789abcba98765 };
474 EXPECT_EQ((result == expected),
true);
491 uint64_t expected = (q_inv).
data[0];
493 EXPECT_EQ(result, expected);
508 uint256_t(0xbdf876654b0ade1b, 0x2c3a66c64569f338, 0x2cd8bf2ec1fe55a3, 0x11c0ea9ee5693ede),
509 uint256_t(0x551b14ec34f2151c, 0x62e472ed83a2891e, 0xf208d5e5c9b5b3fb, 0x14315aeaf6027d8c),
510 uint256_t(0xad39959ae8013750, 0x7f1d2c709ab84cbb, 0x408028b80a60c2f1, 0x1dcd116fc26f856e),
511 uint256_t(0x95e967d30dcce9ce, 0x56139274241d2ea1, 0x85b19c1c616ec456, 0x1f1780cf9bf045b4),
512 uint256_t(0xbe841c861d8eb80e, 0xc5980d67a21386c0, 0x5fd1f1afecddeeb5, 0x24dbb8c1baea0250),
513 uint256_t(0x3ae4b3a27f05d6e3, 0xc5f6785b12df8d29, 0xc3a6c5f095103046, 0xd6b94cb2cc1fd4b),
514 uint256_t(0xc003c71932a6ced5, 0x6302a413f68e26e9, 0x2ed4a9b64d69fad, 0xfe61ffab1ae227d)
516 for (
auto&
value : values) {
518 EXPECT_EQ(element.sqr(), element * element);
526 EXPECT_EQ((
a == a_neg),
true);
530 EXPECT_EQ((
a == a_neg),
true);
539 auto random_lo =
fq(random_uint512.
lo);
540 auto random_hi =
fq(random_uint512.
hi);
543 EXPECT_EQ(random_lo + pow_2_256 * random_hi,
fq((random_uint512 % q).lo));
static constexpr uint64_t modulus_0
static constexpr uint64_t modulus_3
static constexpr uint64_t modulus_1
static constexpr uint64_t modulus_2
static constexpr uint64_t r_inv
uint512_t get_random_uint512()
const std::vector< FF > data
uint8_t buffer[RANDOM_BUFFER_SIZE]
void shallow_copy(const fq &in, fq &out)
uintx< uint256_t > uint512_t
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Entry point for Barretenberg command-line interface.
field< Bn254FqParams > fq
TEST(MegaCircuitBuilder, CopyConstructor)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
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
BB_INLINE constexpr field pow(const uint256_t &exponent) const noexcept
static void split_into_endomorphism_scalars(const field &k, field &k1, field &k2)
constexpr field invert() const noexcept
BB_INLINE constexpr void self_neg() &noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const noexcept
static field serialize_from_buffer(const uint8_t *buffer)
static void serialize_to_buffer(const field &value, uint8_t *buffer)
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
BB_INLINE constexpr void self_to_montgomery_form() &noexcept
BB_INLINE constexpr field from_montgomery_form() const noexcept
BB_INLINE constexpr field reduce_once() const noexcept
static constexpr field zero()
std::pair< T, T > msgpack_roundtrip(const T &object)