Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ecc_msm_short_relation_impl.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
12
13namespace bb {
14
15template <typename FF>
16template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
17void ECCVMMSMAddShortRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulator,
18 const AllEntities& in,
19 const Parameters& /*unused*/,
20 const FF& scaling_factor)
21{
24
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);
30
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);
48
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;
53 return std::array<Accumulator, 3>{ x_out, y_out, slope_relation };
54 };
55
56 auto first_add = [&](auto& xb, auto& yb, auto& xa, auto& ya, auto& lambda, auto& selector) {
57 constexpr auto offset_generator = get_precomputed_generators<g1, "ECCVM_OFFSET_GENERATOR", 1>()[0];
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;
67 return std::array<Accumulator, 3>{ x_out, y_out, slope_relation };
68 };
69
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);
77
78 const auto q_add_scaled = Accumulator(q_add_s * scaling_factor);
79 std::get<ADD_ACC_X>(accumulator) += q_add_scaled * (acc_x_shift - x_t4);
80 std::get<ADD_ACC_Y>(accumulator) += q_add_scaled * (acc_y_shift - y_t4);
81 std::get<ADD_SLOPE_1>(accumulator) += q_add_scaled * add_slope_relation1;
82 std::get<ADD_SLOPE_2>(accumulator) += q_add_scaled * add_slope_relation2;
83 std::get<ADD_SLOPE_3>(accumulator) += q_add_scaled * add_slope_relation3;
84 std::get<ADD_SLOPE_4>(accumulator) += q_add_scaled * add_slope_relation4;
85}
86
87template <typename FF>
88template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
89void ECCVMMSMDoubleShortRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulator,
90 const AllEntities& in,
91 const Parameters& /*unused*/,
92 const FF& scaling_factor)
93{
96
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));
106
107 auto dbl = [&](auto& x, auto& y, auto& lambda) {
108 auto two_x = x + x;
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;
112 return std::array<Accumulator, 3>{ x_out, y_out, slope_relation };
113 };
114
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);
119
120 const auto q_double_scaled = Accumulator(q_double_s * scaling_factor);
121 std::get<DOUBLE_ACC_X>(accumulator) += q_double_scaled * (acc_x_shift - x_d4);
122 std::get<DOUBLE_ACC_Y>(accumulator) += q_double_scaled * (acc_y_shift - y_d4);
123 std::get<DOUBLE_SLOPE_1>(accumulator) += q_double_scaled * double_slope_relation1;
124 std::get<DOUBLE_SLOPE_2>(accumulator) += q_double_scaled * double_slope_relation2;
125 std::get<DOUBLE_SLOPE_3>(accumulator) += q_double_scaled * double_slope_relation3;
126 std::get<DOUBLE_SLOPE_4>(accumulator) += q_double_scaled * double_slope_relation4;
127}
128
129template <typename FF>
130template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
131void ECCVMMSMSkewShortRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulator,
132 const AllEntities& in,
133 const Parameters& /*unused*/,
134 const FF& scaling_factor)
135{
137 using ShortView = ECCVMShortMonomialView<Accumulator>;
138
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);
144
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));
161
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;
166 return std::array<Accumulator, 3>{ x_out, y_out, slope_relation };
167 };
168
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);
178
179 const auto q_skew_scaled = Accumulator(q_skew_s * scaling_factor);
180 std::get<SKEW_ACC_X>(accumulator) += q_skew_scaled * (acc_x_shift - x_s4);
181 std::get<SKEW_ACC_Y>(accumulator) += q_skew_scaled * (acc_y_shift - y_s4);
182 std::get<SKEW_SLOPE_1>(accumulator) += q_skew_scaled * skew_slope_relation1;
183 std::get<SKEW_SLOPE_2>(accumulator) += q_skew_scaled * skew_slope_relation2;
184 std::get<SKEW_SLOPE_3>(accumulator) += q_skew_scaled * skew_slope_relation3;
185 std::get<SKEW_SLOPE_4>(accumulator) += q_skew_scaled * skew_slope_relation4;
186}
187
188template <typename FF>
189template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
190void ECCVMMSMShortRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulator,
191 const AllEntities& in,
192 const Parameters& /*unused*/,
193 const FF& scaling_factor)
194{
196 using ShortView = ECCVMShortMonomialView<Accumulator>;
202
203 const auto add1_s = ShortView(in.msm_add1);
204 const auto add1_shift_s = ShortView(in.msm_add1_shift);
205 const auto add2_s = ShortView(in.msm_add2);
206 const auto add3_s = ShortView(in.msm_add3);
207 const auto add4_s = ShortView(in.msm_add4);
208 const auto q_add_s = ShortView(in.msm_add);
209 const auto q_add_shift_s = ShortView(in.msm_add_shift);
210 const auto q_skew_s = ShortView(in.msm_skew);
211 const auto q_skew_shift_s = ShortView(in.msm_skew_shift);
212 const auto q_double_s = ShortView(in.msm_double);
213 const auto q_double_shift_s = ShortView(in.msm_double_shift);
214 const auto msm_transition_s = ShortView(in.msm_transition);
215 const auto msm_transition_shift_s = ShortView(in.msm_transition_shift);
216 const auto lagrange_first_s = ShortView(in.lagrange_first);
217 const auto round_s = ShortView(in.msm_round);
218 const auto round_shift_s = ShortView(in.msm_round_shift);
219 const auto round_minus_31_inv_s = ShortView(in.msm_round_minus_31_inv);
220 const auto count_s = ShortView(in.msm_count);
221 const auto count_shift_s = ShortView(in.msm_count_shift);
222 const auto pc_s = ShortView(in.msm_pc);
223 const auto pc_shift_s = ShortView(in.msm_pc_shift);
224 const auto msm_size_s = ShortView(in.msm_size_of_msm);
225 const auto slice1_s = ShortView(in.msm_slice1);
226 const auto slice2_s = ShortView(in.msm_slice2);
227 const auto slice3_s = ShortView(in.msm_slice3);
228 const auto slice4_s = ShortView(in.msm_slice4);
229
230 const auto x1 = Accumulator(ShortView(in.msm_x1));
231 const auto x2 = Accumulator(ShortView(in.msm_x2));
232 const auto x3 = Accumulator(ShortView(in.msm_x3));
233 const auto x4 = Accumulator(ShortView(in.msm_x4));
234 const auto collision_inverse1 = ShortView(in.msm_collision_x1);
235 const auto collision_inverse2 = ShortView(in.msm_collision_x2);
236 const auto collision_inverse3 = ShortView(in.msm_collision_x3);
237 const auto collision_inverse4 = ShortView(in.msm_collision_x4);
238 const auto lambda1 = Accumulator(ShortView(in.msm_lambda1));
239 const auto lambda2 = Accumulator(ShortView(in.msm_lambda2));
240 const auto lambda3 = Accumulator(ShortView(in.msm_lambda3));
241 const auto lambda4 = Accumulator(ShortView(in.msm_lambda4));
242 const auto acc_x = Accumulator(ShortView(in.msm_accumulator_x));
243 const auto acc_y = Accumulator(ShortView(in.msm_accumulator_y));
244 const auto acc_x_shift = Accumulator(ShortView(in.msm_accumulator_x_shift));
245 const auto acc_y_shift = Accumulator(ShortView(in.msm_accumulator_y_shift));
246 const auto msm_transition_acc = Accumulator(msm_transition_s);
247
248 auto add_x = [&](auto& xb, auto& xa, auto& lambda, auto& selector, auto& collision_relation) {
249 collision_relation += selector * (xb - xa);
250 return lambda.sqr() + (-xb - xa - xa) * selector + xa;
251 };
252
253 auto first_add_x = [&](auto& xb, auto& xa, auto& lambda, auto& selector, auto& collision_relation) {
254 constexpr auto offset_generator = get_precomputed_generators<g1, "ECCVM_OFFSET_GENERATOR", 1>()[0];
255 constexpr uint256_t oxu = offset_generator.x;
256 const Accumulator xo(oxu);
257 auto x = xo * selector + xb * (-selector + 1);
258 collision_relation += (xa - x);
259 return lambda * lambda + (-x - xa);
260 };
261
262 const auto add2_acc = Accumulator(add2_s);
263 const auto add3_acc = Accumulator(add3_s);
264 const auto add4_acc = Accumulator(add4_s);
265 Accumulator x1_collision_relation(0);
266 Accumulator x2_collision_relation(0);
267 Accumulator x3_collision_relation(0);
268 Accumulator x4_collision_relation(0);
269 auto x_t1 = first_add_x(acc_x, x1, lambda1, msm_transition_acc, x1_collision_relation);
270 auto x_t2 = add_x(x2, x_t1, lambda2, add2_acc, x2_collision_relation);
271 auto x_t3 = add_x(x3, x_t2, lambda3, add3_acc, x3_collision_relation);
272 add_x(x4, x_t3, lambda4, add4_acc, x4_collision_relation);
273
274 static const FF inverse_seven_static = FF(7).invert();
275 const auto skew1_select = Accumulator(slice1_s * inverse_seven_static);
276 const auto skew2_select = Accumulator(slice2_s * inverse_seven_static);
277 const auto skew3_select = Accumulator(slice3_s * inverse_seven_static);
278 const auto skew4_select = Accumulator(slice4_s * inverse_seven_static);
279 Accumulator x1_skew_collision_relation(0);
280 Accumulator x2_skew_collision_relation(0);
281 Accumulator x3_skew_collision_relation(0);
282 Accumulator x4_skew_collision_relation(0);
283 auto x_s1 = add_x(x1, acc_x, lambda1, skew1_select, x1_skew_collision_relation);
284 auto x_s2 = add_x(x2, x_s1, lambda2, skew2_select, x2_skew_collision_relation);
285 auto x_s3 = add_x(x3, x_s2, lambda3, skew3_select, x3_skew_collision_relation);
286 add_x(x4, x_s3, lambda4, skew4_select, x4_skew_collision_relation);
287
288 const auto add_first_point_short = add1_s * q_add_s + q_skew_s * (slice1_s * inverse_seven_static);
289 const auto add_second_point_short = add2_s * q_add_s + q_skew_s * (slice2_s * inverse_seven_static);
290 const auto add_third_point_short = add3_s * q_add_s + q_skew_s * (slice3_s * inverse_seven_static);
291 const auto add_fourth_point_short = add4_s * q_add_s + q_skew_s * (slice4_s * inverse_seven_static);
292 const auto q_skew_acc = Accumulator(q_skew_s);
293 const auto q_add_acc = Accumulator(q_add_s);
294 const auto x1_delta = x1_skew_collision_relation * q_skew_acc + x1_collision_relation * q_add_acc;
295 const auto x2_delta = x2_skew_collision_relation * q_skew_acc + x2_collision_relation * q_add_acc;
296 const auto x3_delta = x3_skew_collision_relation * q_skew_acc + x3_collision_relation * q_add_acc;
297 const auto x4_delta = x4_skew_collision_relation * q_skew_acc + x4_collision_relation * q_add_acc;
298 std::get<COLLISION_CHECK_1>(accumulator) += x1_delta * Accumulator(collision_inverse1 * scaling_factor) -
299 Accumulator(add_first_point_short * scaling_factor);
300 std::get<COLLISION_CHECK_2>(accumulator) += x2_delta * Accumulator(collision_inverse2 * scaling_factor) -
301 Accumulator(add_second_point_short * scaling_factor);
302 std::get<COLLISION_CHECK_3>(accumulator) += x3_delta * Accumulator(collision_inverse3 * scaling_factor) -
303 Accumulator(add_third_point_short * scaling_factor);
304 std::get<COLLISION_CHECK_4>(accumulator) += x4_delta * Accumulator(collision_inverse4 * scaling_factor) -
305 Accumulator(add_fourth_point_short * scaling_factor);
306
307 std::get<INACTIVE_SLICE_1>(accumulator) += Acc3(((-add1_s + FF(1)) * slice1_s) * scaling_factor);
308 std::get<INACTIVE_SLICE_2>(accumulator) += Acc3(((-add2_s + FF(1)) * slice2_s) * scaling_factor);
309 std::get<INACTIVE_SLICE_3>(accumulator) += Acc3(((-add3_s + FF(1)) * slice3_s) * scaling_factor);
310 std::get<INACTIVE_SLICE_4>(accumulator) += Acc3(((-add4_s + FF(1)) * slice4_s) * scaling_factor);
311
312 {
313 const auto sum = q_add_s * q_double_s + q_add_s * q_skew_s + q_double_s * q_skew_s; // length 3
314 std::get<PHASE_SELECTOR_MUTUAL_EXCLUSIVITY>(accumulator) += Acc3(sum * scaling_factor);
315 }
316
317 const auto no_op_selector_short_a = (-q_add_s + FF(1)) * (-q_double_s + FF(1)); // length 3
318 const auto no_op_selector_short_b = (-q_skew_s + FF(1)) * (-msm_transition_s + FF(1)); // length 3
319 const auto no_op_selector_short_c = -lagrange_first_s + FF(1); // length 2
320 const auto no_op_selector_scaled_acc = Accumulator(no_op_selector_short_a * scaling_factor) *
321 Accumulator(no_op_selector_short_b) * Accumulator(no_op_selector_short_c);
322 std::get<IDLE_ROW_PRESERVES_ACC_X>(accumulator) += no_op_selector_scaled_acc * (acc_x_shift - acc_x);
323 std::get<IDLE_ROW_PRESERVES_ACC_Y>(accumulator) += no_op_selector_scaled_acc * (acc_y_shift - acc_y);
324
325 std::get<ADD1_DECOMPOSITION>(accumulator) += Acc2((add1_s - q_add_s - q_skew_s) * scaling_factor);
326
327 const auto round_delta_short = round_shift_s - round_s; // length 2
328 const auto neg_msm_transition_shift_plus_one_short = -msm_transition_shift_s + FF(1); // length 2
329 const auto round_transition_short = round_delta_short * neg_msm_transition_shift_plus_one_short; // length 3
330 {
331 const auto round_delta_minus_one_short = round_delta_short - FF(1); // length 2
333 Acc4(round_transition_short * scaling_factor) * Acc4(round_delta_minus_one_short);
334 }
335 {
336 const auto round_minus_31_short = round_s - FF(31);
338 Acc5(round_transition_short * scaling_factor) * Acc5(q_skew_shift_s * round_minus_31_short);
339 }
340 {
341 const auto q_skew_plus_q_double_minus_one_short = (q_skew_shift_s + q_double_shift_s) - FF(1); // length 2
343 Acc4(round_transition_short * scaling_factor) * Acc4(q_skew_plus_q_double_minus_one_short);
344 }
345 {
346 const auto neg_double_short = -q_double_shift_s + FF(1); // length 2
347 const auto neg_skew_short = -q_skew_shift_s + FF(1); // length 2
348 const auto not_double_not_skew_short = neg_double_short * neg_skew_short; // length 3
350 Acc5(round_transition_short * scaling_factor) * Acc5(not_double_not_skew_short);
351 }
352
353 std::get<DOUBLE_IMPLIES_NEXT_IS_ADD>(accumulator) += Acc3((q_double_s * (-q_add_shift_s + FF(1))) * scaling_factor);
355 Acc3((round_delta_short * count_shift_s) * scaling_factor);
356 {
357 const auto neg_round_delta_plus_one_short = -round_delta_short + FF(1); // length 2
358 const auto outer_short = neg_msm_transition_shift_plus_one_short * neg_round_delta_plus_one_short; // length 3
359 const auto inner_short = ((count_shift_s - count_s) - add1_s - add2_s - add3_s) - add4_s; // length 2
360 std::get<COUNT_INCREMENT_WITHIN_ROUND>(accumulator) += Acc4(outer_short * scaling_factor) * Acc4(inner_short);
361 }
362 {
363 const auto is_not_first_row_short = -lagrange_first_s + FF(1); // length 2
364 const auto outer_a_short = is_not_first_row_short * neg_msm_transition_shift_plus_one_short; // length 3
365 const auto outer_b_short = round_delta_short * count_shift_s; // length 3
367 Acc5(outer_a_short * scaling_factor) * Acc5(outer_b_short);
368 }
369
370 std::get<MSM_TRANSITION_ROUND_ZERO>(accumulator) += Acc3((msm_transition_s * round_s) * scaling_factor);
371 {
372 const auto is_not_first_row_short = -lagrange_first_s + FF(1);
373 const auto outer_short = is_not_first_row_short * msm_transition_shift_s; // length 3
374 const auto inner_short = (msm_size_s + pc_shift_s) - pc_s; // length 2
375 std::get<MSM_TRANSITION_PC>(accumulator) += Acc4(outer_short * scaling_factor) * Acc4(inner_short);
376 }
377 {
378 const auto round_minus_31_short = round_s - FF(LAST_ADDITION_ROUND); // length 2
379 const auto inverse_check_short = -(round_minus_31_short * round_minus_31_inv_s) + FF(1); // length 3
381 Acc4(q_double_shift_s * scaling_factor) * Acc4(inverse_check_short);
382 }
383 {
384 const auto not_add_short = -q_add_s + FF(1); // length 2
385 const auto not_double_short = -q_double_s + FF(1); // length 2
386 const auto not_skew_short = -q_skew_s + FF(1); // length 2
387 const auto next_phase_short = q_add_shift_s + q_double_shift_s + q_skew_shift_s; // length 2
388 const auto transition_shift_minus_one_short = msm_transition_shift_s - FF(1); // length 2
390 Acc6(not_add_short * scaling_factor) * Acc6(not_double_short) * Acc6(not_skew_short) *
391 Acc6(next_phase_short) * Acc6(transition_shift_minus_one_short);
392 }
393 {
394 const auto is_not_first_row_short = -lagrange_first_s + FF(1); // length 2
395 const auto active_phase_short = q_add_s + q_double_s; // length 2
396 std::get<MSM_PC_CONTINUITY>(accumulator) +=
397 Acc5(is_not_first_row_short * scaling_factor) * Acc5(active_phase_short) *
398 Acc5(neg_msm_transition_shift_plus_one_short) * Acc5(pc_shift_s - pc_s);
399 }
401 Acc4((q_skew_s * q_skew_shift_s) * scaling_factor) * Acc4(pc_shift_s - pc_s);
402
403 std::get<ADD_CONTINUITY_2>(accumulator) += Acc3((add2_s * (-add1_s + FF(1))) * scaling_factor);
404 std::get<ADD_CONTINUITY_3>(accumulator) += Acc3((add3_s * (-add2_s + FF(1))) * scaling_factor);
405 std::get<ADD_CONTINUITY_4>(accumulator) += Acc3((add4_s * (-add3_s + FF(1))) * scaling_factor);
406
407 {
408 const auto outer_short = q_add_s * q_add_shift_s + q_skew_s * q_skew_shift_s; // length 3
409 const auto inner_short = (-add4_s + FF(1)) * add1_shift_s; // length 3
410 std::get<ADD_CROSS_ROW_CONTINUITY>(accumulator) += Acc5(outer_short * scaling_factor) * Acc5(inner_short);
411 }
412
413 {
414 const auto neg_skew_shift_short = -q_skew_shift_s + FF(1); // length 2
415 const auto outer_short = neg_msm_transition_shift_plus_one_short * q_skew_s; // length 3
417 Acc4(outer_short * scaling_factor) * Acc4(neg_skew_shift_short);
418 }
419 std::get<SKEW_IMPLIES_ROUND_32>(accumulator) += Acc3((q_skew_s * (-round_s + FF(32))) * scaling_factor);
421 Acc3(((-round_delta_short + FF(1)) * q_double_shift_s) * scaling_factor);
422}
423
424} // namespace bb
bb::field< bb::Bn254FrParams > FF
Definition field.cpp:24
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters &params, const FF &scaling_factor)
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters &params, const FF &scaling_factor)
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters &params, const FF &scaling_factor)
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters &params, const FF &scaling_factor)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
group< fq, fr, Bn254G1Params > g1
Definition g1.hpp:34
constexpr size_t LAST_ADDITION_ROUND
Inner sum(Cont< Inner, Args... > const &in)
Definition container.hpp:70
constexpr std::span< const typename Group::affine_element > get_precomputed_generators()
typename Accumulator::CoefficientAccumulator ECCVMShortMonomialView
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
constexpr field invert() const noexcept