80 const AllEntities& in,
81 const Parameters& params,
82 const FF& scaling_factor)
88 static constexpr size_t NUM_LIMB_BITS = 68;
90 static const FF shiftx2 =
FF(
uint256_t(1) << (NUM_LIMB_BITS * 2));
91 static const FF shiftx3 =
FF(
uint256_t(1) << (NUM_LIMB_BITS * 3));
93 TranslatorCircuitBuilder::compute_negative_modulus_limbs<FF>();
96 const auto& evaluation_input_x_0 = params.evaluation_input_x[0];
97 const auto& evaluation_input_x_1 = params.evaluation_input_x[1];
98 const auto& evaluation_input_x_2 = params.evaluation_input_x[2];
99 const auto& evaluation_input_x_3 = params.evaluation_input_x[3];
100 const auto& evaluation_input_x_4 = params.evaluation_input_x[4];
103 const auto& v_0 = params.batching_challenge_v[0][0];
104 const auto& v_1 = params.batching_challenge_v[0][1];
105 const auto& v_2 = params.batching_challenge_v[0][2];
106 const auto& v_3 = params.batching_challenge_v[0][3];
107 const auto& v_4 = params.batching_challenge_v[0][4];
110 const auto& v_sqr_0 = params.batching_challenge_v[1][0];
111 const auto& v_sqr_1 = params.batching_challenge_v[1][1];
112 const auto& v_sqr_2 = params.batching_challenge_v[1][2];
113 const auto& v_sqr_3 = params.batching_challenge_v[1][3];
114 const auto& v_sqr_4 = params.batching_challenge_v[1][4];
117 const auto& v_cube_0 = params.batching_challenge_v[2][0];
118 const auto& v_cube_1 = params.batching_challenge_v[2][1];
119 const auto& v_cube_2 = params.batching_challenge_v[2][2];
120 const auto& v_cube_3 = params.batching_challenge_v[2][3];
121 const auto& v_cube_4 = params.batching_challenge_v[2][4];
124 const auto& v_quad_0 = params.batching_challenge_v[3][0];
125 const auto& v_quad_1 = params.batching_challenge_v[3][1];
126 const auto& v_quad_2 = params.batching_challenge_v[3][2];
127 const auto& v_quad_3 = params.batching_challenge_v[3][3];
128 const auto& v_quad_4 = params.batching_challenge_v[3][4];
136 const auto& op = View(in.op);
137 const auto& p_x_limb_0 = View(in.p_x_low_limbs);
138 const auto& p_y_limb_0 = View(in.p_y_low_limbs);
139 const auto& p_x_limb_2 = View(in.p_x_high_limbs);
140 const auto& p_y_limb_2 = View(in.p_y_high_limbs);
141 const auto& accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
142 const auto& accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
143 const auto& accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
144 const auto& accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
145 const auto& z_first_limb_0 = View(in.z_low_limbs);
146 const auto& z_first_limb_1 = View(in.z_high_limbs);
147 const auto& quotient_binary_limbs_0 = View(in.quotient_low_binary_limbs);
148 const auto& quotient_binary_limbs_1 = View(in.quotient_low_binary_limbs_shift);
149 const auto& p_x_limb_1 = View(in.p_x_low_limbs_shift);
150 const auto& p_y_limb_1 = View(in.p_y_low_limbs_shift);
151 const auto& p_x_limb_3 = View(in.p_x_high_limbs_shift);
152 const auto& p_y_limb_3 = View(in.p_y_high_limbs_shift);
153 const auto& prev_accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0_shift);
154 const auto& prev_accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1_shift);
155 const auto& prev_accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2_shift);
156 const auto& prev_accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3_shift);
157 const auto& z_second_limb_0 = View(in.z_low_limbs_shift);
158 const auto& z_second_limb_1 = View(in.z_high_limbs_shift);
159 const auto& quotient_binary_limbs_2 = View(in.quotient_high_binary_limbs);
160 const auto& quotient_binary_limbs_3 = View(in.quotient_high_binary_limbs_shift);
161 const auto& relation_wide_limbs_lo = View(in.relation_wide_limbs);
162 const auto& relation_wide_limbs_hi = View(in.relation_wide_limbs_shift);
163 const auto& lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
164 const auto even_op_selector_scaled = Accumulator(lagrange_even_in_minicircuit * (op * scaling_factor));
176 auto tmp = prev_accumulators_binary_limbs_0 * evaluation_input_x_0
179 + p_y_limb_0 * v_sqr_0
180 + z_first_limb_0 * v_cube_0
181 + z_second_limb_0 * v_quad_0
182 + quotient_binary_limbs_0 * NEGATIVE_MODULUS_LIMBS[0]
183 - accumulators_binary_limbs_0;
186 tmp += (prev_accumulators_binary_limbs_1 * evaluation_input_x_0
187 + prev_accumulators_binary_limbs_0 * evaluation_input_x_1
190 + p_y_limb_0 * v_sqr_1
191 + p_y_limb_1 * v_sqr_0
192 + z_first_limb_0 * v_cube_1
193 + z_first_limb_1 * v_cube_0
194 + z_second_limb_0 * v_quad_1
195 + z_second_limb_1 * v_quad_0
196 + quotient_binary_limbs_0 * NEGATIVE_MODULUS_LIMBS[1]
197 + quotient_binary_limbs_1 * NEGATIVE_MODULUS_LIMBS[0]
198 - accumulators_binary_limbs_1)
202 tmp -= relation_wide_limbs_lo * shiftx2;
203 std::get<0>(accumulators) += Accumulator(tmp) * even_op_selector_scaled;
216 tmp = relation_wide_limbs_lo
217 + prev_accumulators_binary_limbs_2 * evaluation_input_x_0
218 + prev_accumulators_binary_limbs_1 * evaluation_input_x_1
219 + prev_accumulators_binary_limbs_0 * evaluation_input_x_2
223 + p_y_limb_2 * v_sqr_0
224 + p_y_limb_1 * v_sqr_1
225 + p_y_limb_0 * v_sqr_2
226 + z_first_limb_1 * v_cube_1
227 + z_first_limb_0 * v_cube_2
228 + z_second_limb_1 * v_quad_1
229 + z_second_limb_0 * v_quad_2
230 + quotient_binary_limbs_2 * NEGATIVE_MODULUS_LIMBS[0]
231 + quotient_binary_limbs_1 * NEGATIVE_MODULUS_LIMBS[1]
232 + quotient_binary_limbs_0 * NEGATIVE_MODULUS_LIMBS[2]
233 - accumulators_binary_limbs_2;
236 tmp += (prev_accumulators_binary_limbs_3 * evaluation_input_x_0
237 + prev_accumulators_binary_limbs_2 * evaluation_input_x_1
238 + prev_accumulators_binary_limbs_1 * evaluation_input_x_2
239 + prev_accumulators_binary_limbs_0 * evaluation_input_x_3
244 + p_y_limb_3 * v_sqr_0
245 + p_y_limb_2 * v_sqr_1
246 + p_y_limb_1 * v_sqr_2
247 + p_y_limb_0 * v_sqr_3
248 + z_first_limb_1 * v_cube_2
249 + z_first_limb_0 * v_cube_3
250 + z_second_limb_1 * v_quad_2
251 + z_second_limb_0 * v_quad_3
252 + quotient_binary_limbs_3 * NEGATIVE_MODULUS_LIMBS[0]
253 + quotient_binary_limbs_2 * NEGATIVE_MODULUS_LIMBS[1]
254 + quotient_binary_limbs_1 * NEGATIVE_MODULUS_LIMBS[2]
255 + quotient_binary_limbs_0 * NEGATIVE_MODULUS_LIMBS[3]
256 - accumulators_binary_limbs_3)
260 tmp -= relation_wide_limbs_hi * shiftx2;
261 std::get<1>(accumulators) += Accumulator(tmp) * even_op_selector_scaled;
264 const auto reconstruct_from_two = [](
const auto& l0,
const auto& l1) {
return l0 + l1 * shift; };
266 const auto reconstruct_from_four = [](
const auto& l0,
const auto& l1,
const auto& l2,
const auto& l3) {
267 return l0 + l1 * shift + l2 * shiftx2 + l3 * shiftx3;
271 auto reconstructed_p_x = reconstruct_from_four(p_x_limb_0, p_x_limb_1, p_x_limb_2, p_x_limb_3);
272 auto reconstructed_p_y = reconstruct_from_four(p_y_limb_0, p_y_limb_1, p_y_limb_2, p_y_limb_3);
273 auto reconstructed_previous_accumulator = reconstruct_from_four(prev_accumulators_binary_limbs_0,
274 prev_accumulators_binary_limbs_1,
275 prev_accumulators_binary_limbs_2,
276 prev_accumulators_binary_limbs_3);
277 auto reconstructed_current_accumulator = reconstruct_from_four(accumulators_binary_limbs_0,
278 accumulators_binary_limbs_1,
279 accumulators_binary_limbs_2,
280 accumulators_binary_limbs_3);
281 auto reconstructed_z1 = reconstruct_from_two(z_first_limb_0, z_first_limb_1);
282 auto reconstructed_z2 = reconstruct_from_two(z_second_limb_0, z_second_limb_1);
283 auto reconstructed_quotient = reconstruct_from_four(
284 quotient_binary_limbs_0, quotient_binary_limbs_1, quotient_binary_limbs_2, quotient_binary_limbs_3);
296 tmp = reconstructed_previous_accumulator * evaluation_input_x_4
298 + reconstructed_p_x * v_4
299 + reconstructed_p_y * v_sqr_4
300 + reconstructed_z1 * v_cube_4
301 + reconstructed_z2 * v_quad_4
302 + reconstructed_quotient * NEGATIVE_MODULUS_LIMBS[4]
303 - reconstructed_current_accumulator;
305 std::get<2>(accumulators) += Accumulator(tmp) * even_op_selector_scaled;