1#ifndef B9C07A97_9853_412C_BCB7_F2FB19B8C1A7
2#define B9C07A97_9853_412C_BCB7_F2FB19B8C1A7
10#include "secp256k1/types.hpp"
104 std::memcpy(&d, &limbs_,
sizeof(d));
108 return from_limbs({d.limbs[0], d.limbs[1], d.limbs[2], d.limbs[3]});
120 std::memcpy(&mid, &fe,
sizeof(mid));
127 std::memcpy(&lm,
limbs,
sizeof(lm));
133 "FieldElement and MidFieldElement must be same size");
134static_assert(
sizeof(
FieldElement) == 32,
"Must be 256 bits");
138 "CPU FieldElement must match shared data layout size");
140 "CPU MidFieldElement must match shared data layout size");
141static_assert(
sizeof(
FieldElement) == 32,
"Must be 256 bits");
159namespace montgomery {
162 static const FieldElement r = FieldElement::from_uint64(0x1000003D1ULL);
168 static const FieldElement r2 = FieldElement::from_limbs(
169 {0x000007A2000E90A1ULL, 0x0000000000000001ULL, 0ULL, 0ULL});
175 static const FieldElement r3 = FieldElement::from_limbs(
176 {0x002BB1E33795F671ULL, 0x0000000100000B73ULL, 0ULL, 0ULL});
182 static const FieldElement r_inv = FieldElement::from_limbs(
183 {0xD838091D0868192AULL, 0xBCB223FEDC24A059ULL,
184 0x9C46C2C295F2B761ULL, 0xC9BD190515538399ULL});
189 constexpr std::uint64_t K_MOD = 0x1000003D1ULL;
285#if defined(__SIZEOF_INT128__)
287void fe52_inverse_safegcd_var(
const std::uint64_t* in5, std::uint64_t* out5);
const limbs_type & limbs() const noexcept
FieldElement & operator+=(const FieldElement &rhs)
FieldElement square() const
FieldElement operator+(const FieldElement &rhs) const
static bool parse_bytes_strict(const std::uint8_t *bytes32, FieldElement &out) noexcept
FieldElement & operator*=(const FieldElement &rhs)
limbs_type & limbs_mut() noexcept
std::array< std::uint64_t, 4 > limbs_type
std::array< std::uint8_t, 32 > to_bytes() const
bool operator==(const FieldElement &rhs) const noexcept
static FieldElement from_data(const ::secp256k1::FieldElementData &d)
FieldElement & operator-=(const FieldElement &rhs)
static FieldElement from_hex(const std::string &hex)
static FieldElement zero()
static FieldElement from_limbs_raw(const limbs_type &limbs) noexcept
::secp256k1::FieldElementData data() const noexcept
static FieldElement from_mont(const FieldElement &a)
static FieldElement from_limbs(const limbs_type &limbs)
FieldElement operator*(const FieldElement &rhs) const
FieldElement operator-(const FieldElement &rhs) const
std::string to_hex() const
FieldElement inverse() const
static FieldElement one()
void negate_assign(unsigned magnitude=1)
static bool parse_bytes_strict(const std::array< std::uint8_t, 32 > &bytes, FieldElement &out) noexcept
static FieldElement from_uint64(std::uint64_t value)
void to_bytes_into(std::uint8_t *out) const noexcept
FieldElement negate(unsigned magnitude=1) const
static FieldElement from_bytes(const std::array< std::uint8_t, 32 > &bytes)
FieldElement sqrt() const
secp256k1::fast::FieldElement FieldElement
FieldElement fe_inverse_secp256k1_special(const FieldElement &value)
FieldElement pow_p_minus_2_rtl_binary(FieldElement base)
FieldElement pow_p_minus_2_yao(FieldElement base)
FieldElement pow_p_minus_2_binary(FieldElement base)
FieldElement fe_inverse_strauss(const FieldElement &value)
FieldElement pow_p_minus_2_binary_euclidean(FieldElement base)
FieldElement pow_p_minus_2_addchain(FieldElement base)
FieldElement fe_inverse_kary16(const FieldElement &value)
FieldElement pow_p_minus_2_montgomery_redc(FieldElement base)
FieldElement pow_p_minus_2_double_base(const FieldElement &base)
FieldElement pow_p_minus_2_pippenger(FieldElement base)
FieldElement fe_inverse_bos_coster(const FieldElement &value)
FieldElement fe_inverse_window_naf_v2(const FieldElement &value)
FieldElement fe_inverse_ltr_precomp(const FieldElement &value)
FieldElement pow_p_minus_2_lehmer(FieldElement base)
FieldElement fe_inverse_binary_euclidean(const FieldElement &value)
FieldElement fe_inverse_fermat_gpu(const FieldElement &value)
FieldElement pow_p_minus_2_stein(FieldElement base)
FieldElement pow_p_minus_2_window4(FieldElement base)
MidFieldElement toMid(const FieldElement &fe) noexcept
FieldElement fe_inverse_safegcd(const FieldElement &value)
FieldElement pow_p_minus_2_ltr_precomp(FieldElement base)
FieldElement fe_inverse_branchless(const FieldElement &value)
FieldElement fe_inverse_parallel_window(const FieldElement &value)
FieldElement pow_p_minus_2_kary16(FieldElement base)
FieldElement pow_p_minus_2_window_naf_v2(FieldElement base)
void fe_batch_inverse(FieldElement *elements, size_t count)
FieldElement pow_p_minus_2_compact_table(FieldElement base)
FieldElement pow_p_minus_2_sliding_dynamic(FieldElement base)
FieldElement fe_inverse_eea(const FieldElement &value)
FieldElement fe_inverse_double_base(const FieldElement &value)
FieldElement fe_inverse_karatsuba(const FieldElement &value)
FieldElement fe_inverse_compact_table(const FieldElement &value)
FieldElement pow_p_minus_2_booth(FieldElement base)
FieldElement pow_p_minus_2_binary_opt(FieldElement base)
FieldElement fe_inverse_warp_optimized(const FieldElement &value)
FieldElement pow_p_minus_2_warp_optimized(FieldElement base)
FieldElement fe_inverse_addchain(const FieldElement &value)
FieldElement pow_p_minus_2_hybrid_eea(FieldElement base)
FieldElement fe_inverse_montgomery_redc(const FieldElement &value)
FieldElement fe_inverse_fixed_window5(const FieldElement &value)
FieldElement pow_p_minus_2_eea(FieldElement base)
FieldElement fe_inverse_lehmer(const FieldElement &value)
FieldElement fe_inverse_sliding_dynamic(const FieldElement &value)
FieldElement pow_p_minus_2_strauss(FieldElement base)
FieldElement fe_inverse_binary(const FieldElement &value)
FieldElement pow_p_minus_2_secp256k1_special(FieldElement base)
FieldElement pow_p_minus_2_fermat_gpu(FieldElement base)
FieldElement pow_p_minus_2_bos_coster(FieldElement base)
FieldElement fe_inverse_addchain_unrolled(const FieldElement &value)
FieldElement fe_inverse_stein(const FieldElement &value)
FieldElement fe_inverse_binary_opt(const FieldElement &value)
FieldElement pow_p_minus_2_parallel_window(FieldElement base)
FieldElement fe_inverse_window4(const FieldElement &value)
FieldElement fe_inverse_booth(const FieldElement &value)
FieldElement fe_inverse_pippenger(const FieldElement &value)
FieldElement pow_p_minus_2_addchain_unrolled(FieldElement base)
FieldElement pow_p_minus_2_fixed_window5(FieldElement base)
FieldElement pow_p_minus_2_karatsuba(FieldElement base)
FieldElement fe_inverse_rtl_binary(const FieldElement &value)
FieldElement pow_p_minus_2_branchless(FieldElement base)
FieldElement fe_inverse_hybrid_eea(const FieldElement &value)
FieldElement fe_inverse_yao(const FieldElement &value)
FieldElement ToFieldElement() const noexcept