2#include "evaluation_domain.hpp"
5namespace polynomial_arithmetic {
17template <
typename Fr>
Fr evaluate(
const Fr* coeffs,
const Fr& z,
const size_t n);
18template <
typename Fr>
Fr evaluate(std::span<const Fr> coeffs,
const Fr& z,
const size_t n)
20 ASSERT(n <= coeffs.size());
21 return evaluate(coeffs.data(), z, n);
23template <
typename Fr>
Fr evaluate(std::span<const Fr> coeffs,
const Fr& z)
25 return evaluate(coeffs, z, coeffs.size());
27template <
typename Fr>
Fr evaluate(
const std::vector<Fr*> coeffs,
const Fr& z,
const size_t large_n);
29void copy_polynomial(
const Fr* src,
Fr* dest,
size_t num_src_coefficients,
size_t num_target_coefficients);
33 requires SupportsFFT<Fr>
34void fft_inner_serial(std::vector<Fr*> coeffs,
const size_t domain_size,
const std::vector<Fr*>& root_table);
36 requires SupportsFFT<Fr>
37void fft_inner_parallel(std::vector<Fr*> coeffs,
38 const EvaluationDomain<Fr>& domain,
40 const std::vector<Fr*>& root_table);
43 requires SupportsFFT<Fr>
44void fft(
Fr* coeffs,
const EvaluationDomain<Fr>& domain);
46 requires SupportsFFT<Fr>
47void fft(
Fr* coeffs,
Fr* target,
const EvaluationDomain<Fr>& domain);
49 requires SupportsFFT<Fr>
50void fft(std::vector<Fr*> coeffs,
const EvaluationDomain<Fr>& domain);
52 requires SupportsFFT<Fr>
53void fft_with_constant(
Fr* coeffs,
const EvaluationDomain<Fr>& domain,
const Fr& value);
56 requires SupportsFFT<Fr>
57void coset_fft(
Fr* coeffs,
const EvaluationDomain<Fr>& domain);
59 requires SupportsFFT<Fr>
60void coset_fft(
Fr* coeffs,
Fr* target,
const EvaluationDomain<Fr>& domain);
62 requires SupportsFFT<Fr>
63void coset_fft(std::vector<Fr*> coeffs,
const EvaluationDomain<Fr>& domain);
65 requires SupportsFFT<Fr>
66void coset_fft(
Fr* coeffs,
67 const EvaluationDomain<Fr>& small_domain,
68 const EvaluationDomain<Fr>& large_domain,
69 const size_t domain_extension);
72 requires SupportsFFT<Fr>
73void coset_fft_with_constant(
Fr* coeffs,
const EvaluationDomain<Fr>& domain,
const Fr& constant);
75 requires SupportsFFT<Fr>
76void coset_fft_with_generator_shift(
Fr* coeffs,
const EvaluationDomain<Fr>& domain,
const Fr& constant);
79 requires SupportsFFT<Fr>
80void ifft(
Fr* coeffs,
const EvaluationDomain<Fr>& domain);
82 requires SupportsFFT<Fr>
83void ifft(
Fr* coeffs,
Fr* target,
const EvaluationDomain<Fr>& domain);
85 requires SupportsFFT<Fr>
86void ifft(std::vector<Fr*> coeffs,
const EvaluationDomain<Fr>& domain);
89 requires SupportsFFT<Fr>
90void ifft_with_constant(
Fr* coeffs,
const EvaluationDomain<Fr>& domain,
const Fr& value);
93 requires SupportsFFT<Fr>
94void coset_ifft(
Fr* coeffs,
const EvaluationDomain<Fr>& domain);
96 requires SupportsFFT<Fr>
97void coset_ifft(std::vector<Fr*> coeffs,
const EvaluationDomain<Fr>& domain);
100 requires SupportsFFT<Fr>
101void partial_fft_serial_inner(
Fr* coeffs,
103 const EvaluationDomain<Fr>& domain,
104 const std::vector<Fr*>& root_table);
105template <
typename Fr>
106 requires SupportsFFT<Fr>
107void partial_fft_parellel_inner(
Fr* coeffs,
108 const EvaluationDomain<Fr>& domain,
109 const std::vector<Fr*>& root_table,
111 bool is_coset =
false);
113template <
typename Fr>
114 requires SupportsFFT<Fr>
115void partial_fft_serial(
Fr* coeffs,
Fr* target,
const EvaluationDomain<Fr>& domain);
116template <
typename Fr>
117 requires SupportsFFT<Fr>
118void partial_fft(
Fr* coeffs,
const EvaluationDomain<Fr>& domain,
Fr constant = 1,
bool is_coset =
false);
120template <
typename Fr>
121void add(
const Fr* a_coeffs,
const Fr* b_coeffs,
Fr* r_coeffs,
const EvaluationDomain<Fr>& domain);
122template <
typename Fr>
123void sub(
const Fr* a_coeffs,
const Fr* b_coeffs,
Fr* r_coeffs,
const EvaluationDomain<Fr>& domain);
125template <
typename Fr>
126void mul(
const Fr* a_coeffs,
const Fr* b_coeffs,
Fr* r_coeffs,
const EvaluationDomain<Fr>& domain);
134template <
typename Fr>
135 requires SupportsFFT<Fr>
136void compute_lagrange_polynomial_fft(
Fr* l_1_coefficients,
137 const EvaluationDomain<Fr>& src_domain,
138 const EvaluationDomain<Fr>& target_domain);
140template <
typename Fr>
141 requires SupportsFFT<Fr>
142void divide_by_pseudo_vanishing_polynomial(std::vector<Fr*> coeffs,
143 const EvaluationDomain<Fr>& src_domain,
144 const EvaluationDomain<Fr>& target_domain,
145 const size_t num_roots_cut_out_of_vanishing_polynomial = 4);
150template <
typename Fr>
151 requires SupportsFFT<Fr>
152Fr compute_kate_opening_coefficients(
const Fr* src,
Fr* dest,
const Fr& z,
const size_t n);
155template <
typename Fr>
156 requires SupportsFFT<Fr>
157LagrangeEvaluations<Fr> get_lagrange_evaluations(
const Fr& z,
158 const EvaluationDomain<Fr>& domain,
159 const size_t num_roots_cut_out_of_vanishing_polynomial = 4);
160template <
typename Fr>
161Fr compute_barycentric_evaluation(
const Fr* coeffs,
162 const size_t num_coeffs,
164 const EvaluationDomain<Fr>& domain);
166template <
typename Fr>
167 requires SupportsFFT<Fr>
168void compress_fft(
const Fr* src,
Fr* dest,
const size_t current_size,
const size_t compress_factor);
170template <
typename Fr>
171 requires SupportsFFT<Fr>
172Fr evaluate_from_fft(
const Fr* poly_coset_fft,
173 const EvaluationDomain<Fr>& large_domain,
175 const EvaluationDomain<Fr>& small_domain);
178template <
typename Fr>
Fr compute_sum(
const Fr* src,
const size_t n);
181template <
typename Fr>
void compute_linear_polynomial_product(
const Fr* roots,
Fr* dest,
const size_t n);
185template <
typename Fr>
Fr compute_linear_polynomial_product_evaluation(
const Fr* roots,
const Fr z,
const size_t n);
189template <
typename Fr>
190 requires SupportsFFT<Fr>
191void fft_linear_polynomial_product(
192 const Fr* roots,
Fr* dest,
const size_t n,
const EvaluationDomain<Fr>& domain,
const bool is_coset =
false);
196template <
typename Fr>
void compute_interpolation(
const Fr* src,
Fr* dest,
const Fr* evaluation_points,
const size_t n);
201template <
typename Fr>
202void compute_efficient_interpolation(
const Fr* src,
Fr* dest,
const Fr* evaluation_points,
const size_t n);
207template <
typename Fr>
void factor_roots(std::span<Fr> polynomial,
const Fr& root)
209 const size_t size = polynomial.size();
210 if (root.is_zero()) {
215 std::copy_n(polynomial.begin() + 1, size - 1, polynomial.begin());
242 Fr root_inverse = (-root).invert();
247 for (
size_t i = 0; i < size - 1; ++i) {
250 temp = (polynomial[i] - temp);
251 temp *= root_inverse;
252 polynomial[i] = temp;
255 polynomial[size - 1] = Fr::zero();
268template <
typename Fr>
void factor_roots(std::span<Fr> polynomial, std::span<const Fr> roots)
270 const size_t size = polynomial.size();
271 if (roots.size() == 1) {
272 factor_roots(polynomial, roots[0]);
291 const size_t num_roots = roots.size();
292 ASSERT(num_roots < size);
293 const size_t new_size = size - num_roots;
295 std::vector<Fr> minus_root_inverses;
296 minus_root_inverses.reserve(num_roots);
300 size_t num_zero_roots{ 0 };
302 for (
const auto& root : roots) {
303 if (root.is_zero()) {
308 minus_root_inverses.emplace_back(-root);
312 for (
size_t i = 0; i < num_zero_roots; ++i) {
313 ASSERT(polynomial[i].is_zero());
318 auto zero_factored = polynomial.subspan(num_zero_roots);
320 const size_t num_non_zero_roots = minus_root_inverses.size();
321 if (num_non_zero_roots > 0) {
322 Fr::batch_invert(minus_root_inverses);
324 std::vector<Fr> division_cache;
325 division_cache.reserve(num_non_zero_roots);
328 Fr temp = zero_factored[0];
329 for (
const auto& minus_root_inverse : minus_root_inverses) {
330 temp *= minus_root_inverse;
331 division_cache.emplace_back(temp);
334 polynomial[0] = division_cache.back();
337 for (
size_t i = 1; i < zero_factored.size() - num_non_zero_roots; i++) {
338 temp = zero_factored[i];
340 for (
size_t j = 0; j < num_non_zero_roots; j++) {
341 temp -= division_cache[j];
342 temp *= minus_root_inverses[j];
343 division_cache[j] = temp;
346 polynomial[i] = temp;
348 }
else if (num_zero_roots > 0) {
353 std::copy_n(zero_factored.begin(), zero_factored.size(), polynomial.begin());
357 for (
size_t i = new_size; i < size; ++i) {
358 polynomial[i] = Fr::zero();
Definition: polynomial_arithmetic.hpp:8
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16
Definition: polynomial_arithmetic.hpp:10