1 // Test F_p.
2
3 #include "pbc.h"
4 #include "pbc_fp.h"
5 #include "pbc_test.h"
6
main(void)7 int main(void) {
8 field_t fp;
9 mpz_t prime;
10 mpz_t m, n;
11
12 mpz_init(prime);
13 mpz_init(n);
14 mpz_init(m);
15 mpz_set_ui(prime, 100000);
16 mpz_setbit(prime, 33);
17 mpz_nextprime(prime, prime);
18
19 field_init_fp(fp, prime);
20
21 element_t x, y, z;
22 element_init(x, fp);
23 element_init(y, fp);
24 element_init(z, fp);
25
26 long a = 123, b = 456;
27
28 // Conversion to and from signed long.
29 EXPECT(0 == element_to_si(z));
30 element_set1(z);
31 EXPECT(1 == element_to_si(z));
32 element_set0(z);
33 EXPECT(0 == element_to_si(z));
34 element_set_si(x, a);
35 EXPECT(a == element_to_si(x));
36 element_set_si(y, b);
37 EXPECT(b == element_to_si(y));
38 // Assignment, comparison.
39 EXPECT(!element_cmp(x, x));
40 EXPECT(element_cmp(x, y));
41 EXPECT(element_cmp(z, x));
42 element_set(z, x);
43 EXPECT(!element_cmp(z, x));
44 // Arithmetic operations.
45 element_add(z, x, y);
46 EXPECT(a + b == element_to_si(z));
47 element_mul(z, x, y);
48 EXPECT(a * b == element_to_si(z));
49 element_sub(z, y, x);
50 EXPECT(b - a == element_to_si(z));
51 element_set_mpz(z, prime);
52 EXPECT(!element_to_si(z));
53 element_sub(z, z, x);
54 element_to_mpz(n, z);
55 mpz_add_ui(n, n, a);
56 EXPECT(!mpz_cmp(n, prime));
57 element_invert(z, x);
58 element_to_mpz(m, z);
59 mpz_set_ui(n, a);
60 mpz_invert(n, n, prime);
61 EXPECT(!mpz_cmp(m, n));
62 element_invert(z, z);
63 EXPECT(!element_cmp(x, z));
64 element_div(z, y, x);
65 element_to_mpz(m, z);
66 mpz_mul_ui(n, n, b);
67 mpz_mod(n, n, prime);
68 EXPECT(!mpz_cmp(m, n));
69 // Exponentiation.
70 element_pow_zn(z, x, y);
71 element_to_mpz(m, z);
72 mpz_set_si(n, a);
73 mpz_powm_ui(n, n, b, prime);
74 EXPECT(!mpz_cmp(m, n));
75 // Preprocessed exponentiation.
76 element_pp_t p;
77 element_pp_init(p, x);
78 element_pp_pow_zn(z, y, p);
79 element_pp_clear(p);
80 element_to_mpz(m, z);
81 EXPECT(!mpz_cmp(m, n));
82
83 element_from_hash(z, NULL, 0);
84 element_from_hash(x, NULL, 0);
85 EXPECT(!element_cmp(z, x));
86
87 element_clear(x);
88 element_clear(y);
89 element_clear(z);
90 field_clear(fp);
91 mpz_clear(prime);
92 mpz_clear(m);
93 mpz_clear(n);
94 return pbc_err_count;
95 }
96