63template <
typename Curve>
65 PolynomialSpan<const typename Curve::ScalarField> scalars,
67 size_t dedup_info = 0,
70 size_t max_threads = 0)
noexcept;
73 PolynomialSpan<const curve::BN254::ScalarField> scalars,
78 size_t max_threads)
noexcept;
81 PolynomialSpan<const curve::Grumpkin::ScalarField> scalars,
86 size_t max_threads)
noexcept;
100template <
typename Curve>
103 bool handle_edge_cases =
true,
104 size_t dedup_info = 0) noexcept;
106template <typename
Curve>
108 std::span<const typename
Curve::AffineElement> points,
109 size_t dedup_info = 0) noexcept;
112 PolynomialSpan<const curve::
BN254::ScalarField> scalars,
113 std::span<const curve::
BN254::AffineElement> points,
114 bool handle_edge_cases,
115 size_t dedup_info) noexcept;
118 PolynomialSpan<const curve::Grumpkin::ScalarField> scalars,
119 std::span<const curve::Grumpkin::AffineElement> points,
120 bool handle_edge_cases,
121 size_t dedup_info) noexcept;
124 PolynomialSpan<const curve::
BN254::ScalarField> scalars,
125 std::span<const curve::
BN254::AffineElement> points,
126 size_t dedup_info) noexcept;
129 PolynomialSpan<const curve::Grumpkin::ScalarField> scalars,
130 std::span<const curve::Grumpkin::AffineElement> points,
131 size_t dedup_info) noexcept;
145 static AffineElement msm(std::span<const AffineElement> points,
147 bool handle_edge_cases =
false,
148 size_t dedup_info = 0) noexcept;
172 bool handle_edge_cases = true,
173 std::span<const uint32_t> dedup_infos = {})
noexcept;
176extern template class MSM_fast<curve::Grumpkin>;
177extern template class MSM_fast<curve::BN254>;
204template <
typename Curve>
206 bool external_glv_provided,
207 bool dedup_active =
false,
208 size_t max_threads = 0) noexcept;
214inline constexpr size_t GLV_SMALL_N_THRESHOLD =
size_t{ 1 } << 16;
227template <
typename Curve>
230 size_t min_pts_per_thread_override = 0,
231 size_t max_threads = 0) noexcept;
233extern template curve::
BN254::
Element pippenger_round_parallel_jacobian_fast<curve::
BN254>(
234 std::span<const curve::
BN254::ScalarField> scalars,
235 std::span<const curve::
BN254::AffineElement> points,
236 size_t min_pts_per_thread_override,
237 size_t max_threads) noexcept;
239extern template curve::Grumpkin::
Element pippenger_round_parallel_jacobian_fast<curve::Grumpkin>(
240 std::span<const curve::Grumpkin::ScalarField> scalars,
241 std::span<const curve::Grumpkin::AffineElement> points,
242 size_t min_pts_per_thread_override,
243 size_t max_threads) noexcept;
250template <typename
Curve>
252 std::span<const typename
Curve::AffineElement> all_points) noexcept;
256 std::span<const curve::
BN254::AffineElement> all_points) noexcept;
260 std::span<const curve::Grumpkin::AffineElement> all_points) noexcept;
266template <typename
Curve>
268 std::span<const typename
Curve::AffineElement> all_points,
269 size_t max_threads = 0) noexcept;
273 std::span<const curve::
BN254::AffineElement> all_points,
274 size_t max_threads) noexcept;
278 std::span<const curve::Grumpkin::AffineElement> all_points,
279 size_t max_threads) noexcept;
typename Group::element Element
typename Group::element Element
typename Group::affine_element AffineElement
typename Curve::ScalarField ScalarField
typename Curve::Element Element
typename Curve::AffineElement AffineElement
constexpr size_t GLV_SMALL_N_THRESHOLD
Curve::Element trivial_msm(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points) noexcept
Single-threaded small-MSM_fast driver: Element::straus_msm over the input slice.
Curve::Element pippenger_unsafe_fast(PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, size_t dedup_info) noexcept
Curve::Element trivial_msm_threaded(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points, size_t max_threads=0) noexcept
Multi-threaded small-MSM_fast driver: parallel Element::straus_msm over zero-skipped input slices.
template curve::BN254::Element pippenger_round_parallel< curve::BN254 >(PolynomialSpan< const curve::BN254::ScalarField > scalars, std::span< const curve::BN254::AffineElement > points, size_t dedup_info, std::span< const curve::BN254::AffineElement > external_glv_doubled, std::span< std::byte > external_arena, size_t max_threads) noexcept
size_t compute_arena_bytes_for_msm(size_t n_input, bool external_glv_provided, bool dedup_active, size_t max_threads) noexcept
Round-parallel Pippenger MSM_fast. Windows process sequentially (high-to-low) but each window is full...
constexpr size_t MIN_PTS_PER_THREAD_FOR_PIPPENGER
template curve::Grumpkin::Element pippenger_round_parallel< curve::Grumpkin >(PolynomialSpan< const curve::Grumpkin::ScalarField > scalars, std::span< const curve::Grumpkin::AffineElement > points, size_t dedup_info, std::span< const curve::Grumpkin::AffineElement > external_glv_doubled, std::span< std::byte > external_arena, size_t max_threads) noexcept
constexpr size_t SMALL_MSM_BATCH_THRESHOLD
size_t window_bits_tuning_oversub_factor(size_t n_input)
N-dependent oversubscription factor used ONLY for choose_window_bits' target_load formula (not for ac...
constexpr size_t MSM_MIN_PTS_PER_THREAD
Curve::Element pippenger_fast(PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, bool handle_edge_cases, size_t dedup_info) noexcept
Curve::Element pippenger_round_parallel(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points, size_t dedup_info, std::span< const typename Curve::AffineElement > external_glv_doubled, std::span< std::byte > external_arena, size_t max_threads) noexcept
State of the art pippenger_fast multiscalar multiplication algorithm.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept