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