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("div....");
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, b, c;
38 
39         nf_init_randtest(nf, state, 25, 100);
40 
41         nf_elem_init(a, nf);
42         nf_elem_init(b, nf);
43         nf_elem_init(c, nf);
44 
45         do {
46            nf_elem_randtest_not_zero(a, state, 100, nf);
47         } while (!_nf_elem_invertible_check(a, nf));
48         nf_elem_randtest(b, state, 100, nf);
49 
50         nf_elem_div(c, b, a, nf);
51         nf_elem_mul(c, c, a, nf);
52 
53         result = (nf_elem_equal(b, c, nf));
54         if (!result)
55         {
56            printf("FAIL:\n");
57            printf("a = "); nf_elem_print_pretty(a, nf, "x"); printf("\n");
58            printf("b = "); nf_elem_print_pretty(b, nf, "x"); printf("\n");
59            printf("c = "); nf_elem_print_pretty(c, nf, "x"); printf("\n");
60            abort();
61         }
62 
63         nf_elem_clear(a, nf);
64         nf_elem_clear(b, nf);
65         nf_elem_clear(c, nf);
66 
67         nf_clear(nf);
68     }
69 
70     /* test aliasing a and b */
71     for (i = 0; i < 10 * antic_test_multiplier(); i++)
72     {
73         nf_t nf;
74         nf_elem_t a, b, c;
75 
76         nf_init_randtest(nf, state, 25, 100);
77 
78         nf_elem_init(a, nf);
79         nf_elem_init(b, nf);
80         nf_elem_init(c, nf);
81 
82         nf_elem_randtest(b, state, 100, nf);
83         do {
84            nf_elem_randtest_not_zero(c, state, 100, nf);
85         } while (!_nf_elem_invertible_check(c, nf));
86 
87         nf_elem_div(a, b, c, nf);
88         nf_elem_div(b, b, c, nf);
89 
90         result = (nf_elem_equal(a, b, nf));
91         if (!result)
92         {
93            printf("FAIL:\n");
94            printf("a = "); nf_elem_print_pretty(a, nf, "x"); printf("\n");
95            printf("b = "); nf_elem_print_pretty(b, nf, "x"); printf("\n");
96            printf("c = "); nf_elem_print_pretty(c, nf, "x"); printf("\n");
97            abort();
98         }
99 
100         nf_elem_clear(a, nf);
101         nf_elem_clear(b, nf);
102 
103         nf_clear(nf);
104     }
105 
106     /* test aliasing a and c */
107     for (i = 0; i < 10 * antic_test_multiplier(); i++)
108     {
109         fmpq_poly_t pol;
110         nf_t nf;
111         nf_elem_t a, b, c;
112 
113         fmpq_poly_init(pol);
114         do {
115            fmpq_poly_randtest_not_zero(pol, state, 25, 100);
116         } while (fmpq_poly_degree(pol) < 1);
117 
118         nf_init(nf, pol);
119 
120         nf_elem_init(a, nf);
121         nf_elem_init(b, nf);
122         nf_elem_init(c, nf);
123 
124         nf_elem_randtest(b, state, 100, nf);
125 
126         do {
127            nf_elem_randtest_not_zero(c, state, 100, nf);
128         } while (!_nf_elem_invertible_check(c, nf));
129 
130         nf_elem_div(a, b, c, nf);
131         nf_elem_div(c, b, c, nf);
132 
133         result = (nf_elem_equal(a, c, nf));
134         if (!result)
135         {
136            printf("FAIL:\n");
137            printf("a = "); nf_elem_print_pretty(a, nf, "x"); printf("\n");
138            printf("d = "); nf_elem_print_pretty(b, nf, "x"); printf("\n");
139            printf("c = "); nf_elem_print_pretty(c, nf, "x"); printf("\n");
140            abort();
141         }
142 
143         nf_elem_clear(a, nf);
144         nf_elem_clear(b, nf);
145 
146         nf_clear(nf);
147 
148         fmpq_poly_clear(pol);
149     }
150 
151     flint_randclear(state);
152     flint_cleanup();
153     flint_printf("PASS\n");
154     return 0;
155 }
156