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: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
8
10
20{
21 if (init) {
22 return;
23 }
24 element base_point = G1::one;
25
26 auto d2 = base_point.dbl();
27 std::array<element, 256> point_table;
28 point_table[128] = base_point;
29 for (size_t i = 1; i < 128; ++i) {
30 point_table[i + 128] = point_table[i + 127] + d2;
31 }
32 for (size_t i = 0; i < 128; ++i) {
33 point_table[127 - i] = -point_table[128 + i];
34 }
35 element::batch_normalize(&point_table[0], 256);
36
37 auto beta = G1::Fq::cube_root_of_unity();
38 for (size_t i = 0; i < 256; ++i) {
39 uint256_t endo_x = static_cast<uint256_t>(point_table[i].x * beta);
40 uint256_t x = static_cast<uint256_t>(point_table[i].x);
41 uint256_t y = static_cast<uint256_t>(point_table[i].y);
42
43 // Store the values in prime-basis lookup tables
46
47 // Compute x limbs
48 constexpr size_t num_limb_bits = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
49 const uint256_t SHIFT = uint256_t(1) << num_limb_bits;
50 const uint256_t MASK = SHIFT - 1;
51 uint256_t x0 = x & MASK;
52 x = x >> num_limb_bits;
53 uint256_t x1 = x & MASK;
54 x = x >> num_limb_bits;
55 uint256_t x2 = x & MASK;
56 x = x >> num_limb_bits;
57 uint256_t x3 = x & MASK;
58
59 // Compute endo x limbs
60 uint256_t endox0 = endo_x & MASK;
61 endo_x = endo_x >> num_limb_bits;
62 uint256_t endox1 = endo_x & MASK;
63 endo_x = endo_x >> num_limb_bits;
64 uint256_t endox2 = endo_x & MASK;
65 endo_x = endo_x >> num_limb_bits;
66 uint256_t endox3 = endo_x & MASK;
67
68 // Compute y limbs
69 uint256_t y0 = y & MASK;
70 y = y >> num_limb_bits;
71 uint256_t y1 = y & MASK;
72 y = y >> num_limb_bits;
73 uint256_t y2 = y & MASK;
74 y = y >> num_limb_bits;
75 uint256_t y3 = y & MASK;
76
77 // Store the limb values in the respective lookup tables
84 }
85 init = true;
86}
87
92{
93 init_generator_tables();
94 const size_t index = static_cast<size_t>(key[0]);
97}
98
103{
104 init_generator_tables();
105 const size_t index = static_cast<size_t>(key[0]);
108}
109
113template <typename G1>
115{
116 init_generator_tables();
117 const size_t index = static_cast<size_t>(key[0]);
120}
121
125template <typename G1>
127{
128 init_generator_tables();
129 const size_t index = static_cast<size_t>(key[0]);
132}
133
138{
139 init_generator_tables();
140 const size_t index = static_cast<size_t>(key[0]);
143}
144
149{
150 init_generator_tables();
151 const size_t index = static_cast<size_t>(key[0]);
154}
155
159template <typename G1>
161{
162 init_generator_tables();
163 const size_t index = static_cast<size_t>(key[0]);
166}
167
171template <typename G1>
173{
174 init_generator_tables();
175 const size_t index = static_cast<size_t>(key[0]);
178}
179
180template <typename G1> BasicTable ecc_generator_table<G1>::generate_xlo_table(BasicTableId id, const size_t table_index)
181{
182 BasicTable table;
183 table.id = id;
184 table.table_index = table_index;
185 size_t table_size = 256;
186 table.use_twin_keys = false;
187
188 for (size_t i = 0; i < table_size; ++i) {
189 table.column_1.emplace_back((i));
190 table.column_2.emplace_back(ecc_generator_table<G1>::generator_xlo_table[i].first);
191 table.column_3.emplace_back(ecc_generator_table<G1>::generator_xlo_table[i].second);
192 }
193
194 table.get_values_from_key = &get_xlo_values;
195
196 table.column_1_step_size = 0;
197 table.column_2_step_size = 0;
198 table.column_3_step_size = 0;
199
200 return table;
201}
202
203template <typename G1> BasicTable ecc_generator_table<G1>::generate_xhi_table(BasicTableId id, const size_t table_index)
204{
205 BasicTable table;
206 table.id = id;
207 table.table_index = table_index;
208 size_t table_size = 256;
209 table.use_twin_keys = false;
210
211 for (size_t i = 0; i < table_size; ++i) {
212 table.column_1.emplace_back((i));
213 table.column_2.emplace_back(ecc_generator_table<G1>::generator_xhi_table[i].first);
214 table.column_3.emplace_back(ecc_generator_table<G1>::generator_xhi_table[i].second);
215 }
216
217 table.get_values_from_key = &get_xhi_values;
218
219 table.column_1_step_size = 0;
220 table.column_2_step_size = 0;
221 table.column_3_step_size = 0;
222
223 return table;
224}
225
226template <typename G1>
228{
229 BasicTable table;
230 table.id = id;
231 table.table_index = table_index;
232 size_t table_size = 256;
233 table.use_twin_keys = false;
234
235 for (size_t i = 0; i < table_size; ++i) {
236 table.column_1.emplace_back((i));
239 }
240
241 table.get_values_from_key = &get_xlo_endo_values;
242
243 table.column_1_step_size = 0;
244 table.column_2_step_size = 0;
245 table.column_3_step_size = 0;
246
247 return table;
248}
249
250template <typename G1>
252{
253 BasicTable table;
254 table.id = id;
255 table.table_index = table_index;
256 size_t table_size = 256;
257 table.use_twin_keys = false;
258
259 for (size_t i = 0; i < table_size; ++i) {
260 table.column_1.emplace_back((i));
263 }
264
265 table.get_values_from_key = &get_xhi_endo_values;
266
267 table.column_1_step_size = 0;
268 table.column_2_step_size = 0;
269 table.column_3_step_size = 0;
270
271 return table;
272}
273
274template <typename G1> BasicTable ecc_generator_table<G1>::generate_ylo_table(BasicTableId id, const size_t table_index)
275{
276 BasicTable table;
277 table.id = id;
278 table.table_index = table_index;
279 size_t table_size = 256;
280 table.use_twin_keys = false;
281
282 for (size_t i = 0; i < table_size; ++i) {
283 table.column_1.emplace_back((i));
284 table.column_2.emplace_back(ecc_generator_table<G1>::generator_ylo_table[i].first);
285 table.column_3.emplace_back(ecc_generator_table<G1>::generator_ylo_table[i].second);
286 }
287
288 table.get_values_from_key = &get_ylo_values;
289
290 table.column_1_step_size = 0;
291 table.column_2_step_size = 0;
292 table.column_3_step_size = 0;
293
294 return table;
295}
296
297template <typename G1> BasicTable ecc_generator_table<G1>::generate_yhi_table(BasicTableId id, const size_t table_index)
298{
299 BasicTable table;
300 table.id = id;
301 table.table_index = table_index;
302 size_t table_size = 256;
303 table.use_twin_keys = false;
304
305 for (size_t i = 0; i < table_size; ++i) {
306 table.column_1.emplace_back((i));
307 table.column_2.emplace_back(ecc_generator_table<G1>::generator_yhi_table[i].first);
308 table.column_3.emplace_back(ecc_generator_table<G1>::generator_yhi_table[i].second);
309 }
310
311 table.get_values_from_key = &get_yhi_values;
312
313 table.column_1_step_size = 0;
314 table.column_2_step_size = 0;
315 table.column_3_step_size = 0;
316
317 return table;
318}
319
320template <typename G1>
322{
323 BasicTable table;
324 table.id = id;
325 table.table_index = table_index;
326 size_t table_size = 256;
327 table.use_twin_keys = false;
328
329 for (size_t i = 0; i < table_size; ++i) {
330 table.column_1.emplace_back((i));
333 }
334
335 table.get_values_from_key = &get_xyprime_values;
336
337 table.column_1_step_size = 0;
338 table.column_2_step_size = 0;
339 table.column_3_step_size = 0;
340
341 return table;
342}
343
344template <typename G1>
346{
347 BasicTable table;
348 table.id = id;
349 table.table_index = table_index;
350 size_t table_size = 256;
351 table.use_twin_keys = false;
352
353 for (size_t i = 0; i < table_size; ++i) {
354 table.column_1.emplace_back((i));
357 }
358
359 table.get_values_from_key = &get_xyprime_endo_values;
360
361 table.column_1_step_size = 0;
362 table.column_2_step_size = 0;
363 table.column_3_step_size = 0;
364
365 return table;
366}
367
368template <typename G1>
370{
371 const size_t num_entries = 1;
372 MultiTable table(256, 0, 0, 1);
373
374 table.id = id;
375 for (size_t i = 0; i < num_entries; ++i) {
376 table.slice_sizes.emplace_back(512);
377 table.basic_table_ids.emplace_back(basic_id);
378 table.get_table_values.emplace_back(&get_xlo_values);
379 }
380 return table;
381}
382
383template <typename G1>
385{
386 const size_t num_entries = 1;
387 MultiTable table(256, 0, 0, 1);
388
389 table.id = id;
390 for (size_t i = 0; i < num_entries; ++i) {
391 table.slice_sizes.emplace_back(512);
392 table.basic_table_ids.emplace_back(basic_id);
393 table.get_table_values.emplace_back(&get_xhi_values);
394 }
395 return table;
396}
397
398template <typename G1>
400{
401 const size_t num_entries = 1;
402 MultiTable table(256, 0, 0, 1);
403
404 table.id = id;
405 for (size_t i = 0; i < num_entries; ++i) {
406 table.slice_sizes.emplace_back(512);
407 table.basic_table_ids.emplace_back(basic_id);
408 table.get_table_values.emplace_back(&get_xlo_endo_values);
409 }
410 return table;
411}
412
413template <typename G1>
415{
416 const size_t num_entries = 1;
417 MultiTable table(256, 0, 0, 1);
418
419 table.id = id;
420 for (size_t i = 0; i < num_entries; ++i) {
421 table.slice_sizes.emplace_back(512);
422 table.basic_table_ids.emplace_back(basic_id);
423 table.get_table_values.emplace_back(&get_xhi_endo_values);
424 }
425 return table;
426}
427
428template <typename G1>
430{
431 const size_t num_entries = 1;
432 MultiTable table(256, 0, 0, 1);
433
434 table.id = id;
435 for (size_t i = 0; i < num_entries; ++i) {
436 table.slice_sizes.emplace_back(512);
437 table.basic_table_ids.emplace_back(basic_id);
438 table.get_table_values.emplace_back(&get_ylo_values);
439 }
440 return table;
441}
442
443template <typename G1>
445{
446 const size_t num_entries = 1;
447 MultiTable table(256, 0, 0, 1);
448
449 table.id = id;
450 for (size_t i = 0; i < num_entries; ++i) {
451 table.slice_sizes.emplace_back(512);
452 table.basic_table_ids.emplace_back(basic_id);
453 table.get_table_values.emplace_back(&get_yhi_values);
454 }
455 return table;
456}
457
458template <typename G1>
460{
461 const size_t num_entries = 1;
462 MultiTable table(256, 0, 0, 1);
463
464 table.id = id;
465 for (size_t i = 0; i < num_entries; ++i) {
466 table.slice_sizes.emplace_back(512);
467 table.basic_table_ids.emplace_back(basic_id);
468 table.get_table_values.emplace_back(&get_xyprime_values);
469 }
470 return table;
471}
472
473template <typename G1>
475{
476 const size_t num_entries = 1;
477 MultiTable table(256, 0, 0, 1);
478
479 table.id = id;
480 for (size_t i = 0; i < num_entries; ++i) {
481 table.slice_sizes.emplace_back(512);
482 table.basic_table_ids.emplace_back(basic_id);
483 table.get_table_values.emplace_back(&get_xyprime_endo_values);
484 }
485 return table;
486}
487template class ecc_generator_table<bb::g1>;
489
490} // 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)
const auto init
Definition fr.bench.cpp:141
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:287
std::vector< bb::fr > column_3
Definition types.hpp:322
std::vector< bb::fr > column_2
Definition types.hpp:321
std::array< bb::fr, 2 >(* get_values_from_key)(const std::array< uint64_t, 2 >)
Definition types.hpp:330
std::vector< bb::fr > column_1
Definition types.hpp:320
Container for managing multiple BasicTables plus the data needed to combine basic table outputs (e....
Definition types.hpp:154
std::vector< BasicTableId > basic_table_ids
Definition types.hpp:160
std::vector< uint64_t > slice_sizes
Definition types.hpp:161
std::vector< table_out(*)(table_in)> get_table_values
Definition types.hpp:168