1 /*=============================================================================
2 
3     This file is part of Antic.
4 
5     Antic is free software: you can redistribute it and/or modify it under
6     the terms of the GNU Lesser General Public License (LGPL) as published
7     by the Free Software Foundation; either version 2.1 of the License, or
8     (at your option) any later version. See <http://www.gnu.org/licenses/>.
9 
10 =============================================================================*/
11 /******************************************************************************
12 
13     Copyright (C) 2014 William Hart
14                   2020 Julian Rüth
15 
16 ******************************************************************************/
17 
18 #include <stdio.h>
19 #include "nf.h"
20 #include "nf_elem.h"
21 
22 int
main(void)23 main(void)
24 {
25     int i, result;
26     flint_rand_t state;
27 
28     flint_printf("inv....");
29     fflush(stdout);
30 
31     flint_randinit(state);
32 
33     /* test a*^-1 = 1 */
34     for (i = 0; i < 10*antic_test_multiplier(); i++)
35     {
36         nf_t nf;
37         nf_elem_t a, ainv, p1;
38 
39         nf_init_randtest(nf, state, 25, 100);
40 
41         nf_elem_init(a, nf);
42         nf_elem_init(ainv, nf);
43         nf_elem_init(p1, nf);
44 
45         do {
46            nf_elem_randtest_not_zero(a, state, 100, nf);
47         } while (!_nf_elem_invertible_check(a, nf));
48 
49         nf_elem_inv(ainv, a, nf);
50         nf_elem_mul(p1, ainv, a, nf);
51 
52         result = (nf_elem_is_one(p1, nf));
53         if (!result)
54         {
55            printf("FAIL:\n");
56            printf("a = "); nf_elem_print_pretty(a, nf, "x"); printf("\n");
57            printf("ainv = "); nf_elem_print_pretty(ainv, nf, "x"); printf("\n");
58            printf("p1 = "); nf_elem_print_pretty(p1, nf, "x"); printf("\n");
59            abort();
60         }
61 
62         nf_elem_clear(a, nf);
63         nf_elem_clear(ainv, nf);
64         nf_elem_clear(p1, nf);
65 
66         nf_clear(nf);
67     }
68 
69     /* test aliasing a and b */
70     for (i = 0; i < 10 * antic_test_multiplier(); i++)
71     {
72         nf_t nf;
73         nf_elem_t a, b;
74 
75         nf_init_randtest(nf, state, 25, 100);
76 
77         nf_elem_init(a, nf);
78         nf_elem_init(b, nf);
79 
80         do {
81            nf_elem_randtest_not_zero(b, state, 100, nf);
82         } while (!_nf_elem_invertible_check(b, nf));
83 
84         nf_elem_inv(a, b, nf);
85         nf_elem_inv(b, b, nf);
86 
87         result = (nf_elem_equal(a, b, nf));
88         if (!result)
89         {
90            printf("FAIL:\n");
91            printf("a = "); nf_elem_print_pretty(a, nf, "x"); printf("\n");
92            printf("b = "); nf_elem_print_pretty(b, nf, "x"); printf("\n");
93            abort();
94         }
95 
96         nf_elem_clear(a, nf);
97         nf_elem_clear(b, nf);
98 
99         nf_clear(nf);
100     }
101 
102     flint_randclear(state);
103     flint_cleanup();
104     flint_printf("PASS\n");
105     return 0;
106 }
107