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