48 #ifndef CRYPTO3_ZK_R1CS_TO_QAP_BASIC_POLICY_HPP
49 #define CRYPTO3_ZK_R1CS_TO_QAP_BASIC_POLICY_HPP
64 namespace reductions {
65 template<
typename FieldType>
83 const std::shared_ptr<math::evaluation_domain<FieldType>> domain =
86 std::vector<std::map<std::size_t, typename FieldType::value_type>> A_in_Lagrange_basis(
88 std::vector<std::map<std::size_t, typename FieldType::value_type>> B_in_Lagrange_basis(
90 std::vector<std::map<std::size_t, typename FieldType::value_type>> C_in_Lagrange_basis(
98 for (std::size_t i = 0; i <= cs.
num_inputs(); ++i) {
99 A_in_Lagrange_basis[i][cs.
num_constraints() + i] = FieldType::value_type::one();
103 for (std::size_t j = 0; j < cs.
constraints[i].a.terms.size(); ++j) {
104 A_in_Lagrange_basis[cs.
constraints[i].a.terms[j].index][i] +=
108 for (std::size_t j = 0; j < cs.
constraints[i].b.terms.size(); ++j) {
109 B_in_Lagrange_basis[cs.
constraints[i].b.terms[j].index][i] +=
113 for (std::size_t j = 0; j < cs.
constraints[i].c.terms.size(); ++j) {
114 C_in_Lagrange_basis[cs.
constraints[i].c.terms[j].index][i] +=
141 const typename FieldType::value_type &t) {
142 const std::shared_ptr<math::evaluation_domain<FieldType>> domain =
145 std::vector<typename FieldType::value_type> At, Bt, Ct, Ht;
147 At.resize(cs.
num_variables() + 1, FieldType::value_type::zero());
148 Bt.resize(cs.
num_variables() + 1, FieldType::value_type::zero());
149 Ct.resize(cs.
num_variables() + 1, FieldType::value_type::zero());
150 Ht.reserve(domain->m + 1);
152 const typename FieldType::value_type Zt = domain->compute_vanishing_polynomial(t);
154 const std::vector<typename FieldType::value_type> u =
155 domain->evaluate_all_lagrange_polynomials(t);
161 for (std::size_t i = 0; i <= cs.
num_inputs(); ++i) {
166 for (std::size_t j = 0; j < cs.
constraints[i].a.terms.size(); ++j) {
170 for (std::size_t j = 0; j < cs.
constraints[i].b.terms.size(); ++j) {
174 for (std::size_t j = 0; j < cs.
constraints[i].c.terms.size(); ++j) {
179 typename FieldType::value_type ti = FieldType::value_type::one();
180 for (std::size_t i = 0; i < domain->m + 1; ++i) {
224 const typename FieldType::value_type &d1,
225 const typename FieldType::value_type &d2,
226 const typename FieldType::value_type &d3) {
228 assert(cs.
is_satisfied(primary_input, auxiliary_input));
230 const std::shared_ptr<math::evaluation_domain<FieldType>> domain =
234 full_variable_assignment.insert(full_variable_assignment.end(), auxiliary_input.begin(),
235 auxiliary_input.end());
237 std::vector<typename FieldType::value_type> aA(domain->m, FieldType::value_type::zero()),
238 aB(domain->m, FieldType::value_type::zero());
241 for (std::size_t i = 0; i <= cs.
num_inputs(); ++i) {
243 (i > 0 ? full_variable_assignment[i - 1] : FieldType::value_type::one());
247 aA[i] += cs.
constraints[i].a.evaluate(full_variable_assignment);
248 aB[i] += cs.
constraints[i].b.evaluate(full_variable_assignment);
251 domain->inverse_fft(aA);
253 domain->inverse_fft(aB);
255 std::vector<typename FieldType::value_type> coefficients_for_H(
256 domain->m + 1, FieldType::value_type::zero());
258 #pragma omp parallel for
261 for (std::size_t i = 0; i < domain->m; ++i) {
262 coefficients_for_H[i] = d2 * aA[i] + d1 * aB[i];
264 coefficients_for_H[0] -= d3;
265 domain->add_poly_z(d1 * d2, coefficients_for_H);
269 typename FieldType::value_type(
275 typename FieldType::value_type(
279 std::vector<typename FieldType::value_type> &H_tmp = aA;
282 #pragma omp parallel for
284 for (std::size_t i = 0; i < domain->m; ++i) {
285 H_tmp[i] = aA[i] * aB[i];
287 std::vector<typename FieldType::value_type>().swap(aB);
289 std::vector<typename FieldType::value_type> aC(domain->m, FieldType::value_type::zero());
291 aC[i] += cs.
constraints[i].c.evaluate(full_variable_assignment);
294 domain->inverse_fft(aC);
298 typename FieldType::value_type(
303 #pragma omp parallel for
305 for (std::size_t i = 0; i < domain->m; ++i) {
306 H_tmp[i] = (H_tmp[i] - aC[i]);
309 domain->divide_by_z_on_coset(H_tmp);
311 domain->inverse_fft(H_tmp);
314 typename FieldType::value_type(
318 #pragma omp parallel for
320 for (std::size_t i = 0; i < domain->m; ++i) {
321 coefficients_for_H[i] += H_tmp[i];
325 full_variable_assignment,
std::move(coefficients_for_H));
OutputIterator move(const SinglePassRange &rng, OutputIterator result)
Definition: move.hpp:45
void multiply_by_coset(Range &a, const FieldValueType &g)
Definition: coset.hpp:37
std::vector< typename FieldType::value_type > r1cs_auxiliary_input
Definition: r1cs.hpp:104
std::vector< typename FieldType::value_type > r1cs_primary_input
Definition: r1cs.hpp:101
std::vector< typename FieldType::value_type > r1cs_variable_assignment
Definition: r1cs.hpp:107
Definition: fields/params.hpp:58
bool is_satisfied(const r1cs_primary_input< FieldType > &primary_input, const r1cs_auxiliary_input< FieldType > &auxiliary_input) const
Definition: r1cs.hpp:162
std::vector< r1cs_constraint< FieldType > > constraints
Definition: r1cs.hpp:130
std::size_t num_constraints() const
Definition: r1cs.hpp:143
std::size_t num_inputs() const
Definition: r1cs.hpp:135
std::size_t num_variables() const
Definition: r1cs.hpp:139
Definition: r1cs_to_qap.hpp:66
FieldType field_type
Definition: r1cs_to_qap.hpp:67
static qap_instance_evaluation< FieldType > instance_map_with_evaluation(const r1cs_constraint_system< FieldType > &cs, const typename FieldType::value_type &t)
Definition: r1cs_to_qap.hpp:140
static qap_instance< FieldType > instance_map(const r1cs_constraint_system< FieldType > &cs)
Definition: r1cs_to_qap.hpp:81
static qap_witness< FieldType > witness_map(const r1cs_constraint_system< FieldType > &cs, const r1cs_primary_input< FieldType > &primary_input, const r1cs_auxiliary_input< FieldType > &auxiliary_input, const typename FieldType::value_type &d1, const typename FieldType::value_type &d2, const typename FieldType::value_type &d3)
Definition: r1cs_to_qap.hpp:221