27template <
class Fr,
size_t view_domain_end>
class UnivariateView;
34 static constexpr size_t LENGTH = domain_end;
58 static_assert(domain_end >= 2);
74 for (
size_t i = 1; i < domain_end; ++i) {
88 for (
size_t i = 1; i < domain_end - 1; ++i) {
101 for (
size_t i = 0; i <
LENGTH; ++i) {
110 for (
size_t i = 0; i <
LENGTH; ++i) {
122 for (
size_t i = 0; i <
LENGTH; ++i) {
146 for (
size_t i = 0; i !=
LENGTH; ++i) {
159 for (
size_t i = 0; i <
LENGTH; ++i) {
166 for (
size_t i = 0; i <
LENGTH; ++i) {
173 for (
size_t i = 0; i <
LENGTH; ++i) {
180 for (
size_t i = 0; i <
LENGTH; ++i) {
269 for (
size_t i = 0; i <
LENGTH; ++i) {
277 for (
size_t i = 0; i <
LENGTH; ++i) {
285 for (
size_t i = 0; i <
LENGTH; ++i) {
317 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
328 template <
size_t EXTENDED_DOMAIN_END>
330 requires(domain_end == 2)
332 return extend_to<EXTENDED_DOMAIN_END>();
354 static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END;
356 static_assert(EXTENDED_LENGTH >=
LENGTH);
362 static constexpr Fr inverse_two =
Fr(2).
invert();
363 if constexpr (
LENGTH == 2) {
370 static_assert(EXTENDED_LENGTH != 0);
371 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
374 }
else if constexpr (
LENGTH == 3) {
390 for (
size_t i = 0; i < domain_end - 2; i++) {
393 Fr extra = a_mul +
a +
b;
394 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
398 }
else if constexpr (
LENGTH == 4) {
399 static constexpr Fr inverse_six =
Fr(6).
invert();
423 Fr zero_times_6 = zero_times_3 + zero_times_3;
424 Fr zero_times_12 = zero_times_6 + zero_times_6;
426 Fr one_times_6 = one_times_3 + one_times_3;
429 Fr three_times_3 = three_times_2 +
value_at(3);
431 Fr one_minus_two_times_3 = one_times_3 - two_times_3;
432 Fr one_minus_two_times_6 = one_minus_two_times_3 + one_minus_two_times_3;
433 Fr one_minus_two_times_12 = one_minus_two_times_6 + one_minus_two_times_6;
435 Fr b = (zero_times_6 - one_minus_two_times_12 - one_times_3 - three_times_3) * inverse_six;
436 Fr c = (
value_at(0) - zero_times_12 + one_minus_two_times_12 + one_times_6 + two_times_3 + three_times_2) *
442 Fr a_plus_b_times_2 = a_plus_b + a_plus_b;
443 size_t start_idx_sqr = (domain_end - 1) * (domain_end - 1);
444 size_t idx_sqr_three = start_idx_sqr + start_idx_sqr + start_idx_sqr;
445 Fr idx_sqr_three_times_a =
Fr(idx_sqr_three) *
a;
446 Fr x_a_term =
Fr(6 * (domain_end - 1)) *
a;
447 Fr three_a =
a +
a +
a;
448 Fr six_a = three_a + three_a;
450 Fr three_a_plus_two_b = a_plus_b_times_2 +
a;
451 Fr linear_term =
Fr(domain_end - 1) * three_a_plus_two_b + (a_plus_b + c);
453 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
454 result.
value_at(idx + 1) = result.
value_at(idx) + idx_sqr_three_times_a + linear_term;
456 idx_sqr_three_times_a += x_a_term + three_a;
459 linear_term += three_a_plus_two_b;
462 for (
size_t k = domain_end; k != EXTENDED_DOMAIN_END; ++k) {
465 for (
size_t j = 0; j != domain_end; ++j) {
467 term *= Data::precomputed_denominator_inverses[
LENGTH * k + j];
471 result.
value_at(k) *= Data::full_numerator_values[k];
485 if constexpr (INITIAL_LENGTH == 2) {
488 for (
size_t idx = 2; idx <
LENGTH; idx++) {
493 throw_or_abort(
"self_extend_from called with INITIAL_LENGTH different from 2.");
506 Fr full_numerator_value = 1;
507 for (
size_t i = 0; i != domain_end; ++i) {
508 full_numerator_value *= u - i;
514 for (
size_t i = 0; i !=
LENGTH; ++i) {
515 Fr inv = Data::lagrange_denominators[i];
516 inv *= u - Data::big_domain[i];
518 denominator_inverses[i] = inv;
523 for (
size_t i = 0; i != domain_end; ++i) {
525 term *= denominator_inverses[i];
529 result *= full_numerator_value;
547template <
typename B,
class Fr,
size_t domain_end>
554template <
class Fr,
size_t domain_end>
560template <
class Fr,
size_t domain_end>
566template <
class Fr,
size_t domain_end>
574 static constexpr size_t LENGTH = domain_end;
583 for (
size_t i = 0; i <
LENGTH; ++i) {
593 template <
size_t full_domain_end>
600 static_assert(domain_end >= 2);
693 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
705template <
class Fr,
size_t domain_end>
711template <
class Fr,
size_t domain_end>
717template <
class Fr,
size_t domain_end>
739 return { { T{ elements[Is] }... } };
769template <
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
uint8_t buffer[RANDOM_BUFFER_SIZE]
Entry point for Barretenberg command-line interface.
Univariate< Fr, domain_end > operator+(const Fr &ff, const Univariate< Fr, domain_end > &uv)
void write(std::vector< uint8_t > &buf, Chonk::VerificationKey const &vk)
void read(uint8_t const *&it, Chonk::VerificationKey &vk)
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)