29 const FF& scaling_factor)
33 using View =
typename Accumulator::View;
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);
49 auto tmp_1 = op * (op + minus_three);
50 tmp_1 *= (op + minus_four);
51 tmp_1 *= (op + minus_eight);
52 tmp_1 *= lagrange_even_in_minicircuit;
53 tmp_1 += op * lagrange_odd_in_minicircuit;
54 tmp_1 *= scaling_factor;
57 auto accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
58 auto accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
59 auto accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
60 auto accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
61 auto accumulators_binary_limbs_0_shift = View(in.accumulators_binary_limbs_0_shift);
62 auto accumulators_binary_limbs_1_shift = View(in.accumulators_binary_limbs_1_shift);
63 auto accumulators_binary_limbs_2_shift = View(in.accumulators_binary_limbs_2_shift);
64 auto accumulators_binary_limbs_3_shift = View(in.accumulators_binary_limbs_3_shift);
68 auto tmp_2 = (accumulators_binary_limbs_0 - accumulators_binary_limbs_0_shift);
69 tmp_2 *= (op + minus_three);
70 tmp_2 *= (op + minus_four);
71 tmp_2 *= (op + minus_eight);
72 tmp_2 *= lagrange_even_in_minicircuit;
73 tmp_2 *= scaling_factor;
77 auto tmp_3 = (accumulators_binary_limbs_1 - accumulators_binary_limbs_1_shift);
78 tmp_3 *= (op + minus_three);
79 tmp_3 *= (op + minus_four);
80 tmp_3 *= (op + minus_eight);
81 tmp_3 *= lagrange_even_in_minicircuit;
82 tmp_3 *= scaling_factor;
86 auto tmp_4 = (accumulators_binary_limbs_2 - accumulators_binary_limbs_2_shift);
87 tmp_4 *= (op + minus_three);
88 tmp_4 *= (op + minus_four);
89 tmp_4 *= (op + minus_eight);
90 tmp_4 *= lagrange_even_in_minicircuit;
91 tmp_4 *= scaling_factor;
95 auto tmp_5 = (accumulators_binary_limbs_3 - accumulators_binary_limbs_3_shift);
96 tmp_5 *= (op + minus_three);
97 tmp_5 *= (op + minus_four);
98 tmp_5 *= (op + minus_eight);
99 tmp_5 *= lagrange_even_in_minicircuit;
100 tmp_5 *= scaling_factor;
122 const Parameters& params,
123 const FF& scaling_factor)
126 using View =
typename Accumulator::View;
129 using ShorterView =
typename ShorterAccumulator::View;
131 const auto lagrange_odd_in_minicircuit = View(in.lagrange_odd_in_minicircuit);
134 const auto lagrange_result_row_shorter = ShorterView(in.lagrange_result_row);
138 const auto lagrange_last_in_minicircuit = View(in.lagrange_last_in_minicircuit);
139 const auto lagrange_last_in_minicircuit_shorter = ShorterView(in.lagrange_last_in_minicircuit);
141 auto accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
142 auto accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
143 auto accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
144 auto accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
145 auto accumulators_binary_limbs_0_shift = View(in.accumulators_binary_limbs_0_shift);
146 auto accumulators_binary_limbs_1_shift = View(in.accumulators_binary_limbs_1_shift);
147 auto accumulators_binary_limbs_2_shift = View(in.accumulators_binary_limbs_2_shift);
148 auto accumulators_binary_limbs_3_shift = View(in.accumulators_binary_limbs_3_shift);
150 auto accumulators_binary_limbs_0_shorter = ShorterView(in.accumulators_binary_limbs_0);
151 auto accumulators_binary_limbs_1_shorter = ShorterView(in.accumulators_binary_limbs_1);
152 auto accumulators_binary_limbs_2_shorter = ShorterView(in.accumulators_binary_limbs_2);
153 auto accumulators_binary_limbs_3_shorter = ShorterView(in.accumulators_binary_limbs_3);
155 const FF minus_one =
FF(-1);
158 const auto is_row_odd_except_last = lagrange_odd_in_minicircuit * (lagrange_last_in_minicircuit + minus_one);
159 auto tmp_1 = accumulators_binary_limbs_0 - accumulators_binary_limbs_0_shift;
160 tmp_1 *= is_row_odd_except_last;
161 tmp_1 *= scaling_factor;
165 auto tmp_2 = accumulators_binary_limbs_1 - accumulators_binary_limbs_1_shift;
166 tmp_2 *= is_row_odd_except_last;
167 tmp_2 *= scaling_factor;
170 auto tmp_3 = accumulators_binary_limbs_2 - accumulators_binary_limbs_2_shift;
171 tmp_3 *= is_row_odd_except_last;
172 tmp_3 *= scaling_factor;
175 auto tmp_4 = accumulators_binary_limbs_3 - accumulators_binary_limbs_3_shift;
176 tmp_4 *= is_row_odd_except_last;
177 tmp_4 *= scaling_factor;
181 const auto lagrange_last_in_minicircuit_by_scaling_factor = lagrange_last_in_minicircuit_shorter * scaling_factor;
182 auto tmp_5 = accumulators_binary_limbs_0_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
186 auto tmp_6 = accumulators_binary_limbs_1_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
190 auto tmp_7 = accumulators_binary_limbs_2_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
194 auto tmp_8 = accumulators_binary_limbs_3_shorter * lagrange_last_in_minicircuit_by_scaling_factor;
199 const auto lagrange_result_row_by_scaling_factor = lagrange_result_row_shorter * scaling_factor;
201 (accumulators_binary_limbs_0_shorter - params.accumulated_result[0]) * lagrange_result_row_by_scaling_factor;
206 (accumulators_binary_limbs_1_shorter - params.accumulated_result[1]) * lagrange_result_row_by_scaling_factor;
211 (accumulators_binary_limbs_2_shorter - params.accumulated_result[2]) * lagrange_result_row_by_scaling_factor;
216 (accumulators_binary_limbs_3_shorter - params.accumulated_result[3]) * lagrange_result_row_by_scaling_factor;
233 const FF& scaling_factor)
236 using View =
typename Accumulator::View;
239 static const auto minus_one = -
FF(1);
240 const auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
241 const auto lagrange_odd_in_minicircuit = View(in.lagrange_odd_in_minicircuit);
243 auto p_x_low_limbs_range_constraint_0 = View(in.p_x_low_limbs_range_constraint_0);
244 auto p_x_low_limbs_range_constraint_1 = View(in.p_x_low_limbs_range_constraint_1);
245 auto p_x_low_limbs_range_constraint_2 = View(in.p_x_low_limbs_range_constraint_2);
246 auto p_x_low_limbs_range_constraint_3 = View(in.p_x_low_limbs_range_constraint_3);
247 auto p_x_low_limbs_range_constraint_4 = View(in.p_x_low_limbs_range_constraint_4);
248 auto p_x_high_limbs_range_constraint_0 = View(in.p_x_high_limbs_range_constraint_0);
249 auto p_x_high_limbs_range_constraint_1 = View(in.p_x_high_limbs_range_constraint_1);
250 auto p_x_high_limbs_range_constraint_2 = View(in.p_x_high_limbs_range_constraint_2);
251 auto p_x_high_limbs_range_constraint_3 = View(in.p_x_high_limbs_range_constraint_3);
252 auto p_x_high_limbs_range_constraint_4 = View(in.p_x_high_limbs_range_constraint_4);
253 auto p_y_low_limbs_range_constraint_0 = View(in.p_y_low_limbs_range_constraint_0);
254 auto p_y_low_limbs_range_constraint_1 = View(in.p_y_low_limbs_range_constraint_1);
255 auto p_y_low_limbs_range_constraint_2 = View(in.p_y_low_limbs_range_constraint_2);
256 auto p_y_low_limbs_range_constraint_3 = View(in.p_y_low_limbs_range_constraint_3);
257 auto p_y_low_limbs_range_constraint_4 = View(in.p_y_low_limbs_range_constraint_4);
258 auto p_y_high_limbs_range_constraint_0 = View(in.p_y_high_limbs_range_constraint_0);
259 auto p_y_high_limbs_range_constraint_1 = View(in.p_y_high_limbs_range_constraint_1);
260 auto p_y_high_limbs_range_constraint_2 = View(in.p_y_high_limbs_range_constraint_2);
261 auto p_y_high_limbs_range_constraint_3 = View(in.p_y_high_limbs_range_constraint_3);
262 auto p_y_high_limbs_range_constraint_4 = View(in.p_y_high_limbs_range_constraint_4);
263 auto z_low_limbs_range_constraint_0 = View(in.z_low_limbs_range_constraint_0);
264 auto z_low_limbs_range_constraint_1 = View(in.z_low_limbs_range_constraint_1);
265 auto z_low_limbs_range_constraint_2 = View(in.z_low_limbs_range_constraint_2);
266 auto z_low_limbs_range_constraint_3 = View(in.z_low_limbs_range_constraint_3);
267 auto z_low_limbs_range_constraint_4 = View(in.z_low_limbs_range_constraint_4);
268 auto z_high_limbs_range_constraint_0 = View(in.z_high_limbs_range_constraint_0);
269 auto z_high_limbs_range_constraint_1 = View(in.z_high_limbs_range_constraint_1);
270 auto z_high_limbs_range_constraint_2 = View(in.z_high_limbs_range_constraint_2);
271 auto z_high_limbs_range_constraint_3 = View(in.z_high_limbs_range_constraint_3);
272 auto z_high_limbs_range_constraint_4 = View(in.z_high_limbs_range_constraint_4);
273 auto accumulator_low_limbs_range_constraint_0 = View(in.accumulator_low_limbs_range_constraint_0);
274 auto accumulator_low_limbs_range_constraint_1 = View(in.accumulator_low_limbs_range_constraint_1);
275 auto accumulator_low_limbs_range_constraint_2 = View(in.accumulator_low_limbs_range_constraint_2);
276 auto accumulator_low_limbs_range_constraint_3 = View(in.accumulator_low_limbs_range_constraint_3);
277 auto accumulator_low_limbs_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4);
278 auto accumulator_high_limbs_range_constraint_0 = View(in.accumulator_high_limbs_range_constraint_0);
279 auto accumulator_high_limbs_range_constraint_1 = View(in.accumulator_high_limbs_range_constraint_1);
280 auto accumulator_high_limbs_range_constraint_2 = View(in.accumulator_high_limbs_range_constraint_2);
281 auto accumulator_high_limbs_range_constraint_3 = View(in.accumulator_high_limbs_range_constraint_3);
282 auto accumulator_high_limbs_range_constraint_4 = View(in.accumulator_high_limbs_range_constraint_4);
283 auto quotient_low_limbs_range_constraint_0 = View(in.quotient_low_limbs_range_constraint_0);
284 auto quotient_low_limbs_range_constraint_1 = View(in.quotient_low_limbs_range_constraint_1);
285 auto quotient_low_limbs_range_constraint_2 = View(in.quotient_low_limbs_range_constraint_2);
286 auto quotient_low_limbs_range_constraint_3 = View(in.quotient_low_limbs_range_constraint_3);
287 auto quotient_low_limbs_range_constraint_4 = View(in.quotient_low_limbs_range_constraint_4);
288 auto quotient_high_limbs_range_constraint_0 = View(in.quotient_high_limbs_range_constraint_0);
289 auto quotient_high_limbs_range_constraint_1 = View(in.quotient_high_limbs_range_constraint_1);
290 auto quotient_high_limbs_range_constraint_2 = View(in.quotient_high_limbs_range_constraint_2);
291 auto quotient_high_limbs_range_constraint_3 = View(in.quotient_high_limbs_range_constraint_3);
292 auto quotient_high_limbs_range_constraint_4 = View(in.quotient_high_limbs_range_constraint_4);
293 auto relation_wide_limbs_range_constraint_0 = View(in.relation_wide_limbs_range_constraint_0);
294 auto relation_wide_limbs_range_constraint_1 = View(in.relation_wide_limbs_range_constraint_1);
295 auto relation_wide_limbs_range_constraint_2 = View(in.relation_wide_limbs_range_constraint_2);
296 auto relation_wide_limbs_range_constraint_3 = View(in.relation_wide_limbs_range_constraint_3);
297 auto p_x_low_limbs_range_constraint_tail = View(in.p_x_low_limbs_range_constraint_tail);
298 auto p_x_high_limbs_range_constraint_tail = View(in.p_x_high_limbs_range_constraint_tail);
299 auto p_y_low_limbs_range_constraint_tail = View(in.p_y_low_limbs_range_constraint_tail);
300 auto p_y_high_limbs_range_constraint_tail = View(in.p_y_high_limbs_range_constraint_tail);
301 auto z_low_limbs_range_constraint_tail = View(in.z_low_limbs_range_constraint_tail);
302 auto z_high_limbs_range_constraint_tail = View(in.z_high_limbs_range_constraint_tail);
303 auto accumulator_low_limbs_range_constraint_tail = View(in.accumulator_low_limbs_range_constraint_tail);
304 auto accumulator_high_limbs_range_constraint_tail = View(in.accumulator_high_limbs_range_constraint_tail);
305 auto quotient_low_limbs_range_constraint_tail = View(in.quotient_low_limbs_range_constraint_tail);
306 auto quotient_high_limbs_range_constraint_tail = View(in.quotient_high_limbs_range_constraint_tail);
307 auto op = View(in.op);
308 auto x_lo_y_hi = View(in.x_lo_y_hi);
309 auto x_hi_z_1 = View(in.x_hi_z_1);
310 auto y_lo_z_2 = View(in.y_lo_z_2);
311 const auto lagrange_mini_masking = View(in.lagrange_mini_masking);
314 const auto not_in_mininicircuit_or_masked =
315 (lagrange_odd_in_minicircuit + lagrange_even_in_minicircuit + lagrange_mini_masking + minus_one) *
319 std::get<0>(accumulators) += p_x_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
322 std::get<1>(accumulators) += p_x_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
325 std::get<2>(accumulators) += p_x_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
328 std::get<3>(accumulators) += p_x_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
331 std::get<4>(accumulators) += p_x_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
334 std::get<5>(accumulators) += p_x_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
337 std::get<6>(accumulators) += p_x_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
340 std::get<7>(accumulators) += p_x_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
343 std::get<8>(accumulators) += p_x_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
346 std::get<9>(accumulators) += p_x_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
349 std::get<10>(accumulators) += p_y_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
352 std::get<11>(accumulators) += p_y_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
355 std::get<12>(accumulators) += p_y_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
358 std::get<13>(accumulators) += p_y_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
361 std::get<14>(accumulators) += p_y_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
364 std::get<15>(accumulators) += p_y_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
367 std::get<16>(accumulators) += p_y_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
370 std::get<17>(accumulators) += p_y_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
373 std::get<18>(accumulators) += p_y_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
376 std::get<19>(accumulators) += p_y_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
379 std::get<20>(accumulators) += z_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
382 std::get<21>(accumulators) += z_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
385 std::get<22>(accumulators) += z_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
388 std::get<23>(accumulators) += z_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
391 std::get<24>(accumulators) += z_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
394 std::get<25>(accumulators) += z_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
397 std::get<26>(accumulators) += z_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
400 std::get<27>(accumulators) += z_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
403 std::get<28>(accumulators) += z_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
406 std::get<29>(accumulators) += z_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
409 std::get<30>(accumulators) += accumulator_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
412 std::get<31>(accumulators) += accumulator_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
415 std::get<32>(accumulators) += accumulator_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
418 std::get<33>(accumulators) += accumulator_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
421 std::get<34>(accumulators) += accumulator_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
424 std::get<35>(accumulators) += accumulator_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
427 std::get<36>(accumulators) += accumulator_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
430 std::get<37>(accumulators) += accumulator_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
433 std::get<38>(accumulators) += accumulator_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
436 std::get<39>(accumulators) += accumulator_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
439 std::get<40>(accumulators) += quotient_low_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
442 std::get<41>(accumulators) += quotient_low_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
445 std::get<42>(accumulators) += quotient_low_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
448 std::get<43>(accumulators) += quotient_low_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
451 std::get<44>(accumulators) += quotient_low_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
454 std::get<45>(accumulators) += quotient_high_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
457 std::get<46>(accumulators) += quotient_high_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
460 std::get<47>(accumulators) += quotient_high_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
463 std::get<48>(accumulators) += quotient_high_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
466 std::get<49>(accumulators) += quotient_high_limbs_range_constraint_4 * not_in_mininicircuit_or_masked;
469 std::get<50>(accumulators) += relation_wide_limbs_range_constraint_0 * not_in_mininicircuit_or_masked;
472 std::get<51>(accumulators) += relation_wide_limbs_range_constraint_1 * not_in_mininicircuit_or_masked;
475 std::get<52>(accumulators) += relation_wide_limbs_range_constraint_2 * not_in_mininicircuit_or_masked;
478 std::get<53>(accumulators) += relation_wide_limbs_range_constraint_3 * not_in_mininicircuit_or_masked;
481 std::get<54>(accumulators) += p_x_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
484 std::get<55>(accumulators) += p_x_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
487 std::get<56>(accumulators) += p_y_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
490 std::get<57>(accumulators) += p_y_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
493 std::get<58>(accumulators) += z_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
496 std::get<59>(accumulators) += z_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
499 std::get<60>(accumulators) += accumulator_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
502 std::get<61>(accumulators) += accumulator_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
505 std::get<62>(accumulators) += quotient_low_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
508 std::get<63>(accumulators) += quotient_high_limbs_range_constraint_tail * not_in_mininicircuit_or_masked;
511 std::get<64>(accumulators) += op * not_in_mininicircuit_or_masked;
514 std::get<65>(accumulators) += x_lo_y_hi * not_in_mininicircuit_or_masked;
517 std::get<66>(accumulators) += x_hi_z_1 * not_in_mininicircuit_or_masked;
520 std::get<67>(accumulators) += y_lo_z_2 * not_in_mininicircuit_or_masked;