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>;
201
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);
227
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);
245
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;
249 };
250
251 auto first_add_x = [&](auto& xb, auto& xa, auto& lambda, auto& selector, auto& collision_relation) {
252 constexpr auto offset_generator = get_precomputed_generators<g1, "ECCVM_OFFSET_GENERATOR", 1>()[0];
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);
258 };
259
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);
271
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);
285
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;
296 std::get<COLLISION_CHECK_1>(accumulator) += x1_delta * Accumulator(collision_inverse1 * scaling_factor) -
297 Accumulator(add_first_point_short * scaling_factor);
298 std::get<COLLISION_CHECK_2>(accumulator) += x2_delta * Accumulator(collision_inverse2 * scaling_factor) -
299 Accumulator(add_second_point_short * scaling_factor);
300 std::get<COLLISION_CHECK_3>(accumulator) += x3_delta * Accumulator(collision_inverse3 * scaling_factor) -
301 Accumulator(add_third_point_short * scaling_factor);
302 std::get<COLLISION_CHECK_4>(accumulator) += x4_delta * Accumulator(collision_inverse4 * scaling_factor) -
303 Accumulator(add_fourth_point_short * scaling_factor);
304
305 std::get<INACTIVE_SLICE_1>(accumulator) += Acc3(((-add1_s + FF(1)) * slice1_s) * scaling_factor);
306 std::get<INACTIVE_SLICE_2>(accumulator) += Acc3(((-add2_s + FF(1)) * slice2_s) * scaling_factor);
307 std::get<INACTIVE_SLICE_3>(accumulator) += Acc3(((-add3_s + FF(1)) * slice3_s) * scaling_factor);
308 std::get<INACTIVE_SLICE_4>(accumulator) += Acc3(((-add4_s + FF(1)) * slice4_s) * scaling_factor);
309
310 {
311 const auto sum = q_add_s * q_double_s + q_add_s * q_skew_s + q_double_s * q_skew_s; // length 3
312 std::get<PHASE_SELECTOR_MUTUAL_EXCLUSIVITY>(accumulator) += Acc3(sum * scaling_factor);
313 }
314
315 const auto no_op_selector_short_a = (-q_add_s + FF(1)) * (-q_double_s + FF(1)); // length 3
316 const auto no_op_selector_short_b = (-q_skew_s + FF(1)) * (-msm_transition_s + FF(1)); // length 3
317 const auto no_op_selector_short_c = -lagrange_first_s + FF(1); // length 2
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);
320 std::get<IDLE_ROW_PRESERVES_ACC_X>(accumulator) += no_op_selector_scaled_acc * (acc_x_shift - acc_x);
321 std::get<IDLE_ROW_PRESERVES_ACC_Y>(accumulator) += no_op_selector_scaled_acc * (acc_y_shift - acc_y);
322
323 std::get<ADD1_DECOMPOSITION>(accumulator) += Acc2((add1_s - q_add_s - q_skew_s) * scaling_factor);
324
325 const auto round_delta_short = round_shift_s - round_s; // length 2
326 const auto neg_msm_transition_shift_plus_one_short = -msm_transition_shift_s + FF(1); // length 2
327 const auto round_transition_short = round_delta_short * neg_msm_transition_shift_plus_one_short; // length 3
328 {
329 const auto round_delta_minus_one_short = round_delta_short - FF(1); // length 2
331 Acc4(round_transition_short * scaling_factor) * Acc4(round_delta_minus_one_short);
332 }
333 {
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);
337 }
338 {
339 const auto q_skew_plus_q_double_minus_one_short = (q_skew_shift_s + q_double_shift_s) - FF(1); // length 2
341 Acc4(round_transition_short * scaling_factor) * Acc4(q_skew_plus_q_double_minus_one_short);
342 }
343 {
344 const auto neg_double_short = -q_double_shift_s + FF(1); // length 2
345 const auto neg_skew_short = -q_skew_shift_s + FF(1); // length 2
346 const auto not_double_not_skew_short = neg_double_short * neg_skew_short; // length 3
348 Acc5(round_transition_short * scaling_factor) * Acc5(not_double_not_skew_short);
349 }
350
351 std::get<DOUBLE_IMPLIES_NEXT_IS_ADD>(accumulator) += Acc3((q_double_s * (-q_add_shift_s + FF(1))) * scaling_factor);
353 Acc3((round_delta_short * count_shift_s) * scaling_factor);
354 {
355 const auto neg_round_delta_plus_one_short = -round_delta_short + FF(1); // length 2
356 const auto outer_short = neg_msm_transition_shift_plus_one_short * neg_round_delta_plus_one_short; // length 3
357 const auto inner_short = ((count_shift_s - count_s) - add1_s - add2_s - add3_s) - add4_s; // length 2
358 std::get<COUNT_INCREMENT_WITHIN_ROUND>(accumulator) += Acc4(outer_short * scaling_factor) * Acc4(inner_short);
359 }
360 {
361 const auto is_not_first_row_short = -lagrange_first_s + FF(1); // length 2
362 const auto outer_a_short = is_not_first_row_short * neg_msm_transition_shift_plus_one_short; // length 3
363 const auto outer_b_short = round_delta_short * count_shift_s; // length 3
365 Acc5(outer_a_short * scaling_factor) * Acc5(outer_b_short);
366 }
367
368 std::get<MSM_TRANSITION_ROUND_ZERO>(accumulator) += Acc3((msm_transition_s * round_s) * scaling_factor);
369 {
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; // length 3
372 const auto inner_short = (msm_size_s + pc_shift_s) - pc_s; // length 2
373 std::get<MSM_TRANSITION_PC>(accumulator) += Acc4(outer_short * scaling_factor) * Acc4(inner_short);
374 }
375
376 std::get<ADD_CONTINUITY_2>(accumulator) += Acc3((add2_s * (-add1_s + FF(1))) * scaling_factor);
377 std::get<ADD_CONTINUITY_3>(accumulator) += Acc3((add3_s * (-add2_s + FF(1))) * scaling_factor);
378 std::get<ADD_CONTINUITY_4>(accumulator) += Acc3((add4_s * (-add3_s + FF(1))) * scaling_factor);
379
380 {
381 const auto outer_short = q_add_s * q_add_shift_s + q_skew_s * q_skew_shift_s; // length 3
382 const auto inner_short = (-add4_s + FF(1)) * add1_shift_s; // length 3
383 std::get<ADD_CROSS_ROW_CONTINUITY>(accumulator) += Acc5(outer_short * scaling_factor) * Acc5(inner_short);
384 }
385
386 {
387 const auto neg_skew_shift_short = -q_skew_shift_s + FF(1); // length 2
388 const auto outer_short = neg_msm_transition_shift_plus_one_short * q_skew_s; // length 3
390 Acc4(outer_short * scaling_factor) * Acc4(neg_skew_shift_short);
391 }
392 std::get<SKEW_IMPLIES_ROUND_32>(accumulator) += Acc3((q_skew_s * (-round_s + FF(32))) * scaling_factor);
394 Acc3(((-round_delta_short + FF(1)) * q_double_shift_s) * scaling_factor);
395}
396
397} // 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
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