29 const AllEntities& in,
31 const FF& scaling_factor)
33 static const FF minus_one =
FF(-1);
34 static const FF minus_two =
FF(-2);
35 static const FF minus_three =
FF(-3);
36 static const size_t micro_limb_bits = 14;
37 static const auto maximum_sort_value = -
FF((1 << micro_limb_bits) - 1);
42 auto ordered_range_constraints_0 = View(in.ordered_range_constraints_0);
43 auto ordered_range_constraints_1 = View(in.ordered_range_constraints_1);
44 auto ordered_range_constraints_2 = View(in.ordered_range_constraints_2);
45 auto ordered_range_constraints_3 = View(in.ordered_range_constraints_3);
46 auto ordered_range_constraints_4 = View(in.ordered_range_constraints_4);
47 auto ordered_range_constraints_0_shift = View(in.ordered_range_constraints_0_shift);
48 auto ordered_range_constraints_1_shift = View(in.ordered_range_constraints_1_shift);
49 auto ordered_range_constraints_2_shift = View(in.ordered_range_constraints_2_shift);
50 auto ordered_range_constraints_3_shift = View(in.ordered_range_constraints_3_shift);
51 auto ordered_range_constraints_4_shift = View(in.ordered_range_constraints_4_shift);
53 const auto lagrange_real_last = View(in.lagrange_real_last);
54 const auto lagrange_ordered_masking = View(in.lagrange_ordered_masking);
58 const auto not_last_or_masking_scaled =
59 Accumulator((lagrange_real_last + lagrange_ordered_masking + minus_one) * scaling_factor);
62 auto delta_1 = ordered_range_constraints_0_shift - ordered_range_constraints_0;
63 auto delta_2 = ordered_range_constraints_1_shift - ordered_range_constraints_1;
64 auto delta_3 = ordered_range_constraints_2_shift - ordered_range_constraints_2;
65 auto delta_4 = ordered_range_constraints_3_shift - ordered_range_constraints_3;
66 auto delta_5 = ordered_range_constraints_4_shift - ordered_range_constraints_4;
68 auto accumulate_delta_check = [&](
auto& accumulator,
const auto& delta) {
70 Accumulator(delta * (delta + minus_one)) * Accumulator((delta + minus_two) * (delta + minus_three));
71 tmp *= not_last_or_masking_scaled;
81 if (!(in.ordered_range_constraints_0_shift - in.ordered_range_constraints_0).is_zero()) {
82 accumulate_delta_check(
std::get<0>(accumulators), delta_1);
84 if (!(in.ordered_range_constraints_1_shift - in.ordered_range_constraints_1).is_zero()) {
85 accumulate_delta_check(
std::get<1>(accumulators), delta_2);
87 if (!(in.ordered_range_constraints_2_shift - in.ordered_range_constraints_2).is_zero()) {
88 accumulate_delta_check(
std::get<2>(accumulators), delta_3);
90 if (!(in.ordered_range_constraints_3_shift - in.ordered_range_constraints_3).is_zero()) {
91 accumulate_delta_check(
std::get<3>(accumulators), delta_4);
93 if (!(in.ordered_range_constraints_4_shift - in.ordered_range_constraints_4).is_zero()) {
94 accumulate_delta_check(
std::get<4>(accumulators), delta_5);
101 auto ordered_range_constraints_0 = View(in.ordered_range_constraints_0);
102 auto ordered_range_constraints_1 = View(in.ordered_range_constraints_1);
103 auto ordered_range_constraints_2 = View(in.ordered_range_constraints_2);
104 auto ordered_range_constraints_3 = View(in.ordered_range_constraints_3);
105 auto ordered_range_constraints_4 = View(in.ordered_range_constraints_4);
109 if (!in.lagrange_real_last.is_zero()) {
110 const auto lagrange_real_last = View(in.lagrange_real_last);
111 const auto lagrange_real_last_scaled = lagrange_real_last * scaling_factor;
116 Accumulator(lagrange_real_last_scaled * (ordered_range_constraints_0 + maximum_sort_value));
119 Accumulator(lagrange_real_last_scaled * (ordered_range_constraints_1 + maximum_sort_value));
122 Accumulator(lagrange_real_last_scaled * (ordered_range_constraints_2 + maximum_sort_value));
125 Accumulator(lagrange_real_last_scaled * (ordered_range_constraints_3 + maximum_sort_value));
128 Accumulator(lagrange_real_last_scaled * (ordered_range_constraints_4 + maximum_sort_value));