22int main(
int argc,
char** argv)
24 std::vector<std::string> args(argv, argv + argc);
25 if (args.size() <= 1) {
26 info(
"usage: ", args[0],
" <subgroup_size> [output_srs_path]");
30 const size_t subgroup_size =
static_cast<size_t>(atoi(args[1].c_str()));
31 const std::filesystem::path srs_path = (args.size() > 2) ? args[2] :
"./";
32 std::filesystem::create_directories(srs_path);
37 std::vector<uint8_t> hash_input;
38 for (
size_t point_idx = start; point_idx < end; ++point_idx) {
39 bool rational_point_found =
false;
41 while (!rational_point_found) {
46 uint64_t point_index_le_order = htonll(
static_cast<uint64_t
>(point_idx));
47 uint64_t point_attempt_le_order = htonll(
static_cast<uint64_t
>(attempt));
48 hash_input.insert(hash_input.end(),
49 reinterpret_cast<uint8_t*
>(&point_index_le_order),
50 reinterpret_cast<uint8_t*
>(&point_index_le_order) +
sizeof(uint64_t));
51 hash_input.insert(hash_input.end(),
52 reinterpret_cast<uint8_t*
>(&point_attempt_le_order),
53 reinterpret_cast<uint8_t*
>(&point_attempt_le_order) +
sizeof(uint64_t));
56 ntohll(*
reinterpret_cast<uint64_t*
>(hash_result.data())),
57 ntohll(*
reinterpret_cast<uint64_t*
>(hash_result.data() +
sizeof(uint64_t))),
58 ntohll(*
reinterpret_cast<uint64_t*
>(hash_result.data() + 2 *
sizeof(uint64_t))),
59 ntohll(*
reinterpret_cast<uint64_t*
>(hash_result.data() + 3 *
sizeof(uint64_t))));
61 auto crs_element = grumpkin::g1::affine_element::from_compressed(hash_result_uint);
64 if (!crs_element.x.is_zero() || !crs_element.y.is_zero()) {
65 rational_point_found =
true;
void parallel_for_range(size_t num_points, const std::function< void(size_t, size_t)> &func, size_t no_multhreading_if_less_or_equal)
Split a loop into several loops running in parallel.