Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
fp4.hpp
Go to the documentation of this file.
1 
17 #ifndef FP4_HPP_
18 #define FP4_HPP_
19 
22 
23 namespace libff
24 {
25 
26 template<mp_size_t n, const bigint<n> &modulus> class Fp4_model;
27 
28 template<mp_size_t n, const bigint<n> &modulus>
29 std::ostream &operator<<(std::ostream &, const Fp4_model<n, modulus> &);
30 
31 template<mp_size_t n, const bigint<n> &modulus>
32 std::istream &operator>>(std::istream &, Fp4_model<n, modulus> &);
33 
34 template<mp_size_t n, const bigint<n> &modulus> class Fp4_model
35 {
36 public:
39  typedef my_Fp2 my_Fpe;
40 
41  // The field extension here is 4, but this is built as 2 over 2. As such,
42  // the value of `extension_degree` only contains the field extension used to
43  // obtain the top most level in the field tower, which is 2 here, not 4.
44  //
45  // TODO: Maybe choose another name for this static member to avoid confusion
46  // with the actual "total" extension degree.
47  // Note: `final_extension_degree` could be a good name.
48  static const size_t tower_extension_degree = 2;
49 
53 
55  Fp4_model(){};
56  Fp4_model(const my_Fp2 &c0, const my_Fp2 &c1)
57  {
58  this->coeffs[0] = c0;
59  this->coeffs[1] = c1;
60  return;
61  };
62 
63  void print() const
64  {
65  printf("c0/c1:\n");
66  coeffs[0].print();
67  coeffs[1].print();
68  }
69  void clear()
70  {
71  coeffs[0].clear();
72  coeffs[1].clear();
73  }
74 
75  static Fp4_model<n, modulus> zero();
76  static Fp4_model<n, modulus> one();
78 
79  bool is_zero() const { return coeffs[0].is_zero() && coeffs[1].is_zero(); }
80  bool operator==(const Fp4_model &other) const;
81  bool operator!=(const Fp4_model &other) const;
82 
83  Fp4_model operator+(const Fp4_model &other) const;
84  Fp4_model operator-(const Fp4_model &other) const;
85  Fp4_model operator*(const Fp4_model &other) const;
86  Fp4_model mul_by_023(const Fp4_model &other) const;
87  Fp4_model operator-() const;
88  Fp4_model squared() const;
89  Fp4_model inverse() const;
90  Fp4_model Frobenius_map(unsigned long power) const;
91  Fp4_model unitary_inverse() const;
93 
94  static my_Fp2 mul_by_non_residue(const my_Fp2 &elt);
95 
96  template<mp_size_t m>
97  Fp4_model cyclotomic_exp(const bigint<m> &exponent) const;
98 
99  static bigint<n> base_field_char() { return modulus; }
100  static constexpr size_t extension_degree() { return 4; }
101 
102  friend std::ostream &operator<<<n, modulus>(
103  std::ostream &out, const Fp4_model<n, modulus> &el);
104  friend std::istream &operator>>
105  <n, modulus>(std::istream &in, Fp4_model<n, modulus> &el);
106 };
107 
108 template<mp_size_t n, const bigint<n> &modulus>
109 Fp4_model<n, modulus> operator*(
110  const Fp_model<n, modulus> &lhs, const Fp4_model<n, modulus> &rhs);
111 
112 template<mp_size_t n, const bigint<n> &modulus>
113 Fp4_model<n, modulus> operator*(
114  const Fp2_model<n, modulus> &lhs, const Fp4_model<n, modulus> &rhs);
115 
116 template<mp_size_t n, const bigint<n> &modulus, mp_size_t m>
117 Fp4_model<n, modulus> operator^(
118  const Fp4_model<n, modulus> &self, const bigint<m> &exponent);
119 
120 template<
121  mp_size_t n,
122  const bigint<n> &modulus,
123  mp_size_t m,
124  const bigint<m> &modulus_p>
125 Fp4_model<n, modulus> operator^(
126  const Fp4_model<n, modulus> &self, const Fp_model<m, modulus_p> &exponent);
127 
128 template<mp_size_t n, const bigint<n> &modulus>
129 Fp_model<n, modulus> Fp4_model<n, modulus>::non_residue;
130 
131 template<mp_size_t n, const bigint<n> &modulus>
132 Fp_model<n, modulus> Fp4_model<n, modulus>::Frobenius_coeffs_c1[4];
133 
134 } // namespace libff
135 
137 
138 #endif // FP4_HPP_
libff::Fp4_model::Frobenius_map
Fp4_model Frobenius_map(unsigned long power) const
libff::Fp4_model::operator!=
bool operator!=(const Fp4_model &other) const
libff::Fp4_model::unitary_inverse
Fp4_model unitary_inverse() const
libff::Fp4_model::my_Fp
Fp_model< n, modulus > my_Fp
Definition: fp4.hpp:37
libff
Definition: ffi.cpp:8
libff::Fp4_model::mul_by_non_residue
static my_Fp2 mul_by_non_residue(const my_Fp2 &elt)
libff::Fp4_model::operator*
Fp4_model operator*(const Fp4_model &other) const
fp.hpp
libff::operator>>
std::istream & operator>>(std::istream &in, alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:446
libff::Fp4_model::cyclotomic_exp
Fp4_model cyclotomic_exp(const bigint< m > &exponent) const
libff::Fp4_model::operator==
bool operator==(const Fp4_model &other) const
libff::Fp4_model::Fp4_model
Fp4_model()
Definition: fp4.hpp:55
libff::Fp4_model::coeffs
my_Fp2 coeffs[2]
Definition: fp4.hpp:54
libff::Fp4_model::tower_extension_degree
static const size_t tower_extension_degree
Definition: fp4.hpp:48
libff::Fp4_model::inverse
Fp4_model inverse() const
fp4.tcc
libff::Fp4_model::my_Fpe
my_Fp2 my_Fpe
Definition: fp4.hpp:39
libff::Fp4_model::non_residue
static my_Fp non_residue
Definition: fp4.hpp:50
libff::Fp4_model::my_Fp2
Fp2_model< n, modulus > my_Fp2
Definition: fp4.hpp:38
libff::Fp4_model::cyclotomic_squared
Fp4_model cyclotomic_squared() const
libff::Fp2_model::is_zero
bool is_zero() const
Definition: fp2.hpp:89
libff::Fp4_model::zero
static Fp4_model< n, modulus > zero()
libff::Fp4_model
Definition: fp4.hpp:26
fp2.hpp
libff::Fp4_model::operator-
Fp4_model operator-() const
libff::Fp4_model::print
void print() const
Definition: fp4.hpp:63
libff::bigint
Definition: bigint.hpp:20
libff::operator^
bn128_GT operator^(const bn128_GT &rhs, const bigint< m > &lhs)
Definition: bn128_gt.hpp:45
libff::Fp4_model::is_zero
bool is_zero() const
Definition: fp4.hpp:79
libff::Fp4_model::mul_by_023
Fp4_model mul_by_023(const Fp4_model &other) const
libff::Fp4_model::operator+
Fp4_model operator+(const Fp4_model &other) const
libff::Fp_model
Definition: fp.hpp:20
libff::Fp4_model::Fp4_model
Fp4_model(const my_Fp2 &c0, const my_Fp2 &c1)
Definition: fp4.hpp:56
libff::Fp4_model::extension_degree
static constexpr size_t extension_degree()
Definition: fp4.hpp:100
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::Fp4_model::clear
void clear()
Definition: fp4.hpp:69
libff::Fp2_model
Definition: fp2.hpp:18
libff::Fp2_model::print
void print() const
Definition: fp2.hpp:78
libff::Fp4_model::base_field_char
static bigint< n > base_field_char()
Definition: fp4.hpp:99
libff::Fp4_model::squared
Fp4_model squared() const
libff::power
FieldT power(const FieldT &base, const bigint< m > &exponent)
libff::Fp4_model::Frobenius_coeffs_c1
static my_Fp Frobenius_coeffs_c1[4]
non_residue^((modulus^i-1)/4) for i=0,1,2,3
Definition: fp4.hpp:52
libff::Fp2_model::clear
void clear()
Definition: fp2.hpp:73
libff::Fp4_model::one
static Fp4_model< n, modulus > one()
libff::Fp4_model::random_element
static Fp4_model< n, modulus > random_element()