181 const auto run_test = [](
bool random_inputs) {
188 const auto& p_x_low_limbs_range_constraint_0 = input_elements.p_x_low_limbs_range_constraint_0;
189 const auto& p_x_low_limbs_range_constraint_1 = input_elements.p_x_low_limbs_range_constraint_1;
190 const auto& p_x_low_limbs_range_constraint_2 = input_elements.p_x_low_limbs_range_constraint_2;
191 const auto& p_x_low_limbs_range_constraint_3 = input_elements.p_x_low_limbs_range_constraint_3;
192 const auto& p_x_low_limbs_range_constraint_4 = input_elements.p_x_low_limbs_range_constraint_4;
193 const auto& p_x_low_limbs_range_constraint_tail = input_elements.p_x_low_limbs_range_constraint_tail;
194 const auto& p_x_low_limbs = input_elements.p_x_low_limbs;
195 const auto& p_x_high_limbs_range_constraint_0 = input_elements.p_x_high_limbs_range_constraint_0;
196 const auto& p_x_high_limbs_range_constraint_1 = input_elements.p_x_high_limbs_range_constraint_1;
197 const auto& p_x_high_limbs_range_constraint_2 = input_elements.p_x_high_limbs_range_constraint_2;
198 const auto& p_x_high_limbs_range_constraint_3 = input_elements.p_x_high_limbs_range_constraint_3;
199 const auto& p_x_high_limbs_range_constraint_4 = input_elements.p_x_high_limbs_range_constraint_4;
200 const auto& p_x_high_limbs_range_constraint_tail = input_elements.p_x_high_limbs_range_constraint_tail;
201 const auto& p_x_high_limbs = input_elements.p_x_high_limbs;
202 const auto& p_x_low_limbs_range_constraint_0_shift = input_elements.p_x_low_limbs_range_constraint_0_shift;
203 const auto& p_x_low_limbs_range_constraint_1_shift = input_elements.p_x_low_limbs_range_constraint_1_shift;
204 const auto& p_x_low_limbs_range_constraint_2_shift = input_elements.p_x_low_limbs_range_constraint_2_shift;
205 const auto& p_x_low_limbs_range_constraint_3_shift = input_elements.p_x_low_limbs_range_constraint_3_shift;
206 const auto& p_x_low_limbs_range_constraint_4_shift = input_elements.p_x_low_limbs_range_constraint_4_shift;
207 const auto& p_x_low_limbs_range_constraint_tail_shift =
208 input_elements.p_x_low_limbs_range_constraint_tail_shift;
209 const auto& p_x_low_limbs_shift = input_elements.p_x_low_limbs_shift;
210 const auto& p_x_high_limbs_range_constraint_0_shift = input_elements.p_x_high_limbs_range_constraint_0_shift;
211 const auto& p_x_high_limbs_range_constraint_1_shift = input_elements.p_x_high_limbs_range_constraint_1_shift;
212 const auto& p_x_high_limbs_range_constraint_2_shift = input_elements.p_x_high_limbs_range_constraint_2_shift;
213 const auto& p_x_high_limbs_range_constraint_3_shift = input_elements.p_x_high_limbs_range_constraint_3_shift;
214 const auto& p_x_high_limbs_range_constraint_4_shift = input_elements.p_x_high_limbs_range_constraint_4_shift;
215 const auto& p_x_high_limbs_range_constraint_tail_shift =
216 input_elements.p_x_high_limbs_range_constraint_tail_shift;
217 const auto& p_x_high_limbs_shift = input_elements.p_x_high_limbs_shift;
218 const auto& p_y_low_limbs_range_constraint_0 = input_elements.p_y_low_limbs_range_constraint_0;
219 const auto& p_y_low_limbs_range_constraint_1 = input_elements.p_y_low_limbs_range_constraint_1;
220 const auto& p_y_low_limbs_range_constraint_2 = input_elements.p_y_low_limbs_range_constraint_2;
221 const auto& p_y_low_limbs_range_constraint_3 = input_elements.p_y_low_limbs_range_constraint_3;
222 const auto& p_y_low_limbs_range_constraint_4 = input_elements.p_y_low_limbs_range_constraint_4;
223 const auto& p_y_low_limbs_range_constraint_tail = input_elements.p_y_low_limbs_range_constraint_tail;
224 const auto& p_y_low_limbs = input_elements.p_y_low_limbs;
225 const auto& p_y_high_limbs_range_constraint_0 = input_elements.p_y_high_limbs_range_constraint_0;
226 const auto& p_y_high_limbs_range_constraint_1 = input_elements.p_y_high_limbs_range_constraint_1;
227 const auto& p_y_high_limbs_range_constraint_2 = input_elements.p_y_high_limbs_range_constraint_2;
228 const auto& p_y_high_limbs_range_constraint_3 = input_elements.p_y_high_limbs_range_constraint_3;
229 const auto& p_y_high_limbs_range_constraint_4 = input_elements.p_y_high_limbs_range_constraint_4;
230 const auto& p_y_high_limbs_range_constraint_tail = input_elements.p_y_high_limbs_range_constraint_tail;
231 const auto& p_y_high_limbs = input_elements.p_y_high_limbs;
232 const auto& p_y_low_limbs_range_constraint_0_shift = input_elements.p_y_low_limbs_range_constraint_0_shift;
233 const auto& p_y_low_limbs_range_constraint_1_shift = input_elements.p_y_low_limbs_range_constraint_1_shift;
234 const auto& p_y_low_limbs_range_constraint_2_shift = input_elements.p_y_low_limbs_range_constraint_2_shift;
235 const auto& p_y_low_limbs_range_constraint_3_shift = input_elements.p_y_low_limbs_range_constraint_3_shift;
236 const auto& p_y_low_limbs_range_constraint_4_shift = input_elements.p_y_low_limbs_range_constraint_4_shift;
237 const auto& p_y_low_limbs_range_constraint_tail_shift =
238 input_elements.p_y_low_limbs_range_constraint_tail_shift;
239 const auto& p_y_low_limbs_shift = input_elements.p_y_low_limbs_shift;
240 const auto& p_y_high_limbs_range_constraint_0_shift = input_elements.p_y_high_limbs_range_constraint_0_shift;
241 const auto& p_y_high_limbs_range_constraint_1_shift = input_elements.p_y_high_limbs_range_constraint_1_shift;
242 const auto& p_y_high_limbs_range_constraint_2_shift = input_elements.p_y_high_limbs_range_constraint_2_shift;
243 const auto& p_y_high_limbs_range_constraint_3_shift = input_elements.p_y_high_limbs_range_constraint_3_shift;
244 const auto& p_y_high_limbs_range_constraint_4_shift = input_elements.p_y_high_limbs_range_constraint_4_shift;
245 const auto& p_y_high_limbs_range_constraint_tail_shift =
246 input_elements.p_y_high_limbs_range_constraint_tail_shift;
247 const auto& p_y_high_limbs_shift = input_elements.p_y_high_limbs_shift;
248 const auto& z_low_limbs_range_constraint_0 = input_elements.z_low_limbs_range_constraint_0;
249 const auto& z_low_limbs_range_constraint_1 = input_elements.z_low_limbs_range_constraint_1;
250 const auto& z_low_limbs_range_constraint_2 = input_elements.z_low_limbs_range_constraint_2;
251 const auto& z_low_limbs_range_constraint_3 = input_elements.z_low_limbs_range_constraint_3;
252 const auto& z_low_limbs_range_constraint_4 = input_elements.z_low_limbs_range_constraint_4;
253 const auto& z_low_limbs_range_constraint_tail = input_elements.z_low_limbs_range_constraint_tail;
254 const auto& z_low_limbs = input_elements.z_low_limbs;
255 const auto& z_low_limbs_range_constraint_0_shift = input_elements.z_low_limbs_range_constraint_0_shift;
256 const auto& z_low_limbs_range_constraint_1_shift = input_elements.z_low_limbs_range_constraint_1_shift;
257 const auto& z_low_limbs_range_constraint_2_shift = input_elements.z_low_limbs_range_constraint_2_shift;
258 const auto& z_low_limbs_range_constraint_3_shift = input_elements.z_low_limbs_range_constraint_3_shift;
259 const auto& z_low_limbs_range_constraint_4_shift = input_elements.z_low_limbs_range_constraint_4_shift;
260 const auto& z_low_limbs_range_constraint_tail_shift = input_elements.z_low_limbs_range_constraint_tail_shift;
261 const auto& z_low_limbs_shift = input_elements.z_low_limbs_shift;
262 const auto& z_high_limbs_range_constraint_0 = input_elements.z_high_limbs_range_constraint_0;
263 const auto& z_high_limbs_range_constraint_1 = input_elements.z_high_limbs_range_constraint_1;
264 const auto& z_high_limbs_range_constraint_2 = input_elements.z_high_limbs_range_constraint_2;
265 const auto& z_high_limbs_range_constraint_3 = input_elements.z_high_limbs_range_constraint_3;
266 const auto& z_high_limbs_range_constraint_4 = input_elements.z_high_limbs_range_constraint_4;
267 const auto& z_high_limbs_range_constraint_tail = input_elements.z_high_limbs_range_constraint_tail;
268 const auto& z_high_limbs = input_elements.z_high_limbs;
269 const auto& z_high_limbs_range_constraint_0_shift = input_elements.z_high_limbs_range_constraint_0_shift;
270 const auto& z_high_limbs_range_constraint_1_shift = input_elements.z_high_limbs_range_constraint_1_shift;
271 const auto& z_high_limbs_range_constraint_2_shift = input_elements.z_high_limbs_range_constraint_2_shift;
272 const auto& z_high_limbs_range_constraint_3_shift = input_elements.z_high_limbs_range_constraint_3_shift;
273 const auto& z_high_limbs_range_constraint_4_shift = input_elements.z_high_limbs_range_constraint_4_shift;
274 const auto& z_high_limbs_range_constraint_tail_shift = input_elements.z_high_limbs_range_constraint_tail_shift;
275 const auto& z_high_limbs_shift = input_elements.z_high_limbs_shift;
276 const auto& accumulator_low_limbs_range_constraint_0 = input_elements.accumulator_low_limbs_range_constraint_0;
277 const auto& accumulator_low_limbs_range_constraint_1 = input_elements.accumulator_low_limbs_range_constraint_1;
278 const auto& accumulator_low_limbs_range_constraint_2 = input_elements.accumulator_low_limbs_range_constraint_2;
279 const auto& accumulator_low_limbs_range_constraint_3 = input_elements.accumulator_low_limbs_range_constraint_3;
280 const auto& accumulator_low_limbs_range_constraint_4 = input_elements.accumulator_low_limbs_range_constraint_4;
281 const auto& accumulator_low_limbs_range_constraint_tail =
282 input_elements.accumulator_low_limbs_range_constraint_tail;
283 const auto& accumulator_low_limbs_range_constraint_0_shift =
284 input_elements.accumulator_low_limbs_range_constraint_0_shift;
285 const auto& accumulator_low_limbs_range_constraint_1_shift =
286 input_elements.accumulator_low_limbs_range_constraint_1_shift;
287 const auto& accumulator_low_limbs_range_constraint_2_shift =
288 input_elements.accumulator_low_limbs_range_constraint_2_shift;
289 const auto& accumulator_low_limbs_range_constraint_3_shift =
290 input_elements.accumulator_low_limbs_range_constraint_3_shift;
291 const auto& accumulator_low_limbs_range_constraint_4_shift =
292 input_elements.accumulator_low_limbs_range_constraint_4_shift;
293 const auto& accumulator_low_limbs_range_constraint_tail_shift =
294 input_elements.accumulator_low_limbs_range_constraint_tail_shift;
295 const auto& accumulator_high_limbs_range_constraint_0 =
296 input_elements.accumulator_high_limbs_range_constraint_0;
297 const auto& accumulator_high_limbs_range_constraint_1 =
298 input_elements.accumulator_high_limbs_range_constraint_1;
299 const auto& accumulator_high_limbs_range_constraint_2 =
300 input_elements.accumulator_high_limbs_range_constraint_2;
301 const auto& accumulator_high_limbs_range_constraint_3 =
302 input_elements.accumulator_high_limbs_range_constraint_3;
303 const auto& accumulator_high_limbs_range_constraint_4 =
304 input_elements.accumulator_high_limbs_range_constraint_4;
305 const auto& accumulator_high_limbs_range_constraint_tail =
306 input_elements.accumulator_high_limbs_range_constraint_tail;
307 const auto& accumulator_high_limbs_range_constraint_0_shift =
308 input_elements.accumulator_high_limbs_range_constraint_0_shift;
309 const auto& accumulator_high_limbs_range_constraint_1_shift =
310 input_elements.accumulator_high_limbs_range_constraint_1_shift;
311 const auto& accumulator_high_limbs_range_constraint_2_shift =
312 input_elements.accumulator_high_limbs_range_constraint_2_shift;
313 const auto& accumulator_high_limbs_range_constraint_3_shift =
314 input_elements.accumulator_high_limbs_range_constraint_3_shift;
315 const auto& accumulator_high_limbs_range_constraint_4_shift =
316 input_elements.accumulator_high_limbs_range_constraint_4_shift;
317 const auto& accumulator_high_limbs_range_constraint_tail_shift =
318 input_elements.accumulator_high_limbs_range_constraint_tail_shift;
319 const auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
320 const auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
321 const auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
322 const auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
323 const auto& quotient_low_limbs_range_constraint_0 = input_elements.quotient_low_limbs_range_constraint_0;
324 const auto& quotient_low_limbs_range_constraint_1 = input_elements.quotient_low_limbs_range_constraint_1;
325 const auto& quotient_low_limbs_range_constraint_2 = input_elements.quotient_low_limbs_range_constraint_2;
326 const auto& quotient_low_limbs_range_constraint_3 = input_elements.quotient_low_limbs_range_constraint_3;
327 const auto& quotient_low_limbs_range_constraint_4 = input_elements.quotient_low_limbs_range_constraint_4;
328 const auto& quotient_low_limbs_range_constraint_tail = input_elements.quotient_low_limbs_range_constraint_tail;
329 const auto& quotient_low_limbs_range_constraint_0_shift =
330 input_elements.quotient_low_limbs_range_constraint_0_shift;
331 const auto& quotient_low_limbs_range_constraint_1_shift =
332 input_elements.quotient_low_limbs_range_constraint_1_shift;
333 const auto& quotient_low_limbs_range_constraint_2_shift =
334 input_elements.quotient_low_limbs_range_constraint_2_shift;
335 const auto& quotient_low_limbs_range_constraint_3_shift =
336 input_elements.quotient_low_limbs_range_constraint_3_shift;
337 const auto& quotient_low_limbs_range_constraint_4_shift =
338 input_elements.quotient_low_limbs_range_constraint_4_shift;
339 const auto& quotient_low_limbs_range_constraint_tail_shift =
340 input_elements.quotient_low_limbs_range_constraint_tail_shift;
341 const auto& quotient_high_limbs_range_constraint_0 = input_elements.quotient_high_limbs_range_constraint_0;
342 const auto& quotient_high_limbs_range_constraint_1 = input_elements.quotient_high_limbs_range_constraint_1;
343 const auto& quotient_high_limbs_range_constraint_2 = input_elements.quotient_high_limbs_range_constraint_2;
344 const auto& quotient_high_limbs_range_constraint_3 = input_elements.quotient_high_limbs_range_constraint_3;
345 const auto& quotient_high_limbs_range_constraint_4 = input_elements.quotient_high_limbs_range_constraint_4;
346 const auto& quotient_high_limbs_range_constraint_tail =
347 input_elements.quotient_high_limbs_range_constraint_tail;
348 const auto& quotient_high_limbs_range_constraint_0_shift =
349 input_elements.quotient_high_limbs_range_constraint_0_shift;
350 const auto& quotient_high_limbs_range_constraint_1_shift =
351 input_elements.quotient_high_limbs_range_constraint_1_shift;
352 const auto& quotient_high_limbs_range_constraint_2_shift =
353 input_elements.quotient_high_limbs_range_constraint_2_shift;
354 const auto& quotient_high_limbs_range_constraint_3_shift =
355 input_elements.quotient_high_limbs_range_constraint_3_shift;
356 const auto& quotient_high_limbs_range_constraint_4_shift =
357 input_elements.quotient_high_limbs_range_constraint_4_shift;
358 const auto& quotient_high_limbs_range_constraint_tail_shift =
359 input_elements.quotient_high_limbs_range_constraint_tail_shift;
360 const auto& quotient_low_binary_limbs = input_elements.quotient_low_binary_limbs;
361 const auto& quotient_low_binary_limbs_shift = input_elements.quotient_low_binary_limbs_shift;
362 const auto& quotient_high_binary_limbs = input_elements.quotient_high_binary_limbs;
363 const auto& quotient_high_binary_limbs_shift = input_elements.quotient_high_binary_limbs_shift;
364 const auto& relation_wide_limbs_range_constraint_0 = input_elements.relation_wide_limbs_range_constraint_0;
365 const auto& relation_wide_limbs_range_constraint_1 = input_elements.relation_wide_limbs_range_constraint_1;
366 const auto& relation_wide_limbs_range_constraint_2 = input_elements.relation_wide_limbs_range_constraint_2;
367 const auto& relation_wide_limbs_range_constraint_3 = input_elements.relation_wide_limbs_range_constraint_3;
368 const auto& relation_wide_limbs_range_constraint_0_shift =
369 input_elements.relation_wide_limbs_range_constraint_0_shift;
370 const auto& relation_wide_limbs_range_constraint_1_shift =
371 input_elements.relation_wide_limbs_range_constraint_1_shift;
372 const auto& relation_wide_limbs_range_constraint_2_shift =
373 input_elements.relation_wide_limbs_range_constraint_2_shift;
374 const auto& relation_wide_limbs_range_constraint_3_shift =
375 input_elements.relation_wide_limbs_range_constraint_3_shift;
376 const auto& relation_wide_limbs = input_elements.relation_wide_limbs;
377 const auto& relation_wide_limbs_shift = input_elements.relation_wide_limbs_shift;
379 const auto& x_lo_y_hi = input_elements.x_lo_y_hi;
380 const auto& x_hi_z_1 = input_elements.x_hi_z_1;
381 const auto& y_lo_z_2 = input_elements.y_lo_z_2;
382 const auto& x_lo_y_hi_shift = input_elements.x_lo_y_hi_shift;
383 const auto& x_hi_z_1_shift = input_elements.x_hi_z_1_shift;
384 const auto& y_lo_z_2_shift = input_elements.y_lo_z_2_shift;
385 const auto& op = input_elements.op;
387 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
389 RelationValues expected_values;
393 const size_t NUM_MICRO_LIMB_BITS = 14;
394 const size_t NUM_LIMB_BITS = 68;
395 const auto MICRO_LIMB_SHIFT =
FF(
uint256_t(1) << NUM_MICRO_LIMB_BITS);
396 const auto MICRO_LIMB_SHIFTx2 = MICRO_LIMB_SHIFT * MICRO_LIMB_SHIFT;
397 const auto MICRO_LIMB_SHIFTx3 = MICRO_LIMB_SHIFTx2 * MICRO_LIMB_SHIFT;
398 const auto MICRO_LIMB_SHIFTx4 = MICRO_LIMB_SHIFTx3 * MICRO_LIMB_SHIFT;
399 const auto MICRO_LIMB_SHIFTx5 = MICRO_LIMB_SHIFTx4 * MICRO_LIMB_SHIFT;
401 const auto SHIFT_10_TO_14 =
FF(1 << 4);
402 const auto SHIFT_12_TO_14 =
FF(1 << 2);
403 const auto SHIFT_4_TO_14 =
FF(1 << 10);
404 const auto SHIFT_8_TO_14 =
FF(1 << 6);
405 const auto LIMB_SHIFT =
FF(
uint256_t(1) << NUM_LIMB_BITS);
413 auto check_relation_limb_decomposition = [MICRO_LIMB_SHIFT,
418 lagrange_even_in_minicircuit](
auto& micro_limb_0,
424 auto& decomposed_limb) {
425 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
426 micro_limb_3 * MICRO_LIMB_SHIFTx3 + micro_limb_4 * MICRO_LIMB_SHIFTx4 +
427 micro_limb_5 * MICRO_LIMB_SHIFTx5 - decomposed_limb) *
428 lagrange_even_in_minicircuit;
436 auto check_standard_limb_decomposition = [MICRO_LIMB_SHIFT,
440 lagrange_even_in_minicircuit](
auto& micro_limb_0,
445 auto& decomposed_limb) {
446 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
447 micro_limb_3 * MICRO_LIMB_SHIFTx3 + micro_limb_4 * MICRO_LIMB_SHIFTx4 - decomposed_limb) *
448 lagrange_even_in_minicircuit;
455 auto check_standard_top_limb_decomposition =
456 [MICRO_LIMB_SHIFT, MICRO_LIMB_SHIFTx2, MICRO_LIMB_SHIFTx3, lagrange_even_in_minicircuit](
457 auto& micro_limb_0,
auto& micro_limb_1,
auto& micro_limb_2,
auto& micro_limb_3,
auto& decomposed_limb) {
458 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
459 micro_limb_3 * MICRO_LIMB_SHIFTx3 - decomposed_limb) *
460 lagrange_even_in_minicircuit;
468 auto check_standard_tail_micro_limb_correctness =
469 [SHIFT_12_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
470 return (nonshifted_micro_limb * SHIFT_12_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
478 auto check_top_tail_micro_limb_correctness =
479 [SHIFT_8_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
480 return (nonshifted_micro_limb * SHIFT_8_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
488 auto check_z_top_tail_micro_limb_correctness =
489 [SHIFT_4_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
490 return (nonshifted_micro_limb * SHIFT_4_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
498 auto check_quotient_top_tail_micro_limb_correctness =
499 [SHIFT_10_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
500 return (nonshifted_micro_limb * SHIFT_10_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
507 auto check_wide_limb_into_regular_limb_correctness =
508 [LIMB_SHIFT, lagrange_even_in_minicircuit](
auto& low_limb,
auto& high_limb,
auto& wide_limb) {
509 return (low_limb + high_limb * LIMB_SHIFT - wide_limb) * lagrange_even_in_minicircuit;
513 expected_values[0] = op * check_standard_limb_decomposition(accumulator_low_limbs_range_constraint_0,
514 accumulator_low_limbs_range_constraint_1,
515 accumulator_low_limbs_range_constraint_2,
516 accumulator_low_limbs_range_constraint_3,
517 accumulator_low_limbs_range_constraint_4,
518 accumulators_binary_limbs_0);
519 expected_values[1] = op * check_standard_limb_decomposition(accumulator_low_limbs_range_constraint_0_shift,
520 accumulator_low_limbs_range_constraint_1_shift,
521 accumulator_low_limbs_range_constraint_2_shift,
522 accumulator_low_limbs_range_constraint_3_shift,
523 accumulator_low_limbs_range_constraint_4_shift,
524 accumulators_binary_limbs_1);
525 expected_values[2] = op * check_standard_limb_decomposition(accumulator_high_limbs_range_constraint_0,
526 accumulator_high_limbs_range_constraint_1,
527 accumulator_high_limbs_range_constraint_2,
528 accumulator_high_limbs_range_constraint_3,
529 accumulator_high_limbs_range_constraint_4,
530 accumulators_binary_limbs_2);
531 expected_values[3] = op * check_standard_top_limb_decomposition(accumulator_high_limbs_range_constraint_0_shift,
532 accumulator_high_limbs_range_constraint_1_shift,
533 accumulator_high_limbs_range_constraint_2_shift,
534 accumulator_high_limbs_range_constraint_3_shift,
535 accumulators_binary_limbs_3);
537 expected_values[4] = check_standard_limb_decomposition(p_y_low_limbs_range_constraint_0,
538 p_y_low_limbs_range_constraint_1,
539 p_y_low_limbs_range_constraint_2,
540 p_y_low_limbs_range_constraint_3,
541 p_y_low_limbs_range_constraint_4,
543 expected_values[5] = check_standard_limb_decomposition(p_y_low_limbs_range_constraint_0_shift,
544 p_y_low_limbs_range_constraint_1_shift,
545 p_y_low_limbs_range_constraint_2_shift,
546 p_y_low_limbs_range_constraint_3_shift,
547 p_y_low_limbs_range_constraint_4_shift,
548 p_y_low_limbs_shift);
549 expected_values[6] = check_standard_limb_decomposition(p_y_high_limbs_range_constraint_0,
550 p_y_high_limbs_range_constraint_1,
551 p_y_high_limbs_range_constraint_2,
552 p_y_high_limbs_range_constraint_3,
553 p_y_high_limbs_range_constraint_4,
555 expected_values[7] = check_standard_top_limb_decomposition(p_y_high_limbs_range_constraint_0_shift,
556 p_y_high_limbs_range_constraint_1_shift,
557 p_y_high_limbs_range_constraint_2_shift,
558 p_y_high_limbs_range_constraint_3_shift,
559 p_y_high_limbs_shift);
560 expected_values[8] = check_standard_limb_decomposition(z_low_limbs_range_constraint_0,
561 z_low_limbs_range_constraint_1,
562 z_low_limbs_range_constraint_2,
563 z_low_limbs_range_constraint_3,
564 z_low_limbs_range_constraint_4,
566 expected_values[9] = check_standard_limb_decomposition(z_low_limbs_range_constraint_0_shift,
567 z_low_limbs_range_constraint_1_shift,
568 z_low_limbs_range_constraint_2_shift,
569 z_low_limbs_range_constraint_3_shift,
570 z_low_limbs_range_constraint_4_shift,
572 expected_values[10] = check_standard_limb_decomposition(z_high_limbs_range_constraint_0,
573 z_high_limbs_range_constraint_1,
574 z_high_limbs_range_constraint_2,
575 z_high_limbs_range_constraint_3,
576 z_high_limbs_range_constraint_4,
578 expected_values[11] = check_standard_limb_decomposition(z_high_limbs_range_constraint_0_shift,
579 z_high_limbs_range_constraint_1_shift,
580 z_high_limbs_range_constraint_2_shift,
581 z_high_limbs_range_constraint_3_shift,
582 z_high_limbs_range_constraint_4_shift,
584 expected_values[12] = check_standard_limb_decomposition(p_x_low_limbs_range_constraint_0,
585 p_x_low_limbs_range_constraint_1,
586 p_x_low_limbs_range_constraint_2,
587 p_x_low_limbs_range_constraint_3,
588 p_x_low_limbs_range_constraint_4,
590 expected_values[13] = check_standard_limb_decomposition(p_x_low_limbs_range_constraint_0_shift,
591 p_x_low_limbs_range_constraint_1_shift,
592 p_x_low_limbs_range_constraint_2_shift,
593 p_x_low_limbs_range_constraint_3_shift,
594 p_x_low_limbs_range_constraint_4_shift,
595 p_x_low_limbs_shift);
596 expected_values[14] = check_standard_limb_decomposition(p_x_high_limbs_range_constraint_0,
597 p_x_high_limbs_range_constraint_1,
598 p_x_high_limbs_range_constraint_2,
599 p_x_high_limbs_range_constraint_3,
600 p_x_high_limbs_range_constraint_4,
602 expected_values[15] = check_standard_top_limb_decomposition(p_x_high_limbs_range_constraint_0_shift,
603 p_x_high_limbs_range_constraint_1_shift,
604 p_x_high_limbs_range_constraint_2_shift,
605 p_x_high_limbs_range_constraint_3_shift,
606 p_x_high_limbs_shift);
608 expected_values[16] = check_standard_limb_decomposition(quotient_low_limbs_range_constraint_0,
609 quotient_low_limbs_range_constraint_1,
610 quotient_low_limbs_range_constraint_2,
611 quotient_low_limbs_range_constraint_3,
612 quotient_low_limbs_range_constraint_4,
613 quotient_low_binary_limbs);
614 expected_values[17] = check_standard_limb_decomposition(quotient_low_limbs_range_constraint_0_shift,
615 quotient_low_limbs_range_constraint_1_shift,
616 quotient_low_limbs_range_constraint_2_shift,
617 quotient_low_limbs_range_constraint_3_shift,
618 quotient_low_limbs_range_constraint_4_shift,
619 quotient_low_binary_limbs_shift);
620 expected_values[18] = check_standard_limb_decomposition(quotient_high_limbs_range_constraint_0,
621 quotient_high_limbs_range_constraint_1,
622 quotient_high_limbs_range_constraint_2,
623 quotient_high_limbs_range_constraint_3,
624 quotient_high_limbs_range_constraint_4,
625 quotient_high_binary_limbs);
626 expected_values[19] = check_standard_top_limb_decomposition(quotient_high_limbs_range_constraint_0_shift,
627 quotient_high_limbs_range_constraint_1_shift,
628 quotient_high_limbs_range_constraint_2_shift,
629 quotient_high_limbs_range_constraint_3_shift,
630 quotient_high_binary_limbs_shift);
632 expected_values[20] = check_relation_limb_decomposition(relation_wide_limbs_range_constraint_0,
633 relation_wide_limbs_range_constraint_1,
634 relation_wide_limbs_range_constraint_2,
635 relation_wide_limbs_range_constraint_3,
636 p_x_high_limbs_range_constraint_tail_shift,
637 accumulator_high_limbs_range_constraint_tail_shift,
638 relation_wide_limbs);
639 expected_values[21] = check_relation_limb_decomposition(relation_wide_limbs_range_constraint_0_shift,
640 relation_wide_limbs_range_constraint_1_shift,
641 relation_wide_limbs_range_constraint_2_shift,
642 relation_wide_limbs_range_constraint_3_shift,
643 p_y_high_limbs_range_constraint_tail_shift,
644 quotient_high_limbs_range_constraint_tail_shift,
645 relation_wide_limbs_shift);
648 expected_values[22] = check_standard_tail_micro_limb_correctness(p_x_low_limbs_range_constraint_4,
649 p_x_low_limbs_range_constraint_tail);
651 expected_values[23] = check_standard_tail_micro_limb_correctness(p_x_low_limbs_range_constraint_4_shift,
652 p_x_low_limbs_range_constraint_tail_shift);
654 expected_values[24] = check_standard_tail_micro_limb_correctness(p_x_high_limbs_range_constraint_4,
655 p_x_high_limbs_range_constraint_tail);
657 expected_values[25] = check_top_tail_micro_limb_correctness(p_x_high_limbs_range_constraint_3_shift,
658 p_x_high_limbs_range_constraint_4_shift);
660 expected_values[26] = check_standard_tail_micro_limb_correctness(p_y_low_limbs_range_constraint_4,
661 p_y_low_limbs_range_constraint_tail);
663 expected_values[27] = check_standard_tail_micro_limb_correctness(p_y_low_limbs_range_constraint_4_shift,
664 p_y_low_limbs_range_constraint_tail_shift);
666 expected_values[28] = check_standard_tail_micro_limb_correctness(p_y_high_limbs_range_constraint_4,
667 p_y_high_limbs_range_constraint_tail);
669 expected_values[29] = check_top_tail_micro_limb_correctness(p_y_high_limbs_range_constraint_3_shift,
670 p_y_high_limbs_range_constraint_4_shift);
672 expected_values[30] = check_standard_tail_micro_limb_correctness(z_low_limbs_range_constraint_4,
673 z_low_limbs_range_constraint_tail);
675 expected_values[31] = check_standard_tail_micro_limb_correctness(z_low_limbs_range_constraint_4_shift,
676 z_low_limbs_range_constraint_tail_shift);
678 expected_values[32] = check_z_top_tail_micro_limb_correctness(z_high_limbs_range_constraint_4,
679 z_high_limbs_range_constraint_tail);
681 expected_values[33] = check_z_top_tail_micro_limb_correctness(z_high_limbs_range_constraint_4_shift,
682 z_high_limbs_range_constraint_tail_shift);
684 expected_values[34] = check_standard_tail_micro_limb_correctness(accumulator_low_limbs_range_constraint_4,
685 accumulator_low_limbs_range_constraint_tail);
686 expected_values[35] = check_standard_tail_micro_limb_correctness(
687 accumulator_low_limbs_range_constraint_4_shift, accumulator_low_limbs_range_constraint_tail_shift);
689 expected_values[36] = check_standard_tail_micro_limb_correctness(accumulator_high_limbs_range_constraint_4,
690 accumulator_high_limbs_range_constraint_tail);
692 expected_values[37] = check_top_tail_micro_limb_correctness(accumulator_high_limbs_range_constraint_3_shift,
693 accumulator_high_limbs_range_constraint_4_shift);
695 expected_values[38] = check_standard_tail_micro_limb_correctness(quotient_low_limbs_range_constraint_4,
696 quotient_low_limbs_range_constraint_tail);
698 expected_values[39] = check_standard_tail_micro_limb_correctness(
699 quotient_low_limbs_range_constraint_4_shift, quotient_low_limbs_range_constraint_tail_shift);
701 expected_values[40] = check_standard_tail_micro_limb_correctness(quotient_high_limbs_range_constraint_4,
702 quotient_high_limbs_range_constraint_tail);
704 expected_values[41] = check_quotient_top_tail_micro_limb_correctness(
705 quotient_high_limbs_range_constraint_3_shift, quotient_high_limbs_range_constraint_4_shift);
709 expected_values[42] =
710 check_wide_limb_into_regular_limb_correctness(p_x_low_limbs, p_x_low_limbs_shift, x_lo_y_hi);
712 expected_values[43] =
713 check_wide_limb_into_regular_limb_correctness(p_x_high_limbs, p_x_high_limbs_shift, x_hi_z_1);
715 expected_values[44] =
716 check_wide_limb_into_regular_limb_correctness(p_y_low_limbs, p_y_low_limbs_shift, y_lo_z_2);
718 expected_values[45] =
719 check_wide_limb_into_regular_limb_correctness(p_y_high_limbs, p_y_high_limbs_shift, x_lo_y_hi_shift);
721 expected_values[46] = check_wide_limb_into_regular_limb_correctness(z_low_limbs, z_high_limbs, x_hi_z_1_shift);
723 expected_values[47] =
724 check_wide_limb_into_regular_limb_correctness(z_low_limbs_shift, z_high_limbs_shift, y_lo_z_2_shift);
726 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
836 const auto run_test = [](
bool random_inputs) {
843 const auto& p_x_low_limbs_range_constraint_0 = input_elements.p_x_low_limbs_range_constraint_0;
844 const auto& p_x_low_limbs_range_constraint_1 = input_elements.p_x_low_limbs_range_constraint_1;
845 const auto& p_x_low_limbs_range_constraint_2 = input_elements.p_x_low_limbs_range_constraint_2;
846 const auto& p_x_low_limbs_range_constraint_3 = input_elements.p_x_low_limbs_range_constraint_3;
847 const auto& p_x_low_limbs_range_constraint_4 = input_elements.p_x_low_limbs_range_constraint_4;
848 const auto& p_x_low_limbs_range_constraint_tail = input_elements.p_x_low_limbs_range_constraint_tail;
849 const auto& p_x_high_limbs_range_constraint_0 = input_elements.p_x_high_limbs_range_constraint_0;
850 const auto& p_x_high_limbs_range_constraint_1 = input_elements.p_x_high_limbs_range_constraint_1;
851 const auto& p_x_high_limbs_range_constraint_2 = input_elements.p_x_high_limbs_range_constraint_2;
852 const auto& p_x_high_limbs_range_constraint_3 = input_elements.p_x_high_limbs_range_constraint_3;
853 const auto& p_x_high_limbs_range_constraint_4 = input_elements.p_x_high_limbs_range_constraint_4;
854 const auto& p_x_high_limbs_range_constraint_tail = input_elements.p_x_high_limbs_range_constraint_tail;
855 const auto& p_y_low_limbs_range_constraint_0 = input_elements.p_y_low_limbs_range_constraint_0;
856 const auto& p_y_low_limbs_range_constraint_1 = input_elements.p_y_low_limbs_range_constraint_1;
857 const auto& p_y_low_limbs_range_constraint_2 = input_elements.p_y_low_limbs_range_constraint_2;
858 const auto& p_y_low_limbs_range_constraint_3 = input_elements.p_y_low_limbs_range_constraint_3;
859 const auto& p_y_low_limbs_range_constraint_4 = input_elements.p_y_low_limbs_range_constraint_4;
860 const auto& p_y_low_limbs_range_constraint_tail = input_elements.p_y_low_limbs_range_constraint_tail;
861 const auto& p_y_high_limbs_range_constraint_0 = input_elements.p_y_high_limbs_range_constraint_0;
862 const auto& p_y_high_limbs_range_constraint_1 = input_elements.p_y_high_limbs_range_constraint_1;
863 const auto& p_y_high_limbs_range_constraint_2 = input_elements.p_y_high_limbs_range_constraint_2;
864 const auto& p_y_high_limbs_range_constraint_3 = input_elements.p_y_high_limbs_range_constraint_3;
865 const auto& p_y_high_limbs_range_constraint_4 = input_elements.p_y_high_limbs_range_constraint_4;
866 const auto& p_y_high_limbs_range_constraint_tail = input_elements.p_y_high_limbs_range_constraint_tail;
867 const auto& z_low_limbs_range_constraint_0 = input_elements.z_low_limbs_range_constraint_0;
868 const auto& z_low_limbs_range_constraint_1 = input_elements.z_low_limbs_range_constraint_1;
869 const auto& z_low_limbs_range_constraint_2 = input_elements.z_low_limbs_range_constraint_2;
870 const auto& z_low_limbs_range_constraint_3 = input_elements.z_low_limbs_range_constraint_3;
871 const auto& z_low_limbs_range_constraint_4 = input_elements.z_low_limbs_range_constraint_4;
872 const auto& z_low_limbs_range_constraint_tail = input_elements.z_low_limbs_range_constraint_tail;
873 const auto& z_high_limbs_range_constraint_0 = input_elements.z_high_limbs_range_constraint_0;
874 const auto& z_high_limbs_range_constraint_1 = input_elements.z_high_limbs_range_constraint_1;
875 const auto& z_high_limbs_range_constraint_2 = input_elements.z_high_limbs_range_constraint_2;
876 const auto& z_high_limbs_range_constraint_3 = input_elements.z_high_limbs_range_constraint_3;
877 const auto& z_high_limbs_range_constraint_4 = input_elements.z_high_limbs_range_constraint_4;
878 const auto& z_high_limbs_range_constraint_tail = input_elements.z_high_limbs_range_constraint_tail;
879 const auto& accumulator_low_limbs_range_constraint_0 = input_elements.accumulator_low_limbs_range_constraint_0;
880 const auto& accumulator_low_limbs_range_constraint_1 = input_elements.accumulator_low_limbs_range_constraint_1;
881 const auto& accumulator_low_limbs_range_constraint_2 = input_elements.accumulator_low_limbs_range_constraint_2;
882 const auto& accumulator_low_limbs_range_constraint_3 = input_elements.accumulator_low_limbs_range_constraint_3;
883 const auto& accumulator_low_limbs_range_constraint_4 = input_elements.accumulator_low_limbs_range_constraint_4;
884 const auto& accumulator_low_limbs_range_constraint_tail =
885 input_elements.accumulator_low_limbs_range_constraint_tail;
886 const auto& accumulator_high_limbs_range_constraint_0 =
887 input_elements.accumulator_high_limbs_range_constraint_0;
888 const auto& accumulator_high_limbs_range_constraint_1 =
889 input_elements.accumulator_high_limbs_range_constraint_1;
890 const auto& accumulator_high_limbs_range_constraint_2 =
891 input_elements.accumulator_high_limbs_range_constraint_2;
892 const auto& accumulator_high_limbs_range_constraint_3 =
893 input_elements.accumulator_high_limbs_range_constraint_3;
894 const auto& accumulator_high_limbs_range_constraint_4 =
895 input_elements.accumulator_high_limbs_range_constraint_4;
896 const auto& accumulator_high_limbs_range_constraint_tail =
897 input_elements.accumulator_high_limbs_range_constraint_tail;
898 const auto& quotient_low_limbs_range_constraint_0 = input_elements.quotient_low_limbs_range_constraint_0;
899 const auto& quotient_low_limbs_range_constraint_1 = input_elements.quotient_low_limbs_range_constraint_1;
900 const auto& quotient_low_limbs_range_constraint_2 = input_elements.quotient_low_limbs_range_constraint_2;
901 const auto& quotient_low_limbs_range_constraint_3 = input_elements.quotient_low_limbs_range_constraint_3;
902 const auto& quotient_low_limbs_range_constraint_4 = input_elements.quotient_low_limbs_range_constraint_4;
903 const auto& quotient_low_limbs_range_constraint_tail = input_elements.quotient_low_limbs_range_constraint_tail;
904 const auto& quotient_high_limbs_range_constraint_0 = input_elements.quotient_high_limbs_range_constraint_0;
905 const auto& quotient_high_limbs_range_constraint_1 = input_elements.quotient_high_limbs_range_constraint_1;
906 const auto& quotient_high_limbs_range_constraint_2 = input_elements.quotient_high_limbs_range_constraint_2;
907 const auto& quotient_high_limbs_range_constraint_3 = input_elements.quotient_high_limbs_range_constraint_3;
908 const auto& quotient_high_limbs_range_constraint_4 = input_elements.quotient_high_limbs_range_constraint_4;
909 const auto& quotient_high_limbs_range_constraint_tail =
910 input_elements.quotient_high_limbs_range_constraint_tail;
911 const auto& relation_wide_limbs_range_constraint_0 = input_elements.relation_wide_limbs_range_constraint_0;
912 const auto& relation_wide_limbs_range_constraint_1 = input_elements.relation_wide_limbs_range_constraint_1;
913 const auto& relation_wide_limbs_range_constraint_2 = input_elements.relation_wide_limbs_range_constraint_2;
914 const auto& relation_wide_limbs_range_constraint_3 = input_elements.relation_wide_limbs_range_constraint_3;
915 const auto& op = input_elements.op;
916 const auto& x_lo_y_hi = input_elements.x_lo_y_hi;
917 const auto& x_hi_z_1 = input_elements.x_hi_z_1;
918 const auto& y_lo_z_2 = input_elements.y_lo_z_2;
919 const auto& lagrange_odd_in_minicircuit = input_elements.lagrange_odd_in_minicircuit;
920 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
921 const auto& lagrange_mini_masking = input_elements.lagrange_mini_masking;
923 RelationValues expected_values;
927 expected_values[0] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
928 (lagrange_mini_masking -
FF(1)) * p_x_low_limbs_range_constraint_0;
929 expected_values[1] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
930 (lagrange_mini_masking -
FF(1)) * p_x_low_limbs_range_constraint_1;
931 expected_values[2] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
932 (lagrange_mini_masking -
FF(1)) * p_x_low_limbs_range_constraint_2;
933 expected_values[3] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
934 (lagrange_mini_masking -
FF(1)) * p_x_low_limbs_range_constraint_3;
935 expected_values[4] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
936 (lagrange_mini_masking -
FF(1)) * p_x_low_limbs_range_constraint_4;
937 expected_values[5] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
938 (lagrange_mini_masking -
FF(1)) * p_x_high_limbs_range_constraint_0;
939 expected_values[6] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
940 (lagrange_mini_masking -
FF(1)) * p_x_high_limbs_range_constraint_1;
941 expected_values[7] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
942 (lagrange_mini_masking -
FF(1)) * p_x_high_limbs_range_constraint_2;
943 expected_values[8] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
944 (lagrange_mini_masking -
FF(1)) * p_x_high_limbs_range_constraint_3;
945 expected_values[9] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
946 (lagrange_mini_masking -
FF(1)) * p_x_high_limbs_range_constraint_4;
947 expected_values[10] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
948 (lagrange_mini_masking -
FF(1)) * p_y_low_limbs_range_constraint_0;
949 expected_values[11] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
950 (lagrange_mini_masking -
FF(1)) * p_y_low_limbs_range_constraint_1;
951 expected_values[12] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
952 (lagrange_mini_masking -
FF(1)) * p_y_low_limbs_range_constraint_2;
953 expected_values[13] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
954 (lagrange_mini_masking -
FF(1)) * p_y_low_limbs_range_constraint_3;
955 expected_values[14] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
956 (lagrange_mini_masking -
FF(1)) * p_y_low_limbs_range_constraint_4;
957 expected_values[15] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
958 (lagrange_mini_masking -
FF(1)) * p_y_high_limbs_range_constraint_0;
959 expected_values[16] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
960 (lagrange_mini_masking -
FF(1)) * p_y_high_limbs_range_constraint_1;
961 expected_values[17] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
962 (lagrange_mini_masking -
FF(1)) * p_y_high_limbs_range_constraint_2;
963 expected_values[18] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
964 (lagrange_mini_masking -
FF(1)) * p_y_high_limbs_range_constraint_3;
965 expected_values[19] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
966 (lagrange_mini_masking -
FF(1)) * p_y_high_limbs_range_constraint_4;
967 expected_values[20] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
968 (lagrange_mini_masking -
FF(1)) * z_low_limbs_range_constraint_0;
969 expected_values[21] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
970 (lagrange_mini_masking -
FF(1)) * z_low_limbs_range_constraint_1;
971 expected_values[22] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
972 (lagrange_mini_masking -
FF(1)) * z_low_limbs_range_constraint_2;
973 expected_values[23] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
974 (lagrange_mini_masking -
FF(1)) * z_low_limbs_range_constraint_3;
975 expected_values[24] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
976 (lagrange_mini_masking -
FF(1)) * z_low_limbs_range_constraint_4;
977 expected_values[25] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
978 (lagrange_mini_masking -
FF(1)) * z_high_limbs_range_constraint_0;
979 expected_values[26] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
980 (lagrange_mini_masking -
FF(1)) * z_high_limbs_range_constraint_1;
981 expected_values[27] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
982 (lagrange_mini_masking -
FF(1)) * z_high_limbs_range_constraint_2;
983 expected_values[28] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
984 (lagrange_mini_masking -
FF(1)) * z_high_limbs_range_constraint_3;
985 expected_values[29] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
986 (lagrange_mini_masking -
FF(1)) * z_high_limbs_range_constraint_4;
987 expected_values[30] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
988 (lagrange_mini_masking -
FF(1)) * accumulator_low_limbs_range_constraint_0;
989 expected_values[31] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
990 (lagrange_mini_masking -
FF(1)) * accumulator_low_limbs_range_constraint_1;
991 expected_values[32] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
992 (lagrange_mini_masking -
FF(1)) * accumulator_low_limbs_range_constraint_2;
993 expected_values[33] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
994 (lagrange_mini_masking -
FF(1)) * accumulator_low_limbs_range_constraint_3;
995 expected_values[34] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
996 (lagrange_mini_masking -
FF(1)) * accumulator_low_limbs_range_constraint_4;
997 expected_values[35] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
998 (lagrange_mini_masking -
FF(1)) * accumulator_high_limbs_range_constraint_0;
999 expected_values[36] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1000 (lagrange_mini_masking -
FF(1)) * accumulator_high_limbs_range_constraint_1;
1001 expected_values[37] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1002 (lagrange_mini_masking -
FF(1)) * accumulator_high_limbs_range_constraint_2;
1003 expected_values[38] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1004 (lagrange_mini_masking -
FF(1)) * accumulator_high_limbs_range_constraint_3;
1005 expected_values[39] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1006 (lagrange_mini_masking -
FF(1)) * accumulator_high_limbs_range_constraint_4;
1007 expected_values[40] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1008 (lagrange_mini_masking -
FF(1)) * quotient_low_limbs_range_constraint_0;
1009 expected_values[41] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1010 (lagrange_mini_masking -
FF(1)) * quotient_low_limbs_range_constraint_1;
1011 expected_values[42] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1012 (lagrange_mini_masking -
FF(1)) * quotient_low_limbs_range_constraint_2;
1013 expected_values[43] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1014 (lagrange_mini_masking -
FF(1)) * quotient_low_limbs_range_constraint_3;
1015 expected_values[44] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1016 (lagrange_mini_masking -
FF(1)) * quotient_low_limbs_range_constraint_4;
1017 expected_values[45] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1018 (lagrange_mini_masking -
FF(1)) * quotient_high_limbs_range_constraint_0;
1019 expected_values[46] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1020 (lagrange_mini_masking -
FF(1)) * quotient_high_limbs_range_constraint_1;
1021 expected_values[47] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1022 (lagrange_mini_masking -
FF(1)) * quotient_high_limbs_range_constraint_2;
1023 expected_values[48] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1024 (lagrange_mini_masking -
FF(1)) * quotient_high_limbs_range_constraint_3;
1025 expected_values[49] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1026 (lagrange_mini_masking -
FF(1)) * quotient_high_limbs_range_constraint_4;
1027 expected_values[50] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1028 (lagrange_mini_masking -
FF(1)) * relation_wide_limbs_range_constraint_0;
1029 expected_values[51] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1030 (lagrange_mini_masking -
FF(1)) * relation_wide_limbs_range_constraint_1;
1031 expected_values[52] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1032 (lagrange_mini_masking -
FF(1)) * relation_wide_limbs_range_constraint_2;
1033 expected_values[53] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1034 (lagrange_mini_masking -
FF(1)) * relation_wide_limbs_range_constraint_3;
1035 expected_values[54] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1036 (lagrange_mini_masking -
FF(1)) * p_x_low_limbs_range_constraint_tail;
1037 expected_values[55] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1038 (lagrange_mini_masking -
FF(1)) * p_x_high_limbs_range_constraint_tail;
1039 expected_values[56] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1040 (lagrange_mini_masking -
FF(1)) * p_y_low_limbs_range_constraint_tail;
1041 expected_values[57] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1042 (lagrange_mini_masking -
FF(1)) * p_y_high_limbs_range_constraint_tail;
1043 expected_values[58] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1044 (lagrange_mini_masking -
FF(1)) * z_low_limbs_range_constraint_tail;
1045 expected_values[59] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1046 (lagrange_mini_masking -
FF(1)) * z_high_limbs_range_constraint_tail;
1047 expected_values[60] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1048 (lagrange_mini_masking -
FF(1)) * accumulator_low_limbs_range_constraint_tail;
1049 expected_values[61] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1050 (lagrange_mini_masking -
FF(1)) * accumulator_high_limbs_range_constraint_tail;
1051 expected_values[62] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1052 (lagrange_mini_masking -
FF(1)) * quotient_low_limbs_range_constraint_tail;
1053 expected_values[63] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1054 (lagrange_mini_masking -
FF(1)) * quotient_high_limbs_range_constraint_tail;
1055 expected_values[64] =
1056 (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) * (lagrange_mini_masking -
FF(1)) * op;
1057 expected_values[65] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1058 (lagrange_mini_masking -
FF(1)) * x_lo_y_hi;
1059 expected_values[66] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1060 (lagrange_mini_masking -
FF(1)) * x_hi_z_1;
1061 expected_values[67] = (lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit - 1) *
1062 (lagrange_mini_masking -
FF(1)) * y_lo_z_2;
1064 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
1072 const auto run_test = [](
bool random_inputs) {
1073 const size_t NUM_LIMB_BITS = 68;
1079 const uint512_t NEGATIVE_PRIME_MODULUS = BINARY_BASIS_MODULUS - MODULUS_U512;
1081 FF(NEGATIVE_PRIME_MODULUS.
slice(0, NUM_LIMB_BITS).
lo),
1082 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2).
lo),
1083 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3).
lo),
1084 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4).
lo),
1093 auto& op = input_elements.op;
1094 auto& p_x_low_limbs = input_elements.p_x_low_limbs;
1095 auto& p_y_low_limbs = input_elements.p_y_low_limbs;
1096 auto& p_x_high_limbs = input_elements.p_x_high_limbs;
1097 auto& p_y_high_limbs = input_elements.p_y_high_limbs;
1098 auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
1099 auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
1100 auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
1101 auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
1102 auto& z_low_limbs = input_elements.z_low_limbs;
1103 auto& z_high_limbs = input_elements.z_high_limbs;
1104 auto& quotient_low_binary_limbs = input_elements.quotient_low_binary_limbs;
1105 auto& quotient_high_binary_limbs = input_elements.quotient_high_binary_limbs;
1106 auto& p_x_low_limbs_shift = input_elements.p_x_low_limbs_shift;
1107 auto& p_y_low_limbs_shift = input_elements.p_y_low_limbs_shift;
1108 auto& p_x_high_limbs_shift = input_elements.p_x_high_limbs_shift;
1109 auto& p_y_high_limbs_shift = input_elements.p_y_high_limbs_shift;
1110 auto& accumulators_binary_limbs_0_shift = input_elements.accumulators_binary_limbs_0_shift;
1111 auto& accumulators_binary_limbs_1_shift = input_elements.accumulators_binary_limbs_1_shift;
1112 auto& accumulators_binary_limbs_2_shift = input_elements.accumulators_binary_limbs_2_shift;
1113 auto& accumulators_binary_limbs_3_shift = input_elements.accumulators_binary_limbs_3_shift;
1114 auto& z_low_limbs_shift = input_elements.z_low_limbs_shift;
1115 auto& z_high_limbs_shift = input_elements.z_high_limbs_shift;
1116 auto& quotient_low_binary_limbs_shift = input_elements.quotient_low_binary_limbs_shift;
1117 auto& quotient_high_binary_limbs_shift = input_elements.quotient_high_binary_limbs_shift;
1118 auto& relation_wide_limbs = input_elements.relation_wide_limbs;
1119 auto& relation_wide_limbs_shift = input_elements.relation_wide_limbs_shift;
1120 auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
1122 RelationValues expected_values;
1129 expected_values[0] =
1130 (accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[0] + op +
1131 p_x_low_limbs * parameters.batching_challenge_v[0][0] +
1132 p_y_low_limbs * parameters.batching_challenge_v[1][0] +
1133 z_low_limbs * parameters.batching_challenge_v[2][0] +
1134 z_low_limbs_shift * parameters.batching_challenge_v[3][0] +
1135 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[0] - accumulators_binary_limbs_0 +
1136 (accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[0] +
1137 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[1] +
1138 p_x_low_limbs * parameters.batching_challenge_v[0][1] +
1139 p_x_low_limbs_shift * parameters.batching_challenge_v[0][0] +
1140 p_y_low_limbs * parameters.batching_challenge_v[1][1] +
1141 p_y_low_limbs_shift * parameters.batching_challenge_v[1][0] +
1142 z_low_limbs * parameters.batching_challenge_v[2][1] +
1143 z_high_limbs * parameters.batching_challenge_v[2][0] +
1144 z_low_limbs_shift * parameters.batching_challenge_v[3][1] +
1145 z_high_limbs_shift * parameters.batching_challenge_v[3][0] +
1146 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[1] +
1147 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0] - accumulators_binary_limbs_1) *
1149 relation_wide_limbs * shiftx2) *
1150 lagrange_even_in_minicircuit * op;
1153 expected_values[1] =
1154 (relation_wide_limbs + accumulators_binary_limbs_2_shift * parameters.evaluation_input_x[0] +
1155 accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[1] +
1156 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[2] +
1157 p_x_high_limbs * parameters.batching_challenge_v[0][0] +
1158 p_x_low_limbs_shift * parameters.batching_challenge_v[0][1] +
1159 p_x_low_limbs * parameters.batching_challenge_v[0][2] +
1160 p_y_high_limbs * parameters.batching_challenge_v[1][0] +
1161 p_y_low_limbs_shift * parameters.batching_challenge_v[1][1] +
1162 p_y_low_limbs * parameters.batching_challenge_v[1][2] +
1163 z_high_limbs * parameters.batching_challenge_v[2][1] +
1164 z_low_limbs * parameters.batching_challenge_v[2][2] +
1165 z_high_limbs_shift * parameters.batching_challenge_v[3][1] +
1166 z_low_limbs_shift * parameters.batching_challenge_v[3][2] +
1167 quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[0] +
1168 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[1] +
1169 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[2] - accumulators_binary_limbs_2 +
1170 (accumulators_binary_limbs_3_shift * parameters.evaluation_input_x[0] +
1171 accumulators_binary_limbs_2_shift * parameters.evaluation_input_x[1] +
1172 accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[2] +
1173 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[3] +
1174 p_x_high_limbs_shift * parameters.batching_challenge_v[0][0] +
1175 p_x_high_limbs * parameters.batching_challenge_v[0][1] +
1176 p_x_low_limbs_shift * parameters.batching_challenge_v[0][2] +
1177 p_x_low_limbs * parameters.batching_challenge_v[0][3] +
1178 p_y_high_limbs_shift * parameters.batching_challenge_v[1][0] +
1179 p_y_high_limbs * parameters.batching_challenge_v[1][1] +
1180 p_y_low_limbs_shift * parameters.batching_challenge_v[1][2] +
1181 p_y_low_limbs * parameters.batching_challenge_v[1][3] +
1182 z_high_limbs * parameters.batching_challenge_v[2][2] +
1183 z_low_limbs * parameters.batching_challenge_v[2][3] +
1184 z_high_limbs_shift * parameters.batching_challenge_v[3][2] +
1185 z_low_limbs_shift * parameters.batching_challenge_v[3][3] +
1186 quotient_high_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0] +
1187 quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[1] +
1188 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[2] +
1189 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[3] - accumulators_binary_limbs_3) *
1191 relation_wide_limbs_shift * shiftx2) *
1192 lagrange_even_in_minicircuit * op;
1193 auto reconstructed_p_x =
1194 (p_x_low_limbs + p_x_low_limbs_shift * shift + p_x_high_limbs * shiftx2 + p_x_high_limbs_shift * shiftx3);
1195 auto reconstructed_p_y =
1196 (p_y_low_limbs + p_y_low_limbs_shift * shift + p_y_high_limbs * shiftx2 + p_y_high_limbs_shift * shiftx3);
1197 auto reconstructed_previous_accumulator =
1198 (accumulators_binary_limbs_0_shift + accumulators_binary_limbs_1_shift * shift +
1199 accumulators_binary_limbs_2_shift * shiftx2 + accumulators_binary_limbs_3_shift * shiftx3);
1200 auto reconstructed_current_accumulator =
1201 (accumulators_binary_limbs_0 + accumulators_binary_limbs_1 * shift + accumulators_binary_limbs_2 * shiftx2 +
1202 accumulators_binary_limbs_3 * shiftx3);
1203 auto reconstructed_z1 = (z_low_limbs + z_high_limbs * shift);
1204 auto reconstructed_z2 = (z_low_limbs_shift + z_high_limbs_shift * shift);
1205 auto reconstructed_quotient =
1206 (quotient_low_binary_limbs + quotient_low_binary_limbs_shift * shift +
1207 quotient_high_binary_limbs * shiftx2 + quotient_high_binary_limbs_shift * shiftx3);
1210 expected_values[2] = (reconstructed_previous_accumulator * parameters.evaluation_input_x[4] + op +
1211 reconstructed_p_x * parameters.batching_challenge_v[0][4] +
1212 reconstructed_p_y * parameters.batching_challenge_v[1][4] +
1213 reconstructed_z1 * parameters.batching_challenge_v[2][4] +
1214 reconstructed_z2 * parameters.batching_challenge_v[3][4] +
1215 reconstructed_quotient * NEGATIVE_MODULUS_LIMBS[4] - reconstructed_current_accumulator) *
1216 lagrange_even_in_minicircuit * op;
1218 validate_relation_execution<Relation>(expected_values, input_elements, parameters);