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);
65 auto precompute_select = View(in.precompute_select);
67 auto precompute_select_shift = View(in.precompute_select_shift);
69 const auto& precompute_skew = View(in.precompute_skew);
72 View(in.precompute_s1hi), View(in.precompute_s1lo), View(in.precompute_s2hi), View(in.precompute_s2lo),
73 View(in.precompute_s3hi), View(in.precompute_s3lo), View(in.precompute_s4hi), View(in.precompute_s4lo),
76 const auto range_constraint_slice_to_2_bits = [&scaling_factor](
const View& s,
auto& acc) {
77 acc += ((s - 1).sqr() - 1) * ((s - 2).sqr() - 1) * scaling_factor;
83 const auto convert_to_wnaf = [](
const View& hi,
const View& lo) {
87 auto naf = t + t - 15;
91 const auto scaled_transition = q_transition * scaling_factor;
92 const auto scaled_transition_is_zero =
93 -scaled_transition + scaling_factor;
96 const auto scaled_lagrange_first = scaling_factor * lagrange_first;
119 const auto s1hi_shift = View(in.precompute_s1hi_shift);
120 const auto s1hi_shift_msb_set = (s1hi_shift - 2) * (s1hi_shift - 3);
121 const auto scaled_transition_plus_lagrange_first = scaled_transition + scaled_lagrange_first;
126 scaled_transition_plus_lagrange_first * precompute_select_shift * s1hi_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;
171 const auto scaled_lagrange_first_minus_one =
172 scaled_lagrange_first - scaling_factor;
173 const auto precompute_select_check = precompute_select_shift * (precompute_select - 1);
222 const auto round_check = round_shift - round - 1;
226 const auto precompute_select_transition_plus_lagrange_first =
227 precompute_select * scaled_transition + scaled_lagrange_first;
229 precompute_select * (scaled_transition * (round - round_check - 7) + scaling_factor * round_check);
243 const auto pc_delta = pc_shift - pc;
245 precompute_select * (scaled_transition * ((-pc_delta - pc_delta - 1)) + pc_delta * scaling_factor);
256 std::get<SKEW_RANGE>(accumulator) += precompute_select * (precompute_skew * (precompute_skew - 7)) * scaling_factor;
261 const auto precompute_select_zero = (-precompute_select + 1) * scaling_factor;