18 const AllEntities& in,
20 const FF& scaling_factor)
25 const auto add2_s = ShortView(in.msm_add2);
26 const auto add3_s = ShortView(in.msm_add3);
27 const auto add4_s = ShortView(in.msm_add4);
28 const auto q_add_s = ShortView(in.msm_add);
29 const auto msm_transition_s = ShortView(in.msm_transition);
31 const auto x1 = Accumulator(ShortView(in.msm_x1));
32 const auto y1 = Accumulator(ShortView(in.msm_y1));
33 const auto x2 = Accumulator(ShortView(in.msm_x2));
34 const auto y2 = Accumulator(ShortView(in.msm_y2));
35 const auto x3 = Accumulator(ShortView(in.msm_x3));
36 const auto y3 = Accumulator(ShortView(in.msm_y3));
37 const auto x4 = Accumulator(ShortView(in.msm_x4));
38 const auto y4 = Accumulator(ShortView(in.msm_y4));
39 const auto lambda1 = Accumulator(ShortView(in.msm_lambda1));
40 const auto lambda2 = Accumulator(ShortView(in.msm_lambda2));
41 const auto lambda3 = Accumulator(ShortView(in.msm_lambda3));
42 const auto lambda4 = Accumulator(ShortView(in.msm_lambda4));
43 const auto acc_x = Accumulator(ShortView(in.msm_accumulator_x));
44 const auto acc_y = Accumulator(ShortView(in.msm_accumulator_y));
45 const auto acc_x_shift = Accumulator(ShortView(in.msm_accumulator_x_shift));
46 const auto acc_y_shift = Accumulator(ShortView(in.msm_accumulator_y_shift));
47 const auto msm_transition_acc = Accumulator(msm_transition_s);
49 auto add = [&](
auto& xb,
auto& yb,
auto& xa,
auto& ya,
auto& lambda,
auto& selector) {
50 auto slope_relation = selector * (lambda * (xb - xa - 1) - (yb - ya)) + lambda;
51 auto x_out = lambda.sqr() + (-xb - xa - xa) * selector + xa;
52 auto y_out = lambda * (xa - x_out) + (-ya - ya) * selector + ya;
56 auto first_add = [&](
auto& xb,
auto& yb,
auto& xa,
auto& ya,
auto& lambda,
auto& selector) {
58 constexpr uint256_t oxu = offset_generator.x;
59 constexpr uint256_t oyu = offset_generator.y;
60 const Accumulator xo(oxu);
61 const Accumulator yo(oyu);
62 auto x = xo * selector + xb * (-selector + 1);
63 auto y = yo * selector + yb * (-selector + 1);
64 auto slope_relation = lambda * (x - xa) - (y - ya);
65 auto x_out = lambda * lambda + (-x - xa);
66 auto y_out = lambda * (xa - x_out) - ya;
70 const auto add2_acc = Accumulator(add2_s);
71 const auto add3_acc = Accumulator(add3_s);
72 const auto add4_acc = Accumulator(add4_s);
73 auto [x_t1, y_t1, add_slope_relation1] = first_add(acc_x, acc_y, x1, y1, lambda1, msm_transition_acc);
74 auto [x_t2, y_t2, add_slope_relation2] = add(x2, y2, x_t1, y_t1, lambda2, add2_acc);
75 auto [x_t3, y_t3, add_slope_relation3] = add(x3, y3, x_t2, y_t2, lambda3, add3_acc);
76 auto [x_t4, y_t4, add_slope_relation4] = add(x4, y4, x_t3, y_t3, lambda4, add4_acc);
78 const auto q_add_scaled = Accumulator(q_add_s * scaling_factor);
90 const AllEntities& in,
92 const FF& scaling_factor)
97 const auto q_double_s = ShortView(in.msm_double);
98 const auto lambda1 = Accumulator(ShortView(in.msm_lambda1));
99 const auto lambda2 = Accumulator(ShortView(in.msm_lambda2));
100 const auto lambda3 = Accumulator(ShortView(in.msm_lambda3));
101 const auto lambda4 = Accumulator(ShortView(in.msm_lambda4));
102 const auto acc_x = Accumulator(ShortView(in.msm_accumulator_x));
103 const auto acc_y = Accumulator(ShortView(in.msm_accumulator_y));
104 const auto acc_x_shift = Accumulator(ShortView(in.msm_accumulator_x_shift));
105 const auto acc_y_shift = Accumulator(ShortView(in.msm_accumulator_y_shift));
107 auto dbl = [&](
auto& x,
auto& y,
auto& lambda) {
109 auto slope_relation = lambda * (y + y) - (two_x + x) * x;
110 auto x_out = lambda.sqr() - two_x;
111 auto y_out = lambda * (x - x_out) - y;
115 auto [x_d1, y_d1, double_slope_relation1] = dbl(acc_x, acc_y, lambda1);
116 auto [x_d2, y_d2, double_slope_relation2] = dbl(x_d1, y_d1, lambda2);
117 auto [x_d3, y_d3, double_slope_relation3] = dbl(x_d2, y_d2, lambda3);
118 auto [x_d4, y_d4, double_slope_relation4] = dbl(x_d3, y_d3, lambda4);
120 const auto q_double_scaled = Accumulator(q_double_s * scaling_factor);
132 const AllEntities& in,
134 const FF& scaling_factor)
139 const auto q_skew_s = ShortView(in.msm_skew);
140 const auto slice1_s = ShortView(in.msm_slice1);
141 const auto slice2_s = ShortView(in.msm_slice2);
142 const auto slice3_s = ShortView(in.msm_slice3);
143 const auto slice4_s = ShortView(in.msm_slice4);
145 const auto x1 = Accumulator(ShortView(in.msm_x1));
146 const auto y1 = Accumulator(ShortView(in.msm_y1));
147 const auto x2 = Accumulator(ShortView(in.msm_x2));
148 const auto y2 = Accumulator(ShortView(in.msm_y2));
149 const auto x3 = Accumulator(ShortView(in.msm_x3));
150 const auto y3 = Accumulator(ShortView(in.msm_y3));
151 const auto x4 = Accumulator(ShortView(in.msm_x4));
152 const auto y4 = Accumulator(ShortView(in.msm_y4));
153 const auto lambda1 = Accumulator(ShortView(in.msm_lambda1));
154 const auto lambda2 = Accumulator(ShortView(in.msm_lambda2));
155 const auto lambda3 = Accumulator(ShortView(in.msm_lambda3));
156 const auto lambda4 = Accumulator(ShortView(in.msm_lambda4));
157 const auto acc_x = Accumulator(ShortView(in.msm_accumulator_x));
158 const auto acc_y = Accumulator(ShortView(in.msm_accumulator_y));
159 const auto acc_x_shift = Accumulator(ShortView(in.msm_accumulator_x_shift));
160 const auto acc_y_shift = Accumulator(ShortView(in.msm_accumulator_y_shift));
162 auto add = [&](
auto& xb,
auto& yb,
auto& xa,
auto& ya,
auto& lambda,
auto& selector) {
163 auto slope_relation = selector * (lambda * (xb - xa - 1) - (yb - ya)) + lambda;
164 auto x_out = lambda.sqr() + (-xb - xa - xa) * selector + xa;
165 auto y_out = lambda * (xa - x_out) + (-ya - ya) * selector + ya;
169 static const FF inverse_seven_static =
FF(7).
invert();
170 const auto skew1_select = Accumulator(slice1_s * inverse_seven_static);
171 const auto skew2_select = Accumulator(slice2_s * inverse_seven_static);
172 const auto skew3_select = Accumulator(slice3_s * inverse_seven_static);
173 const auto skew4_select = Accumulator(slice4_s * inverse_seven_static);
174 auto [x_s1, y_s1, skew_slope_relation1] = add(x1, y1, acc_x, acc_y, lambda1, skew1_select);
175 auto [x_s2, y_s2, skew_slope_relation2] = add(x2, y2, x_s1, y_s1, lambda2, skew2_select);
176 auto [x_s3, y_s3, skew_slope_relation3] = add(x3, y3, x_s2, y_s2, lambda3, skew3_select);
177 auto [x_s4, y_s4, skew_slope_relation4] = add(x4, y4, x_s3, y_s3, lambda4, skew4_select);
179 const auto q_skew_scaled = Accumulator(q_skew_s * scaling_factor);
191 const AllEntities& in,
193 const FF& scaling_factor)
202 const auto add1_s = ShortView(in.msm_add1);
203 const auto add1_shift_s = ShortView(in.msm_add1_shift);
204 const auto add2_s = ShortView(in.msm_add2);
205 const auto add3_s = ShortView(in.msm_add3);
206 const auto add4_s = ShortView(in.msm_add4);
207 const auto q_add_s = ShortView(in.msm_add);
208 const auto q_add_shift_s = ShortView(in.msm_add_shift);
209 const auto q_skew_s = ShortView(in.msm_skew);
210 const auto q_skew_shift_s = ShortView(in.msm_skew_shift);
211 const auto q_double_s = ShortView(in.msm_double);
212 const auto q_double_shift_s = ShortView(in.msm_double_shift);
213 const auto msm_transition_s = ShortView(in.msm_transition);
214 const auto msm_transition_shift_s = ShortView(in.msm_transition_shift);
215 const auto lagrange_first_s = ShortView(in.lagrange_first);
216 const auto round_s = ShortView(in.msm_round);
217 const auto round_shift_s = ShortView(in.msm_round_shift);
218 const auto count_s = ShortView(in.msm_count);
219 const auto count_shift_s = ShortView(in.msm_count_shift);
220 const auto pc_s = ShortView(in.msm_pc);
221 const auto pc_shift_s = ShortView(in.msm_pc_shift);
222 const auto msm_size_s = ShortView(in.msm_size_of_msm);
223 const auto slice1_s = ShortView(in.msm_slice1);
224 const auto slice2_s = ShortView(in.msm_slice2);
225 const auto slice3_s = ShortView(in.msm_slice3);
226 const auto slice4_s = ShortView(in.msm_slice4);
228 const auto x1 = Accumulator(ShortView(in.msm_x1));
229 const auto x2 = Accumulator(ShortView(in.msm_x2));
230 const auto x3 = Accumulator(ShortView(in.msm_x3));
231 const auto x4 = Accumulator(ShortView(in.msm_x4));
232 const auto collision_inverse1 = ShortView(in.msm_collision_x1);
233 const auto collision_inverse2 = ShortView(in.msm_collision_x2);
234 const auto collision_inverse3 = ShortView(in.msm_collision_x3);
235 const auto collision_inverse4 = ShortView(in.msm_collision_x4);
236 const auto lambda1 = Accumulator(ShortView(in.msm_lambda1));
237 const auto lambda2 = Accumulator(ShortView(in.msm_lambda2));
238 const auto lambda3 = Accumulator(ShortView(in.msm_lambda3));
239 const auto lambda4 = Accumulator(ShortView(in.msm_lambda4));
240 const auto acc_x = Accumulator(ShortView(in.msm_accumulator_x));
241 const auto acc_y = Accumulator(ShortView(in.msm_accumulator_y));
242 const auto acc_x_shift = Accumulator(ShortView(in.msm_accumulator_x_shift));
243 const auto acc_y_shift = Accumulator(ShortView(in.msm_accumulator_y_shift));
244 const auto msm_transition_acc = Accumulator(msm_transition_s);
246 auto add_x = [&](
auto& xb,
auto& xa,
auto& lambda,
auto& selector,
auto& collision_relation) {
247 collision_relation += selector * (xb - xa);
248 return lambda.sqr() + (-xb - xa - xa) * selector + xa;
251 auto first_add_x = [&](
auto& xb,
auto& xa,
auto& lambda,
auto& selector,
auto& collision_relation) {
253 constexpr uint256_t oxu = offset_generator.x;
254 const Accumulator xo(oxu);
255 auto x = xo * selector + xb * (-selector + 1);
256 collision_relation += (xa - x);
257 return lambda * lambda + (-x - xa);
260 const auto add2_acc = Accumulator(add2_s);
261 const auto add3_acc = Accumulator(add3_s);
262 const auto add4_acc = Accumulator(add4_s);
263 Accumulator x1_collision_relation(0);
264 Accumulator x2_collision_relation(0);
265 Accumulator x3_collision_relation(0);
266 Accumulator x4_collision_relation(0);
267 auto x_t1 = first_add_x(acc_x, x1, lambda1, msm_transition_acc, x1_collision_relation);
268 auto x_t2 = add_x(x2, x_t1, lambda2, add2_acc, x2_collision_relation);
269 auto x_t3 = add_x(x3, x_t2, lambda3, add3_acc, x3_collision_relation);
270 add_x(x4, x_t3, lambda4, add4_acc, x4_collision_relation);
272 static const FF inverse_seven_static =
FF(7).
invert();
273 const auto skew1_select = Accumulator(slice1_s * inverse_seven_static);
274 const auto skew2_select = Accumulator(slice2_s * inverse_seven_static);
275 const auto skew3_select = Accumulator(slice3_s * inverse_seven_static);
276 const auto skew4_select = Accumulator(slice4_s * inverse_seven_static);
277 Accumulator x1_skew_collision_relation(0);
278 Accumulator x2_skew_collision_relation(0);
279 Accumulator x3_skew_collision_relation(0);
280 Accumulator x4_skew_collision_relation(0);
281 auto x_s1 = add_x(x1, acc_x, lambda1, skew1_select, x1_skew_collision_relation);
282 auto x_s2 = add_x(x2, x_s1, lambda2, skew2_select, x2_skew_collision_relation);
283 auto x_s3 = add_x(x3, x_s2, lambda3, skew3_select, x3_skew_collision_relation);
284 add_x(x4, x_s3, lambda4, skew4_select, x4_skew_collision_relation);
286 const auto add_first_point_short = add1_s * q_add_s + q_skew_s * (slice1_s * inverse_seven_static);
287 const auto add_second_point_short = add2_s * q_add_s + q_skew_s * (slice2_s * inverse_seven_static);
288 const auto add_third_point_short = add3_s * q_add_s + q_skew_s * (slice3_s * inverse_seven_static);
289 const auto add_fourth_point_short = add4_s * q_add_s + q_skew_s * (slice4_s * inverse_seven_static);
290 const auto q_skew_acc = Accumulator(q_skew_s);
291 const auto q_add_acc = Accumulator(q_add_s);
292 const auto x1_delta = x1_skew_collision_relation * q_skew_acc + x1_collision_relation * q_add_acc;
293 const auto x2_delta = x2_skew_collision_relation * q_skew_acc + x2_collision_relation * q_add_acc;
294 const auto x3_delta = x3_skew_collision_relation * q_skew_acc + x3_collision_relation * q_add_acc;
295 const auto x4_delta = x4_skew_collision_relation * q_skew_acc + x4_collision_relation * q_add_acc;
297 Accumulator(add_first_point_short * scaling_factor);
299 Accumulator(add_second_point_short * scaling_factor);
301 Accumulator(add_third_point_short * scaling_factor);
303 Accumulator(add_fourth_point_short * scaling_factor);
311 const auto sum = q_add_s * q_double_s + q_add_s * q_skew_s + q_double_s * q_skew_s;
315 const auto no_op_selector_short_a = (-q_add_s +
FF(1)) * (-q_double_s +
FF(1));
316 const auto no_op_selector_short_b = (-q_skew_s +
FF(1)) * (-msm_transition_s +
FF(1));
317 const auto no_op_selector_short_c = -lagrange_first_s +
FF(1);
318 const auto no_op_selector_scaled_acc = Accumulator(no_op_selector_short_a * scaling_factor) *
319 Accumulator(no_op_selector_short_b) * Accumulator(no_op_selector_short_c);
325 const auto round_delta_short = round_shift_s - round_s;
326 const auto neg_msm_transition_shift_plus_one_short = -msm_transition_shift_s +
FF(1);
327 const auto round_transition_short = round_delta_short * neg_msm_transition_shift_plus_one_short;
329 const auto round_delta_minus_one_short = round_delta_short -
FF(1);
331 Acc4(round_transition_short * scaling_factor) * Acc4(round_delta_minus_one_short);
334 const auto round_minus_31_short = round_s -
FF(31);
336 Acc5(round_transition_short * scaling_factor) * Acc5(q_skew_shift_s * round_minus_31_short);
339 const auto q_skew_plus_q_double_minus_one_short = (q_skew_shift_s + q_double_shift_s) -
FF(1);
341 Acc4(round_transition_short * scaling_factor) * Acc4(q_skew_plus_q_double_minus_one_short);
344 const auto neg_double_short = -q_double_shift_s +
FF(1);
345 const auto neg_skew_short = -q_skew_shift_s +
FF(1);
346 const auto not_double_not_skew_short = neg_double_short * neg_skew_short;
348 Acc5(round_transition_short * scaling_factor) * Acc5(not_double_not_skew_short);
353 Acc3((round_delta_short * count_shift_s) * scaling_factor);
355 const auto neg_round_delta_plus_one_short = -round_delta_short +
FF(1);
356 const auto outer_short = neg_msm_transition_shift_plus_one_short * neg_round_delta_plus_one_short;
357 const auto inner_short = ((count_shift_s - count_s) - add1_s - add2_s - add3_s) - add4_s;
361 const auto is_not_first_row_short = -lagrange_first_s +
FF(1);
362 const auto outer_a_short = is_not_first_row_short * neg_msm_transition_shift_plus_one_short;
363 const auto outer_b_short = round_delta_short * count_shift_s;
365 Acc5(outer_a_short * scaling_factor) * Acc5(outer_b_short);
370 const auto is_not_first_row_short = -lagrange_first_s +
FF(1);
371 const auto outer_short = is_not_first_row_short * msm_transition_shift_s;
372 const auto inner_short = (msm_size_s + pc_shift_s) - pc_s;
381 const auto outer_short = q_add_s * q_add_shift_s + q_skew_s * q_skew_shift_s;
382 const auto inner_short = (-add4_s +
FF(1)) * add1_shift_s;
387 const auto neg_skew_shift_short = -q_skew_shift_s +
FF(1);
388 const auto outer_short = neg_msm_transition_shift_plus_one_short * q_skew_s;
390 Acc4(outer_short * scaling_factor) * Acc4(neg_skew_shift_short);
394 Acc3(((-round_delta_short +
FF(1)) * q_double_shift_s) * scaling_factor);