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