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