61template <
typename Curve>
63 PolynomialSpan<const typename Curve::ScalarField> scalars,
65 bool dedup_hint =
false,
70 PolynomialSpan<const curve::BN254::ScalarField> scalars,
77 PolynomialSpan<const curve::Grumpkin::ScalarField> scalars,
95template <
typename Curve>
98 bool handle_edge_cases =
true,
99 bool dedup_hint =
false) noexcept;
101template <typename
Curve>
103 std::span<const typename
Curve::AffineElement> points,
104 bool dedup_hint = false) noexcept;
107 PolynomialSpan<const curve::
BN254::ScalarField> scalars,
108 std::span<const curve::
BN254::AffineElement> points,
109 bool handle_edge_cases,
110 bool dedup_hint) noexcept;
113 PolynomialSpan<const curve::Grumpkin::ScalarField> scalars,
114 std::span<const curve::Grumpkin::AffineElement> points,
115 bool handle_edge_cases,
116 bool dedup_hint) noexcept;
119 PolynomialSpan<const curve::
BN254::ScalarField> scalars,
120 std::span<const curve::
BN254::AffineElement> points,
121 bool dedup_hint) noexcept;
124 PolynomialSpan<const curve::Grumpkin::ScalarField> scalars,
125 std::span<const curve::Grumpkin::AffineElement> points,
126 bool dedup_hint) noexcept;
140 static AffineElement msm(std::span<const AffineElement> points,
142 bool handle_edge_cases =
false,
143 bool dedup_hint =
false) noexcept;
167 bool handle_edge_cases = true,
168 std::span<const uint8_t> dedup_hints = {})
noexcept;
171extern template class MSM_fast<curve::Grumpkin>;
172extern template class MSM_fast<curve::BN254>;
182template <
typename Curve>
189inline constexpr size_t GLV_SMALL_N_THRESHOLD =
size_t{ 1 } << 16;
202template <
typename Curve>
205 size_t min_pts_per_thread_override = 0) noexcept;
207extern template curve::
BN254::
Element pippenger_round_parallel_jacobian_fast<curve::
BN254>(
208 std::span<const curve::
BN254::ScalarField> scalars,
209 std::span<const curve::
BN254::AffineElement> points,
210 size_t min_pts_per_thread_override) noexcept;
212extern template curve::Grumpkin::
Element pippenger_round_parallel_jacobian_fast<curve::Grumpkin>(
213 std::span<const curve::Grumpkin::ScalarField> scalars,
214 std::span<const curve::Grumpkin::AffineElement> points,
215 size_t min_pts_per_thread_override) noexcept;
222template <typename
Curve>
224 std::span<const typename
Curve::AffineElement> all_points) noexcept;
228 std::span<const curve::
BN254::AffineElement> all_points) noexcept;
232 std::span<const curve::Grumpkin::AffineElement> all_points) noexcept;
238template <typename
Curve>
240 std::span<const typename
Curve::AffineElement> all_points) noexcept;
244 std::span<const curve::
BN254::AffineElement> all_points) noexcept;
248 std::span<const curve::Grumpkin::AffineElement> all_points) 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_threaded(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points) noexcept
Multi-threaded small-MSM_fast driver: parallel Element::straus_msm over zero-skipped input slices.
size_t compute_arena_bytes_for_msm(size_t n_input, bool external_glv_provided, bool dedup_active) noexcept
Round-parallel Pippenger MSM_fast. Windows process sequentially (high-to-low) but each window is full...
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, bool dedup_hint) noexcept
constexpr size_t MIN_PTS_PER_THREAD_FOR_PIPPENGER
template curve::BN254::Element pippenger_round_parallel< curve::BN254 >(PolynomialSpan< const curve::BN254::ScalarField > scalars, std::span< const curve::BN254::AffineElement > points, bool dedup_hint, std::span< const curve::BN254::AffineElement > external_glv_doubled, std::span< std::byte > external_arena) noexcept
template curve::Grumpkin::Element pippenger_round_parallel< curve::Grumpkin >(PolynomialSpan< const curve::Grumpkin::ScalarField > scalars, std::span< const curve::Grumpkin::AffineElement > points, bool dedup_hint, std::span< const curve::Grumpkin::AffineElement > external_glv_doubled, std::span< std::byte > external_arena) noexcept
Curve::Element pippenger_fast(PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, bool handle_edge_cases, bool dedup_hint) noexcept
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...
Curve::Element pippenger_round_parallel(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points, bool dedup_hint, std::span< const typename Curve::AffineElement > external_glv_doubled, std::span< std::byte > external_arena) noexcept
State of the art pippenger_fast multiscalar multiplication algorithm.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept