123 size_t final_active_wire_idx = 0)
130 constexpr size_t NONZERO_THRESHOLD = 75;
133 size_t total_num_scalars = 0;
134 for (
const auto& [first, second] : active_ranges) {
135 total_num_scalars += second - first;
139 size_t polynomial_size = final_active_wire_idx != 0 ? final_active_wire_idx : polynomial.
size();
140 size_t percentage_nonzero = total_num_scalars * 100 / polynomial_size;
141 if (percentage_nonzero > NONZERO_THRESHOLD) {
142 return commit(polynomial);
147 std::span<G1> point_table =
srs->get_monomial_points();
149 std::vector<Fr> scalars;
150 scalars.reserve(total_num_scalars);
152 points.reserve(total_num_scalars);
153 for (
const auto& [first, second] : active_ranges) {
154 auto poly_start = &polynomial[first];
159 scalars.insert(scalars.end(), poly_start, poly_end);
161 auto pts_start = &point_table[first];
162 auto pts_end = &point_table[second];
163 points.insert(points.end(), pts_start, pts_end);
167 G1 r = scalar_multiplication::pippenger_unsafe<Curve>({ 0, scalars }, points);
185 size_t final_active_wire_idx = 0)
193 constexpr size_t CONSTANT_THRESHOLD = 50;
200 size_t total_num_complement_scalars = 0;
201 for (
size_t i = 0; i < active_ranges.size() - 1; ++i) {
202 const size_t start = active_ranges[i].second;
203 const size_t end = active_ranges[i + 1].first;
205 active_ranges_complement.emplace_back(start, end);
206 total_num_complement_scalars += end - start;
210 size_t polynomial_size = final_active_wire_idx != 0 ? final_active_wire_idx : polynomial.
size();
212 size_t percentage_constant = total_num_complement_scalars * 100 / polynomial_size;
214 if (percentage_constant < CONSTANT_THRESHOLD) {
215 return commit(polynomial);
220 std::span<G1> point_table =
srs->get_monomial_points();
227 points.reserve(total_num_complement_scalars);
228 for (
const auto& [start, end] : active_ranges_complement) {
229 for (
size_t i = start; i < end; i++) {
230 points.emplace_back(point_table[i]);
236 std::vector<Fr> unique_scalars;
237 std::vector<size_t> sequence_counts;
238 for (
const auto& range : active_ranges_complement) {
239 unique_scalars.emplace_back(polynomial.
span[range.first]);
240 sequence_counts.emplace_back(range.second - range.first);
244 auto reduced_points = BatchedAddition::add_in_place(points, sequence_counts);
249 for (
auto [scalar, point] :
zip_view(unique_scalars, reduced_points)) {
250 result = result + point * scalar;