Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
fp6_2over3_gadgets.hpp
Go to the documentation of this file.
1 
15 #ifndef FP6_GADGETS_HPP_
16 #define FP6_GADGETS_HPP_
17 
21 
22 namespace libsnark
23 {
24 
28 template<typename Fp6T>
29 class Fp6_2over3_variable : public gadget<typename Fp6T::my_Fp>
30 {
31 public:
32  typedef typename Fp6T::my_Fp FieldT;
33  typedef typename Fp6T::my_Fpe Fp3T;
34 
37 
39  protoboard<FieldT> &pb, const std::string &annotation_prefix);
42  const Fp6T &el,
43  const std::string &annotation_prefix);
46  const Fp3_variable<Fp3T> &c0,
47  const Fp3_variable<Fp3T> &c1,
48  const std::string &annotation_prefix);
49  void generate_r1cs_equals_const_constraints(const Fp6T &el);
50  void generate_r1cs_witness(const Fp6T &el);
51  Fp6T get_element();
52  Fp6_2over3_variable<Fp6T> Frobenius_map(const size_t power) const;
53  void evaluate() const;
54 };
55 
59 template<typename Fp6T>
60 class Fp6_2over3_mul_gadget : public gadget<typename Fp6T::my_Fp>
61 {
62 public:
63  typedef typename Fp6T::my_Fp FieldT;
64  typedef typename Fp6T::my_Fpe Fp3T;
65 
69 
73 
77  std::shared_ptr<Fp3_variable<Fp3T>> Ac0_plus_Ac1;
78 
79  std::shared_ptr<Fp3_variable<Fp3T>> v0;
80  std::shared_ptr<Fp3_variable<Fp3T>> v1;
81 
85  std::shared_ptr<Fp3_variable<Fp3T>> Bc0_plus_Bc1;
86 
90  std::shared_ptr<Fp3_variable<Fp3T>> result_c1_plus_v0_plus_v1;
91 
92  std::shared_ptr<Fp3_mul_gadget<Fp3T>> compute_v0;
93  std::shared_ptr<Fp3_mul_gadget<Fp3T>> compute_v1;
94  std::shared_ptr<Fp3_mul_gadget<Fp3T>> compute_result_c1;
95 
101  const std::string &annotation_prefix);
103  void generate_r1cs_witness();
104 };
105 
110 template<typename Fp6T>
111 class Fp6_2over3_mul_by_2345_gadget : public gadget<typename Fp6T::my_Fp>
112 {
113 public:
114  typedef typename Fp6T::my_Fp FieldT;
115  typedef typename Fp6T::my_Fpe Fp3T;
116 
120 
124 
128  std::shared_ptr<Fp3_variable<Fp3T>> Ac0_plus_Ac1;
129 
130  std::shared_ptr<Fp3_variable<Fp3T>> v0;
131  std::shared_ptr<Fp3_variable<Fp3T>> v1;
132 
136  std::shared_ptr<Fp3_variable<Fp3T>> Bc0_plus_Bc1;
137 
141  std::shared_ptr<Fp3_variable<Fp3T>> result_c1_plus_v0_plus_v1;
142 
143  std::shared_ptr<Fp3_mul_gadget<Fp3T>> compute_v1;
144  std::shared_ptr<Fp3_mul_gadget<Fp3T>> compute_result_c1;
145 
151  const std::string &annotation_prefix);
153  void generate_r1cs_witness();
154 };
155 
159 template<typename Fp6T>
160 class Fp6_2over3_sqr_gadget : public gadget<typename Fp6T::my_Fp>
161 {
162 public:
163  typedef typename Fp6T::my_Fp FieldT;
164 
167 
168  std::shared_ptr<Fp6_2over3_mul_gadget<Fp6T>> mul;
169 
174  const std::string &annotation_prefix);
176  void generate_r1cs_witness();
177 };
178 
182 template<typename Fp6T>
183 class Fp6_2over3_cyclotomic_sqr_gadget : public gadget<typename Fp6T::my_Fp>
184 {
185 public:
186  typedef typename Fp6T::my_Fp FieldT;
187  typedef typename Fp6T::my_Fp2 Fp2T;
188 
191 
192  std::shared_ptr<Fp2_variable<Fp2T>> a;
193  std::shared_ptr<Fp2_variable<Fp2T>> b;
194  std::shared_ptr<Fp2_variable<Fp2T>> c;
195 
198 
201 
204 
205  std::shared_ptr<Fp2_variable<Fp2T>> asq;
206  std::shared_ptr<Fp2_variable<Fp2T>> bsq;
207  std::shared_ptr<Fp2_variable<Fp2T>> csq;
208 
209  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_asq;
210  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_bsq;
211  std::shared_ptr<Fp2_sqr_gadget<Fp2T>> compute_csq;
212 
217  const std::string &annotation_prefix);
219  void generate_r1cs_witness();
220 };
221 
222 } // namespace libsnark
223 
225 
226 #endif // FP6_GADGETS_HPP_
libsnark::Fp6_2over3_mul_gadget::Ac0_plus_Ac1_c0
pb_linear_combination< FieldT > Ac0_plus_Ac1_c0
Definition: fp6_2over3_gadgets.hpp:74
libsnark::Fp6_2over3_mul_by_2345_gadget::FieldT
Fp6T::my_Fp FieldT
Definition: fp6_2over3_gadgets.hpp:114
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::csq
std::shared_ptr< Fp2_variable< Fp2T > > csq
Definition: fp6_2over3_gadgets.hpp:207
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::asq_c1
pb_linear_combination< FieldT > asq_c1
Definition: fp6_2over3_gadgets.hpp:197
libsnark::Fp6_2over3_mul_gadget::B
Fp6_2over3_variable< Fp6T > B
Definition: fp6_2over3_gadgets.hpp:67
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::result
Fp6_2over3_variable< Fp6T > result
Definition: fp6_2over3_gadgets.hpp:190
libsnark::gadget< Fp6T::my_Fp >::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::Fp6_2over3_mul_gadget::v0_c1
pb_linear_combination< FieldT > v0_c1
Definition: fp6_2over3_gadgets.hpp:71
libsnark::Fp6_2over3_variable::Fp3T
Fp6T::my_Fpe Fp3T
Definition: fp6_2over3_gadgets.hpp:33
libsnark::Fp6_2over3_mul_gadget::Bc0_plus_Bc1
std::shared_ptr< Fp3_variable< Fp3T > > Bc0_plus_Bc1
Definition: fp6_2over3_gadgets.hpp:85
libsnark::Fp6_2over3_mul_gadget::v0
std::shared_ptr< Fp3_variable< Fp3T > > v0
Definition: fp6_2over3_gadgets.hpp:79
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::a
std::shared_ptr< Fp2_variable< Fp2T > > a
Definition: fp6_2over3_gadgets.hpp:192
libsnark
Definition: accumulation_vector.hpp:18
libsnark::Fp6_2over3_mul_by_2345_gadget::B
Fp6_2over3_variable< Fp6T > B
Definition: fp6_2over3_gadgets.hpp:118
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::b
std::shared_ptr< Fp2_variable< Fp2T > > b
Definition: fp6_2over3_gadgets.hpp:193
libsnark::Fp6_2over3_mul_by_2345_gadget::Bc0_plus_Bc1_c0
pb_linear_combination< FieldT > Bc0_plus_Bc1_c0
Definition: fp6_2over3_gadgets.hpp:133
fp3_gadgets.hpp
fp2_gadgets.hpp
fp6_2over3_gadgets.tcc
libsnark::Fp6_2over3_mul_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::gadget< Fp6T::my_Fp >::pb
protoboard< Fp6T::my_Fp > & pb
Definition: gadget.hpp:19
libsnark::Fp6_2over3_sqr_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp6_2over3_mul_gadget::v1
std::shared_ptr< Fp3_variable< Fp3T > > v1
Definition: fp6_2over3_gadgets.hpp:80
libsnark::Fp6_2over3_mul_by_2345_gadget::v0_c1
pb_linear_combination< FieldT > v0_c1
Definition: fp6_2over3_gadgets.hpp:122
libsnark::Fp6_2over3_mul_gadget::compute_v0
std::shared_ptr< Fp3_mul_gadget< Fp3T > > compute_v0
Definition: fp6_2over3_gadgets.hpp:92
libsnark::Fp6_2over3_mul_gadget
Definition: fp6_2over3_gadgets.hpp:60
libsnark::Fp6_2over3_mul_gadget::result_c1_plus_v0_plus_v1_c1
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c1
Definition: fp6_2over3_gadgets.hpp:88
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::FieldT
Fp6T::my_Fp FieldT
Definition: fp6_2over3_gadgets.hpp:186
gadget.hpp
libsnark::Fp6_2over3_mul_gadget::Bc0_plus_Bc1_c0
pb_linear_combination< FieldT > Bc0_plus_Bc1_c0
Definition: fp6_2over3_gadgets.hpp:82
libsnark::Fp6_2over3_mul_by_2345_gadget::A
Fp6_2over3_variable< Fp6T > A
Definition: fp6_2over3_gadgets.hpp:117
libsnark::Fp6_2over3_mul_gadget::compute_v1
std::shared_ptr< Fp3_mul_gadget< Fp3T > > compute_v1
Definition: fp6_2over3_gadgets.hpp:93
libsnark::Fp6_2over3_mul_gadget::result_c1_plus_v0_plus_v1_c0
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c0
Definition: fp6_2over3_gadgets.hpp:87
libsnark::Fp6_2over3_mul_by_2345_gadget::Ac0_plus_Ac1_c1
pb_linear_combination< FieldT > Ac0_plus_Ac1_c1
Definition: fp6_2over3_gadgets.hpp:126
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::Fp2T
Fp6T::my_Fp2 Fp2T
Definition: fp6_2over3_gadgets.hpp:187
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::csq_c0
pb_linear_combination< FieldT > csq_c0
Definition: fp6_2over3_gadgets.hpp:202
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp6_2over3_variable::get_element
Fp6T get_element()
libsnark::Fp6_2over3_mul_by_2345_gadget::Ac0_plus_Ac1
std::shared_ptr< Fp3_variable< Fp3T > > Ac0_plus_Ac1
Definition: fp6_2over3_gadgets.hpp:128
libsnark::gadget
Definition: gadget.hpp:16
libsnark::Fp6_2over3_mul_by_2345_gadget::Bc0_plus_Bc1
std::shared_ptr< Fp3_variable< Fp3T > > Bc0_plus_Bc1
Definition: fp6_2over3_gadgets.hpp:136
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::bsq_c1
pb_linear_combination< FieldT > bsq_c1
Definition: fp6_2over3_gadgets.hpp:200
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::A
Fp6_2over3_variable< Fp6T > A
Definition: fp6_2over3_gadgets.hpp:189
libsnark::Fp6_2over3_mul_gadget::result_c1_plus_v0_plus_v1_c2
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c2
Definition: fp6_2over3_gadgets.hpp:89
libsnark::Fp6_2over3_sqr_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp6_2over3_mul_gadget::compute_result_c1
std::shared_ptr< Fp3_mul_gadget< Fp3T > > compute_result_c1
Definition: fp6_2over3_gadgets.hpp:94
libsnark::Fp6_2over3_mul_by_2345_gadget::v1
std::shared_ptr< Fp3_variable< Fp3T > > v1
Definition: fp6_2over3_gadgets.hpp:131
libsnark::Fp6_2over3_mul_gadget::Fp6_2over3_mul_gadget
Fp6_2over3_mul_gadget(protoboard< FieldT > &pb, const Fp6_2over3_variable< Fp6T > &A, const Fp6_2over3_variable< Fp6T > &B, const Fp6_2over3_variable< Fp6T > &result, const std::string &annotation_prefix)
libsnark::Fp6_2over3_mul_by_2345_gadget::result_c1_plus_v0_plus_v1_c1
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c1
Definition: fp6_2over3_gadgets.hpp:139
libsnark::Fp6_2over3_variable::Fp6_2over3_variable
Fp6_2over3_variable(protoboard< FieldT > &pb, const std::string &annotation_prefix)
libsnark::Fp6_2over3_variable::generate_r1cs_equals_const_constraints
void generate_r1cs_equals_const_constraints(const Fp6T &el)
libsnark::Fp6_2over3_mul_by_2345_gadget::result
Fp6_2over3_variable< Fp6T > result
Definition: fp6_2over3_gadgets.hpp:119
libsnark::Fp6_2over3_mul_gadget::result
Fp6_2over3_variable< Fp6T > result
Definition: fp6_2over3_gadgets.hpp:68
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::compute_csq
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_csq
Definition: fp6_2over3_gadgets.hpp:211
libsnark::Fp6_2over3_mul_by_2345_gadget::Bc0_plus_Bc1_c1
pb_linear_combination< FieldT > Bc0_plus_Bc1_c1
Definition: fp6_2over3_gadgets.hpp:134
libsnark::Fp6_2over3_mul_by_2345_gadget::Fp3T
Fp6T::my_Fpe Fp3T
Definition: fp6_2over3_gadgets.hpp:115
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::bsq
std::shared_ptr< Fp2_variable< Fp2T > > bsq
Definition: fp6_2over3_gadgets.hpp:206
libsnark::Fp6_2over3_mul_by_2345_gadget::Fp6_2over3_mul_by_2345_gadget
Fp6_2over3_mul_by_2345_gadget(protoboard< FieldT > &pb, const Fp6_2over3_variable< Fp6T > &A, const Fp6_2over3_variable< Fp6T > &B, const Fp6_2over3_variable< Fp6T > &result, const std::string &annotation_prefix)
libsnark::Fp6_2over3_mul_by_2345_gadget::result_c1_plus_v0_plus_v1
std::shared_ptr< Fp3_variable< Fp3T > > result_c1_plus_v0_plus_v1
Definition: fp6_2over3_gadgets.hpp:141
gadgetlib2::power
FElem power(const FElem &base, long exponent)
Definition: variable.cpp:139
libsnark::Fp6_2over3_mul_by_2345_gadget::Ac0_plus_Ac1_c0
pb_linear_combination< FieldT > Ac0_plus_Ac1_c0
Definition: fp6_2over3_gadgets.hpp:125
libsnark::Fp6_2over3_mul_by_2345_gadget
Definition: fp6_2over3_gadgets.hpp:111
libsnark::Fp6_2over3_mul_gadget::Bc0_plus_Bc1_c1
pb_linear_combination< FieldT > Bc0_plus_Bc1_c1
Definition: fp6_2over3_gadgets.hpp:83
libsnark::Fp6_2over3_mul_gadget::Fp3T
Fp6T::my_Fpe Fp3T
Definition: fp6_2over3_gadgets.hpp:64
libsnark::Fp6_2over3_sqr_gadget::FieldT
Fp6T::my_Fp FieldT
Definition: fp6_2over3_gadgets.hpp:163
libsnark::Fp6_2over3_mul_by_2345_gadget::Ac0_plus_Ac1_c2
pb_linear_combination< FieldT > Ac0_plus_Ac1_c2
Definition: fp6_2over3_gadgets.hpp:127
libsnark::Fp6_2over3_mul_by_2345_gadget::result_c1_plus_v0_plus_v1_c2
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c2
Definition: fp6_2over3_gadgets.hpp:140
libsnark::pb_linear_combination
Definition: pb_variable.hpp:101
libsnark::Fp6_2over3_variable::evaluate
void evaluate() const
libsnark::Fp6_2over3_mul_by_2345_gadget::v0_c2
pb_linear_combination< FieldT > v0_c2
Definition: fp6_2over3_gadgets.hpp:123
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::compute_asq
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_asq
Definition: fp6_2over3_gadgets.hpp:209
libsnark::Fp6_2over3_mul_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::csq_c1
pb_linear_combination< FieldT > csq_c1
Definition: fp6_2over3_gadgets.hpp:203
libsnark::Fp6_2over3_mul_gadget::v0_c2
pb_linear_combination< FieldT > v0_c2
Definition: fp6_2over3_gadgets.hpp:72
libsnark::Fp6_2over3_mul_by_2345_gadget::compute_result_c1
std::shared_ptr< Fp3_mul_gadget< Fp3T > > compute_result_c1
Definition: fp6_2over3_gadgets.hpp:144
libsnark::Fp6_2over3_variable::Frobenius_map
Fp6_2over3_variable< Fp6T > Frobenius_map(const size_t power) const
libsnark::Fp6_2over3_mul_by_2345_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::Fp6_2over3_mul_gadget::Bc0_plus_Bc1_c2
pb_linear_combination< FieldT > Bc0_plus_Bc1_c2
Definition: fp6_2over3_gadgets.hpp:84
libsnark::Fp6_2over3_mul_gadget::Ac0_plus_Ac1
std::shared_ptr< Fp3_variable< Fp3T > > Ac0_plus_Ac1
Definition: fp6_2over3_gadgets.hpp:77
libsnark::Fp6_2over3_mul_gadget::FieldT
Fp6T::my_Fp FieldT
Definition: fp6_2over3_gadgets.hpp:63
libsnark::Fp6_2over3_sqr_gadget::mul
std::shared_ptr< Fp6_2over3_mul_gadget< Fp6T > > mul
Definition: fp6_2over3_gadgets.hpp:168
libsnark::Fp6_2over3_sqr_gadget::A
Fp6_2over3_variable< Fp6T > A
Definition: fp6_2over3_gadgets.hpp:165
libsnark::Fp6_2over3_mul_gadget::v0_c0
pb_linear_combination< FieldT > v0_c0
Definition: fp6_2over3_gadgets.hpp:70
libsnark::Fp6_2over3_sqr_gadget::Fp6_2over3_sqr_gadget
Fp6_2over3_sqr_gadget(protoboard< FieldT > &pb, const Fp6_2over3_variable< Fp6T > &A, const Fp6_2over3_variable< Fp6T > &result, const std::string &annotation_prefix)
libsnark::Fp6_2over3_mul_by_2345_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::compute_bsq
std::shared_ptr< Fp2_sqr_gadget< Fp2T > > compute_bsq
Definition: fp6_2over3_gadgets.hpp:210
libsnark::Fp6_2over3_variable::c1
Fp3_variable< Fp3T > c1
Definition: fp6_2over3_gadgets.hpp:36
libsnark::Fp6_2over3_sqr_gadget::result
Fp6_2over3_variable< Fp6T > result
Definition: fp6_2over3_gadgets.hpp:166
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::Fp3_variable
Definition: fp3_gadgets.hpp:27
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::c
std::shared_ptr< Fp2_variable< Fp2T > > c
Definition: fp6_2over3_gadgets.hpp:194
libsnark::Fp6_2over3_mul_by_2345_gadget::result_c1_plus_v0_plus_v1_c0
pb_linear_combination< FieldT > result_c1_plus_v0_plus_v1_c0
Definition: fp6_2over3_gadgets.hpp:138
libsnark::Fp6_2over3_variable::FieldT
Fp6T::my_Fp FieldT
Definition: fp6_2over3_gadgets.hpp:32
libsnark::Fp6_2over3_sqr_gadget
Definition: fp6_2over3_gadgets.hpp:160
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::asq_c0
pb_linear_combination< FieldT > asq_c0
Definition: fp6_2over3_gadgets.hpp:196
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::asq
std::shared_ptr< Fp2_variable< Fp2T > > asq
Definition: fp6_2over3_gadgets.hpp:205
libsnark::Fp6_2over3_mul_by_2345_gadget::v0
std::shared_ptr< Fp3_variable< Fp3T > > v0
Definition: fp6_2over3_gadgets.hpp:130
libsnark::Fp6_2over3_mul_by_2345_gadget::compute_v1
std::shared_ptr< Fp3_mul_gadget< Fp3T > > compute_v1
Definition: fp6_2over3_gadgets.hpp:143
libsnark::Fp6_2over3_mul_by_2345_gadget::Bc0_plus_Bc1_c2
pb_linear_combination< FieldT > Bc0_plus_Bc1_c2
Definition: fp6_2over3_gadgets.hpp:135
libsnark::Fp6_2over3_mul_gadget::Ac0_plus_Ac1_c2
pb_linear_combination< FieldT > Ac0_plus_Ac1_c2
Definition: fp6_2over3_gadgets.hpp:76
libsnark::Fp6_2over3_mul_by_2345_gadget::v0_c0
pb_linear_combination< FieldT > v0_c0
Definition: fp6_2over3_gadgets.hpp:121
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::bsq_c0
pb_linear_combination< FieldT > bsq_c0
Definition: fp6_2over3_gadgets.hpp:199
libsnark::Fp6_2over3_mul_gadget::Ac0_plus_Ac1_c1
pb_linear_combination< FieldT > Ac0_plus_Ac1_c1
Definition: fp6_2over3_gadgets.hpp:75
libsnark::Fp6_2over3_variable::generate_r1cs_witness
void generate_r1cs_witness(const Fp6T &el)
libsnark::Fp6_2over3_cyclotomic_sqr_gadget::Fp6_2over3_cyclotomic_sqr_gadget
Fp6_2over3_cyclotomic_sqr_gadget(protoboard< FieldT > &pb, const Fp6_2over3_variable< Fp6T > &A, const Fp6_2over3_variable< Fp6T > &result, const std::string &annotation_prefix)
libsnark::Fp6_2over3_variable::c0
Fp3_variable< Fp3T > c0
Definition: fp6_2over3_gadgets.hpp:35
libsnark::Fp6_2over3_mul_gadget::A
Fp6_2over3_variable< Fp6T > A
Definition: fp6_2over3_gadgets.hpp:66
libsnark::Fp6_2over3_mul_gadget::result_c1_plus_v0_plus_v1
std::shared_ptr< Fp3_variable< Fp3T > > result_c1_plus_v0_plus_v1
Definition: fp6_2over3_gadgets.hpp:90
libsnark::Fp6_2over3_variable
Definition: fp6_2over3_gadgets.hpp:29
libsnark::protoboard
Definition: pb_variable.hpp:22
libsnark::Fp6_2over3_cyclotomic_sqr_gadget
Definition: fp6_2over3_gadgets.hpp:183