Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
fp.hpp
Go to the documentation of this file.
1 
11 #ifndef FP_HPP_
12 #define FP_HPP_
13 
16 
17 namespace libff
18 {
19 
20 template<mp_size_t n, const bigint<n> &modulus> class Fp_model;
21 
22 template<mp_size_t n, const bigint<n> &modulus>
23 std::ostream &operator<<(std::ostream &, const Fp_model<n, modulus> &);
24 
25 template<mp_size_t n, const bigint<n> &modulus>
26 std::istream &operator>>(std::istream &, Fp_model<n, modulus> &);
27 
38 template<mp_size_t n, const bigint<n> &modulus> class Fp_model
39 {
40 public:
42 
44 
45  static void static_init();
46 
47  static const mp_size_t num_limbs = n;
48  static const constexpr bigint<n> &mod = modulus;
49 #ifdef PROFILE_OP_COUNTS
50  static long long add_cnt;
51  static long long sub_cnt;
52  static long long mul_cnt;
53  static long long sqr_cnt;
54  static long long inv_cnt;
55 #endif
56 
58  static const size_t tower_extension_degree = 1;
59 
60  static size_t num_bits;
62  static bigint<n> euler;
64  static size_t s;
66  static bigint<n> t;
78  static mp_limb_t inv;
82  static bigint<n> Rcubed;
83 
84  static bool modulus_is_valid()
85  {
86  return modulus.data[n - 1] != 0;
87  } // mpn inverse assumes that highest limb is non-zero
88 
89  Fp_model(){};
90  Fp_model(const bigint<n> &b);
91  Fp_model(const long x, const bool is_unsigned = false);
92 
93  void set_ulong(const unsigned long x);
94 
95  void mul_reduce(const bigint<n> &other);
96 
97  void clear();
98 
102  bigint<n> as_bigint() const;
106  unsigned long as_ulong() const;
107 
108  bool operator==(const Fp_model &other) const;
109  bool operator!=(const Fp_model &other) const;
110  bool is_zero() const;
111 
112  void print() const;
113 
114  Fp_model &operator+=(const Fp_model &other);
115  Fp_model &operator-=(const Fp_model &other);
116  Fp_model &operator*=(const Fp_model &other);
117  Fp_model &operator^=(const unsigned long pow);
118 
119  template<mp_size_t m> Fp_model &operator^=(const bigint<m> &pow);
120 
121  Fp_model operator+(const Fp_model &other) const;
122  Fp_model operator-(const Fp_model &other) const;
123  Fp_model operator*(const Fp_model &other) const;
124  Fp_model operator-() const;
125  Fp_model squared() const;
126  Fp_model &invert();
127  Fp_model inverse() const;
129  Fp_model sqrt() const;
130 
131  Fp_model operator^(const unsigned long pow) const;
132  template<mp_size_t m> Fp_model operator^(const bigint<m> &pow) const;
133 
134  static size_t size_in_bits() { return num_bits; }
135  static size_t capacity() { return num_bits - 1; }
136  static const bigint<n> &field_char() { return modulus; }
137  static constexpr size_t extension_degree() { return 1; }
138 
139  static const Fp_model<n, modulus> &zero();
140  static const Fp_model<n, modulus> &one();
141 
144 
147 
150 
151 protected:
152  static bool s_initialized;
155 
156  friend std::ostream &operator<<<n, modulus>(
157  std::ostream &out, const Fp_model<n, modulus> &p);
158  friend std::istream &operator>>
159  <n, modulus>(std::istream &in, Fp_model<n, modulus> &p);
160 };
161 
162 #ifdef PROFILE_OP_COUNTS
163 template<mp_size_t n, const bigint<n> &modulus>
164 long long Fp_model<n, modulus>::add_cnt = 0;
165 
166 template<mp_size_t n, const bigint<n> &modulus>
167 long long Fp_model<n, modulus>::sub_cnt = 0;
168 
169 template<mp_size_t n, const bigint<n> &modulus>
170 long long Fp_model<n, modulus>::mul_cnt = 0;
171 
172 template<mp_size_t n, const bigint<n> &modulus>
173 long long Fp_model<n, modulus>::sqr_cnt = 0;
174 
175 template<mp_size_t n, const bigint<n> &modulus>
176 long long Fp_model<n, modulus>::inv_cnt = 0;
177 #endif
178 
179 template<mp_size_t n, const bigint<n> &modulus>
181 
182 template<mp_size_t n, const bigint<n> &modulus>
184 
185 template<mp_size_t n, const bigint<n> &modulus> size_t Fp_model<n, modulus>::s;
186 
187 template<mp_size_t n, const bigint<n> &modulus>
189 
190 template<mp_size_t n, const bigint<n> &modulus>
192 
193 template<mp_size_t n, const bigint<n> &modulus>
195 
196 template<mp_size_t n, const bigint<n> &modulus>
198 
199 template<mp_size_t n, const bigint<n> &modulus>
201 
202 template<mp_size_t n, const bigint<n> &modulus>
204 
205 template<mp_size_t n, const bigint<n> &modulus>
206 mp_limb_t Fp_model<n, modulus>::inv;
207 
208 template<mp_size_t n, const bigint<n> &modulus>
210 
211 template<mp_size_t n, const bigint<n> &modulus>
213 
214 } // namespace libff
215 
217 
218 #endif // FP_HPP_
libff::Fp_model::print
void print() const
libff::Fp_model::s_zero
static Fp_model< n, modulus > s_zero
Definition: fp.hpp:153
libff::Fp_model::set_ulong
void set_ulong(const unsigned long x)
libff::Fp_model::random_element
static Fp_model< n, modulus > random_element()
returns random element of Fp_model
libff::Fp_model::mul_reduce
void mul_reduce(const bigint< n > &other)
libff
Definition: ffi.cpp:8
libff::Fp_model::mont_repr
bigint< n > mont_repr
Definition: fp.hpp:43
libff::Fp_model::squared
Fp_model squared() const
libff::Fp_model::arithmetic_generator
static Fp_model< n, modulus > arithmetic_generator()
generator++, for k = 1 to m, domain size m
libff::Fp_model::nqr
static Fp_model< n, modulus > nqr
a quadratic nonresidue
Definition: fp.hpp:70
bigint.hpp
libff::Fp_model::zero
static const Fp_model< n, modulus > & zero()
libff::Fp_model::is_zero
bool is_zero() const
libff::operator>>
std::istream & operator>>(std::istream &in, alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:446
libff::Fp_model::t
static bigint< n > t
with t odd
Definition: fp.hpp:66
libff::Fp_model::s
static size_t s
modulus = 2^s * t + 1
Definition: fp.hpp:64
libff::Fp_model::operator!=
bool operator!=(const Fp_model &other) const
libff::Fp_model::inverse
Fp_model inverse() const
libff::Fp_model::clear
void clear()
libff::Fp_model::euler
static bigint< n > euler
(modulus-1)/2
Definition: fp.hpp:62
libff::Fp_model::modulus_is_valid
static bool modulus_is_valid()
Definition: fp.hpp:84
libff::Fp_model::operator^
Fp_model operator^(const unsigned long pow) const
libff::Fp_model::operator*=
Fp_model & operator*=(const Fp_model &other)
libff::Fp_model::sqrt
Fp_model sqrt() const
HAS TO BE A SQUARE (else does not terminate)
libff::Fp_model::one
static const Fp_model< n, modulus > & one()
libff::Fp_model::invert
Fp_model & invert()
libff::Fp_model::capacity
static size_t capacity()
Definition: fp.hpp:135
libff::Fp_model::size_in_bits
static size_t size_in_bits()
Definition: fp.hpp:134
libff::Fp_model::operator-
Fp_model operator-() const
libff::Fp_model::operator+=
Fp_model & operator+=(const Fp_model &other)
libff::Fp_model::t_minus_1_over_2
static bigint< n > t_minus_1_over_2
(t-1)/2
Definition: fp.hpp:68
libff::Fp_model::num_limbs
static const mp_size_t num_limbs
Definition: fp.hpp:47
fp.tcc
libff::Fp_model::operator^=
Fp_model & operator^=(const unsigned long pow)
libff::bigint
Definition: bigint.hpp:20
libff::Fp_model::operator*
Fp_model operator*(const Fp_model &other) const
libff::Fp_model::static_init
static void static_init()
libff::Fp_model::root_of_unity
static Fp_model< n, modulus > root_of_unity
generator^((modulus-1)/2^s)
Definition: fp.hpp:76
libff::Fp_model::operator==
bool operator==(const Fp_model &other) const
libff::Fp_model::operator-=
Fp_model & operator-=(const Fp_model &other)
libff::Fp_model::field_char
static const bigint< n > & field_char()
Definition: fp.hpp:136
libff::Fp_model::as_bigint
bigint< n > as_bigint() const
libff::Fp_model
Definition: fp.hpp:20
exponentiation.hpp
libff::operator<<
std::ostream & operator<<(std::ostream &out, const alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:436
libff::Fp_model::nqr_to_t
static Fp_model< n, modulus > nqr_to_t
nqr^t
Definition: fp.hpp:72
libff::Fp_model::multiplicative_generator
static Fp_model< n, modulus > multiplicative_generator
generator of Fp^*
Definition: fp.hpp:74
libff::Fp_model::operator+
Fp_model operator+(const Fp_model &other) const
libff::Fp_model::num_bits
static size_t num_bits
Definition: fp.hpp:60
libff::Fp_model::geometric_generator
static Fp_model< n, modulus > geometric_generator()
generator^k, for k = 1 to m, domain size m
libff::Fp_model::inv
static mp_limb_t inv
-modulus^(-1) mod W, where W = 2^(word size)
Definition: fp.hpp:78
libff::Fp_model::my_Fp
Fp_model< n, modulus > my_Fp
Definition: fp.hpp:41
libff::Fp_model::tower_extension_degree
static const size_t tower_extension_degree
The "base"/"ground" field.
Definition: fp.hpp:58
libff::Fp_model::Fp_model
Fp_model()
Definition: fp.hpp:89
libff::Fp_model::mod
static const constexpr bigint< n > & mod
Definition: fp.hpp:48
libff::Fp_model::as_ulong
unsigned long as_ulong() const
libff::Fp_model::Rsquared
static bigint< n > Rsquared
R^2, where R = W^k, where k = ??
Definition: fp.hpp:80
libff::Fp_model::extension_degree
static constexpr size_t extension_degree()
Definition: fp.hpp:137
libff::Fp_model::Rcubed
static bigint< n > Rcubed
R^3.
Definition: fp.hpp:82
libff::Fp_model::s_initialized
static bool s_initialized
Definition: fp.hpp:152
libff::Fp_model::s_one
static Fp_model< n, modulus > s_one
Definition: fp.hpp:154