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