Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
univariate.test.cpp
Go to the documentation of this file.
1#include "univariate.hpp"
3#include <gtest/gtest.h>
4
5using namespace bb;
6
7template <typename FF> class UnivariateTest : public testing::Test {
8 public:
9 template <size_t view_length> using UnivariateView = UnivariateView<FF, view_length>;
10};
11
12using FieldTypes = testing::Types<fr>;
14
16{
20
21 Univariate<fr, 3> uni({ a0, a1, a2 });
22
23 EXPECT_EQ(uni.value_at(0), a0);
24 EXPECT_EQ(uni.value_at(1), a1);
25 EXPECT_EQ(uni.value_at(2), a2);
26}
27
29{
30 Univariate<fr, 2> f1{ { 1, 2 } };
31 Univariate<fr, 2> f2{ { 3, 4 } };
32 // output should be {4, 6}
34 auto f1f2 = f1 + f2;
35 EXPECT_EQ(f1f2, expected_result);
36}
37
38TYPED_TEST(UnivariateTest, Multiplication)
39{
40
41 Univariate<fr, 3> f1 = Univariate<fr, 2>{ { 1, 2 } }.template extend_to<3>();
42 Univariate<fr, 3> f2 = Univariate<fr, 2>{ { 3, 4 } }.template extend_to<3>();
43 // output should be {3, 8, 15}
44 Univariate<fr, 3> expected_result{ { 3, 8, 15 } };
45 Univariate<fr, 3> f1f2 = f1 * f2;
46 EXPECT_EQ(f1f2, expected_result);
47}
48
49TYPED_TEST(UnivariateTest, ConstructUnivariateViewFromUnivariate)
50{
51
52 Univariate<fr, 3> f{ { 1, 2, 3 } };
54 EXPECT_EQ(g.value_at(0), f.value_at(0));
55 EXPECT_EQ(g.value_at(1), f.value_at(1));
56}
57
58TYPED_TEST(UnivariateTest, ConstructUnivariateFromUnivariateView)
59{
60
61 Univariate<fr, 3> f{ { 1, 2, 3 } };
64 EXPECT_EQ(h.value_at(0), g.value_at(0));
65 EXPECT_EQ(h.value_at(1), g.value_at(1));
66}
67
68TYPED_TEST(UnivariateTest, UnivariateViewAddition)
69{
70 Univariate<fr, 3> f1{ { 1, 2, 3 } };
71 Univariate<fr, 3> f2{ { 3, 4, 3 } };
72
75
77 Univariate<fr, 2> result = g1 + g2;
78 EXPECT_EQ(result, expected_result);
79
80 Univariate<fr, 2> result2 = result + g1;
81 Univariate<fr, 2> expected_result2{ { 5, 8 } };
82 EXPECT_EQ(result2, expected_result2);
83}
84TYPED_TEST(UnivariateTest, UnivariateViewSubtraction)
85{
86 Univariate<fr, 3> f1{ { 1, 2, 3 } };
87 Univariate<fr, 3> f2{ { 3, 4, 3 } };
88
91
93 Univariate<fr, 2> result = g1 - g2;
94 EXPECT_EQ(result, expected_result);
95
96 Univariate<fr, 2> result2 = result - g1;
97 Univariate<fr, 2> expected_result2{ { -3, -4 } };
98 EXPECT_EQ(result2, expected_result2);
99}
100
101TYPED_TEST(UnivariateTest, UnivariateViewMultiplication)
102{
103 Univariate<fr, 3> f1{ { 1, 2, 3 } };
104 Univariate<fr, 3> f2{ { 3, 4, 3 } };
105
108
110 Univariate<fr, 2> result = g1 * g2;
111 EXPECT_EQ(result, expected_result);
112
113 Univariate<fr, 2> result2 = result * g1;
114 Univariate<fr, 2> expected_result2{ { 3, 16 } };
115 EXPECT_EQ(result2, expected_result2);
116}
117
119{
120 const size_t LENGTH = 4;
121 std::array<fr, LENGTH> evaluations;
122
123 for (size_t i = 0; i < LENGTH; ++i) {
124 evaluations[i] = fr::random_element();
125 }
126
127 // Instantiate a Univariate from the evaluations
128 auto univariate = Univariate<fr, LENGTH>(evaluations);
129
130 // Serialize univariate to buffer
131 std::vector<uint8_t> buffer = univariate.to_buffer();
132
133 // Deserialize
134 auto deserialized_univariate = Univariate<fr, LENGTH>::serialize_from_buffer(&buffer[0]);
135
136 for (size_t i = 0; i < LENGTH; ++i) {
137 EXPECT_EQ(univariate.value_at(i), deserialized_univariate.value_at(i));
138 }
139}
140
141TYPED_TEST(UnivariateTest, EvaluationCustomDomain)
142{
143 []() {
144 auto poly = Univariate<fr, 3, 1>(std::array<fr, 2>{ 1, 2 });
145 EXPECT_EQ(poly.evaluate(fr(5)), fr(5));
146 }();
147
148 []() {
149 auto poly = Univariate<fr, 37, 32>(std::array<fr, 5>{ 1, 11, 111, 1111, 11111 });
150 EXPECT_EQ(poly.evaluate(fr(2)), fr(294330751));
151 }();
152}
UnivariateView< FF, view_length > UnivariateView
A univariate polynomial represented by its values on {domain_start, domain_start + 1,...
Fr & value_at(size_t i)
static Univariate serialize_from_buffer(uint8_t const *buffer)
A view of a univariate, also used to truncate univariates.
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
Definition group.hpp:36
bool expected_result
uint8_t buffer[RANDOM_BUFFER_SIZE]
Definition engine.cpp:34
testing::Types< bb::fr > FieldTypes
Entry point for Barretenberg command-line interface.
group< fq2, fr, Bn254G2Params > g2
Definition g2.hpp:39
group< fq, fr, Bn254G1Params > g1
Definition g1.hpp:33
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
field< Bn254FrParams > fr
Definition fr.hpp:174
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static field random_element(numeric::RNG *engine=nullptr) noexcept