78 const AllEntities& in,
79 const Parameters& params,
80 const FF& scaling_factor)
84 using View =
typename Accumulator::View;
86 static constexpr size_t NUM_LIMB_BITS = 68;
92 static uint512_t NEGATIVE_PRIME_MODULUS = BINARY_BASIS_MODULUS - MODULUS_U512;
94 FF(NEGATIVE_PRIME_MODULUS.
slice(0, NUM_LIMB_BITS).
lo),
95 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2).
lo),
96 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3).
lo),
97 FF(NEGATIVE_PRIME_MODULUS.
slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4).
lo),
101 const auto& evaluation_input_x_0 = params.evaluation_input_x[0];
102 const auto& evaluation_input_x_1 = params.evaluation_input_x[1];
103 const auto& evaluation_input_x_2 = params.evaluation_input_x[2];
104 const auto& evaluation_input_x_3 = params.evaluation_input_x[3];
105 const auto& evaluation_input_x_4 = params.evaluation_input_x[4];
108 const auto& v_0_0 = params.batching_challenge_v[0][0];
109 const auto& v_0_1 = params.batching_challenge_v[0][1];
110 const auto& v_0_2 = params.batching_challenge_v[0][2];
111 const auto& v_0_3 = params.batching_challenge_v[0][3];
112 const auto& v_0_4 = params.batching_challenge_v[0][4];
113 const auto& v_1_0 = params.batching_challenge_v[1][0];
114 const auto& v_1_1 = params.batching_challenge_v[1][1];
115 const auto& v_1_2 = params.batching_challenge_v[1][2];
116 const auto& v_1_3 = params.batching_challenge_v[1][3];
117 const auto& v_1_4 = params.batching_challenge_v[1][4];
118 const auto& v_2_0 = params.batching_challenge_v[2][0];
119 const auto& v_2_1 = params.batching_challenge_v[2][1];
120 const auto& v_2_2 = params.batching_challenge_v[2][2];
121 const auto& v_2_3 = params.batching_challenge_v[2][3];
122 const auto& v_2_4 = params.batching_challenge_v[2][4];
123 const auto& v_3_0 = params.batching_challenge_v[3][0];
124 const auto& v_3_1 = params.batching_challenge_v[3][1];
125 const auto& v_3_2 = params.batching_challenge_v[3][2];
126 const auto& v_3_3 = params.batching_challenge_v[3][3];
127 const auto& v_3_4 = params.batching_challenge_v[3][4];
129 const auto& op = View(in.op);
130 const auto& p_x_low_limbs = View(in.p_x_low_limbs);
131 const auto& p_y_low_limbs = View(in.p_y_low_limbs);
132 const auto& p_x_high_limbs = View(in.p_x_high_limbs);
133 const auto& p_y_high_limbs = View(in.p_y_high_limbs);
134 const auto& accumulators_binary_limbs_0 = View(in.accumulators_binary_limbs_0);
135 const auto& accumulators_binary_limbs_1 = View(in.accumulators_binary_limbs_1);
136 const auto& accumulators_binary_limbs_2 = View(in.accumulators_binary_limbs_2);
137 const auto& accumulators_binary_limbs_3 = View(in.accumulators_binary_limbs_3);
138 const auto& z_low_limbs = View(in.z_low_limbs);
139 const auto& z_high_limbs = View(in.z_high_limbs);
140 const auto& quotient_low_binary_limbs = View(in.quotient_low_binary_limbs);
141 const auto& quotient_high_binary_limbs = View(in.quotient_high_binary_limbs);
142 const auto& p_x_low_limbs_shift = View(in.p_x_low_limbs_shift);
143 const auto& p_y_low_limbs_shift = View(in.p_y_low_limbs_shift);
144 const auto& p_x_high_limbs_shift = View(in.p_x_high_limbs_shift);
145 const auto& p_y_high_limbs_shift = View(in.p_y_high_limbs_shift);
146 const auto& accumulators_binary_limbs_0_shift = View(in.accumulators_binary_limbs_0_shift);
147 const auto& accumulators_binary_limbs_1_shift = View(in.accumulators_binary_limbs_1_shift);
148 const auto& accumulators_binary_limbs_2_shift = View(in.accumulators_binary_limbs_2_shift);
149 const auto& accumulators_binary_limbs_3_shift = View(in.accumulators_binary_limbs_3_shift);
150 const auto& z_low_limbs_shift = View(in.z_low_limbs_shift);
151 const auto& z_high_limbs_shift = View(in.z_high_limbs_shift);
152 const auto& quotient_low_binary_limbs_shift = View(in.quotient_low_binary_limbs_shift);
153 const auto& quotient_high_binary_limbs_shift = View(in.quotient_high_binary_limbs_shift);
154 const auto& relation_wide_limbs = View(in.relation_wide_limbs);
155 const auto& relation_wide_limbs_shift = View(in.relation_wide_limbs_shift);
156 const auto& lagrange_even_in_minicircuit = View(in.lagrange_even_in_minicircuit);
161 auto tmp = accumulators_binary_limbs_0_shift * evaluation_input_x_0
163 + p_x_low_limbs * v_0_0
164 + p_y_low_limbs * v_1_0
165 + z_low_limbs * v_2_0
166 + z_low_limbs_shift * v_3_0
167 + quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[0]
168 - accumulators_binary_limbs_0;
171 tmp += (accumulators_binary_limbs_1_shift * evaluation_input_x_0
172 + accumulators_binary_limbs_0_shift * evaluation_input_x_1
173 + p_x_low_limbs * v_0_1
174 + p_x_low_limbs_shift * v_0_0
175 + p_y_low_limbs * v_1_1
176 + p_y_low_limbs_shift * v_1_0
177 + z_low_limbs * v_2_1
178 + z_high_limbs * v_2_0
179 + z_low_limbs_shift * v_3_1
180 + z_high_limbs_shift * v_3_0
181 + quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[1]
182 + quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0]
183 - accumulators_binary_limbs_1)
187 tmp -= relation_wide_limbs * shiftx2;
188 tmp *= lagrange_even_in_minicircuit * op;
189 tmp *= scaling_factor;
196 tmp = relation_wide_limbs
197 + accumulators_binary_limbs_2_shift * evaluation_input_x_0
198 + accumulators_binary_limbs_1_shift * evaluation_input_x_1
199 + accumulators_binary_limbs_0_shift * evaluation_input_x_2
200 + p_x_high_limbs * v_0_0
201 + p_x_low_limbs_shift * v_0_1
202 + p_x_low_limbs * v_0_2
203 + p_y_high_limbs * v_1_0
204 + p_y_low_limbs_shift * v_1_1
205 + p_y_low_limbs * v_1_2
206 + z_high_limbs * v_2_1
207 + z_low_limbs * v_2_2
208 + z_high_limbs_shift * v_3_1
209 + z_low_limbs_shift * v_3_2
210 + quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[0]
211 + quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[1]
212 + quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[2]
213 - accumulators_binary_limbs_2;
216 tmp += (accumulators_binary_limbs_3_shift * evaluation_input_x_0
217 + accumulators_binary_limbs_2_shift * evaluation_input_x_1
218 + accumulators_binary_limbs_1_shift * evaluation_input_x_2
219 + accumulators_binary_limbs_0_shift * evaluation_input_x_3
220 + p_x_high_limbs_shift * v_0_0
221 + p_x_high_limbs * v_0_1
222 + p_x_low_limbs_shift * v_0_2
223 + p_x_low_limbs * v_0_3
224 + p_y_high_limbs_shift * v_1_0
225 + p_y_high_limbs * v_1_1
226 + p_y_low_limbs_shift * v_1_2
227 + p_y_low_limbs * v_1_3
228 + z_high_limbs * v_2_2
229 + z_low_limbs * v_2_3
230 + z_high_limbs_shift * v_3_2
231 + z_low_limbs_shift * v_3_3
232 + quotient_high_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[0]
233 + quotient_high_binary_limbs * NEGATIVE_MODULUS_LIMBS[1]
234 + quotient_low_binary_limbs_shift * NEGATIVE_MODULUS_LIMBS[2]
235 + quotient_low_binary_limbs * NEGATIVE_MODULUS_LIMBS[3]
236 - accumulators_binary_limbs_3)
240 tmp -= relation_wide_limbs_shift * shiftx2;
241 tmp *= lagrange_even_in_minicircuit * op;
242 tmp *= scaling_factor;
245 const auto reconstruct_from_two = [](
const auto& l0,
const auto& l1) {
return l0 + l1 * shift; };
247 const auto reconstruct_from_four = [](
const auto& l0,
const auto& l1,
const auto& l2,
const auto& l3) {
248 return l0 + l1 * shift + l2 * shiftx2 + l3 * shiftx3;
252 auto reconstructed_p_x =
253 reconstruct_from_four(p_x_low_limbs, p_x_low_limbs_shift, p_x_high_limbs, p_x_high_limbs_shift);
254 auto reconstructed_p_y =
255 reconstruct_from_four(p_y_low_limbs, p_y_low_limbs_shift, p_y_high_limbs, p_y_high_limbs_shift);
256 auto reconstructed_previous_accumulator = reconstruct_from_four(accumulators_binary_limbs_0_shift,
257 accumulators_binary_limbs_1_shift,
258 accumulators_binary_limbs_2_shift,
259 accumulators_binary_limbs_3_shift);
260 auto reconstructed_current_accumulator = reconstruct_from_four(accumulators_binary_limbs_0,
261 accumulators_binary_limbs_1,
262 accumulators_binary_limbs_2,
263 accumulators_binary_limbs_3);
264 auto reconstructed_z1 = reconstruct_from_two(z_low_limbs, z_high_limbs);
265 auto reconstructed_z2 = reconstruct_from_two(z_low_limbs_shift, z_high_limbs_shift);
266 auto reconstructed_quotient = reconstruct_from_four(quotient_low_binary_limbs,
267 quotient_low_binary_limbs_shift,
268 quotient_high_binary_limbs,
269 quotient_high_binary_limbs_shift);
274 tmp = reconstructed_previous_accumulator * evaluation_input_x_4
276 + reconstructed_p_x * v_0_4
277 + reconstructed_p_y * v_1_4
278 + reconstructed_z1 * v_2_4
279 + reconstructed_z2 * v_3_4
280 + reconstructed_quotient * NEGATIVE_MODULUS_LIMBS[4]
281 - reconstructed_current_accumulator;
283 tmp *= lagrange_even_in_minicircuit * op;
284 tmp *= scaling_factor;