Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
fp2.hpp
Go to the documentation of this file.
1 
10 #ifndef FP2_HPP_
11 #define FP2_HPP_
13 #include <vector>
14 
15 namespace libff
16 {
17 
18 template<mp_size_t n, const bigint<n> &modulus> class Fp2_model;
19 
20 template<mp_size_t n, const bigint<n> &modulus>
21 std::ostream &operator<<(std::ostream &, const Fp2_model<n, modulus> &);
22 
23 template<mp_size_t n, const bigint<n> &modulus>
24 std::istream &operator>>(std::istream &, Fp2_model<n, modulus> &);
25 
32 template<mp_size_t n, const bigint<n> &modulus> class Fp2_model
33 {
34 public:
36 
37  // Exposing the field extension degree via a static member
38  // allows to retrieve the value from the type. This can be useful.
39  // Note that, the degree can be retrieved from a Fp2_model value
40  // by invoking the `size()` method on the `coeffs` container.
41  static const size_t tower_extension_degree = 2;
42 
43  static void static_init();
44 
48  static size_t s;
50  static bigint<2 * n> t;
62 
64  Fp2_model(){};
65  // Fp2_model(const my_Fp& c0, const my_Fp& c1) : coeffs(c0, c1) {};
66  Fp2_model(const my_Fp &c0, const my_Fp &c1)
67  {
68  this->coeffs[0] = c0;
69  this->coeffs[1] = c1;
70  return;
71  };
72 
73  void clear()
74  {
75  coeffs[0].clear();
76  coeffs[1].clear();
77  }
78  void print() const
79  {
80  printf("c0/c1:\n");
81  coeffs[0].print();
82  coeffs[1].print();
83  }
84 
85  static const Fp2_model<n, modulus> &zero();
86  static const Fp2_model<n, modulus> &one();
88 
89  bool is_zero() const { return coeffs[0].is_zero() && coeffs[1].is_zero(); }
90  bool operator==(const Fp2_model &other) const;
91  bool operator!=(const Fp2_model &other) const;
92 
93  Fp2_model operator+(const Fp2_model &other) const;
94  Fp2_model operator-(const Fp2_model &other) const;
95  Fp2_model operator*(const Fp2_model &other) const;
96  Fp2_model operator-() const;
98  Fp2_model squared() const;
99  Fp2_model inverse() const;
100  Fp2_model Frobenius_map(unsigned long power) const;
102  Fp2_model sqrt() const;
104  Fp2_model squared_complex() const;
105 
106  template<mp_size_t m> Fp2_model operator^(const bigint<m> &other) const;
107 
108  static size_t size_in_bits() { return 2 * my_Fp::size_in_bits(); }
109  static bigint<n> base_field_char() { return modulus; }
110  static constexpr size_t extension_degree() { return 2; }
111 
112 protected:
113  static bool s_initialized;
116 
117  friend std::ostream &operator<<<n, modulus>(
118  std::ostream &out, const Fp2_model<n, modulus> &el);
119  friend std::istream &operator>>
120  <n, modulus>(std::istream &in, Fp2_model<n, modulus> &el);
121 };
122 
123 template<mp_size_t n, const bigint<n> &modulus>
124 std::ostream &operator<<(
125  std::ostream &out, const std::vector<Fp2_model<n, modulus>> &v);
126 
127 template<mp_size_t n, const bigint<n> &modulus>
128 std::istream &operator>>(
129  std::istream &in, std::vector<Fp2_model<n, modulus>> &v);
130 
131 template<mp_size_t n, const bigint<n> &modulus>
133  const Fp_model<n, modulus> &lhs, const Fp2_model<n, modulus> &rhs);
134 
135 template<mp_size_t n, const bigint<n> &modulus>
137 
138 template<mp_size_t n, const bigint<n> &modulus> size_t Fp2_model<n, modulus>::s;
139 
140 template<mp_size_t n, const bigint<n> &modulus>
142 
143 template<mp_size_t n, const bigint<n> &modulus>
145 
146 template<mp_size_t n, const bigint<n> &modulus>
148 
149 template<mp_size_t n, const bigint<n> &modulus>
151 
152 template<mp_size_t n, const bigint<n> &modulus>
154 
155 template<mp_size_t n, const bigint<n> &modulus>
157 
158 } // namespace libff
160 
161 #endif // FP2_HPP_
libff::Fp2_model::euler
static bigint< 2 *n > euler
(modulus^2-1)/2
Definition: fp2.hpp:46
libff::Fp_model::print
void print() const
libff::Fp2_model::coeffs
my_Fp coeffs[2]
Definition: fp2.hpp:63
libff::Fp2_model::nqr_to_t
static Fp2_model< n, modulus > nqr_to_t
nqr^t
Definition: fp2.hpp:59
libff::Fp2_model::Fp2_model
Fp2_model()
Definition: fp2.hpp:64
libff::Fp2_model::operator+
Fp2_model operator+(const Fp2_model &other) const
libff::Fp2_model::t_minus_1_over_2
static bigint< 2 *n > t_minus_1_over_2
(t-1)/2
Definition: fp2.hpp:52
libff
Definition: ffi.cpp:8
libff::Fp2_model::one
static const Fp2_model< n, modulus > & one()
libff::Fp2_model::size_in_bits
static size_t size_in_bits()
Definition: fp2.hpp:108
libff::Fp2_model::operator^
Fp2_model operator^(const bigint< m > &other) const
fp.hpp
libff::Fp_model::is_zero
bool is_zero() const
libff::Fp2_model::s_one
static Fp2_model< n, modulus > s_one
Definition: fp2.hpp:115
fp2.tcc
libff::Fp2_model::Fp2_model
Fp2_model(const my_Fp &c0, const my_Fp &c1)
Definition: fp2.hpp:66
libff::operator>>
std::istream & operator>>(std::istream &in, alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:446
libff::Fp2_model::operator-
Fp2_model operator-() const
libff::Fp2_model::extension_degree
static constexpr size_t extension_degree()
Definition: fp2.hpp:110
libff::Fp_model::clear
void clear()
libff::Fp2_model::inverse
Fp2_model inverse() const
libff::Fp2_model::s_zero
static Fp2_model< n, modulus > s_zero
Definition: fp2.hpp:114
libff::Fp2_model::s_initialized
static bool s_initialized
Definition: fp2.hpp:113
libff::Fp2_model::Frobenius_coeffs_c1
static my_Fp Frobenius_coeffs_c1[2]
non_residue^((modulus^i-1)/2) for i=0,1
Definition: fp2.hpp:61
libff::Fp2_model::is_zero
bool is_zero() const
Definition: fp2.hpp:89
libff::Fp2_model::nqr
static Fp2_model< n, modulus > nqr
a quadratic nonresidue in Fp2
Definition: fp2.hpp:57
libff::Fp2_model::operator==
bool operator==(const Fp2_model &other) const
libff::Fp_model::size_in_bits
static size_t size_in_bits()
Definition: fp.hpp:134
libff::Fp2_model::static_init
static void static_init()
libff::Fp2_model::my_Fp
Fp_model< n, modulus > my_Fp
Definition: fp2.hpp:35
libff::Fp2_model::squared_karatsuba
Fp2_model squared_karatsuba() const
libff::bigint< 2 *n >
libff::Fp2_model::non_residue
static my_Fp non_residue
Definition: fp2.hpp:55
libff::Fp2_model::squared_complex
Fp2_model squared_complex() const
libff::Fp_model
Definition: fp.hpp:20
libff::Fp2_model::operator*
Fp2_model operator*(const Fp2_model &other) const
libff::operator<<
std::ostream & operator<<(std::ostream &out, const alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:436
libff::operator*
alt_bn128_G1 operator*(const bigint< m > &lhs, const alt_bn128_G1 &rhs)
Definition: alt_bn128_g1.hpp:99
libff::Fp2_model::operator!=
bool operator!=(const Fp2_model &other) const
libff::Fp2_model::squared
Fp2_model squared() const
default is squared_complex
libff::Fp2_model
Definition: fp2.hpp:18
libff::Fp2_model::print
void print() const
Definition: fp2.hpp:78
libff::Fp2_model::Frobenius_map
Fp2_model Frobenius_map(unsigned long power) const
libff::power
FieldT power(const FieldT &base, const bigint< m > &exponent)
libff::Fp2_model::sqrt
Fp2_model sqrt() const
HAS TO BE A SQUARE (else does not terminate)
libff::Fp2_model::random_element
static Fp2_model< n, modulus > random_element()
libff::Fp2_model::zero
static const Fp2_model< n, modulus > & zero()
libff::Fp2_model::tower_extension_degree
static const size_t tower_extension_degree
Definition: fp2.hpp:41
libff::Fp2_model::base_field_char
static bigint< n > base_field_char()
Definition: fp2.hpp:109
libff::Fp2_model::t
static bigint< 2 *n > t
with t odd
Definition: fp2.hpp:50
libff::Fp2_model::s
static size_t s
modulus^2 = 2^s * t + 1
Definition: fp2.hpp:48
libff::Fp2_model::clear
void clear()
Definition: fp2.hpp:73