47 const AllEntities& in,
49 const FF& scaling_factor)
52 using View =
typename Accumulator::View;
53 auto lagrange_first = View(in.lagrange_first);
54 auto scalar_sum = View(in.precompute_scalar_sum);
55 auto scalar_sum_shift = View(in.precompute_scalar_sum_shift);
56 auto q_transition = View(in.precompute_point_transition);
57 auto round = View(in.precompute_round);
58 auto round_shift = View(in.precompute_round_shift);
59 auto pc = View(in.precompute_pc);
60 auto pc_shift = View(in.precompute_pc_shift);
66 auto precompute_select = View(in.precompute_select);
68 auto precompute_select_shift = View(in.precompute_select_shift);
70 const auto& precompute_skew = View(in.precompute_skew);
73 View(in.precompute_s1hi), View(in.precompute_s1lo), View(in.precompute_s2hi), View(in.precompute_s2lo),
74 View(in.precompute_s3hi), View(in.precompute_s3lo), View(in.precompute_s4hi), View(in.precompute_s4lo),
77 const auto range_constraint_slice_to_2_bits = [&scaling_factor](
const View& s,
auto& acc) {
78 acc += ((s - 1).sqr() - 1) * ((s - 2).sqr() - 1) * scaling_factor;
84 const auto convert_to_wnaf = [](
const View& s0,
const View& s1) {
88 auto naf = t + t - 15;
92 const auto scaled_transition = q_transition * scaling_factor;
93 const auto scaled_transition_is_zero =
94 -scaled_transition + scaling_factor;
97 const auto scaled_lagrange_first = scaling_factor * lagrange_first;
103 range_constraint_slice_to_2_bits(slices[0],
std::get<0>(accumulator));
104 range_constraint_slice_to_2_bits(slices[1],
std::get<1>(accumulator));
105 range_constraint_slice_to_2_bits(slices[2],
std::get<2>(accumulator));
106 range_constraint_slice_to_2_bits(slices[3],
std::get<3>(accumulator));
107 range_constraint_slice_to_2_bits(slices[4],
std::get<4>(accumulator));
108 range_constraint_slice_to_2_bits(slices[5],
std::get<5>(accumulator));
109 range_constraint_slice_to_2_bits(slices[6],
std::get<6>(accumulator));
110 range_constraint_slice_to_2_bits(slices[7],
std::get<7>(accumulator));
120 const auto s1_shift = View(in.precompute_s1hi_shift);
121 const auto s1_shift_msb_set = (s1_shift - 2) * (s1_shift - 3);
122 const auto scaled_transition_plus_lagrange_first = scaled_transition + scaled_lagrange_first;
126 std::get<20>(accumulator) += scaled_transition_plus_lagrange_first * precompute_select_shift * s1_shift_msb_set;
133 const auto w0 = convert_to_wnaf(slices[0], slices[1]);
134 const auto w1 = convert_to_wnaf(slices[2], slices[3]);
135 const auto w2 = convert_to_wnaf(slices[4], slices[5]);
136 const auto w3 = convert_to_wnaf(slices[6], slices[7]);
150 row_slice += row_slice;
151 row_slice += row_slice;
152 row_slice += row_slice;
153 row_slice += row_slice;
155 row_slice += row_slice;
156 row_slice += row_slice;
157 row_slice += row_slice;
158 row_slice += row_slice;
160 row_slice += row_slice;
161 row_slice += row_slice;
162 row_slice += row_slice;
163 row_slice += row_slice;
165 auto sum_delta = scalar_sum *
FF(1ULL << 16) + row_slice;
166 const auto check_sum = scalar_sum_shift - sum_delta;
167 std::get<8>(accumulator) += precompute_select * check_sum * scaled_transition_is_zero;
216 const auto round_check = round_shift - round - 1;
220 const auto precompute_select_transition_plus_lagrange_first =
221 precompute_select * scaled_transition + scaled_lagrange_first;
223 precompute_select * (scaled_transition * (round - round_check - 7) + scaling_factor * round_check);
225 std::get<10>(accumulator) += precompute_select_transition_plus_lagrange_first * round_shift;
234 std::get<11>(accumulator) += precompute_select_transition_plus_lagrange_first * scalar_sum_shift;
237 const auto pc_delta = pc_shift - pc;
239 precompute_select * (scaled_transition * ((-pc_delta - pc_delta - 1)) + pc_delta * scaling_factor);
250 std::get<13>(accumulator) += precompute_select * (precompute_skew * (precompute_skew - 7)) * scaling_factor;
254 const auto precompute_select_zero = (-precompute_select + 1) * scaling_factor;
255 std::get<14>(accumulator) += precompute_select_zero * (w0 + 15);
256 std::get<15>(accumulator) += precompute_select_zero * (w1 + 15);
257 std::get<16>(accumulator) += precompute_select_zero * (w2 + 15);
258 std::get<17>(accumulator) += precompute_select_zero * (w3 + 15);
260 std::get<18>(accumulator) += precompute_select_zero * round;
261 std::get<19>(accumulator) += precompute_select_zero * pc;