42 for (
size_t i = 0; i < num_elements; ++i) {
43 limb_max[0] =
std::max(limb_max[0], rom_data[i].x.binary_basis_limbs[0].maximum_value);
44 limb_max[1] =
std::max(limb_max[1], rom_data[i].x.binary_basis_limbs[1].maximum_value);
45 limb_max[2] =
std::max(limb_max[2], rom_data[i].x.binary_basis_limbs[2].maximum_value);
46 limb_max[3] =
std::max(limb_max[3], rom_data[i].x.binary_basis_limbs[3].maximum_value);
47 limb_max[4] =
std::max(limb_max[4], rom_data[i].y.binary_basis_limbs[0].maximum_value);
48 limb_max[5] =
std::max(limb_max[5], rom_data[i].y.binary_basis_limbs[1].maximum_value);
49 limb_max[6] =
std::max(limb_max[6], rom_data[i].y.binary_basis_limbs[2].maximum_value);
50 limb_max[7] =
std::max(limb_max[7], rom_data[i].y.binary_basis_limbs[3].maximum_value);
52 x_lo_limbs.emplace_back(std::array<
field_t<C>, 2>{ rom_data[i].x.binary_basis_limbs[0].element,
53 rom_data[i].x.binary_basis_limbs[1].element });
54 x_hi_limbs.emplace_back(std::array<
field_t<C>, 2>{ rom_data[i].x.binary_basis_limbs[2].element,
55 rom_data[i].x.binary_basis_limbs[3].element });
56 y_lo_limbs.emplace_back(std::array<
field_t<C>, 2>{ rom_data[i].y.binary_basis_limbs[0].element,
57 rom_data[i].y.binary_basis_limbs[1].element });
58 y_hi_limbs.emplace_back(std::array<
field_t<C>, 2>{ rom_data[i].y.binary_basis_limbs[2].element,
59 rom_data[i].y.binary_basis_limbs[3].element });
60 prime_limbs.emplace_back(
61 std::array<
field_t<C>, 2>{ rom_data[i].x.prime_basis_limb, rom_data[i].y.prime_basis_limb });
79 const auto xlo = tables[0][index];
80 const auto xhi = tables[1][index];
81 const auto ylo = tables[2][index];
82 const auto yhi = tables[3][index];
83 const auto xyprime = tables[4][index];
86 Fq x_fq = Fq::unsafe_construct_from_limbs(xlo[0], xlo[1], xhi[0], xhi[1], xyprime[0]);
87 Fq y_fq = Fq::unsafe_construct_from_limbs(ylo[0], ylo[1], yhi[0], yhi[1], xyprime[1]);
88 x_fq.binary_basis_limbs[0].maximum_value = limb_max[0];
89 x_fq.binary_basis_limbs[1].maximum_value = limb_max[1];
90 x_fq.binary_basis_limbs[2].maximum_value = limb_max[2];
91 x_fq.binary_basis_limbs[3].maximum_value = limb_max[3];
92 y_fq.binary_basis_limbs[0].maximum_value = limb_max[4];
93 y_fq.binary_basis_limbs[1].maximum_value = limb_max[5];
94 y_fq.binary_basis_limbs[2].maximum_value = limb_max[6];
95 y_fq.binary_basis_limbs[3].maximum_value = limb_max[7];
97 const auto output =
element(x_fq, y_fq);
191 static_assert(
length <= 6,
"lookup_table_plookup only supports up to 6 input elements");
193 if constexpr (
length == 2) {
195 element_table[0] = A0;
196 element_table[1] = A1;
197 }
else if constexpr (
length == 3) {
198 auto [R0, R1] = inputs[1].checked_unconditional_add_sub(inputs[0]);
200 auto [T0, T1] = inputs[2].checked_unconditional_add_sub(R0);
201 auto [T2, T3] = inputs[2].checked_unconditional_add_sub(R1);
203 element_table[0] = T0;
204 element_table[1] = T2;
205 element_table[2] = T3;
206 element_table[3] = T1;
207 }
else if constexpr (
length == 4) {
208 auto [T0, T1] = inputs[1].checked_unconditional_add_sub(inputs[0]);
209 auto [T2, T3] = inputs[3].checked_unconditional_add_sub(inputs[2]);
211 auto [F0, F3] = T2.checked_unconditional_add_sub(T0);
212 auto [F1, F2] = T2.checked_unconditional_add_sub(T1);
213 auto [F4, F7] = T3.checked_unconditional_add_sub(T0);
214 auto [F5, F6] = T3.checked_unconditional_add_sub(T1);
216 element_table[0] = F0;
217 element_table[1] = F1;
218 element_table[2] = F2;
219 element_table[3] = F3;
220 element_table[4] = F4;
221 element_table[5] = F5;
222 element_table[6] = F6;
223 element_table[7] = F7;
224 }
else if constexpr (
length == 5) {
225 auto [A0, A1] = inputs[1].checked_unconditional_add_sub(inputs[0]);
226 auto [T2, T3] = inputs[3].checked_unconditional_add_sub(inputs[2]);
228 auto [E0, E3] = inputs[4].checked_unconditional_add_sub(T2);
229 auto [E1, E2] = inputs[4].checked_unconditional_add_sub(T3);
231 auto [F0, F3] = E0.checked_unconditional_add_sub(A0);
232 auto [F1, F2] = E0.checked_unconditional_add_sub(A1);
233 auto [F4, F7] = E1.checked_unconditional_add_sub(A0);
234 auto [F5, F6] = E1.checked_unconditional_add_sub(A1);
235 auto [F8, F11] = E2.checked_unconditional_add_sub(A0);
236 auto [F9, F10] = E2.checked_unconditional_add_sub(A1);
237 auto [F12, F15] = E3.checked_unconditional_add_sub(A0);
238 auto [F13, F14] = E3.checked_unconditional_add_sub(A1);
240 element_table[0] = F0;
241 element_table[1] = F1;
242 element_table[2] = F2;
243 element_table[3] = F3;
244 element_table[4] = F4;
245 element_table[5] = F5;
246 element_table[6] = F6;
247 element_table[7] = F7;
248 element_table[8] = F8;
249 element_table[9] = F9;
250 element_table[10] = F10;
251 element_table[11] = F11;
252 element_table[12] = F12;
253 element_table[13] = F13;
254 element_table[14] = F14;
255 element_table[15] = F15;
256 }
else if constexpr (
length == 6) {
259 auto [A0, A1] = inputs[1].checked_unconditional_add_sub(inputs[0]);
260 auto [E0, E1] = inputs[4].checked_unconditional_add_sub(inputs[3]);
261 auto [C0,
C3] = inputs[2].checked_unconditional_add_sub(A0);
262 auto [
C1,
C2] = inputs[2].checked_unconditional_add_sub(A1);
264 auto [F0, F3] = inputs[5].checked_unconditional_add_sub(E0);
265 auto [F1, F2] = inputs[5].checked_unconditional_add_sub(E1);
267 auto [R0, R7] = F0.checked_unconditional_add_sub(C0);
268 auto [R1, R6] = F0.checked_unconditional_add_sub(
C1);
269 auto [R2, R5] = F0.checked_unconditional_add_sub(
C2);
270 auto [R3, R4] = F0.checked_unconditional_add_sub(
C3);
272 auto [S0, S7] = F1.checked_unconditional_add_sub(C0);
273 auto [S1, S6] = F1.checked_unconditional_add_sub(
C1);
274 auto [S2, S5] = F1.checked_unconditional_add_sub(
C2);
275 auto [S3, S4] = F1.checked_unconditional_add_sub(
C3);
277 auto [U0, U7] = F2.checked_unconditional_add_sub(C0);
278 auto [U1, U6] = F2.checked_unconditional_add_sub(
C1);
279 auto [U2, U5] = F2.checked_unconditional_add_sub(
C2);
280 auto [U3, U4] = F2.checked_unconditional_add_sub(
C3);
282 auto [W0, W7] = F3.checked_unconditional_add_sub(C0);
283 auto [W1, W6] = F3.checked_unconditional_add_sub(
C1);
284 auto [W2, W5] = F3.checked_unconditional_add_sub(
C2);
285 auto [W3, W4] = F3.checked_unconditional_add_sub(
C3);
287 element_table[0] = R0;
288 element_table[1] = R1;
289 element_table[2] = R2;
290 element_table[3] = R3;
291 element_table[4] = R4;
292 element_table[5] = R5;
293 element_table[6] = R6;
294 element_table[7] = R7;
296 element_table[8] = S0;
297 element_table[9] = S1;
298 element_table[10] = S2;
299 element_table[11] = S3;
300 element_table[12] = S4;
301 element_table[13] = S5;
302 element_table[14] = S6;
303 element_table[15] = S7;
305 element_table[16] = U0;
306 element_table[17] = U1;
307 element_table[18] = U2;
308 element_table[19] = U3;
309 element_table[20] = U4;
310 element_table[21] = U5;
311 element_table[22] = U6;
312 element_table[23] = U7;
314 element_table[24] = W0;
315 element_table[25] = W1;
316 element_table[26] = W2;
317 element_table[27] = W3;
318 element_table[28] = W4;
319 element_table[29] = W5;
320 element_table[30] = W6;
321 element_table[31] = W7;
323 for (
size_t i = 0; i < table_size / 2; ++i) {
324 element_table[i + (table_size / 2)] = (-element_table[(table_size / 2) - 1 - i]);
326 coordinates = create_group_element_rom_tables<table_size>(element_table, limb_max);
std::conditional_t< IsGoblinBigGroup< C, Fq, Fr, G >, element_goblin::goblin_element< C, goblin_field< C >, Fr, G >, element_default::element< C, Fq, Fr, G > > element
element wraps either element_default::element or element_goblin::goblin_element depending on parametr...