23template <
class Fr,
size_t view_domain_end,
size_t view_domain_start,
size_t skip_count>
class UnivariateView;
36template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
class Univariate {
38 static constexpr size_t LENGTH = domain_end - domain_start;
63 static_assert(domain_end >= 2);
64 static_assert(domain_start == 0);
76 static_assert(domain_start == 0);
80 for (
size_t i = 1; i < skip_count + 1; ++i) {
85 for (
size_t i = skip_count + 1; i < domain_end; ++i) {
94 static_assert(domain_start == 0);
99 for (
size_t i = 1; i < skip_count + 1; ++i) {
102 to_add += derivative;
105 for (
size_t i = skip_count + 1; i < domain_end - 1; ++i) {
108 to_add += derivative;
124 for (
size_t i = 1; i < skip_count + 1; i++) {
127 for (
size_t i = skip_count + 1; i <
LENGTH; i++) {
137 for (
size_t i = 0; i <
LENGTH; ++i) {
145 for (
size_t i = 0; i < in.
evaluations.size(); ++i) {
152 if constexpr (domain_start == 0) {
160 if constexpr (domain_start == 0) {
171 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
195 for (
size_t i = 0; i !=
LENGTH; ++i) {
204 for (
size_t i = 0; i !=
LENGTH; ++i) {
218 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
226 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
235 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
243 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
266 if (i == 0 || i >= (skip_count + 1)) {
293 if (i == 0 || i >= (skip_count + 1)) {
307 if (i == 0 || i >= (skip_count + 1)) {
320 if (i == 0 || i >= (skip_count + 1)) {
353 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
362 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
371 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
403 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
414 template <
size_t EXTENDED_DOMAIN_END,
size_t NUM_SKIPPED_INDICES = 0>
416 requires(domain_start == 0 && domain_end == 2)
418 return extend_to<EXTENDED_DOMAIN_END, NUM_SKIPPED_INDICES>();
439 template <
size_t EXTENDED_DOMAIN_END,
size_t NUM_SKIPPED_INDICES = 0>
442 static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END - domain_start;
444 static_assert(EXTENDED_LENGTH >=
LENGTH);
450 static constexpr Fr inverse_two =
Fr(2).
invert();
451 static_assert(NUM_SKIPPED_INDICES <
LENGTH);
452 if constexpr (
LENGTH == 2) {
454 static_assert(EXTENDED_LENGTH != 0);
455 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
458 }
else if constexpr (
LENGTH == 3) {
465 for (
size_t i = 0; i < domain_end - 2; i++) {
468 Fr extra = a_mul +
a +
b;
469 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
473 }
else if constexpr (
LENGTH == 4) {
474 static constexpr Fr inverse_six =
Fr(6).
invert();
498 Fr zero_times_6 = zero_times_3 + zero_times_3;
499 Fr zero_times_12 = zero_times_6 + zero_times_6;
501 Fr one_times_6 = one_times_3 + one_times_3;
504 Fr three_times_3 = three_times_2 +
value_at(3);
506 Fr one_minus_two_times_3 = one_times_3 - two_times_3;
507 Fr one_minus_two_times_6 = one_minus_two_times_3 + one_minus_two_times_3;
508 Fr one_minus_two_times_12 = one_minus_two_times_6 + one_minus_two_times_6;
510 Fr b = (zero_times_6 - one_minus_two_times_12 - one_times_3 - three_times_3) * inverse_six;
511 Fr c = (
value_at(0) - zero_times_12 + one_minus_two_times_12 + one_times_6 + two_times_3 + three_times_2) *
517 Fr a_plus_b_times_2 = a_plus_b + a_plus_b;
518 size_t start_idx_sqr = (domain_end - 1) * (domain_end - 1);
519 size_t idx_sqr_three = start_idx_sqr + start_idx_sqr + start_idx_sqr;
520 Fr idx_sqr_three_times_a =
Fr(idx_sqr_three) *
a;
521 Fr x_a_term =
Fr(6 * (domain_end - 1)) *
a;
522 Fr three_a =
a +
a +
a;
523 Fr six_a = three_a + three_a;
525 Fr three_a_plus_two_b = a_plus_b_times_2 +
a;
526 Fr linear_term =
Fr(domain_end - 1) * three_a_plus_two_b + (a_plus_b + c);
528 for (
size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
529 result.
value_at(idx + 1) = result.
value_at(idx) + idx_sqr_three_times_a + linear_term;
531 idx_sqr_three_times_a += x_a_term + three_a;
534 linear_term += three_a_plus_two_b;
537 for (
size_t k = domain_end; k != EXTENDED_DOMAIN_END; ++k) {
540 for (
size_t j = domain_start; j != domain_end; ++j) {
542 term *= Data::precomputed_denominator_inverses[
LENGTH * k + j];
546 result.
value_at(k) *= Data::full_numerator_values[k];
560 if constexpr (INITIAL_LENGTH == 2) {
563 for (
size_t idx = 2; idx <
LENGTH; idx++) {
568 throw_or_abort(
"self_extend_from called with INITIAL_LENGTH different from 2.");
581 Fr full_numerator_value = 1;
582 for (
size_t i = domain_start; i != domain_end; ++i) {
583 full_numerator_value *= u - i;
589 for (
size_t i = 0; i !=
LENGTH; ++i) {
590 Fr inv = Data::lagrange_denominators[i];
591 inv *= u - Data::big_domain[i];
593 denominator_inverses[i] = inv;
598 for (
size_t i = domain_start; i != domain_end; ++i) {
600 term *= denominator_inverses[i - domain_start];
604 result *= full_numerator_value;
616template <
typename B,
class Fr,
size_t domain_end,
size_t domain_start = 0>
623template <
typename B,
class Fr,
size_t domain_end,
size_t domain_start = 0>
630template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
637template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
644template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
651template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
class UnivariateView {
653 static constexpr size_t LENGTH = domain_end - domain_start;
665 for (
size_t i = skip_count + 1; i <
LENGTH; ++i) {
673 template <
size_t full_domain_end,
size_t full_domain_start = 0>
680 static_assert(domain_end >= 2);
681 static_assert(domain_start == 0);
710 if (i == 0 || i >= (skip_count + 1)) {
781 for (
size_t i = 1; i < u.
evaluations.size(); i++) {
793template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
800template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
807template <
class Fr,
size_t domain_end,
size_t domain_start = 0,
size_t skip_count = 0>
830 return { { T{ elements[Is] }... } };
859template <
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
void self_extend_from()
Compute the evaluations of the polynomial from the INITIAL_LENGTH up to the total LENGTH....
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 write(std::vector< uint8_t > &buf, ClientIVC::VerificationKey const &vk)
void read(uint8_t const *&it, ClientIVC::VerificationKey &vk)
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)
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()
void throw_or_abort(std::string const &err)