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