1 /*
2 Copyright (C) 2011, 2012 Sebastian Pancratz
3
4 This file is part of FLINT.
5
6 FLINT is free software: you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License (LGPL) as published
8 by the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version. See <http://www.gnu.org/licenses/>.
10 */
11
12 #include "ulong_extras.h"
13 #include "padic.h"
14
15 int
main(void)16 main(void)
17 {
18 int i, result;
19 FLINT_TEST_INIT(state);
20
21 flint_printf("exp... ");
22 fflush(stdout);
23
24
25
26 /** p == 2 *******************************************************************/
27
28 /* Check aliasing: a = exp(a) */
29 for (i = 0; i < 1000 * flint_test_multiplier(); i++)
30 {
31 fmpz_t p;
32 slong N;
33 padic_ctx_t ctx;
34
35 padic_t a, b;
36 int ans1, ans2;
37
38 fmpz_init_set_ui(p, 2);
39
40 N = n_randint(state, PADIC_TEST_PREC_MAX - PADIC_TEST_PREC_MIN)
41 + PADIC_TEST_PREC_MIN;
42
43 padic_ctx_init(ctx, p, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), PADIC_SERIES);
44
45 padic_init2(a, N);
46 padic_init2(b, N);
47
48 padic_randtest(a, state, ctx);
49
50 ans1 = padic_exp(b, a, ctx);
51 ans2 = padic_exp(a, a, ctx);
52
53 result = ((ans1 == ans2) && (!ans1 || padic_equal(a, b)));
54 if (!result)
55 {
56 flint_printf("FAIL (aliasing):\n\n");
57 flint_printf("a = "), padic_print(a, ctx), flint_printf("\n");
58 flint_printf("b = "), padic_print(b, ctx), flint_printf("\n");
59 flint_printf("ans1 = %d\n", ans1);
60 flint_printf("ans2 = %d\n", ans2);
61 abort();
62 }
63
64 padic_clear(a);
65 padic_clear(b);
66
67 fmpz_clear(p);
68 padic_ctx_clear(ctx);
69 }
70
71 /* Functional equation: exp(a + b) == exp(a) exp(b) */
72 for (i = 0; i < 1000 * flint_test_multiplier(); i++)
73 {
74 fmpz_t p;
75 slong N;
76 padic_ctx_t ctx;
77
78 padic_t a, b, c, d, e, f, g;
79 int ans1, ans2, ans3;
80
81 fmpz_init_set_ui(p, 2);
82
83 N = n_randint(state, PADIC_TEST_PREC_MAX - PADIC_TEST_PREC_MIN)
84 + PADIC_TEST_PREC_MIN;
85
86 padic_ctx_init(ctx, p, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), PADIC_SERIES);
87
88 padic_init2(a, N);
89 padic_init2(b, N);
90 padic_init2(c, N);
91 padic_init2(d, N);
92 padic_init2(e, N);
93 padic_init2(f, N);
94 padic_init2(g, N);
95
96 padic_randtest(a, state, ctx);
97 padic_randtest(b, state, ctx);
98 padic_add(c, a, b, ctx);
99
100 ans1 = padic_exp(d, a, ctx);
101 ans2 = padic_exp(e, b, ctx);
102 padic_mul(f, d, e, ctx);
103
104 ans3 = padic_exp(g, c, ctx);
105
106 result = (!ans1 || !ans2 || (ans3 && padic_equal(f, g)));
107 if (!result)
108 {
109 flint_printf("FAIL (functional equation):\n\n");
110 flint_printf("a = "), padic_print(a, ctx), flint_printf("\n");
111 flint_printf("b = "), padic_print(b, ctx), flint_printf("\n");
112 flint_printf("c = a + b = "), padic_print(c, ctx), flint_printf("\n");
113 flint_printf("d = exp(a) = "), padic_print(d, ctx), flint_printf("\n");
114 flint_printf("e = exp(b) = "), padic_print(e, ctx), flint_printf("\n");
115 flint_printf("f = exp(a) exp(b) = "), padic_print(f, ctx), flint_printf("\n");
116 flint_printf("g = exp(a + b) = "), padic_print(g, ctx), flint_printf("\n");
117 abort();
118 }
119
120 padic_clear(a);
121 padic_clear(b);
122 padic_clear(c);
123 padic_clear(d);
124 padic_clear(e);
125 padic_clear(f);
126 padic_clear(g);
127
128 fmpz_clear(p);
129 padic_ctx_clear(ctx);
130 }
131
132 /** p > 2 ********************************************************************/
133
134 /* Check aliasing: a = exp(a) */
135 for (i = 0; i < 1000 * flint_test_multiplier(); i++)
136 {
137 fmpz_t p;
138 slong N;
139 padic_ctx_t ctx;
140
141 padic_t a, b;
142 int ans1, ans2;
143
144 fmpz_init_set_ui(p, n_randtest_prime(state, 0));
145
146 N = n_randint(state, PADIC_TEST_PREC_MAX - PADIC_TEST_PREC_MIN)
147 + PADIC_TEST_PREC_MIN;
148
149 padic_ctx_init(ctx, p, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), PADIC_SERIES);
150
151 padic_init2(a, N);
152 padic_init2(b, N);
153
154 padic_randtest(a, state, ctx);
155
156 ans1 = padic_exp(b, a, ctx);
157 ans2 = padic_exp(a, a, ctx);
158
159 result = ((ans1 == ans2) && (!ans1 || padic_equal(a, b)));
160 if (!result)
161 {
162 flint_printf("FAIL (aliasing):\n\n");
163 flint_printf("a = "), padic_print(a, ctx), flint_printf("\n");
164 flint_printf("b = "), padic_print(b, ctx), flint_printf("\n");
165 flint_printf("ans1 = %d\n", ans1);
166 flint_printf("ans2 = %d\n", ans2);
167 abort();
168 }
169
170 padic_clear(a);
171 padic_clear(b);
172
173 fmpz_clear(p);
174 padic_ctx_clear(ctx);
175 }
176
177 /* Functional equation: exp(a + b) == exp(a) exp(b) */
178 for (i = 0; i < 1000 * flint_test_multiplier(); i++)
179 {
180 fmpz_t p;
181 slong N;
182 padic_ctx_t ctx;
183
184 padic_t a, b, c, d, e, f, g;
185 int ans1, ans2, ans3;
186
187 fmpz_init_set_ui(p, n_randtest_prime(state, 0));
188
189 N = n_randint(state, PADIC_TEST_PREC_MAX - PADIC_TEST_PREC_MIN)
190 + PADIC_TEST_PREC_MIN;
191
192 padic_ctx_init(ctx, p, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), PADIC_SERIES);
193
194 padic_init2(a, N);
195 padic_init2(b, N);
196 padic_init2(c, N);
197 padic_init2(d, N);
198 padic_init2(e, N);
199 padic_init2(f, N);
200 padic_init2(g, N);
201
202 padic_randtest(a, state, ctx);
203 padic_randtest(b, state, ctx);
204 padic_add(c, a, b, ctx);
205
206 ans1 = padic_exp(d, a, ctx);
207 ans2 = padic_exp(e, b, ctx);
208 padic_mul(f, d, e, ctx);
209
210 ans3 = padic_exp(g, c, ctx);
211
212 result = (!ans1 || !ans2 || (ans3 && padic_equal(f, g)));
213 if (!result)
214 {
215 flint_printf("FAIL (functional equation):\n\n");
216 flint_printf("a = "), padic_print(a, ctx), flint_printf("\n");
217 flint_printf("b = "), padic_print(b, ctx), flint_printf("\n");
218 flint_printf("c = a + b = "), padic_print(c, ctx), flint_printf("\n");
219 flint_printf("d = exp(a) = "), padic_print(d, ctx), flint_printf("\n");
220 flint_printf("e = exp(b) = "), padic_print(e, ctx), flint_printf("\n");
221 flint_printf("f = exp(a) exp(b) = "), padic_print(f, ctx), flint_printf("\n");
222 flint_printf("g = exp(a + b) = "), padic_print(g, ctx), flint_printf("\n");
223 abort();
224 }
225
226 padic_clear(a);
227 padic_clear(b);
228 padic_clear(c);
229 padic_clear(d);
230 padic_clear(e);
231 padic_clear(f);
232 padic_clear(g);
233
234 fmpz_clear(p);
235 padic_ctx_clear(ctx);
236 }
237
238 FLINT_TEST_CLEANUP(state);
239
240 flint_printf("PASS\n");
241 return EXIT_SUCCESS;
242 }
243
244