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 const uint256_t SHIFT = uint256_t(1) << 68;
44 const uint256_t MASK = SHIFT - 1;
45 uint256_t x0 = x & MASK;
46 x = x >> 68;
47 uint256_t x1 = x & MASK;
48 x = x >> 68;
49 uint256_t x2 = x & MASK;
50 x = x >> 68;
51 uint256_t x3 = x & MASK;
52
53 uint256_t endox0 = endo_x & MASK;
54 endo_x = endo_x >> 68;
55 uint256_t endox1 = endo_x & MASK;
56 endo_x = endo_x >> 68;
57 uint256_t endox2 = endo_x & MASK;
58 endo_x = endo_x >> 68;
59 uint256_t endox3 = endo_x & MASK;
60
61 uint256_t y0 = y & MASK;
62 y = y >> 68;
63 uint256_t y1 = y & MASK;
64 y = y >> 68;
65 uint256_t y2 = y & MASK;
66 y = y >> 68;
67 uint256_t y3 = y & MASK;
75 std::make_pair<bb::fr, bb::fr>(bb::fr(uint256_t(point_table[i].x)), bb::fr(uint256_t(point_table[i].y)));
77 bb::fr(uint256_t(point_table[i].x * beta)), bb::fr(uint256_t(point_table[i].y)));
78 }
79 init = true;
80}
81
82// map 0 to 255 into 0 to 510 in steps of two
83// actual naf value = (position * 2) - 255
84template <typename G1> size_t ecc_generator_table<G1>::convert_position_to_shifted_naf(const size_t position)
85{
86 return (position * 2);
87}
88
89template <typename G1> size_t ecc_generator_table<G1>::convert_shifted_naf_to_position(const size_t shifted_naf)
90{
91 return shifted_naf / 2;
92}
93
98{
99 init_generator_tables();
100 const size_t index = static_cast<size_t>(key[0]);
103}
104
109{
110 init_generator_tables();
111 const size_t index = static_cast<size_t>(key[0]);
114}
115
119template <typename G1>
121{
122 init_generator_tables();
123 const size_t index = static_cast<size_t>(key[0]);
126}
127
131template <typename G1>
133{
134 init_generator_tables();
135 const size_t index = static_cast<size_t>(key[0]);
138}
139
144{
145 init_generator_tables();
146 const size_t index = static_cast<size_t>(key[0]);
149}
150
155{
156 init_generator_tables();
157 const size_t index = static_cast<size_t>(key[0]);
160}
161
165template <typename G1>
167{
168 init_generator_tables();
169 const size_t index = static_cast<size_t>(key[0]);
172}
173
177template <typename G1>
179{
180 init_generator_tables();
181 const size_t index = static_cast<size_t>(key[0]);
184}
185
186template <typename G1> BasicTable ecc_generator_table<G1>::generate_xlo_table(BasicTableId id, const size_t table_index)
187{
188 BasicTable table;
189 table.id = id;
190 table.table_index = table_index;
191 size_t table_size = 256;
192 table.use_twin_keys = false;
193
194 for (size_t i = 0; i < table_size; ++i) {
195 table.column_1.emplace_back((i));
196 table.column_2.emplace_back(ecc_generator_table<G1>::generator_xlo_table[i].first);
197 table.column_3.emplace_back(ecc_generator_table<G1>::generator_xlo_table[i].second);
198 }
199
200 table.get_values_from_key = &get_xlo_values;
201
202 table.column_1_step_size = 0;
203 table.column_2_step_size = 0;
204 table.column_3_step_size = 0;
205
206 return table;
207}
208
209template <typename G1> BasicTable ecc_generator_table<G1>::generate_xhi_table(BasicTableId id, const size_t table_index)
210{
211 BasicTable table;
212 table.id = id;
213 table.table_index = table_index;
214 size_t table_size = 256;
215 table.use_twin_keys = false;
216
217 for (size_t i = 0; i < table_size; ++i) {
218 table.column_1.emplace_back((i));
219 table.column_2.emplace_back(ecc_generator_table<G1>::generator_xhi_table[i].first);
220 table.column_3.emplace_back(ecc_generator_table<G1>::generator_xhi_table[i].second);
221 }
222
223 table.get_values_from_key = &get_xhi_values;
224
225 table.column_1_step_size = 0;
226 table.column_2_step_size = 0;
227 table.column_3_step_size = 0;
228
229 return table;
230}
231
232template <typename G1>
234{
235 BasicTable table;
236 table.id = id;
237 table.table_index = table_index;
238 size_t table_size = 256;
239 table.use_twin_keys = false;
240
241 for (size_t i = 0; i < table_size; ++i) {
242 table.column_1.emplace_back((i));
245 }
246
247 table.get_values_from_key = &get_xlo_endo_values;
248
249 table.column_1_step_size = 0;
250 table.column_2_step_size = 0;
251 table.column_3_step_size = 0;
252
253 return table;
254}
255
256template <typename G1>
258{
259 BasicTable table;
260 table.id = id;
261 table.table_index = table_index;
262 size_t table_size = 256;
263 table.use_twin_keys = false;
264
265 for (size_t i = 0; i < table_size; ++i) {
266 table.column_1.emplace_back((i));
269 }
270
271 table.get_values_from_key = &get_xhi_endo_values;
272
273 table.column_1_step_size = 0;
274 table.column_2_step_size = 0;
275 table.column_3_step_size = 0;
276
277 return table;
278}
279
280template <typename G1> BasicTable ecc_generator_table<G1>::generate_ylo_table(BasicTableId id, const size_t table_index)
281{
282 BasicTable table;
283 table.id = id;
284 table.table_index = table_index;
285 size_t table_size = 256;
286 table.use_twin_keys = false;
287
288 for (size_t i = 0; i < table_size; ++i) {
289 table.column_1.emplace_back((i));
290 table.column_2.emplace_back(ecc_generator_table<G1>::generator_ylo_table[i].first);
291 table.column_3.emplace_back(ecc_generator_table<G1>::generator_ylo_table[i].second);
292 }
293
294 table.get_values_from_key = &get_ylo_values;
295
296 table.column_1_step_size = 0;
297 table.column_2_step_size = 0;
298 table.column_3_step_size = 0;
299
300 return table;
301}
302
303template <typename G1> BasicTable ecc_generator_table<G1>::generate_yhi_table(BasicTableId id, const size_t table_index)
304{
305 BasicTable table;
306 table.id = id;
307 table.table_index = table_index;
308 size_t table_size = 256;
309 table.use_twin_keys = false;
310
311 for (size_t i = 0; i < table_size; ++i) {
312 table.column_1.emplace_back((i));
313 table.column_2.emplace_back(ecc_generator_table<G1>::generator_yhi_table[i].first);
314 table.column_3.emplace_back(ecc_generator_table<G1>::generator_yhi_table[i].second);
315 }
316
317 table.get_values_from_key = &get_yhi_values;
318
319 table.column_1_step_size = 0;
320 table.column_2_step_size = 0;
321 table.column_3_step_size = 0;
322
323 return table;
324}
325
326template <typename G1>
328{
329 BasicTable table;
330 table.id = id;
331 table.table_index = table_index;
332 size_t table_size = 256;
333 table.use_twin_keys = false;
334
335 for (size_t i = 0; i < table_size; ++i) {
336 table.column_1.emplace_back((i));
339 }
340
341 table.get_values_from_key = &get_xyprime_values;
342
343 table.column_1_step_size = 0;
344 table.column_2_step_size = 0;
345 table.column_3_step_size = 0;
346
347 return table;
348}
349
350template <typename G1>
352{
353 BasicTable table;
354 table.id = id;
355 table.table_index = table_index;
356 size_t table_size = 256;
357 table.use_twin_keys = false;
358
359 for (size_t i = 0; i < table_size; ++i) {
360 table.column_1.emplace_back((i));
363 }
364
365 table.get_values_from_key = &get_xyprime_endo_values;
366
367 table.column_1_step_size = 0;
368 table.column_2_step_size = 0;
369 table.column_3_step_size = 0;
370
371 return table;
372}
373
374template <typename G1>
376{
377 const size_t num_entries = 1;
378 MultiTable table(256, 0, 0, 1);
379
380 table.id = id;
381 for (size_t i = 0; i < num_entries; ++i) {
382 table.slice_sizes.emplace_back(512);
383 table.basic_table_ids.emplace_back(basic_id);
384 table.get_table_values.emplace_back(&get_xlo_values);
385 }
386 return table;
387}
388
389template <typename G1>
391{
392 const size_t num_entries = 1;
393 MultiTable table(256, 0, 0, 1);
394
395 table.id = id;
396 for (size_t i = 0; i < num_entries; ++i) {
397 table.slice_sizes.emplace_back(512);
398 table.basic_table_ids.emplace_back(basic_id);
399 table.get_table_values.emplace_back(&get_xhi_values);
400 }
401 return table;
402}
403
404template <typename G1>
406{
407 const size_t num_entries = 1;
408 MultiTable table(256, 0, 0, 1);
409
410 table.id = id;
411 for (size_t i = 0; i < num_entries; ++i) {
412 table.slice_sizes.emplace_back(512);
413 table.basic_table_ids.emplace_back(basic_id);
414 table.get_table_values.emplace_back(&get_xlo_endo_values);
415 }
416 return table;
417}
418
419template <typename G1>
421{
422 const size_t num_entries = 1;
423 MultiTable table(256, 0, 0, 1);
424
425 table.id = id;
426 for (size_t i = 0; i < num_entries; ++i) {
427 table.slice_sizes.emplace_back(512);
428 table.basic_table_ids.emplace_back(basic_id);
429 table.get_table_values.emplace_back(&get_xhi_endo_values);
430 }
431 return table;
432}
433
434template <typename G1>
436{
437 const size_t num_entries = 1;
438 MultiTable table(256, 0, 0, 1);
439
440 table.id = id;
441 for (size_t i = 0; i < num_entries; ++i) {
442 table.slice_sizes.emplace_back(512);
443 table.basic_table_ids.emplace_back(basic_id);
444 table.get_table_values.emplace_back(&get_ylo_values);
445 }
446 return table;
447}
448
449template <typename G1>
451{
452 const size_t num_entries = 1;
453 MultiTable table(256, 0, 0, 1);
454
455 table.id = id;
456 for (size_t i = 0; i < num_entries; ++i) {
457 table.slice_sizes.emplace_back(512);
458 table.basic_table_ids.emplace_back(basic_id);
459 table.get_table_values.emplace_back(&get_yhi_values);
460 }
461 return table;
462}
463
464template <typename G1>
466{
467 const size_t num_entries = 1;
468 MultiTable table(256, 0, 0, 1);
469
470 table.id = id;
471 for (size_t i = 0; i < num_entries; ++i) {
472 table.slice_sizes.emplace_back(512);
473 table.basic_table_ids.emplace_back(basic_id);
474 table.get_table_values.emplace_back(&get_xyprime_values);
475 }
476 return table;
477}
478
479template <typename G1>
481{
482 const size_t num_entries = 1;
483 MultiTable table(256, 0, 0, 1);
484
485 table.id = id;
486 for (size_t i = 0; i < num_entries; ++i) {
487 table.slice_sizes.emplace_back(512);
488 table.basic_table_ids.emplace_back(basic_id);
489 table.get_table_values.emplace_back(&get_xyprime_endo_values);
490 }
491 return table;
492}
493template class ecc_generator_table<bb::g1>;
495
496} // 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 size_t convert_shifted_naf_to_position(const size_t shifted_naf)
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:348
std::vector< bb::fr > column_3
Definition types.hpp:383
std::vector< bb::fr > column_2
Definition types.hpp:382
std::array< bb::fr, 2 >(* get_values_from_key)(const std::array< uint64_t, 2 >)
Definition types.hpp:391
std::vector< bb::fr > column_1
Definition types.hpp:381
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