Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
univariate.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
12#include <span>
13
14namespace bb {
15
23template <class Fr, size_t view_domain_end, size_t view_domain_start, size_t skip_count> class UnivariateView;
24
36template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0> class Univariate {
37 public:
38 static constexpr size_t LENGTH = domain_end - domain_start;
39 static constexpr size_t SKIP_COUNT = skip_count;
41 static constexpr size_t MONOMIAL_LENGTH = LENGTH > 1 ? 2 : 1;
43
44 using value_type = Fr; // used to get the type of the elements consistently with std::array
45
46 // TODO(https://github.com/AztecProtocol/barretenberg/issues/714) Try out std::valarray?
48
49 Univariate() = default;
50
54 ~Univariate() = default;
55 Univariate(const Univariate& other) = default;
56 Univariate(Univariate&& other) noexcept = default;
57 Univariate& operator=(const Univariate& other) = default;
58 Univariate& operator=(Univariate&& other) noexcept = default;
59
61 requires(LENGTH > 1)
62 {
63 static_assert(domain_end >= 2);
64 static_assert(domain_start == 0);
65
67 result.coefficients[0] = evaluations[0];
68 result.coefficients[1] = evaluations[1] - evaluations[0];
69 result.coefficients[2] = evaluations[1];
70 return result;
71 }
72
73 // Compute Lagrange coefficients of a given linear polynomial represented in monomial basis.
74 template <bool has_a0_plus_a1> Univariate(UnivariateCoefficientBasis<Fr, 2, has_a0_plus_a1> monomial)
75 {
76 static_assert(domain_start == 0);
77 Fr to_add = monomial.coefficients[1];
78 evaluations[0] = monomial.coefficients[0];
79 auto prev = evaluations[0];
80 for (size_t i = 1; i < skip_count + 1; ++i) {
81 evaluations[i] = 0;
82 prev = prev + to_add;
83 }
84
85 for (size_t i = skip_count + 1; i < domain_end; ++i) {
86 prev = prev + to_add;
87 evaluations[i] = prev;
88 }
89 }
90
91 // Compute Lagrange coefficients of a given quadratic polynomial represented in monomial basis.
92 template <bool has_a0_plus_a1> Univariate(UnivariateCoefficientBasis<Fr, 3, has_a0_plus_a1> monomial)
93 {
94 static_assert(domain_start == 0);
95 Fr to_add = monomial.coefficients[1]; // a1 + a2
96 Fr derivative = monomial.coefficients[2] + monomial.coefficients[2]; // 2a2
97 evaluations[0] = monomial.coefficients[0];
98 auto prev = evaluations[0];
99 for (size_t i = 1; i < skip_count + 1; ++i) {
100 evaluations[i] = 0;
101 prev += to_add;
102 to_add += derivative;
103 }
104
105 for (size_t i = skip_count + 1; i < domain_end - 1; ++i) {
106 prev += to_add;
107 evaluations[i] = prev;
108 to_add += derivative;
109 }
110 prev += to_add;
111 evaluations[domain_end - 1] = prev;
112 }
113
121 {
123 result.evaluations[0] = evaluations[0];
124 for (size_t i = 1; i < skip_count + 1; i++) {
125 result.evaluations[i] = Fr::zero();
126 }
127 for (size_t i = skip_count + 1; i < LENGTH; i++) {
128 result.evaluations[i] = evaluations[i];
129 }
130 return result;
131 }
132 // Construct constant Univariate from scalar which represents the value that all the points in the domain
133 // evaluate to
135 : evaluations{}
136 {
137 for (size_t i = 0; i < LENGTH; ++i) {
138 evaluations[i] = value;
139 }
140 }
141 // Construct Univariate from UnivariateView
143 : evaluations{}
144 {
145 for (size_t i = 0; i < in.evaluations.size(); ++i) {
146 evaluations[i] = in.evaluations[i];
147 }
148 }
149
150 Fr& value_at(size_t i)
151 {
152 if constexpr (domain_start == 0) {
153 return evaluations[i];
154 } else {
155 return evaluations[i - domain_start];
156 }
157 };
158 const Fr& value_at(size_t i) const
159 {
160 if constexpr (domain_start == 0) {
161 return evaluations[i];
162 } else {
163 return evaluations[i - domain_start];
164 }
165 };
166 size_t size() { return evaluations.size(); };
167
168 // Check if the univariate is identically zero
169 bool is_zero() const
170 {
171 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
172 if (!evaluations[i].is_zero()) {
173 return false;
174 }
175 }
176 return evaluations[0].is_zero();
177 }
178
179 // Write the Univariate evaluations to a buffer
180 [[nodiscard]] std::vector<uint8_t> to_buffer() const { return ::to_buffer(evaluations); }
181
182 // Static method for creating a Univariate from a buffer
183 // IMPROVEMENT: Could be made to identically match equivalent methods in e.g. field.hpp. Currently bypasses
184 // unnecessary ::from_buffer call
186 {
187 Univariate result;
189 return result;
190 }
191
193 {
195 for (size_t i = 0; i != LENGTH; ++i) {
196 output.value_at(i) = Fr::random_element();
197 }
198 return output;
199 };
200
202 {
204 for (size_t i = 0; i != LENGTH; ++i) {
205 output.value_at(i) = Fr::zero();
206 }
207 return output;
208 }
209
210 static Univariate random_element() { return get_random(); };
211
212 // Operations between Univariate and other Univariate
213 bool operator==(const Univariate& other) const = default;
214
216 {
217 evaluations[0] += other.evaluations[0];
218 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
219 evaluations[i] += other.evaluations[i];
220 }
221 return *this;
222 }
224 {
225 evaluations[0] -= other.evaluations[0];
226 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
227
228 evaluations[i] -= other.evaluations[i];
229 }
230 return *this;
231 }
233 {
234 evaluations[0] *= other.evaluations[0];
235 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
236 evaluations[i] *= other.evaluations[i];
237 }
238 return *this;
239 }
241 {
243 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
245 }
246 return *this;
247 }
248 Univariate operator+(const Univariate& other) const
249 {
250 Univariate res(*this);
251 res += other;
252 return res;
253 }
254
255 Univariate operator-(const Univariate& other) const
256 {
257 Univariate res(*this);
258 res -= other;
259 return res;
260 }
262 {
263 Univariate res(*this);
264 size_t i = 0;
265 for (auto& eval : res.evaluations) {
266 if (i == 0 || i >= (skip_count + 1)) {
267 eval = -eval;
268 }
269 i++;
270 }
271 return res;
272 }
273
274 Univariate operator*(const Univariate& other) const
275 {
276 Univariate res(*this);
277 res *= other;
278 return res;
279 }
280
282 {
283 Univariate res(*this);
284 res.self_sqr();
285 return res;
286 }
287
288 // Operations between Univariate and scalar
289 Univariate& operator+=(const Fr& scalar)
290 {
291 size_t i = 0;
292 for (auto& eval : evaluations) {
293 if (i == 0 || i >= (skip_count + 1)) {
294 eval += scalar;
295 }
296 i++;
297 }
298 return *this;
299 }
300
301 Univariate& operator-=(const Fr& scalar)
302 {
303 size_t i = 0;
304 for (auto& eval : evaluations) {
305 // If skip count is zero, will be enabled on every line, otherwise don't compute for [domain_start+1,..,
306 // domain_start + skip_count]
307 if (i == 0 || i >= (skip_count + 1)) {
308 eval -= scalar;
309 }
310 i++;
311 }
312 return *this;
313 }
314 Univariate& operator*=(const Fr& scalar)
315 {
316 size_t i = 0;
317 for (auto& eval : evaluations) {
318 // If skip count is zero, will be enabled on every line, otherwise don't compute for [domain_start+1,..,
319 // domain_start + skip_count]
320 if (i == 0 || i >= (skip_count + 1)) {
321 eval *= scalar;
322 }
323 i++;
324 }
325 return *this;
326 }
327
328 Univariate operator+(const Fr& scalar) const
329 {
330 Univariate res(*this);
331 res += scalar;
332 return res;
333 }
334
335 Univariate operator-(const Fr& scalar) const
336 {
337 Univariate res(*this);
338 res -= scalar;
339 return res;
340 }
341
342 Univariate operator*(const Fr& scalar) const
343 {
344 Univariate res(*this);
345 res *= scalar;
346 return res;
347 }
348
349 // Operations between Univariate and UnivariateView
351 {
352 evaluations[0] += view.evaluations[0];
353 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
354 evaluations[i] += view.evaluations[i];
355 }
356 return *this;
357 }
358
360 {
361 evaluations[0] -= view.evaluations[0];
362 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
363 evaluations[i] -= view.evaluations[i];
364 }
365 return *this;
366 }
367
369 {
370 evaluations[0] *= view.evaluations[0];
371 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
372 evaluations[i] *= view.evaluations[i];
373 }
374 return *this;
375 }
376
378 {
379 Univariate res(*this);
380 res += view;
381 return res;
382 }
383
385 {
386 Univariate res(*this);
387 res -= view;
388 return res;
389 }
390
392 {
393 Univariate res(*this);
394 res *= view;
395 return res;
396 }
397
398 // Output is immediately parsable as a list of integers by Python.
399 friend std::ostream& operator<<(std::ostream& os, const Univariate& u)
400 {
401 os << "[";
402 os << u.evaluations[0] << "," << std::endl;
403 for (size_t i = 1; i < u.evaluations.size(); i++) {
404 os << " " << u.evaluations[i];
405 if (i + 1 < u.evaluations.size()) {
406 os << "," << std::endl;
407 } else {
408 os << "]";
409 };
410 }
411 return os;
412 }
413
414 template <size_t EXTENDED_DOMAIN_END, size_t NUM_SKIPPED_INDICES = 0>
416 requires(domain_start == 0 && domain_end == 2)
417 {
418 return extend_to<EXTENDED_DOMAIN_END, NUM_SKIPPED_INDICES>();
419 }
420
439 template <size_t EXTENDED_DOMAIN_END, size_t NUM_SKIPPED_INDICES = 0>
441 {
442 static constexpr size_t EXTENDED_LENGTH = EXTENDED_DOMAIN_END - domain_start;
444 static_assert(EXTENDED_LENGTH >= LENGTH);
445
447
448 std::copy(evaluations.begin(), evaluations.end(), result.evaluations.begin());
449
450 static constexpr Fr inverse_two = Fr(2).invert();
451 static_assert(NUM_SKIPPED_INDICES < LENGTH);
452 if constexpr (LENGTH == 2) {
453 Fr delta = value_at(1) - value_at(0);
454 static_assert(EXTENDED_LENGTH != 0);
455 for (size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
456 result.value_at(idx + 1) = result.value_at(idx) + delta;
457 }
458 } else if constexpr (LENGTH == 3) {
459 // Based off https://hackmd.io/@aztec-network/SyR45cmOq?type=view
460 // The technique used here is the same as the length == 3 case below.
461 Fr a = (value_at(2) + value_at(0)) * inverse_two - value_at(1);
462 Fr b = value_at(1) - a - value_at(0);
463 Fr a2 = a + a;
464 Fr a_mul = a2;
465 for (size_t i = 0; i < domain_end - 2; i++) {
466 a_mul += a2;
467 }
468 Fr extra = a_mul + a + b;
469 for (size_t idx = domain_end - 1; idx < EXTENDED_DOMAIN_END - 1; idx++) {
470 result.value_at(idx + 1) = result.value_at(idx) + extra;
471 extra += a2;
472 }
473 } else if constexpr (LENGTH == 4) {
474 static constexpr Fr inverse_six = Fr(6).invert(); // computed at compile time for efficiency
475
476 // To compute a barycentric extension, we can compute the coefficients of the univariate.
477 // We have the evaluation of the polynomial at the domain (which is assumed to be 0, 1, 2, 3).
478 // Therefore, we have the 4 linear equations from plugging into f(x) = ax^3 + bx^2 + cx + d:
479 // a*0 + b*0 + c*0 + d = f(0)
480 // a*1 + b*1 + c*1 + d = f(1)
481 // a*2^3 + b*2^2 + c*2 + d = f(2)
482 // a*3^3 + b*3^2 + c*3 + d = f(3)
483 // These equations can be rewritten as a matrix equation M * [a, b, c, d] = [f(0), f(1), f(2),
484 // f(3)], where M is:
485 // 0, 0, 0, 1
486 // 1, 1, 1, 1
487 // 2^3, 2^2, 2, 1
488 // 3^3, 3^2, 3, 1
489 // We can invert this matrix in order to compute a, b, c, d:
490 // -1/6, 1/2, -1/2, 1/6
491 // 1, -5/2, 2, -1/2
492 // -11/6, 3, -3/2, 1/3
493 // 1, 0, 0, 0
494 // To compute these values, we can multiply everything by 6 and multiply by inverse_six at the
495 // end for each coefficient The resulting computation here does 18 field adds, 6 subtracts, 3
496 // muls to compute a, b, c, and d.
497 Fr zero_times_3 = value_at(0) + value_at(0) + value_at(0);
498 Fr zero_times_6 = zero_times_3 + zero_times_3;
499 Fr zero_times_12 = zero_times_6 + zero_times_6;
500 Fr one_times_3 = value_at(1) + value_at(1) + value_at(1);
501 Fr one_times_6 = one_times_3 + one_times_3;
502 Fr two_times_3 = value_at(2) + value_at(2) + value_at(2);
503 Fr three_times_2 = value_at(3) + value_at(3);
504 Fr three_times_3 = three_times_2 + value_at(3);
505
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;
509 Fr a = (one_minus_two_times_3 + value_at(3) - value_at(0)) * inverse_six; // compute a in 1 muls and 4 adds
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) *
512 inverse_six;
513
514 // Then, outside of the a, b, c, d computation, we need to do some extra precomputation
515 // This work is 3 field muls, 8 adds
516 Fr a_plus_b = a + b;
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;
524
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);
527 // For each new evaluation, we do only 6 field additions and 0 muls.
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;
530
531 idx_sqr_three_times_a += x_a_term + three_a;
532 x_a_term += six_a;
533
534 linear_term += three_a_plus_two_b;
535 }
536 } else {
537 for (size_t k = domain_end; k != EXTENDED_DOMAIN_END; ++k) {
538 result.value_at(k) = 0;
539 // compute each term v_j / (d_j*(x-x_j)) of the sum
540 for (size_t j = domain_start; j != domain_end; ++j) {
541 Fr term = value_at(j);
542 term *= Data::precomputed_denominator_inverses[LENGTH * k + j];
543 result.value_at(k) += term;
544 }
545 // scale the sum by the value of of B(x)
546 result.value_at(k) *= Data::full_numerator_values[k];
547 }
548 }
549 return result;
550 }
551
558 template <size_t INITIAL_LENGTH> void self_extend_from()
559 {
560 if constexpr (INITIAL_LENGTH == 2) {
561 const Fr delta = value_at(1) - value_at(0);
562 Fr next = value_at(1);
563 for (size_t idx = 2; idx < LENGTH; idx++) {
564 next += delta;
565 value_at(idx) = next;
566 }
567 } else {
568 throw_or_abort("self_extend_from called with INITIAL_LENGTH different from 2.");
569 }
570 }
571
578 Fr evaluate(const Fr& u) const
579 {
581 Fr full_numerator_value = 1;
582 for (size_t i = domain_start; i != domain_end; ++i) {
583 full_numerator_value *= u - i;
584 }
585
586 // build set of domain size-many denominator inverses 1/(d_i*(x_k - x_j)). will multiply against
587 // each of these (rather than to divide by something) for each barycentric evaluation
588 std::array<Fr, LENGTH> denominator_inverses;
589 for (size_t i = 0; i != LENGTH; ++i) {
590 Fr inv = Data::lagrange_denominators[i];
591 inv *= u - Data::big_domain[i]; // warning: need to avoid zero here
592 inv = Fr(1) / inv;
593 denominator_inverses[i] = inv;
594 }
595
596 Fr result = 0;
597 // compute each term v_j / (d_j*(x-x_j)) of the sum
598 for (size_t i = domain_start; i != domain_end; ++i) {
599 Fr term = value_at(i);
600 term *= denominator_inverses[i - domain_start];
601 result += term;
602 }
603 // scale the sum by the value of of B(x)
604 result *= full_numerator_value;
605 return result;
606 };
607
608 // Begin iterators
609 auto begin() { return evaluations.begin(); }
610 auto begin() const { return evaluations.begin(); }
611 // End iterators
612 auto end() { return evaluations.end(); }
613 auto end() const { return evaluations.end(); }
614};
615
616template <typename B, class Fr, size_t domain_end, size_t domain_start = 0>
617inline void read(B& it, Univariate<Fr, domain_end, domain_start>& univariate)
618{
619 using serialize::read;
620 read(it, univariate.evaluations);
621}
622
623template <typename B, class Fr, size_t domain_end, size_t domain_start = 0>
624inline void write(B& it, Univariate<Fr, domain_end, domain_start> const& univariate)
625{
626 using serialize::write;
627 write(it, univariate.evaluations);
628}
629
630template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0>
636
637template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0>
643
644template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0>
650
651template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0> class UnivariateView {
652 public:
653 static constexpr size_t LENGTH = domain_end - domain_start;
655 static constexpr size_t MONOMIAL_LENGTH = LENGTH > 1 ? 2 : 1;
657
658 UnivariateView() = default;
659
660 bool operator==(const UnivariateView& other) const
661 {
662 bool r = true;
663 r = r && (evaluations[0] == other.evaluations[0]);
664 // a view might have nonzero terms in its skip_count if accessing an original monomial
665 for (size_t i = skip_count + 1; i < LENGTH; ++i) {
666 r = r && (evaluations[i] == other.evaluations[i]);
667 }
668 return r;
669 };
670
671 const Fr& value_at(size_t i) const { return evaluations[i]; };
672
673 template <size_t full_domain_end, size_t full_domain_start = 0>
675 : evaluations(std::span<const Fr>(univariate_in.evaluations.data(), LENGTH)){};
676
678 requires(LENGTH > 1)
679 {
680 static_assert(domain_end >= 2);
681 static_assert(domain_start == 0);
682
684
685 result.coefficients[0] = evaluations[0];
686 result.coefficients[1] = evaluations[1] - evaluations[0];
687 result.coefficients[2] = evaluations[1];
688 return result;
689 }
690
697
704
706 {
708 size_t i = 0;
709 for (auto& eval : res.evaluations) {
710 if (i == 0 || i >= (skip_count + 1)) {
711 eval = -eval;
712 }
713 i++;
714 }
715 return res;
716 }
717
730
738
746
748 {
750 res += other;
751 return res;
752 }
753
755 {
757 res -= other;
758 return res;
759 }
760
762 {
764 res *= other;
765 return res;
766 }
767
775
776 // Output is immediately parsable as a list of integers by Python.
777 friend std::ostream& operator<<(std::ostream& os, const UnivariateView& u)
778 {
779 os << "[";
780 os << u.evaluations[0] << "," << std::endl;
781 for (size_t i = 1; i < u.evaluations.size(); i++) {
782 os << " " << u.evaluations[i];
783 if (i + 1 < u.evaluations.size()) {
784 os << "," << std::endl;
785 } else {
786 os << "]";
787 };
788 }
789 return os;
790 }
791};
792
793template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0>
799
800template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0>
806
807template <class Fr, size_t domain_end, size_t domain_start = 0, size_t skip_count = 0>
813
827template <typename T, typename U, std::size_t N, std::size_t... Is>
828std::array<T, sizeof...(Is)> array_to_array_aux(const std::array<U, N>& elements, std::index_sequence<Is...>)
829{
830 return { { T{ elements[Is] }... } };
831};
832
850template <typename T, typename U, std::size_t N> std::array<T, N> array_to_array(const std::array<U, N>& elements)
851{
852 // Calls the aux method that uses the index sequence to unpack all values in `elements`
853 return array_to_array_aux<T, U, N>(elements, std::make_index_sequence<N>());
854};
855
856} // namespace bb
857
858namespace std {
859template <typename T, size_t N> struct tuple_size<bb::Univariate<T, N>> : std::integral_constant<std::size_t, N> {};
860
861} // namespace std
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)
Fr & value_at(size_t i)
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 sqr() const
bool is_zero() const
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...
static Univariate zero()
Univariate & operator+=(const Univariate &other)
Univariate & operator*=(const Fr &scalar)
auto end() const
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 value)
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
auto begin() 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 & self_sqr()
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()=default
Univariate operator-(const Fr &scalar) const
Univariate()=default
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
UnivariateView()=default
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
FF a
FF b
uint8_t buffer[RANDOM_BUFFER_SIZE]
Definition engine.cpp:34
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...
STL namespace.
void read(auto &buf, std::integral auto &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Curve::ScalarField Fr
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)