27template <
class Fr,
size_t view_domain_end>
class UnivariateView;
34 static constexpr size_t LENGTH = domain_end;
57 static_assert(domain_end >= 2);
73 for (
size_t i = 1; i < domain_end; ++i) {
87 for (
size_t i = 1; i < domain_end - 1; ++i) {
100 for (
size_t i = 0; i <
LENGTH; ++i) {
109 for (
size_t i = 0; i <
LENGTH; ++i) {
121 for (
size_t i = 0; i <
LENGTH; ++i) {
145 for (
size_t i = 0; i !=
LENGTH; ++i) {
158 for (
size_t i = 0; i <
LENGTH; ++i) {
165 for (
size_t i = 0; i <
LENGTH; ++i) {
172 for (
size_t i = 0; i <
LENGTH; ++i) {
179 for (
size_t i = 0; i <
LENGTH; ++i) {
268 for (
size_t i = 0; i <
LENGTH; ++i) {
276 for (
size_t i = 0; i <
LENGTH; ++i) {
284 for (
size_t i = 0; i <
LENGTH; ++i) {
316 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
327 template <
size_t EXTENDED_DOMAIN_END>
329 requires(domain_end == 2)
331 return extend_to<EXTENDED_DOMAIN_END>();
353 static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END;
355 static_assert(EXTENDED_LENGTH >=
LENGTH);
361 if constexpr (
LENGTH == 2) {
368 static_assert(EXTENDED_LENGTH != 0);
369 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
372 }
else if constexpr (
LENGTH == 3) {
373 static constexpr Fr inverse_two =
Fr(2).
invert();
389 for (
size_t i = 0; i < domain_end - 2; i++) {
392 Fr extra = a_mul +
a +
b;
393 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
397 }
else if constexpr (
LENGTH == 4) {
398 static constexpr Fr inverse_six =
Fr(6).
invert();
422 Fr zero_times_6 = zero_times_3 + zero_times_3;
423 Fr zero_times_12 = zero_times_6 + zero_times_6;
425 Fr one_times_6 = one_times_3 + one_times_3;
428 Fr three_times_3 = three_times_2 +
value_at(3);
430 Fr one_minus_two_times_3 = one_times_3 - two_times_3;
431 Fr one_minus_two_times_6 = one_minus_two_times_3 + one_minus_two_times_3;
432 Fr one_minus_two_times_12 = one_minus_two_times_6 + one_minus_two_times_6;
434 Fr b = (zero_times_6 - one_minus_two_times_12 - one_times_3 - three_times_3) * inverse_six;
435 Fr c = (
value_at(0) - zero_times_12 + one_minus_two_times_12 + one_times_6 + two_times_3 + three_times_2) *
441 Fr a_plus_b_times_2 = a_plus_b + a_plus_b;
442 size_t start_idx_sqr = (domain_end - 1) * (domain_end - 1);
443 size_t idx_sqr_three = start_idx_sqr + start_idx_sqr + start_idx_sqr;
444 Fr idx_sqr_three_times_a =
Fr(idx_sqr_three) *
a;
445 Fr x_a_term =
Fr(6 * (domain_end - 1)) *
a;
446 Fr three_a =
a +
a +
a;
447 Fr six_a = three_a + three_a;
449 Fr three_a_plus_two_b = a_plus_b_times_2 +
a;
450 Fr linear_term =
Fr(domain_end - 1) * three_a_plus_two_b + (a_plus_b + c);
452 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
453 result.
value_at(idx + 1) = result.
value_at(idx) + idx_sqr_three_times_a + linear_term;
455 idx_sqr_three_times_a += x_a_term + three_a;
458 linear_term += three_a_plus_two_b;
461 for (
size_t k = domain_end; k != EXTENDED_DOMAIN_END; ++k) {
464 for (
size_t j = 0; j != domain_end; ++j) {
466 term *= Data::precomputed_denominator_inverses[
LENGTH * k + j];
470 result.
value_at(k) *= Data::full_numerator_values[k];
484 if constexpr (INITIAL_LENGTH == 2) {
487 for (
size_t idx = 2; idx <
LENGTH; idx++) {
492 throw_or_abort(
"self_extend_from called with INITIAL_LENGTH different from 2.");
505 Fr full_numerator_value = 1;
506 for (
size_t i = 0; i != domain_end; ++i) {
507 full_numerator_value *= u - i;
513 for (
size_t i = 0; i !=
LENGTH; ++i) {
514 Fr inv = Data::lagrange_denominators[i];
515 inv *= u - Data::big_domain[i];
517 denominator_inverses[i] = inv;
522 for (
size_t i = 0; i != domain_end; ++i) {
524 term *= denominator_inverses[i];
528 result *= full_numerator_value;
546template <
typename B,
class Fr,
size_t domain_end>
553template <
class Fr,
size_t domain_end>
559template <
class Fr,
size_t domain_end>
565template <
class Fr,
size_t domain_end>
573 static constexpr size_t LENGTH = domain_end;
582 for (
size_t i = 0; i <
LENGTH; ++i) {
592 template <
size_t full_domain_end>
599 static_assert(domain_end >= 2);
692 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
704template <
class Fr,
size_t domain_end>
710template <
class Fr,
size_t domain_end>
716template <
class Fr,
size_t domain_end>
738 return { { T{ elements[Is] }... } };
768template <
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
coefficients is a length-3 array with the following representation:
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
const std::vector< MemoryValue > data
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 MSGPACK_FIEL...
void write(auto &buf, const msgpack_concepts::HasMsgPack auto &obj)
Automatically derived write for any object that defines .msgpack() (implicitly defined by MSGPACK_FIE...
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)