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: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
9
10namespace bb {
11
32template <typename FF>
33template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
34void TranslatorDecompositionRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulators,
35 const AllEntities& in,
36 const Parameters&,
37 const FF& scaling_factor)
38{
39 static constexpr size_t NUM_LIMB_BITS = 68; // Number of bits in a standard limb used for bigfield operations
40 static constexpr size_t NUM_MICRO_LIMB_BITS = 14; // Number of bits in a standard limb used for bigfield operations
41
42 // Values to multiply an element by to perform an appropriate shift
43 const auto MICRO_LIMB_SHIFT = FF(uint256_t(1) << NUM_MICRO_LIMB_BITS);
44 const auto MICRO_LIMB_SHIFTx2 = MICRO_LIMB_SHIFT * MICRO_LIMB_SHIFT;
45 const auto MICRO_LIMB_SHIFTx3 = MICRO_LIMB_SHIFTx2 * MICRO_LIMB_SHIFT;
46 const auto MICRO_LIMB_SHIFTx4 = MICRO_LIMB_SHIFTx3 * MICRO_LIMB_SHIFT;
47 const auto MICRO_LIMB_SHIFTx5 = MICRO_LIMB_SHIFTx4 * MICRO_LIMB_SHIFT;
48
49 [&]() {
50 // Within the no-op range i.e. when the op polynomial is 0 at even index the 2 Translator trace rows are empty
51 // except for the accumulator binary limbs which get transferred across the no-op range
53 using View = typename Accumulator::View;
54
55 // A = (A₃ || A₂ || A₁ || A₀)
56 auto accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
57 auto accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
58 auto accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
59 auto accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
60
61 // A₀ = (A₀,₄ || A₀,₃ || A₀,₂ || A₀,₁ || A₀,₀) (68-bit limb)
62 auto accumulator_limb_0_range_constraint_0 = View(in.accumulator_low_limbs_range_constraint_0);
63 auto accumulator_limb_0_range_constraint_1 = View(in.accumulator_low_limbs_range_constraint_1);
64 auto accumulator_limb_0_range_constraint_2 = View(in.accumulator_low_limbs_range_constraint_2);
65 auto accumulator_limb_0_range_constraint_3 = View(in.accumulator_low_limbs_range_constraint_3);
66 auto accumulator_limb_0_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4);
67
68 // A₁ = (A₁,₄ || A₁,₃ || A₁,₂ || A₁,₁ || A₁,₀) (68-bit limb)
69 auto accumulator_limb_1_range_constraint_0 = View(in.accumulator_low_limbs_range_constraint_0_shift);
70 auto accumulator_limb_1_range_constraint_1 = View(in.accumulator_low_limbs_range_constraint_1_shift);
71 auto accumulator_limb_1_range_constraint_2 = View(in.accumulator_low_limbs_range_constraint_2_shift);
72 auto accumulator_limb_1_range_constraint_3 = View(in.accumulator_low_limbs_range_constraint_3_shift);
73 auto accumulator_limb_1_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4_shift);
74
75 // A₂ = (A₂,₄ || A₂,₃ || A₂,₂ || A₂,₁ || A₂,₀) (68-bit limb)
76 auto accumulator_limb_2_range_constraint_0 = View(in.accumulator_high_limbs_range_constraint_0);
77 auto accumulator_limb_2_range_constraint_1 = View(in.accumulator_high_limbs_range_constraint_1);
78 auto accumulator_limb_2_range_constraint_2 = View(in.accumulator_high_limbs_range_constraint_2);
79 auto accumulator_limb_2_range_constraint_3 = View(in.accumulator_high_limbs_range_constraint_3);
80 auto accumulator_limb_2_range_constraint_4 = View(in.accumulator_high_limbs_range_constraint_4);
81
82 // A₃ = (A₃,₃ || A₃,₂ || A₃,₁ || A₃,₀) (50-bit limb)
83 auto accumulator_limb_3_range_constraint_0 = View(in.accumulator_high_limbs_range_constraint_0_shift);
84 auto accumulator_limb_3_range_constraint_1 = View(in.accumulator_high_limbs_range_constraint_1_shift);
85 auto accumulator_limb_3_range_constraint_2 = View(in.accumulator_high_limbs_range_constraint_2_shift);
86 auto accumulator_limb_3_range_constraint_3 = View(in.accumulator_high_limbs_range_constraint_3_shift);
87
88 auto op = View(in.op);
89 auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
90 auto not_even_or_no_op_scaled = lagrange_even_in_minicircuit * op * scaling_factor;
91
92 // Contribution 1, accumulator lowest limb decomposition
93 // clang-format off
94 auto tmp_1 =
95 ((accumulator_limb_0_range_constraint_0 +
96 accumulator_limb_0_range_constraint_1 * MICRO_LIMB_SHIFT +
97 accumulator_limb_0_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
98 accumulator_limb_0_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
99 accumulator_limb_0_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
100 accumulators_binary_limbs_0);
101 tmp_1 *= not_even_or_no_op_scaled;
102 std::get<0>(accumulators) += tmp_1;
103
104 // Contribution 2, accumulator second limb decomposition
105 auto tmp_2 =
106 ((accumulator_limb_1_range_constraint_0 +
107 accumulator_limb_1_range_constraint_1 * MICRO_LIMB_SHIFT +
108 accumulator_limb_1_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
109 accumulator_limb_1_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
110 accumulator_limb_1_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
111 accumulators_binary_limbs_1);
112 tmp_2 *= not_even_or_no_op_scaled;
113 std::get<1>(accumulators) += tmp_2;
114
115 // Contribution 3, accumulator second highest limb decomposition
116 auto tmp_3 =
117 ((accumulator_limb_2_range_constraint_0 +
118 accumulator_limb_2_range_constraint_1 * MICRO_LIMB_SHIFT +
119 accumulator_limb_2_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
120 accumulator_limb_2_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
121 accumulator_limb_2_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
122 accumulators_binary_limbs_2);
123 tmp_3 *= not_even_or_no_op_scaled;
124 std::get<2>(accumulators) += tmp_3;
125
126 // Contribution 4, accumulator highest limb decomposition
127 auto tmp_4 =
128 ((accumulator_limb_3_range_constraint_0 +
129 accumulator_limb_3_range_constraint_1 * MICRO_LIMB_SHIFT +
130 accumulator_limb_3_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
131 accumulator_limb_3_range_constraint_3 * MICRO_LIMB_SHIFTx3) -
132 accumulators_binary_limbs_3);
133 tmp_4 *= not_even_or_no_op_scaled;
134 std::get<3>(accumulators) += tmp_4;
135 // clang-format on
136 }();
137
138 [&]() {
140 using View = typename Accumulator::View;
141
142 // Value to multiply an element by to perform an appropriate shift
143 const auto LIMB_SHIFT = FF(uint256_t(1) << NUM_LIMB_BITS);
144
145 // Top limbs of accumulator
146 // [A₀,₄, A₁,₄, A₂,₄] (these are 50-bit limbs)
147 auto accumulator_limb_0_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4);
148 auto accumulator_limb_1_range_constraint_4 = View(in.accumulator_low_limbs_range_constraint_4_shift);
149 auto accumulator_limb_2_range_constraint_4 = View(in.accumulator_high_limbs_range_constraint_4);
150
151 // Shifts used to constrain ranges further
152 // Lets create a table in comments with columns No of bits in limb, last microlimb bits, shift used
153 // ┌───────────┬─────────────────────┬─────────────────┐
154 // │ Limb bits │ Last microlimb bits │ Shift │
155 // ├───────────┼─────────────────────┼─────────────────┤
156 // │ 68 │ 12 │ 4 (2¹⁴⁻¹²) │
157 // │ 52 │ 10 │ 16 (2¹⁴⁻¹⁰) │
158 // │ 50 │ 8 │ 64 (2¹⁴⁻⁸) │
159 // │ 60 │ 4 │ 1024 (2¹⁴⁻⁴) │
160 // └───────────┴─────────────────────┴─────────────────┘
161 static const auto SHIFT_12_TO_14 = FF(4);
162 static const auto SHIFT_10_TO_14 = FF(16);
163 static const auto SHIFT_8_TO_14 = FF(64);
164 static const auto SHIFT_4_TO_14 = FF(1024);
165
166 // Basic notation:
167 //
168 // Pₓ = (Pₓ,₃ || Pₓ,₂ || Pₓ,₁ || Pₓ,₀)
169 // Pᵧ = (Pᵧ,₃ || Pᵧ,₂ || Pᵧ,₁ || Pᵧ,₀)
170 // z₁ = (z₁,₁ || z₁,₀)
171 // z₂ = (z₂,₁ || z₂,₀)
172 // Q = (q₃ || q₂ || q₁ || q₀)
173 //
174 // Each of these is further decomposed into 14-bit microlimbs as follows:
175 //
176 // Pₓ,₀ = (Pₓ,₀[4] || Pₓ,₀[3] || Pₓ,₀[2] || Pₓ,₀[1] || Pₓ,₀[0])
177 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
178 auto p_x_limb_0 = View(in.p_x_low_limbs);
179 auto p_x_limb_0_range_constraint_0 = View(in.p_x_low_limbs_range_constraint_0);
180 auto p_x_limb_0_range_constraint_1 = View(in.p_x_low_limbs_range_constraint_1);
181 auto p_x_limb_0_range_constraint_2 = View(in.p_x_low_limbs_range_constraint_2);
182 auto p_x_limb_0_range_constraint_3 = View(in.p_x_low_limbs_range_constraint_3);
183 auto p_x_limb_0_range_constraint_4 = View(in.p_x_low_limbs_range_constraint_4);
184
185 // Pₓ,₁ = (Pₓ,₁[4] || Pₓ,₁[3] || Pₓ,₁[2] || Pₓ,₁[1] || Pₓ,₁[0])
186 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
187 auto p_x_limb_1 = View(in.p_x_low_limbs_shift);
188 auto p_x_limb_1_range_constraint_0 = View(in.p_x_low_limbs_range_constraint_0_shift);
189 auto p_x_limb_1_range_constraint_1 = View(in.p_x_low_limbs_range_constraint_1_shift);
190 auto p_x_limb_1_range_constraint_2 = View(in.p_x_low_limbs_range_constraint_2_shift);
191 auto p_x_limb_1_range_constraint_3 = View(in.p_x_low_limbs_range_constraint_3_shift);
192 auto p_x_limb_1_range_constraint_4 = View(in.p_x_low_limbs_range_constraint_4_shift);
193
194 // Pₓ,₂ = (Pₓ,₂[4] || Pₓ,₂[3] || Pₓ,₂[2] || Pₓ,₂[1] || Pₓ,₂[0])
195 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
196 auto p_x_limb_2 = View(in.p_x_high_limbs);
197 auto p_x_limb_2_range_constraint_0 = View(in.p_x_high_limbs_range_constraint_0);
198 auto p_x_limb_2_range_constraint_1 = View(in.p_x_high_limbs_range_constraint_1);
199 auto p_x_limb_2_range_constraint_2 = View(in.p_x_high_limbs_range_constraint_2);
200 auto p_x_limb_2_range_constraint_3 = View(in.p_x_high_limbs_range_constraint_3);
201 auto p_x_limb_2_range_constraint_4 = View(in.p_x_high_limbs_range_constraint_4);
202
203 // Pₓ,₃ = (Pₓ,₃[3] || Pₓ,₃[2] || Pₓ,₃[1] || Pₓ,₃[0])
204 // (08 bits || 14 bits || 14 bits || 14 bits)
205 auto p_x_limb_3 = View(in.p_x_high_limbs_shift);
206 auto p_x_limb_3_range_constraint_0 = View(in.p_x_high_limbs_range_constraint_0_shift);
207 auto p_x_limb_3_range_constraint_1 = View(in.p_x_high_limbs_range_constraint_1_shift);
208 auto p_x_limb_3_range_constraint_2 = View(in.p_x_high_limbs_range_constraint_2_shift);
209 auto p_x_limb_3_range_constraint_3 = View(in.p_x_high_limbs_range_constraint_3_shift);
210
211 // Pᵧ,₀ = (Pᵧ,₀[4] || Pᵧ,₀[3] || Pᵧ,₀[2] || Pᵧ,₀[1] || Pᵧ,₀[0])
212 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
213 auto p_y_limb_0 = View(in.p_y_low_limbs);
214 auto p_y_limb_0_range_constraint_0 = View(in.p_y_low_limbs_range_constraint_0);
215 auto p_y_limb_0_range_constraint_1 = View(in.p_y_low_limbs_range_constraint_1);
216 auto p_y_limb_0_range_constraint_2 = View(in.p_y_low_limbs_range_constraint_2);
217 auto p_y_limb_0_range_constraint_3 = View(in.p_y_low_limbs_range_constraint_3);
218 auto p_y_limb_0_range_constraint_4 = View(in.p_y_low_limbs_range_constraint_4);
219
220 // Pᵧ,₁ = (Pᵧ,₁[4] || Pᵧ,₁[3] || Pᵧ,₁[2] || Pᵧ,₁[1] || Pᵧ,₁[0])
221 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
222 auto p_y_limb_1 = View(in.p_y_low_limbs_shift);
223 auto p_y_limb_1_range_constraint_0 = View(in.p_y_low_limbs_range_constraint_0_shift);
224 auto p_y_limb_1_range_constraint_1 = View(in.p_y_low_limbs_range_constraint_1_shift);
225 auto p_y_limb_1_range_constraint_2 = View(in.p_y_low_limbs_range_constraint_2_shift);
226 auto p_y_limb_1_range_constraint_3 = View(in.p_y_low_limbs_range_constraint_3_shift);
227 auto p_y_limb_1_range_constraint_4 = View(in.p_y_low_limbs_range_constraint_4_shift);
228
229 // Pᵧ,₂ = (Pᵧ,₂[4] || Pᵧ,₂[3] || Pᵧ,₂[2] || Pᵧ,₂[1] || Pᵧ,₂[0])
230 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
231 auto p_y_limb_2 = View(in.p_y_high_limbs);
232 auto p_y_limb_2_range_constraint_0 = View(in.p_y_high_limbs_range_constraint_0);
233 auto p_y_limb_2_range_constraint_1 = View(in.p_y_high_limbs_range_constraint_1);
234 auto p_y_limb_2_range_constraint_2 = View(in.p_y_high_limbs_range_constraint_2);
235 auto p_y_limb_2_range_constraint_3 = View(in.p_y_high_limbs_range_constraint_3);
236 auto p_y_limb_2_range_constraint_4 = View(in.p_y_high_limbs_range_constraint_4);
237
238 // Pᵧ,₃ = (Pᵧ,₃[3] || Pᵧ,₃[2] || Pᵧ,₃[1] || Pᵧ,₃[0])
239 // (08 bits || 14 bits || 14 bits || 14 bits)
240 auto p_y_limb_3 = View(in.p_y_high_limbs_shift);
241 auto p_y_limb_3_range_constraint_0 = View(in.p_y_high_limbs_range_constraint_0_shift);
242 auto p_y_limb_3_range_constraint_1 = View(in.p_y_high_limbs_range_constraint_1_shift);
243 auto p_y_limb_3_range_constraint_2 = View(in.p_y_high_limbs_range_constraint_2_shift);
244 auto p_y_limb_3_range_constraint_3 = View(in.p_y_high_limbs_range_constraint_3_shift);
245
246 // z₁,₀ = (z₁,₀[4] || z₁,₀[3] || z₁,₀[2] || z₁,₀[1] || z₁,₀[0])
247 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
248 auto z_first_limb_0 = View(in.z_low_limbs);
249 auto z_first_limb_0_range_constraint_0 = View(in.z_low_limbs_range_constraint_0);
250 auto z_first_limb_0_range_constraint_1 = View(in.z_low_limbs_range_constraint_1);
251 auto z_first_limb_0_range_constraint_2 = View(in.z_low_limbs_range_constraint_2);
252 auto z_first_limb_0_range_constraint_3 = View(in.z_low_limbs_range_constraint_3);
253 auto z_first_limb_0_range_constraint_4 = View(in.z_low_limbs_range_constraint_4);
254
255 // z₂,₀ = (z₂,₀[4] || z₂,₀[3] || z₂,₀[2] || z₂,₀[1] || z₂,₀[0])
256 // (12 bits || 14 bits || 14 bits || 14 bits || 14 bits)
257 auto z_second_limb_0 = View(in.z_low_limbs_shift);
258 auto z_second_limb_0_range_constraint_0 = View(in.z_low_limbs_range_constraint_0_shift);
259 auto z_second_limb_0_range_constraint_1 = View(in.z_low_limbs_range_constraint_1_shift);
260 auto z_second_limb_0_range_constraint_2 = View(in.z_low_limbs_range_constraint_2_shift);
261 auto z_second_limb_0_range_constraint_3 = View(in.z_low_limbs_range_constraint_3_shift);
262 auto z_second_limb_0_range_constraint_4 = View(in.z_low_limbs_range_constraint_4_shift);
263
264 // z₁,₁ = (z₁,₁[4] || z₁,₁[3] || z₁,₁[2] || z₁,₁[1] || z₁,₁[0])
265 // (04 bits || 14 bits || 14 bits || 14 bits || 14 bits)
266 auto z_first_limb_1 = View(in.z_high_limbs);
267 auto z_first_limb_1_range_constraint_0 = View(in.z_high_limbs_range_constraint_0);
268 auto z_first_limb_1_range_constraint_1 = View(in.z_high_limbs_range_constraint_1);
269 auto z_first_limb_1_range_constraint_2 = View(in.z_high_limbs_range_constraint_2);
270 auto z_first_limb_1_range_constraint_3 = View(in.z_high_limbs_range_constraint_3);
271 auto z_first_limb_1_range_constraint_4 = View(in.z_high_limbs_range_constraint_4);
272
273 // z₂,₁ = (z₂,₁[4] || z₂,₁[3] || z₂,₁[2] || z₂,₁[1] || z₂,₁[0])
274 // (04 bits || 14 bits || 14 bits || 14 bits || 14 bits)
275 auto z_second_limb_1 = View(in.z_high_limbs_shift);
276 auto z_second_limb_1_range_constraint_0 = View(in.z_high_limbs_range_constraint_0_shift);
277 auto z_second_limb_1_range_constraint_1 = View(in.z_high_limbs_range_constraint_1_shift);
278 auto z_second_limb_1_range_constraint_2 = View(in.z_high_limbs_range_constraint_2_shift);
279 auto z_second_limb_1_range_constraint_3 = View(in.z_high_limbs_range_constraint_3_shift);
280 auto z_second_limb_1_range_constraint_4 = View(in.z_high_limbs_range_constraint_4_shift);
281
282 // Q₀ = (Q₀[4] || Q₀[3] || Q₀[2] || Q₀[1] || Q₀[0])
283 // (12 || 14 || 14 || 14 || 14 )
284 auto quotient_binary_limbs_0 = View(in.quotient_low_binary_limbs);
285 auto quotient_limb_0_range_constraint_0 = View(in.quotient_low_limbs_range_constraint_0);
286 auto quotient_limb_0_range_constraint_1 = View(in.quotient_low_limbs_range_constraint_1);
287 auto quotient_limb_0_range_constraint_2 = View(in.quotient_low_limbs_range_constraint_2);
288 auto quotient_limb_0_range_constraint_3 = View(in.quotient_low_limbs_range_constraint_3);
289 auto quotient_limb_0_range_constraint_4 = View(in.quotient_low_limbs_range_constraint_4);
290
291 // Q₁ = (Q₁[4] || Q₁[3] || Q₁[2] || Q₁[1] || Q₁[0])
292 // (12 || 14 || 14 || 14 || 14 )
293 auto quotient_binary_limbs_1 = View(in.quotient_low_binary_limbs_shift);
294 auto quotient_limb_1_range_constraint_0 = View(in.quotient_low_limbs_range_constraint_0_shift);
295 auto quotient_limb_1_range_constraint_1 = View(in.quotient_low_limbs_range_constraint_1_shift);
296 auto quotient_limb_1_range_constraint_2 = View(in.quotient_low_limbs_range_constraint_2_shift);
297 auto quotient_limb_1_range_constraint_3 = View(in.quotient_low_limbs_range_constraint_3_shift);
298 auto quotient_limb_1_range_constraint_4 = View(in.quotient_low_limbs_range_constraint_4_shift);
299
300 // Q₂ = (Q₂[4] || Q₂[3] || Q₂[2] || Q₂[1] || Q₂[0])
301 // (12 || 14 || 14 || 14 || 14 )
302 auto quotient_binary_limbs_2 = View(in.quotient_high_binary_limbs);
303 auto quotient_limb_2_range_constraint_0 = View(in.quotient_high_limbs_range_constraint_0);
304 auto quotient_limb_2_range_constraint_1 = View(in.quotient_high_limbs_range_constraint_1);
305 auto quotient_limb_2_range_constraint_2 = View(in.quotient_high_limbs_range_constraint_2);
306 auto quotient_limb_2_range_constraint_3 = View(in.quotient_high_limbs_range_constraint_3);
307 auto quotient_limb_2_range_constraint_4 = View(in.quotient_high_limbs_range_constraint_4);
308
309 // Q₃ = (Q₃[3] || Q₃[2] || Q₃[1] || Q₃[0])
310 // (10 || 14 || 14 || 14 )
311 auto quotient_binary_limbs_3 = View(in.quotient_high_binary_limbs_shift);
312 auto quotient_limb_3_range_constraint_0 = View(in.quotient_high_limbs_range_constraint_0_shift);
313 auto quotient_limb_3_range_constraint_1 = View(in.quotient_high_limbs_range_constraint_1_shift);
314 auto quotient_limb_3_range_constraint_2 = View(in.quotient_high_limbs_range_constraint_2_shift);
315 auto quotient_limb_3_range_constraint_3 = View(in.quotient_high_limbs_range_constraint_3_shift);
316
317 // Carry limbs: relation_wide_limbs_lo (84 bits) (all limbs are 14 bits)
318 // cₗₒ = (cₗₒ[5] || cₗₒ[4] || cₗₒ[3] || cₗₒ[2] || cₗₒ[1] || cₗₒ[0])
319 auto relation_wide_limbs_lo = View(in.relation_wide_limbs);
320 auto relation_wide_limbs_lo_range_constraint_0 = View(in.relation_wide_limbs_range_constraint_0);
321 auto relation_wide_limbs_lo_range_constraint_1 = View(in.relation_wide_limbs_range_constraint_1);
322 auto relation_wide_limbs_lo_range_constraint_2 = View(in.relation_wide_limbs_range_constraint_2);
323 auto relation_wide_limbs_lo_range_constraint_3 = View(in.relation_wide_limbs_range_constraint_3);
324
325 // The final two limbs of cₗₒ are stored in the unused tail columns of pₓ and accumulator.
326 auto relation_wide_limbs_lo_range_constraint_4 = View(in.p_x_high_limbs_range_constraint_tail_shift);
327 auto relation_wide_limbs_lo_range_constraint_5 = View(in.accumulator_high_limbs_range_constraint_tail_shift);
328
329 // Carry limbs: relation_wide_limbs_hi (84 bits) (all limbs are 14 bits)
330 // cₕᵢ = (cₕᵢ[5] || cₕᵢ[4] || cₕᵢ[3] || cₕᵢ[2] || cₕᵢ[1] || cₕᵢ[0])
331 auto relation_wide_limbs_hi = View(in.relation_wide_limbs_shift);
332 auto relation_wide_limbs_hi_range_constraint_0 = View(in.relation_wide_limbs_range_constraint_0_shift);
333 auto relation_wide_limbs_hi_range_constraint_1 = View(in.relation_wide_limbs_range_constraint_1_shift);
334 auto relation_wide_limbs_hi_range_constraint_2 = View(in.relation_wide_limbs_range_constraint_2_shift);
335 auto relation_wide_limbs_hi_range_constraint_3 = View(in.relation_wide_limbs_range_constraint_3_shift);
336
337 // The final two limbs of cₕᵢ are stored in the unused tail columns of pᵧ and quotient.
338 auto relation_wide_limbs_hi_range_constraint_4 = View(in.p_y_high_limbs_range_constraint_tail_shift);
339 auto relation_wide_limbs_hi_range_constraint_5 = View(in.quotient_high_limbs_range_constraint_tail_shift);
340
341 // Additional tail microlimbs for tighter range constraints
342 // ==> [Pₓ,₀[tail], Pₓ,₁[tail], Pₓ,₂[tail], Pₓ,₃[tail]]
343 auto p_x_limb_0_range_constraint_tail = View(in.p_x_low_limbs_range_constraint_tail);
344 auto p_x_limb_1_range_constraint_tail = View(in.p_x_low_limbs_range_constraint_tail_shift);
345 auto p_x_limb_2_range_constraint_tail = View(in.p_x_high_limbs_range_constraint_tail);
346
347 // Pₓ,₃[tail] is stored in the unused (odd) column of Pₓ,₃[4].
348 auto p_x_limb_3_range_constraint_tail = View(in.p_x_high_limbs_range_constraint_4_shift);
349
350 // ==> [Pᵧ,₀[tail], Pᵧ,₁[tail], Pᵧ,₂[tail], Pᵧ,₃[tail]]
351 auto p_y_limb_0_range_constraint_tail = View(in.p_y_low_limbs_range_constraint_tail);
352 auto p_y_limb_1_range_constraint_tail = View(in.p_y_low_limbs_range_constraint_tail_shift);
353 auto p_y_limb_2_range_constraint_tail = View(in.p_y_high_limbs_range_constraint_tail);
354
355 // Pᵧ,₃[tail] is stored in the unused (odd) column of Pᵧ,₃[4].
356 auto p_y_limb_3_range_constraint_tail = View(in.p_y_high_limbs_range_constraint_4_shift);
357
358 // ==> [z₁,₀[tail], z₂,₀[tail], z₁,₁[tail], z₂,₁[tail]]
359 auto z_first_limb_0_range_constraint_tail = View(in.z_low_limbs_range_constraint_tail);
360 auto z_second_limb_0_range_constraint_tail = View(in.z_low_limbs_range_constraint_tail_shift);
361 auto z_first_limb_1_range_constraint_tail = View(in.z_high_limbs_range_constraint_tail);
362 auto z_second_limb_1_range_constraint_tail = View(in.z_high_limbs_range_constraint_tail_shift);
363
364 // Accumulator and quotient tail microlimbs for tighter range constraints
365 // ==> [A₀[tail], A₁[tail], A₂[tail], A₃[tail]]
366 auto accumulator_limb_0_range_constraint_tail = View(in.accumulator_low_limbs_range_constraint_tail);
367 auto accumulator_limb_1_range_constraint_tail = View(in.accumulator_low_limbs_range_constraint_tail_shift);
368 auto accumulator_limb_2_range_constraint_tail = View(in.accumulator_high_limbs_range_constraint_tail);
369
370 // Fetch the highest microlimb of A₃ for range constraint
371 // To get A₃[tail]], we fetch the unused (odd) column of A₃[3].
372 auto accumulator_limb_3_range_constraint_3 = View(in.accumulator_high_limbs_range_constraint_3_shift);
373 auto accumulator_limb_3_range_constraint_tail = View(in.accumulator_high_limbs_range_constraint_4_shift);
374
375 // ==> [Q₀[tail], Q₁[tail], Q₂[tail], Q₃[tail]]
376 // To get Q₃[tail], we fetch the unused (odd) column of Q₃[3].
377 auto quotient_limb_0_range_constraint_tail = View(in.quotient_low_limbs_range_constraint_tail);
378 auto quotient_limb_1_range_constraint_tail = View(in.quotient_low_limbs_range_constraint_tail_shift);
379 auto quotient_limb_2_range_constraint_tail = View(in.quotient_high_limbs_range_constraint_tail);
380 auto quotient_limb_3_range_constraint_tail = View(in.quotient_high_limbs_range_constraint_4_shift);
381
382 // Coordinate decompositions
383 // first column: [x_lo, y_hi]
384 // second column: [x_hi, z_1]
385 // third column: [y_lo, z_2]
386 auto x_lo = View(in.x_lo_y_hi);
387 auto y_hi = View(in.x_lo_y_hi_shift);
388 auto x_hi = View(in.x_hi_z_1);
389 auto z_one = View(in.x_hi_z_1_shift);
390 auto y_lo = View(in.y_lo_z_2);
391 auto z_two = View(in.y_lo_z_2_shift);
392 auto lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
393
394 // clang-format off
395 // Contribution 5 , Pᵧ,₀ limb decomposition
396 auto tmp_5 =
397 ((p_y_limb_0_range_constraint_0 +
398 p_y_limb_0_range_constraint_1 * MICRO_LIMB_SHIFT +
399 p_y_limb_0_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
400 p_y_limb_0_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
401 p_y_limb_0_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
402 p_y_limb_0);
403 tmp_5 *= lagrange_even_in_minicircuit;
404 tmp_5 *= scaling_factor;
405 std::get<4>(accumulators) += tmp_5;
406
407 // Contribution 6 , Pᵧ,₁ limb decomposition
408 auto tmp_6 =
409 ((p_y_limb_1_range_constraint_0 +
410 p_y_limb_1_range_constraint_1 * MICRO_LIMB_SHIFT +
411 p_y_limb_1_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
412 p_y_limb_1_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
413 p_y_limb_1_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
414 p_y_limb_1);
415 tmp_6 *= lagrange_even_in_minicircuit;
416 tmp_6 *= scaling_factor;
417 std::get<5>(accumulators) += tmp_6;
418
419 // Contribution 7 , Pᵧ,₂ limb decomposition
420 auto tmp_7 =
421 ((p_y_limb_2_range_constraint_0 +
422 p_y_limb_2_range_constraint_1 * MICRO_LIMB_SHIFT +
423 p_y_limb_2_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
424 p_y_limb_2_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
425 p_y_limb_2_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
426 p_y_limb_2);
427 tmp_7 *= lagrange_even_in_minicircuit;
428 tmp_7 *= scaling_factor;
429 std::get<6>(accumulators) += tmp_7;
430
431 // Contribution 8 , Pᵧ,₃ limb decomposition
432 auto tmp_8 =
433 ((p_y_limb_3_range_constraint_0 +
434 p_y_limb_3_range_constraint_1 * MICRO_LIMB_SHIFT +
435 p_y_limb_3_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
436 p_y_limb_3_range_constraint_3 * MICRO_LIMB_SHIFTx3) -
437 p_y_limb_3);
438 tmp_8 *= lagrange_even_in_minicircuit;
439 tmp_8 *= scaling_factor;
440 std::get<7>(accumulators) += tmp_8;
441
442 // Contribution 9 , z₁,₀ limb decomposition
443 auto tmp_9 =
444 ((z_first_limb_0_range_constraint_0 +
445 z_first_limb_0_range_constraint_1 * MICRO_LIMB_SHIFT +
446 z_first_limb_0_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
447 z_first_limb_0_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
448 z_first_limb_0_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
449 z_first_limb_0);
450 tmp_9 *= lagrange_even_in_minicircuit;
451 tmp_9 *= scaling_factor;
452 std::get<8>(accumulators) += tmp_9;
453
454 // Contribution 10 , z₂,₀ limb decomposition
455 auto tmp_10 =
456 ((z_second_limb_0_range_constraint_0 +
457 z_second_limb_0_range_constraint_1 * MICRO_LIMB_SHIFT +
458 z_second_limb_0_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
459 z_second_limb_0_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
460 z_second_limb_0_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
461 z_second_limb_0);
462 tmp_10 *= lagrange_even_in_minicircuit;
463 tmp_10 *= scaling_factor;
464 std::get<9>(accumulators) += tmp_10;
465
466 // Contribution 11 , z₁,₁ limb decomposition
467 auto tmp_11 =
468 ((z_first_limb_1_range_constraint_0 +
469 z_first_limb_1_range_constraint_1 * MICRO_LIMB_SHIFT +
470 z_first_limb_1_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
471 z_first_limb_1_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
472 z_first_limb_1_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
473 z_first_limb_1);
474 tmp_11 *= lagrange_even_in_minicircuit;
475 tmp_11 *= scaling_factor;
476 std::get<10>(accumulators) += tmp_11;
477
478 // Contribution 12 , z₂,₁ limb decomposition
479 auto tmp_12 =
480 ((z_second_limb_1_range_constraint_0 +
481 z_second_limb_1_range_constraint_1 * MICRO_LIMB_SHIFT +
482 z_second_limb_1_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
483 z_second_limb_1_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
484 z_second_limb_1_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
485 z_second_limb_1);
486 tmp_12 *= lagrange_even_in_minicircuit;
487 tmp_12 *= scaling_factor;
488 std::get<11>(accumulators) += tmp_12;
489
490 // Contributions that decompose 50, 52, 68 or 84 bit limbs used for computation into range-constrained chunks
491 // Contribution 13, Pₓ,₀ limb decomposition
492 auto tmp_13 =
493 ((p_x_limb_0_range_constraint_0 +
494 p_x_limb_0_range_constraint_1 * MICRO_LIMB_SHIFT +
495 p_x_limb_0_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
496 p_x_limb_0_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
497 p_x_limb_0_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
498 p_x_limb_0);
499 tmp_13 *= lagrange_even_in_minicircuit;
500 tmp_13 *= scaling_factor;
501 std::get<12>(accumulators) += tmp_13;
502
503 // Contribution 14 , Pₓ,₁ limb decomposition
504 auto tmp_14 =
505 ((p_x_limb_1_range_constraint_0 +
506 p_x_limb_1_range_constraint_1 * MICRO_LIMB_SHIFT +
507 p_x_limb_1_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
508 p_x_limb_1_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
509 p_x_limb_1_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
510 p_x_limb_1);
511 tmp_14 *= lagrange_even_in_minicircuit;
512 tmp_14 *= scaling_factor;
513 std::get<13>(accumulators) += tmp_14;
514
515 // Contribution 15 , Pₓ,₂ limb decomposition
516 auto tmp_15 =
517 ((p_x_limb_2_range_constraint_0 +
518 p_x_limb_2_range_constraint_1 * MICRO_LIMB_SHIFT +
519 p_x_limb_2_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
520 p_x_limb_2_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
521 p_x_limb_2_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
522 p_x_limb_2);
523 tmp_15 *= lagrange_even_in_minicircuit;
524 tmp_15 *= scaling_factor;
525 std::get<14>(accumulators) += tmp_15;
526
527 // Contribution 16 , Pₓ,₃ limb decomposition
528 auto tmp_16 =
529 ((p_x_limb_3_range_constraint_0 +
530 p_x_limb_3_range_constraint_1 * MICRO_LIMB_SHIFT +
531 p_x_limb_3_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
532 p_x_limb_3_range_constraint_3 * MICRO_LIMB_SHIFTx3) -
533 p_x_limb_3);
534 tmp_16 *= lagrange_even_in_minicircuit;
535 tmp_16 *= scaling_factor;
536 std::get<15>(accumulators) += tmp_16;
537
538 // Contribution 17 , Q₀ limb decomposition
539 auto tmp_17 =
540 ((quotient_limb_0_range_constraint_0 +
541 quotient_limb_0_range_constraint_1 * MICRO_LIMB_SHIFT +
542 quotient_limb_0_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
543 quotient_limb_0_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
544 quotient_limb_0_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
545 quotient_binary_limbs_0);
546 tmp_17 *= lagrange_even_in_minicircuit;
547 tmp_17 *= scaling_factor;
548 std::get<16>(accumulators) += tmp_17;
549
550 // Contribution 18 , Q₁ limb decomposition
551 auto tmp_18 =
552 ((quotient_limb_1_range_constraint_0 +
553 quotient_limb_1_range_constraint_1 * MICRO_LIMB_SHIFT +
554 quotient_limb_1_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
555 quotient_limb_1_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
556 quotient_limb_1_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
557 quotient_binary_limbs_1);
558 tmp_18 *= lagrange_even_in_minicircuit;
559 tmp_18 *= scaling_factor;
560 std::get<17>(accumulators) += tmp_18;
561
562 // Contribution 19 , Q₂ limb decomposition
563 auto tmp_19 =
564 ((quotient_limb_2_range_constraint_0 +
565 quotient_limb_2_range_constraint_1 * MICRO_LIMB_SHIFT +
566 quotient_limb_2_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
567 quotient_limb_2_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
568 quotient_limb_2_range_constraint_4 * MICRO_LIMB_SHIFTx4) -
569 quotient_binary_limbs_2);
570 tmp_19 *= lagrange_even_in_minicircuit;
571 tmp_19 *= scaling_factor;
572 std::get<18>(accumulators) += tmp_19;
573
574 // Contribution 20 , Q₃ limb decomposition
575 auto tmp_20 =
576 ((quotient_limb_3_range_constraint_0 +
577 quotient_limb_3_range_constraint_1 * MICRO_LIMB_SHIFT +
578 quotient_limb_3_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
579 quotient_limb_3_range_constraint_3 * MICRO_LIMB_SHIFTx3) -
580 quotient_binary_limbs_3);
581 tmp_20 *= lagrange_even_in_minicircuit;
582 tmp_20 *= scaling_factor;
583 std::get<19>(accumulators) += tmp_20;
584
585 // Contribution 21 , decomposition of the low wide relation limb used for the bigfield relation.
586 // N.B. top microlimbs of relation wide limbs are stored in microlimbs for range constraints of P_x, P_y,
587 // accumulator and quotient. This is to save space and because these microlimbs are not used by their namesakes,
588 // since top limbs in 254/6-bit values use one less microlimb for the top 50/52-bit limb
589 auto tmp_21 =
590 ((relation_wide_limbs_lo_range_constraint_0 +
591 relation_wide_limbs_lo_range_constraint_1 * MICRO_LIMB_SHIFT +
592 relation_wide_limbs_lo_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
593 relation_wide_limbs_lo_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
594 relation_wide_limbs_lo_range_constraint_4 * MICRO_LIMB_SHIFTx4 +
595 relation_wide_limbs_lo_range_constraint_5 * MICRO_LIMB_SHIFTx5) -
596 relation_wide_limbs_lo);
597 tmp_21 *= lagrange_even_in_minicircuit;
598 tmp_21 *= scaling_factor;
599 std::get<20>(accumulators) += tmp_21;
600
601 // Contribution 22 , decomposition of high relation limb
602 auto tmp_22 =
603 ((relation_wide_limbs_hi_range_constraint_0 +
604 relation_wide_limbs_hi_range_constraint_1 * MICRO_LIMB_SHIFT +
605 relation_wide_limbs_hi_range_constraint_2 * MICRO_LIMB_SHIFTx2 +
606 relation_wide_limbs_hi_range_constraint_3 * MICRO_LIMB_SHIFTx3 +
607 relation_wide_limbs_hi_range_constraint_4 * MICRO_LIMB_SHIFTx4 +
608 relation_wide_limbs_hi_range_constraint_5 * MICRO_LIMB_SHIFTx5) -
609 relation_wide_limbs_hi);
610 tmp_22 *= lagrange_even_in_minicircuit;
611 tmp_22 *= scaling_factor;
612 std::get<21>(accumulators) += tmp_22;
613
614 // Contributions enfocing a reduced range constraint on high limbs (these relation force the last microlimb in
615 // each limb to be more severely range constrained)
616
617 // Contribution 23, range constrain Pₓ,₀[4] to be 12 bits (68 % 14 = 12)
618 auto tmp_23 = p_x_limb_0_range_constraint_4 * SHIFT_12_TO_14 - p_x_limb_0_range_constraint_tail;
619 tmp_23 *= lagrange_even_in_minicircuit;
620 tmp_23 *= scaling_factor;
621 std::get<22>(accumulators) += tmp_23;
622
623 // Contribution 24, range constrain Pₓ,₁[4] to be 12 bits
624 auto tmp_24 = p_x_limb_1_range_constraint_4 * SHIFT_12_TO_14 - p_x_limb_1_range_constraint_tail;
625 tmp_24 *= lagrange_even_in_minicircuit;
626 tmp_24 *= scaling_factor;
627 std::get<23>(accumulators) += tmp_24;
628
629 // Contribution 25, range constrain Pₓ,₂[4] to be 12 bits
630 auto tmp_25 = p_x_limb_2_range_constraint_4 * SHIFT_12_TO_14 - p_x_limb_2_range_constraint_tail;
631 tmp_25 *= lagrange_even_in_minicircuit;
632 tmp_25 *= scaling_factor;
633 std::get<24>(accumulators) += tmp_25;
634
635 // Contribution 26, range constrain Pₓ,₃[3] (top limb of Pₓ,₃) to be 8 bits (50 % 14 = 8)
636 auto tmp_26 = p_x_limb_3_range_constraint_3 * SHIFT_8_TO_14 - p_x_limb_3_range_constraint_tail;
637 tmp_26 *= lagrange_even_in_minicircuit;
638 tmp_26 *= scaling_factor;
639 std::get<25>(accumulators) += tmp_26;
640
641 // Contribution 27, range constrain Pᵧ,₀[4] to be 12 bits (68 % 14 = 12)
642 auto tmp_27 = p_y_limb_0_range_constraint_4 * SHIFT_12_TO_14 - p_y_limb_0_range_constraint_tail;
643 tmp_27 *= lagrange_even_in_minicircuit;
644 tmp_27 *= scaling_factor;
645 std::get<26>(accumulators) += tmp_27;
646
647 // Contribution 28, range constrain Pᵧ,₁[4] to be 12 bits (68 % 14 = 12)
648 auto tmp_28 = p_y_limb_1_range_constraint_4 * SHIFT_12_TO_14 - p_y_limb_1_range_constraint_tail;
649 tmp_28 *= lagrange_even_in_minicircuit;
650 tmp_28 *= scaling_factor;
651 std::get<27>(accumulators) += tmp_28;
652
653 // Contribution 29, range constrain Pᵧ,₂[4] to be 12 bits (68 % 14 = 12)
654 auto tmp_29 = p_y_limb_2_range_constraint_4 * SHIFT_12_TO_14 - p_y_limb_2_range_constraint_tail;
655 tmp_29 *= lagrange_even_in_minicircuit;
656 tmp_29 *= scaling_factor;
657 std::get<28>(accumulators) += tmp_29;
658
659 // Contribution 30, range constrain Pᵧ,₃[3] (top limb of Pᵧ,₃) to be 8 bits (50 % 14 = 8)
660 auto tmp_30 = p_y_limb_3_range_constraint_3 * SHIFT_8_TO_14 - p_y_limb_3_range_constraint_tail;
661 tmp_30 *= lagrange_even_in_minicircuit;
662 tmp_30 *= scaling_factor;
663 std::get<29>(accumulators) += tmp_30;
664
665 // Contribution 31, range constrain z₁,₀[4] to be 12 bits (68 % 14 = 12)
666 auto tmp_31 = (z_first_limb_0_range_constraint_4 * SHIFT_12_TO_14 - z_first_limb_0_range_constraint_tail);
667 tmp_31 *= lagrange_even_in_minicircuit;
668 tmp_31 *= scaling_factor;
669 std::get<30>(accumulators) += tmp_31;
670
671 // Contribution 32, range constrain z₂,₀[4] to be 12 bits (68 % 14 = 12)
672 auto tmp_32 = (z_second_limb_0_range_constraint_4 * SHIFT_12_TO_14 - z_second_limb_0_range_constraint_tail);
673 tmp_32 *= lagrange_even_in_minicircuit;
674 tmp_32 *= scaling_factor;
675 std::get<31>(accumulators) += tmp_32;
676
677 // Contribution 33, range constrain z₁,₁[4] to be 4 bits (60 % 14 = 4)
678 auto tmp_33 = (z_first_limb_1_range_constraint_4 * SHIFT_4_TO_14 - z_first_limb_1_range_constraint_tail);
679 tmp_33 *= lagrange_even_in_minicircuit;
680 tmp_33 *= scaling_factor;
681 std::get<32>(accumulators) += tmp_33;
682
683 // Contribution 34, range constrain z₂,₁[4] to be 4 bits (60 % 14 = 4)
684 auto tmp_34 = z_second_limb_1_range_constraint_4 * SHIFT_4_TO_14 - z_second_limb_1_range_constraint_tail;
685 tmp_34 *= lagrange_even_in_minicircuit;
686 tmp_34 *= scaling_factor;
687 std::get<33>(accumulators) += tmp_34;
688
689 // Contribution 35, range constrain A₀,₄ to be 12 bits (68 % 14 = 12)
690 auto tmp_35 = accumulator_limb_0_range_constraint_4 * SHIFT_12_TO_14 - accumulator_limb_0_range_constraint_tail;
691 tmp_35 *= lagrange_even_in_minicircuit;
692 tmp_35 *= scaling_factor;
693 std::get<34>(accumulators) += tmp_35;
694
695 // Contribution 36, range constrain A₁,₄ to be 12 bits (68 % 14 = 12)
696 auto tmp_36 = (accumulator_limb_1_range_constraint_4 * SHIFT_12_TO_14 - accumulator_limb_1_range_constraint_tail);
697 tmp_36 *= lagrange_even_in_minicircuit;
698 tmp_36 *= scaling_factor;
699 std::get<35>(accumulators) += tmp_36;
700
701 // Contribution 37, range constrain A₂,₄ to be 12 bits (68 % 14 = 12)
702 auto tmp_37 = (accumulator_limb_2_range_constraint_4 * SHIFT_12_TO_14 - accumulator_limb_2_range_constraint_tail);
703 tmp_37 *= lagrange_even_in_minicircuit;
704 tmp_37 *= scaling_factor;
705 std::get<36>(accumulators) += tmp_37;
706
707 // Contribution 38, range constrain A₃,₃ to be 8 bits (50 % 14 = 8)
708 auto tmp_38 = (accumulator_limb_3_range_constraint_3 * SHIFT_8_TO_14 - accumulator_limb_3_range_constraint_tail);
709 tmp_38 *= lagrange_even_in_minicircuit;
710 tmp_38 *= scaling_factor;
711 std::get<37>(accumulators) += tmp_38;
712
713 // Contribution 39, range constrain Q₀[4] to be 12 bits (68 % 14 = 12)
714 auto tmp_39 = (quotient_limb_0_range_constraint_4 * SHIFT_12_TO_14 - quotient_limb_0_range_constraint_tail);
715 tmp_39 *= lagrange_even_in_minicircuit;
716 tmp_39 *= scaling_factor;
717 std::get<38>(accumulators) += tmp_39;
718
719 // Contribution 40, range constrain Q₁[4] to be 12 bits (68 % 14 = 12)
720 auto tmp_40 = (quotient_limb_1_range_constraint_4 * SHIFT_12_TO_14 - quotient_limb_1_range_constraint_tail);
721 tmp_40 *= lagrange_even_in_minicircuit;
722 tmp_40 *= scaling_factor;
723 std::get<39>(accumulators) += tmp_40;
724
725 // Contribution 41, range constrain Q₂[4] to be 12 bits (68 % 14 = 12)
726 auto tmp_41 = (quotient_limb_2_range_constraint_4 * SHIFT_12_TO_14 - quotient_limb_2_range_constraint_tail);
727 tmp_41 *= lagrange_even_in_minicircuit;
728 tmp_41 *= scaling_factor;
729 std::get<40>(accumulators) += tmp_41;
730
731 // Contribution 42, range constrain Q₃[3] (top limb of Q₃) to be 10 bits (52 % 14 = 10)
732 auto tmp_42 = (quotient_limb_3_range_constraint_3 * SHIFT_10_TO_14 - quotient_limb_3_range_constraint_tail);
733 tmp_42 *= lagrange_even_in_minicircuit;
734 tmp_42 *= scaling_factor;
735 std::get<41>(accumulators) += tmp_42;
736
737 // Contributions where we decompose initial EccOpQueue values into 68-bit limbs
738
739 // Contribution 43, decompose x_lo = Pₓ,₀ + Pₓ,₁ * 2⁶⁸
740 auto tmp_43 = (p_x_limb_0 + p_x_limb_1 * LIMB_SHIFT) - x_lo;
741 tmp_43 *= lagrange_even_in_minicircuit;
742 tmp_43 *= scaling_factor;
743 std::get<42>(accumulators) += tmp_43;
744
745 // Contribution 44, decompose x_hi = Pₓ,₂ + Pₓ,₃ * 2⁶⁸
746 auto tmp_44 = (p_x_limb_2 + p_x_limb_3 * LIMB_SHIFT) - x_hi;
747 tmp_44 *= lagrange_even_in_minicircuit;
748 tmp_44 *= scaling_factor;
749 std::get<43>(accumulators) += tmp_44;
750
751 // Contribution 45, decompose y_lo = Pᵧ,₀ + Pᵧ,₁ * 2⁶⁸
752 auto tmp_45 = (p_y_limb_0 + p_y_limb_1 * LIMB_SHIFT) - y_lo;
753 tmp_45 *= lagrange_even_in_minicircuit;
754 tmp_45 *= scaling_factor;
755 std::get<44>(accumulators) += tmp_45;
756
757 // Contribution 46, decompose y_hi = Pᵧ,₂ + Pᵧ,₃ * 2⁶⁸
758 auto tmp_46 = (p_y_limb_2 + p_y_limb_3 * LIMB_SHIFT) - y_hi;
759 tmp_46 *= lagrange_even_in_minicircuit;
760 tmp_46 *= scaling_factor;
761 std::get<45>(accumulators) += tmp_46;
762
763 // Contribution 47, decompose z1 = z₁,₀ + z₁,₁ * 2⁶⁸
764 auto tmp_47 = (z_first_limb_0 + z_first_limb_1 * LIMB_SHIFT) - z_one;
765 tmp_47 *= lagrange_even_in_minicircuit;
766 tmp_47 *= scaling_factor;
767 std::get<46>(accumulators) += tmp_47;
768
769 // Contribution 48, decompose z2 = z₂,₀ + z₂,₁ * 2⁶⁸
770 auto tmp_48 = (z_second_limb_0 + z_second_limb_1 * LIMB_SHIFT) - z_two;
771 tmp_48 *= lagrange_even_in_minicircuit;
772 tmp_48 *= scaling_factor;
773 std::get<47>(accumulators) += tmp_48;
774 }();
775};
776} // namespace bb
bb::field< bb::Bn254FrParams > FF
Definition field.cpp:24
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.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13