27template <
class Fr,
size_t view_domain_end>
class UnivariateView;
34 static constexpr size_t LENGTH = domain_end;
57 static_assert(domain_end >= 2);
71 static_assert(domain_end >= 2);
77 for (
size_t i = 1; i < domain_end; ++i) {
91 for (
size_t i = 1; i < domain_end - 1; ++i) {
104 for (
size_t i = 0; i <
LENGTH; ++i) {
113 for (
size_t i = 0; i <
LENGTH; ++i) {
125 for (
size_t i = 0; i <
LENGTH; ++i) {
151 for (
size_t i = 0; i !=
LENGTH; ++i) {
164 for (
size_t i = 0; i <
LENGTH; ++i) {
171 for (
size_t i = 0; i <
LENGTH; ++i) {
178 for (
size_t i = 0; i <
LENGTH; ++i) {
185 for (
size_t i = 0; i <
LENGTH; ++i) {
274 for (
size_t i = 0; i <
LENGTH; ++i) {
282 for (
size_t i = 0; i <
LENGTH; ++i) {
290 for (
size_t i = 0; i <
LENGTH; ++i) {
322 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
333 template <
size_t EXTENDED_DOMAIN_END>
335 requires(domain_end == 2)
337 return extend_to<EXTENDED_DOMAIN_END>();
359 static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END;
361 static_assert(EXTENDED_LENGTH >=
LENGTH);
367 if constexpr (
LENGTH == 2) {
374 static_assert(EXTENDED_LENGTH != 0);
375 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
376 result.value_at(idx + 1) =
result.value_at(idx) + delta;
378 }
else if constexpr (
LENGTH == 3) {
379 static constexpr Fr inverse_two =
Fr(2).
invert();
395 for (
size_t i = 0; i < domain_end - 2; i++) {
398 Fr extra = a_mul +
a +
b;
399 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
400 result.value_at(idx + 1) =
result.value_at(idx) + extra;
403 }
else if constexpr (
LENGTH == 4) {
404 static constexpr Fr inverse_six =
Fr(6).
invert();
428 Fr zero_times_6 = zero_times_3 + zero_times_3;
429 Fr zero_times_12 = zero_times_6 + zero_times_6;
431 Fr one_times_6 = one_times_3 + one_times_3;
434 Fr three_times_3 = three_times_2 +
value_at(3);
436 Fr one_minus_two_times_3 = one_times_3 - two_times_3;
437 Fr one_minus_two_times_6 = one_minus_two_times_3 + one_minus_two_times_3;
438 Fr one_minus_two_times_12 = one_minus_two_times_6 + one_minus_two_times_6;
440 Fr b = (zero_times_6 - one_minus_two_times_12 - one_times_3 - three_times_3) * inverse_six;
441 Fr c = (
value_at(0) - zero_times_12 + one_minus_two_times_12 + one_times_6 + two_times_3 + three_times_2) *
447 Fr a_plus_b_times_2 = a_plus_b + a_plus_b;
448 size_t start_idx_sqr = (domain_end - 1) * (domain_end - 1);
449 size_t idx_sqr_three = start_idx_sqr + start_idx_sqr + start_idx_sqr;
450 Fr idx_sqr_three_times_a =
Fr(idx_sqr_three) *
a;
451 Fr x_a_term =
Fr(6 * (domain_end - 1)) *
a;
452 Fr three_a =
a +
a +
a;
453 Fr six_a = three_a + three_a;
455 Fr three_a_plus_two_b = a_plus_b_times_2 +
a;
456 Fr linear_term =
Fr(domain_end - 1) * three_a_plus_two_b + (a_plus_b + c);
458 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
459 result.value_at(idx + 1) =
result.value_at(idx) + idx_sqr_three_times_a + linear_term;
461 idx_sqr_three_times_a += x_a_term + three_a;
464 linear_term += three_a_plus_two_b;
467 for (
size_t k = domain_end; k != EXTENDED_DOMAIN_END; ++k) {
470 for (
size_t j = 0; j != domain_end; ++j) {
472 term *= Data::precomputed_denominator_inverses[
LENGTH * k + j];
473 result.value_at(k) += term;
476 result.value_at(k) *= Data::full_numerator_values[k];
490 if constexpr (INITIAL_LENGTH == 2) {
493 for (
size_t idx = 2; idx <
LENGTH; idx++) {
498 throw_or_abort(
"self_extend_from called with INITIAL_LENGTH different from 2.");
511 Fr full_numerator_value = 1;
512 for (
size_t i = 0; i != domain_end; ++i) {
513 full_numerator_value *= u - i;
519 for (
size_t i = 0; i !=
LENGTH; ++i) {
520 Fr inv = Data::lagrange_denominators[i];
521 inv *= u - Data::big_domain[i];
523 denominator_inverses[i] = inv;
528 for (
size_t i = 0; i != domain_end; ++i) {
530 term *= denominator_inverses[i];
534 result *= full_numerator_value;
552template <
typename B,
class Fr,
size_t domain_end>
559template <
class Fr,
size_t domain_end>
565template <
class Fr,
size_t domain_end>
571template <
class Fr,
size_t domain_end>
579 static constexpr size_t LENGTH = domain_end;
588 for (
size_t i = 0; i <
LENGTH; ++i) {
598 template <
size_t full_domain_end>
603 static_assert(
LENGTH <= full_domain_end);
609 static_assert(domain_end >= 2);
702 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
714template <
class Fr,
size_t domain_end>
720template <
class Fr,
size_t domain_end>
726template <
class Fr,
size_t domain_end>
748 return { { T{ elements[Is] }... } };
778template <
typename T,
size_t N>
struct tuple_size<
bb::Univariate<T, N>> : std::integral_constant<std::size_t, N> {};
A view of a univariate, also used to truncate univariates.
std::array< Fr, 3 > coefficients
Storage for polynomial coefficients (always 3 elements for uniform layout).
A univariate polynomial represented by its values on {0, 1,..., domain_end - 1}.
const Fr & value_at(size_t i) const
static constexpr size_t LENGTH
Univariate & operator+=(const Univariate &other)
Univariate & operator-=(const Univariate &other)
bool operator==(const Univariate &other) const =default
Univariate & operator+=(const Fr &scalar)
Univariate operator*(const UnivariateView< Fr, domain_end > &view) const
Univariate(const std::array< Fr, LENGTH > &evaluations)
Univariate(const UnivariateCoefficientBasis< Fr, 3, has_a0_plus_a1 > &monomial)
friend std::ostream & operator<<(std::ostream &os, const Univariate &u)
void self_extend_from()
Compute the evaluations of the polynomial from the INITIAL_LENGTH up to the total LENGTH....
Univariate & operator=(Univariate &&other) noexcept=default
Univariate operator*(const Fr &scalar) const
Univariate & operator*=(const Fr &scalar)
Univariate operator+(const UnivariateView< Fr, domain_end > &view) const
std::array< Fr, LENGTH > evaluations
Univariate operator-(const Fr &scalar) const
static Univariate serialize_from_buffer(uint8_t const *buffer)
Univariate operator-(const UnivariateView< Fr, domain_end > &view) const
Univariate & operator=(const Univariate &other)=default
static Univariate get_random()
Univariate(Univariate &&other) noexcept=default
Univariate & operator*=(const UnivariateView< Fr, domain_end > &view)
Univariate operator-(const Univariate &other) const
std::vector< uint8_t > to_buffer() const
Univariate & operator*=(const Univariate &other)
Univariate operator+(const Fr &scalar) const
static constexpr size_t MONOMIAL_LENGTH
Univariate & operator-=(const UnivariateView< Fr, domain_end > &view)
Univariate & operator+=(const UnivariateView< Fr, domain_end > &view)
Univariate operator*(const Univariate &other) const
Fr evaluate(const Fr &u) const
Evaluate a univariate at a point u not known at compile time and assumed not to be in the domain (els...
Univariate(const Univariate &other)=default
Univariate operator-() const
Univariate(const UnivariateCoefficientBasis< Fr, 2, has_a0_plus_a1 > &monomial)
Univariate(const UnivariateView< Fr, domain_end > &in)
Univariate operator+(const Univariate &other) const
Univariate(const Fr &value)
Univariate< Fr, EXTENDED_DOMAIN_END > extend_to() const
Given a univariate f represented by {f(0), ..., f(domain_end - 1)}, compute the evaluations {f(domain...
Univariate & operator-=(const Fr &scalar)
A view of a univariate, also used to truncate univariates.
Univariate< Fr, domain_end > sqr() const
bool operator==(const UnivariateView &other) const
friend std::ostream & operator<<(std::ostream &os, const UnivariateView &u)
Univariate< Fr, domain_end > operator-() const
std::span< const Fr, LENGTH > evaluations
static constexpr size_t LENGTH
Univariate< Fr, domain_end > operator-(const Fr &other) const
Univariate< Fr, domain_end > operator*(const UnivariateView &other) const
Univariate< Fr, domain_end > operator-(const UnivariateView &other) const
Univariate< Fr, domain_end > operator*(const Univariate< Fr, domain_end > &other) const
Univariate< Fr, domain_end > operator+(const Univariate< Fr, domain_end > &other) const
const Fr & value_at(size_t i) const
UnivariateView(const Univariate< Fr, full_domain_end > &univariate_in)
Univariate< Fr, domain_end > operator+(const UnivariateView &other) const
Univariate< Fr, domain_end > operator*(const Fr &other) const
Univariate< Fr, domain_end > operator+(const Fr &other) const
static constexpr size_t MONOMIAL_LENGTH
Univariate< Fr, domain_end > operator-(const Univariate< Fr, domain_end > &other) const
std::unique_ptr< uint8_t[]> buffer
Entry point for Barretenberg command-line interface.
void read(B &it, field2< base_field, Params > &value)
Univariate< Fr, domain_end > operator+(const Fr &ff, const Univariate< Fr, domain_end > &uv)
void write(B &buf, field2< base_field, Params > const &value)
Univariate< Fr, domain_end > operator-(const Fr &ff, const Univariate< Fr, domain_end > &uv)
Univariate< Fr, domain_end > operator*(const Fr &ff, const Univariate< Fr, domain_end > &uv)
std::array< T, N > array_to_array(const std::array< U, N > &elements)
Given an std::array<U,N>, returns an std::array<T,N>, by calling the (explicit) constructor T(U).
std::array< T, sizeof...(Is)> array_to_array_aux(const std::array< U, N > &elements, std::index_sequence< Is... >)
Create a sub-array of elements at the indices given in the template pack Is, converting them to the n...
std::conditional_t< is_field_type_v< Fr >, BarycentricDataCompileTime< Fr, domain_end, num_evals >, BarycentricDataRunTime< Fr, domain_end, num_evals > > BarycentricData
Exposes BarycentricData with compile time arrays if the type is bberg::field and runtime arrays other...
void read(auto &it, msgpack_concepts::HasMsgPack auto &obj)
Automatically derived read for any object that defines .msgpack() (implicitly defined by SERIALIZATIO...
void write(auto &buf, const msgpack_concepts::HasMsgPack auto &obj)
Automatically derived write for any object that defines .msgpack() (implicitly defined by SERIALIZATI...
void read(auto &buf, std::integral auto &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()
void throw_or_abort(std::string const &err)