Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
non_native_group_generator.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Suyash], commit: 553c5eb82901955c638b943065acd3e47fc918c0}
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
8
10
20{
21 std::call_once(init_flag, []() {
22 element base_point = G1::one;
23
24 auto d2 = base_point.dbl();
25 std::array<element, 256> point_table;
26 point_table[128] = base_point;
27 for (size_t i = 1; i < 128; ++i) {
28 point_table[i + 128] = point_table[i + 127] + d2;
29 }
30 for (size_t i = 0; i < 128; ++i) {
31 point_table[127 - i] = -point_table[128 + i];
32 }
33 element::batch_normalize(&point_table[0], 256);
34
35 auto beta = G1::Fq::cube_root_of_unity();
36 for (size_t i = 0; i < 256; ++i) {
37 uint256_t endo_x = static_cast<uint256_t>(point_table[i].x * beta);
38 uint256_t x = static_cast<uint256_t>(point_table[i].x);
39 uint256_t y = static_cast<uint256_t>(point_table[i].y);
40
41 // Store the values in prime-basis lookup tables
44
45 // Compute x limbs
46 constexpr size_t num_limb_bits = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
47 const uint256_t SHIFT = uint256_t(1) << num_limb_bits;
48 const uint256_t MASK = SHIFT - 1;
49 uint256_t x0 = x & MASK;
50 x = x >> num_limb_bits;
51 uint256_t x1 = x & MASK;
52 x = x >> num_limb_bits;
53 uint256_t x2 = x & MASK;
54 x = x >> num_limb_bits;
55 uint256_t x3 = x & MASK;
56
57 // Compute endo x limbs
58 uint256_t endox0 = endo_x & MASK;
59 endo_x = endo_x >> num_limb_bits;
60 uint256_t endox1 = endo_x & MASK;
61 endo_x = endo_x >> num_limb_bits;
62 uint256_t endox2 = endo_x & MASK;
63 endo_x = endo_x >> num_limb_bits;
64 uint256_t endox3 = endo_x & MASK;
65
66 // Compute y limbs
67 uint256_t y0 = y & MASK;
68 y = y >> num_limb_bits;
69 uint256_t y1 = y & MASK;
70 y = y >> num_limb_bits;
71 uint256_t y2 = y & MASK;
72 y = y >> num_limb_bits;
73 uint256_t y3 = y & MASK;
74
75 // Store the limb values in the respective lookup tables
82 }
83 });
84}
85
90{
91 init_generator_tables();
92 const size_t index = static_cast<size_t>(key[0]);
95}
96
101{
102 init_generator_tables();
103 const size_t index = static_cast<size_t>(key[0]);
106}
107
111template <typename G1>
119
123template <typename G1>
131
136{
137 init_generator_tables();
138 const size_t index = static_cast<size_t>(key[0]);
141}
142
147{
148 init_generator_tables();
149 const size_t index = static_cast<size_t>(key[0]);
152}
153
157template <typename G1>
165
169template <typename G1>
177
178template <typename G1> BasicTable ecc_generator_table<G1>::generate_xlo_table(BasicTableId id, const size_t table_index)
179{
180 BasicTable table;
181 table.id = id;
182 table.table_index = table_index;
183 size_t table_size = 256;
184 table.use_twin_keys = false;
185
186 for (size_t i = 0; i < table_size; ++i) {
187 table.column_1.emplace_back((i));
188 table.column_2.emplace_back(ecc_generator_table<G1>::generator_xlo_table[i].first);
189 table.column_3.emplace_back(ecc_generator_table<G1>::generator_xlo_table[i].second);
190 }
191
192 table.get_values_from_key = &get_xlo_values;
193
194 table.column_1_step_size = 0;
195 table.column_2_step_size = 0;
196 table.column_3_step_size = 0;
197
198 return table;
199}
200
201template <typename G1> BasicTable ecc_generator_table<G1>::generate_xhi_table(BasicTableId id, const size_t table_index)
202{
203 BasicTable table;
204 table.id = id;
205 table.table_index = table_index;
206 size_t table_size = 256;
207 table.use_twin_keys = false;
208
209 for (size_t i = 0; i < table_size; ++i) {
210 table.column_1.emplace_back((i));
211 table.column_2.emplace_back(ecc_generator_table<G1>::generator_xhi_table[i].first);
212 table.column_3.emplace_back(ecc_generator_table<G1>::generator_xhi_table[i].second);
213 }
214
215 table.get_values_from_key = &get_xhi_values;
216
217 table.column_1_step_size = 0;
218 table.column_2_step_size = 0;
219 table.column_3_step_size = 0;
220
221 return table;
222}
223
224template <typename G1>
226{
227 BasicTable table;
228 table.id = id;
229 table.table_index = table_index;
230 size_t table_size = 256;
231 table.use_twin_keys = false;
232
233 for (size_t i = 0; i < table_size; ++i) {
234 table.column_1.emplace_back((i));
237 }
238
239 table.get_values_from_key = &get_xlo_endo_values;
240
241 table.column_1_step_size = 0;
242 table.column_2_step_size = 0;
243 table.column_3_step_size = 0;
244
245 return table;
246}
247
248template <typename G1>
250{
251 BasicTable table;
252 table.id = id;
253 table.table_index = table_index;
254 size_t table_size = 256;
255 table.use_twin_keys = false;
256
257 for (size_t i = 0; i < table_size; ++i) {
258 table.column_1.emplace_back((i));
261 }
262
263 table.get_values_from_key = &get_xhi_endo_values;
264
265 table.column_1_step_size = 0;
266 table.column_2_step_size = 0;
267 table.column_3_step_size = 0;
268
269 return table;
270}
271
272template <typename G1> BasicTable ecc_generator_table<G1>::generate_ylo_table(BasicTableId id, const size_t table_index)
273{
274 BasicTable table;
275 table.id = id;
276 table.table_index = table_index;
277 size_t table_size = 256;
278 table.use_twin_keys = false;
279
280 for (size_t i = 0; i < table_size; ++i) {
281 table.column_1.emplace_back((i));
282 table.column_2.emplace_back(ecc_generator_table<G1>::generator_ylo_table[i].first);
283 table.column_3.emplace_back(ecc_generator_table<G1>::generator_ylo_table[i].second);
284 }
285
286 table.get_values_from_key = &get_ylo_values;
287
288 table.column_1_step_size = 0;
289 table.column_2_step_size = 0;
290 table.column_3_step_size = 0;
291
292 return table;
293}
294
295template <typename G1> BasicTable ecc_generator_table<G1>::generate_yhi_table(BasicTableId id, const size_t table_index)
296{
297 BasicTable table;
298 table.id = id;
299 table.table_index = table_index;
300 size_t table_size = 256;
301 table.use_twin_keys = false;
302
303 for (size_t i = 0; i < table_size; ++i) {
304 table.column_1.emplace_back((i));
305 table.column_2.emplace_back(ecc_generator_table<G1>::generator_yhi_table[i].first);
306 table.column_3.emplace_back(ecc_generator_table<G1>::generator_yhi_table[i].second);
307 }
308
309 table.get_values_from_key = &get_yhi_values;
310
311 table.column_1_step_size = 0;
312 table.column_2_step_size = 0;
313 table.column_3_step_size = 0;
314
315 return table;
316}
317
318template <typename G1>
320{
321 BasicTable table;
322 table.id = id;
323 table.table_index = table_index;
324 size_t table_size = 256;
325 table.use_twin_keys = false;
326
327 for (size_t i = 0; i < table_size; ++i) {
328 table.column_1.emplace_back((i));
331 }
332
333 table.get_values_from_key = &get_xyprime_values;
334
335 table.column_1_step_size = 0;
336 table.column_2_step_size = 0;
337 table.column_3_step_size = 0;
338
339 return table;
340}
341
342template <typename G1>
344{
345 BasicTable table;
346 table.id = id;
347 table.table_index = table_index;
348 size_t table_size = 256;
349 table.use_twin_keys = false;
350
351 for (size_t i = 0; i < table_size; ++i) {
352 table.column_1.emplace_back((i));
355 }
356
357 table.get_values_from_key = &get_xyprime_endo_values;
358
359 table.column_1_step_size = 0;
360 table.column_2_step_size = 0;
361 table.column_3_step_size = 0;
362
363 return table;
364}
365
366template <typename G1>
368{
369 const size_t num_entries = 1;
370 MultiTable table(256, 0, 0, 1);
371
372 table.id = id;
373 for (size_t i = 0; i < num_entries; ++i) {
374 table.slice_sizes.emplace_back(512);
375 table.basic_table_ids.emplace_back(basic_id);
376 table.get_table_values.emplace_back(&get_xlo_values);
377 }
378 return table;
379}
380
381template <typename G1>
383{
384 const size_t num_entries = 1;
385 MultiTable table(256, 0, 0, 1);
386
387 table.id = id;
388 for (size_t i = 0; i < num_entries; ++i) {
389 table.slice_sizes.emplace_back(512);
390 table.basic_table_ids.emplace_back(basic_id);
391 table.get_table_values.emplace_back(&get_xhi_values);
392 }
393 return table;
394}
395
396template <typename G1>
398{
399 const size_t num_entries = 1;
400 MultiTable table(256, 0, 0, 1);
401
402 table.id = id;
403 for (size_t i = 0; i < num_entries; ++i) {
404 table.slice_sizes.emplace_back(512);
405 table.basic_table_ids.emplace_back(basic_id);
406 table.get_table_values.emplace_back(&get_xlo_endo_values);
407 }
408 return table;
409}
410
411template <typename G1>
413{
414 const size_t num_entries = 1;
415 MultiTable table(256, 0, 0, 1);
416
417 table.id = id;
418 for (size_t i = 0; i < num_entries; ++i) {
419 table.slice_sizes.emplace_back(512);
420 table.basic_table_ids.emplace_back(basic_id);
421 table.get_table_values.emplace_back(&get_xhi_endo_values);
422 }
423 return table;
424}
425
426template <typename G1>
428{
429 const size_t num_entries = 1;
430 MultiTable table(256, 0, 0, 1);
431
432 table.id = id;
433 for (size_t i = 0; i < num_entries; ++i) {
434 table.slice_sizes.emplace_back(512);
435 table.basic_table_ids.emplace_back(basic_id);
436 table.get_table_values.emplace_back(&get_ylo_values);
437 }
438 return table;
439}
440
441template <typename G1>
443{
444 const size_t num_entries = 1;
445 MultiTable table(256, 0, 0, 1);
446
447 table.id = id;
448 for (size_t i = 0; i < num_entries; ++i) {
449 table.slice_sizes.emplace_back(512);
450 table.basic_table_ids.emplace_back(basic_id);
451 table.get_table_values.emplace_back(&get_yhi_values);
452 }
453 return table;
454}
455
456template <typename G1>
458{
459 const size_t num_entries = 1;
460 MultiTable table(256, 0, 0, 1);
461
462 table.id = id;
463 for (size_t i = 0; i < num_entries; ++i) {
464 table.slice_sizes.emplace_back(512);
465 table.basic_table_ids.emplace_back(basic_id);
466 table.get_table_values.emplace_back(&get_xyprime_values);
467 }
468 return table;
469}
470
471template <typename G1>
473{
474 const size_t num_entries = 1;
475 MultiTable table(256, 0, 0, 1);
476
477 table.id = id;
478 for (size_t i = 0; i < num_entries; ++i) {
479 table.slice_sizes.emplace_back(512);
480 table.basic_table_ids.emplace_back(basic_id);
481 table.get_table_values.emplace_back(&get_xyprime_endo_values);
482 }
483 return table;
484}
486
487} // namespace bb::plookup::ecc_generator_tables
static MultiTable get_yhi_table(const MultiTableId id, const BasicTableId basic_id)
static MultiTable get_xyprime_endo_table(const MultiTableId id, const BasicTableId basic_id)
static BasicTable generate_xlo_table(BasicTableId id, const size_t table_index)
static std::array< fr, 2 > get_xlo_endo_values(const std::array< uint64_t, 2 > key)
static BasicTable generate_xyprime_endo_table(BasicTableId id, const size_t table_index)
static BasicTable generate_yhi_table(BasicTableId id, const size_t table_index)
static BasicTable generate_xlo_endo_table(BasicTableId id, const size_t table_index)
static std::array< fr, 2 > get_xhi_values(const std::array< uint64_t, 2 > key)
static std::array< fr, 2 > get_xyprime_endo_values(const std::array< uint64_t, 2 > key)
static std::array< fr, 2 > get_xlo_values(const std::array< uint64_t, 2 > key)
static BasicTable generate_ylo_table(BasicTableId id, const size_t table_index)
static BasicTable generate_xhi_table(BasicTableId id, const size_t table_index)
static std::array< fr, 2 > get_yhi_values(const std::array< uint64_t, 2 > key)
static MultiTable get_xlo_endo_table(const MultiTableId id, const BasicTableId basic_id)
static std::array< fr, 2 > get_ylo_values(const std::array< uint64_t, 2 > key)
static std::array< fr, 2 > get_xhi_endo_values(const std::array< uint64_t, 2 > key)
static std::array< fr, 2 > get_xyprime_values(const std::array< uint64_t, 2 > key)
static MultiTable get_xyprime_table(const MultiTableId id, const BasicTableId basic_id)
static MultiTable get_xhi_endo_table(const MultiTableId id, const BasicTableId basic_id)
static BasicTable generate_xyprime_table(BasicTableId id, const size_t table_index)
static BasicTable generate_xhi_endo_table(BasicTableId id, const size_t table_index)
static MultiTable get_xhi_table(const MultiTableId id, const BasicTableId basic_id)
static MultiTable get_xlo_table(const MultiTableId id, const BasicTableId basic_id)
static MultiTable get_ylo_table(const MultiTableId id, const BasicTableId basic_id)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
A basic table from which we can perform lookups (for example, an xor table)
Definition types.hpp:288
std::vector< bb::fr > column_3
Definition types.hpp:323
std::vector< bb::fr > column_2
Definition types.hpp:322
std::array< bb::fr, 2 >(* get_values_from_key)(const std::array< uint64_t, 2 >)
Definition types.hpp:331
std::vector< bb::fr > column_1
Definition types.hpp:321
Container for managing multiple BasicTables plus the data needed to combine basic table outputs (e....
Definition types.hpp:150
std::vector< BasicTableId > basic_table_ids
Definition types.hpp:156
std::vector< uint64_t > slice_sizes
Definition types.hpp:157
std::vector< table_out(*)(table_in)> get_table_values
Definition types.hpp:166