23template <
typename Fr>
Fr evaluate(
const Fr* coeffs,
const Fr& z,
const size_t n);
27 return evaluate(coeffs.data(), z, n);
31 return evaluate(coeffs, z, coeffs.size());
33template <
typename Fr>
Fr evaluate(
const std::vector<Fr*> coeffs,
const Fr& z,
const size_t large_n);
35void copy_polynomial(
const Fr* src,
Fr* dest,
size_t num_src_coefficients,
size_t num_target_coefficients);
39 requires SupportsFFT<Fr>
43 const std::vector<Fr*>& root_table);
46 requires SupportsFFT<Fr>
49 requires SupportsFFT<Fr>
52 requires SupportsFFT<Fr>
56 requires SupportsFFT<Fr>
59 requires SupportsFFT<Fr>
62 requires SupportsFFT<Fr>
65 requires SupportsFFT<Fr>
69 const size_t domain_extension);
72 requires SupportsFFT<Fr>
75 requires SupportsFFT<Fr>
79 requires SupportsFFT<Fr>
82 requires SupportsFFT<Fr>
85 requires SupportsFFT<Fr>
89 requires SupportsFFT<Fr>
93 requires SupportsFFT<Fr>
96 requires SupportsFFT<Fr>
102template <
typename Fr>
103 requires SupportsFFT<Fr>
107 unsigned long num_coeffs,
124template <
typename Fr>
132 const size_t size = polynomial.size();
138 std::copy_n(polynomial.begin() + 1, size - 1, polynomial.begin());
165 Fr root_inverse = (-root).invert();
170 for (
size_t i = 0; i < size - 1; ++i) {
173 temp = (polynomial[i] - temp);
174 temp *= root_inverse;
175 polynomial[i] = temp;
#define BB_ASSERT_LTE(left, right,...)
void ifft(Fr *coeffs, const EvaluationDomain< Fr > &domain)
void fft_inner_parallel(std::vector< Fr * > coeffs, const EvaluationDomain< Fr > &domain, const Fr &, const std::vector< Fr * > &root_table)
void coset_fft(Fr *coeffs, const EvaluationDomain< Fr > &domain)
void compute_linear_polynomial_product(const Fr *roots, Fr *dest, const size_t n)
void coset_fft_with_constant(Fr *coeffs, const EvaluationDomain< Fr > &domain, const Fr &constant)
Fr evaluate(const Fr *coeffs, const Fr &z, const size_t n)
void factor_roots(std::span< Fr > polynomial, const Fr &root)
Divides p(X) by (X-r) in-place.
void fft(Fr *coeffs, const EvaluationDomain< Fr > &domain)
fr compute_barycentric_evaluation(const fr *coeffs, const size_t num_coeffs, const fr &z, const EvaluationDomain< fr > &domain)
void compute_interpolation(const Fr *src, Fr *dest, const Fr *evaluation_points, const size_t n)
Fr compute_kate_opening_coefficients(const Fr *src, Fr *dest, const Fr &z, const size_t n)
void coset_ifft(Fr *coeffs, const EvaluationDomain< Fr > &domain)
void ifft_with_constant(Fr *coeffs, const EvaluationDomain< Fr > &domain, const Fr &value)
void copy_polynomial(const Fr *src, Fr *dest, size_t num_src_coefficients, size_t num_target_coefficients)
void compute_efficient_interpolation(const Fr *src, Fr *dest, const Fr *evaluation_points, const size_t n)
void coset_fft_with_generator_shift(Fr *coeffs, const EvaluationDomain< Fr > &domain, const Fr &constant)
Fr compute_sum(const Fr *src, const size_t n)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
BB_INLINE constexpr bool is_zero() const noexcept
static constexpr field zero()