11template <
typename base_field,
typename Fq6Params>
class field6 {
13 constexpr field6(
const base_field&
a = base_field::zero(),
14 const base_field&
b = base_field::zero(),
15 const base_field& c = base_field::zero())
58 static constexpr
field6 zero() {
return { base_field::zero(), base_field::zero(), base_field::zero() }; };
59 static constexpr field6 one() {
return { base_field::one(), base_field::zero(), base_field::zero() }; };
61 static constexpr base_field
mul_by_non_residue(
const base_field&
a) {
return Fq6Params::mul_by_non_residue(
a); }
95 base_field T0 =
c0 * other.
c0;
96 base_field T1 =
c1 * other.
c1;
97 base_field T2 =
c2 * other.
c2;
99 base_field T3 = (
c0 +
c2) * (other.
c0 + other.
c2);
100 base_field T4 = (
c0 +
c1) * (other.
c0 + other.
c1);
101 base_field T5 = (
c1 +
c2) * (other.
c1 + other.
c2);
116 base_field S0 =
c0.
sqr();
117 base_field S1 =
c0 *
c1;
120 base_field S3 =
c1 *
c2;
122 base_field S4 =
c2.
sqr();
126 S1 + S2 + S3 - S0 - S4,
173 base_field C2 =
c1.sqr() - (
c0 *
c2);
189 Fq6Params::frobenius_coeffs_c1_3 *
c1.frobenius_map(),
190 Fq6Params::frobenius_coeffs_c2_3 *
c2.frobenius_map(),
196 return {
c0, Fq6Params::frobenius_coeffs_c1_2 *
c1, Fq6Params::frobenius_coeffs_c2_2 *
c2 };
203 Fq6Params::frobenius_coeffs_c1_1 *
c1.frobenius_map(),
204 Fq6Params::frobenius_coeffs_c2_1 *
c2.frobenius_map(),
211 base_field::random_element(
engine),
212 base_field::random_element(
engine),
213 base_field::random_element(
engine),
236 [[nodiscard]]
constexpr bool is_zero()
const {
return c0.is_zero() &&
c1.is_zero() &&
c2.is_zero(); }
251 base_field A = a0 *
c0;
252 base_field B = a1 *
c1;
253 base_field
C = Fq6Params::mul_by_non_residue(a1 *
c2);
254 base_field D = A +
C;
255 base_field E = (a0 + a1) * (
c0 +
c1);
256 base_field F = E - (A + B);
257 base_field
G = a0 *
c2;
258 base_field H =
G + B;
constexpr bool operator==(const field6 &other) const
constexpr void self_sqr()
constexpr field6 frobenius_map_one() const
constexpr field6 operator-() const
constexpr field6 mul_by_fq2(const base_field &other) const
constexpr field6 sqr() const
static constexpr base_field mul_by_non_residue(const base_field &a)
constexpr field6 operator-(const field6 &other) const
constexpr field6 frobenius_map_two() const
constexpr field6 & operator=(field6 &&other) noexcept
constexpr field6(const field6 &other)
constexpr field6 to_montgomery_form() const
static constexpr field6 one()
constexpr field6 operator-=(const field6 &other)
constexpr field6 operator*(const field6 &other) const
constexpr bool is_zero() const
constexpr field6 frobenius_map_three() const
constexpr field6 operator+(const field6 &other) const
constexpr field6 operator/(const field6 &other) const
static constexpr field6 random_element(numeric::RNG *engine=nullptr)
constexpr field6 operator/=(const field6 &other)
constexpr field6 operator+=(const field6 &other)
constexpr field6 invert() const
constexpr field6 & operator=(const field6 &other) noexcept
constexpr field6(field6 &&other) noexcept
static constexpr field6 zero()
constexpr ~field6() noexcept=default
constexpr field6 from_montgomery_form() const
constexpr field6(const base_field &a=base_field::zero(), const base_field &b=base_field::zero(), const base_field &c=base_field::zero())
constexpr field6 sparse_mul(const base_field &a0, const base_field &a1) const
Multiply a field6 element by a0 + a1 * v.
constexpr field6 operator*=(const field6 &other)
constexpr void self_neg()
#define G(r, i, a, b, c, d)
Entry point for Barretenberg command-line interface.