182 const auto run_test = [](
bool random_inputs) {
189 const auto& p_x_low_limbs_range_constraint_0 = input_elements.p_x_low_limbs_range_constraint_0;
190 const auto& p_x_low_limbs_range_constraint_1 = input_elements.p_x_low_limbs_range_constraint_1;
191 const auto& p_x_low_limbs_range_constraint_2 = input_elements.p_x_low_limbs_range_constraint_2;
192 const auto& p_x_low_limbs_range_constraint_3 = input_elements.p_x_low_limbs_range_constraint_3;
193 const auto& p_x_low_limbs_range_constraint_4 = input_elements.p_x_low_limbs_range_constraint_4;
194 const auto& p_x_low_limbs_range_constraint_tail = input_elements.p_x_low_limbs_range_constraint_tail;
195 const auto& p_x_low_limbs = input_elements.p_x_low_limbs;
196 const auto& p_x_high_limbs_range_constraint_0 = input_elements.p_x_high_limbs_range_constraint_0;
197 const auto& p_x_high_limbs_range_constraint_1 = input_elements.p_x_high_limbs_range_constraint_1;
198 const auto& p_x_high_limbs_range_constraint_2 = input_elements.p_x_high_limbs_range_constraint_2;
199 const auto& p_x_high_limbs_range_constraint_3 = input_elements.p_x_high_limbs_range_constraint_3;
200 const auto& p_x_high_limbs_range_constraint_4 = input_elements.p_x_high_limbs_range_constraint_4;
201 const auto& p_x_high_limbs_range_constraint_tail = input_elements.p_x_high_limbs_range_constraint_tail;
202 const auto& p_x_high_limbs = input_elements.p_x_high_limbs;
203 const auto& p_x_low_limbs_range_constraint_0_shift = input_elements.p_x_low_limbs_range_constraint_0_shift;
204 const auto& p_x_low_limbs_range_constraint_1_shift = input_elements.p_x_low_limbs_range_constraint_1_shift;
205 const auto& p_x_low_limbs_range_constraint_2_shift = input_elements.p_x_low_limbs_range_constraint_2_shift;
206 const auto& p_x_low_limbs_range_constraint_3_shift = input_elements.p_x_low_limbs_range_constraint_3_shift;
207 const auto& p_x_low_limbs_range_constraint_4_shift = input_elements.p_x_low_limbs_range_constraint_4_shift;
208 const auto& p_x_low_limbs_range_constraint_tail_shift =
209 input_elements.p_x_low_limbs_range_constraint_tail_shift;
210 const auto& p_x_low_limbs_shift = input_elements.p_x_low_limbs_shift;
211 const auto& p_x_high_limbs_range_constraint_0_shift = input_elements.p_x_high_limbs_range_constraint_0_shift;
212 const auto& p_x_high_limbs_range_constraint_1_shift = input_elements.p_x_high_limbs_range_constraint_1_shift;
213 const auto& p_x_high_limbs_range_constraint_2_shift = input_elements.p_x_high_limbs_range_constraint_2_shift;
214 const auto& p_x_high_limbs_range_constraint_3_shift = input_elements.p_x_high_limbs_range_constraint_3_shift;
215 const auto& p_x_high_limbs_range_constraint_4_shift = input_elements.p_x_high_limbs_range_constraint_4_shift;
216 const auto& p_x_high_limbs_range_constraint_tail_shift =
217 input_elements.p_x_high_limbs_range_constraint_tail_shift;
218 const auto& p_x_high_limbs_shift = input_elements.p_x_high_limbs_shift;
219 const auto& p_y_low_limbs_range_constraint_0 = input_elements.p_y_low_limbs_range_constraint_0;
220 const auto& p_y_low_limbs_range_constraint_1 = input_elements.p_y_low_limbs_range_constraint_1;
221 const auto& p_y_low_limbs_range_constraint_2 = input_elements.p_y_low_limbs_range_constraint_2;
222 const auto& p_y_low_limbs_range_constraint_3 = input_elements.p_y_low_limbs_range_constraint_3;
223 const auto& p_y_low_limbs_range_constraint_4 = input_elements.p_y_low_limbs_range_constraint_4;
224 const auto& p_y_low_limbs_range_constraint_tail = input_elements.p_y_low_limbs_range_constraint_tail;
225 const auto& p_y_low_limbs = input_elements.p_y_low_limbs;
226 const auto& p_y_high_limbs_range_constraint_0 = input_elements.p_y_high_limbs_range_constraint_0;
227 const auto& p_y_high_limbs_range_constraint_1 = input_elements.p_y_high_limbs_range_constraint_1;
228 const auto& p_y_high_limbs_range_constraint_2 = input_elements.p_y_high_limbs_range_constraint_2;
229 const auto& p_y_high_limbs_range_constraint_3 = input_elements.p_y_high_limbs_range_constraint_3;
230 const auto& p_y_high_limbs_range_constraint_4 = input_elements.p_y_high_limbs_range_constraint_4;
231 const auto& p_y_high_limbs_range_constraint_tail = input_elements.p_y_high_limbs_range_constraint_tail;
232 const auto& p_y_high_limbs = input_elements.p_y_high_limbs;
233 const auto& p_y_low_limbs_range_constraint_0_shift = input_elements.p_y_low_limbs_range_constraint_0_shift;
234 const auto& p_y_low_limbs_range_constraint_1_shift = input_elements.p_y_low_limbs_range_constraint_1_shift;
235 const auto& p_y_low_limbs_range_constraint_2_shift = input_elements.p_y_low_limbs_range_constraint_2_shift;
236 const auto& p_y_low_limbs_range_constraint_3_shift = input_elements.p_y_low_limbs_range_constraint_3_shift;
237 const auto& p_y_low_limbs_range_constraint_4_shift = input_elements.p_y_low_limbs_range_constraint_4_shift;
238 const auto& p_y_low_limbs_range_constraint_tail_shift =
239 input_elements.p_y_low_limbs_range_constraint_tail_shift;
240 const auto& p_y_low_limbs_shift = input_elements.p_y_low_limbs_shift;
241 const auto& p_y_high_limbs_range_constraint_0_shift = input_elements.p_y_high_limbs_range_constraint_0_shift;
242 const auto& p_y_high_limbs_range_constraint_1_shift = input_elements.p_y_high_limbs_range_constraint_1_shift;
243 const auto& p_y_high_limbs_range_constraint_2_shift = input_elements.p_y_high_limbs_range_constraint_2_shift;
244 const auto& p_y_high_limbs_range_constraint_3_shift = input_elements.p_y_high_limbs_range_constraint_3_shift;
245 const auto& p_y_high_limbs_range_constraint_4_shift = input_elements.p_y_high_limbs_range_constraint_4_shift;
246 const auto& p_y_high_limbs_range_constraint_tail_shift =
247 input_elements.p_y_high_limbs_range_constraint_tail_shift;
248 const auto& p_y_high_limbs_shift = input_elements.p_y_high_limbs_shift;
249 const auto& z_low_limbs_range_constraint_0 = input_elements.z_low_limbs_range_constraint_0;
250 const auto& z_low_limbs_range_constraint_1 = input_elements.z_low_limbs_range_constraint_1;
251 const auto& z_low_limbs_range_constraint_2 = input_elements.z_low_limbs_range_constraint_2;
252 const auto& z_low_limbs_range_constraint_3 = input_elements.z_low_limbs_range_constraint_3;
253 const auto& z_low_limbs_range_constraint_4 = input_elements.z_low_limbs_range_constraint_4;
254 const auto& z_low_limbs_range_constraint_tail = input_elements.z_low_limbs_range_constraint_tail;
255 const auto& z_low_limbs = input_elements.z_low_limbs;
256 const auto& z_low_limbs_range_constraint_0_shift = input_elements.z_low_limbs_range_constraint_0_shift;
257 const auto& z_low_limbs_range_constraint_1_shift = input_elements.z_low_limbs_range_constraint_1_shift;
258 const auto& z_low_limbs_range_constraint_2_shift = input_elements.z_low_limbs_range_constraint_2_shift;
259 const auto& z_low_limbs_range_constraint_3_shift = input_elements.z_low_limbs_range_constraint_3_shift;
260 const auto& z_low_limbs_range_constraint_4_shift = input_elements.z_low_limbs_range_constraint_4_shift;
261 const auto& z_low_limbs_range_constraint_tail_shift = input_elements.z_low_limbs_range_constraint_tail_shift;
262 const auto& z_low_limbs_shift = input_elements.z_low_limbs_shift;
263 const auto& z_high_limbs_range_constraint_0 = input_elements.z_high_limbs_range_constraint_0;
264 const auto& z_high_limbs_range_constraint_1 = input_elements.z_high_limbs_range_constraint_1;
265 const auto& z_high_limbs_range_constraint_2 = input_elements.z_high_limbs_range_constraint_2;
266 const auto& z_high_limbs_range_constraint_3 = input_elements.z_high_limbs_range_constraint_3;
267 const auto& z_high_limbs_range_constraint_4 = input_elements.z_high_limbs_range_constraint_4;
268 const auto& z_high_limbs_range_constraint_tail = input_elements.z_high_limbs_range_constraint_tail;
269 const auto& z_high_limbs = input_elements.z_high_limbs;
270 const auto& z_high_limbs_range_constraint_0_shift = input_elements.z_high_limbs_range_constraint_0_shift;
271 const auto& z_high_limbs_range_constraint_1_shift = input_elements.z_high_limbs_range_constraint_1_shift;
272 const auto& z_high_limbs_range_constraint_2_shift = input_elements.z_high_limbs_range_constraint_2_shift;
273 const auto& z_high_limbs_range_constraint_3_shift = input_elements.z_high_limbs_range_constraint_3_shift;
274 const auto& z_high_limbs_range_constraint_4_shift = input_elements.z_high_limbs_range_constraint_4_shift;
275 const auto& z_high_limbs_range_constraint_tail_shift = input_elements.z_high_limbs_range_constraint_tail_shift;
276 const auto& z_high_limbs_shift = input_elements.z_high_limbs_shift;
277 const auto& accumulator_low_limbs_range_constraint_0 = input_elements.accumulator_low_limbs_range_constraint_0;
278 const auto& accumulator_low_limbs_range_constraint_1 = input_elements.accumulator_low_limbs_range_constraint_1;
279 const auto& accumulator_low_limbs_range_constraint_2 = input_elements.accumulator_low_limbs_range_constraint_2;
280 const auto& accumulator_low_limbs_range_constraint_3 = input_elements.accumulator_low_limbs_range_constraint_3;
281 const auto& accumulator_low_limbs_range_constraint_4 = input_elements.accumulator_low_limbs_range_constraint_4;
282 const auto& accumulator_low_limbs_range_constraint_tail =
283 input_elements.accumulator_low_limbs_range_constraint_tail;
284 const auto& accumulator_low_limbs_range_constraint_0_shift =
285 input_elements.accumulator_low_limbs_range_constraint_0_shift;
286 const auto& accumulator_low_limbs_range_constraint_1_shift =
287 input_elements.accumulator_low_limbs_range_constraint_1_shift;
288 const auto& accumulator_low_limbs_range_constraint_2_shift =
289 input_elements.accumulator_low_limbs_range_constraint_2_shift;
290 const auto& accumulator_low_limbs_range_constraint_3_shift =
291 input_elements.accumulator_low_limbs_range_constraint_3_shift;
292 const auto& accumulator_low_limbs_range_constraint_4_shift =
293 input_elements.accumulator_low_limbs_range_constraint_4_shift;
294 const auto& accumulator_low_limbs_range_constraint_tail_shift =
295 input_elements.accumulator_low_limbs_range_constraint_tail_shift;
296 const auto& accumulator_high_limbs_range_constraint_0 =
297 input_elements.accumulator_high_limbs_range_constraint_0;
298 const auto& accumulator_high_limbs_range_constraint_1 =
299 input_elements.accumulator_high_limbs_range_constraint_1;
300 const auto& accumulator_high_limbs_range_constraint_2 =
301 input_elements.accumulator_high_limbs_range_constraint_2;
302 const auto& accumulator_high_limbs_range_constraint_3 =
303 input_elements.accumulator_high_limbs_range_constraint_3;
304 const auto& accumulator_high_limbs_range_constraint_4 =
305 input_elements.accumulator_high_limbs_range_constraint_4;
306 const auto& accumulator_high_limbs_range_constraint_tail =
307 input_elements.accumulator_high_limbs_range_constraint_tail;
308 const auto& accumulator_high_limbs_range_constraint_0_shift =
309 input_elements.accumulator_high_limbs_range_constraint_0_shift;
310 const auto& accumulator_high_limbs_range_constraint_1_shift =
311 input_elements.accumulator_high_limbs_range_constraint_1_shift;
312 const auto& accumulator_high_limbs_range_constraint_2_shift =
313 input_elements.accumulator_high_limbs_range_constraint_2_shift;
314 const auto& accumulator_high_limbs_range_constraint_3_shift =
315 input_elements.accumulator_high_limbs_range_constraint_3_shift;
316 const auto& accumulator_high_limbs_range_constraint_4_shift =
317 input_elements.accumulator_high_limbs_range_constraint_4_shift;
318 const auto& accumulator_high_limbs_range_constraint_tail_shift =
319 input_elements.accumulator_high_limbs_range_constraint_tail_shift;
320 const auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
321 const auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
322 const auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
323 const auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
324 const auto& quotient_low_limbs_range_constraint_0 = input_elements.quotient_low_limbs_range_constraint_0;
325 const auto& quotient_low_limbs_range_constraint_1 = input_elements.quotient_low_limbs_range_constraint_1;
326 const auto& quotient_low_limbs_range_constraint_2 = input_elements.quotient_low_limbs_range_constraint_2;
327 const auto& quotient_low_limbs_range_constraint_3 = input_elements.quotient_low_limbs_range_constraint_3;
328 const auto& quotient_low_limbs_range_constraint_4 = input_elements.quotient_low_limbs_range_constraint_4;
329 const auto& quotient_low_limbs_range_constraint_tail = input_elements.quotient_low_limbs_range_constraint_tail;
330 const auto& quotient_low_limbs_range_constraint_0_shift =
331 input_elements.quotient_low_limbs_range_constraint_0_shift;
332 const auto& quotient_low_limbs_range_constraint_1_shift =
333 input_elements.quotient_low_limbs_range_constraint_1_shift;
334 const auto& quotient_low_limbs_range_constraint_2_shift =
335 input_elements.quotient_low_limbs_range_constraint_2_shift;
336 const auto& quotient_low_limbs_range_constraint_3_shift =
337 input_elements.quotient_low_limbs_range_constraint_3_shift;
338 const auto& quotient_low_limbs_range_constraint_4_shift =
339 input_elements.quotient_low_limbs_range_constraint_4_shift;
340 const auto& quotient_low_limbs_range_constraint_tail_shift =
341 input_elements.quotient_low_limbs_range_constraint_tail_shift;
342 const auto& quotient_high_limbs_range_constraint_0 = input_elements.quotient_high_limbs_range_constraint_0;
343 const auto& quotient_high_limbs_range_constraint_1 = input_elements.quotient_high_limbs_range_constraint_1;
344 const auto& quotient_high_limbs_range_constraint_2 = input_elements.quotient_high_limbs_range_constraint_2;
345 const auto& quotient_high_limbs_range_constraint_3 = input_elements.quotient_high_limbs_range_constraint_3;
346 const auto& quotient_high_limbs_range_constraint_4 = input_elements.quotient_high_limbs_range_constraint_4;
347 const auto& quotient_high_limbs_range_constraint_tail =
348 input_elements.quotient_high_limbs_range_constraint_tail;
349 const auto& quotient_high_limbs_range_constraint_0_shift =
350 input_elements.quotient_high_limbs_range_constraint_0_shift;
351 const auto& quotient_high_limbs_range_constraint_1_shift =
352 input_elements.quotient_high_limbs_range_constraint_1_shift;
353 const auto& quotient_high_limbs_range_constraint_2_shift =
354 input_elements.quotient_high_limbs_range_constraint_2_shift;
355 const auto& quotient_high_limbs_range_constraint_3_shift =
356 input_elements.quotient_high_limbs_range_constraint_3_shift;
357 const auto& quotient_high_limbs_range_constraint_4_shift =
358 input_elements.quotient_high_limbs_range_constraint_4_shift;
359 const auto& quotient_high_limbs_range_constraint_tail_shift =
360 input_elements.quotient_high_limbs_range_constraint_tail_shift;
361 const auto& quotient_low_binary_limbs = input_elements.quotient_low_binary_limbs;
362 const auto& quotient_low_binary_limbs_shift = input_elements.quotient_low_binary_limbs_shift;
363 const auto& quotient_high_binary_limbs = input_elements.quotient_high_binary_limbs;
364 const auto& quotient_high_binary_limbs_shift = input_elements.quotient_high_binary_limbs_shift;
365 const auto& relation_wide_limbs_range_constraint_0 = input_elements.relation_wide_limbs_range_constraint_0;
366 const auto& relation_wide_limbs_range_constraint_1 = input_elements.relation_wide_limbs_range_constraint_1;
367 const auto& relation_wide_limbs_range_constraint_2 = input_elements.relation_wide_limbs_range_constraint_2;
368 const auto& relation_wide_limbs_range_constraint_3 = input_elements.relation_wide_limbs_range_constraint_3;
369 const auto& relation_wide_limbs_range_constraint_0_shift =
370 input_elements.relation_wide_limbs_range_constraint_0_shift;
371 const auto& relation_wide_limbs_range_constraint_1_shift =
372 input_elements.relation_wide_limbs_range_constraint_1_shift;
373 const auto& relation_wide_limbs_range_constraint_2_shift =
374 input_elements.relation_wide_limbs_range_constraint_2_shift;
375 const auto& relation_wide_limbs_range_constraint_3_shift =
376 input_elements.relation_wide_limbs_range_constraint_3_shift;
377 const auto& relation_wide_limbs = input_elements.relation_wide_limbs;
378 const auto& relation_wide_limbs_shift = input_elements.relation_wide_limbs_shift;
380 const auto& x_lo_y_hi = input_elements.x_lo_y_hi;
381 const auto& x_hi_z_1 = input_elements.x_hi_z_1;
382 const auto& y_lo_z_2 = input_elements.y_lo_z_2;
383 const auto& x_lo_y_hi_shift = input_elements.x_lo_y_hi_shift;
384 const auto& x_hi_z_1_shift = input_elements.x_hi_z_1_shift;
385 const auto& y_lo_z_2_shift = input_elements.y_lo_z_2_shift;
386 const auto& op = input_elements.op;
388 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
390 RelationValues expected_values;
394 const size_t NUM_MICRO_LIMB_BITS = 14;
395 const size_t NUM_LIMB_BITS = 68;
396 const auto MICRO_LIMB_SHIFT =
FF(
uint256_t(1) << NUM_MICRO_LIMB_BITS);
397 const auto MICRO_LIMB_SHIFTx2 = MICRO_LIMB_SHIFT * MICRO_LIMB_SHIFT;
398 const auto MICRO_LIMB_SHIFTx3 = MICRO_LIMB_SHIFTx2 * MICRO_LIMB_SHIFT;
399 const auto MICRO_LIMB_SHIFTx4 = MICRO_LIMB_SHIFTx3 * MICRO_LIMB_SHIFT;
400 const auto MICRO_LIMB_SHIFTx5 = MICRO_LIMB_SHIFTx4 * MICRO_LIMB_SHIFT;
402 const auto SHIFT_10_TO_14 =
FF(1 << 4);
403 const auto SHIFT_12_TO_14 =
FF(1 << 2);
404 const auto SHIFT_4_TO_14 =
FF(1 << 10);
405 const auto SHIFT_8_TO_14 =
FF(1 << 6);
406 const auto LIMB_SHIFT =
FF(
uint256_t(1) << NUM_LIMB_BITS);
414 auto check_relation_limb_decomposition = [MICRO_LIMB_SHIFT,
419 lagrange_even_in_minicircuit](
auto& micro_limb_0,
425 auto& decomposed_limb) {
426 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
427 micro_limb_3 * MICRO_LIMB_SHIFTx3 + micro_limb_4 * MICRO_LIMB_SHIFTx4 +
428 micro_limb_5 * MICRO_LIMB_SHIFTx5 - decomposed_limb) *
429 lagrange_even_in_minicircuit;
437 auto check_standard_limb_decomposition = [MICRO_LIMB_SHIFT,
441 lagrange_even_in_minicircuit](
auto& micro_limb_0,
446 auto& decomposed_limb) {
447 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
448 micro_limb_3 * MICRO_LIMB_SHIFTx3 + micro_limb_4 * MICRO_LIMB_SHIFTx4 - decomposed_limb) *
449 lagrange_even_in_minicircuit;
456 auto check_standard_top_limb_decomposition =
457 [MICRO_LIMB_SHIFT, MICRO_LIMB_SHIFTx2, MICRO_LIMB_SHIFTx3, lagrange_even_in_minicircuit](
458 auto& micro_limb_0,
auto& micro_limb_1,
auto& micro_limb_2,
auto& micro_limb_3,
auto& decomposed_limb) {
459 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
460 micro_limb_3 * MICRO_LIMB_SHIFTx3 - decomposed_limb) *
461 lagrange_even_in_minicircuit;
469 auto check_standard_tail_micro_limb_correctness =
470 [SHIFT_12_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
471 return (nonshifted_micro_limb * SHIFT_12_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
479 auto check_top_tail_micro_limb_correctness =
480 [SHIFT_8_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
481 return (nonshifted_micro_limb * SHIFT_8_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
489 auto check_z_top_tail_micro_limb_correctness =
490 [SHIFT_4_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
491 return (nonshifted_micro_limb * SHIFT_4_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
499 auto check_quotient_top_tail_micro_limb_correctness =
500 [SHIFT_10_TO_14, lagrange_even_in_minicircuit](
auto& nonshifted_micro_limb,
auto shifted_micro_limb) {
501 return (nonshifted_micro_limb * SHIFT_10_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
508 auto check_wide_limb_into_regular_limb_correctness =
509 [LIMB_SHIFT, lagrange_even_in_minicircuit](
auto& low_limb,
auto& high_limb,
auto& wide_limb) {
510 return (low_limb + high_limb * LIMB_SHIFT - wide_limb) * lagrange_even_in_minicircuit;
514 expected_values[0] = op * check_standard_limb_decomposition(accumulator_low_limbs_range_constraint_0,
515 accumulator_low_limbs_range_constraint_1,
516 accumulator_low_limbs_range_constraint_2,
517 accumulator_low_limbs_range_constraint_3,
518 accumulator_low_limbs_range_constraint_4,
519 accumulators_binary_limbs_0);
520 expected_values[1] = op * check_standard_limb_decomposition(accumulator_low_limbs_range_constraint_0_shift,
521 accumulator_low_limbs_range_constraint_1_shift,
522 accumulator_low_limbs_range_constraint_2_shift,
523 accumulator_low_limbs_range_constraint_3_shift,
524 accumulator_low_limbs_range_constraint_4_shift,
525 accumulators_binary_limbs_1);
526 expected_values[2] = op * check_standard_limb_decomposition(accumulator_high_limbs_range_constraint_0,
527 accumulator_high_limbs_range_constraint_1,
528 accumulator_high_limbs_range_constraint_2,
529 accumulator_high_limbs_range_constraint_3,
530 accumulator_high_limbs_range_constraint_4,
531 accumulators_binary_limbs_2);
532 expected_values[3] = op * check_standard_top_limb_decomposition(accumulator_high_limbs_range_constraint_0_shift,
533 accumulator_high_limbs_range_constraint_1_shift,
534 accumulator_high_limbs_range_constraint_2_shift,
535 accumulator_high_limbs_range_constraint_3_shift,
536 accumulators_binary_limbs_3);
538 expected_values[4] = check_standard_limb_decomposition(p_y_low_limbs_range_constraint_0,
539 p_y_low_limbs_range_constraint_1,
540 p_y_low_limbs_range_constraint_2,
541 p_y_low_limbs_range_constraint_3,
542 p_y_low_limbs_range_constraint_4,
544 expected_values[5] = check_standard_limb_decomposition(p_y_low_limbs_range_constraint_0_shift,
545 p_y_low_limbs_range_constraint_1_shift,
546 p_y_low_limbs_range_constraint_2_shift,
547 p_y_low_limbs_range_constraint_3_shift,
548 p_y_low_limbs_range_constraint_4_shift,
549 p_y_low_limbs_shift);
550 expected_values[6] = check_standard_limb_decomposition(p_y_high_limbs_range_constraint_0,
551 p_y_high_limbs_range_constraint_1,
552 p_y_high_limbs_range_constraint_2,
553 p_y_high_limbs_range_constraint_3,
554 p_y_high_limbs_range_constraint_4,
556 expected_values[7] = check_standard_top_limb_decomposition(p_y_high_limbs_range_constraint_0_shift,
557 p_y_high_limbs_range_constraint_1_shift,
558 p_y_high_limbs_range_constraint_2_shift,
559 p_y_high_limbs_range_constraint_3_shift,
560 p_y_high_limbs_shift);
561 expected_values[8] = check_standard_limb_decomposition(z_low_limbs_range_constraint_0,
562 z_low_limbs_range_constraint_1,
563 z_low_limbs_range_constraint_2,
564 z_low_limbs_range_constraint_3,
565 z_low_limbs_range_constraint_4,
567 expected_values[9] = check_standard_limb_decomposition(z_low_limbs_range_constraint_0_shift,
568 z_low_limbs_range_constraint_1_shift,
569 z_low_limbs_range_constraint_2_shift,
570 z_low_limbs_range_constraint_3_shift,
571 z_low_limbs_range_constraint_4_shift,
573 expected_values[10] = check_standard_limb_decomposition(z_high_limbs_range_constraint_0,
574 z_high_limbs_range_constraint_1,
575 z_high_limbs_range_constraint_2,
576 z_high_limbs_range_constraint_3,
577 z_high_limbs_range_constraint_4,
579 expected_values[11] = check_standard_limb_decomposition(z_high_limbs_range_constraint_0_shift,
580 z_high_limbs_range_constraint_1_shift,
581 z_high_limbs_range_constraint_2_shift,
582 z_high_limbs_range_constraint_3_shift,
583 z_high_limbs_range_constraint_4_shift,
585 expected_values[12] = check_standard_limb_decomposition(p_x_low_limbs_range_constraint_0,
586 p_x_low_limbs_range_constraint_1,
587 p_x_low_limbs_range_constraint_2,
588 p_x_low_limbs_range_constraint_3,
589 p_x_low_limbs_range_constraint_4,
591 expected_values[13] = check_standard_limb_decomposition(p_x_low_limbs_range_constraint_0_shift,
592 p_x_low_limbs_range_constraint_1_shift,
593 p_x_low_limbs_range_constraint_2_shift,
594 p_x_low_limbs_range_constraint_3_shift,
595 p_x_low_limbs_range_constraint_4_shift,
596 p_x_low_limbs_shift);
597 expected_values[14] = check_standard_limb_decomposition(p_x_high_limbs_range_constraint_0,
598 p_x_high_limbs_range_constraint_1,
599 p_x_high_limbs_range_constraint_2,
600 p_x_high_limbs_range_constraint_3,
601 p_x_high_limbs_range_constraint_4,
603 expected_values[15] = check_standard_top_limb_decomposition(p_x_high_limbs_range_constraint_0_shift,
604 p_x_high_limbs_range_constraint_1_shift,
605 p_x_high_limbs_range_constraint_2_shift,
606 p_x_high_limbs_range_constraint_3_shift,
607 p_x_high_limbs_shift);
609 expected_values[16] = check_standard_limb_decomposition(quotient_low_limbs_range_constraint_0,
610 quotient_low_limbs_range_constraint_1,
611 quotient_low_limbs_range_constraint_2,
612 quotient_low_limbs_range_constraint_3,
613 quotient_low_limbs_range_constraint_4,
614 quotient_low_binary_limbs);
615 expected_values[17] = check_standard_limb_decomposition(quotient_low_limbs_range_constraint_0_shift,
616 quotient_low_limbs_range_constraint_1_shift,
617 quotient_low_limbs_range_constraint_2_shift,
618 quotient_low_limbs_range_constraint_3_shift,
619 quotient_low_limbs_range_constraint_4_shift,
620 quotient_low_binary_limbs_shift);
621 expected_values[18] = check_standard_limb_decomposition(quotient_high_limbs_range_constraint_0,
622 quotient_high_limbs_range_constraint_1,
623 quotient_high_limbs_range_constraint_2,
624 quotient_high_limbs_range_constraint_3,
625 quotient_high_limbs_range_constraint_4,
626 quotient_high_binary_limbs);
627 expected_values[19] = check_standard_top_limb_decomposition(quotient_high_limbs_range_constraint_0_shift,
628 quotient_high_limbs_range_constraint_1_shift,
629 quotient_high_limbs_range_constraint_2_shift,
630 quotient_high_limbs_range_constraint_3_shift,
631 quotient_high_binary_limbs_shift);
633 expected_values[20] = check_relation_limb_decomposition(relation_wide_limbs_range_constraint_0,
634 relation_wide_limbs_range_constraint_1,
635 relation_wide_limbs_range_constraint_2,
636 relation_wide_limbs_range_constraint_3,
637 p_x_high_limbs_range_constraint_tail_shift,
638 accumulator_high_limbs_range_constraint_tail_shift,
639 relation_wide_limbs);
640 expected_values[21] = check_relation_limb_decomposition(relation_wide_limbs_range_constraint_0_shift,
641 relation_wide_limbs_range_constraint_1_shift,
642 relation_wide_limbs_range_constraint_2_shift,
643 relation_wide_limbs_range_constraint_3_shift,
644 p_y_high_limbs_range_constraint_tail_shift,
645 quotient_high_limbs_range_constraint_tail_shift,
646 relation_wide_limbs_shift);
649 expected_values[22] = check_standard_tail_micro_limb_correctness(p_x_low_limbs_range_constraint_4,
650 p_x_low_limbs_range_constraint_tail);
652 expected_values[23] = check_standard_tail_micro_limb_correctness(p_x_low_limbs_range_constraint_4_shift,
653 p_x_low_limbs_range_constraint_tail_shift);
655 expected_values[24] = check_standard_tail_micro_limb_correctness(p_x_high_limbs_range_constraint_4,
656 p_x_high_limbs_range_constraint_tail);
658 expected_values[25] = check_top_tail_micro_limb_correctness(p_x_high_limbs_range_constraint_3_shift,
659 p_x_high_limbs_range_constraint_4_shift);
661 expected_values[26] = check_standard_tail_micro_limb_correctness(p_y_low_limbs_range_constraint_4,
662 p_y_low_limbs_range_constraint_tail);
664 expected_values[27] = check_standard_tail_micro_limb_correctness(p_y_low_limbs_range_constraint_4_shift,
665 p_y_low_limbs_range_constraint_tail_shift);
667 expected_values[28] = check_standard_tail_micro_limb_correctness(p_y_high_limbs_range_constraint_4,
668 p_y_high_limbs_range_constraint_tail);
670 expected_values[29] = check_top_tail_micro_limb_correctness(p_y_high_limbs_range_constraint_3_shift,
671 p_y_high_limbs_range_constraint_4_shift);
673 expected_values[30] = check_standard_tail_micro_limb_correctness(z_low_limbs_range_constraint_4,
674 z_low_limbs_range_constraint_tail);
676 expected_values[31] = check_standard_tail_micro_limb_correctness(z_low_limbs_range_constraint_4_shift,
677 z_low_limbs_range_constraint_tail_shift);
679 expected_values[32] = check_z_top_tail_micro_limb_correctness(z_high_limbs_range_constraint_4,
680 z_high_limbs_range_constraint_tail);
682 expected_values[33] = check_z_top_tail_micro_limb_correctness(z_high_limbs_range_constraint_4_shift,
683 z_high_limbs_range_constraint_tail_shift);
685 expected_values[34] = check_standard_tail_micro_limb_correctness(accumulator_low_limbs_range_constraint_4,
686 accumulator_low_limbs_range_constraint_tail);
687 expected_values[35] = check_standard_tail_micro_limb_correctness(
688 accumulator_low_limbs_range_constraint_4_shift, accumulator_low_limbs_range_constraint_tail_shift);
690 expected_values[36] = check_standard_tail_micro_limb_correctness(accumulator_high_limbs_range_constraint_4,
691 accumulator_high_limbs_range_constraint_tail);
693 expected_values[37] = check_top_tail_micro_limb_correctness(accumulator_high_limbs_range_constraint_3_shift,
694 accumulator_high_limbs_range_constraint_4_shift);
696 expected_values[38] = check_standard_tail_micro_limb_correctness(quotient_low_limbs_range_constraint_4,
697 quotient_low_limbs_range_constraint_tail);
699 expected_values[39] = check_standard_tail_micro_limb_correctness(
700 quotient_low_limbs_range_constraint_4_shift, quotient_low_limbs_range_constraint_tail_shift);
702 expected_values[40] = check_standard_tail_micro_limb_correctness(quotient_high_limbs_range_constraint_4,
703 quotient_high_limbs_range_constraint_tail);
705 expected_values[41] = check_quotient_top_tail_micro_limb_correctness(
706 quotient_high_limbs_range_constraint_3_shift, quotient_high_limbs_range_constraint_4_shift);
710 expected_values[42] =
711 check_wide_limb_into_regular_limb_correctness(p_x_low_limbs, p_x_low_limbs_shift, x_lo_y_hi);
713 expected_values[43] =
714 check_wide_limb_into_regular_limb_correctness(p_x_high_limbs, p_x_high_limbs_shift, x_hi_z_1);
716 expected_values[44] =
717 check_wide_limb_into_regular_limb_correctness(p_y_low_limbs, p_y_low_limbs_shift, y_lo_z_2);
719 expected_values[45] =
720 check_wide_limb_into_regular_limb_correctness(p_y_high_limbs, p_y_high_limbs_shift, x_lo_y_hi_shift);
722 expected_values[46] = check_wide_limb_into_regular_limb_correctness(z_low_limbs, z_high_limbs, x_hi_z_1_shift);
724 expected_values[47] =
725 check_wide_limb_into_regular_limb_correctness(z_low_limbs_shift, z_high_limbs_shift, y_lo_z_2_shift);
727 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
828 const auto run_test = [](
bool random_inputs) {
835 const auto& p_x_low_limbs_range_constraint_0 = input_elements.p_x_low_limbs_range_constraint_0;
836 const auto& p_x_low_limbs_range_constraint_1 = input_elements.p_x_low_limbs_range_constraint_1;
837 const auto& p_x_low_limbs_range_constraint_2 = input_elements.p_x_low_limbs_range_constraint_2;
838 const auto& p_x_low_limbs_range_constraint_3 = input_elements.p_x_low_limbs_range_constraint_3;
839 const auto& p_x_low_limbs_range_constraint_4 = input_elements.p_x_low_limbs_range_constraint_4;
840 const auto& p_x_low_limbs_range_constraint_tail = input_elements.p_x_low_limbs_range_constraint_tail;
841 const auto& p_x_high_limbs_range_constraint_0 = input_elements.p_x_high_limbs_range_constraint_0;
842 const auto& p_x_high_limbs_range_constraint_1 = input_elements.p_x_high_limbs_range_constraint_1;
843 const auto& p_x_high_limbs_range_constraint_2 = input_elements.p_x_high_limbs_range_constraint_2;
844 const auto& p_x_high_limbs_range_constraint_3 = input_elements.p_x_high_limbs_range_constraint_3;
845 const auto& p_x_high_limbs_range_constraint_4 = input_elements.p_x_high_limbs_range_constraint_4;
846 const auto& p_x_high_limbs_range_constraint_tail = input_elements.p_x_high_limbs_range_constraint_tail;
847 const auto& p_y_low_limbs_range_constraint_0 = input_elements.p_y_low_limbs_range_constraint_0;
848 const auto& p_y_low_limbs_range_constraint_1 = input_elements.p_y_low_limbs_range_constraint_1;
849 const auto& p_y_low_limbs_range_constraint_2 = input_elements.p_y_low_limbs_range_constraint_2;
850 const auto& p_y_low_limbs_range_constraint_3 = input_elements.p_y_low_limbs_range_constraint_3;
851 const auto& p_y_low_limbs_range_constraint_4 = input_elements.p_y_low_limbs_range_constraint_4;
852 const auto& p_y_low_limbs_range_constraint_tail = input_elements.p_y_low_limbs_range_constraint_tail;
853 const auto& p_y_high_limbs_range_constraint_0 = input_elements.p_y_high_limbs_range_constraint_0;
854 const auto& p_y_high_limbs_range_constraint_1 = input_elements.p_y_high_limbs_range_constraint_1;
855 const auto& p_y_high_limbs_range_constraint_2 = input_elements.p_y_high_limbs_range_constraint_2;
856 const auto& p_y_high_limbs_range_constraint_3 = input_elements.p_y_high_limbs_range_constraint_3;
857 const auto& p_y_high_limbs_range_constraint_4 = input_elements.p_y_high_limbs_range_constraint_4;
858 const auto& p_y_high_limbs_range_constraint_tail = input_elements.p_y_high_limbs_range_constraint_tail;
859 const auto& z_low_limbs_range_constraint_0 = input_elements.z_low_limbs_range_constraint_0;
860 const auto& z_low_limbs_range_constraint_1 = input_elements.z_low_limbs_range_constraint_1;
861 const auto& z_low_limbs_range_constraint_2 = input_elements.z_low_limbs_range_constraint_2;
862 const auto& z_low_limbs_range_constraint_3 = input_elements.z_low_limbs_range_constraint_3;
863 const auto& z_low_limbs_range_constraint_4 = input_elements.z_low_limbs_range_constraint_4;
864 const auto& z_low_limbs_range_constraint_tail = input_elements.z_low_limbs_range_constraint_tail;
865 const auto& z_high_limbs_range_constraint_0 = input_elements.z_high_limbs_range_constraint_0;
866 const auto& z_high_limbs_range_constraint_1 = input_elements.z_high_limbs_range_constraint_1;
867 const auto& z_high_limbs_range_constraint_2 = input_elements.z_high_limbs_range_constraint_2;
868 const auto& z_high_limbs_range_constraint_3 = input_elements.z_high_limbs_range_constraint_3;
869 const auto& z_high_limbs_range_constraint_4 = input_elements.z_high_limbs_range_constraint_4;
870 const auto& z_high_limbs_range_constraint_tail = input_elements.z_high_limbs_range_constraint_tail;
871 const auto& accumulator_low_limbs_range_constraint_0 = input_elements.accumulator_low_limbs_range_constraint_0;
872 const auto& accumulator_low_limbs_range_constraint_1 = input_elements.accumulator_low_limbs_range_constraint_1;
873 const auto& accumulator_low_limbs_range_constraint_2 = input_elements.accumulator_low_limbs_range_constraint_2;
874 const auto& accumulator_low_limbs_range_constraint_3 = input_elements.accumulator_low_limbs_range_constraint_3;
875 const auto& accumulator_low_limbs_range_constraint_4 = input_elements.accumulator_low_limbs_range_constraint_4;
876 const auto& accumulator_low_limbs_range_constraint_tail =
877 input_elements.accumulator_low_limbs_range_constraint_tail;
878 const auto& accumulator_high_limbs_range_constraint_0 =
879 input_elements.accumulator_high_limbs_range_constraint_0;
880 const auto& accumulator_high_limbs_range_constraint_1 =
881 input_elements.accumulator_high_limbs_range_constraint_1;
882 const auto& accumulator_high_limbs_range_constraint_2 =
883 input_elements.accumulator_high_limbs_range_constraint_2;
884 const auto& accumulator_high_limbs_range_constraint_3 =
885 input_elements.accumulator_high_limbs_range_constraint_3;
886 const auto& accumulator_high_limbs_range_constraint_4 =
887 input_elements.accumulator_high_limbs_range_constraint_4;
888 const auto& accumulator_high_limbs_range_constraint_tail =
889 input_elements.accumulator_high_limbs_range_constraint_tail;
890 const auto& quotient_low_limbs_range_constraint_0 = input_elements.quotient_low_limbs_range_constraint_0;
891 const auto& quotient_low_limbs_range_constraint_1 = input_elements.quotient_low_limbs_range_constraint_1;
892 const auto& quotient_low_limbs_range_constraint_2 = input_elements.quotient_low_limbs_range_constraint_2;
893 const auto& quotient_low_limbs_range_constraint_3 = input_elements.quotient_low_limbs_range_constraint_3;
894 const auto& quotient_low_limbs_range_constraint_4 = input_elements.quotient_low_limbs_range_constraint_4;
895 const auto& quotient_low_limbs_range_constraint_tail = input_elements.quotient_low_limbs_range_constraint_tail;
896 const auto& quotient_high_limbs_range_constraint_0 = input_elements.quotient_high_limbs_range_constraint_0;
897 const auto& quotient_high_limbs_range_constraint_1 = input_elements.quotient_high_limbs_range_constraint_1;
898 const auto& quotient_high_limbs_range_constraint_2 = input_elements.quotient_high_limbs_range_constraint_2;
899 const auto& quotient_high_limbs_range_constraint_3 = input_elements.quotient_high_limbs_range_constraint_3;
900 const auto& quotient_high_limbs_range_constraint_4 = input_elements.quotient_high_limbs_range_constraint_4;
901 const auto& quotient_high_limbs_range_constraint_tail =
902 input_elements.quotient_high_limbs_range_constraint_tail;
903 const auto& relation_wide_limbs_range_constraint_0 = input_elements.relation_wide_limbs_range_constraint_0;
904 const auto& relation_wide_limbs_range_constraint_1 = input_elements.relation_wide_limbs_range_constraint_1;
905 const auto& relation_wide_limbs_range_constraint_2 = input_elements.relation_wide_limbs_range_constraint_2;
906 const auto& relation_wide_limbs_range_constraint_3 = input_elements.relation_wide_limbs_range_constraint_3;
907 const auto& op = input_elements.op;
908 const auto& x_lo_y_hi = input_elements.x_lo_y_hi;
909 const auto& x_hi_z_1 = input_elements.x_hi_z_1;
910 const auto& y_lo_z_2 = input_elements.y_lo_z_2;
911 const auto& lagrange_odd_in_minicircuit = input_elements.lagrange_odd_in_minicircuit;
912 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
913 const auto& lagrange_mini_masking = input_elements.lagrange_mini_masking;
915 RelationValues expected_values;
920 const auto not_in_minicircuit_or_masked =
921 lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit + lagrange_mini_masking -
FF(1);
923 expected_values[0] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_0;
924 expected_values[1] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_1;
925 expected_values[2] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_2;
926 expected_values[3] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_3;
927 expected_values[4] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_4;
928 expected_values[5] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_0;
929 expected_values[6] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_1;
930 expected_values[7] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_2;
931 expected_values[8] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_3;
932 expected_values[9] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_4;
933 expected_values[10] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_0;
934 expected_values[11] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_1;
935 expected_values[12] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_2;
936 expected_values[13] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_3;
937 expected_values[14] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_4;
938 expected_values[15] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_0;
939 expected_values[16] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_1;
940 expected_values[17] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_2;
941 expected_values[18] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_3;
942 expected_values[19] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_4;
943 expected_values[20] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_0;
944 expected_values[21] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_1;
945 expected_values[22] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_2;
946 expected_values[23] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_3;
947 expected_values[24] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_4;
948 expected_values[25] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_0;
949 expected_values[26] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_1;
950 expected_values[27] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_2;
951 expected_values[28] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_3;
952 expected_values[29] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_4;
953 expected_values[30] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_0;
954 expected_values[31] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_1;
955 expected_values[32] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_2;
956 expected_values[33] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_3;
957 expected_values[34] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_4;
958 expected_values[35] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_0;
959 expected_values[36] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_1;
960 expected_values[37] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_2;
961 expected_values[38] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_3;
962 expected_values[39] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_4;
963 expected_values[40] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_0;
964 expected_values[41] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_1;
965 expected_values[42] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_2;
966 expected_values[43] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_3;
967 expected_values[44] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_4;
968 expected_values[45] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_0;
969 expected_values[46] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_1;
970 expected_values[47] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_2;
971 expected_values[48] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_3;
972 expected_values[49] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_4;
973 expected_values[50] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_0;
974 expected_values[51] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_1;
975 expected_values[52] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_2;
976 expected_values[53] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_3;
977 expected_values[54] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_tail;
978 expected_values[55] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_tail;
979 expected_values[56] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_tail;
980 expected_values[57] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_tail;
981 expected_values[58] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_tail;
982 expected_values[59] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_tail;
983 expected_values[60] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_tail;
984 expected_values[61] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_tail;
985 expected_values[62] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_tail;
986 expected_values[63] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_tail;
987 expected_values[64] = not_in_minicircuit_or_masked * op;
988 expected_values[65] = not_in_minicircuit_or_masked * x_lo_y_hi;
989 expected_values[66] = not_in_minicircuit_or_masked * x_hi_z_1;
990 expected_values[67] = not_in_minicircuit_or_masked * y_lo_z_2;
992 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
1000 const auto run_test = [](
bool random_inputs) {
1001 const size_t NUM_LIMB_BITS = 68;
1007 const uint512_t NEGATIVE_PRIME_MODULUS = BINARY_BASIS_MODULUS - MODULUS_U512;
1009 FF(NEGATIVE_PRIME_MODULUS.
slice(0, NUM_LIMB_BITS).
lo),
1010 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2).
lo),
1011 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3).
lo),
1012 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4).
lo),
1021 auto& op = input_elements.op;
1022 auto& p_x_low_limbs = input_elements.p_x_low_limbs;
1023 auto& p_y_low_limbs = input_elements.p_y_low_limbs;
1024 auto& p_x_high_limbs = input_elements.p_x_high_limbs;
1025 auto& p_y_high_limbs = input_elements.p_y_high_limbs;
1026 auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
1027 auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
1028 auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
1029 auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
1030 auto& z_low_limbs = input_elements.z_low_limbs;
1031 auto& z_high_limbs = input_elements.z_high_limbs;
1032 auto& quotient_low_binary_limbs = input_elements.quotient_low_binary_limbs;
1033 auto& quotient_high_binary_limbs = input_elements.quotient_high_binary_limbs;
1034 auto& p_x_low_limbs_shift = input_elements.p_x_low_limbs_shift;
1035 auto& p_y_low_limbs_shift = input_elements.p_y_low_limbs_shift;
1036 auto& p_x_high_limbs_shift = input_elements.p_x_high_limbs_shift;
1037 auto& p_y_high_limbs_shift = input_elements.p_y_high_limbs_shift;
1038 auto& accumulators_binary_limbs_0_shift = input_elements.accumulators_binary_limbs_0_shift;
1039 auto& accumulators_binary_limbs_1_shift = input_elements.accumulators_binary_limbs_1_shift;
1040 auto& accumulators_binary_limbs_2_shift = input_elements.accumulators_binary_limbs_2_shift;
1041 auto& accumulators_binary_limbs_3_shift = input_elements.accumulators_binary_limbs_3_shift;
1042 auto& z_low_limbs_shift = input_elements.z_low_limbs_shift;
1043 auto& z_high_limbs_shift = input_elements.z_high_limbs_shift;
1044 auto& quotient_low_binary_limbs_shift = input_elements.quotient_low_binary_limbs_shift;
1045 auto& quotient_high_binary_limbs_shift = input_elements.quotient_high_binary_limbs_shift;
1046 auto& relation_wide_limbs = input_elements.relation_wide_limbs;
1047 auto& relation_wide_limbs_shift = input_elements.relation_wide_limbs_shift;
1048 auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
1050 RelationValues expected_values;
1057 expected_values[0] =
1058 (accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[0] + op +
1059 p_x_low_limbs * parameters.batching_challenge_v[0][0] +
1060 p_y_low_limbs * parameters.batching_challenge_v[1][0] +
1061 z_low_limbs * parameters.batching_challenge_v[2][0] +
1062 z_low_limbs_shift * parameters.batching_challenge_v[3][0] +
1063 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[0] - accumulators_binary_limbs_0 +
1064 (accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[0] +
1065 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[1] +
1066 p_x_low_limbs * parameters.batching_challenge_v[0][1] +
1067 p_x_low_limbs_shift * parameters.batching_challenge_v[0][0] +
1068 p_y_low_limbs * parameters.batching_challenge_v[1][1] +
1069 p_y_low_limbs_shift * parameters.batching_challenge_v[1][0] +
1070 z_low_limbs * parameters.batching_challenge_v[2][1] +
1071 z_high_limbs * parameters.batching_challenge_v[2][0] +
1072 z_low_limbs_shift * parameters.batching_challenge_v[3][1] +
1073 z_high_limbs_shift * parameters.batching_challenge_v[3][0] +
1074 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[1] +
1075 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0] - accumulators_binary_limbs_1) *
1077 relation_wide_limbs * shiftx2) *
1078 lagrange_even_in_minicircuit * op;
1081 expected_values[1] =
1082 (relation_wide_limbs + accumulators_binary_limbs_2_shift * parameters.evaluation_input_x[0] +
1083 accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[1] +
1084 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[2] +
1085 p_x_high_limbs * parameters.batching_challenge_v[0][0] +
1086 p_x_low_limbs_shift * parameters.batching_challenge_v[0][1] +
1087 p_x_low_limbs * parameters.batching_challenge_v[0][2] +
1088 p_y_high_limbs * parameters.batching_challenge_v[1][0] +
1089 p_y_low_limbs_shift * parameters.batching_challenge_v[1][1] +
1090 p_y_low_limbs * parameters.batching_challenge_v[1][2] +
1091 z_high_limbs * parameters.batching_challenge_v[2][1] +
1092 z_low_limbs * parameters.batching_challenge_v[2][2] +
1093 z_high_limbs_shift * parameters.batching_challenge_v[3][1] +
1094 z_low_limbs_shift * parameters.batching_challenge_v[3][2] +
1095 quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[0] +
1096 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[1] +
1097 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[2] - accumulators_binary_limbs_2 +
1098 (accumulators_binary_limbs_3_shift * parameters.evaluation_input_x[0] +
1099 accumulators_binary_limbs_2_shift * parameters.evaluation_input_x[1] +
1100 accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[2] +
1101 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[3] +
1102 p_x_high_limbs_shift * parameters.batching_challenge_v[0][0] +
1103 p_x_high_limbs * parameters.batching_challenge_v[0][1] +
1104 p_x_low_limbs_shift * parameters.batching_challenge_v[0][2] +
1105 p_x_low_limbs * parameters.batching_challenge_v[0][3] +
1106 p_y_high_limbs_shift * parameters.batching_challenge_v[1][0] +
1107 p_y_high_limbs * parameters.batching_challenge_v[1][1] +
1108 p_y_low_limbs_shift * parameters.batching_challenge_v[1][2] +
1109 p_y_low_limbs * parameters.batching_challenge_v[1][3] +
1110 z_high_limbs * parameters.batching_challenge_v[2][2] +
1111 z_low_limbs * parameters.batching_challenge_v[2][3] +
1112 z_high_limbs_shift * parameters.batching_challenge_v[3][2] +
1113 z_low_limbs_shift * parameters.batching_challenge_v[3][3] +
1114 quotient_high_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0] +
1115 quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[1] +
1116 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[2] +
1117 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[3] - accumulators_binary_limbs_3) *
1119 relation_wide_limbs_shift * shiftx2) *
1120 lagrange_even_in_minicircuit * op;
1121 auto reconstructed_p_x =
1122 (p_x_low_limbs + p_x_low_limbs_shift * shift + p_x_high_limbs * shiftx2 + p_x_high_limbs_shift * shiftx3);
1123 auto reconstructed_p_y =
1124 (p_y_low_limbs + p_y_low_limbs_shift * shift + p_y_high_limbs * shiftx2 + p_y_high_limbs_shift * shiftx3);
1125 auto reconstructed_previous_accumulator =
1126 (accumulators_binary_limbs_0_shift + accumulators_binary_limbs_1_shift * shift +
1127 accumulators_binary_limbs_2_shift * shiftx2 + accumulators_binary_limbs_3_shift * shiftx3);
1128 auto reconstructed_current_accumulator =
1129 (accumulators_binary_limbs_0 + accumulators_binary_limbs_1 * shift + accumulators_binary_limbs_2 * shiftx2 +
1130 accumulators_binary_limbs_3 * shiftx3);
1131 auto reconstructed_z1 = (z_low_limbs + z_high_limbs * shift);
1132 auto reconstructed_z2 = (z_low_limbs_shift + z_high_limbs_shift * shift);
1133 auto reconstructed_quotient =
1134 (quotient_low_binary_limbs + quotient_low_binary_limbs_shift * shift +
1135 quotient_high_binary_limbs * shiftx2 + quotient_high_binary_limbs_shift * shiftx3);
1138 expected_values[2] = (reconstructed_previous_accumulator * parameters.evaluation_input_x[4] + op +
1139 reconstructed_p_x * parameters.batching_challenge_v[0][4] +
1140 reconstructed_p_y * parameters.batching_challenge_v[1][4] +
1141 reconstructed_z1 * parameters.batching_challenge_v[2][4] +
1142 reconstructed_z2 * parameters.batching_challenge_v[3][4] +
1143 reconstructed_quotient * NEGATIVE_MODULUS_LIMBS[4] - reconstructed_current_accumulator) *
1144 lagrange_even_in_minicircuit * op;
1146 validate_relation_execution<Relation>(expected_values, input_elements, parameters);