17template <
typename Params>
20 static constexpr auto P = Params::P;
21 static constexpr size_t N = Params::N;
22 typedef typename Params::W W;
24 constexpr static std::array<W, N> one() {
return std::array<W, N>{1}; }
26 constexpr static std::array<W, N> redc(
const std::array<W, 2 * N>& z) {
28 constexpr W TOP_BITS =
static_cast<W
>(0x1FF);
35 for(
size_t i = 0; i != N; ++i) {
36 t[i] = z[(N - 1) + i] >> 9;
39 for(
size_t i = 0; i != N - 1; ++i) {
45 for(
size_t i = 0; i != N - 1; ++i) {
51 t[N - 1] += (z[N - 1] & TOP_BITS) +
carry;
65 const W need_sub =
~CT::Mask<W>::is_zero(t[N - 1] >> 9).value();
68 for(
size_t i = 0; i != N - 1; ++i) {
71 t[N - 1] =
word_sub(t[N - 1], need_sub & TOP_BITS, &borrow);
76 constexpr static std::array<W, N> to_rep(
const std::array<W, N>& x) {
return x; }
78 constexpr static std::array<W, N> wide_to_rep(
const std::array<W, 2 * N>& x) {
return redc(x); }
80 constexpr static std::array<W, N> from_rep(
const std::array<W, N>& z) {
return z; }
85 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
86 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
87 "51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
88 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
89 "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
90 "11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
99 static constexpr FieldElement fe_invert2(
const FieldElement& x) {
102 FieldElement r = x.square();
139 static constexpr FieldElement fe_sqrt(
const FieldElement& x) {
145 static constexpr Scalar scalar_invert(
const Scalar& x) {
148 auto t2 = x.square();