29 const FF& scaling_factor)
35 auto op = View(in.op);
36 const auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
37 const auto lagrange_odd_in_minicircuit = View(in.lagrange_odd_in_minicircuit);
38 static const FF minus_three =
FF(-3);
39 static const FF minus_four =
FF(-4);
40 static const FF minus_eight =
FF(-8);
41 const auto op_minus_three = op + minus_three;
42 const auto op_minus_four = op + minus_four;
43 const auto op_minus_eight = op + minus_eight;
49 auto tmp_1 =
Accumulator((op * scaling_factor) * op_minus_three) *
Accumulator(op_minus_four * op_minus_eight);
51 tmp_1 +=
Accumulator((op * scaling_factor) * lagrange_odd_in_minicircuit);
54 auto accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
55 auto accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
56 auto accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
57 auto accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
58 auto accumulators_binary_limbs_0_shift = View(in.accumulators_binary_limbs_0_shift);
59 auto accumulators_binary_limbs_1_shift = View(in.accumulators_binary_limbs_1_shift);
60 auto accumulators_binary_limbs_2_shift = View(in.accumulators_binary_limbs_2_shift);
61 auto accumulators_binary_limbs_3_shift = View(in.accumulators_binary_limbs_3_shift);
65 auto no_op_even_selector_scaled =
Accumulator(op_minus_three * (op_minus_four * scaling_factor)) *
66 Accumulator(op_minus_eight * lagrange_even_in_minicircuit);
68 auto accumulate_no_op_transfer = [&](
auto& accumulator,
const auto& limb_delta) {
69 accumulator +=
Accumulator(limb_delta) * no_op_even_selector_scaled;
73 accumulate_no_op_transfer(
std::get<1>(accumulators),
74 accumulators_binary_limbs_0 - accumulators_binary_limbs_0_shift);
75 accumulate_no_op_transfer(
std::get<2>(accumulators),
76 accumulators_binary_limbs_1 - accumulators_binary_limbs_1_shift);
77 accumulate_no_op_transfer(
std::get<3>(accumulators),
78 accumulators_binary_limbs_2 - accumulators_binary_limbs_2_shift);
79 accumulate_no_op_transfer(
std::get<4>(accumulators),
80 accumulators_binary_limbs_3 - accumulators_binary_limbs_3_shift);
101 const Parameters& params,
102 const FF& scaling_factor)
110 const auto lagrange_odd_in_minicircuit = View(in.lagrange_odd_in_minicircuit);
113 const auto lagrange_result_row_shorter = ShorterView(in.lagrange_result_row);
117 const auto lagrange_last_in_minicircuit = View(in.lagrange_last_in_minicircuit);
118 const auto lagrange_last_in_minicircuit_shorter = ShorterView(in.lagrange_last_in_minicircuit);
120 auto accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
121 auto accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
122 auto accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
123 auto accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
124 auto accumulators_binary_limbs_0_shift = View(in.accumulators_binary_limbs_0_shift);
125 auto accumulators_binary_limbs_1_shift = View(in.accumulators_binary_limbs_1_shift);
126 auto accumulators_binary_limbs_2_shift = View(in.accumulators_binary_limbs_2_shift);
127 auto accumulators_binary_limbs_3_shift = View(in.accumulators_binary_limbs_3_shift);
129 auto accumulators_binary_limbs_0_shorter = ShorterView(in.accumulators_binary_limbs_0);
130 auto accumulators_binary_limbs_1_shorter = ShorterView(in.accumulators_binary_limbs_1);
131 auto accumulators_binary_limbs_2_shorter = ShorterView(in.accumulators_binary_limbs_2);
132 auto accumulators_binary_limbs_3_shorter = ShorterView(in.accumulators_binary_limbs_3);
134 const FF minus_one =
FF(-1);
137 const auto is_row_odd_except_last_scaled =
138 Accumulator(lagrange_odd_in_minicircuit * ((lagrange_last_in_minicircuit + minus_one) * scaling_factor));
139 auto accumulate_odd_transfer = [&](
auto& accumulator,
const auto& limb_delta) {
140 accumulator +=
Accumulator(limb_delta) * is_row_odd_except_last_scaled;
144 accumulate_odd_transfer(
std::get<0>(accumulators), accumulators_binary_limbs_0 - accumulators_binary_limbs_0_shift);
145 accumulate_odd_transfer(
std::get<1>(accumulators), accumulators_binary_limbs_1 - accumulators_binary_limbs_1_shift);
146 accumulate_odd_transfer(
std::get<2>(accumulators), accumulators_binary_limbs_2 - accumulators_binary_limbs_2_shift);
147 accumulate_odd_transfer(
std::get<3>(accumulators), accumulators_binary_limbs_3 - accumulators_binary_limbs_3_shift);
150 const auto lagrange_last_in_minicircuit_by_scaling_factor = lagrange_last_in_minicircuit_shorter * scaling_factor;
151 auto tmp_5 = accumulators_binary_limbs_0_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
152 std::get<4>(accumulators) += ShorterAccumulator(tmp_5);
155 auto tmp_6 = accumulators_binary_limbs_1_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
156 std::get<5>(accumulators) += ShorterAccumulator(tmp_6);
159 auto tmp_7 = accumulators_binary_limbs_2_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
160 std::get<6>(accumulators) += ShorterAccumulator(tmp_7);
163 auto tmp_8 = accumulators_binary_limbs_3_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
164 std::get<7>(accumulators) += ShorterAccumulator(tmp_8);
168 const auto lagrange_result_row_by_scaling_factor = lagrange_result_row_shorter * scaling_factor;
170 (accumulators_binary_limbs_0_shorter - params.accumulated_result[0]) * lagrange_result_row_by_scaling_factor;
171 std::get<8>(accumulators) += ShorterAccumulator(tmp_9);
175 (accumulators_binary_limbs_1_shorter - params.accumulated_result[1]) * lagrange_result_row_by_scaling_factor;
176 std::get<9>(accumulators) += ShorterAccumulator(tmp_10);
180 (accumulators_binary_limbs_2_shorter - params.accumulated_result[2]) * lagrange_result_row_by_scaling_factor;
181 std::get<10>(accumulators) += ShorterAccumulator(tmp_11);
185 (accumulators_binary_limbs_3_shorter - params.accumulated_result[3]) * lagrange_result_row_by_scaling_factor;
186 std::get<11>(accumulators) += ShorterAccumulator(tmp_12);
202 const FF& scaling_factor)
208 static const auto minus_one = -
FF(1);
209 const auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
210 const auto lagrange_odd_in_minicircuit = View(in.lagrange_odd_in_minicircuit);
212 auto p_x_low_limbs_range_constraint_0 = View(in.p_x_low_limbs_range_constraint_0);
213 auto p_x_low_limbs_range_constraint_1 = View(in.p_x_low_limbs_range_constraint_1);
214 auto p_x_low_limbs_range_constraint_2 = View(in.p_x_low_limbs_range_constraint_2);
215 auto p_x_low_limbs_range_constraint_3 = View(in.p_x_low_limbs_range_constraint_3);
216 auto p_x_low_limbs_range_constraint_4 = View(in.p_x_low_limbs_range_constraint_4);
217 auto p_x_high_limbs_range_constraint_0 = View(in.p_x_high_limbs_range_constraint_0);
218 auto p_x_high_limbs_range_constraint_1 = View(in.p_x_high_limbs_range_constraint_1);
219 auto p_x_high_limbs_range_constraint_2 = View(in.p_x_high_limbs_range_constraint_2);
220 auto p_x_high_limbs_range_constraint_3 = View(in.p_x_high_limbs_range_constraint_3);
221 auto p_x_high_limbs_range_constraint_4 = View(in.p_x_high_limbs_range_constraint_4);
222 auto p_y_low_limbs_range_constraint_0 = View(in.p_y_low_limbs_range_constraint_0);
223 auto p_y_low_limbs_range_constraint_1 = View(in.p_y_low_limbs_range_constraint_1);
224 auto p_y_low_limbs_range_constraint_2 = View(in.p_y_low_limbs_range_constraint_2);
225 auto p_y_low_limbs_range_constraint_3 = View(in.p_y_low_limbs_range_constraint_3);
226 auto p_y_low_limbs_range_constraint_4 = View(in.p_y_low_limbs_range_constraint_4);
227 auto p_y_high_limbs_range_constraint_0 = View(in.p_y_high_limbs_range_constraint_0);
228 auto p_y_high_limbs_range_constraint_1 = View(in.p_y_high_limbs_range_constraint_1);
229 auto p_y_high_limbs_range_constraint_2 = View(in.p_y_high_limbs_range_constraint_2);
230 auto p_y_high_limbs_range_constraint_3 = View(in.p_y_high_limbs_range_constraint_3);
231 auto p_y_high_limbs_range_constraint_4 = View(in.p_y_high_limbs_range_constraint_4);
232 auto z_low_limbs_range_constraint_0 = View(in.z_low_limbs_range_constraint_0);
233 auto z_low_limbs_range_constraint_1 = View(in.z_low_limbs_range_constraint_1);
234 auto z_low_limbs_range_constraint_2 = View(in.z_low_limbs_range_constraint_2);
235 auto z_low_limbs_range_constraint_3 = View(in.z_low_limbs_range_constraint_3);
236 auto z_low_limbs_range_constraint_4 = View(in.z_low_limbs_range_constraint_4);
237 auto z_high_limbs_range_constraint_0 = View(in.z_high_limbs_range_constraint_0);
238 auto z_high_limbs_range_constraint_1 = View(in.z_high_limbs_range_constraint_1);
239 auto z_high_limbs_range_constraint_2 = View(in.z_high_limbs_range_constraint_2);
240 auto z_high_limbs_range_constraint_3 = View(in.z_high_limbs_range_constraint_3);
241 auto z_high_limbs_range_constraint_4 = View(in.z_high_limbs_range_constraint_4);
242 auto accumulator_low_limbs_range_constraint_0 = View(in.accumulator_low_limbs_range_constraint_0);
243 auto accumulator_low_limbs_range_constraint_1 = View(in.accumulator_low_limbs_range_constraint_1);
244 auto accumulator_low_limbs_range_constraint_2 = View(in.accumulator_low_limbs_range_constraint_2);
245 auto accumulator_low_limbs_range_constraint_3 = View(in.accumulator_low_limbs_range_constraint_3);
246 auto accumulator_low_limbs_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4);
247 auto accumulator_high_limbs_range_constraint_0 = View(in.accumulator_high_limbs_range_constraint_0);
248 auto accumulator_high_limbs_range_constraint_1 = View(in.accumulator_high_limbs_range_constraint_1);
249 auto accumulator_high_limbs_range_constraint_2 = View(in.accumulator_high_limbs_range_constraint_2);
250 auto accumulator_high_limbs_range_constraint_3 = View(in.accumulator_high_limbs_range_constraint_3);
251 auto accumulator_high_limbs_range_constraint_4 = View(in.accumulator_high_limbs_range_constraint_4);
252 auto quotient_low_limbs_range_constraint_0 = View(in.quotient_low_limbs_range_constraint_0);
253 auto quotient_low_limbs_range_constraint_1 = View(in.quotient_low_limbs_range_constraint_1);
254 auto quotient_low_limbs_range_constraint_2 = View(in.quotient_low_limbs_range_constraint_2);
255 auto quotient_low_limbs_range_constraint_3 = View(in.quotient_low_limbs_range_constraint_3);
256 auto quotient_low_limbs_range_constraint_4 = View(in.quotient_low_limbs_range_constraint_4);
257 auto quotient_high_limbs_range_constraint_0 = View(in.quotient_high_limbs_range_constraint_0);
258 auto quotient_high_limbs_range_constraint_1 = View(in.quotient_high_limbs_range_constraint_1);
259 auto quotient_high_limbs_range_constraint_2 = View(in.quotient_high_limbs_range_constraint_2);
260 auto quotient_high_limbs_range_constraint_3 = View(in.quotient_high_limbs_range_constraint_3);
261 auto quotient_high_limbs_range_constraint_4 = View(in.quotient_high_limbs_range_constraint_4);
262 auto relation_wide_limbs_range_constraint_0 = View(in.relation_wide_limbs_range_constraint_0);
263 auto relation_wide_limbs_range_constraint_1 = View(in.relation_wide_limbs_range_constraint_1);
264 auto relation_wide_limbs_range_constraint_2 = View(in.relation_wide_limbs_range_constraint_2);
265 auto relation_wide_limbs_range_constraint_3 = View(in.relation_wide_limbs_range_constraint_3);
266 auto p_x_low_limbs_range_constraint_tail = View(in.p_x_low_limbs_range_constraint_tail);
267 auto p_x_high_limbs_range_constraint_tail = View(in.p_x_high_limbs_range_constraint_tail);
268 auto p_y_low_limbs_range_constraint_tail = View(in.p_y_low_limbs_range_constraint_tail);
269 auto p_y_high_limbs_range_constraint_tail = View(in.p_y_high_limbs_range_constraint_tail);
270 auto z_low_limbs_range_constraint_tail = View(in.z_low_limbs_range_constraint_tail);
271 auto z_high_limbs_range_constraint_tail = View(in.z_high_limbs_range_constraint_tail);
272 auto accumulator_low_limbs_range_constraint_tail = View(in.accumulator_low_limbs_range_constraint_tail);
273 auto accumulator_high_limbs_range_constraint_tail = View(in.accumulator_high_limbs_range_constraint_tail);
274 auto quotient_low_limbs_range_constraint_tail = View(in.quotient_low_limbs_range_constraint_tail);
275 auto quotient_high_limbs_range_constraint_tail = View(in.quotient_high_limbs_range_constraint_tail);
276 auto op = View(in.op);
277 auto x_lo_y_hi = View(in.x_lo_y_hi);
278 auto x_hi_z_1 = View(in.x_hi_z_1);
279 auto y_lo_z_2 = View(in.y_lo_z_2);
280 const auto lagrange_mini_masking = View(in.lagrange_mini_masking);
283 const auto not_in_mininicircuit_or_masked =
284 (lagrange_odd_in_minicircuit + lagrange_even_in_minicircuit + lagrange_mini_masking + minus_one) *
288 std::get<0>(accumulators) +=
Accumulator(p_x_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
291 std::get<1>(accumulators) +=
Accumulator(p_x_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
294 std::get<2>(accumulators) +=
Accumulator(p_x_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
297 std::get<3>(accumulators) +=
Accumulator(p_x_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
300 std::get<4>(accumulators) +=
Accumulator(p_x_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked);
303 std::get<5>(accumulators) +=
Accumulator(p_x_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
306 std::get<6>(accumulators) +=
Accumulator(p_x_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
309 std::get<7>(accumulators) +=
Accumulator(p_x_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
312 std::get<8>(accumulators) +=
Accumulator(p_x_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
315 std::get<9>(accumulators) +=
Accumulator(p_x_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked);
379 Accumulator(accumulator_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
383 Accumulator(accumulator_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
387 Accumulator(accumulator_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
391 Accumulator(accumulator_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
395 Accumulator(accumulator_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked);
399 Accumulator(accumulator_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
403 Accumulator(accumulator_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
407 Accumulator(accumulator_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
411 Accumulator(accumulator_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
415 Accumulator(accumulator_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked);
418 std::get<40>(accumulators) +=
Accumulator(quotient_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
421 std::get<41>(accumulators) +=
Accumulator(quotient_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
424 std::get<42>(accumulators) +=
Accumulator(quotient_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
427 std::get<43>(accumulators) +=
Accumulator(quotient_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
430 std::get<44>(accumulators) +=
Accumulator(quotient_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked);
433 std::get<45>(accumulators) +=
Accumulator(quotient_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
436 std::get<46>(accumulators) +=
Accumulator(quotient_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
439 std::get<47>(accumulators) +=
Accumulator(quotient_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
442 std::get<48>(accumulators) +=
Accumulator(quotient_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
445 std::get<49>(accumulators) +=
Accumulator(quotient_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked);
448 std::get<50>(accumulators) +=
Accumulator(relation_wide_limbs_range_constraint_0 * not_in_mininicircuit_or_masked);
451 std::get<51>(accumulators) +=
Accumulator(relation_wide_limbs_range_constraint_1 * not_in_mininicircuit_or_masked);
454 std::get<52>(accumulators) +=
Accumulator(relation_wide_limbs_range_constraint_2 * not_in_mininicircuit_or_masked);
457 std::get<53>(accumulators) +=
Accumulator(relation_wide_limbs_range_constraint_3 * not_in_mininicircuit_or_masked);
460 std::get<54>(accumulators) +=
Accumulator(p_x_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
463 std::get<55>(accumulators) +=
Accumulator(p_x_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
466 std::get<56>(accumulators) +=
Accumulator(p_y_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
469 std::get<57>(accumulators) +=
Accumulator(p_y_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
475 std::get<59>(accumulators) +=
Accumulator(z_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
479 Accumulator(accumulator_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
483 Accumulator(accumulator_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
487 Accumulator(quotient_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);
491 Accumulator(quotient_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked);