8TEST(Polynomial, Shifted)
12 const size_t SIZE = 10;
13 auto poly = Polynomial::random(SIZE, 1);
16 auto poly_shifted = poly.shifted();
18 EXPECT_EQ(poly_shifted.size(), poly.size());
21 for (
size_t i = 0; i < poly_shifted.size() - 1; ++i) {
22 EXPECT_EQ(poly_shifted.get(i), poly.get(i + 1));
27 for (
size_t i = 0; i < poly_shifted.size() - 1; ++i) {
28 EXPECT_EQ(poly_shifted.get(i), poly.get(i + 1));
37 const size_t SIZE = 10;
38 const size_t VIRTUAL_SIZE = 20;
39 const size_t START_IDX = 2;
40 const size_t END_IDX = SIZE + START_IDX;
41 auto poly = Polynomial::random(SIZE, VIRTUAL_SIZE, START_IDX);
44 auto poly_reversed = poly.reverse();
46 EXPECT_EQ(poly_reversed.size(), poly.size());
47 EXPECT_EQ(poly_reversed.virtual_size(), poly.end_index());
50 for (
size_t i = 0; i < END_IDX; ++i) {
51 EXPECT_EQ(poly_reversed.get(END_IDX - 1 - i), poly.get(i));
55 FF initial_value = poly.at(3);
57 EXPECT_EQ(poly_reversed.at(END_IDX - 4), initial_value);
65 const size_t SIZE = 10;
66 auto poly = Polynomial::random(SIZE);
69 auto poly_clone = poly.share();
72 EXPECT_EQ(poly_clone, poly);
76 EXPECT_EQ(poly_clone, poly);
78 poly_clone.at(2) = 13;
79 EXPECT_EQ(poly_clone, poly);
83 auto poly2 = Polynomial::random(SIZE);
86 EXPECT_NE(poly_clone, poly);
99TEST(Polynomial, AddScaledVectorizedMatchesScalar)
107 constexpr size_t SELF_SIZE = 30;
108 constexpr size_t SELF_VSIZE = 32;
109 constexpr size_t SELF_START = 2;
110 constexpr size_t OTHER_SIZE = 13;
111 constexpr size_t OTHER_VSIZE = 32;
112 constexpr size_t OTHER_START = 5;
114 Poly self(SELF_SIZE, SELF_VSIZE, SELF_START);
115 Poly other(OTHER_SIZE, OTHER_VSIZE, OTHER_START);
116 for (
size_t i = SELF_START; i < SELF_START + SELF_SIZE; ++i) {
117 self.at(i) =
FF((i * 11) + 1);
119 for (
size_t i = OTHER_START; i < OTHER_START + OTHER_SIZE; ++i) {
120 other.at(i) =
FF((i * 17) + 3);
122 Poly self_ref = self;
125 self.add_scaled(other, scalar);
127 for (
size_t i = OTHER_START; i < OTHER_START + OTHER_SIZE; ++i) {
128 self_ref.at(i) = self_ref.at(i) + scalar * other.at(i);
130 for (
size_t i = SELF_START; i < SELF_START + SELF_SIZE; ++i) {
131 EXPECT_EQ(self.at(i), self_ref.at(i)) <<
"i=" << i;
139TEST(Polynomial, AddAssignVectorizedMatchesScalar)
143 constexpr size_t SELF_SIZE = 30;
144 constexpr size_t SELF_VSIZE = 32;
145 constexpr size_t SELF_START = 2;
146 constexpr size_t OTHER_SIZE = 13;
147 constexpr size_t OTHER_VSIZE = 32;
148 constexpr size_t OTHER_START = 5;
150 Poly self(SELF_SIZE, SELF_VSIZE, SELF_START);
151 Poly other(OTHER_SIZE, OTHER_VSIZE, OTHER_START);
152 for (
size_t i = SELF_START; i < SELF_START + SELF_SIZE; ++i) {
153 self.at(i) =
FF((i * 11) + 1);
155 for (
size_t i = OTHER_START; i < OTHER_START + OTHER_SIZE; ++i) {
156 other.at(i) =
FF((i * 17) + 3);
158 Poly self_ref = self;
162 for (
size_t i = OTHER_START; i < OTHER_START + OTHER_SIZE; ++i) {
163 self_ref.at(i) = self_ref.at(i) + other.at(i);
165 for (
size_t i = SELF_START; i < SELF_START + SELF_SIZE; ++i) {
166 EXPECT_EQ(self.at(i), self_ref.at(i)) <<
"i=" << i;
170TEST(Polynomial, SubtractAssignVectorizedMatchesScalar)
174 constexpr size_t SELF_SIZE = 30;
175 constexpr size_t SELF_VSIZE = 32;
176 constexpr size_t SELF_START = 2;
177 constexpr size_t OTHER_SIZE = 13;
178 constexpr size_t OTHER_VSIZE = 32;
179 constexpr size_t OTHER_START = 5;
181 Poly self(SELF_SIZE, SELF_VSIZE, SELF_START);
182 Poly other(OTHER_SIZE, OTHER_VSIZE, OTHER_START);
183 for (
size_t i = SELF_START; i < SELF_START + SELF_SIZE; ++i) {
184 self.at(i) =
FF((i * 11) + 1);
186 for (
size_t i = OTHER_START; i < OTHER_START + OTHER_SIZE; ++i) {
187 other.at(i) =
FF((i * 17) + 3);
189 Poly self_ref = self;
193 for (
size_t i = OTHER_START; i < OTHER_START + OTHER_SIZE; ++i) {
194 self_ref.at(i) = self_ref.at(i) - other.at(i);
196 for (
size_t i = SELF_START; i < SELF_START + SELF_SIZE; ++i) {
197 EXPECT_EQ(self.at(i), self_ref.at(i)) <<
"i=" << i;
201TEST(Polynomial, MultiplyAssignVectorizedMatchesScalar)
207 constexpr size_t SIZE = 17;
208 constexpr size_t VSIZE = 24;
209 constexpr size_t START = 3;
211 Poly p(SIZE, VSIZE, START);
212 for (
size_t i = START; i < START + SIZE; ++i) {
213 p.at(i) =
FF((i * 13) + 5);
220 for (
size_t i = START; i < START + SIZE; ++i) {
221 p_ref.at(i) = p_ref.at(i) * scalar;
223 for (
size_t i = START; i < START + SIZE; ++i) {
224 EXPECT_EQ(p.at(i), p_ref.at(i)) <<
"i=" << i;
254TEST(Polynomial, FullPreservesCoefficients)
257 const size_t virtual_size = 16;
258 const size_t start = 3;
259 const size_t size = 5;
261 for (
size_t i = 0; i < size; ++i) {
262 poly.at(start + i) =
FF(i + 100);
264 auto full = poly.full();
265 EXPECT_EQ(full.start_index(), 0UL);
266 EXPECT_EQ(full.end_index(), virtual_size);
267 for (
size_t i = 0; i < virtual_size; ++i) {
268 const bool in_backed_range = i >= start && i < start + size;
269 const FF expected = in_backed_range ?
FF(i - start + 100) :
FF(0);
270 EXPECT_EQ(full[i], expected) <<
"mismatch at index " << i;
Fr evaluate_mle(std::span< const Fr > evaluation_points, bool shift=false) const
evaluate multi-linear extension p(X_0,…,X_{n-1}) = \sum_i a_i*L_i(X_0,…,X_{n-1}) at u = (u_0,...