Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
translator_relation_consistency.test.cpp
Go to the documentation of this file.
1
16#include <gtest/gtest.h>
17
18using namespace bb;
19
21using FF = typename Flavor::FF;
23
25{
26 InputElements result;
27 for (FF& element : result.get_all()) {
28 element = FF::random_element();
29 }
30 return result;
31}
32
33InputElements get_special_input() // use non-random values
34{
35 InputElements result;
36 FF idx = 0;
37 for (FF& element : result.get_all()) {
38 idx += FF(1);
39 element = idx;
40 }
41 return result;
42}
43
44class TranslatorRelationConsistency : public testing::Test {
45 public:
46 template <typename Relation>
47 static void validate_relation_execution(const auto& expected_values,
48 const InputElements& input_elements,
49 const auto& parameters)
50 {
52 std::fill(accumulator.begin(), accumulator.end(), FF(0));
53 Relation::accumulate(accumulator, input_elements, parameters, 1);
54 EXPECT_EQ(accumulator, expected_values);
55 };
56};
57
59{
60 const auto run_test = [](bool random_inputs) {
62 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
63
64 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
65 const auto& concatenated_range_constraints_0 = input_elements.concatenated_range_constraints_0;
66 const auto& concatenated_range_constraints_1 = input_elements.concatenated_range_constraints_1;
67 const auto& concatenated_range_constraints_2 = input_elements.concatenated_range_constraints_2;
68 const auto& concatenated_range_constraints_3 = input_elements.concatenated_range_constraints_3;
69 const auto& ordered_range_constraints_0 = input_elements.ordered_range_constraints_0;
70 const auto& ordered_range_constraints_1 = input_elements.ordered_range_constraints_1;
71 const auto& ordered_range_constraints_2 = input_elements.ordered_range_constraints_2;
72 const auto& ordered_range_constraints_3 = input_elements.ordered_range_constraints_3;
73 const auto& ordered_range_constraints_4 = input_elements.ordered_range_constraints_4;
74 const auto& ordered_extra_range_constraints_numerator =
75 input_elements.ordered_extra_range_constraints_numerator;
76 const auto& z_perm = input_elements.z_perm;
77 const auto& z_perm_shift = input_elements.z_perm_shift;
78 const auto& lagrange_first = input_elements.lagrange_first;
79 const auto& lagrange_last = input_elements.lagrange_last;
80 const auto& lagrange_masking = input_elements.lagrange_masking;
81 const auto& lagrange_ordered_masking = input_elements.lagrange_ordered_masking;
82
83 RelationValues expected_values;
84
85 const auto parameters = RelationParameters<FF>::get_random();
86 const auto& gamma = parameters.gamma;
87 const auto& beta = parameters.beta;
88
89 // (Contribution 1)
90 // First 4 numerator factors use scattered masking (lagrange_masking),
91 // 5th numerator factor and all denominator factors use contiguous masking (lagrange_ordered_masking)
92 auto contribution_1 =
93 (z_perm + lagrange_first) * (concatenated_range_constraints_0 + lagrange_masking * beta + gamma) *
94 (concatenated_range_constraints_1 + lagrange_masking * beta + gamma) *
95 (concatenated_range_constraints_2 + lagrange_masking * beta + gamma) *
96 (concatenated_range_constraints_3 + lagrange_masking * beta + gamma) *
97 (ordered_extra_range_constraints_numerator + lagrange_ordered_masking * beta + gamma) -
98 (z_perm_shift + lagrange_last) * (ordered_range_constraints_0 + lagrange_ordered_masking * beta + gamma) *
99 (ordered_range_constraints_1 + lagrange_ordered_masking * beta + gamma) *
100 (ordered_range_constraints_2 + lagrange_ordered_masking * beta + gamma) *
101 (ordered_range_constraints_3 + lagrange_ordered_masking * beta + gamma) *
102 (ordered_range_constraints_4 + lagrange_ordered_masking * beta + gamma);
103 expected_values[0] = contribution_1;
104
105 // (Contribution 2)
106 auto contribution_2 = z_perm_shift * lagrange_last;
107 expected_values[1] = contribution_2;
108
109 // (Contribution 3)
110 auto contribution_3 = lagrange_first * z_perm;
111 expected_values[2] = contribution_3;
112
113 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
114 };
115 run_test(/*random_inputs=*/false);
116 run_test(/*random_inputs=*/true);
117};
118
120{
121 const auto run_test = [](bool random_inputs) {
123 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
124
125 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
126
127 const auto& ordered_range_constraints_0 = input_elements.ordered_range_constraints_0;
128 const auto& ordered_range_constraints_1 = input_elements.ordered_range_constraints_1;
129 const auto& ordered_range_constraints_2 = input_elements.ordered_range_constraints_2;
130 const auto& ordered_range_constraints_3 = input_elements.ordered_range_constraints_3;
131 const auto& ordered_range_constraints_4 = input_elements.ordered_range_constraints_4;
132 const auto& ordered_range_constraints_0_shift = input_elements.ordered_range_constraints_0_shift;
133 const auto& ordered_range_constraints_1_shift = input_elements.ordered_range_constraints_1_shift;
134 const auto& ordered_range_constraints_2_shift = input_elements.ordered_range_constraints_2_shift;
135 const auto& ordered_range_constraints_3_shift = input_elements.ordered_range_constraints_3_shift;
136 const auto& ordered_range_constraints_4_shift = input_elements.ordered_range_constraints_4_shift;
137 const auto& lagrange_ordered_masking = input_elements.lagrange_ordered_masking;
138 const auto& lagrange_real_last = input_elements.lagrange_real_last;
139
140 RelationValues expected_values;
141
142 const auto parameters = RelationParameters<FF>::get_random();
143
144 const size_t MICRO_LIMB_BITS = 14;
145 const auto minus_one = FF(-1);
146 const auto minus_two = FF(-2);
147 const auto minus_three = FF(-3);
148 const auto maximum_value = -FF((1 << MICRO_LIMB_BITS) - 1);
149
150 // First compute individual deltas
151 const auto delta_1 = ordered_range_constraints_0_shift - ordered_range_constraints_0;
152 const auto delta_2 = ordered_range_constraints_1_shift - ordered_range_constraints_1;
153 const auto delta_3 = ordered_range_constraints_2_shift - ordered_range_constraints_2;
154 const auto delta_4 = ordered_range_constraints_3_shift - ordered_range_constraints_3;
155 const auto delta_5 = ordered_range_constraints_4_shift - ordered_range_constraints_4;
156
157 const auto not_last_or_masking = lagrange_real_last + lagrange_ordered_masking + minus_one;
158
159 // Check the delta is {0,1,2,3}
160 auto delta_in_range = [&](auto delta) {
161 return not_last_or_masking * delta * (delta + minus_one) * (delta + minus_two) * (delta + minus_three);
162 };
163
164 // Check delta correctness
165 expected_values[0] = delta_in_range(delta_1);
166 expected_values[1] = delta_in_range(delta_2);
167 expected_values[2] = delta_in_range(delta_3);
168 expected_values[3] = delta_in_range(delta_4);
169 expected_values[4] = delta_in_range(delta_5);
170 // Check that the last value is maximum allowed
171 expected_values[5] = lagrange_real_last * (ordered_range_constraints_0 + maximum_value);
172 expected_values[6] = lagrange_real_last * (ordered_range_constraints_1 + maximum_value);
173 expected_values[7] = lagrange_real_last * (ordered_range_constraints_2 + maximum_value);
174 expected_values[8] = lagrange_real_last * (ordered_range_constraints_3 + maximum_value);
175 expected_values[9] = lagrange_real_last * (ordered_range_constraints_4 + maximum_value);
176 // We don't check that the first value is zero, because the shift mechanism already ensures it
177
178 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
179 };
180 run_test(/*random_inputs=*/false);
181 run_test(/*random_inputs=*/true);
182};
183
185{
186 const auto run_test = [](bool random_inputs) {
188 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
189
190 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
191
192 // Get all the wires
193 const auto& p_x_low_limbs_range_constraint_0 = input_elements.p_x_low_limbs_range_constraint_0;
194 const auto& p_x_low_limbs_range_constraint_1 = input_elements.p_x_low_limbs_range_constraint_1;
195 const auto& p_x_low_limbs_range_constraint_2 = input_elements.p_x_low_limbs_range_constraint_2;
196 const auto& p_x_low_limbs_range_constraint_3 = input_elements.p_x_low_limbs_range_constraint_3;
197 const auto& p_x_low_limbs_range_constraint_4 = input_elements.p_x_low_limbs_range_constraint_4;
198 const auto& p_x_low_limbs_range_constraint_tail = input_elements.p_x_low_limbs_range_constraint_tail;
199 const auto& p_x_low_limbs = input_elements.p_x_low_limbs;
200 const auto& p_x_high_limbs_range_constraint_0 = input_elements.p_x_high_limbs_range_constraint_0;
201 const auto& p_x_high_limbs_range_constraint_1 = input_elements.p_x_high_limbs_range_constraint_1;
202 const auto& p_x_high_limbs_range_constraint_2 = input_elements.p_x_high_limbs_range_constraint_2;
203 const auto& p_x_high_limbs_range_constraint_3 = input_elements.p_x_high_limbs_range_constraint_3;
204 const auto& p_x_high_limbs_range_constraint_4 = input_elements.p_x_high_limbs_range_constraint_4;
205 const auto& p_x_high_limbs_range_constraint_tail = input_elements.p_x_high_limbs_range_constraint_tail;
206 const auto& p_x_high_limbs = input_elements.p_x_high_limbs;
207 const auto& p_x_low_limbs_range_constraint_0_shift = input_elements.p_x_low_limbs_range_constraint_0_shift;
208 const auto& p_x_low_limbs_range_constraint_1_shift = input_elements.p_x_low_limbs_range_constraint_1_shift;
209 const auto& p_x_low_limbs_range_constraint_2_shift = input_elements.p_x_low_limbs_range_constraint_2_shift;
210 const auto& p_x_low_limbs_range_constraint_3_shift = input_elements.p_x_low_limbs_range_constraint_3_shift;
211 const auto& p_x_low_limbs_range_constraint_4_shift = input_elements.p_x_low_limbs_range_constraint_4_shift;
212 const auto& p_x_low_limbs_range_constraint_tail_shift =
213 input_elements.p_x_low_limbs_range_constraint_tail_shift;
214 const auto& p_x_low_limbs_shift = input_elements.p_x_low_limbs_shift;
215 const auto& p_x_high_limbs_range_constraint_0_shift = input_elements.p_x_high_limbs_range_constraint_0_shift;
216 const auto& p_x_high_limbs_range_constraint_1_shift = input_elements.p_x_high_limbs_range_constraint_1_shift;
217 const auto& p_x_high_limbs_range_constraint_2_shift = input_elements.p_x_high_limbs_range_constraint_2_shift;
218 const auto& p_x_high_limbs_range_constraint_3_shift = input_elements.p_x_high_limbs_range_constraint_3_shift;
219 const auto& p_x_high_limbs_range_constraint_4_shift = input_elements.p_x_high_limbs_range_constraint_4_shift;
220 const auto& p_x_high_limbs_range_constraint_tail_shift =
221 input_elements.p_x_high_limbs_range_constraint_tail_shift;
222 const auto& p_x_high_limbs_shift = input_elements.p_x_high_limbs_shift;
223 const auto& p_y_low_limbs_range_constraint_0 = input_elements.p_y_low_limbs_range_constraint_0;
224 const auto& p_y_low_limbs_range_constraint_1 = input_elements.p_y_low_limbs_range_constraint_1;
225 const auto& p_y_low_limbs_range_constraint_2 = input_elements.p_y_low_limbs_range_constraint_2;
226 const auto& p_y_low_limbs_range_constraint_3 = input_elements.p_y_low_limbs_range_constraint_3;
227 const auto& p_y_low_limbs_range_constraint_4 = input_elements.p_y_low_limbs_range_constraint_4;
228 const auto& p_y_low_limbs_range_constraint_tail = input_elements.p_y_low_limbs_range_constraint_tail;
229 const auto& p_y_low_limbs = input_elements.p_y_low_limbs;
230 const auto& p_y_high_limbs_range_constraint_0 = input_elements.p_y_high_limbs_range_constraint_0;
231 const auto& p_y_high_limbs_range_constraint_1 = input_elements.p_y_high_limbs_range_constraint_1;
232 const auto& p_y_high_limbs_range_constraint_2 = input_elements.p_y_high_limbs_range_constraint_2;
233 const auto& p_y_high_limbs_range_constraint_3 = input_elements.p_y_high_limbs_range_constraint_3;
234 const auto& p_y_high_limbs_range_constraint_4 = input_elements.p_y_high_limbs_range_constraint_4;
235 const auto& p_y_high_limbs_range_constraint_tail = input_elements.p_y_high_limbs_range_constraint_tail;
236 const auto& p_y_high_limbs = input_elements.p_y_high_limbs;
237 const auto& p_y_low_limbs_range_constraint_0_shift = input_elements.p_y_low_limbs_range_constraint_0_shift;
238 const auto& p_y_low_limbs_range_constraint_1_shift = input_elements.p_y_low_limbs_range_constraint_1_shift;
239 const auto& p_y_low_limbs_range_constraint_2_shift = input_elements.p_y_low_limbs_range_constraint_2_shift;
240 const auto& p_y_low_limbs_range_constraint_3_shift = input_elements.p_y_low_limbs_range_constraint_3_shift;
241 const auto& p_y_low_limbs_range_constraint_4_shift = input_elements.p_y_low_limbs_range_constraint_4_shift;
242 const auto& p_y_low_limbs_range_constraint_tail_shift =
243 input_elements.p_y_low_limbs_range_constraint_tail_shift;
244 const auto& p_y_low_limbs_shift = input_elements.p_y_low_limbs_shift;
245 const auto& p_y_high_limbs_range_constraint_0_shift = input_elements.p_y_high_limbs_range_constraint_0_shift;
246 const auto& p_y_high_limbs_range_constraint_1_shift = input_elements.p_y_high_limbs_range_constraint_1_shift;
247 const auto& p_y_high_limbs_range_constraint_2_shift = input_elements.p_y_high_limbs_range_constraint_2_shift;
248 const auto& p_y_high_limbs_range_constraint_3_shift = input_elements.p_y_high_limbs_range_constraint_3_shift;
249 const auto& p_y_high_limbs_range_constraint_4_shift = input_elements.p_y_high_limbs_range_constraint_4_shift;
250 const auto& p_y_high_limbs_range_constraint_tail_shift =
251 input_elements.p_y_high_limbs_range_constraint_tail_shift;
252 const auto& p_y_high_limbs_shift = input_elements.p_y_high_limbs_shift;
253 const auto& z_low_limbs_range_constraint_0 = input_elements.z_low_limbs_range_constraint_0;
254 const auto& z_low_limbs_range_constraint_1 = input_elements.z_low_limbs_range_constraint_1;
255 const auto& z_low_limbs_range_constraint_2 = input_elements.z_low_limbs_range_constraint_2;
256 const auto& z_low_limbs_range_constraint_3 = input_elements.z_low_limbs_range_constraint_3;
257 const auto& z_low_limbs_range_constraint_4 = input_elements.z_low_limbs_range_constraint_4;
258 const auto& z_low_limbs_range_constraint_tail = input_elements.z_low_limbs_range_constraint_tail;
259 const auto& z_low_limbs = input_elements.z_low_limbs;
260 const auto& z_low_limbs_range_constraint_0_shift = input_elements.z_low_limbs_range_constraint_0_shift;
261 const auto& z_low_limbs_range_constraint_1_shift = input_elements.z_low_limbs_range_constraint_1_shift;
262 const auto& z_low_limbs_range_constraint_2_shift = input_elements.z_low_limbs_range_constraint_2_shift;
263 const auto& z_low_limbs_range_constraint_3_shift = input_elements.z_low_limbs_range_constraint_3_shift;
264 const auto& z_low_limbs_range_constraint_4_shift = input_elements.z_low_limbs_range_constraint_4_shift;
265 const auto& z_low_limbs_range_constraint_tail_shift = input_elements.z_low_limbs_range_constraint_tail_shift;
266 const auto& z_low_limbs_shift = input_elements.z_low_limbs_shift;
267 const auto& z_high_limbs_range_constraint_0 = input_elements.z_high_limbs_range_constraint_0;
268 const auto& z_high_limbs_range_constraint_1 = input_elements.z_high_limbs_range_constraint_1;
269 const auto& z_high_limbs_range_constraint_2 = input_elements.z_high_limbs_range_constraint_2;
270 const auto& z_high_limbs_range_constraint_3 = input_elements.z_high_limbs_range_constraint_3;
271 const auto& z_high_limbs_range_constraint_4 = input_elements.z_high_limbs_range_constraint_4;
272 const auto& z_high_limbs_range_constraint_tail = input_elements.z_high_limbs_range_constraint_tail;
273 const auto& z_high_limbs = input_elements.z_high_limbs;
274 const auto& z_high_limbs_range_constraint_0_shift = input_elements.z_high_limbs_range_constraint_0_shift;
275 const auto& z_high_limbs_range_constraint_1_shift = input_elements.z_high_limbs_range_constraint_1_shift;
276 const auto& z_high_limbs_range_constraint_2_shift = input_elements.z_high_limbs_range_constraint_2_shift;
277 const auto& z_high_limbs_range_constraint_3_shift = input_elements.z_high_limbs_range_constraint_3_shift;
278 const auto& z_high_limbs_range_constraint_4_shift = input_elements.z_high_limbs_range_constraint_4_shift;
279 const auto& z_high_limbs_range_constraint_tail_shift = input_elements.z_high_limbs_range_constraint_tail_shift;
280 const auto& z_high_limbs_shift = input_elements.z_high_limbs_shift;
281 const auto& accumulator_low_limbs_range_constraint_0 = input_elements.accumulator_low_limbs_range_constraint_0;
282 const auto& accumulator_low_limbs_range_constraint_1 = input_elements.accumulator_low_limbs_range_constraint_1;
283 const auto& accumulator_low_limbs_range_constraint_2 = input_elements.accumulator_low_limbs_range_constraint_2;
284 const auto& accumulator_low_limbs_range_constraint_3 = input_elements.accumulator_low_limbs_range_constraint_3;
285 const auto& accumulator_low_limbs_range_constraint_4 = input_elements.accumulator_low_limbs_range_constraint_4;
286 const auto& accumulator_low_limbs_range_constraint_tail =
287 input_elements.accumulator_low_limbs_range_constraint_tail;
288 const auto& accumulator_low_limbs_range_constraint_0_shift =
289 input_elements.accumulator_low_limbs_range_constraint_0_shift;
290 const auto& accumulator_low_limbs_range_constraint_1_shift =
291 input_elements.accumulator_low_limbs_range_constraint_1_shift;
292 const auto& accumulator_low_limbs_range_constraint_2_shift =
293 input_elements.accumulator_low_limbs_range_constraint_2_shift;
294 const auto& accumulator_low_limbs_range_constraint_3_shift =
295 input_elements.accumulator_low_limbs_range_constraint_3_shift;
296 const auto& accumulator_low_limbs_range_constraint_4_shift =
297 input_elements.accumulator_low_limbs_range_constraint_4_shift;
298 const auto& accumulator_low_limbs_range_constraint_tail_shift =
299 input_elements.accumulator_low_limbs_range_constraint_tail_shift;
300 const auto& accumulator_high_limbs_range_constraint_0 =
301 input_elements.accumulator_high_limbs_range_constraint_0;
302 const auto& accumulator_high_limbs_range_constraint_1 =
303 input_elements.accumulator_high_limbs_range_constraint_1;
304 const auto& accumulator_high_limbs_range_constraint_2 =
305 input_elements.accumulator_high_limbs_range_constraint_2;
306 const auto& accumulator_high_limbs_range_constraint_3 =
307 input_elements.accumulator_high_limbs_range_constraint_3;
308 const auto& accumulator_high_limbs_range_constraint_4 =
309 input_elements.accumulator_high_limbs_range_constraint_4;
310 const auto& accumulator_high_limbs_range_constraint_tail =
311 input_elements.accumulator_high_limbs_range_constraint_tail;
312 const auto& accumulator_high_limbs_range_constraint_0_shift =
313 input_elements.accumulator_high_limbs_range_constraint_0_shift;
314 const auto& accumulator_high_limbs_range_constraint_1_shift =
315 input_elements.accumulator_high_limbs_range_constraint_1_shift;
316 const auto& accumulator_high_limbs_range_constraint_2_shift =
317 input_elements.accumulator_high_limbs_range_constraint_2_shift;
318 const auto& accumulator_high_limbs_range_constraint_3_shift =
319 input_elements.accumulator_high_limbs_range_constraint_3_shift;
320 const auto& accumulator_high_limbs_range_constraint_4_shift =
321 input_elements.accumulator_high_limbs_range_constraint_4_shift;
322 const auto& accumulator_high_limbs_range_constraint_tail_shift =
323 input_elements.accumulator_high_limbs_range_constraint_tail_shift;
324 const auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
325 const auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
326 const auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
327 const auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
328 const auto& quotient_low_limbs_range_constraint_0 = input_elements.quotient_low_limbs_range_constraint_0;
329 const auto& quotient_low_limbs_range_constraint_1 = input_elements.quotient_low_limbs_range_constraint_1;
330 const auto& quotient_low_limbs_range_constraint_2 = input_elements.quotient_low_limbs_range_constraint_2;
331 const auto& quotient_low_limbs_range_constraint_3 = input_elements.quotient_low_limbs_range_constraint_3;
332 const auto& quotient_low_limbs_range_constraint_4 = input_elements.quotient_low_limbs_range_constraint_4;
333 const auto& quotient_low_limbs_range_constraint_tail = input_elements.quotient_low_limbs_range_constraint_tail;
334 const auto& quotient_low_limbs_range_constraint_0_shift =
335 input_elements.quotient_low_limbs_range_constraint_0_shift;
336 const auto& quotient_low_limbs_range_constraint_1_shift =
337 input_elements.quotient_low_limbs_range_constraint_1_shift;
338 const auto& quotient_low_limbs_range_constraint_2_shift =
339 input_elements.quotient_low_limbs_range_constraint_2_shift;
340 const auto& quotient_low_limbs_range_constraint_3_shift =
341 input_elements.quotient_low_limbs_range_constraint_3_shift;
342 const auto& quotient_low_limbs_range_constraint_4_shift =
343 input_elements.quotient_low_limbs_range_constraint_4_shift;
344 const auto& quotient_low_limbs_range_constraint_tail_shift =
345 input_elements.quotient_low_limbs_range_constraint_tail_shift;
346 const auto& quotient_high_limbs_range_constraint_0 = input_elements.quotient_high_limbs_range_constraint_0;
347 const auto& quotient_high_limbs_range_constraint_1 = input_elements.quotient_high_limbs_range_constraint_1;
348 const auto& quotient_high_limbs_range_constraint_2 = input_elements.quotient_high_limbs_range_constraint_2;
349 const auto& quotient_high_limbs_range_constraint_3 = input_elements.quotient_high_limbs_range_constraint_3;
350 const auto& quotient_high_limbs_range_constraint_4 = input_elements.quotient_high_limbs_range_constraint_4;
351 const auto& quotient_high_limbs_range_constraint_tail =
352 input_elements.quotient_high_limbs_range_constraint_tail;
353 const auto& quotient_high_limbs_range_constraint_0_shift =
354 input_elements.quotient_high_limbs_range_constraint_0_shift;
355 const auto& quotient_high_limbs_range_constraint_1_shift =
356 input_elements.quotient_high_limbs_range_constraint_1_shift;
357 const auto& quotient_high_limbs_range_constraint_2_shift =
358 input_elements.quotient_high_limbs_range_constraint_2_shift;
359 const auto& quotient_high_limbs_range_constraint_3_shift =
360 input_elements.quotient_high_limbs_range_constraint_3_shift;
361 const auto& quotient_high_limbs_range_constraint_4_shift =
362 input_elements.quotient_high_limbs_range_constraint_4_shift;
363 const auto& quotient_high_limbs_range_constraint_tail_shift =
364 input_elements.quotient_high_limbs_range_constraint_tail_shift;
365 const auto& quotient_low_binary_limbs = input_elements.quotient_low_binary_limbs;
366 const auto& quotient_low_binary_limbs_shift = input_elements.quotient_low_binary_limbs_shift;
367 const auto& quotient_high_binary_limbs = input_elements.quotient_high_binary_limbs;
368 const auto& quotient_high_binary_limbs_shift = input_elements.quotient_high_binary_limbs_shift;
369 const auto& relation_wide_limbs_range_constraint_0 = input_elements.relation_wide_limbs_range_constraint_0;
370 const auto& relation_wide_limbs_range_constraint_1 = input_elements.relation_wide_limbs_range_constraint_1;
371 const auto& relation_wide_limbs_range_constraint_2 = input_elements.relation_wide_limbs_range_constraint_2;
372 const auto& relation_wide_limbs_range_constraint_3 = input_elements.relation_wide_limbs_range_constraint_3;
373 const auto& relation_wide_limbs_range_constraint_0_shift =
374 input_elements.relation_wide_limbs_range_constraint_0_shift;
375 const auto& relation_wide_limbs_range_constraint_1_shift =
376 input_elements.relation_wide_limbs_range_constraint_1_shift;
377 const auto& relation_wide_limbs_range_constraint_2_shift =
378 input_elements.relation_wide_limbs_range_constraint_2_shift;
379 const auto& relation_wide_limbs_range_constraint_3_shift =
380 input_elements.relation_wide_limbs_range_constraint_3_shift;
381 const auto& relation_wide_limbs = input_elements.relation_wide_limbs;
382 const auto& relation_wide_limbs_shift = input_elements.relation_wide_limbs_shift;
383
384 const auto& x_lo_y_hi = input_elements.x_lo_y_hi;
385 const auto& x_hi_z_1 = input_elements.x_hi_z_1;
386 const auto& y_lo_z_2 = input_elements.y_lo_z_2;
387 const auto& x_lo_y_hi_shift = input_elements.x_lo_y_hi_shift;
388 const auto& x_hi_z_1_shift = input_elements.x_hi_z_1_shift;
389 const auto& y_lo_z_2_shift = input_elements.y_lo_z_2_shift;
390 const auto& op = input_elements.op;
391
392 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
393
394 RelationValues expected_values;
395
396 const auto parameters = RelationParameters<FF>::get_random();
397
398 const size_t NUM_MICRO_LIMB_BITS = 14;
399 const size_t NUM_LIMB_BITS = 68;
400 const auto MICRO_LIMB_SHIFT = FF(uint256_t(1) << NUM_MICRO_LIMB_BITS);
401 const auto MICRO_LIMB_SHIFTx2 = MICRO_LIMB_SHIFT * MICRO_LIMB_SHIFT;
402 const auto MICRO_LIMB_SHIFTx3 = MICRO_LIMB_SHIFTx2 * MICRO_LIMB_SHIFT;
403 const auto MICRO_LIMB_SHIFTx4 = MICRO_LIMB_SHIFTx3 * MICRO_LIMB_SHIFT;
404 const auto MICRO_LIMB_SHIFTx5 = MICRO_LIMB_SHIFTx4 * MICRO_LIMB_SHIFT;
405
406 const auto SHIFT_10_TO_14 = FF(1 << 4);
407 const auto SHIFT_12_TO_14 = FF(1 << 2);
408 const auto SHIFT_4_TO_14 = FF(1 << 10);
409 const auto SHIFT_8_TO_14 = FF(1 << 6);
410 const auto LIMB_SHIFT = FF(uint256_t(1) << NUM_LIMB_BITS);
411
412 // All decomposition happen only at odd indices, so we use lagrange odd
418 auto check_relation_limb_decomposition = [MICRO_LIMB_SHIFT,
419 MICRO_LIMB_SHIFTx2,
420 MICRO_LIMB_SHIFTx3,
421 MICRO_LIMB_SHIFTx4,
422 MICRO_LIMB_SHIFTx5,
423 lagrange_even_in_minicircuit](auto& micro_limb_0,
424 auto& micro_limb_1,
425 auto& micro_limb_2,
426 auto& micro_limb_3,
427 auto& micro_limb_4,
428 auto& micro_limb_5,
429 auto& decomposed_limb) {
430 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
431 micro_limb_3 * MICRO_LIMB_SHIFTx3 + micro_limb_4 * MICRO_LIMB_SHIFTx4 +
432 micro_limb_5 * MICRO_LIMB_SHIFTx5 - decomposed_limb) *
433 lagrange_even_in_minicircuit;
434 };
435
441 auto check_standard_limb_decomposition = [MICRO_LIMB_SHIFT,
442 MICRO_LIMB_SHIFTx2,
443 MICRO_LIMB_SHIFTx3,
444 MICRO_LIMB_SHIFTx4,
445 lagrange_even_in_minicircuit](auto& micro_limb_0,
446 auto& micro_limb_1,
447 auto& micro_limb_2,
448 auto& micro_limb_3,
449 auto& micro_limb_4,
450 auto& decomposed_limb) {
451 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
452 micro_limb_3 * MICRO_LIMB_SHIFTx3 + micro_limb_4 * MICRO_LIMB_SHIFTx4 - decomposed_limb) *
453 lagrange_even_in_minicircuit;
454 };
455
460 auto check_standard_top_limb_decomposition =
461 [MICRO_LIMB_SHIFT, MICRO_LIMB_SHIFTx2, MICRO_LIMB_SHIFTx3, lagrange_even_in_minicircuit](
462 auto& micro_limb_0, auto& micro_limb_1, auto& micro_limb_2, auto& micro_limb_3, auto& decomposed_limb) {
463 return (micro_limb_0 + micro_limb_1 * MICRO_LIMB_SHIFT + micro_limb_2 * MICRO_LIMB_SHIFTx2 +
464 micro_limb_3 * MICRO_LIMB_SHIFTx3 - decomposed_limb) *
465 lagrange_even_in_minicircuit;
466 };
467
473 auto check_standard_tail_micro_limb_correctness =
474 [SHIFT_12_TO_14, lagrange_even_in_minicircuit](auto& nonshifted_micro_limb, auto shifted_micro_limb) {
475 return (nonshifted_micro_limb * SHIFT_12_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
476 };
477
483 auto check_top_tail_micro_limb_correctness =
484 [SHIFT_8_TO_14, lagrange_even_in_minicircuit](auto& nonshifted_micro_limb, auto shifted_micro_limb) {
485 return (nonshifted_micro_limb * SHIFT_8_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
486 };
487
493 auto check_z_top_tail_micro_limb_correctness =
494 [SHIFT_4_TO_14, lagrange_even_in_minicircuit](auto& nonshifted_micro_limb, auto shifted_micro_limb) {
495 return (nonshifted_micro_limb * SHIFT_4_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
496 };
497
503 auto check_quotient_top_tail_micro_limb_correctness =
504 [SHIFT_10_TO_14, lagrange_even_in_minicircuit](auto& nonshifted_micro_limb, auto shifted_micro_limb) {
505 return (nonshifted_micro_limb * SHIFT_10_TO_14 - shifted_micro_limb) * lagrange_even_in_minicircuit;
506 };
507
512 auto check_wide_limb_into_regular_limb_correctness =
513 [LIMB_SHIFT, lagrange_even_in_minicircuit](auto& low_limb, auto& high_limb, auto& wide_limb) {
514 return (low_limb + high_limb * LIMB_SHIFT - wide_limb) * lagrange_even_in_minicircuit;
515 };
516
517 // Check decomposition 50-72 bit limbs into microlimbs
518 expected_values[0] = op * check_standard_limb_decomposition(accumulator_low_limbs_range_constraint_0,
519 accumulator_low_limbs_range_constraint_1,
520 accumulator_low_limbs_range_constraint_2,
521 accumulator_low_limbs_range_constraint_3,
522 accumulator_low_limbs_range_constraint_4,
523 accumulators_binary_limbs_0);
524 expected_values[1] = op * check_standard_limb_decomposition(accumulator_low_limbs_range_constraint_0_shift,
525 accumulator_low_limbs_range_constraint_1_shift,
526 accumulator_low_limbs_range_constraint_2_shift,
527 accumulator_low_limbs_range_constraint_3_shift,
528 accumulator_low_limbs_range_constraint_4_shift,
529 accumulators_binary_limbs_1);
530 expected_values[2] = op * check_standard_limb_decomposition(accumulator_high_limbs_range_constraint_0,
531 accumulator_high_limbs_range_constraint_1,
532 accumulator_high_limbs_range_constraint_2,
533 accumulator_high_limbs_range_constraint_3,
534 accumulator_high_limbs_range_constraint_4,
535 accumulators_binary_limbs_2);
536 expected_values[3] = op * check_standard_top_limb_decomposition(accumulator_high_limbs_range_constraint_0_shift,
537 accumulator_high_limbs_range_constraint_1_shift,
538 accumulator_high_limbs_range_constraint_2_shift,
539 accumulator_high_limbs_range_constraint_3_shift,
540 accumulators_binary_limbs_3);
541
542 expected_values[4] = check_standard_limb_decomposition(p_y_low_limbs_range_constraint_0,
543 p_y_low_limbs_range_constraint_1,
544 p_y_low_limbs_range_constraint_2,
545 p_y_low_limbs_range_constraint_3,
546 p_y_low_limbs_range_constraint_4,
547 p_y_low_limbs);
548 expected_values[5] = check_standard_limb_decomposition(p_y_low_limbs_range_constraint_0_shift,
549 p_y_low_limbs_range_constraint_1_shift,
550 p_y_low_limbs_range_constraint_2_shift,
551 p_y_low_limbs_range_constraint_3_shift,
552 p_y_low_limbs_range_constraint_4_shift,
553 p_y_low_limbs_shift);
554 expected_values[6] = check_standard_limb_decomposition(p_y_high_limbs_range_constraint_0,
555 p_y_high_limbs_range_constraint_1,
556 p_y_high_limbs_range_constraint_2,
557 p_y_high_limbs_range_constraint_3,
558 p_y_high_limbs_range_constraint_4,
559 p_y_high_limbs);
560 expected_values[7] = check_standard_top_limb_decomposition(p_y_high_limbs_range_constraint_0_shift,
561 p_y_high_limbs_range_constraint_1_shift,
562 p_y_high_limbs_range_constraint_2_shift,
563 p_y_high_limbs_range_constraint_3_shift,
564 p_y_high_limbs_shift);
565 expected_values[8] = check_standard_limb_decomposition(z_low_limbs_range_constraint_0,
566 z_low_limbs_range_constraint_1,
567 z_low_limbs_range_constraint_2,
568 z_low_limbs_range_constraint_3,
569 z_low_limbs_range_constraint_4,
570 z_low_limbs);
571 expected_values[9] = check_standard_limb_decomposition(z_low_limbs_range_constraint_0_shift,
572 z_low_limbs_range_constraint_1_shift,
573 z_low_limbs_range_constraint_2_shift,
574 z_low_limbs_range_constraint_3_shift,
575 z_low_limbs_range_constraint_4_shift,
576 z_low_limbs_shift);
577 expected_values[10] = check_standard_limb_decomposition(z_high_limbs_range_constraint_0,
578 z_high_limbs_range_constraint_1,
579 z_high_limbs_range_constraint_2,
580 z_high_limbs_range_constraint_3,
581 z_high_limbs_range_constraint_4,
582 z_high_limbs);
583 expected_values[11] = check_standard_limb_decomposition(z_high_limbs_range_constraint_0_shift,
584 z_high_limbs_range_constraint_1_shift,
585 z_high_limbs_range_constraint_2_shift,
586 z_high_limbs_range_constraint_3_shift,
587 z_high_limbs_range_constraint_4_shift,
588 z_high_limbs_shift);
589 expected_values[12] = check_standard_limb_decomposition(p_x_low_limbs_range_constraint_0,
590 p_x_low_limbs_range_constraint_1,
591 p_x_low_limbs_range_constraint_2,
592 p_x_low_limbs_range_constraint_3,
593 p_x_low_limbs_range_constraint_4,
594 p_x_low_limbs);
595 expected_values[13] = check_standard_limb_decomposition(p_x_low_limbs_range_constraint_0_shift,
596 p_x_low_limbs_range_constraint_1_shift,
597 p_x_low_limbs_range_constraint_2_shift,
598 p_x_low_limbs_range_constraint_3_shift,
599 p_x_low_limbs_range_constraint_4_shift,
600 p_x_low_limbs_shift);
601 expected_values[14] = check_standard_limb_decomposition(p_x_high_limbs_range_constraint_0,
602 p_x_high_limbs_range_constraint_1,
603 p_x_high_limbs_range_constraint_2,
604 p_x_high_limbs_range_constraint_3,
605 p_x_high_limbs_range_constraint_4,
606 p_x_high_limbs);
607 expected_values[15] = check_standard_top_limb_decomposition(p_x_high_limbs_range_constraint_0_shift,
608 p_x_high_limbs_range_constraint_1_shift,
609 p_x_high_limbs_range_constraint_2_shift,
610 p_x_high_limbs_range_constraint_3_shift,
611 p_x_high_limbs_shift);
612
613 expected_values[16] = check_standard_limb_decomposition(quotient_low_limbs_range_constraint_0,
614 quotient_low_limbs_range_constraint_1,
615 quotient_low_limbs_range_constraint_2,
616 quotient_low_limbs_range_constraint_3,
617 quotient_low_limbs_range_constraint_4,
618 quotient_low_binary_limbs);
619 expected_values[17] = check_standard_limb_decomposition(quotient_low_limbs_range_constraint_0_shift,
620 quotient_low_limbs_range_constraint_1_shift,
621 quotient_low_limbs_range_constraint_2_shift,
622 quotient_low_limbs_range_constraint_3_shift,
623 quotient_low_limbs_range_constraint_4_shift,
624 quotient_low_binary_limbs_shift);
625 expected_values[18] = check_standard_limb_decomposition(quotient_high_limbs_range_constraint_0,
626 quotient_high_limbs_range_constraint_1,
627 quotient_high_limbs_range_constraint_2,
628 quotient_high_limbs_range_constraint_3,
629 quotient_high_limbs_range_constraint_4,
630 quotient_high_binary_limbs);
631 expected_values[19] = check_standard_top_limb_decomposition(quotient_high_limbs_range_constraint_0_shift,
632 quotient_high_limbs_range_constraint_1_shift,
633 quotient_high_limbs_range_constraint_2_shift,
634 quotient_high_limbs_range_constraint_3_shift,
635 quotient_high_binary_limbs_shift);
636
637 expected_values[20] = check_relation_limb_decomposition(relation_wide_limbs_range_constraint_0,
638 relation_wide_limbs_range_constraint_1,
639 relation_wide_limbs_range_constraint_2,
640 relation_wide_limbs_range_constraint_3,
641 p_x_high_limbs_range_constraint_tail_shift,
642 accumulator_high_limbs_range_constraint_tail_shift,
643 relation_wide_limbs);
644 expected_values[21] = check_relation_limb_decomposition(relation_wide_limbs_range_constraint_0_shift,
645 relation_wide_limbs_range_constraint_1_shift,
646 relation_wide_limbs_range_constraint_2_shift,
647 relation_wide_limbs_range_constraint_3_shift,
648 p_y_high_limbs_range_constraint_tail_shift,
649 quotient_high_limbs_range_constraint_tail_shift,
650 relation_wide_limbs_shift);
651
652 // Contributions enforcing tail range constraints (range constraints less than 14 bits)
653 expected_values[22] = check_standard_tail_micro_limb_correctness(p_x_low_limbs_range_constraint_4,
654 p_x_low_limbs_range_constraint_tail);
655
656 expected_values[23] = check_standard_tail_micro_limb_correctness(p_x_low_limbs_range_constraint_4_shift,
657 p_x_low_limbs_range_constraint_tail_shift);
658
659 expected_values[24] = check_standard_tail_micro_limb_correctness(p_x_high_limbs_range_constraint_4,
660 p_x_high_limbs_range_constraint_tail);
661
662 expected_values[25] = check_top_tail_micro_limb_correctness(p_x_high_limbs_range_constraint_3_shift,
663 p_x_high_limbs_range_constraint_4_shift);
664
665 expected_values[26] = check_standard_tail_micro_limb_correctness(p_y_low_limbs_range_constraint_4,
666 p_y_low_limbs_range_constraint_tail);
667
668 expected_values[27] = check_standard_tail_micro_limb_correctness(p_y_low_limbs_range_constraint_4_shift,
669 p_y_low_limbs_range_constraint_tail_shift);
670
671 expected_values[28] = check_standard_tail_micro_limb_correctness(p_y_high_limbs_range_constraint_4,
672 p_y_high_limbs_range_constraint_tail);
673
674 expected_values[29] = check_top_tail_micro_limb_correctness(p_y_high_limbs_range_constraint_3_shift,
675 p_y_high_limbs_range_constraint_4_shift);
676
677 expected_values[30] = check_standard_tail_micro_limb_correctness(z_low_limbs_range_constraint_4,
678 z_low_limbs_range_constraint_tail);
679
680 expected_values[31] = check_standard_tail_micro_limb_correctness(z_low_limbs_range_constraint_4_shift,
681 z_low_limbs_range_constraint_tail_shift);
682
683 expected_values[32] = check_z_top_tail_micro_limb_correctness(z_high_limbs_range_constraint_4,
684 z_high_limbs_range_constraint_tail);
685
686 expected_values[33] = check_z_top_tail_micro_limb_correctness(z_high_limbs_range_constraint_4_shift,
687 z_high_limbs_range_constraint_tail_shift);
688
689 expected_values[34] = check_standard_tail_micro_limb_correctness(accumulator_low_limbs_range_constraint_4,
690 accumulator_low_limbs_range_constraint_tail);
691 expected_values[35] = check_standard_tail_micro_limb_correctness(
692 accumulator_low_limbs_range_constraint_4_shift, accumulator_low_limbs_range_constraint_tail_shift);
693
694 expected_values[36] = check_standard_tail_micro_limb_correctness(accumulator_high_limbs_range_constraint_4,
695 accumulator_high_limbs_range_constraint_tail);
696
697 expected_values[37] = check_top_tail_micro_limb_correctness(accumulator_high_limbs_range_constraint_3_shift,
698 accumulator_high_limbs_range_constraint_4_shift);
699
700 expected_values[38] = check_standard_tail_micro_limb_correctness(quotient_low_limbs_range_constraint_4,
701 quotient_low_limbs_range_constraint_tail);
702
703 expected_values[39] = check_standard_tail_micro_limb_correctness(
704 quotient_low_limbs_range_constraint_4_shift, quotient_low_limbs_range_constraint_tail_shift);
705
706 expected_values[40] = check_standard_tail_micro_limb_correctness(quotient_high_limbs_range_constraint_4,
707 quotient_high_limbs_range_constraint_tail);
708
709 expected_values[41] = check_quotient_top_tail_micro_limb_correctness(
710 quotient_high_limbs_range_constraint_3_shift, quotient_high_limbs_range_constraint_4_shift);
711
712 // Constraints for decomposition of EccOpQueue values
713
714 expected_values[42] =
715 check_wide_limb_into_regular_limb_correctness(p_x_low_limbs, p_x_low_limbs_shift, x_lo_y_hi);
716
717 expected_values[43] =
718 check_wide_limb_into_regular_limb_correctness(p_x_high_limbs, p_x_high_limbs_shift, x_hi_z_1);
719
720 expected_values[44] =
721 check_wide_limb_into_regular_limb_correctness(p_y_low_limbs, p_y_low_limbs_shift, y_lo_z_2);
722
723 expected_values[45] =
724 check_wide_limb_into_regular_limb_correctness(p_y_high_limbs, p_y_high_limbs_shift, x_lo_y_hi_shift);
725
726 expected_values[46] = check_wide_limb_into_regular_limb_correctness(z_low_limbs, z_high_limbs, x_hi_z_1_shift);
727
728 expected_values[47] =
729 check_wide_limb_into_regular_limb_correctness(z_low_limbs_shift, z_high_limbs_shift, y_lo_z_2_shift);
730
731 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
732 };
733 run_test(/*random_inputs=*/false);
734 run_test(/*random_inputs=*/true);
735};
736
737TEST_F(TranslatorRelationConsistency, OpcodeConstraintRelation)
738{
739 const auto run_test = [](bool random_inputs) {
741 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
742
743 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
744 const auto& op = input_elements.op;
745 const auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
746 const auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
747 const auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
748 const auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
749 const auto& accumulators_binary_limbs_0_shift = input_elements.accumulators_binary_limbs_0_shift;
750 const auto& accumulators_binary_limbs_1_shift = input_elements.accumulators_binary_limbs_1_shift;
751 const auto& accumulators_binary_limbs_2_shift = input_elements.accumulators_binary_limbs_2_shift;
752 const auto& accumulators_binary_limbs_3_shift = input_elements.accumulators_binary_limbs_3_shift;
753
754 const auto& lagrange_mini_masking = input_elements.lagrange_mini_masking;
755 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
756
757 RelationValues expected_values;
758
759 const auto parameters = RelationParameters<FF>::get_random();
760
761 // Opcode constraints - ensure op is 0, 3, 4, or 8
762 expected_values[0] = op * (op - FF(3)) * (op - FF(4)) * (op - FF(8)) * (lagrange_mini_masking - FF(1));
763
764 auto shared = (op - FF(3)) * (op - FF(4)) * (op - FF(8)) * lagrange_even_in_minicircuit;
765 expected_values[1] = shared * (accumulators_binary_limbs_0 - accumulators_binary_limbs_0_shift);
766 expected_values[2] = shared * (accumulators_binary_limbs_1 - accumulators_binary_limbs_1_shift);
767 expected_values[3] = shared * (accumulators_binary_limbs_2 - accumulators_binary_limbs_2_shift);
768 expected_values[4] = shared * (accumulators_binary_limbs_3 - accumulators_binary_limbs_3_shift);
769
770 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
771 };
772 run_test(/*random_inputs=*/false);
773 run_test(/*random_inputs=*/true);
774};
775
776TEST_F(TranslatorRelationConsistency, AccumulatorTransferRelation)
777{
778 const auto run_test = [](bool random_inputs) {
780 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
781
782 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
783
784 const auto& lagrange_odd_in_minicircuit = input_elements.lagrange_odd_in_minicircuit;
785 const auto& lagrange_result_row = input_elements.lagrange_result_row;
786 const auto& lagrange_last_in_minicircuit = input_elements.lagrange_last_in_minicircuit;
787 const auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
788 const auto& accumulators_binary_limbs_0_shift = input_elements.accumulators_binary_limbs_0_shift;
789 const auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
790 const auto& accumulators_binary_limbs_1_shift = input_elements.accumulators_binary_limbs_1_shift;
791 const auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
792 const auto& accumulators_binary_limbs_2_shift = input_elements.accumulators_binary_limbs_2_shift;
793 const auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
794 const auto& accumulators_binary_limbs_3_shift = input_elements.accumulators_binary_limbs_3_shift;
795
796 RelationValues expected_values;
797
798 const auto parameters = RelationParameters<FF>::get_random();
799
800 const auto [accumulated_result_0, accumulated_result_1, accumulated_result_2, accumulated_result_3] =
801 parameters.accumulated_result;
802
803 // Check transfer of accumulator at even indices
804 expected_values[0] = lagrange_odd_in_minicircuit * (lagrange_last_in_minicircuit - FF(1)) *
805 (accumulators_binary_limbs_0 - accumulators_binary_limbs_0_shift);
806 expected_values[1] = lagrange_odd_in_minicircuit * (lagrange_last_in_minicircuit - FF(1)) *
807 (accumulators_binary_limbs_1 - accumulators_binary_limbs_1_shift);
808 expected_values[2] = lagrange_odd_in_minicircuit * (lagrange_last_in_minicircuit - FF(1)) *
809 (accumulators_binary_limbs_2 - accumulators_binary_limbs_2_shift);
810 expected_values[3] = lagrange_odd_in_minicircuit * (lagrange_last_in_minicircuit - FF(1)) *
811 (accumulators_binary_limbs_3 - accumulators_binary_limbs_3_shift);
812
813 // Check the accumulator starts as zero
814 expected_values[4] = accumulators_binary_limbs_0 * lagrange_last_in_minicircuit;
815 expected_values[5] = accumulators_binary_limbs_1 * lagrange_last_in_minicircuit;
816 expected_values[6] = accumulators_binary_limbs_2 * lagrange_last_in_minicircuit;
817 expected_values[7] = accumulators_binary_limbs_3 * lagrange_last_in_minicircuit;
818
819 // Check the accumulator results in submitted value
820 expected_values[8] = (accumulators_binary_limbs_0 - accumulated_result_0) * lagrange_result_row;
821 expected_values[9] = (accumulators_binary_limbs_1 - accumulated_result_1) * lagrange_result_row;
822 expected_values[10] = (accumulators_binary_limbs_2 - accumulated_result_2) * lagrange_result_row;
823 expected_values[11] = (accumulators_binary_limbs_3 - accumulated_result_3) * lagrange_result_row;
824 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
825 };
826 run_test(/*random_inputs=*/false);
827 run_test(/*random_inputs=*/true);
828};
829
830TEST_F(TranslatorRelationConsistency, ZeroConstraintsRelation)
831{
832 const auto run_test = [](bool random_inputs) {
834 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
835
836 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
837
838 // Get all the wires
839 const auto& p_x_low_limbs_range_constraint_0 = input_elements.p_x_low_limbs_range_constraint_0;
840 const auto& p_x_low_limbs_range_constraint_1 = input_elements.p_x_low_limbs_range_constraint_1;
841 const auto& p_x_low_limbs_range_constraint_2 = input_elements.p_x_low_limbs_range_constraint_2;
842 const auto& p_x_low_limbs_range_constraint_3 = input_elements.p_x_low_limbs_range_constraint_3;
843 const auto& p_x_low_limbs_range_constraint_4 = input_elements.p_x_low_limbs_range_constraint_4;
844 const auto& p_x_low_limbs_range_constraint_tail = input_elements.p_x_low_limbs_range_constraint_tail;
845 const auto& p_x_high_limbs_range_constraint_0 = input_elements.p_x_high_limbs_range_constraint_0;
846 const auto& p_x_high_limbs_range_constraint_1 = input_elements.p_x_high_limbs_range_constraint_1;
847 const auto& p_x_high_limbs_range_constraint_2 = input_elements.p_x_high_limbs_range_constraint_2;
848 const auto& p_x_high_limbs_range_constraint_3 = input_elements.p_x_high_limbs_range_constraint_3;
849 const auto& p_x_high_limbs_range_constraint_4 = input_elements.p_x_high_limbs_range_constraint_4;
850 const auto& p_x_high_limbs_range_constraint_tail = input_elements.p_x_high_limbs_range_constraint_tail;
851 const auto& p_y_low_limbs_range_constraint_0 = input_elements.p_y_low_limbs_range_constraint_0;
852 const auto& p_y_low_limbs_range_constraint_1 = input_elements.p_y_low_limbs_range_constraint_1;
853 const auto& p_y_low_limbs_range_constraint_2 = input_elements.p_y_low_limbs_range_constraint_2;
854 const auto& p_y_low_limbs_range_constraint_3 = input_elements.p_y_low_limbs_range_constraint_3;
855 const auto& p_y_low_limbs_range_constraint_4 = input_elements.p_y_low_limbs_range_constraint_4;
856 const auto& p_y_low_limbs_range_constraint_tail = input_elements.p_y_low_limbs_range_constraint_tail;
857 const auto& p_y_high_limbs_range_constraint_0 = input_elements.p_y_high_limbs_range_constraint_0;
858 const auto& p_y_high_limbs_range_constraint_1 = input_elements.p_y_high_limbs_range_constraint_1;
859 const auto& p_y_high_limbs_range_constraint_2 = input_elements.p_y_high_limbs_range_constraint_2;
860 const auto& p_y_high_limbs_range_constraint_3 = input_elements.p_y_high_limbs_range_constraint_3;
861 const auto& p_y_high_limbs_range_constraint_4 = input_elements.p_y_high_limbs_range_constraint_4;
862 const auto& p_y_high_limbs_range_constraint_tail = input_elements.p_y_high_limbs_range_constraint_tail;
863 const auto& z_low_limbs_range_constraint_0 = input_elements.z_low_limbs_range_constraint_0;
864 const auto& z_low_limbs_range_constraint_1 = input_elements.z_low_limbs_range_constraint_1;
865 const auto& z_low_limbs_range_constraint_2 = input_elements.z_low_limbs_range_constraint_2;
866 const auto& z_low_limbs_range_constraint_3 = input_elements.z_low_limbs_range_constraint_3;
867 const auto& z_low_limbs_range_constraint_4 = input_elements.z_low_limbs_range_constraint_4;
868 const auto& z_low_limbs_range_constraint_tail = input_elements.z_low_limbs_range_constraint_tail;
869 const auto& z_high_limbs_range_constraint_0 = input_elements.z_high_limbs_range_constraint_0;
870 const auto& z_high_limbs_range_constraint_1 = input_elements.z_high_limbs_range_constraint_1;
871 const auto& z_high_limbs_range_constraint_2 = input_elements.z_high_limbs_range_constraint_2;
872 const auto& z_high_limbs_range_constraint_3 = input_elements.z_high_limbs_range_constraint_3;
873 const auto& z_high_limbs_range_constraint_4 = input_elements.z_high_limbs_range_constraint_4;
874 const auto& z_high_limbs_range_constraint_tail = input_elements.z_high_limbs_range_constraint_tail;
875 const auto& accumulator_low_limbs_range_constraint_0 = input_elements.accumulator_low_limbs_range_constraint_0;
876 const auto& accumulator_low_limbs_range_constraint_1 = input_elements.accumulator_low_limbs_range_constraint_1;
877 const auto& accumulator_low_limbs_range_constraint_2 = input_elements.accumulator_low_limbs_range_constraint_2;
878 const auto& accumulator_low_limbs_range_constraint_3 = input_elements.accumulator_low_limbs_range_constraint_3;
879 const auto& accumulator_low_limbs_range_constraint_4 = input_elements.accumulator_low_limbs_range_constraint_4;
880 const auto& accumulator_low_limbs_range_constraint_tail =
881 input_elements.accumulator_low_limbs_range_constraint_tail;
882 const auto& accumulator_high_limbs_range_constraint_0 =
883 input_elements.accumulator_high_limbs_range_constraint_0;
884 const auto& accumulator_high_limbs_range_constraint_1 =
885 input_elements.accumulator_high_limbs_range_constraint_1;
886 const auto& accumulator_high_limbs_range_constraint_2 =
887 input_elements.accumulator_high_limbs_range_constraint_2;
888 const auto& accumulator_high_limbs_range_constraint_3 =
889 input_elements.accumulator_high_limbs_range_constraint_3;
890 const auto& accumulator_high_limbs_range_constraint_4 =
891 input_elements.accumulator_high_limbs_range_constraint_4;
892 const auto& accumulator_high_limbs_range_constraint_tail =
893 input_elements.accumulator_high_limbs_range_constraint_tail;
894 const auto& quotient_low_limbs_range_constraint_0 = input_elements.quotient_low_limbs_range_constraint_0;
895 const auto& quotient_low_limbs_range_constraint_1 = input_elements.quotient_low_limbs_range_constraint_1;
896 const auto& quotient_low_limbs_range_constraint_2 = input_elements.quotient_low_limbs_range_constraint_2;
897 const auto& quotient_low_limbs_range_constraint_3 = input_elements.quotient_low_limbs_range_constraint_3;
898 const auto& quotient_low_limbs_range_constraint_4 = input_elements.quotient_low_limbs_range_constraint_4;
899 const auto& quotient_low_limbs_range_constraint_tail = input_elements.quotient_low_limbs_range_constraint_tail;
900 const auto& quotient_high_limbs_range_constraint_0 = input_elements.quotient_high_limbs_range_constraint_0;
901 const auto& quotient_high_limbs_range_constraint_1 = input_elements.quotient_high_limbs_range_constraint_1;
902 const auto& quotient_high_limbs_range_constraint_2 = input_elements.quotient_high_limbs_range_constraint_2;
903 const auto& quotient_high_limbs_range_constraint_3 = input_elements.quotient_high_limbs_range_constraint_3;
904 const auto& quotient_high_limbs_range_constraint_4 = input_elements.quotient_high_limbs_range_constraint_4;
905 const auto& quotient_high_limbs_range_constraint_tail =
906 input_elements.quotient_high_limbs_range_constraint_tail;
907 const auto& relation_wide_limbs_range_constraint_0 = input_elements.relation_wide_limbs_range_constraint_0;
908 const auto& relation_wide_limbs_range_constraint_1 = input_elements.relation_wide_limbs_range_constraint_1;
909 const auto& relation_wide_limbs_range_constraint_2 = input_elements.relation_wide_limbs_range_constraint_2;
910 const auto& relation_wide_limbs_range_constraint_3 = input_elements.relation_wide_limbs_range_constraint_3;
911 const auto& op = input_elements.op;
912 const auto& x_lo_y_hi = input_elements.x_lo_y_hi;
913 const auto& x_hi_z_1 = input_elements.x_hi_z_1;
914 const auto& y_lo_z_2 = input_elements.y_lo_z_2;
915 const auto& lagrange_odd_in_minicircuit = input_elements.lagrange_odd_in_minicircuit;
916 const auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
917 const auto& lagrange_mini_masking = input_elements.lagrange_mini_masking;
918
919 RelationValues expected_values;
920
921 const auto parameters = RelationParameters<FF>::get_random();
922
923 // 0 in the minicircuit, -1 outside (matches the implementation)
924 const auto not_in_minicircuit_or_masked =
925 lagrange_even_in_minicircuit + lagrange_odd_in_minicircuit + lagrange_mini_masking - FF(1);
926
927 expected_values[0] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_0;
928 expected_values[1] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_1;
929 expected_values[2] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_2;
930 expected_values[3] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_3;
931 expected_values[4] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_4;
932 expected_values[5] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_0;
933 expected_values[6] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_1;
934 expected_values[7] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_2;
935 expected_values[8] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_3;
936 expected_values[9] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_4;
937 expected_values[10] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_0;
938 expected_values[11] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_1;
939 expected_values[12] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_2;
940 expected_values[13] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_3;
941 expected_values[14] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_4;
942 expected_values[15] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_0;
943 expected_values[16] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_1;
944 expected_values[17] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_2;
945 expected_values[18] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_3;
946 expected_values[19] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_4;
947 expected_values[20] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_0;
948 expected_values[21] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_1;
949 expected_values[22] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_2;
950 expected_values[23] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_3;
951 expected_values[24] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_4;
952 expected_values[25] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_0;
953 expected_values[26] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_1;
954 expected_values[27] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_2;
955 expected_values[28] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_3;
956 expected_values[29] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_4;
957 expected_values[30] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_0;
958 expected_values[31] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_1;
959 expected_values[32] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_2;
960 expected_values[33] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_3;
961 expected_values[34] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_4;
962 expected_values[35] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_0;
963 expected_values[36] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_1;
964 expected_values[37] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_2;
965 expected_values[38] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_3;
966 expected_values[39] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_4;
967 expected_values[40] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_0;
968 expected_values[41] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_1;
969 expected_values[42] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_2;
970 expected_values[43] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_3;
971 expected_values[44] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_4;
972 expected_values[45] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_0;
973 expected_values[46] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_1;
974 expected_values[47] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_2;
975 expected_values[48] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_3;
976 expected_values[49] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_4;
977 expected_values[50] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_0;
978 expected_values[51] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_1;
979 expected_values[52] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_2;
980 expected_values[53] = not_in_minicircuit_or_masked * relation_wide_limbs_range_constraint_3;
981 expected_values[54] = not_in_minicircuit_or_masked * p_x_low_limbs_range_constraint_tail;
982 expected_values[55] = not_in_minicircuit_or_masked * p_x_high_limbs_range_constraint_tail;
983 expected_values[56] = not_in_minicircuit_or_masked * p_y_low_limbs_range_constraint_tail;
984 expected_values[57] = not_in_minicircuit_or_masked * p_y_high_limbs_range_constraint_tail;
985 expected_values[58] = not_in_minicircuit_or_masked * z_low_limbs_range_constraint_tail;
986 expected_values[59] = not_in_minicircuit_or_masked * z_high_limbs_range_constraint_tail;
987 expected_values[60] = not_in_minicircuit_or_masked * accumulator_low_limbs_range_constraint_tail;
988 expected_values[61] = not_in_minicircuit_or_masked * accumulator_high_limbs_range_constraint_tail;
989 expected_values[62] = not_in_minicircuit_or_masked * quotient_low_limbs_range_constraint_tail;
990 expected_values[63] = not_in_minicircuit_or_masked * quotient_high_limbs_range_constraint_tail;
991 expected_values[64] = not_in_minicircuit_or_masked * op;
992 expected_values[65] = not_in_minicircuit_or_masked * x_lo_y_hi;
993 expected_values[66] = not_in_minicircuit_or_masked * x_hi_z_1;
994 expected_values[67] = not_in_minicircuit_or_masked * y_lo_z_2;
995
996 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
997 };
998 run_test(/*random_inputs=*/false);
999 run_test(/*random_inputs=*/true);
1000};
1001
1003{
1004 const auto run_test = [](bool random_inputs) {
1005 const size_t NUM_LIMB_BITS = 68;
1006 const FF shift = FF(uint256_t(1) << NUM_LIMB_BITS);
1007 const FF shiftx2 = FF(uint256_t(1) << (NUM_LIMB_BITS * 2));
1008 const FF shiftx3 = FF(uint256_t(1) << (NUM_LIMB_BITS * 3));
1010 const uint512_t BINARY_BASIS_MODULUS = uint512_t(1) << (NUM_LIMB_BITS << 2);
1011 const uint512_t NEGATIVE_PRIME_MODULUS = BINARY_BASIS_MODULUS - MODULUS_U512;
1012 const std::array<FF, 5> NEGATIVE_MODULUS_LIMBS = {
1013 FF(NEGATIVE_PRIME_MODULUS.slice(0, NUM_LIMB_BITS).lo),
1014 FF(NEGATIVE_PRIME_MODULUS.slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2).lo),
1015 FF(NEGATIVE_PRIME_MODULUS.slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3).lo),
1016 FF(NEGATIVE_PRIME_MODULUS.slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4).lo),
1018 };
1019
1021 using RelationValues = typename Relation::SumcheckArrayOfValuesOverSubrelations;
1022
1023 const InputElements input_elements = random_inputs ? get_random_input() : get_special_input();
1024
1025 auto& op = input_elements.op;
1026 auto& p_x_low_limbs = input_elements.p_x_low_limbs;
1027 auto& p_y_low_limbs = input_elements.p_y_low_limbs;
1028 auto& p_x_high_limbs = input_elements.p_x_high_limbs;
1029 auto& p_y_high_limbs = input_elements.p_y_high_limbs;
1030 auto& accumulators_binary_limbs_0 = input_elements.accumulators_binary_limbs_0;
1031 auto& accumulators_binary_limbs_1 = input_elements.accumulators_binary_limbs_1;
1032 auto& accumulators_binary_limbs_2 = input_elements.accumulators_binary_limbs_2;
1033 auto& accumulators_binary_limbs_3 = input_elements.accumulators_binary_limbs_3;
1034 auto& z_low_limbs = input_elements.z_low_limbs;
1035 auto& z_high_limbs = input_elements.z_high_limbs;
1036 auto& quotient_low_binary_limbs = input_elements.quotient_low_binary_limbs;
1037 auto& quotient_high_binary_limbs = input_elements.quotient_high_binary_limbs;
1038 auto& p_x_low_limbs_shift = input_elements.p_x_low_limbs_shift;
1039 auto& p_y_low_limbs_shift = input_elements.p_y_low_limbs_shift;
1040 auto& p_x_high_limbs_shift = input_elements.p_x_high_limbs_shift;
1041 auto& p_y_high_limbs_shift = input_elements.p_y_high_limbs_shift;
1042 auto& accumulators_binary_limbs_0_shift = input_elements.accumulators_binary_limbs_0_shift;
1043 auto& accumulators_binary_limbs_1_shift = input_elements.accumulators_binary_limbs_1_shift;
1044 auto& accumulators_binary_limbs_2_shift = input_elements.accumulators_binary_limbs_2_shift;
1045 auto& accumulators_binary_limbs_3_shift = input_elements.accumulators_binary_limbs_3_shift;
1046 auto& z_low_limbs_shift = input_elements.z_low_limbs_shift;
1047 auto& z_high_limbs_shift = input_elements.z_high_limbs_shift;
1048 auto& quotient_low_binary_limbs_shift = input_elements.quotient_low_binary_limbs_shift;
1049 auto& quotient_high_binary_limbs_shift = input_elements.quotient_high_binary_limbs_shift;
1050 auto& relation_wide_limbs = input_elements.relation_wide_limbs;
1051 auto& relation_wide_limbs_shift = input_elements.relation_wide_limbs_shift;
1052 auto& lagrange_even_in_minicircuit = input_elements.lagrange_even_in_minicircuit;
1053
1054 RelationValues expected_values;
1055
1056 const auto parameters = RelationParameters<FF>::get_random();
1057
1058 // A detailed description of these subrelations is located in the relation's documentation
1059
1060 // Lower wide limb (lower 136 bits) subrelation
1061 expected_values[0] =
1062 (accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[0] + op +
1063 p_x_low_limbs * parameters.batching_challenge_v[0][0] +
1064 p_y_low_limbs * parameters.batching_challenge_v[1][0] +
1065 z_low_limbs * parameters.batching_challenge_v[2][0] +
1066 z_low_limbs_shift * parameters.batching_challenge_v[3][0] +
1067 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[0] - accumulators_binary_limbs_0 +
1068 (accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[0] +
1069 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[1] +
1070 p_x_low_limbs * parameters.batching_challenge_v[0][1] +
1071 p_x_low_limbs_shift * parameters.batching_challenge_v[0][0] +
1072 p_y_low_limbs * parameters.batching_challenge_v[1][1] +
1073 p_y_low_limbs_shift * parameters.batching_challenge_v[1][0] +
1074 z_low_limbs * parameters.batching_challenge_v[2][1] +
1075 z_high_limbs * parameters.batching_challenge_v[2][0] +
1076 z_low_limbs_shift * parameters.batching_challenge_v[3][1] +
1077 z_high_limbs_shift * parameters.batching_challenge_v[3][0] +
1078 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[1] +
1079 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0] - accumulators_binary_limbs_1) *
1080 shift -
1081 relation_wide_limbs * shiftx2) *
1082 lagrange_even_in_minicircuit * op;
1083
1084 // Higher wide limb subrelation
1085 expected_values[1] =
1086 (relation_wide_limbs + accumulators_binary_limbs_2_shift * parameters.evaluation_input_x[0] +
1087 accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[1] +
1088 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[2] +
1089 p_x_high_limbs * parameters.batching_challenge_v[0][0] +
1090 p_x_low_limbs_shift * parameters.batching_challenge_v[0][1] +
1091 p_x_low_limbs * parameters.batching_challenge_v[0][2] +
1092 p_y_high_limbs * parameters.batching_challenge_v[1][0] +
1093 p_y_low_limbs_shift * parameters.batching_challenge_v[1][1] +
1094 p_y_low_limbs * parameters.batching_challenge_v[1][2] +
1095 z_high_limbs * parameters.batching_challenge_v[2][1] +
1096 z_low_limbs * parameters.batching_challenge_v[2][2] +
1097 z_high_limbs_shift * parameters.batching_challenge_v[3][1] +
1098 z_low_limbs_shift * parameters.batching_challenge_v[3][2] +
1099 quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[0] +
1100 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[1] +
1101 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[2] - accumulators_binary_limbs_2 +
1102 (accumulators_binary_limbs_3_shift * parameters.evaluation_input_x[0] +
1103 accumulators_binary_limbs_2_shift * parameters.evaluation_input_x[1] +
1104 accumulators_binary_limbs_1_shift * parameters.evaluation_input_x[2] +
1105 accumulators_binary_limbs_0_shift * parameters.evaluation_input_x[3] +
1106 p_x_high_limbs_shift * parameters.batching_challenge_v[0][0] +
1107 p_x_high_limbs * parameters.batching_challenge_v[0][1] +
1108 p_x_low_limbs_shift * parameters.batching_challenge_v[0][2] +
1109 p_x_low_limbs * parameters.batching_challenge_v[0][3] +
1110 p_y_high_limbs_shift * parameters.batching_challenge_v[1][0] +
1111 p_y_high_limbs * parameters.batching_challenge_v[1][1] +
1112 p_y_low_limbs_shift * parameters.batching_challenge_v[1][2] +
1113 p_y_low_limbs * parameters.batching_challenge_v[1][3] +
1114 z_high_limbs * parameters.batching_challenge_v[2][2] +
1115 z_low_limbs * parameters.batching_challenge_v[2][3] +
1116 z_high_limbs_shift * parameters.batching_challenge_v[3][2] +
1117 z_low_limbs_shift * parameters.batching_challenge_v[3][3] +
1118 quotient_high_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0] +
1119 quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[1] +
1120 quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[2] +
1121 quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[3] - accumulators_binary_limbs_3) *
1122 shift -
1123 relation_wide_limbs_shift * shiftx2) *
1124 lagrange_even_in_minicircuit * op;
1125 auto reconstructed_p_x =
1126 (p_x_low_limbs + p_x_low_limbs_shift * shift + p_x_high_limbs * shiftx2 + p_x_high_limbs_shift * shiftx3);
1127 auto reconstructed_p_y =
1128 (p_y_low_limbs + p_y_low_limbs_shift * shift + p_y_high_limbs * shiftx2 + p_y_high_limbs_shift * shiftx3);
1129 auto reconstructed_previous_accumulator =
1130 (accumulators_binary_limbs_0_shift + accumulators_binary_limbs_1_shift * shift +
1131 accumulators_binary_limbs_2_shift * shiftx2 + accumulators_binary_limbs_3_shift * shiftx3);
1132 auto reconstructed_current_accumulator =
1133 (accumulators_binary_limbs_0 + accumulators_binary_limbs_1 * shift + accumulators_binary_limbs_2 * shiftx2 +
1134 accumulators_binary_limbs_3 * shiftx3);
1135 auto reconstructed_z1 = (z_low_limbs + z_high_limbs * shift);
1136 auto reconstructed_z2 = (z_low_limbs_shift + z_high_limbs_shift * shift);
1137 auto reconstructed_quotient =
1138 (quotient_low_binary_limbs + quotient_low_binary_limbs_shift * shift +
1139 quotient_high_binary_limbs * shiftx2 + quotient_high_binary_limbs_shift * shiftx3);
1140
1141 // Native field relation
1142 expected_values[2] = (reconstructed_previous_accumulator * parameters.evaluation_input_x[4] + op +
1143 reconstructed_p_x * parameters.batching_challenge_v[0][4] +
1144 reconstructed_p_y * parameters.batching_challenge_v[1][4] +
1145 reconstructed_z1 * parameters.batching_challenge_v[2][4] +
1146 reconstructed_z2 * parameters.batching_challenge_v[3][4] +
1147 reconstructed_quotient * NEGATIVE_MODULUS_LIMBS[4] - reconstructed_current_accumulator) *
1148 lagrange_even_in_minicircuit * op;
1149
1150 validate_relation_execution<Relation>(expected_values, input_elements, parameters);
1151 };
1152 run_test(/*random_inputs=*/false);
1153 run_test(/*random_inputs=*/true);
1154};
static void validate_relation_execution(const auto &expected_values, const InputElements &input_elements, const auto &parameters)
A field element for each entity of the flavor. These entities represent the prover polynomials evalua...
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
ArrayOfValues< FF, RelationImpl::SUBRELATION_PARTIAL_LENGTHS > SumcheckArrayOfValuesOverSubrelations
Curve::ScalarField FF
constexpr uintx slice(const uint64_t start, const uint64_t end) const
Definition uintx.hpp:81
uintx< uint256_t > uint512_t
Definition uintx.hpp:309
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:155
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static RelationParameters get_random()
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
typename Flavor::FF FF
InputElements get_random_input()
InputElements get_special_input()