1 /*
2     Copyright (C) 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 <stdio.h>
13 
14 #include "qadic.h"
15 #include "ulong_extras.h"
16 
17 int
main(void)18 main(void)
19 {
20     int i, result;
21     FLINT_TEST_INIT(state);
22 
23     flint_printf("exp_balanced... ");
24     fflush(stdout);
25 
26 
27 
28     /* Check aliasing */
29     for (i = 0; i < 100 * flint_test_multiplier(); i++)
30     {
31         fmpz_t p;
32         slong d, N;
33         qadic_ctx_t ctx;
34 
35         qadic_t a, b, c;
36         int ans1, ans2;
37 
38         fmpz_init_set_ui(p, n_randprime(state, 2 + n_randint(state, 3), 1));
39         d = n_randint(state, 10) + 1;
40         N = n_randint(state, 50) + 1;
41         qadic_ctx_init_conway(ctx, p, d, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), "a", PADIC_SERIES);
42 
43         qadic_init2(a, N);
44         qadic_init2(b, N);
45         qadic_init2(c, N);
46 
47         qadic_randtest(a, state, ctx);
48         qadic_set(b, a, ctx);
49 
50         ans1 = qadic_exp_balanced(c, b, ctx);
51         ans2 = qadic_exp_balanced(b, b, ctx);
52 
53         result = ((ans1 == ans2) && (!ans1 || qadic_equal(b, c)));
54         if (!result)
55         {
56             flint_printf("FAIL (alias):\n\n");
57             flint_printf("a = "), qadic_print_pretty(a, ctx), flint_printf("\n");
58             flint_printf("b = "), qadic_print_pretty(b, ctx), flint_printf("\n");
59             flint_printf("c = "), qadic_print_pretty(c, ctx), flint_printf("\n");
60             flint_printf("ans1 = %d\n", ans1);
61             flint_printf("ans2 = %d\n", ans2);
62             abort();
63         }
64 
65         qadic_clear(a);
66         qadic_clear(b);
67         qadic_clear(c);
68 
69         fmpz_clear(p);
70         qadic_ctx_clear(ctx);
71     }
72 
73     /* Functional equation: exp(a + b) == exp(a) exp(b) */
74     for (i = 0; i < 100 * flint_test_multiplier(); i++)
75     {
76         fmpz_t p;
77         slong deg, N;
78         qadic_ctx_t ctx;
79 
80         qadic_t a, b, c, d, e, f, g;
81         int ans1, ans2, ans3;
82 
83         fmpz_init_set_ui(p, n_randprime(state, 2 + n_randint(state, 3), 1));
84         deg = n_randint(state, 10) + 1;
85         N   = n_randint(state, 50) + 1;
86         qadic_ctx_init_conway(ctx, p, deg, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), "a", PADIC_SERIES);
87 
88         qadic_init2(a, N);
89         qadic_init2(b, N);
90         qadic_init2(c, N);
91         qadic_init2(d, N);
92         qadic_init2(e, N);
93         qadic_init2(f, N);
94         qadic_init2(g, N);
95 
96         qadic_randtest(a, state, ctx);
97         qadic_randtest(b, state, ctx);
98         qadic_add(c, a, b, ctx);
99 
100         ans1 = qadic_exp_balanced(d, a, ctx);
101         ans2 = qadic_exp_balanced(e, b, ctx);
102         qadic_mul(f, d, e, ctx);
103 
104         ans3 = qadic_exp_balanced(g, c, ctx);
105 
106         result = (!ans1 || !ans2 || (ans3 && qadic_equal(f, g)));
107         if (!result)
108         {
109             flint_printf("FAIL (functional equation):\n\n");
110             flint_printf("a                 = "), qadic_print_pretty(a, ctx), flint_printf("\n");
111             flint_printf("b                 = "), qadic_print_pretty(b, ctx), flint_printf("\n");
112             flint_printf("c = a + b         = "), qadic_print_pretty(c, ctx), flint_printf("\n");
113             flint_printf("d = exp(a)        = "), qadic_print_pretty(d, ctx), flint_printf("\n");
114             flint_printf("e = exp(b)        = "), qadic_print_pretty(e, ctx), flint_printf("\n");
115             flint_printf("f = exp(a) exp(b) = "), qadic_print_pretty(f, ctx), flint_printf("\n");
116             flint_printf("g = exp(a + b)    = "), qadic_print_pretty(g, ctx), flint_printf("\n");
117             abort();
118         }
119 
120         qadic_clear(a);
121         qadic_clear(b);
122         qadic_clear(c);
123         qadic_clear(d);
124         qadic_clear(e);
125         qadic_clear(f);
126         qadic_clear(g);
127 
128         fmpz_clear(p);
129         qadic_ctx_clear(ctx);
130     }
131 
132     FLINT_TEST_CLEANUP(state);
133 
134     flint_printf("PASS\n");
135     return EXIT_SUCCESS;
136 }
137 
138