23template <
class Fr,
size_t view_domain_end,
size_t view_domain_start,
size_t skip_count>
class UnivariateView;
35template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
class Univariate {
37 static constexpr size_t LENGTH = domain_end - domain_start;
62 static_assert(domain_end >= 2);
63 static_assert(domain_start == 0);
74 static_assert(domain_start == 0);
78 for (
size_t i = 1; i < skip_count + 1; ++i) {
83 for (
size_t i = skip_count + 1; i < domain_end; ++i) {
91 static_assert(domain_start == 0);
96 for (
size_t i = 1; i < skip_count + 1; ++i) {
102 for (
size_t i = skip_count + 1; i < domain_end - 1; ++i) {
105 to_add += derivative;
121 for (
size_t i = 1; i < skip_count + 1; i++) {
124 for (
size_t i = skip_count + 1; i <
LENGTH; i++) {
134 for (
size_t i = 0; i <
LENGTH; ++i) {
142 for (
size_t i = 0; i < in.
evaluations.size(); ++i) {
149 if constexpr (domain_start == 0) {
157 if constexpr (domain_start == 0) {
168 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
192 for (
size_t i = 0; i !=
LENGTH; ++i) {
201 for (
size_t i = 0; i !=
LENGTH; ++i) {
215 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
223 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
232 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
240 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
263 if (i == 0 || i >= (skip_count + 1)) {
290 if (i == 0 || i >= (skip_count + 1)) {
304 if (i == 0 || i >= (skip_count + 1)) {
317 if (i == 0 || i >= (skip_count + 1)) {
350 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
359 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
368 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
400 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
411 template <
size_t EXTENDED_DOMAIN_END,
size_t NUM_SKIPPED_INDICES = 0>
413 requires(domain_start == 0 && domain_end == 2)
415 return extend_to<EXTENDED_DOMAIN_END, NUM_SKIPPED_INDICES>();
436 template <
size_t EXTENDED_DOMAIN_END,
size_t NUM_SKIPPED_INDICES = 0>
439 static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END - domain_start;
441 static_assert(EXTENDED_LENGTH >=
LENGTH);
447 static constexpr Fr inverse_two =
Fr(2).
invert();
448 static_assert(NUM_SKIPPED_INDICES <
LENGTH);
449 if constexpr (
LENGTH == 2) {
451 static_assert(EXTENDED_LENGTH != 0);
452 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
455 }
else if constexpr (
LENGTH == 3) {
462 for (
size_t i = 0; i < domain_end - 2; i++) {
465 Fr extra = a_mul +
a +
b;
466 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
470 }
else if constexpr (
LENGTH == 4) {
471 static constexpr Fr inverse_six =
Fr(6).
invert();
495 Fr zero_times_6 = zero_times_3 + zero_times_3;
496 Fr zero_times_12 = zero_times_6 + zero_times_6;
498 Fr one_times_6 = one_times_3 + one_times_3;
501 Fr three_times_3 = three_times_2 +
value_at(3);
503 Fr one_minus_two_times_3 = one_times_3 - two_times_3;
504 Fr one_minus_two_times_6 = one_minus_two_times_3 + one_minus_two_times_3;
505 Fr one_minus_two_times_12 = one_minus_two_times_6 + one_minus_two_times_6;
507 Fr b = (zero_times_6 - one_minus_two_times_12 - one_times_3 - three_times_3) * inverse_six;
508 Fr c = (
value_at(0) - zero_times_12 + one_minus_two_times_12 + one_times_6 + two_times_3 + three_times_2) *
514 Fr a_plus_b_times_2 = a_plus_b + a_plus_b;
515 size_t start_idx_sqr = (domain_end - 1) * (domain_end - 1);
516 size_t idx_sqr_three = start_idx_sqr + start_idx_sqr + start_idx_sqr;
517 Fr idx_sqr_three_times_a =
Fr(idx_sqr_three) *
a;
518 Fr x_a_term =
Fr(6 * (domain_end - 1)) *
a;
519 Fr three_a =
a +
a +
a;
520 Fr six_a = three_a + three_a;
522 Fr three_a_plus_two_b = a_plus_b_times_2 +
a;
523 Fr linear_term =
Fr(domain_end - 1) * three_a_plus_two_b + (a_plus_b + c);
525 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
526 result.
value_at(idx + 1) = result.
value_at(idx) + idx_sqr_three_times_a + linear_term;
528 idx_sqr_three_times_a += x_a_term + three_a;
531 linear_term += three_a_plus_two_b;
534 for (
size_t k = domain_end; k != EXTENDED_DOMAIN_END; ++k) {
537 for (
size_t j = domain_start; j != domain_end; ++j) {
539 term *= Data::precomputed_denominator_inverses[
LENGTH * k + j];
543 result.
value_at(k) *= Data::full_numerator_values[k];
551 if constexpr (INITIAL_LENGTH == 2) {
554 for (
size_t idx = 2; idx <
LENGTH; idx++) {
570 Fr full_numerator_value = 1;
571 for (
size_t i = domain_start; i != domain_end; ++i) {
572 full_numerator_value *= u - i;
578 for (
size_t i = 0; i !=
LENGTH; ++i) {
579 Fr inv = Data::lagrange_denominators[i];
580 inv *= u - Data::big_domain[i];
582 denominator_inverses[i] = inv;
587 for (
size_t i = domain_start; i != domain_end; ++i) {
589 term *= denominator_inverses[i - domain_start];
593 result *= full_numerator_value;
605template <
typename B,
class Fr,
size_t domain_end,
size_t domain_start = 0>
612template <
typename B,
class Fr,
size_t domain_end,
size_t domain_start = 0>
619template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
626template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
633template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
640template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
class UnivariateView {
642 static constexpr size_t LENGTH = domain_end - domain_start;
654 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
662 template <
size_t full_domain_end,
size_t full_domain_start = 0>
669 static_assert(domain_end >= 2);
670 static_assert(domain_start == 0);
699 if (i == 0 || i >= (skip_count + 1)) {
770 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
782template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
789template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
796template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
819 return { { T{ elements[Is] }... } };
848template <
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 {domain_start, domain_start + 1,...
Univariate & operator-=(const Fr &scalar)
Univariate operator*(const Univariate &other) const
Univariate operator-(const Univariate &other) const
Univariate & operator+=(const UnivariateView< Fr, domain_end, domain_start, skip_count > &view)
static Univariate serialize_from_buffer(uint8_t const *buffer)
Univariate operator+(const UnivariateView< Fr, domain_end, domain_start, skip_count > &view) 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...
static Univariate random_element()
static Univariate get_random()
Univariate & operator*=(const Univariate &other)
Univariate & operator*=(const UnivariateView< Fr, domain_end, domain_start, skip_count > &view)
Univariate & operator=(const Univariate &other)=default
bool operator==(const Univariate &other) const =default
Univariate(UnivariateView< Fr, domain_end, domain_start, skip_count > in)
std::vector< uint8_t > to_buffer() const
static constexpr size_t MONOMIAL_LENGTH
friend std::ostream & operator<<(std::ostream &os, const Univariate &u)
Univariate< Fr, EXTENDED_DOMAIN_END, 0, NUM_SKIPPED_INDICES > extend_to() const
Given a univariate f represented by {f(domain_start), ..., f(domain_end - 1)}, compute the evaluation...
Univariate & operator+=(const Univariate &other)
Univariate & operator*=(const Fr &scalar)
Univariate(UnivariateCoefficientBasis< Fr, 3, has_a0_plus_a1 > monomial)
const Fr & value_at(size_t i) const
Univariate & operator+=(const Fr &scalar)
static constexpr size_t LENGTH
Univariate< Fr, domain_end, domain_start > convert() const noexcept
Convert from a version with skipped evaluations to one without skipping (with zeroes in previously sk...
Univariate & operator=(Univariate &&other) noexcept=default
Univariate & operator-=(const Univariate &other)
Univariate(std::array< Fr, LENGTH > evaluations)
Univariate operator+(const Fr &scalar) const
std::array< Fr, LENGTH > evaluations
Univariate(Univariate &&other) noexcept=default
Univariate(const Univariate &other)=default
static constexpr size_t SKIP_COUNT
Univariate operator*(const Fr &scalar) const
Univariate operator-() const
Univariate operator-(const UnivariateView< Fr, domain_end, domain_start, skip_count > &view) const
Univariate operator*(const UnivariateView< Fr, domain_end, domain_start, skip_count > &view) const
Univariate & operator-=(const UnivariateView< Fr, domain_end, domain_start, skip_count > &view)
Univariate operator-(const Fr &scalar) const
Univariate(UnivariateCoefficientBasis< Fr, 2, has_a0_plus_a1 > monomial)
Univariate operator+(const Univariate &other) const
A view of a univariate, also used to truncate univariates.
static constexpr size_t LENGTH
std::span< const Fr, LENGTH > evaluations
Univariate< Fr, domain_end, domain_start, skip_count > operator+(const UnivariateView &other) const
Univariate< Fr, domain_end, domain_start, skip_count > operator-() const
friend std::ostream & operator<<(std::ostream &os, const UnivariateView &u)
UnivariateView(const Univariate< Fr, full_domain_end, full_domain_start, skip_count > &univariate_in)
Univariate< Fr, domain_end, domain_start, skip_count > operator*(const Univariate< Fr, domain_end, domain_start, skip_count > &other) const
Univariate< Fr, domain_end, domain_start, skip_count > operator+(const Univariate< Fr, domain_end, domain_start, skip_count > &other) const
Univariate< Fr, domain_end, domain_start, skip_count > sqr() const
bool operator==(const UnivariateView &other) const
static constexpr size_t MONOMIAL_LENGTH
Univariate< Fr, domain_end, domain_start, skip_count > operator-(const Univariate< Fr, domain_end, domain_start, skip_count > &other) const
Univariate< Fr, domain_end, domain_start, skip_count > operator*(const UnivariateView &other) const
const Fr & value_at(size_t i) const
Univariate< Fr, domain_end, domain_start, skip_count > operator-(const Fr &other) const
Univariate< Fr, domain_end, domain_start, skip_count > operator*(const Fr &other) const
Univariate< Fr, domain_end, domain_start, skip_count > operator+(const Fr &other) const
Univariate< Fr, domain_end, domain_start, skip_count > operator-(const UnivariateView &other) const
const std::vector< FF > data
uint8_t buffer[RANDOM_BUFFER_SIZE]
Entry point for Barretenberg command-line interface.
Univariate< Fr, domain_end, domain_start, skip_count > operator+(const Fr &ff, const Univariate< Fr, domain_end, domain_start, skip_count > &uv)
void read(B &it, field2< base_field, Params > &value)
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...
Univariate< Fr, domain_end, domain_start, skip_count > operator*(const Fr &ff, const Univariate< Fr, domain_end, domain_start, skip_count > &uv)
void write(B &buf, field2< base_field, Params > const &value)
Univariate< Fr, domain_end, domain_start, skip_count > operator-(const Fr &ff, const Univariate< Fr, domain_end, domain_start, skip_count > &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...
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()