1 // Test quadratic field extensions.
2 
3 #include "pbc.h"
4 #include "pbc_fp.h"
5 #include "pbc_fieldquadratic.h"
6 #include "pbc_test.h"
7 
main(void)8 int main(void) {
9   field_t fp, fp2;
10   mpz_t prime;
11   element_t a, b, c;
12 
13   mpz_init(prime);
14   // Prime is 3 mod 4 so that -1 is a quadratic nonresidue.
15   // For smaller tests, try the prime 83.
16   mpz_setbit(prime, 256);
17   do {
18     mpz_nextprime(prime, prime);
19   } while (mpz_fdiv_ui(prime, 4) != 3);
20 
21   field_init_fp(fp, prime);
22   field_init_fi(fp2, fp);
23   element_init(a, fp2);
24   element_init(b, fp2);
25   element_init(c, fp2);
26 
27   element_printf("field: %Z^2\n", prime);
28 
29   element_random(a);
30   element_random(b);
31   element_printf("a = %B, b = %B\n", a, b);
32 
33   element_add(c, a, b);
34   element_printf("a + b = %B\n", c);
35 
36   element_mul(c, a, b);
37   element_printf("a * b = %B\n", c);
38 
39   for (;;) {
40     element_random(a);
41     element_printf("new a = %B\n", a);
42 
43     if (element_is_sqr(a)) break;
44     printf(" is not a square\n");
45   }
46   element_sqrt(c, a);
47   element_printf("sqrt(a) = %B\n", c);
48   element_mul(c, c, c);
49   element_printf("sqrt(a) * sqrt(a) = %B\n", c);
50   element_invert(c, a);
51   element_printf("1/a = %B\n", c);
52   element_mul(c, c, a);
53   element_printf("1/a * a = %B\n", c);
54 
55   element_clear(a);
56   element_clear(b);
57   element_clear(c);
58   field_clear(fp);
59   field_clear(fp2);
60   mpz_clear(prime);
61   return 0;
62 }
63