Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
fp4_gadgets.hpp
Go to the documentation of this file.
1 
15 #ifndef FP4_GADGETS_HPP_
16 #define FP4_GADGETS_HPP_
17 
20 
21 namespace libsnark
22 {
23 
27 template<typename Fp4T> class Fp4_variable : public gadget<typename Fp4T::my_Fp>
28 {
29 public:
30  typedef typename Fp4T::my_Fp FieldT;
31  typedef typename Fp4T::my_Fpe Fp2T;
32 
35 
39  const Fp4T &el,
40  const std::string &annotation_prefix);
43  const Fp2_variable<Fp2T> &c0,
44  const Fp2_variable<Fp2T> &c1,
45  const std::string &annotation_prefix);
46  void generate_r1cs_equals_const_constraints(const Fp4T &el);
47  void generate_r1cs_witness(const Fp4T &el);
48  Fp4T get_element();
49 
50  Fp4_variable<Fp4T> Frobenius_map(const size_t power) const;
51  void evaluate() const;
52 };
53 
57 template<typename Fp4T>
58 class Fp4_tower_mul_gadget : public gadget<typename Fp4T::my_Fp>
59 {
60 public:
61  typedef typename Fp4T::my_Fp FieldT;
62  typedef typename Fp4T::my_Fpe Fp2T;
63 
67 
70 
73  std::shared_ptr<Fp2_variable<Fp2T>> Ac0_plus_Ac1;
74 
75  std::shared_ptr<Fp2_variable<Fp2T>> v0;
76  std::shared_ptr<Fp2_variable<Fp2T>> v1;
77 
80  std::shared_ptr<Fp2_variable<Fp2T>> Bc0_plus_Bc1;
81 
84 
85  std::shared_ptr<Fp2_variable<Fp2T>> result_c1_plus_v0_plus_v1;
86 
87  std::shared_ptr<Fp2_mul_gadget<Fp2T>> compute_v0;
88  std::shared_ptr<Fp2_mul_gadget<Fp2T>> compute_v1;
89  std::shared_ptr<Fp2_mul_gadget<Fp2T>> compute_result_c1;
90 
93  const Fp4_variable<Fp4T> &A,
94  const Fp4_variable<Fp4T> &B,
96  const std::string &annotation_prefix);
98  void generate_r1cs_witness();
99 };
100 
104 template<typename Fp4T>
105 class Fp4_direct_mul_gadget : public gadget<typename Fp4T::my_Fp>
106 {
107 public:
108  typedef typename Fp4T::my_Fp FieldT;
109  typedef typename Fp4T::my_Fpe Fp2T;
110 
114 
118 
121  const Fp4_variable<Fp4T> &A,
122  const Fp4_variable<Fp4T> &B,
123  const Fp4_variable<Fp4T> &result,
124  const std::string &annotation_prefix);
126  void generate_r1cs_witness();
127 };
128 
132 template<typename Fp4T> using Fp4_mul_gadget = Fp4_direct_mul_gadget<Fp4T>;
133 
137 template<typename Fp4T>
138 class Fp4_sqr_gadget : public gadget<typename Fp4T::my_Fp>
139 {
140 public:
141  typedef typename Fp4T::my_Fp FieldT;
142  typedef typename Fp4T::my_Fpe Fp2T;
143 
146 
147  std::shared_ptr<Fp2_variable<Fp2T>> v1;
148 
151  std::shared_ptr<Fp2_variable<Fp2T>> v0;
152 
153  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_v0;
154  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_v1;
155 
158  std::shared_ptr<Fp2_variable<Fp2T>> Ac0_plus_Ac1;
159 
162 
163  std::shared_ptr<Fp2_variable<Fp2T>> result_c1_plus_v0_plus_v1;
164 
165  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_result_c1;
166 
169  const Fp4_variable<Fp4T> &A,
170  const Fp4_variable<Fp4T> &result,
171  const std::string &annotation_prefix);
173  void generate_r1cs_witness();
174 };
175 
179 template<typename Fp4T>
180 class Fp4_cyclotomic_sqr_gadget : public gadget<typename Fp4T::my_Fp>
181 {
182 public:
183  /*
184  */
185  typedef typename Fp4T::my_Fp FieldT;
186  typedef typename Fp4T::my_Fpe Fp2T;
187 
190 
193  std::shared_ptr<Fp2_variable<Fp2T>> c0_expr;
194  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_c0_expr;
195 
198  std::shared_ptr<Fp2_variable<Fp2T>> A_c0_plus_A_c1;
199 
202  std::shared_ptr<Fp2_variable<Fp2T>> c1_expr;
203  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_c1_expr;
204 
207  const Fp4_variable<Fp4T> &A,
208  const Fp4_variable<Fp4T> &result,
209  const std::string &annotation_prefix);
211  void generate_r1cs_witness();
212 };
213 
214 } // namespace libsnark
215 
217 
218 #endif // FP4_GADGETS_HPP_
libsnark::Fp4_sqr_gadget::compute_v1
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_v1
Definition: fp4_gadgets.hpp:154
libsnark::Fp4_sqr_gadget::Ac0_plus_Ac1
std::shared_ptr< Fp2_variable< Fp2T > > Ac0_plus_Ac1
Definition: fp4_gadgets.hpp:158
libsnark::Fp4_cyclotomic_sqr_gadget::A
Fp4_variable< Fp4T > A
Definition: fp4_gadgets.hpp:188
libsnark::Fp4_cyclotomic_sqr_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp4_sqr_gadget::compute_result_c1
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_result_c1
Definition: fp4_gadgets.hpp:165
libsnark::Fp4_cyclotomic_sqr_gadget
Definition: fp4_gadgets.hpp:180
libsnark::Fp4_cyclotomic_sqr_gadget::c1_expr_c0
pb_linear_combination< FieldT > c1_expr_c0
Definition: fp4_gadgets.hpp:200
libsnark::Fp4_tower_mul_gadget::B
Fp4_variable< Fp4T > B
Definition: fp4_gadgets.hpp:65
libsnark::Fp4_cyclotomic_sqr_gadget::Fp4_cyclotomic_sqr_gadget
Fp4_cyclotomic_sqr_gadget(protoboard< FieldT > &pb, const Fp4_variable< Fp4T > &A, const Fp4_variable< Fp4T > &result, const std::string &annotation_prefix)
libsnark::Fp4_tower_mul_gadget::compute_result_c1
std::shared_ptr< Fp2_mul_gadget< Fp2T > > compute_result_c1
Definition: fp4_gadgets.hpp:89
libsnark::gadget< Fp4T::my_Fp >::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::Fp4_cyclotomic_sqr_gadget::FieldT
Fp4T::my_Fp FieldT
Definition: fp4_gadgets.hpp:185
libsnark::Fp4_variable::generate_r1cs_witness
void generate_r1cs_witness(const Fp4T &el)
libsnark
Definition: accumulation_vector.hpp:18
libsnark::Fp4_tower_mul_gadget::Ac0_plus_Ac1_c0
pb_linear_combination< FieldT > Ac0_plus_Ac1_c0
Definition: fp4_gadgets.hpp:71
libsnark::Fp4_sqr_gadget::v0_c1
pb_linear_combination< FieldT > v0_c1
Definition: fp4_gadgets.hpp:150
libsnark::Fp4_sqr_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp2_variable
Definition: fp2_gadgets.hpp:27
libsnark::Fp4_cyclotomic_sqr_gadget::A_c0_plus_A_c1
std::shared_ptr< Fp2_variable< Fp2T > > A_c0_plus_A_c1
Definition: fp4_gadgets.hpp:198
libsnark::Fp4_variable::FieldT
Fp4T::my_Fp FieldT
Definition: fp4_gadgets.hpp:30
libsnark::Fp4_cyclotomic_sqr_gadget::c0_expr
std::shared_ptr< Fp2_variable< Fp2T > > c0_expr
Definition: fp4_gadgets.hpp:193
fp2_gadgets.hpp
libsnark::gadget< Fp4T::my_Fp >::pb
protoboard< Fp4T::my_Fp > & pb
Definition: gadget.hpp:19
libsnark::Fp4_variable::c0
Fp2_variable< Fp2T > c0
Definition: fp4_gadgets.hpp:33
libsnark::Fp4_direct_mul_gadget::B
Fp4_variable< Fp4T > B
Definition: fp4_gadgets.hpp:112
libsnark::Fp4_direct_mul_gadget::A
Fp4_variable< Fp4T > A
Definition: fp4_gadgets.hpp:111
libsnark::Fp4_direct_mul_gadget::Fp2T
Fp4T::my_Fpe Fp2T
Definition: fp4_gadgets.hpp:109
libsnark::Fp4_cyclotomic_sqr_gadget::c0_expr_c0
pb_linear_combination< FieldT > c0_expr_c0
Definition: fp4_gadgets.hpp:191
libsnark::Fp4_sqr_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp4_direct_mul_gadget::Fp4_direct_mul_gadget
Fp4_direct_mul_gadget(protoboard< FieldT > &pb, const Fp4_variable< Fp4T > &A, const Fp4_variable< Fp4T > &B, const Fp4_variable< Fp4T > &result, const std::string &annotation_prefix)
libsnark::Fp4_sqr_gadget::result_c1_plus_v0_plus_v1
std::shared_ptr< Fp2_variable< Fp2T > > result_c1_plus_v0_plus_v1
Definition: fp4_gadgets.hpp:163
libsnark::Fp4_tower_mul_gadget::Bc0_plus_Bc1_c1
pb_linear_combination< FieldT > Bc0_plus_Bc1_c1
Definition: fp4_gadgets.hpp:79
libsnark::Fp4_sqr_gadget::result
Fp4_variable< Fp4T > result
Definition: fp4_gadgets.hpp:145
gadget.hpp
libsnark::Fp4_sqr_gadget::v1
std::shared_ptr< Fp2_variable< Fp2T > > v1
Definition: fp4_gadgets.hpp:147
libsnark::Fp4_variable::c1
Fp2_variable< Fp2T > c1
Definition: fp4_gadgets.hpp:34
fp4_gadgets.tcc
libsnark::Fp4_direct_mul_gadget
Definition: fp4_gadgets.hpp:105
libsnark::gadget
Definition: gadget.hpp:16
libsnark::Fp4_tower_mul_gadget::Bc0_plus_Bc1_c0
pb_linear_combination< FieldT > Bc0_plus_Bc1_c0
Definition: fp4_gadgets.hpp:78
libsnark::Fp4_sqr_gadget
Definition: fp4_gadgets.hpp:138
libsnark::Fp4_sqr_gadget::Ac0_plus_Ac1_c0
pb_linear_combination< FieldT > Ac0_plus_Ac1_c0
Definition: fp4_gadgets.hpp:156
libsnark::Fp4_tower_mul_gadget::result_c1_plus_v0_plus_v1_c1
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c1
Definition: fp4_gadgets.hpp:83
libsnark::Fp4_variable::Fp2T
Fp4T::my_Fpe Fp2T
Definition: fp4_gadgets.hpp:31
libsnark::Fp4_cyclotomic_sqr_gadget::c1_expr
std::shared_ptr< Fp2_variable< Fp2T > > c1_expr
Definition: fp4_gadgets.hpp:202
libsnark::Fp4_sqr_gadget::FieldT
Fp4T::my_Fp FieldT
Definition: fp4_gadgets.hpp:141
libsnark::Fp4_tower_mul_gadget::Bc0_plus_Bc1
std::shared_ptr< Fp2_variable< Fp2T > > Bc0_plus_Bc1
Definition: fp4_gadgets.hpp:80
libsnark::Fp4_variable::Fp4_variable
Fp4_variable(protoboard< FieldT > &pb, const std::string &annotation_prefix)
libsnark::Fp4_variable
Definition: fp4_gadgets.hpp:27
libsnark::Fp4_cyclotomic_sqr_gadget::A_c0_plus_A_c1_c0
pb_linear_combination< FieldT > A_c0_plus_A_c1_c0
Definition: fp4_gadgets.hpp:196
libsnark::Fp4_direct_mul_gadget::FieldT
Fp4T::my_Fp FieldT
Definition: fp4_gadgets.hpp:108
libsnark::Fp4_tower_mul_gadget::result
Fp4_variable< Fp4T > result
Definition: fp4_gadgets.hpp:66
libsnark::Fp4_tower_mul_gadget::Fp2T
Fp4T::my_Fpe Fp2T
Definition: fp4_gadgets.hpp:62
libsnark::Fp4_tower_mul_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp4_direct_mul_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp4_variable::generate_r1cs_equals_const_constraints
void generate_r1cs_equals_const_constraints(const Fp4T &el)
libsnark::Fp4_tower_mul_gadget::result_c1_plus_v0_plus_v1_c0
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c0
Definition: fp4_gadgets.hpp:82
gadgetlib2::power
FElem power(const FElem &base, long exponent)
Definition: variable.cpp:139
libsnark::Fp4_cyclotomic_sqr_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp4_sqr_gadget::compute_v0
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_v0
Definition: fp4_gadgets.hpp:153
libsnark::Fp4_cyclotomic_sqr_gadget::compute_c1_expr
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_c1_expr
Definition: fp4_gadgets.hpp:203
libsnark::Fp4_direct_mul_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp4_tower_mul_gadget::compute_v1
std::shared_ptr< Fp2_mul_gadget< Fp2T > > compute_v1
Definition: fp4_gadgets.hpp:88
libsnark::pb_linear_combination
Definition: pb_variable.hpp:101
libsnark::Fp4_sqr_gadget::Fp4_sqr_gadget
Fp4_sqr_gadget(protoboard< FieldT > &pb, const Fp4_variable< Fp4T > &A, const Fp4_variable< Fp4T > &result, const std::string &annotation_prefix)
libsnark::Fp4_cyclotomic_sqr_gadget::compute_c0_expr
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_c0_expr
Definition: fp4_gadgets.hpp:194
libsnark::Fp4_sqr_gadget::Fp2T
Fp4T::my_Fpe Fp2T
Definition: fp4_gadgets.hpp:142
libsnark::Fp4_variable::get_element
Fp4T get_element()
libsnark::Fp4_sqr_gadget::A
Fp4_variable< Fp4T > A
Definition: fp4_gadgets.hpp:144
libsnark::Fp4_cyclotomic_sqr_gadget::c0_expr_c1
pb_linear_combination< FieldT > c0_expr_c1
Definition: fp4_gadgets.hpp:192
libsnark::Fp4_sqr_gadget::Ac0_plus_Ac1_c1
pb_linear_combination< FieldT > Ac0_plus_Ac1_c1
Definition: fp4_gadgets.hpp:157
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::Fp4_tower_mul_gadget
Definition: fp4_gadgets.hpp:58
libsnark::Fp4_sqr_gadget::result_c1_plus_v0_plus_v1_c0
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c0
Definition: fp4_gadgets.hpp:160
libsnark::Fp4_cyclotomic_sqr_gadget::Fp2T
Fp4T::my_Fpe Fp2T
Definition: fp4_gadgets.hpp:186
libsnark::Fp4_tower_mul_gadget::v0
std::shared_ptr< Fp2_variable< Fp2T > > v0
Definition: fp4_gadgets.hpp:75
libsnark::Fp4_direct_mul_gadget::v1
pb_variable< FieldT > v1
Definition: fp4_gadgets.hpp:115
libsnark::Fp4_cyclotomic_sqr_gadget::A_c0_plus_A_c1_c1
pb_linear_combination< FieldT > A_c0_plus_A_c1_c1
Definition: fp4_gadgets.hpp:197
libsnark::Fp4_tower_mul_gadget::A
Fp4_variable< Fp4T > A
Definition: fp4_gadgets.hpp:64
libsnark::Fp4_direct_mul_gadget::result
Fp4_variable< Fp4T > result
Definition: fp4_gadgets.hpp:113
libsnark::Fp4_tower_mul_gadget::result_c1_plus_v0_plus_v1
std::shared_ptr< Fp2_variable< Fp2T > > result_c1_plus_v0_plus_v1
Definition: fp4_gadgets.hpp:85
libsnark::Fp4_sqr_gadget::result_c1_plus_v0_plus_v1_c1
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c1
Definition: fp4_gadgets.hpp:161
libsnark::Fp4_tower_mul_gadget::compute_v0
std::shared_ptr< Fp2_mul_gadget< Fp2T > > compute_v0
Definition: fp4_gadgets.hpp:87
libsnark::Fp4_cyclotomic_sqr_gadget::result
Fp4_variable< Fp4T > result
Definition: fp4_gadgets.hpp:189
libsnark::Fp4_sqr_gadget::v0_c0
pb_linear_combination< FieldT > v0_c0
Definition: fp4_gadgets.hpp:149
libsnark::Fp4_direct_mul_gadget::v2
pb_variable< FieldT > v2
Definition: fp4_gadgets.hpp:116
libsnark::Fp4_tower_mul_gadget::v0_c0
pb_linear_combination< FieldT > v0_c0
Definition: fp4_gadgets.hpp:68
libsnark::Fp4_variable::evaluate
void evaluate() const
libsnark::Fp4_sqr_gadget::v0
std::shared_ptr< Fp2_variable< Fp2T > > v0
Definition: fp4_gadgets.hpp:151
libsnark::Fp4_tower_mul_gadget::Fp4_tower_mul_gadget
Fp4_tower_mul_gadget(protoboard< FieldT > &pb, const Fp4_variable< Fp4T > &A, const Fp4_variable< Fp4T > &B, const Fp4_variable< Fp4T > &result, const std::string &annotation_prefix)
libsnark::Fp4_tower_mul_gadget::Ac0_plus_Ac1
std::shared_ptr< Fp2_variable< Fp2T > > Ac0_plus_Ac1
Definition: fp4_gadgets.hpp:73
libsnark::Fp4_tower_mul_gadget::v0_c1
pb_linear_combination< FieldT > v0_c1
Definition: fp4_gadgets.hpp:69
libsnark::Fp4_tower_mul_gadget::Ac0_plus_Ac1_c1
pb_linear_combination< FieldT > Ac0_plus_Ac1_c1
Definition: fp4_gadgets.hpp:72
libsnark::Fp4_cyclotomic_sqr_gadget::c1_expr_c1
pb_linear_combination< FieldT > c1_expr_c1
Definition: fp4_gadgets.hpp:201
libsnark::Fp4_variable::Frobenius_map
Fp4_variable< Fp4T > Frobenius_map(const size_t power) const
libsnark::Fp4_tower_mul_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp4_tower_mul_gadget::v1
std::shared_ptr< Fp2_variable< Fp2T > > v1
Definition: fp4_gadgets.hpp:76
libsnark::Fp4_direct_mul_gadget::v6
pb_variable< FieldT > v6
Definition: fp4_gadgets.hpp:117
libsnark::Fp4_tower_mul_gadget::FieldT
Fp4T::my_Fp FieldT
Definition: fp4_gadgets.hpp:61
libsnark::protoboard
Definition: pb_variable.hpp:22