arb/acb_dirichlet/test/t-l_vec_hurwitz.c

119 lines
3.5 KiB
C
Raw Normal View History

/*
Copyright (C) 2016 Pascal Molin
Copyright (C) 2016 Fredrik Johansson
This file is part of Arb.
Arb is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See <http://www.gnu.org/licenses/>.
*/
#include "acb_dirichlet.h"
int main()
{
slong iter;
flint_rand_t state;
flint_printf("l_vec_hurwitz....");
fflush(stdout);
flint_randinit(state);
for (iter = 0; iter < 100 * arb_test_multiplier(); iter++)
{
ulong i, q;
slong prec;
dirichlet_group_t G;
dirichlet_char_t chi;
acb_t s, z;
acb_ptr v;
acb_dirichlet_hurwitz_precomp_t pre;
prec = 50 + n_randint(state, 50);
q = 1 + n_randint(state, 50);
dirichlet_group_init(G, q);
dirichlet_char_init(chi, G);
acb_init(s);
acb_one(s);
acb_div_si(s, s, 2, prec);
v = _acb_vec_init(G->phi_q);
if (n_randint(state, 2))
{
2018-02-11 00:21:58 +01:00
ulong A, K, N;
acb_dirichlet_hurwitz_precomp_choose_param(&A, &K, &N, s, G->phi_q, prec);
acb_dirichlet_hurwitz_precomp_init(pre, s, acb_is_one(s), A, K, N, prec);
}
else
{
acb_dirichlet_hurwitz_precomp_init_num(pre, s, acb_is_one(s), G->phi_q, prec);
}
/* all at once */
if (n_randint(state, 2))
acb_dirichlet_l_vec_hurwitz(v, s, pre, G, prec);
else
acb_dirichlet_l_vec_hurwitz(v, s, NULL, G, prec);
/* check with complete loop */
i = 0;
acb_init(z);
dirichlet_char_one(chi, G);
do {
2018-02-11 00:21:58 +01:00
if (n_randint(state, 2))
acb_dirichlet_l_hurwitz(z, s, pre, G, chi, prec);
else
acb_dirichlet_l_hurwitz(z, s, NULL, G, chi, prec);
if (!acb_overlaps(z, v + i))
{
flint_printf("\n L value differ");
flint_printf("\nL(1/2, %wu) single = ", chi->n);
acb_printd(z, 20);
flint_printf("\nL(1/2, %wu) multi = ", chi->n);
acb_printd(v + i, 20);
flint_printf("\n\n");
acb_vec_printd(v, G->phi_q, 10);
flint_printf("\n\n");
abort();
}
else if (acb_rel_accuracy_bits(z) < prec - 8
|| acb_rel_accuracy_bits(v + i) < prec - 8)
{
flint_printf("FAIL\n\n");
flint_printf("q = %wu\n", q);
flint_printf("\nL(1/2,chi_%wu(%wu,)) inaccurate\n", q, chi->n);
flint_printf("\nsingle =\n");
acb_printd(z, 30);
flint_printf("\ndft =\n");
acb_printd(v + i, 30);
flint_printf("\nerrors %ld & %ld [prec = %wu]\n",
acb_rel_accuracy_bits(z),
acb_rel_accuracy_bits(v + i), prec);
abort();
}
i++;
} while (dirichlet_char_next(chi, G) >= 0);
acb_clear(s);
_acb_vec_clear(v, G->phi_q);
dirichlet_char_clear(chi);
dirichlet_group_clear(G);
acb_dirichlet_hurwitz_precomp_clear(pre);
}
flint_randclear(state);
flint_cleanup();
flint_printf("PASS\n");
return EXIT_SUCCESS;
}