Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
translator_decomposition_relation_impl.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
9
10namespace bb {
11
30template <typename FF>
31template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
32void TranslatorDecompositionRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulators,
33 const AllEntities& in,
34 const Parameters&,
35 const FF& scaling_factor)
36{
37 static constexpr size_t NUM_LIMB_BITS = 68; // Number of bits in a standard limb used for bigfield operations
38 static constexpr size_t NUM_MICRO_LIMB_BITS = 14; // Number of bits in a standard limb used for bigfield operations
39
40 [&]() {
41 // Within the no-op range i.e. when the op polynomial is 0 at even index the 2 Translator trace rows are empty
42 // except for the accumulator binary limbs which get transferred across the no-op range
44 using View = typename Accumulator::View;
45
46 // Values to multiply an element by to perform an appropriate shift
47 static auto MICRO_LIMB_SHIFT = FF(uint256_t(1) << NUM_MICRO_LIMB_BITS);
48 static auto MICRO_LIMB_SHIFTx2 = MICRO_LIMB_SHIFT * MICRO_LIMB_SHIFT;
49 static auto MICRO_LIMB_SHIFTx3 = MICRO_LIMB_SHIFTx2 * MICRO_LIMB_SHIFT;
50 static auto MICRO_LIMB_SHIFTx4 = MICRO_LIMB_SHIFTx3 * MICRO_LIMB_SHIFT;
51
52 auto accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
53 auto accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
54 auto accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
55 auto accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
56 auto accumulator_low_limbs_range_constraint_0 = View(in.accumulator_low_limbs_range_constraint_0);
57 auto accumulator_low_limbs_range_constraint_1 = View(in.accumulator_low_limbs_range_constraint_1);
58 auto accumulator_low_limbs_range_constraint_2 = View(in.accumulator_low_limbs_range_constraint_2);
59 auto accumulator_low_limbs_range_constraint_3 = View(in.accumulator_low_limbs_range_constraint_3);
60 auto accumulator_low_limbs_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4);
61 auto accumulator_low_limbs_range_constraint_0_shift = View(in.accumulator_low_limbs_range_constraint_0_shift);
62 auto accumulator_low_limbs_range_constraint_1_shift = View(in.accumulator_low_limbs_range_constraint_1_shift);
63 auto accumulator_low_limbs_range_constraint_2_shift = View(in.accumulator_low_limbs_range_constraint_2_shift);
64 auto accumulator_low_limbs_range_constraint_3_shift = View(in.accumulator_low_limbs_range_constraint_3_shift);
65 auto accumulator_low_limbs_range_constraint_4_shift = View(in.accumulator_low_limbs_range_constraint_4_shift);
66 auto accumulator_high_limbs_range_constraint_0 = View(in.accumulator_high_limbs_range_constraint_0);
67 auto accumulator_high_limbs_range_constraint_1 = View(in.accumulator_high_limbs_range_constraint_1);
68 auto accumulator_high_limbs_range_constraint_2 = View(in.accumulator_high_limbs_range_constraint_2);
69 auto accumulator_high_limbs_range_constraint_3 = View(in.accumulator_high_limbs_range_constraint_3);
70 auto accumulator_high_limbs_range_constraint_4 = View(in.accumulator_high_limbs_range_constraint_4);
71 auto accumulator_high_limbs_range_constraint_0_shift = View(in.accumulator_high_limbs_range_constraint_0_shift);
72 auto accumulator_high_limbs_range_constraint_1_shift = View(in.accumulator_high_limbs_range_constraint_1_shift);
73 auto accumulator_high_limbs_range_constraint_2_shift = View(in.accumulator_high_limbs_range_constraint_2_shift);
74 auto accumulator_high_limbs_range_constraint_3_shift = View(in.accumulator_high_limbs_range_constraint_3_shift);
75 auto op = View(in.op);
76 auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
77 auto not_even_or_no_op_scaled = lagrange_even_in_minicircuit * op * scaling_factor;
78
79 // Contribution 1, accumulator lowest limb decomposition
80 auto tmp_1 =
81 ((accumulator_low_limbs_range_constraint_0 + accumulator_low_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
82 accumulator_low_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
83 accumulator_low_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
84 accumulator_low_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
85 accumulators_binary_limbs_0);
86 tmp_1 *= not_even_or_no_op_scaled;
87 std::get<0>(accumulators) += tmp_1;
88
89 // Contribution 2, accumulator second limb decomposition
90 auto tmp_2 = ((accumulator_low_limbs_range_constraint_0_shift +
91 accumulator_low_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
92 accumulator_low_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
93 accumulator_low_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
94 accumulator_low_limbs_range_constraint_4_shift * MICRO_LIMB_SHIFTx4) -
95 accumulators_binary_limbs_1);
96 tmp_2 *= not_even_or_no_op_scaled;
97 std::get<1>(accumulators) += tmp_2;
98
99 // Contribution 3, accumulator second highest limb decomposition
100 auto tmp_3 =
101 ((accumulator_high_limbs_range_constraint_0 + accumulator_high_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
102 accumulator_high_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
103 accumulator_high_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
104 accumulator_high_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
105 accumulators_binary_limbs_2);
106 tmp_3 *= not_even_or_no_op_scaled;
107 std::get<2>(accumulators) += tmp_3;
108
109 // Contribution 4, accumulator highest limb decomposition
110 auto tmp_4 = ((accumulator_high_limbs_range_constraint_0_shift +
111 accumulator_high_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
112 accumulator_high_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
113 accumulator_high_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3) -
114 accumulators_binary_limbs_3);
115 tmp_4 *= not_even_or_no_op_scaled;
116 std::get<3>(accumulators) += tmp_4;
117 }();
118
119 [&]() {
121 using View = typename Accumulator::View;
122
123 // Value to multiply an element by to perform an appropriate shift
124 static auto LIMB_SHIFT = FF(uint256_t(1) << NUM_LIMB_BITS);
125
126 // Values to multiply an element by to perform an appropriate shift
127 static auto MICRO_LIMB_SHIFT = FF(uint256_t(1) << NUM_MICRO_LIMB_BITS);
128 static auto MICRO_LIMB_SHIFTx2 = MICRO_LIMB_SHIFT * MICRO_LIMB_SHIFT;
129 static auto MICRO_LIMB_SHIFTx3 = MICRO_LIMB_SHIFTx2 * MICRO_LIMB_SHIFT;
130 static auto MICRO_LIMB_SHIFTx4 = MICRO_LIMB_SHIFTx3 * MICRO_LIMB_SHIFT;
131 static auto MICRO_LIMB_SHIFTx5 = MICRO_LIMB_SHIFTx4 * MICRO_LIMB_SHIFT;
132
133 auto accumulator_low_limbs_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4);
134 auto accumulator_low_limbs_range_constraint_4_shift = View(in.accumulator_low_limbs_range_constraint_4_shift);
135 auto accumulator_high_limbs_range_constraint_4 = View(in.accumulator_high_limbs_range_constraint_4);
136
137 // Shifts used to constrain ranges further
138 static auto SHIFT_12_TO_14 =
139 FF(4); // Shift used to range constrain the last microlimb of 68-bit limbs (standard limbs)
140 static auto SHIFT_10_TO_14 =
141 FF(16); // Shift used to range constrain the last microlimb of 52-bit limb (top quotient limb)
142 static auto SHIFT_8_TO_14 = FF(64); // Shift used to range constrain the last microlimb of 50-bit
143 // limbs (top limb of standard 254-bit value)
144 static auto SHIFT_4_TO_14 =
145 FF(1024); // Shift used to range constrain the last mircrolimb of 60-bit limbs from z scalars
146
147 auto p_x_low_limbs = View(in.p_x_low_limbs);
148 auto p_x_low_limbs_range_constraint_0 = View(in.p_x_low_limbs_range_constraint_0);
149 auto p_x_low_limbs_range_constraint_1 = View(in.p_x_low_limbs_range_constraint_1);
150 auto p_x_low_limbs_range_constraint_2 = View(in.p_x_low_limbs_range_constraint_2);
151 auto p_x_low_limbs_range_constraint_3 = View(in.p_x_low_limbs_range_constraint_3);
152 auto p_x_low_limbs_range_constraint_4 = View(in.p_x_low_limbs_range_constraint_4);
153 auto p_x_low_limbs_shift = View(in.p_x_low_limbs_shift);
154 auto p_x_low_limbs_range_constraint_0_shift = View(in.p_x_low_limbs_range_constraint_0_shift);
155 auto p_x_low_limbs_range_constraint_1_shift = View(in.p_x_low_limbs_range_constraint_1_shift);
156 auto p_x_low_limbs_range_constraint_2_shift = View(in.p_x_low_limbs_range_constraint_2_shift);
157 auto p_x_low_limbs_range_constraint_3_shift = View(in.p_x_low_limbs_range_constraint_3_shift);
158 auto p_x_low_limbs_range_constraint_4_shift = View(in.p_x_low_limbs_range_constraint_4_shift);
159 auto p_x_high_limbs = View(in.p_x_high_limbs);
160 auto p_x_high_limbs_range_constraint_0 = View(in.p_x_high_limbs_range_constraint_0);
161 auto p_x_high_limbs_range_constraint_1 = View(in.p_x_high_limbs_range_constraint_1);
162 auto p_x_high_limbs_range_constraint_2 = View(in.p_x_high_limbs_range_constraint_2);
163 auto p_x_high_limbs_range_constraint_3 = View(in.p_x_high_limbs_range_constraint_3);
164 auto p_x_high_limbs_range_constraint_4 = View(in.p_x_high_limbs_range_constraint_4);
165 auto p_x_high_limbs_shift = View(in.p_x_high_limbs_shift);
166 auto p_x_high_limbs_range_constraint_0_shift = View(in.p_x_high_limbs_range_constraint_0_shift);
167 auto p_x_high_limbs_range_constraint_1_shift = View(in.p_x_high_limbs_range_constraint_1_shift);
168 auto p_x_high_limbs_range_constraint_2_shift = View(in.p_x_high_limbs_range_constraint_2_shift);
169 auto p_x_high_limbs_range_constraint_3_shift = View(in.p_x_high_limbs_range_constraint_3_shift);
170 auto p_y_low_limbs = View(in.p_y_low_limbs);
171 auto p_y_low_limbs_range_constraint_0 = View(in.p_y_low_limbs_range_constraint_0);
172 auto p_y_low_limbs_range_constraint_1 = View(in.p_y_low_limbs_range_constraint_1);
173 auto p_y_low_limbs_range_constraint_2 = View(in.p_y_low_limbs_range_constraint_2);
174 auto p_y_low_limbs_range_constraint_3 = View(in.p_y_low_limbs_range_constraint_3);
175 auto p_y_low_limbs_range_constraint_4 = View(in.p_y_low_limbs_range_constraint_4);
176 auto p_y_low_limbs_shift = View(in.p_y_low_limbs_shift);
177 auto p_y_low_limbs_range_constraint_0_shift = View(in.p_y_low_limbs_range_constraint_0_shift);
178 auto p_y_low_limbs_range_constraint_1_shift = View(in.p_y_low_limbs_range_constraint_1_shift);
179 auto p_y_low_limbs_range_constraint_2_shift = View(in.p_y_low_limbs_range_constraint_2_shift);
180 auto p_y_low_limbs_range_constraint_3_shift = View(in.p_y_low_limbs_range_constraint_3_shift);
181 auto p_y_low_limbs_range_constraint_4_shift = View(in.p_y_low_limbs_range_constraint_4_shift);
182 auto p_y_high_limbs = View(in.p_y_high_limbs);
183 auto p_y_high_limbs_range_constraint_0 = View(in.p_y_high_limbs_range_constraint_0);
184 auto p_y_high_limbs_range_constraint_1 = View(in.p_y_high_limbs_range_constraint_1);
185 auto p_y_high_limbs_range_constraint_2 = View(in.p_y_high_limbs_range_constraint_2);
186 auto p_y_high_limbs_range_constraint_3 = View(in.p_y_high_limbs_range_constraint_3);
187 auto p_y_high_limbs_range_constraint_4 = View(in.p_y_high_limbs_range_constraint_4);
188 auto p_y_high_limbs_shift = View(in.p_y_high_limbs_shift);
189 auto p_y_high_limbs_range_constraint_0_shift = View(in.p_y_high_limbs_range_constraint_0_shift);
190 auto p_y_high_limbs_range_constraint_1_shift = View(in.p_y_high_limbs_range_constraint_1_shift);
191 auto p_y_high_limbs_range_constraint_2_shift = View(in.p_y_high_limbs_range_constraint_2_shift);
192 auto p_y_high_limbs_range_constraint_3_shift = View(in.p_y_high_limbs_range_constraint_3_shift);
193 auto z_low_limbs = View(in.z_low_limbs);
194 auto z_low_limbs_range_constraint_0 = View(in.z_low_limbs_range_constraint_0);
195 auto z_low_limbs_range_constraint_1 = View(in.z_low_limbs_range_constraint_1);
196 auto z_low_limbs_range_constraint_2 = View(in.z_low_limbs_range_constraint_2);
197 auto z_low_limbs_range_constraint_3 = View(in.z_low_limbs_range_constraint_3);
198 auto z_low_limbs_range_constraint_4 = View(in.z_low_limbs_range_constraint_4);
199 auto z_low_limbs_shift = View(in.z_low_limbs_shift);
200 auto z_low_limbs_range_constraint_0_shift = View(in.z_low_limbs_range_constraint_0_shift);
201 auto z_low_limbs_range_constraint_1_shift = View(in.z_low_limbs_range_constraint_1_shift);
202 auto z_low_limbs_range_constraint_2_shift = View(in.z_low_limbs_range_constraint_2_shift);
203 auto z_low_limbs_range_constraint_3_shift = View(in.z_low_limbs_range_constraint_3_shift);
204 auto z_low_limbs_range_constraint_4_shift = View(in.z_low_limbs_range_constraint_4_shift);
205 auto z_high_limbs = View(in.z_high_limbs);
206 auto z_high_limbs_range_constraint_0 = View(in.z_high_limbs_range_constraint_0);
207 auto z_high_limbs_range_constraint_1 = View(in.z_high_limbs_range_constraint_1);
208 auto z_high_limbs_range_constraint_2 = View(in.z_high_limbs_range_constraint_2);
209 auto z_high_limbs_range_constraint_3 = View(in.z_high_limbs_range_constraint_3);
210 auto z_high_limbs_range_constraint_4 = View(in.z_high_limbs_range_constraint_4);
211 auto z_high_limbs_shift = View(in.z_high_limbs_shift);
212 auto z_high_limbs_range_constraint_0_shift = View(in.z_high_limbs_range_constraint_0_shift);
213 auto z_high_limbs_range_constraint_1_shift = View(in.z_high_limbs_range_constraint_1_shift);
214 auto z_high_limbs_range_constraint_2_shift = View(in.z_high_limbs_range_constraint_2_shift);
215 auto z_high_limbs_range_constraint_3_shift = View(in.z_high_limbs_range_constraint_3_shift);
216 auto z_high_limbs_range_constraint_4_shift = View(in.z_high_limbs_range_constraint_4_shift);
217 auto quotient_low_binary_limbs = View(in.quotient_low_binary_limbs);
218 auto quotient_low_limbs_range_constraint_0 = View(in.quotient_low_limbs_range_constraint_0);
219 auto quotient_low_limbs_range_constraint_1 = View(in.quotient_low_limbs_range_constraint_1);
220 auto quotient_low_limbs_range_constraint_2 = View(in.quotient_low_limbs_range_constraint_2);
221 auto quotient_low_limbs_range_constraint_3 = View(in.quotient_low_limbs_range_constraint_3);
222 auto quotient_low_limbs_range_constraint_4 = View(in.quotient_low_limbs_range_constraint_4);
223 auto quotient_low_binary_limbs_shift = View(in.quotient_low_binary_limbs_shift);
224 auto quotient_low_limbs_range_constraint_0_shift = View(in.quotient_low_limbs_range_constraint_0_shift);
225 auto quotient_low_limbs_range_constraint_1_shift = View(in.quotient_low_limbs_range_constraint_1_shift);
226 auto quotient_low_limbs_range_constraint_2_shift = View(in.quotient_low_limbs_range_constraint_2_shift);
227 auto quotient_low_limbs_range_constraint_3_shift = View(in.quotient_low_limbs_range_constraint_3_shift);
228 auto quotient_low_limbs_range_constraint_4_shift = View(in.quotient_low_limbs_range_constraint_4_shift);
229 auto quotient_high_binary_limbs = View(in.quotient_high_binary_limbs);
230 auto quotient_high_limbs_range_constraint_0 = View(in.quotient_high_limbs_range_constraint_0);
231 auto quotient_high_limbs_range_constraint_1 = View(in.quotient_high_limbs_range_constraint_1);
232 auto quotient_high_limbs_range_constraint_2 = View(in.quotient_high_limbs_range_constraint_2);
233 auto quotient_high_limbs_range_constraint_3 = View(in.quotient_high_limbs_range_constraint_3);
234 auto quotient_high_limbs_range_constraint_4 = View(in.quotient_high_limbs_range_constraint_4);
235 auto quotient_high_binary_limbs_shift = View(in.quotient_high_binary_limbs_shift);
236 auto quotient_high_limbs_range_constraint_0_shift = View(in.quotient_high_limbs_range_constraint_0_shift);
237 auto quotient_high_limbs_range_constraint_1_shift = View(in.quotient_high_limbs_range_constraint_1_shift);
238 auto quotient_high_limbs_range_constraint_2_shift = View(in.quotient_high_limbs_range_constraint_2_shift);
239 auto quotient_high_limbs_range_constraint_3_shift = View(in.quotient_high_limbs_range_constraint_3_shift);
240 auto relation_wide_limbs = View(in.relation_wide_limbs);
241 auto relation_wide_limbs_range_constraint_0 = View(in.relation_wide_limbs_range_constraint_0);
242 auto relation_wide_limbs_range_constraint_1 = View(in.relation_wide_limbs_range_constraint_1);
243 auto relation_wide_limbs_range_constraint_2 = View(in.relation_wide_limbs_range_constraint_2);
244 auto relation_wide_limbs_range_constraint_3 = View(in.relation_wide_limbs_range_constraint_3);
245 auto p_x_high_limbs_range_constraint_tail_shift = View(in.p_x_high_limbs_range_constraint_tail_shift);
246 auto accumulator_high_limbs_range_constraint_tail_shift =
247 View(in.accumulator_high_limbs_range_constraint_tail_shift);
248 auto relation_wide_limbs_shift = View(in.relation_wide_limbs_shift);
249 auto relation_wide_limbs_range_constraint_0_shift = View(in.relation_wide_limbs_range_constraint_0_shift);
250 auto relation_wide_limbs_range_constraint_1_shift = View(in.relation_wide_limbs_range_constraint_1_shift);
251 auto relation_wide_limbs_range_constraint_2_shift = View(in.relation_wide_limbs_range_constraint_2_shift);
252 auto relation_wide_limbs_range_constraint_3_shift = View(in.relation_wide_limbs_range_constraint_3_shift);
253 auto p_y_high_limbs_range_constraint_tail_shift = View(in.p_y_high_limbs_range_constraint_tail_shift);
254 auto quotient_high_limbs_range_constraint_tail_shift = View(in.quotient_high_limbs_range_constraint_tail_shift);
255 auto p_x_low_limbs_range_constraint_tail = View(in.p_x_low_limbs_range_constraint_tail);
256 auto p_x_low_limbs_range_constraint_tail_shift = View(in.p_x_low_limbs_range_constraint_tail_shift);
257 auto p_x_high_limbs_range_constraint_tail = View(in.p_x_high_limbs_range_constraint_tail);
258 auto p_x_high_limbs_range_constraint_4_shift = View(in.p_x_high_limbs_range_constraint_4_shift);
259 auto p_y_low_limbs_range_constraint_tail = View(in.p_y_low_limbs_range_constraint_tail);
260 auto p_y_low_limbs_range_constraint_tail_shift = View(in.p_y_low_limbs_range_constraint_tail_shift);
261 auto p_y_high_limbs_range_constraint_tail = View(in.p_y_high_limbs_range_constraint_tail);
262 auto p_y_high_limbs_range_constraint_4_shift = View(in.p_y_high_limbs_range_constraint_4_shift);
263 auto z_low_limbs_range_constraint_tail = View(in.z_low_limbs_range_constraint_tail);
264 auto z_low_limbs_range_constraint_tail_shift = View(in.z_low_limbs_range_constraint_tail_shift);
265 auto z_high_limbs_range_constraint_tail = View(in.z_high_limbs_range_constraint_tail);
266 auto z_high_limbs_range_constraint_tail_shift = View(in.z_high_limbs_range_constraint_tail_shift);
267 auto accumulator_low_limbs_range_constraint_tail = View(in.accumulator_low_limbs_range_constraint_tail);
268 auto accumulator_low_limbs_range_constraint_tail_shift =
269 View(in.accumulator_low_limbs_range_constraint_tail_shift);
270 auto accumulator_high_limbs_range_constraint_tail = View(in.accumulator_high_limbs_range_constraint_tail);
271 auto accumulator_high_limbs_range_constraint_3_shift = View(in.accumulator_high_limbs_range_constraint_3_shift);
272 auto accumulator_high_limbs_range_constraint_4_shift = View(in.accumulator_high_limbs_range_constraint_4_shift);
273 auto quotient_low_limbs_range_constraint_tail = View(in.quotient_low_limbs_range_constraint_tail);
274 auto quotient_low_limbs_range_constraint_tail_shift = View(in.quotient_low_limbs_range_constraint_tail_shift);
275 auto quotient_high_limbs_range_constraint_tail = View(in.quotient_high_limbs_range_constraint_tail);
276 auto quotient_high_limbs_range_constraint_4_shift = View(in.quotient_high_limbs_range_constraint_4_shift);
277 auto x_lo_y_hi = View(in.x_lo_y_hi);
278 auto x_hi_z_1 = View(in.x_hi_z_1);
279 auto y_lo_z_2 = View(in.y_lo_z_2);
280 auto x_lo_y_hi_shift = View(in.x_lo_y_hi_shift);
281 auto x_hi_z_1_shift = View(in.x_hi_z_1_shift);
282 auto y_lo_z_2_shift = View(in.y_lo_z_2_shift);
283 auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
284
285 // Contribution 5 , P_y lowest limb decomposition
286 auto tmp_5 = ((p_y_low_limbs_range_constraint_0 + p_y_low_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
287 p_y_low_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
288 p_y_low_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
289 p_y_low_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
290 p_y_low_limbs);
291 tmp_5 *= lagrange_even_in_minicircuit;
292 tmp_5 *= scaling_factor;
293 std::get<4>(accumulators) += tmp_5;
294
295 // Contribution 6 , P_y second lowest limb decomposition
296 auto tmp_6 =
297 ((p_y_low_limbs_range_constraint_0_shift + p_y_low_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
298 p_y_low_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
299 p_y_low_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
300 p_y_low_limbs_range_constraint_4_shift * MICRO_LIMB_SHIFTx4) -
301 p_y_low_limbs_shift);
302 tmp_6 *= lagrange_even_in_minicircuit;
303 tmp_6 *= scaling_factor;
304 std::get<5>(accumulators) += tmp_6;
305
306 // Contribution 7 , P_y third limb decomposition
307 auto tmp_7 = ((p_y_high_limbs_range_constraint_0 + p_y_high_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
308 p_y_high_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
309 p_y_high_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
310 p_y_high_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
311 p_y_high_limbs);
312 tmp_7 *= lagrange_even_in_minicircuit;
313 tmp_7 *= scaling_factor;
314 std::get<6>(accumulators) += tmp_7;
315
316 // Contribution 8 , P_y highest limb decomposition
317 auto tmp_8 =
318 ((p_y_high_limbs_range_constraint_0_shift + p_y_high_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
319 p_y_high_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
320 p_y_high_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3) -
321 p_y_high_limbs_shift);
322 tmp_8 *= lagrange_even_in_minicircuit;
323 tmp_8 *= scaling_factor;
324 std::get<7>(accumulators) += tmp_8;
325
326 // Contribution 9 , z_1 low limb decomposition
327 auto tmp_9 = ((z_low_limbs_range_constraint_0 + z_low_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
328 z_low_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
329 z_low_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
330 z_low_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
331 z_low_limbs);
332 tmp_9 *= lagrange_even_in_minicircuit;
333 tmp_9 *= scaling_factor;
334 std::get<8>(accumulators) += tmp_9;
335
336 // Contribution 10 , z_2 low limb decomposition
337 auto tmp_10 = ((z_low_limbs_range_constraint_0_shift + z_low_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
338 z_low_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
339 z_low_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
340 z_low_limbs_range_constraint_4_shift * MICRO_LIMB_SHIFTx4) -
341 z_low_limbs_shift);
342 tmp_10 *= lagrange_even_in_minicircuit;
343 tmp_10 *= scaling_factor;
344 std::get<9>(accumulators) += tmp_10;
345
346 // Contribution 11 , z_1 high limb decomposition
347 auto tmp_11 = ((z_high_limbs_range_constraint_0 + z_high_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
348 z_high_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
349 z_high_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
350 z_high_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
351 z_high_limbs);
352 tmp_11 *= lagrange_even_in_minicircuit;
353 tmp_11 *= scaling_factor;
354 std::get<10>(accumulators) += tmp_11;
355
356 // Contribution 12 , z_2 high limb decomposition
357 auto tmp_12 =
358 ((z_high_limbs_range_constraint_0_shift + z_high_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
359 z_high_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
360 z_high_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
361 z_high_limbs_range_constraint_4_shift * MICRO_LIMB_SHIFTx4) -
362 z_high_limbs_shift);
363 tmp_12 *= lagrange_even_in_minicircuit;
364 tmp_12 *= scaling_factor;
365 std::get<11>(accumulators) += tmp_12;
366
367 // Contributions that decompose 50, 52, 68 or 84 bit limbs used for computation into range-constrained chunks
368 // Contribution 13, P_x lowest limb decomposition
369 auto tmp_13 = ((p_x_low_limbs_range_constraint_0 + p_x_low_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
370 p_x_low_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
371 p_x_low_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
372 p_x_low_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
373 p_x_low_limbs);
374 tmp_13 *= lagrange_even_in_minicircuit;
375 tmp_13 *= scaling_factor;
376 std::get<12>(accumulators) += tmp_13;
377
378 // Contribution 14 , P_x second lowest limb decomposition
379 auto tmp_14 =
380 ((p_x_low_limbs_range_constraint_0_shift + p_x_low_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
381 p_x_low_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
382 p_x_low_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
383 p_x_low_limbs_range_constraint_4_shift * MICRO_LIMB_SHIFTx4) -
384 p_x_low_limbs_shift);
385 tmp_14 *= lagrange_even_in_minicircuit;
386 tmp_14 *= scaling_factor;
387 std::get<13>(accumulators) += tmp_14;
388
389 // Contribution 15 , P_x third limb decomposition
390 auto tmp_15 = ((p_x_high_limbs_range_constraint_0 + p_x_high_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
391 p_x_high_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
392 p_x_high_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
393 p_x_high_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
394 p_x_high_limbs);
395 tmp_15 *= lagrange_even_in_minicircuit;
396 tmp_15 *= scaling_factor;
397 std::get<14>(accumulators) += tmp_15;
398
399 // Contribution 16 , P_x highest limb decomposition
400 auto tmp_16 =
401 ((p_x_high_limbs_range_constraint_0_shift + p_x_high_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
402 p_x_high_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
403 p_x_high_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3) -
404 p_x_high_limbs_shift);
405 tmp_16 *= lagrange_even_in_minicircuit;
406 tmp_16 *= scaling_factor;
407 std::get<15>(accumulators) += tmp_16;
408
409 // Contribution 17 , quotient lowest limb decomposition
410 auto tmp_17 =
411 ((quotient_low_limbs_range_constraint_0 + quotient_low_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
412 quotient_low_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
413 quotient_low_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
414 quotient_low_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
415 quotient_low_binary_limbs);
416 tmp_17 *= lagrange_even_in_minicircuit;
417 tmp_17 *= scaling_factor;
418 std::get<16>(accumulators) += tmp_17;
419 // Contribution 18 , quotient second lowest limb decomposition
420 auto tmp_18 = ((quotient_low_limbs_range_constraint_0_shift +
421 quotient_low_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
422 quotient_low_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
423 quotient_low_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
424 quotient_low_limbs_range_constraint_4_shift * MICRO_LIMB_SHIFTx4) -
425 quotient_low_binary_limbs_shift);
426 tmp_18 *= lagrange_even_in_minicircuit;
427 tmp_18 *= scaling_factor;
428 std::get<17>(accumulators) += tmp_18;
429
430 // Contribution 19 , quotient second highest limb decomposition
431 auto tmp_19 =
432 ((quotient_high_limbs_range_constraint_0 + quotient_high_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
433 quotient_high_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
434 quotient_high_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
435 quotient_high_limbs_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
436 quotient_high_binary_limbs);
437 tmp_19 *= lagrange_even_in_minicircuit;
438 tmp_19 *= scaling_factor;
439 std::get<18>(accumulators) += tmp_19;
440 // Contribution 20 , quotient highest limb decomposition
441 auto tmp_20 = ((quotient_high_limbs_range_constraint_0_shift +
442 quotient_high_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
443 quotient_high_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
444 quotient_high_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3) -
445 quotient_high_binary_limbs_shift);
446 tmp_20 *= lagrange_even_in_minicircuit;
447 tmp_20 *= scaling_factor;
448 std::get<19>(accumulators) += tmp_20;
449
450 // Contribution 21 , decomposition of the low wide relation limb used for the bigfield relation.
451 // N.B. top microlimbs of relation wide limbs are stored in microlimbs for range constraints of P_x, P_y,
452 // accumulator and quotient. This is to save space and because these microlimbs are not used by their namesakes,
453 // since top limbs in 254/6-bit values use one less microlimb for the top 50/52-bit limb
454 auto tmp_21 =
455 ((relation_wide_limbs_range_constraint_0 + relation_wide_limbs_range_constraint_1 * MICRO_LIMB_SHIFT +
456 relation_wide_limbs_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
457 relation_wide_limbs_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
458 p_x_high_limbs_range_constraint_tail_shift * MICRO_LIMB_SHIFTx4 +
459 accumulator_high_limbs_range_constraint_tail_shift * MICRO_LIMB_SHIFTx5) -
460 relation_wide_limbs);
461 tmp_21 *= lagrange_even_in_minicircuit;
462 tmp_21 *= scaling_factor;
463 std::get<20>(accumulators) += tmp_21;
464
465 // Contribution 22 , decomposition of high relation limb
466 auto tmp_22 = ((relation_wide_limbs_range_constraint_0_shift +
467 relation_wide_limbs_range_constraint_1_shift * MICRO_LIMB_SHIFT +
468 relation_wide_limbs_range_constraint_2_shift * MICRO_LIMB_SHIFTx2 +
469 relation_wide_limbs_range_constraint_3_shift * MICRO_LIMB_SHIFTx3 +
470 p_y_high_limbs_range_constraint_tail_shift * MICRO_LIMB_SHIFTx4 +
471 quotient_high_limbs_range_constraint_tail_shift * MICRO_LIMB_SHIFTx5) -
472 relation_wide_limbs_shift);
473 tmp_22 *= lagrange_even_in_minicircuit;
474 tmp_22 *= scaling_factor;
475 std::get<21>(accumulators) += tmp_22;
476
477 // Contributions enfocing a reduced range constraint on high limbs (these relation force the last microlimb in
478 // each limb to be more severely range constrained)
479
480 // Contribution 23, range constrain the highest microlimb of lowest P.x limb to be 12 bits (68 % 14 = 12)
481 auto tmp_23 = p_x_low_limbs_range_constraint_4 * SHIFT_12_TO_14 - p_x_low_limbs_range_constraint_tail;
482 tmp_23 *= lagrange_even_in_minicircuit;
483 tmp_23 *= scaling_factor;
484 std::get<22>(accumulators) += tmp_23;
485
486 // Contribution 24, range constrain the highest microlimb of second lowest P.x limb to be 12 bits
487 auto tmp_24 =
488 p_x_low_limbs_range_constraint_4_shift * SHIFT_12_TO_14 - p_x_low_limbs_range_constraint_tail_shift;
489 tmp_24 *= lagrange_even_in_minicircuit;
490 tmp_24 *= scaling_factor;
491 std::get<23>(accumulators) += tmp_24;
492
493 // Contribution 25, range constrain the highest microlimb of second highest P.x limb to be 12 bits
494 auto tmp_25 = p_x_high_limbs_range_constraint_4 * SHIFT_12_TO_14 - p_x_high_limbs_range_constraint_tail;
495 tmp_25 *= lagrange_even_in_minicircuit;
496 tmp_25 *= scaling_factor;
497 std::get<24>(accumulators) += tmp_25;
498
499 // Contribution 26, range constrain the highest microilmb of highest P.x limb to be 8 bits (50 % 14 = 8)
500 auto tmp_26 =
501 (p_x_high_limbs_range_constraint_3_shift * SHIFT_8_TO_14 - p_x_high_limbs_range_constraint_4_shift);
502
503 tmp_26 *= lagrange_even_in_minicircuit;
504 tmp_26 *= scaling_factor;
505 std::get<25>(accumulators) += tmp_26;
506
507 // Contribution 27, range constrain the highest microlimb of lowest P.y limb to be 12 bits (68 % 14 = 12)
508 auto tmp_27 = p_y_low_limbs_range_constraint_4 * SHIFT_12_TO_14 - p_y_low_limbs_range_constraint_tail;
509 tmp_27 *= lagrange_even_in_minicircuit;
510 tmp_27 *= scaling_factor;
511 std::get<26>(accumulators) += tmp_27;
512
513 // Contribution 28, range constrain the highest microlimb of second lowest P.y limb to be 12 bits (68 % 14 = 12)
514 auto tmp_28 =
515 p_y_low_limbs_range_constraint_4_shift * SHIFT_12_TO_14 - p_y_low_limbs_range_constraint_tail_shift;
516 tmp_28 *= lagrange_even_in_minicircuit;
517 tmp_28 *= scaling_factor;
518 std::get<27>(accumulators) += tmp_28;
519
520 // Contribution 29, range constrain the highest microlimb of second highest P.y limb to be 12 bits (68 % 14 =
521 // 12)
522 auto tmp_29 = p_y_high_limbs_range_constraint_4 * SHIFT_12_TO_14 - p_y_high_limbs_range_constraint_tail;
523 tmp_29 *= lagrange_even_in_minicircuit;
524 tmp_29 *= scaling_factor;
525 std::get<28>(accumulators) += tmp_29;
526
527 // Contribution 30, range constrain the highest microlimb of highest P.y limb to be 8 bits (50 % 14 = 8)
528 auto tmp_30 =
529 (p_y_high_limbs_range_constraint_3_shift * SHIFT_8_TO_14 - p_y_high_limbs_range_constraint_4_shift);
530
531 tmp_30 *= lagrange_even_in_minicircuit;
532 tmp_30 *= scaling_factor;
533 std::get<29>(accumulators) += tmp_30;
534
535 // Contribution 31, range constrain the highest microlimb of low z1 limb to be 12 bits (68 % 14 = 12)
536 auto tmp_31 = (z_low_limbs_range_constraint_4 * SHIFT_12_TO_14 - z_low_limbs_range_constraint_tail);
537 tmp_31 *= lagrange_even_in_minicircuit;
538 tmp_31 *= scaling_factor;
539 std::get<30>(accumulators) += tmp_31;
540
541 // Contribution 32, range constrain the highest microlimb of low z2 limb to be 12 bits (68 % 14 = 12)
542 auto tmp_32 = (z_low_limbs_range_constraint_4_shift * SHIFT_12_TO_14 - z_low_limbs_range_constraint_tail_shift);
543 tmp_32 *= lagrange_even_in_minicircuit;
544 tmp_32 *= scaling_factor;
545 std::get<31>(accumulators) += tmp_32;
546
547 // Contribution 33, range constrain the highest microlimb of high z1 limb to be 4 bits (60 % 14 = 12)
548 auto tmp_33 = (z_high_limbs_range_constraint_4 * SHIFT_4_TO_14 - z_high_limbs_range_constraint_tail);
549 tmp_33 *= lagrange_even_in_minicircuit;
550 tmp_33 *= scaling_factor;
551 std::get<32>(accumulators) += tmp_33;
552
553 // Contribution 34, range constrain the highest microlimb of high z2 limb to be 4 bits (60 % 14 = 12)
554 auto tmp_34 =
555 (z_high_limbs_range_constraint_4_shift * SHIFT_4_TO_14 - z_high_limbs_range_constraint_tail_shift);
556 tmp_34 *= lagrange_even_in_minicircuit;
557 tmp_34 *= scaling_factor;
558 std::get<33>(accumulators) += tmp_34;
559
560 // Contribution 35, range constrain the highest microlimb of lowest current accumulator limb to be 12 bits (68 %
561 // 14 = 12)
562 auto tmp_35 =
563 (accumulator_low_limbs_range_constraint_4 * SHIFT_12_TO_14 - accumulator_low_limbs_range_constraint_tail);
564 tmp_35 *= lagrange_even_in_minicircuit;
565 tmp_35 *= scaling_factor;
566 std::get<34>(accumulators) += tmp_35;
567
568 // Contribution 36, range constrain the highest microlimb of second lowest current accumulator limb to be 12
569 // bits (68 % 14 = 12)
570 auto tmp_36 = (accumulator_low_limbs_range_constraint_4_shift * SHIFT_12_TO_14 -
571 accumulator_low_limbs_range_constraint_tail_shift);
572 tmp_36 *= lagrange_even_in_minicircuit;
573 tmp_36 *= scaling_factor;
574 std::get<35>(accumulators) += tmp_36;
575
576 // Contribution 37, range constrain the highest microlimb of second highest current accumulator limb to be 12
577 // bits (68 % 14 = 12)
578 auto tmp_37 =
579 (accumulator_high_limbs_range_constraint_4 * SHIFT_12_TO_14 - accumulator_high_limbs_range_constraint_tail);
580 tmp_37 *= lagrange_even_in_minicircuit;
581 tmp_37 *= scaling_factor;
582 std::get<36>(accumulators) += tmp_37;
583
584 // Contribution 38, range constrain the highest microlimb of highest current accumulator limb to be 8 bits (50 %
585 // 14 = 12)
586 auto tmp_38 = (accumulator_high_limbs_range_constraint_3_shift * SHIFT_8_TO_14 -
587 accumulator_high_limbs_range_constraint_4_shift);
588 tmp_38 *= lagrange_even_in_minicircuit;
589 tmp_38 *= scaling_factor;
590 std::get<37>(accumulators) += tmp_38;
591
592 // Contribution 39, range constrain the highest microlimb of lowest quotient limb to be 12 bits (68 % 14 = 12)
593 auto tmp_39 =
594 (quotient_low_limbs_range_constraint_4 * SHIFT_12_TO_14 - quotient_low_limbs_range_constraint_tail);
595 tmp_39 *= lagrange_even_in_minicircuit;
596 tmp_39 *= scaling_factor;
597 std::get<38>(accumulators) += tmp_39;
598
599 // Contribution 40, range constrain the highest microlimb of second lowest quotient limb to be 12 bits (68 % 14
600 // = 12)
601 auto tmp_40 = (quotient_low_limbs_range_constraint_4_shift * SHIFT_12_TO_14 -
602 quotient_low_limbs_range_constraint_tail_shift);
603 tmp_40 *= lagrange_even_in_minicircuit;
604 tmp_40 *= scaling_factor;
605 std::get<39>(accumulators) += tmp_40;
606
607 // Contribution 41, range constrain the highest microlimb of second highest quotient limb to be 12 bits (68 % 14
608 // = 12)
609 auto tmp_41 =
610 (quotient_high_limbs_range_constraint_4 * SHIFT_12_TO_14 - quotient_high_limbs_range_constraint_tail);
611 tmp_41 *= lagrange_even_in_minicircuit;
612 tmp_41 *= scaling_factor;
613 std::get<40>(accumulators) += tmp_41;
614
615 // Contribution 42, range constrain the highest microlimb of highest quotient limb to be 10 bits (52 % 14 = 12)
616 auto tmp_42 = (quotient_high_limbs_range_constraint_3_shift * SHIFT_10_TO_14 -
617 quotient_high_limbs_range_constraint_4_shift);
618 tmp_42 *= lagrange_even_in_minicircuit;
619 tmp_42 *= scaling_factor;
620 std::get<41>(accumulators) += tmp_42;
621
622 // Contributions where we decompose initial EccOpQueue values into 68-bit limbs
623
624 // Contribution 43, decompose x_lo
625 auto tmp_43 = (p_x_low_limbs + p_x_low_limbs_shift * LIMB_SHIFT) - x_lo_y_hi;
626 tmp_43 *= lagrange_even_in_minicircuit;
627 tmp_43 *= scaling_factor;
628 std::get<42>(accumulators) += tmp_43;
629
630 // Contribution 44, decompose x_hi
631 auto tmp_44 = (p_x_high_limbs + p_x_high_limbs_shift * LIMB_SHIFT) - x_hi_z_1;
632 tmp_44 *= lagrange_even_in_minicircuit;
633 tmp_44 *= scaling_factor;
634 std::get<43>(accumulators) += tmp_44;
635 // Contribution 45, decompose y_lo
636 auto tmp_45 = (p_y_low_limbs + p_y_low_limbs_shift * LIMB_SHIFT) - y_lo_z_2;
637 tmp_45 *= lagrange_even_in_minicircuit;
638 tmp_45 *= scaling_factor;
639 std::get<44>(accumulators) += tmp_45;
640
641 // Contribution 46, decompose y_hi
642 auto tmp_46 = (p_y_high_limbs + p_y_high_limbs_shift * LIMB_SHIFT) - x_lo_y_hi_shift;
643 tmp_46 *= lagrange_even_in_minicircuit;
644 tmp_46 *= scaling_factor;
645 std::get<45>(accumulators) += tmp_46;
646
647 // Contribution 47, decompose z1
648 auto tmp_47 = (z_low_limbs + z_high_limbs * LIMB_SHIFT) - x_hi_z_1_shift;
649 tmp_47 *= lagrange_even_in_minicircuit;
650 tmp_47 *= scaling_factor;
651 std::get<46>(accumulators) += tmp_47;
652
653 // Contribution 48, decompose z2
654 auto tmp_48 = (z_low_limbs_shift + z_high_limbs_shift * LIMB_SHIFT) - y_lo_z_2_shift;
655 tmp_48 *= lagrange_even_in_minicircuit;
656 tmp_48 *= scaling_factor;
657 std::get<47>(accumulators) += tmp_48;
658 }();
659};
660} // namespace bb
static void accumulate(ContainerOverSubrelations &accumulators, const AllEntities &in, const Parameters &, const FF &scaling_factor)
Expression for decomposition of various values into smaller limbs or microlimbs.
Entry point for Barretenberg command-line interface.
typename Flavor::FF FF
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13