2#include "barretenberg/ecc/fields/field.hpp"
29 static constexpr size_t domain_size = domain_end - domain_start;
30 static constexpr size_t big_domain_size = std::max(domain_size, num_evals);
39 std::array<Fr, big_domain_size> result;
40 for (
size_t i = 0; i < big_domain_size; ++i) {
41 result[i] =
static_cast<Fr>(i + domain_start);
47 static constexpr std::array<Fr, domain_size> construct_lagrange_denominators(
const auto& big_domain)
49 std::array<Fr, domain_size> result;
50 for (
size_t i = 0; i != domain_size; ++i) {
52 for (
size_t j = 0; j != domain_size; ++j) {
54 result[i] *= big_domain[i] - big_domain[j];
61 static constexpr std::array<Fr, domain_size * num_evals> batch_invert(
62 const std::array<Fr, domain_size * num_evals>& coeffs)
64 constexpr size_t n = domain_size * num_evals;
65 std::array<Fr, n> temporaries{};
66 std::array<bool, n> skipped{};
68 for (
size_t i = 0; i < n; ++i) {
69 temporaries[i] = accumulator;
74 accumulator *= coeffs[i];
77 accumulator =
Fr(1) / accumulator;
78 std::array<Fr, n> result{};
80 for (
size_t i = n - 1; i < n; --i) {
82 T0 = accumulator * temporaries[i];
83 accumulator *= coeffs[i];
92 static constexpr std::array<Fr, domain_size * num_evals> construct_denominator_inverses(
93 const auto& big_domain,
const auto& lagrange_denominators)
95 std::array<Fr, domain_size * num_evals> result{};
96 for (
size_t k = domain_size; k < num_evals; ++k) {
97 for (
size_t j = 0; j < domain_size; ++j) {
98 Fr inv = lagrange_denominators[j];
99 inv *= (big_domain[k] - big_domain[j]);
100 result[k * domain_size + j] = inv;
103 return batch_invert(result);
110 static constexpr std::array<Fr, num_evals> construct_full_numerator_values(
const auto& big_domain)
112 std::array<Fr, num_evals> result;
113 for (
size_t i = 0; i != num_evals; ++i) {
115 Fr v_i = i + domain_start;
116 for (
size_t j = 0; j != domain_size; ++j) {
117 result[i] *= v_i - big_domain[j];
124 static constexpr auto lagrange_denominators = construct_lagrange_denominators(big_domain);
125 static constexpr auto precomputed_denominator_inverses =
126 construct_denominator_inverses(big_domain, lagrange_denominators);
127 static constexpr auto full_numerator_values = construct_full_numerator_values(big_domain);
132 static constexpr size_t domain_size = domain_end - domain_start;
133 static constexpr size_t big_domain_size = std::max(domain_size, num_evals);
142 std::array<Fr, big_domain_size> result;
143 for (
size_t i = 0; i < big_domain_size; ++i) {
144 result[i] =
static_cast<Fr>(i + domain_start);
150 static std::array<Fr, domain_size> construct_lagrange_denominators(
const auto& big_domain)
152 std::array<Fr, domain_size> result;
153 for (
size_t i = 0; i != domain_size; ++i) {
155 for (
size_t j = 0; j != domain_size; ++j) {
157 result[i] *= big_domain[i] - big_domain[j];
164 static std::array<Fr, domain_size * num_evals> batch_invert(
const std::array<Fr, domain_size * num_evals>& coeffs)
166 constexpr size_t n = domain_size * num_evals;
167 std::array<Fr, n> temporaries{};
168 std::array<bool, n> skipped{};
170 for (
size_t i = 0; i < n; ++i) {
171 temporaries[i] = accumulator;
172 if (coeffs[i].get_value() == 0) {
176 accumulator *= coeffs[i];
179 accumulator =
Fr(1) / accumulator;
180 std::array<Fr, n> result{};
182 for (
size_t i = n - 1; i < n; --i) {
184 T0 = accumulator * temporaries[i];
185 accumulator *= coeffs[i];
194 static std::array<Fr, domain_size * num_evals> construct_denominator_inverses(
const auto& big_domain,
195 const auto& lagrange_denominators)
197 std::array<Fr, domain_size * num_evals> result{};
198 for (
size_t k = domain_size; k < num_evals; ++k) {
199 for (
size_t j = 0; j < domain_size; ++j) {
200 Fr inv = lagrange_denominators[j];
201 inv *= (big_domain[k] - big_domain[j]);
202 result[k * domain_size + j] = inv;
205 return batch_invert(result);
212 static std::array<Fr, num_evals> construct_full_numerator_values(
const auto& big_domain)
214 std::array<Fr, num_evals> result;
215 for (
size_t i = 0; i != num_evals; ++i) {
217 Fr v_i = i + domain_start;
218 for (
size_t j = 0; j != domain_size; ++j) {
219 result[i] *= v_i - big_domain[j];
226 inline static const auto lagrange_denominators = construct_lagrange_denominators(big_domain);
227 inline static const auto precomputed_denominator_inverses =
228 construct_denominator_inverses(big_domain, lagrange_denominators);
229 inline static const auto full_numerator_values = construct_full_numerator_values(big_domain);
238 static constexpr bool value =
false;
242 static constexpr bool value =
true;
254template <
class Fr,
size_t domain_end,
size_t num_evals,
size_t domain_start = 0>
Definition: barycentric.hpp:27
static constexpr std::array< Fr, big_domain_size > construct_big_domain()
Definition: barycentric.hpp:37
Definition: barycentric.hpp:130
static std::array< Fr, big_domain_size > construct_big_domain()
Definition: barycentric.hpp:140
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16
std::conditional_t< is_field_type_v< Fr >, BarycentricDataCompileTime< Fr, domain_end, num_evals, domain_start >, BarycentricDataRunTime< Fr, domain_end, num_evals, domain_start > > BarycentricData
Exposes BarycentricData with compile time arrays if the type is bberg::field and runtime arrays other...
Definition: barycentric.hpp:257
Helper to determine whether input is bberg::field type.
Definition: barycentric.hpp:237