Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
general_field.test.cpp
Go to the documentation of this file.
1
17#include <gtest/gtest.h>
18
19using namespace bb;
20
21template <typename F> class FieldTest : public ::testing::Test {};
22
23using AllFieldTypes = ::testing::
24 Types<bb::fq, bb::fr, secp256k1::fq, secp256k1::fr, secp256r1::fq, secp256r1::fr, bb::fq2, bb::fq6, bb::fq12>;
25
27
28// ================================
29// Zero and One
30// ================================
31
32TYPED_TEST(FieldTest, ZeroIsAdditiveIdentity)
33{
34 using FF = TypeParam;
35
37 FF zero = FF::zero();
38
39 EXPECT_EQ(a + zero, a);
40 EXPECT_EQ(zero + a, a);
41}
42
43TYPED_TEST(FieldTest, OneIsMultiplicativeIdentity)
44{
45 using FF = TypeParam;
46
48 FF one = FF::one();
49
50 EXPECT_EQ(a * one, a);
51 EXPECT_EQ(one * a, a);
52}
53
55{
56 using FF = TypeParam;
57
58 FF zero = FF::zero();
59 FF one = FF::one();
60 FF random = FF::random_element();
61
62 EXPECT_TRUE(zero.is_zero());
63 EXPECT_FALSE(one.is_zero());
64 EXPECT_FALSE(random.is_zero());
65}
66
67// ================================
68// Addition
69// ================================
70
71TYPED_TEST(FieldTest, AdditionCommutative)
72{
73 using FF = TypeParam;
74
77
78 EXPECT_EQ(a + b, b + a);
79}
80
81TYPED_TEST(FieldTest, AdditionAssociative)
82{
83 using FF = TypeParam;
84
88 FF a_plus_b = a + b;
89 FF b_plus_c = b + c;
90
91 EXPECT_EQ(a_plus_b + c, a + b_plus_c);
92}
93
94// ================================
95// Subtraction and Negation
96// ================================
97
98TYPED_TEST(FieldTest, SubtractionIsAdditionOfNegation)
99{
100 using FF = TypeParam;
101
104 FF neg_b = -b;
105
106 EXPECT_EQ(a - b, a + neg_b);
107}
108
109TYPED_TEST(FieldTest, NegationCancels)
110{
111 using FF = TypeParam;
112
114 FF neg_a = -a;
115 FF result = a + neg_a;
116
117 EXPECT_EQ(result, FF::zero());
118}
119
120TYPED_TEST(FieldTest, NegationOfZero)
121{
122 using FF = TypeParam;
123
124 FF zero = FF::zero();
125 FF neg_zero = -zero;
126
127 EXPECT_EQ(zero, neg_zero);
128}
129
130TYPED_TEST(FieldTest, DoubleNegation)
131{
132 using FF = TypeParam;
133
135 EXPECT_EQ(-(-a), a);
136}
137
138// ================================
139// Multiplication
140// ================================
141
142TYPED_TEST(FieldTest, MultiplicationCommutative)
143{
144 using FF = TypeParam;
145
148
149 EXPECT_EQ(a * b, b * a);
150}
151
152TYPED_TEST(FieldTest, MultiplicationAssociative)
153{
154 using FF = TypeParam;
155
159
160 EXPECT_EQ((a * b) * c, a * (b * c));
161}
162
163TYPED_TEST(FieldTest, MultiplicationDistributive)
164{
165 using FF = TypeParam;
166
170
171 EXPECT_EQ(a * (b + c), (a * b) + (a * c));
172}
173
175{
176 using FF = TypeParam;
177
179 FF zero = FF::zero();
180
181 EXPECT_EQ(a * zero, FF::zero());
182 EXPECT_EQ(zero * a, FF::zero());
183}
184
185// ================================
186// Squaring
187// ================================
188
189TYPED_TEST(FieldTest, SquaringMatchesMultiplication)
190{
191 using FF = TypeParam;
192
194 FF sqr_result = a.sqr();
195 FF mul_result = a * a;
196
197 EXPECT_EQ(sqr_result, mul_result);
198}
199
200TYPED_TEST(FieldTest, DifferenceOfSquares)
201{
202 using FF = TypeParam;
203
204 // (a - b)(a + b) = a² - b²
207
208 FF lhs = (a - b) * (a + b);
209 FF rhs = a.sqr() - b.sqr();
210
211 EXPECT_EQ(lhs, rhs);
212}
213
214// ================================
215// Inversion
216// ================================
217
218TYPED_TEST(FieldTest, InverseProperty)
219{
220 using FF = TypeParam;
221
223 FF a_inv = a.invert();
224 FF result = a * a_inv;
225
226 EXPECT_EQ(result, FF::one());
227}
228
229TYPED_TEST(FieldTest, InvertOneIsOne)
230{
231 using FF = TypeParam;
232
233 FF one = FF::one();
234 FF result = one.invert();
235 EXPECT_EQ(result, FF::one());
236}
237
238TYPED_TEST(FieldTest, DoubleInverse)
239{
240 using FF = TypeParam;
241
243 FF a_inv_inv = a.invert().invert();
244
245 EXPECT_EQ(a_inv_inv, a);
246}
247
248// ================================
249// Self-Modifying Operations
250// ================================
251
253{
254 using FF = TypeParam;
255
257 FF a_copy = a;
258
259 a_copy.self_neg();
260 EXPECT_EQ(a_copy, -a);
261}
262
263TYPED_TEST(FieldTest, OperatorPlusEquals)
264{
265 using FF = TypeParam;
266
269 FF expected = a + b;
270
271 a += b;
272 EXPECT_EQ(a, expected);
273}
274
275TYPED_TEST(FieldTest, OperatorMinusEquals)
276{
277 using FF = TypeParam;
278
281 FF expected = a - b;
282
283 a -= b;
284 EXPECT_EQ(a, expected);
285}
286
287TYPED_TEST(FieldTest, OperatorTimesEquals)
288{
289 using FF = TypeParam;
290
293 FF expected = a * b;
294
295 a *= b;
296 EXPECT_EQ(a, expected);
297}
298
300{
301 using FF = TypeParam;
302
304 FF expected = a.sqr();
305
306 a.self_sqr();
307 EXPECT_EQ(a, expected);
308}
309
310// ================================
311// Algebraic Identities
312// ================================
313
314TYPED_TEST(FieldTest, AddMulConsistency)
315{
316 using FF = TypeParam;
317
318 // a + a + a should equal 3a (verified via repeated addition on both sides)
320 FF sum = a + a + a;
321
322 // Build "3" as one + one + one to avoid integer constructors, which do not exist in our implementation of extension
323 // fields.
324 FF three = FF::one() + FF::one() + FF::one();
325 FF product = a * three;
326
327 EXPECT_EQ(sum, product);
328}
329
330TYPED_TEST(FieldTest, SubMulConsistency)
331{
332 using FF = TypeParam;
333
334 // 4a - a = 3a
336 FF four_a = a + a + a + a;
337 FF result = four_a - a;
338
339 FF three = FF::one() + FF::one() + FF::one();
340 FF expected = a * three;
341
342 EXPECT_EQ(result, expected);
343}
FF a
FF b
::testing::Types< bb::fq, bb::fr, secp256k1::fq, secp256k1::fr, secp256r1::fq, secp256r1::fr, bb::fq2, bb::fq6, bb::fq12 > AllFieldTypes
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
Inner sum(Cont< Inner, Args... > const &in)
Definition container.hpp:70
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
BB_INLINE constexpr void self_sqr() &noexcept
constexpr field invert() const noexcept
BB_INLINE constexpr void self_neg() &noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const noexcept
BB_INLINE constexpr bool is_zero() const noexcept