Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
fp3.hpp
Go to the documentation of this file.
1 
10 #ifndef FP3_HPP_
11 #define FP3_HPP_
13 #include <vector>
14 
15 namespace libff
16 {
17 
18 template<mp_size_t n, const bigint<n> &modulus> class Fp3_model;
19 
20 template<mp_size_t n, const bigint<n> &modulus>
21 std::ostream &operator<<(std::ostream &, const Fp3_model<n, modulus> &);
22 
23 template<mp_size_t n, const bigint<n> &modulus>
24 std::istream &operator>>(std::istream &, Fp3_model<n, modulus> &);
25 
32 template<mp_size_t n, const bigint<n> &modulus> class Fp3_model
33 {
34 public:
36 
37  static const size_t tower_extension_degree = 3;
38 
42  static size_t s;
44  static bigint<3 * n> t;
58 
60  Fp3_model(){};
61  // Fp3_model(const my_Fp& c0, const my_Fp& c1, const my_Fp& c2) { coeffs =
62  // {c0, c1, c2}; };
63  Fp3_model(const my_Fp &c0, const my_Fp &c1, const my_Fp &c2)
64  {
65  this->coeffs[0] = c0;
66  this->coeffs[1] = c1;
67  this->coeffs[2] = c2;
68  return;
69  };
70 
71  void clear()
72  {
73  coeffs[0].clear();
74  coeffs[1].clear();
75  coeffs[2].clear();
76  }
77  void print() const
78  {
79  printf("c0/c1/c2:\n");
80  coeffs[0].print();
81  coeffs[1].print();
82  coeffs[2].print();
83  }
84 
85  static Fp3_model<n, modulus> zero();
86  static Fp3_model<n, modulus> one();
88 
89  bool is_zero() const
90  {
91  return coeffs[0].is_zero() && coeffs[1].is_zero() &&
92  coeffs[2].is_zero();
93  }
94  bool operator==(const Fp3_model &other) const;
95  bool operator!=(const Fp3_model &other) const;
96 
97  Fp3_model operator+(const Fp3_model &other) const;
98  Fp3_model operator-(const Fp3_model &other) const;
99  Fp3_model operator*(const Fp3_model &other) const;
100  Fp3_model operator-() const;
101  Fp3_model squared() const;
102  Fp3_model inverse() const;
103  Fp3_model Frobenius_map(unsigned long power) const;
105  Fp3_model sqrt() const;
106 
107  template<mp_size_t m> Fp3_model operator^(const bigint<m> &other) const;
108 
109  static size_t size_in_bits() { return 3 * my_Fp::size_in_bits(); }
110  static bigint<n> base_field_char() { return modulus; }
111  static constexpr size_t extension_degree() { return 3; }
112 
113  friend std::ostream &operator<<<n, modulus>(
114  std::ostream &out, const Fp3_model<n, modulus> &el);
115  friend std::istream &operator>>
116  <n, modulus>(std::istream &in, Fp3_model<n, modulus> &el);
117 };
118 
119 template<mp_size_t n, const bigint<n> &modulus>
120 std::ostream &operator<<(
121  std::ostream &out, const std::vector<Fp3_model<n, modulus>> &v);
122 
123 template<mp_size_t n, const bigint<n> &modulus>
124 std::istream &operator>>(
125  std::istream &in, std::vector<Fp3_model<n, modulus>> &v);
126 
127 template<mp_size_t n, const bigint<n> &modulus>
128 Fp3_model<n, modulus> operator*(
129  const Fp_model<n, modulus> &lhs, const Fp3_model<n, modulus> &rhs);
130 
131 template<mp_size_t n, const bigint<n> &modulus>
132 bigint<3 * n> Fp3_model<n, modulus>::euler;
133 
134 template<mp_size_t n, const bigint<n> &modulus> size_t Fp3_model<n, modulus>::s;
135 
136 template<mp_size_t n, const bigint<n> &modulus>
137 bigint<3 * n> Fp3_model<n, modulus>::t;
138 
139 template<mp_size_t n, const bigint<n> &modulus>
141 
142 template<mp_size_t n, const bigint<n> &modulus>
143 Fp_model<n, modulus> Fp3_model<n, modulus>::non_residue;
144 
145 template<mp_size_t n, const bigint<n> &modulus>
146 Fp3_model<n, modulus> Fp3_model<n, modulus>::nqr;
147 
148 template<mp_size_t n, const bigint<n> &modulus>
149 Fp3_model<n, modulus> Fp3_model<n, modulus>::nqr_to_t;
150 
151 template<mp_size_t n, const bigint<n> &modulus>
152 Fp_model<n, modulus> Fp3_model<n, modulus>::Frobenius_coeffs_c1[3];
153 
154 template<mp_size_t n, const bigint<n> &modulus>
155 Fp_model<n, modulus> Fp3_model<n, modulus>::Frobenius_coeffs_c2[3];
156 
157 } // namespace libff
159 
160 #endif // FP3_HPP_
libff::Fp3_model::nqr_to_t
static Fp3_model< n, modulus > nqr_to_t
nqr^t
Definition: fp3.hpp:53
libff::Fp_model::print
void print() const
libff::Fp3_model::Frobenius_map
Fp3_model Frobenius_map(unsigned long power) const
libff::Fp3_model::Frobenius_coeffs_c1
static my_Fp Frobenius_coeffs_c1[3]
non_residue^((modulus^i-1)/3) for i=0,1,2
Definition: fp3.hpp:55
libff::Fp3_model::operator!=
bool operator!=(const Fp3_model &other) const
libff::Fp3_model::base_field_char
static bigint< n > base_field_char()
Definition: fp3.hpp:110
libff::Fp3_model::print
void print() const
Definition: fp3.hpp:77
libff::Fp3_model::euler
static bigint< 3 *n > euler
(modulus^3-1)/2
Definition: fp3.hpp:40
libff::Fp3_model::my_Fp
Fp_model< n, modulus > my_Fp
Definition: fp3.hpp:35
libff::Fp3_model::s
static size_t s
modulus^3 = 2^s * t + 1
Definition: fp3.hpp:42
libff
Definition: ffi.cpp:8
libff::Fp3_model::one
static Fp3_model< n, modulus > one()
fp.hpp
libff::Fp_model::is_zero
bool is_zero() const
libff::Fp3_model::t_minus_1_over_2
static bigint< 3 *n > t_minus_1_over_2
(t-1)/2
Definition: fp3.hpp:46
libff::Fp3_model::Fp3_model
Fp3_model()
Definition: fp3.hpp:60
libff::operator>>
std::istream & operator>>(std::istream &in, alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:446
libff::Fp3_model::operator^
Fp3_model operator^(const bigint< m > &other) const
libff::Fp_model::clear
void clear()
libff::Fp3_model::coeffs
my_Fp coeffs[3]
Definition: fp3.hpp:59
libff::Fp3_model::extension_degree
static constexpr size_t extension_degree()
Definition: fp3.hpp:111
libff::Fp3_model::Fp3_model
Fp3_model(const my_Fp &c0, const my_Fp &c1, const my_Fp &c2)
Definition: fp3.hpp:63
libff::Fp_model::size_in_bits
static size_t size_in_bits()
Definition: fp.hpp:134
libff::Fp3_model::Frobenius_coeffs_c2
static my_Fp Frobenius_coeffs_c2[3]
non_residue^((2*modulus^i-2)/3) for i=0,1,2
Definition: fp3.hpp:57
libff::Fp3_model::tower_extension_degree
static const size_t tower_extension_degree
Definition: fp3.hpp:37
libff::bigint< 3 *n >
libff::Fp3_model::operator==
bool operator==(const Fp3_model &other) const
libff::Fp3_model::nqr
static Fp3_model< n, modulus > nqr
a quadratic nonresidue in Fp3
Definition: fp3.hpp:51
fp3.tcc
libff::Fp3_model
Definition: fp3.hpp:18
libff::Fp_model
Definition: fp.hpp:20
libff::operator<<
std::ostream & operator<<(std::ostream &out, const alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:436
libff::Fp3_model::inverse
Fp3_model inverse() const
libff::Fp3_model::sqrt
Fp3_model sqrt() const
HAS TO BE A SQUARE (else does not terminate)
libff::Fp3_model::operator-
Fp3_model operator-() const
libff::operator*
alt_bn128_G1 operator*(const bigint< m > &lhs, const alt_bn128_G1 &rhs)
Definition: alt_bn128_g1.hpp:99
libff::Fp3_model::is_zero
bool is_zero() const
Definition: fp3.hpp:89
libff::Fp3_model::non_residue
static my_Fp non_residue
Definition: fp3.hpp:49
libff::Fp3_model::clear
void clear()
Definition: fp3.hpp:71
libff::Fp3_model::size_in_bits
static size_t size_in_bits()
Definition: fp3.hpp:109
libff::power
FieldT power(const FieldT &base, const bigint< m > &exponent)
libff::Fp3_model::operator*
Fp3_model operator*(const Fp3_model &other) const
libff::Fp3_model::squared
Fp3_model squared() const
libff::Fp3_model::zero
static Fp3_model< n, modulus > zero()
libff::Fp3_model::operator+
Fp3_model operator+(const Fp3_model &other) const
libff::Fp3_model::t
static bigint< 3 *n > t
with t odd
Definition: fp3.hpp:44
libff::Fp3_model::random_element
static Fp3_model< n, modulus > random_element()