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