3#include "barretenberg/numeric/uint256/uint256.hpp"
6namespace numeric::random {
11template <
class base_field,
class Params>
struct alignas(32)
field2 {
13 constexpr field2(
const base_field& a = base_field::zero(),
const base_field& b = base_field::zero())
27 constexpr field2& operator=(
const field2& other)
noexcept
47 constexpr ~field2()
noexcept =
default;
52 static constexpr uint256_t modulus = base_field::modulus;
54 static constexpr field2 zero() {
return field2{ base_field::zero(), base_field::zero() }; }
55 static constexpr field2 one() {
return field2{ base_field::one(), base_field::zero() }; }
56 static constexpr field2 twist_coeff_b() {
return field2{ Params::twist_coeff_b_0, Params::twist_coeff_b_1 }; }
57 static constexpr field2 twist_mul_by_q_x()
59 return field2{ Params::twist_mul_by_q_x_0, Params::twist_mul_by_q_x_1 };
61 static constexpr field2 twist_mul_by_q_y()
63 return field2{ Params::twist_mul_by_q_y_0, Params::twist_mul_by_q_y_1 };
65 static constexpr field2 cube_root_of_unity()
67 return field2{ Params::twist_cube_root_0, Params::twist_cube_root_1 };
70 constexpr field2 operator*(
const field2& other)
const noexcept;
71 constexpr field2 operator+(
const field2& other)
const noexcept;
72 constexpr field2 operator-(
const field2& other)
const noexcept;
73 constexpr field2 operator-()
const noexcept;
74 constexpr field2 operator/(
const field2& other)
const noexcept;
76 constexpr field2 operator*=(
const field2& other)
noexcept;
77 constexpr field2 operator+=(
const field2& other)
noexcept;
78 constexpr field2 operator-=(
const field2& other)
noexcept;
79 constexpr field2 operator/=(
const field2& other)
noexcept;
81 constexpr field2 mul_by_fq(
const base_field& a)
const noexcept
83 field2 r{ a * c0, a * c1 };
87 constexpr bool operator==(
const field2& other)
const noexcept;
88 constexpr bool operator!=(
const field2& other)
const noexcept {
return !(*
this == other); }
89 constexpr field2 sqr()
const noexcept;
90 constexpr void self_sqr()
noexcept;
93 constexpr field2 pow(uint64_t exponent)
const noexcept;
95 constexpr field2 invert()
const noexcept;
97 constexpr void self_neg()
noexcept;
98 constexpr field2 to_montgomery_form()
const noexcept;
99 constexpr field2 from_montgomery_form()
const noexcept;
101 constexpr void self_to_montgomery_form()
noexcept;
102 constexpr void self_from_montgomery_form()
noexcept;
104 constexpr void self_conditional_negate(uint64_t predicate)
noexcept;
106 constexpr field2 reduce_once()
const noexcept;
107 constexpr void self_reduce_once()
noexcept;
109 constexpr void self_set_msb()
noexcept;
110 [[nodiscard]]
constexpr bool is_msb_set()
const noexcept;
111 [[nodiscard]]
constexpr uint64_t is_msb_set_word()
const noexcept;
113 [[nodiscard]]
constexpr bool is_zero()
const noexcept;
115 constexpr field2 frobenius_map()
const noexcept;
116 constexpr void self_frobenius_map()
noexcept;
119 static void serialize_to_buffer(
const field2& value, uint8_t* buffer)
121 base_field::serialize_to_buffer(value.c0, buffer);
122 base_field::serialize_to_buffer(value.c1, buffer +
sizeof(base_field));
125 static field2 serialize_from_buffer(uint8_t* buffer)
127 field2 result{ base_field::zero(), base_field::zero() };
128 result.c0 = base_field::serialize_from_buffer(buffer);
129 result.c1 = base_field::serialize_from_buffer(buffer +
sizeof(base_field));
134 friend std::ostream& operator<<(std::ostream& os,
const field2& a)
136 os << a.c0 <<
" , " << a.c1;
143 using serialize::read;
147template <
typename B,
typename base_field,
typename Params>
void write(B& buf, field2<base_field, Params>
const& value)
149 using serialize::write;
150 write(buf, value.c0);
151 write(buf, value.c1);
Definition: engine.hpp:10
Definition: uint256.hpp:25
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16
Definition: field2_declarations.hpp:11