2#include "barretenberg/numeric/random/engine.hpp"
5template <
typename quadratic_field,
typename base_field,
typename Fq12Params>
class field12 {
7 constexpr field12(
const base_field& a = base_field::zero(),
const base_field& b = base_field::zero())
39 constexpr ~field12()
noexcept =
default;
50 static constexpr field12 zero() {
return { base_field::zero(), base_field::zero() }; };
51 static constexpr field12 one() {
return { base_field::one(), base_field::zero() }; };
53 static constexpr base_field mul_by_non_residue(
const base_field& a)
56 base_field::mul_by_non_residue(a.c2),
62 constexpr field12 operator+(
const field12& other)
const
70 constexpr field12 operator-(
const field12& other)
const
78 constexpr field12 operator*(
const field12& other)
const
80 base_field T0 = c0 * other.c0;
81 base_field T1 = c1 * other.c1;
82 base_field T2 = c0 + c1;
83 base_field T3 = other.c0 + other.c1;
86 mul_by_non_residue(T1) + T0,
91 constexpr field12 operator/(
const field12& other)
const {
return operator*(other.invert()); }
93 constexpr field12 operator+=(
const field12& other)
100 constexpr field12 operator-=(
const field12& other)
107 constexpr field12 operator*=(
const field12& other)
109 *
this = operator*(other);
113 constexpr field12 operator/=(
const field12& other)
115 *
this = operator/(other);
119 constexpr void self_sparse_mul(
const ell_coeffs& ell)
122 quadratic_field d0 = c0.c0 * ell.o;
123 quadratic_field d2 = c0.c2 * ell.vv;
124 quadratic_field d4 = c1.c1 * ell.vw;
125 quadratic_field t2 = c0.c0 + c1.c1;
126 quadratic_field t1 = c0.c0 + c0.c2;
127 quadratic_field s0 = c0.c1 + c1.c0;
130 quadratic_field s1 = c0.c1 * ell.vv;
131 quadratic_field t3 = s1 + d4;
132 quadratic_field t4 = base_field::mul_by_non_residue(t3);
138 t4 = base_field::mul_by_non_residue(t3);
143 quadratic_field t0 = ell.o + ell.vv;
153 t1 = ell.vv + ell.vw;
157 t4 = base_field::mul_by_non_residue(t3);
164 t4 = base_field::mul_by_non_residue(t3);
177 constexpr field12 sqr()
const
179 base_field T0 = c0 + c1;
180 base_field T1 = mul_by_non_residue(c1) + c0;
186 T0 - (T1 + mul_by_non_residue(T1)),
191 constexpr field12 invert()
const
195 base_field T0 = (c0.sqr() - mul_by_non_residue(c1.sqr())).invert();
202 constexpr field12 frobenius_map_three()
const
205 c0.frobenius_map_three(),
206 c1.frobenius_map_three().mul_by_fq2(Fq12Params::frobenius_coefficients_3),
210 constexpr field12 frobenius_map_two()
const
213 c0.frobenius_map_two(),
214 c1.frobenius_map_two().mul_by_fq2(Fq12Params::frobenius_coefficients_2),
218 constexpr field12 frobenius_map_one()
const
221 c0.frobenius_map_one(),
222 c1.frobenius_map_one().mul_by_fq2(Fq12Params::frobenius_coefficients_1),
226 constexpr field12 cyclotomic_squared()
const
233 constexpr field12 unitary_inverse()
const
244 base_field::random_element(engine),
245 base_field::random_element(engine),
249 constexpr field12 to_montgomery_form()
252 c0.to_montgomery_form(),
253 c1.to_montgomery_form(),
257 constexpr field12 from_montgomery_form()
260 c0.from_montgomery_form(),
261 c1.from_montgomery_form(),
265 [[nodiscard]]
constexpr bool is_zero()
const {
return c0.is_zero() && c1.is_zero(); }
267 constexpr bool operator==(
const field12& other)
const {
return c0 == other.c0 && c1 == other.c1; }
Definition: field12.hpp:5
Definition: engine.hpp:10
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16
Definition: field12.hpp:44