diff --git a/Makefile.in b/Makefile.in index 7a0398cc..ad6ef5cc 100644 --- a/Makefile.in +++ b/Makefile.in @@ -13,7 +13,7 @@ QUIET_AR = @echo ' ' AR ' ' $@; AT=@ BUILD_DIRS = fmpr arf mag arb arb_mat arb_poly arb_calc acb acb_mat acb_poly \ - acb_calc acb_hypgeom acb_modular acb_dft acb_dirichlet arb_hypgeom bernoulli hypgeom \ + acb_calc acb_hypgeom acb_modular dirichlet acb_dft acb_dirichlet arb_hypgeom bernoulli hypgeom \ fmpz_extras bool_mat partitions dlog \ $(EXTRA_BUILD_DIRS) diff --git a/acb_dirichlet.h b/acb_dirichlet.h index cd825720..8785a1ab 100644 --- a/acb_dirichlet.h +++ b/acb_dirichlet.h @@ -21,7 +21,7 @@ #endif #include "acb.h" -#include "dlog.h" +#include "dirichlet.h" #ifdef __cplusplus extern "C" { @@ -32,205 +32,8 @@ void _acb_dirichlet_euler_product_real_ui(arb_t res, ulong s, void acb_dirichlet_eta(acb_t res, const acb_t s, slong prec); -/* should this dlog pointer be in the prime or the global group? */ -typedef struct -{ - ulong p; /* underlying prime */ - int e; /* exponent */ - nmod_t pe; /* modulus */ - ulong phi; /* phi(p^e) */ - ulong g; /* conrey generator */ - dlog_precomp_struct * dlog; /* precomputed data for discrete log mod p^e */ -} -acb_dirichlet_prime_group_struct; - -typedef struct -{ - ulong q; /* modulus */ - ulong q_even; /* even part of modulus */ - nmod_t mod; /* modulus with precomputed inverse */ - ulong rad_q; /* radical = product of odd primes */ - ulong phi_q; /* phi(q) = group size */ - slong neven; /* number of even components (in 0,1,2)*/ - slong num; /* number of prime components (even + odd) */ - ulong expo; /* exponent = largest order in G */ - acb_dirichlet_prime_group_struct * P; - ulong * generators; /* generators lifted mod q */ - ulong * PHI; /* PHI(k) = expo / phi(k) */ -} -acb_dirichlet_group_struct; - -typedef acb_dirichlet_group_struct acb_dirichlet_group_t[1]; - -ACB_DIRICHLET_INLINE ulong -acb_dirichlet_group_size(const acb_dirichlet_group_t G) -{ - return G->phi_q; -} - -void acb_dirichlet_group_init(acb_dirichlet_group_t G, ulong q); -void acb_dirichlet_subgroup_init(acb_dirichlet_group_t H, const acb_dirichlet_group_t G, ulong h); -void acb_dirichlet_group_clear(acb_dirichlet_group_t G); -void acb_dirichlet_group_dlog_precompute(acb_dirichlet_group_t G, ulong num); -void acb_dirichlet_group_dlog_clear(acb_dirichlet_group_t G); - -/* properties of elements without log */ - -ulong acb_dirichlet_number_primitive(const acb_dirichlet_group_t G); -ulong acb_dirichlet_ui_conductor(const acb_dirichlet_group_t G, ulong a); -int acb_dirichlet_ui_parity(const acb_dirichlet_group_t G, ulong a); -ulong acb_dirichlet_ui_order(const acb_dirichlet_group_t G, ulong a); - -/* elements of the group, keep both number and log */ -typedef struct -{ - ulong n; /* number */ - ulong * log; /* s.t. prod generators[k]^log[k] = number */ -} -acb_dirichlet_conrey_struct; - -typedef acb_dirichlet_conrey_struct acb_dirichlet_conrey_t[1]; - -void acb_dirichlet_conrey_init(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G); -void acb_dirichlet_conrey_clear(acb_dirichlet_conrey_t x); -void acb_dirichlet_conrey_print(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x); - -ACB_DIRICHLET_INLINE void -acb_dirichlet_conrey_set(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t y) -{ - slong k; - x->n = y->n; - for (k = 0; k < G->num; k++) - x->log[k] = y->log[k]; -} - -ACB_DIRICHLET_INLINE int -acb_dirichlet_conrey_eq(const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y) -{ - return (x->n == y->n); -} - -int acb_dirichlet_conrey_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y); -int acb_dirichlet_conrey_parity(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x); -ulong acb_dirichlet_conrey_conductor(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x); -ulong acb_dirichlet_conrey_order(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x); - -void acb_dirichlet_conrey_log(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong m); -ulong acb_dirichlet_conrey_exp(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G); - -void acb_dirichlet_conrey_index(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong j); -ulong acb_dirichlet_index_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x); - -void acb_dirichlet_conrey_one(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G); -void acb_dirichlet_conrey_first_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G); - -int acb_dirichlet_conrey_next(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G); -int acb_dirichlet_conrey_next_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G); - -void acb_dirichlet_conrey_mul(acb_dirichlet_conrey_t c, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, const acb_dirichlet_conrey_t b); -void acb_dirichlet_conrey_pow(acb_dirichlet_conrey_t c, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, ulong n); -void acb_dirichlet_conrey_primitive(acb_dirichlet_conrey_t y, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x, ulong cond); - -#define ACB_DIRICHLET_CHI_NULL UWORD_MAX - -ulong acb_dirichlet_ui_pairing_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, const acb_dirichlet_conrey_t b); -ulong acb_dirichlet_ui_pairing(const acb_dirichlet_group_t G, ulong m, ulong n); - -void acb_dirichlet_pairing_conrey(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, const acb_dirichlet_conrey_t b, slong prec); -void acb_dirichlet_pairing(acb_t res, const acb_dirichlet_group_t G, ulong m, ulong n, slong prec); - -/* introducing character type */ - -/* character = reduced exponents, keep order, number and conductor */ -typedef struct -{ - ulong q; /* modulus */ - nmod_t order; /* order */ - acb_dirichlet_conrey_t x; - ulong * expo; /* reduced exponents ( log[k] * PHI[k] / gcd( ) ) */ - int parity; /* 0 for even char, 1 for odd */ - ulong conductor; -} -acb_dirichlet_char_struct; - -typedef acb_dirichlet_char_struct acb_dirichlet_char_t[1]; - -ACB_DIRICHLET_INLINE ulong -acb_dirichlet_char_order(const acb_dirichlet_char_t chi) -{ - return chi->order.n; -} - -ACB_DIRICHLET_INLINE ulong -acb_dirichlet_char_conductor(const acb_dirichlet_char_t chi) -{ - return chi->conductor; -} - -ACB_DIRICHLET_INLINE int -acb_dirichlet_char_parity(const acb_dirichlet_char_t chi) -{ - return chi->parity; -} - -void acb_dirichlet_char_init(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); -void acb_dirichlet_char_clear(acb_dirichlet_char_t chi); -void acb_dirichlet_char_print(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi); - -ACB_DIRICHLET_INLINE void -acb_dirichlet_char_set(acb_dirichlet_char_t chi1, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi2) -{ - slong k; - - chi1->q = chi2->q; - chi1->conductor = chi2->conductor; - chi1->order = chi2->order; - chi1->parity = chi2->parity; - acb_dirichlet_conrey_set(chi1->x, G, chi2->x); - for (k = 0; k < G->num; k++) - chi1->expo[k] = chi2->expo[k]; -} - -ACB_DIRICHLET_INLINE int -acb_dirichlet_char_eq(const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2) -{ - return (chi1->q == chi2->q && chi1->x->n == chi2->x->n); -} - -int acb_dirichlet_char_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2); -ACB_DIRICHLET_INLINE int -acb_dirichlet_char_is_principal(const acb_dirichlet_char_t chi) -{ - return (chi->x->n == 1); -} -ACB_DIRICHLET_INLINE int -acb_dirichlet_char_is_real(const acb_dirichlet_char_t chi) -{ - return (chi->order.n <= 2); -} - -void acb_dirichlet_char(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G, ulong n); -void acb_dirichlet_char_conrey(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x); -void acb_dirichlet_char_set_expo(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); -void acb_dirichlet_char_normalize(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); -void acb_dirichlet_char_denormalize(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); - -void acb_dirichlet_char_mul(acb_dirichlet_char_t chi12, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2); -void acb_dirichlet_char_primitive(acb_dirichlet_char_t chi0, const acb_dirichlet_group_t G0, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi); - -void acb_dirichlet_char_one(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); -void acb_dirichlet_char_first_primitive(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); - -int acb_dirichlet_char_next(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); -int acb_dirichlet_char_next_primitive(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G); - -ulong acb_dirichlet_ui_chi_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const acb_dirichlet_conrey_t x); -ulong acb_dirichlet_ui_chi(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, ulong n); - -void acb_dirichlet_ui_vec_set_null(ulong *v, const acb_dirichlet_group_t G, slong nv); -void acb_dirichlet_ui_chi_vec_loop(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv); -void acb_dirichlet_ui_chi_vec_primeloop(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv); -void acb_dirichlet_ui_chi_vec(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv); +void acb_dirichlet_pairing_conrey(acb_t res, const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b, slong prec); +void acb_dirichlet_pairing(acb_t res, const dirichlet_group_t G, ulong m, ulong n, slong prec); /* precompute powers of a root of unity */ typedef struct @@ -250,8 +53,8 @@ void acb_dirichlet_powers_init(acb_dirichlet_powers_t t, ulong order, slong num, void acb_dirichlet_powers_clear(acb_dirichlet_powers_t t); void acb_dirichlet_power(acb_t z, const acb_dirichlet_powers_t t, ulong n, slong prec); -void acb_dirichlet_chi(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, ulong n, slong prec); -void acb_dirichlet_chi_vec(acb_ptr v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv, slong prec); +void acb_dirichlet_chi(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, ulong n, slong prec); +void acb_dirichlet_chi_vec(acb_ptr v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv, slong prec); void acb_dirichlet_arb_quadratic_powers(arb_ptr v, slong nv, const arb_t x, slong prec); void acb_dirichlet_qseries_arb(acb_t res, acb_srcptr a, const arb_t x, slong len, slong prec); @@ -263,34 +66,34 @@ ulong acb_dirichlet_theta_length(ulong q, const arb_t x, slong prec); void mag_tail_kexpk2_arb(mag_t res, const arb_t a, ulong n); void _acb_dirichlet_theta_argument_at_arb(arb_t xt, ulong q, const arb_t t, slong prec); -void acb_dirichlet_theta_arb(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const arb_t t, slong prec); -void acb_dirichlet_ui_theta_arb(acb_t res, const acb_dirichlet_group_t G, ulong a, const arb_t t, slong prec); +void acb_dirichlet_theta_arb(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, const arb_t t, slong prec); +void acb_dirichlet_ui_theta_arb(acb_t res, const dirichlet_group_t G, ulong a, const arb_t t, slong prec); -void acb_dirichlet_gauss_sum_naive(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); -void acb_dirichlet_gauss_sum_factor(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); -void acb_dirichlet_gauss_sum_order2(acb_t res, const acb_dirichlet_char_t chi, slong prec); -void acb_dirichlet_gauss_sum_theta(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); -void acb_dirichlet_gauss_sum(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); +void acb_dirichlet_gauss_sum_naive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); +void acb_dirichlet_gauss_sum_factor(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); +void acb_dirichlet_gauss_sum_order2(acb_t res, const dirichlet_char_t chi, slong prec); +void acb_dirichlet_gauss_sum_theta(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); +void acb_dirichlet_gauss_sum(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); -void acb_dirichlet_root_number_theta(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); -void acb_dirichlet_root_number(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); +void acb_dirichlet_root_number_theta(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); +void acb_dirichlet_root_number(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); void acb_dirichlet_si_poly_evaluate(acb_t res, slong * v, slong len, const acb_t z, slong prec); -void acb_dirichlet_jacobi_sum_naive(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec); +void acb_dirichlet_jacobi_sum_naive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec); ulong jacobi_one_prime(ulong p, ulong e, ulong pe, ulong cond); -void acb_dirichlet_jacobi_sum_factor(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec); -void acb_dirichlet_jacobi_sum_gauss(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec); -void acb_dirichlet_jacobi_sum(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec); -void acb_dirichlet_jacobi_sum_ui(acb_t res, const acb_dirichlet_group_t G, ulong a, ulong b, slong prec); +void acb_dirichlet_jacobi_sum_factor(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec); +void acb_dirichlet_jacobi_sum_gauss(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec); +void acb_dirichlet_jacobi_sum(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec); +void acb_dirichlet_jacobi_sum_ui(acb_t res, const dirichlet_group_t G, ulong a, ulong b, slong prec); -void acb_dirichlet_l_hurwitz(acb_t res, const acb_t s, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec); -void acb_dirichlet_l_vec_hurwitz(acb_ptr res, const acb_t s, const acb_dirichlet_group_t G, slong prec); +void acb_dirichlet_l_hurwitz(acb_t res, const acb_t s, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec); +void acb_dirichlet_l_vec_hurwitz(acb_ptr res, const acb_t s, const dirichlet_group_t G, slong prec); /* Discrete Fourier Transform */ -void acb_dirichlet_dft_conrey(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, slong prec); -void acb_dirichlet_dft(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, slong prec); +void acb_dirichlet_dft_conrey(acb_ptr w, acb_srcptr v, const dirichlet_group_t G, slong prec); +void acb_dirichlet_dft(acb_ptr w, acb_srcptr v, const dirichlet_group_t G, slong prec); /* utils */ diff --git a/acb_dirichlet/char_mul.c b/acb_dirichlet/char_mul.c deleted file mode 100644 index c05c1cc1..00000000 --- a/acb_dirichlet/char_mul.c +++ /dev/null @@ -1,19 +0,0 @@ -/* - Copyright (C) 2016 Pascal Molin - - 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 . -*/ - -#include "acb_dirichlet.h" - -void -acb_dirichlet_char_mul(acb_dirichlet_char_t chi12, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2) -{ - acb_dirichlet_conrey_mul(chi12->x, G, chi1->x, chi2->x); - acb_dirichlet_char_conrey(chi12, G, NULL); -} diff --git a/acb_dirichlet/chi.c b/acb_dirichlet/chi.c index 56943bd5..e8b1d6b2 100644 --- a/acb_dirichlet/chi.c +++ b/acb_dirichlet/chi.c @@ -14,11 +14,11 @@ #include "acb_dirichlet.h" void -acb_dirichlet_chi(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, ulong n, slong prec) +acb_dirichlet_chi(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, ulong n, slong prec) { ulong expo; - expo = acb_dirichlet_ui_chi(G, chi, n); - if (expo == ACB_DIRICHLET_CHI_NULL) + expo = dirichlet_ui_chi(G, chi, n); + if (expo == DIRICHLET_CHI_NULL) acb_zero(res); else { diff --git a/acb_dirichlet/chi_vec.c b/acb_dirichlet/chi_vec.c index ccf12f89..f5f45b18 100644 --- a/acb_dirichlet/chi_vec.c +++ b/acb_dirichlet/chi_vec.c @@ -12,21 +12,21 @@ #include "acb_dirichlet.h" void -acb_dirichlet_chi_vec(acb_ptr v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv, slong prec) +acb_dirichlet_chi_vec(acb_ptr v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv, slong prec) { slong k; ulong * a; acb_dirichlet_powers_t t; a = flint_malloc(nv * sizeof(ulong)); - acb_dirichlet_ui_chi_vec(a, G, chi, nv); + dirichlet_ui_chi_vec(a, G, chi, nv); acb_dirichlet_powers_init(t, chi->order.n, nv, prec); acb_zero(v + 0); for (k = 0; k < nv; k++) { - if (a[k] != ACB_DIRICHLET_CHI_NULL) + if (a[k] != DIRICHLET_CHI_NULL) acb_dirichlet_power(v + k, t, a[k], prec); else acb_zero(v + k); diff --git a/acb_dirichlet/dft.c b/acb_dirichlet/dft.c index 945dc241..6537b010 100644 --- a/acb_dirichlet/dft.c +++ b/acb_dirichlet/dft.c @@ -14,7 +14,7 @@ /* dft, lexicographic conrey indexing, array size G->phi_q */ void -acb_dirichlet_dft_conrey(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, slong prec) +acb_dirichlet_dft_conrey(acb_ptr w, acb_srcptr v, const dirichlet_group_t G, slong prec) { slong k, l, * cyc; cyc = flint_malloc(G->num * sizeof(slong)); @@ -27,34 +27,34 @@ acb_dirichlet_dft_conrey(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, /* dft, number indexing, array size G->q */ void -acb_dirichlet_dft(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, slong prec) +acb_dirichlet_dft(acb_ptr w, acb_srcptr v, const dirichlet_group_t G, slong prec) { ulong i, len; acb_ptr t1, t2; - acb_dirichlet_conrey_t x; + dirichlet_conrey_t x; len = G->phi_q; t1 = flint_malloc(len * sizeof(acb_struct)); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_init(x, G); + dirichlet_conrey_one(x, G); for (i = 0; i < len; i++) { t1[i] = v[x->n]; - acb_dirichlet_conrey_next(x, G); + dirichlet_conrey_next(x, G); }; t2 = _acb_vec_init(len); acb_dirichlet_dft_conrey(t2, t1, G, prec); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); for (i = 0; i < len; i++) { acb_set(w + x->n, t2 + i); - acb_dirichlet_conrey_next(x, G); + dirichlet_conrey_next(x, G); }; _acb_vec_clear(t2, len); - acb_dirichlet_conrey_clear(x); + dirichlet_conrey_clear(x); flint_free(t1); } diff --git a/acb_dirichlet/gauss_sum.c b/acb_dirichlet/gauss_sum.c index e2a70dc7..3b8447ff 100644 --- a/acb_dirichlet/gauss_sum.c +++ b/acb_dirichlet/gauss_sum.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" static void -gauss_sum_non_primitive(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +gauss_sum_non_primitive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { slong k, mu = 1; @@ -52,13 +52,13 @@ gauss_sum_non_primitive(acb_t res, const acb_dirichlet_group_t G, const acb_diri else { - acb_dirichlet_group_t G0; - acb_dirichlet_char_t chi0; + dirichlet_group_t G0; + dirichlet_char_t chi0; acb_t z; - acb_dirichlet_subgroup_init(G0, G, chi->conductor); - acb_dirichlet_char_init(chi0, G); - acb_dirichlet_char_primitive(chi0, G0, G, chi); + dirichlet_subgroup_init(G0, G, chi->conductor); + dirichlet_char_init(chi0, G); + dirichlet_char_primitive(chi0, G0, G, chi); acb_init(z); acb_dirichlet_gauss_sum(z, G0, chi0, prec); @@ -68,14 +68,14 @@ gauss_sum_non_primitive(acb_t res, const acb_dirichlet_group_t G, const acb_diri acb_mul(res, res, z, prec); acb_mul_si(res, res, mu, prec); - acb_dirichlet_group_clear(G0); - acb_dirichlet_char_clear(chi0); + dirichlet_group_clear(G0); + dirichlet_char_clear(chi0); acb_clear(z); } } void -acb_dirichlet_gauss_sum(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_gauss_sum(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { /* TODO: no need, factor also does it... */ if (chi->conductor != G->q) @@ -100,11 +100,11 @@ acb_dirichlet_gauss_sum(acb_t res, const acb_dirichlet_group_t G, const acb_diri } void -acb_dirichlet_gauss_sum_ui(acb_t res, const acb_dirichlet_group_t G, ulong a, slong prec) +acb_dirichlet_gauss_sum_ui(acb_t res, const dirichlet_group_t G, ulong a, slong prec) { - acb_dirichlet_char_t chi; - acb_dirichlet_char_init(chi, G); - acb_dirichlet_char(chi, G, a); + dirichlet_char_t chi; + dirichlet_char_init(chi, G); + dirichlet_char(chi, G, a); acb_dirichlet_gauss_sum(res, G, chi, prec); - acb_dirichlet_char_clear(chi); + dirichlet_char_clear(chi); } diff --git a/acb_dirichlet/gauss_sum_factor.c b/acb_dirichlet/gauss_sum_factor.c index b00002b5..29fa0a32 100644 --- a/acb_dirichlet/gauss_sum_factor.c +++ b/acb_dirichlet/gauss_sum_factor.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_gauss_sum_factor(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_gauss_sum_factor(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { slong k; @@ -36,11 +36,11 @@ acb_dirichlet_gauss_sum_factor(acb_t res, const acb_dirichlet_group_t G, const a for (k = (G->neven == 2); k < G->num; k++) { ulong pe = G->P[k].pe.n; - acb_dirichlet_group_t Gp; - acb_dirichlet_char_t chip; + dirichlet_group_t Gp; + dirichlet_char_t chip; - acb_dirichlet_subgroup_init(Gp, G, pe); - acb_dirichlet_char_init(chip, Gp); + dirichlet_subgroup_init(Gp, G, pe); + dirichlet_char_init(chip, Gp); chip->x->n = chi->x->n % pe; @@ -52,7 +52,7 @@ acb_dirichlet_gauss_sum_factor(acb_t res, const acb_dirichlet_group_t G, const a else chip->x->log[0] = chi->x->log[k]; - acb_dirichlet_char_conrey(chip, Gp, NULL); + dirichlet_char_conrey(chip, Gp, NULL); /* chi_pe(a, q/pe) * G_pe(a) */ acb_dirichlet_gauss_sum(tmp, Gp, chip, prec); @@ -61,8 +61,8 @@ acb_dirichlet_gauss_sum_factor(acb_t res, const acb_dirichlet_group_t G, const a acb_dirichlet_chi(tmp, Gp, chip, (G->q / pe) % pe, prec); acb_mul(res, res, tmp, prec); - acb_dirichlet_char_clear(chip); - acb_dirichlet_group_clear(Gp); + dirichlet_char_clear(chip); + dirichlet_group_clear(Gp); } if (G->q_even == 2) diff --git a/acb_dirichlet/gauss_sum_naive.c b/acb_dirichlet/gauss_sum_naive.c index 7cea0ab7..89d477cf 100644 --- a/acb_dirichlet/gauss_sum_naive.c +++ b/acb_dirichlet/gauss_sum_naive.c @@ -13,7 +13,7 @@ #include "acb_poly.h" void -acb_dirichlet_gauss_sum_naive(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_gauss_sum_naive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { acb_t z; acb_ptr v; diff --git a/acb_dirichlet/gauss_sum_order2.c b/acb_dirichlet/gauss_sum_order2.c index 50b7b114..39fed38b 100644 --- a/acb_dirichlet/gauss_sum_order2.c +++ b/acb_dirichlet/gauss_sum_order2.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_gauss_sum_order2(acb_t res, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_gauss_sum_order2(acb_t res, const dirichlet_char_t chi, slong prec) { if (chi->parity) { diff --git a/acb_dirichlet/gauss_sum_theta.c b/acb_dirichlet/gauss_sum_theta.c index d46945c9..ab97f384 100644 --- a/acb_dirichlet/gauss_sum_theta.c +++ b/acb_dirichlet/gauss_sum_theta.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_gauss_sum_theta(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_gauss_sum_theta(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { if (chi->conductor < G->q || (G->q == 300 && (chi->x->n == 71 || chi->x->n == 131)) || (G->q == 600 && (chi->x->n == 11 || chi->x->n == 491))) diff --git a/acb_dirichlet/jacobi_sum.c b/acb_dirichlet/jacobi_sum.c index d37ef326..ab67d3c4 100644 --- a/acb_dirichlet/jacobi_sum.c +++ b/acb_dirichlet/jacobi_sum.c @@ -30,7 +30,7 @@ jacobi_one_prime(ulong p, ulong e, ulong pe, ulong cond) } static ulong -jacobi_one(const acb_dirichlet_group_t G, ulong cond) +jacobi_one(const dirichlet_group_t G, ulong cond) { slong k, r = 1; @@ -41,7 +41,7 @@ jacobi_one(const acb_dirichlet_group_t G, ulong cond) } void -acb_dirichlet_jacobi_sum(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec) +acb_dirichlet_jacobi_sum(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec) { if (G->q_even > 1) { @@ -75,7 +75,7 @@ acb_dirichlet_jacobi_sum(acb_t res, const acb_dirichlet_group_t G, const acb_dir } void -acb_dirichlet_jacobi_sum_ui(acb_t res, const acb_dirichlet_group_t G, ulong a, ulong b, slong prec) +acb_dirichlet_jacobi_sum_ui(acb_t res, const dirichlet_group_t G, ulong a, ulong b, slong prec) { if (G->q_even > 1) { @@ -83,27 +83,27 @@ acb_dirichlet_jacobi_sum_ui(acb_t res, const acb_dirichlet_group_t G, ulong a, u } else if (a == 1 || b == 1) { - ulong cond = (a == 1) ? acb_dirichlet_ui_conductor(G, b) : acb_dirichlet_ui_conductor(G, a); + ulong cond = (a == 1) ? dirichlet_ui_conductor(G, b) : dirichlet_ui_conductor(G, a); acb_set_si(res, jacobi_one(G, cond)); } else if (nmod_mul(a, b, G->mod) == 1) { ulong n; - n = jacobi_one(G, acb_dirichlet_ui_conductor(G, a)); - if (acb_dirichlet_ui_parity(G, a)) + n = jacobi_one(G, dirichlet_ui_conductor(G, a)); + if (dirichlet_ui_parity(G, a)) acb_set_si(res, -n); else acb_set_si(res, n); } else { - acb_dirichlet_char_t chi1, chi2; - acb_dirichlet_char_init(chi1, G); - acb_dirichlet_char_init(chi2, G); - acb_dirichlet_char(chi1, G, a); - acb_dirichlet_char(chi2, G, b); + dirichlet_char_t chi1, chi2; + dirichlet_char_init(chi1, G); + dirichlet_char_init(chi2, G); + dirichlet_char(chi1, G, a); + dirichlet_char(chi2, G, b); acb_dirichlet_jacobi_sum(res, G, chi1, chi2, prec); - acb_dirichlet_char_clear(chi1); - acb_dirichlet_char_clear(chi2); + dirichlet_char_clear(chi1); + dirichlet_char_clear(chi2); } } diff --git a/acb_dirichlet/jacobi_sum_factor.c b/acb_dirichlet/jacobi_sum_factor.c index 37934aed..ddecf60a 100644 --- a/acb_dirichlet/jacobi_sum_factor.c +++ b/acb_dirichlet/jacobi_sum_factor.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_jacobi_sum_factor(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec) +acb_dirichlet_jacobi_sum_factor(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec) { slong k; acb_t tmp; @@ -47,20 +47,20 @@ acb_dirichlet_jacobi_sum_factor(acb_t res, const acb_dirichlet_group_t G, const } else { - acb_dirichlet_group_t Gp; - acb_dirichlet_char_t chi1p, chi2p; + dirichlet_group_t Gp; + dirichlet_char_t chi1p, chi2p; - acb_dirichlet_group_init(Gp, pe.n); - acb_dirichlet_char_init(chi1p, Gp); - acb_dirichlet_char_init(chi2p, Gp); + dirichlet_group_init(Gp, pe.n); + dirichlet_char_init(chi1p, Gp); + dirichlet_char_init(chi2p, Gp); chi1p->x->n = ap; chi1p->x->log[0] = chi1->x->log[k]; chi2p->x->n = ap; chi2p->x->log[0] = chi2->x->log[k]; - acb_dirichlet_char_conrey(chi1p, Gp, NULL); - acb_dirichlet_char_conrey(chi2p, Gp, NULL); + dirichlet_char_conrey(chi1p, Gp, NULL); + dirichlet_char_conrey(chi2p, Gp, NULL); /* TODO: work out gauss relations for e > 1 */ if (p <= 100 || e > 1) @@ -70,9 +70,9 @@ acb_dirichlet_jacobi_sum_factor(acb_t res, const acb_dirichlet_group_t G, const acb_mul(res, res, tmp, prec); - acb_dirichlet_char_clear(chi1p); - acb_dirichlet_char_clear(chi2p); - acb_dirichlet_group_clear(Gp); + dirichlet_char_clear(chi1p); + dirichlet_char_clear(chi2p); + dirichlet_group_clear(Gp); } } acb_clear(tmp); diff --git a/acb_dirichlet/jacobi_sum_gauss.c b/acb_dirichlet/jacobi_sum_gauss.c index 9ff6ac86..5d825ec6 100644 --- a/acb_dirichlet/jacobi_sum_gauss.c +++ b/acb_dirichlet/jacobi_sum_gauss.c @@ -13,14 +13,14 @@ /* should use only for prime power modulus */ void -acb_dirichlet_jacobi_sum_gauss(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec) +acb_dirichlet_jacobi_sum_gauss(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec) { /* J_q(a,b)G_q(ab) = G_q(a)G_q(b) */ acb_t tmp; - acb_dirichlet_char_t chi12; + dirichlet_char_t chi12; - acb_dirichlet_char_init(chi12, G); - acb_dirichlet_char_mul(chi12, G, chi1, chi2); + dirichlet_char_init(chi12, G); + dirichlet_char_mul(chi12, G, chi1, chi2); acb_init(tmp); @@ -33,6 +33,6 @@ acb_dirichlet_jacobi_sum_gauss(acb_t res, const acb_dirichlet_group_t G, const a acb_dirichlet_gauss_sum(tmp, G, chi12, prec); acb_div(res, res, tmp, prec); - acb_dirichlet_char_clear(chi12); + dirichlet_char_clear(chi12); acb_clear(tmp); } diff --git a/acb_dirichlet/jacobi_sum_naive.c b/acb_dirichlet/jacobi_sum_naive.c index 359a478e..5541e6f6 100644 --- a/acb_dirichlet/jacobi_sum_naive.c +++ b/acb_dirichlet/jacobi_sum_naive.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_jacobi_sum_naive(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2, slong prec) +acb_dirichlet_jacobi_sum_naive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2, slong prec) { ulong k1, k2, m1, m2, g, e; @@ -24,11 +24,11 @@ acb_dirichlet_jacobi_sum_naive(acb_t res, const acb_dirichlet_group_t G, const a v1 = flint_malloc(G->q * sizeof(ulong)); v2 = flint_malloc(G->q * sizeof(ulong)); - acb_dirichlet_ui_vec_set_null(v1, G, G->q); - acb_dirichlet_ui_chi_vec_loop(v1, G, chi1, G->q); + dirichlet_ui_vec_set_null(v1, G, G->q); + dirichlet_ui_chi_vec_loop(v1, G, chi1, G->q); - acb_dirichlet_ui_vec_set_null(v2, G, G->q); - acb_dirichlet_ui_chi_vec_loop(v2, G, chi2, G->q); + dirichlet_ui_vec_set_null(v2, G, G->q); + dirichlet_ui_chi_vec_loop(v2, G, chi2, G->q); m1 = chi1->order.n; m2 = chi2->order.n; @@ -44,8 +44,8 @@ acb_dirichlet_jacobi_sum_naive(acb_t res, const acb_dirichlet_group_t G, const a for (k1 = 2, k2 = G->q - 1; k2 > 1; k1++, k2--) { - if (v1[k1] == ACB_DIRICHLET_CHI_NULL || - v2[k2] == ACB_DIRICHLET_CHI_NULL) + if (v1[k1] == DIRICHLET_CHI_NULL || + v2[k2] == DIRICHLET_CHI_NULL) continue; e = nmod_add(v1[k1] * m1, v2[k2] * m2, order); v[e]++; diff --git a/acb_dirichlet/l_hurwitz.c b/acb_dirichlet/l_hurwitz.c index ec15e7ff..f219e6e8 100644 --- a/acb_dirichlet/l_hurwitz.c +++ b/acb_dirichlet/l_hurwitz.c @@ -16,12 +16,12 @@ /* todo: should document or fix that it doesn't allow aliasing */ void acb_dirichlet_l_hurwitz(acb_t res, const acb_t s, - const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) + const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { ulong chin; acb_t t, u, a; acb_ptr z; - acb_dirichlet_conrey_t cn; + dirichlet_conrey_t cn; int deflate; /* remove pole in Hurwitz zeta at s = 1 */ @@ -37,12 +37,12 @@ acb_dirichlet_l_hurwitz(acb_t res, const acb_t s, deflate = 1; } - acb_dirichlet_conrey_init(cn, G); + dirichlet_conrey_init(cn, G); acb_init(t); acb_init(u); acb_init(a); - acb_dirichlet_conrey_one(cn, G); + dirichlet_conrey_one(cn, G); acb_zero(t); prec += n_clog(G->phi_q, 2); @@ -51,7 +51,7 @@ acb_dirichlet_l_hurwitz(acb_t res, const acb_t s, _acb_vec_nth_roots(z, chi->order.n, prec); do { - chin = acb_dirichlet_ui_chi_conrey(G, chi, cn); + chin = dirichlet_ui_chi_conrey(G, chi, cn); acb_set_ui(a, cn->n); acb_div_ui(a, a, G->q, prec); @@ -63,14 +63,14 @@ acb_dirichlet_l_hurwitz(acb_t res, const acb_t s, acb_addmul(t, z + chin, u, prec); - } while (acb_dirichlet_conrey_next(cn, G) >= 0); + } while (dirichlet_conrey_next(cn, G) >= 0); acb_set_ui(u, G->q); acb_neg(a, s); acb_pow(u, u, a, prec); acb_mul(res, t, u, prec); - acb_dirichlet_conrey_clear(cn); + dirichlet_conrey_clear(cn); _acb_vec_clear(z, chi->order.n); acb_clear(t); diff --git a/acb_dirichlet/l_vec_hurwitz.c b/acb_dirichlet/l_vec_hurwitz.c index e280cf78..7bcabd99 100644 --- a/acb_dirichlet/l_vec_hurwitz.c +++ b/acb_dirichlet/l_vec_hurwitz.c @@ -14,17 +14,17 @@ void acb_dirichlet_l_vec_hurwitz(acb_ptr res, const acb_t s, - const acb_dirichlet_group_t G, slong prec) + const dirichlet_group_t G, slong prec) { acb_t a, qs; acb_ptr zeta, z; - acb_dirichlet_conrey_t cn; + dirichlet_conrey_t cn; int deflate; /* remove pole in Hurwitz zeta at s = 1 */ deflate = acb_is_one(s); - acb_dirichlet_conrey_init(cn, G); + dirichlet_conrey_init(cn, G); acb_init(qs); acb_init(a); @@ -35,7 +35,7 @@ acb_dirichlet_l_vec_hurwitz(acb_ptr res, const acb_t s, acb_pow(qs, qs, a, prec); zeta = z = _acb_vec_init(G->phi_q); - acb_dirichlet_conrey_one(cn, G); + dirichlet_conrey_one(cn, G); do { acb_set_ui(a, cn->n); @@ -49,7 +49,7 @@ acb_dirichlet_l_vec_hurwitz(acb_ptr res, const acb_t s, acb_mul(z, z, qs, prec); z++; - } while (acb_dirichlet_conrey_next(cn, G) >= 0); + } while (dirichlet_conrey_next(cn, G) >= 0); acb_dirichlet_dft_conrey(res, zeta, G, prec); @@ -57,7 +57,7 @@ acb_dirichlet_l_vec_hurwitz(acb_ptr res, const acb_t s, if (deflate) acb_indeterminate(res); - acb_dirichlet_conrey_clear(cn); + dirichlet_conrey_clear(cn); _acb_vec_clear(zeta, G->phi_q); acb_clear(qs); acb_clear(a); diff --git a/acb_dirichlet/pairing.c b/acb_dirichlet/pairing.c index 832b047f..c05cbeb1 100644 --- a/acb_dirichlet/pairing.c +++ b/acb_dirichlet/pairing.c @@ -12,11 +12,11 @@ #include "acb_dirichlet.h" void -acb_dirichlet_pairing(acb_t res, const acb_dirichlet_group_t G, ulong m, ulong n, slong prec) +acb_dirichlet_pairing(acb_t res, const dirichlet_group_t G, ulong m, ulong n, slong prec) { ulong expo; - expo = acb_dirichlet_ui_pairing(G, m, n); - if (expo == ACB_DIRICHLET_CHI_NULL) + expo = dirichlet_ui_pairing(G, m, n); + if (expo == DIRICHLET_CHI_NULL) acb_zero(res); else { diff --git a/acb_dirichlet/pairing_conrey.c b/acb_dirichlet/pairing_conrey.c index e59e5464..18d8aa54 100644 --- a/acb_dirichlet/pairing_conrey.c +++ b/acb_dirichlet/pairing_conrey.c @@ -12,11 +12,11 @@ #include "acb_dirichlet.h" void -acb_dirichlet_pairing_conrey(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, const acb_dirichlet_conrey_t b, slong prec) +acb_dirichlet_pairing_conrey(acb_t res, const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b, slong prec) { ulong expo; - expo = acb_dirichlet_ui_pairing_conrey(G, a, b); - if (expo == ACB_DIRICHLET_CHI_NULL) + expo = dirichlet_ui_pairing_conrey(G, a, b); + if (expo == DIRICHLET_CHI_NULL) acb_zero(res); else { diff --git a/acb_dirichlet/qseries_arb_powers.c b/acb_dirichlet/qseries_arb_powers.c index e3d021b6..fc6deba3 100644 --- a/acb_dirichlet/qseries_arb_powers.c +++ b/acb_dirichlet/qseries_arb_powers.c @@ -34,7 +34,7 @@ acb_dirichlet_qseries_arb_powers_naive(acb_t res, const arb_t x, int parity, con { arb_mul(dx, dx, x2, prec); arb_mul(xk2, xk2, dx, prec); - if (a[k] != ACB_DIRICHLET_CHI_NULL) + if (a[k] != DIRICHLET_CHI_NULL) { acb_dirichlet_power(zk, z, a[k], prec); if (parity) @@ -76,7 +76,7 @@ acb_dirichlet_qseries_arb_powers_smallorder(acb_t res, const arb_t x, int parity { arb_mul(dx, dx, x2, prec); arb_mul(xk2, xk2, dx, prec); - if (a[k] != ACB_DIRICHLET_CHI_NULL) + if (a[k] != DIRICHLET_CHI_NULL) { if (parity) { diff --git a/acb_dirichlet/root_number.c b/acb_dirichlet/root_number.c index 36eb42c6..33324182 100644 --- a/acb_dirichlet/root_number.c +++ b/acb_dirichlet/root_number.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_root_number_theta(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_root_number_theta(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { arb_t x; acb_t eps; @@ -29,7 +29,7 @@ acb_dirichlet_root_number_theta(acb_t res, const acb_dirichlet_group_t G, const } void -acb_dirichlet_root_number(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong prec) +acb_dirichlet_root_number(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, slong prec) { if (chi->conductor < G->q) { diff --git a/acb_dirichlet/test/t-chi.c b/acb_dirichlet/test/t-chi.c index f42099a6..e12eb7c0 100644 --- a/acb_dirichlet/test/t-chi.c +++ b/acb_dirichlet/test/t-chi.c @@ -23,15 +23,15 @@ int main() for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { acb_t zn1, zn2, zn1n2, zn1zn2; - acb_dirichlet_group_t G; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_char_t chi; ulong q, m, n1, n2, iter2; int res; q = 1 + n_randint(state, 1000); - acb_dirichlet_group_init(G, q); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q); + dirichlet_char_init(chi, G); acb_init(zn1); acb_init(zn2); acb_init(zn1n2); @@ -44,7 +44,7 @@ int main() m = 1 + n_randint(state, q); } while (n_gcd(q, m) != 1); - acb_dirichlet_char(chi, G, m); + dirichlet_char(chi, G, m); n1 = n_randint(state, 1000); n2 = n_randint(state, 1000); @@ -53,19 +53,19 @@ int main() acb_dirichlet_pairing(zn2, G, m, n1, 53); if (!acb_overlaps(zn1, zn2)) { - acb_dirichlet_conrey_t x; + dirichlet_conrey_t x; flint_printf("FAIL: overlap\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("m = %wu\n\n", m); flint_printf("n = %wu\n\n", n1); flint_printf("char = "); acb_printd(zn1, 15); flint_printf("\n\n"); flint_printf("pairing = "); acb_printd(zn2, 15); flint_printf("\n\n"); - acb_dirichlet_char_print(G, chi); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_log(x, G, m); - flint_printf("log(m) = "); acb_dirichlet_conrey_print(G, x); - acb_dirichlet_conrey_log(x, G, n1); - flint_printf("log(n1) = "); acb_dirichlet_conrey_print(G, x); + dirichlet_char_print(G, chi); + dirichlet_conrey_init(x, G); + dirichlet_conrey_log(x, G, m); + flint_printf("log(m) = "); dirichlet_conrey_print(G, x); + dirichlet_conrey_log(x, G, n1); + flint_printf("log(n1) = "); dirichlet_conrey_print(G, x); abort(); } @@ -119,8 +119,8 @@ int main() } } - acb_dirichlet_group_clear(G); - acb_dirichlet_char_clear(chi); + dirichlet_group_clear(G); + dirichlet_char_clear(chi); acb_clear(zn1); acb_clear(zn2); acb_clear(zn1n2); diff --git a/acb_dirichlet/test/t-dft.c b/acb_dirichlet/test/t-dft.c index 64919659..679ddfc0 100644 --- a/acb_dirichlet/test/t-dft.c +++ b/acb_dirichlet/test/t-dft.c @@ -69,42 +69,42 @@ int main() for (k = 0; k < nq; k++) { slong i, j, len; - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x, y; + dirichlet_group_t G; + dirichlet_conrey_t x, y; acb_t chiy; acb_ptr v, w1, w2; - acb_dirichlet_group_init(G, q[k]); + dirichlet_group_init(G, q[k]); len = G->phi_q; v = _acb_vec_init(len); w1 = _acb_vec_init(len); w2 = _acb_vec_init(len); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_init(x, G); + dirichlet_conrey_one(x, G); for (i = 0; i < len; i++) acb_randtest_precise(v + i, state, prec, 0); /* naive */ acb_init(chiy); - acb_dirichlet_conrey_init(y, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_init(y, G); + dirichlet_conrey_one(x, G); for (i = 0; i < len; i++) { acb_zero(w1 + i); - acb_dirichlet_conrey_one(y, G); + dirichlet_conrey_one(y, G); for (j = 0; j < len; j++) { acb_dirichlet_pairing_conrey(chiy, G, x, y, prec); acb_addmul(w1 + i, chiy, v + j, prec); - acb_dirichlet_conrey_next(y, G); + dirichlet_conrey_next(y, G); } - acb_dirichlet_conrey_next(x, G); + dirichlet_conrey_next(x, G); } acb_clear(chiy); - acb_dirichlet_conrey_clear(y); - acb_dirichlet_conrey_clear(x); + dirichlet_conrey_clear(y); + dirichlet_conrey_clear(x); /* dft */ acb_dirichlet_dft_conrey(w2, v, G, prec); @@ -115,7 +115,7 @@ int main() _acb_vec_clear(w1, len); _acb_vec_clear(w2, len); - acb_dirichlet_group_clear(G); + dirichlet_group_clear(G); } flint_randclear(state); diff --git a/acb_dirichlet/test/t-gauss.c b/acb_dirichlet/test/t-gauss.c index c5c8927c..6b2afdfd 100644 --- a/acb_dirichlet/test/t-gauss.c +++ b/acb_dirichlet/test/t-gauss.c @@ -23,25 +23,25 @@ int main() for (q = 3; q < 250; q ++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_conrey_t x; + dirichlet_char_t chi; acb_t s1, s2, s3, s4; - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); + dirichlet_char_init(chi, G); acb_init(s1); acb_init(s2); acb_init(s3); acb_init(s4); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); while (1) { - acb_dirichlet_char_conrey(chi, G, x); + dirichlet_char_conrey(chi, G, x); acb_dirichlet_gauss_sum_naive(s1, G, chi, prec); acb_dirichlet_gauss_sum(s2, G, chi, prec); @@ -67,7 +67,7 @@ int main() abort(); } - if (acb_dirichlet_conrey_next(x, G) < 0) + if (dirichlet_conrey_next(x, G) < 0) break; } acb_clear(s1); @@ -75,9 +75,9 @@ int main() acb_clear(s3); acb_clear(s4); - acb_dirichlet_group_clear(G); - acb_dirichlet_char_clear(chi); - acb_dirichlet_conrey_clear(x); + dirichlet_group_clear(G); + dirichlet_char_clear(chi); + dirichlet_conrey_clear(x); } flint_cleanup(); diff --git a/acb_dirichlet/test/t-jacobi.c b/acb_dirichlet/test/t-jacobi.c index 59edb173..e7dfa520 100644 --- a/acb_dirichlet/test/t-jacobi.c +++ b/acb_dirichlet/test/t-jacobi.c @@ -24,24 +24,24 @@ int main() for (q = 29 * 29; q > 1; q = q%2 ? 3*q+1 : q/2) { slong m1, m2; - acb_dirichlet_group_t G; - acb_dirichlet_char_t chi1, chi2; + dirichlet_group_t G; + dirichlet_char_t chi1, chi2; acb_t s1, s2; - acb_dirichlet_group_init(G, q); - acb_dirichlet_char_init(chi1, G); - acb_dirichlet_char_init(chi2, G); + dirichlet_group_init(G, q); + dirichlet_char_init(chi1, G); + dirichlet_char_init(chi2, G); acb_init(s1); acb_init(s2); - acb_dirichlet_char_one(chi1, G); + dirichlet_char_one(chi1, G); for (m1 = 0; m1 < 50; m1++) { - acb_dirichlet_char_one(chi2, G); + dirichlet_char_one(chi2, G); for (m2 = 0; m2 < 50; m2++) { @@ -60,25 +60,25 @@ int main() flint_printf("\n"); flint_printf("cond = %wu, %wu, %wu\n", chi1->conductor, chi2->conductor, - acb_dirichlet_ui_conductor(G, nmod_mul(chi1->x->n, chi2->x->n, G->mod)) + dirichlet_ui_conductor(G, nmod_mul(chi1->x->n, chi2->x->n, G->mod)) ); abort(); } - if (acb_dirichlet_char_next(chi2, G) < 0) + if (dirichlet_char_next(chi2, G) < 0) break; } - if (acb_dirichlet_char_next(chi1, G) < 0) + if (dirichlet_char_next(chi1, G) < 0) break; } acb_clear(s1); acb_clear(s2); - acb_dirichlet_group_clear(G); - acb_dirichlet_char_clear(chi1); - acb_dirichlet_char_clear(chi2); + dirichlet_group_clear(G); + dirichlet_char_clear(chi1); + dirichlet_char_clear(chi2); } flint_cleanup(); diff --git a/acb_dirichlet/test/t-l.c b/acb_dirichlet/test/t-l.c index 6724a27c..395bbac4 100644 --- a/acb_dirichlet/test/t-l.c +++ b/acb_dirichlet/test/t-l.c @@ -19,15 +19,15 @@ test_dft(ulong q) { ulong i; slong prec = 100; - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_conrey_t x; + dirichlet_char_t chi; acb_t s, z; acb_ptr v; - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); + dirichlet_char_init(chi, G); acb_init(s); acb_one(s); @@ -42,10 +42,10 @@ test_dft(ulong q) i = 0; acb_init(z); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); do { - acb_dirichlet_char_conrey(chi, G, x); + dirichlet_char_conrey(chi, G, x); acb_dirichlet_l_hurwitz(z, s, G, chi, prec); if (!acb_overlaps(z, v + i)) @@ -76,13 +76,13 @@ test_dft(ulong q) } i++; - } while (acb_dirichlet_conrey_next(x, G) >= 0); + } while (dirichlet_conrey_next(x, G) >= 0); acb_clear(s); _acb_vec_clear(v, G->phi_q); - acb_dirichlet_char_clear(chi); - acb_dirichlet_conrey_clear(x); - acb_dirichlet_group_clear(G); + dirichlet_char_clear(chi); + dirichlet_conrey_clear(x); + dirichlet_group_clear(G); } int main() @@ -164,13 +164,13 @@ int main() for (i = 0; i < nq; i++) { - acb_dirichlet_group_t G; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_char_t chi; - acb_dirichlet_group_init(G, q[i]); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q[i]); + dirichlet_char_init(chi, G); - acb_dirichlet_char(chi, G, m[i]); + dirichlet_char(chi, G, m[i]); for (j = 0; j < nx; j++) { @@ -201,8 +201,8 @@ int main() } } - acb_dirichlet_char_clear(chi); - acb_dirichlet_group_clear(G); + dirichlet_char_clear(chi); + dirichlet_group_clear(G); /* test using dft */ test_dft(q[i]); diff --git a/acb_dirichlet/test/t-thetanull.c b/acb_dirichlet/test/t-thetanull.c index 62ad8a1c..f40ac1e2 100644 --- a/acb_dirichlet/test/t-thetanull.c +++ b/acb_dirichlet/test/t-thetanull.c @@ -27,8 +27,8 @@ int main() for (q = 3; q < 1000; q ++) { - acb_dirichlet_group_t G; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_char_t chi; ulong * v, nv, k; acb_t sum; @@ -41,8 +41,8 @@ int main() /* no primitive character mod q */ continue; - acb_dirichlet_group_init(G, q); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q); + dirichlet_char_init(chi, G); z = _acb_vec_init(G->expo); _acb_vec_nth_roots(z, G->expo, prec); @@ -65,19 +65,19 @@ int main() /* theta function on primitive characters */ acb_init(sum); - acb_dirichlet_char_first_primitive(chi, G); + dirichlet_char_first_primitive(chi, G); do { ulong m; acb_zero(sum); - acb_dirichlet_ui_chi_vec(v, G, chi, nv); + dirichlet_ui_chi_vec(v, G, chi, nv); m = G->expo / chi->order.n; - tt = acb_dirichlet_char_parity(chi) ? kt : t; + tt = dirichlet_char_parity(chi) ? kt : t; for (k = 1; k < nv; k++) - if (v[k] != ACB_DIRICHLET_CHI_NULL) + if (v[k] != DIRICHLET_CHI_NULL) acb_addmul_arb(sum, z + (v[k] * m), tt + k, prec); if ((q == 300 && (chi->x->n == 71 || chi->x->n == 131)) @@ -88,7 +88,7 @@ int main() flint_printf("FAIL: Theta(chi_%wu(%wu))=", q, chi->x->n); acb_printd(sum, 10); flint_printf("\n"); - acb_dirichlet_char_print(G, chi); + dirichlet_char_print(G, chi); flint_printf("\n"); abort(); } @@ -98,12 +98,12 @@ int main() flint_printf("FAIL: Theta(chi_%wu(%wu))=", q, chi->x->n); acb_printd(sum, 10); flint_printf("\n"); - acb_dirichlet_char_print(G, chi); + dirichlet_char_print(G, chi); flint_printf("\n"); abort(); } - } while (acb_dirichlet_char_next_primitive(chi, G) >= 0); + } while (dirichlet_char_next_primitive(chi, G) >= 0); _acb_vec_clear(z, G->expo); _arb_vec_clear(kt, nv); @@ -111,8 +111,8 @@ int main() acb_clear(sum); arb_clear(eq); flint_free(v); - acb_dirichlet_group_clear(G); - acb_dirichlet_char_clear(chi); + dirichlet_group_clear(G); + dirichlet_char_clear(chi); } flint_cleanup(); diff --git a/acb_dirichlet/test/t-vec.c b/acb_dirichlet/test/t-vec.c index 23f3ba56..d3cea907 100644 --- a/acb_dirichlet/test/t-vec.c +++ b/acb_dirichlet/test/t-vec.c @@ -30,27 +30,27 @@ int main() for (q = 2; q < 600; q ++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_conrey_t x; + dirichlet_char_t chi; ulong * v1, * v2, nv, k; - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); + dirichlet_char_init(chi, G); nv = 100; v1 = flint_malloc(nv * sizeof(ulong)); v2 = flint_malloc(nv * sizeof(ulong)); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); do { - acb_dirichlet_char_conrey(chi, G, x); + dirichlet_char_conrey(chi, G, x); - acb_dirichlet_ui_chi_vec_loop(v1, G, chi, nv); - acb_dirichlet_ui_chi_vec_primeloop(v2, G, chi, nv); + dirichlet_ui_chi_vec_loop(v1, G, chi, nv); + dirichlet_ui_chi_vec_primeloop(v2, G, chi, nv); if ((k = vec_diff(v1, v2, nv))) { @@ -59,13 +59,13 @@ int main() abort(); } - } while (acb_dirichlet_conrey_next(x, G) >= 0); + } while (dirichlet_conrey_next(x, G) >= 0); flint_free(v1); flint_free(v2); - acb_dirichlet_group_clear(G); - acb_dirichlet_char_clear(chi); - acb_dirichlet_conrey_clear(x); + dirichlet_group_clear(G); + dirichlet_char_clear(chi); + dirichlet_conrey_clear(x); } flint_cleanup(); diff --git a/acb_dirichlet/theta_arb.c b/acb_dirichlet/theta_arb.c index fa2d4e7a..f6a643e4 100644 --- a/acb_dirichlet/theta_arb.c +++ b/acb_dirichlet/theta_arb.c @@ -13,13 +13,13 @@ #include "acb_poly.h" void -_acb_dirichlet_theta_arb_smallorder(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const arb_t xt, slong len, slong prec) +_acb_dirichlet_theta_arb_smallorder(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, const arb_t xt, slong len, slong prec) { ulong * a; acb_dirichlet_powers_t z; a = flint_malloc(len * sizeof(ulong)); - acb_dirichlet_ui_chi_vec(a, G, chi, len); + dirichlet_ui_chi_vec(a, G, chi, len); _acb_dirichlet_powers_init(z, chi->order.n, 0, 0, prec); acb_dirichlet_qseries_arb_powers_smallorder(res, xt, chi->parity, a, z, len, prec); @@ -29,7 +29,7 @@ _acb_dirichlet_theta_arb_smallorder(acb_t res, const acb_dirichlet_group_t G, co } void -_acb_dirichlet_theta_arb_series(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const arb_t xt, slong len, slong prec) +_acb_dirichlet_theta_arb_series(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, const arb_t xt, slong len, slong prec) { acb_ptr a; a = _acb_vec_init(len); @@ -45,13 +45,13 @@ _acb_dirichlet_theta_arb_series(acb_t res, const acb_dirichlet_group_t G, const } void -_acb_dirichlet_theta_arb_naive(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const arb_t xt, slong len, slong prec) +_acb_dirichlet_theta_arb_naive(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, const arb_t xt, slong len, slong prec) { ulong * a; acb_dirichlet_powers_t z; a = flint_malloc(len * sizeof(ulong)); - acb_dirichlet_ui_chi_vec(a, G, chi, len); + dirichlet_ui_chi_vec(a, G, chi, len); acb_dirichlet_powers_init(z, chi->order.n, len, prec); @@ -62,7 +62,7 @@ _acb_dirichlet_theta_arb_naive(acb_t res, const acb_dirichlet_group_t G, const a } void -acb_dirichlet_theta_arb(acb_t res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const arb_t t, slong prec) +acb_dirichlet_theta_arb(acb_t res, const dirichlet_group_t G, const dirichlet_char_t chi, const arb_t t, slong prec) { slong len; arb_t xt; diff --git a/acb_dirichlet/ui_theta_arb.c b/acb_dirichlet/ui_theta_arb.c index 5679d695..f98d2e42 100644 --- a/acb_dirichlet/ui_theta_arb.c +++ b/acb_dirichlet/ui_theta_arb.c @@ -12,14 +12,14 @@ #include "acb_dirichlet.h" void -acb_dirichlet_ui_theta_arb(acb_t res, const acb_dirichlet_group_t G, ulong a, const arb_t t, slong prec) +acb_dirichlet_ui_theta_arb(acb_t res, const dirichlet_group_t G, ulong a, const arb_t t, slong prec) { - acb_dirichlet_char_t chi; + dirichlet_char_t chi; - acb_dirichlet_char_init(chi, G); - acb_dirichlet_char(chi, G, a); + dirichlet_char_init(chi, G); + dirichlet_char(chi, G, a); acb_dirichlet_theta_arb(res, G, chi, t, prec); - acb_dirichlet_char_clear(chi); + dirichlet_char_clear(chi); } diff --git a/acb_dirichlet/vec_mellin_arb.c b/acb_dirichlet/vec_mellin_arb.c index 15308e16..45c5ad43 100644 --- a/acb_dirichlet/vec_mellin_arb.c +++ b/acb_dirichlet/vec_mellin_arb.c @@ -12,7 +12,7 @@ #include "acb_dirichlet.h" void -acb_dirichlet_vec_mellin_arb(acb_ptr res, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong len, const arb_t t, slong n, slong prec) +acb_dirichlet_vec_mellin_arb(acb_ptr res, const dirichlet_group_t G, const dirichlet_char_t chi, slong len, const arb_t t, slong n, slong prec) { slong k; arb_t tk, xt, stk, st; diff --git a/dirichlet.h b/dirichlet.h new file mode 100644 index 00000000..62b6229a --- /dev/null +++ b/dirichlet.h @@ -0,0 +1,232 @@ +/* + Copyright (C) 2016 Pascal Molin + + 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 . +*/ + +#ifndef DIRICHLET_H +#define DIRICHLET_H + +#ifdef DIRICHLET_INLINES_C +#define DIRICHLET_INLINE +#else +#define DIRICHLET_INLINE static __inline__ +#endif + +#include "acb.h" +#include "dlog.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* should this dlog pointer be in the prime or the global group? */ +typedef struct +{ + ulong p; /* underlying prime */ + int e; /* exponent */ + nmod_t pe; /* modulus */ + ulong phi; /* phi(p^e) */ + ulong g; /* conrey generator */ + dlog_precomp_struct * dlog; /* precomputed data for discrete log mod p^e */ +} +dirichlet_prime_group_struct; + +typedef struct +{ + ulong q; /* modulus */ + ulong q_even; /* even part of modulus */ + nmod_t mod; /* modulus with precomputed inverse */ + ulong rad_q; /* radical = product of odd primes */ + ulong phi_q; /* phi(q) = group size */ + slong neven; /* number of even components (in 0,1,2)*/ + slong num; /* number of prime components (even + odd) */ + ulong expo; /* exponent = largest order in G */ + dirichlet_prime_group_struct * P; + ulong * generators; /* generators lifted mod q */ + ulong * PHI; /* PHI(k) = expo / phi(k) */ +} +dirichlet_group_struct; + +typedef dirichlet_group_struct dirichlet_group_t[1]; + +DIRICHLET_INLINE ulong +dirichlet_group_size(const dirichlet_group_t G) +{ + return G->phi_q; +} + +void dirichlet_group_init(dirichlet_group_t G, ulong q); +void dirichlet_subgroup_init(dirichlet_group_t H, const dirichlet_group_t G, ulong h); +void dirichlet_group_clear(dirichlet_group_t G); +void dirichlet_group_dlog_precompute(dirichlet_group_t G, ulong num); +void dirichlet_group_dlog_clear(dirichlet_group_t G); + +/* properties of elements without log */ + +ulong dirichlet_number_primitive(const dirichlet_group_t G); +ulong dirichlet_ui_conductor(const dirichlet_group_t G, ulong a); +int dirichlet_ui_parity(const dirichlet_group_t G, ulong a); +ulong dirichlet_ui_order(const dirichlet_group_t G, ulong a); + +/* elements of the group, keep both number and log */ +typedef struct +{ + ulong n; /* number */ + ulong * log; /* s.t. prod generators[k]^log[k] = number */ +} +dirichlet_conrey_struct; + +typedef dirichlet_conrey_struct dirichlet_conrey_t[1]; + +void dirichlet_conrey_init(dirichlet_conrey_t x, const dirichlet_group_t G); +void dirichlet_conrey_clear(dirichlet_conrey_t x); +void dirichlet_conrey_print(const dirichlet_group_t G, const dirichlet_conrey_t x); + +DIRICHLET_INLINE void +dirichlet_conrey_set(dirichlet_conrey_t x, const dirichlet_group_t G, const dirichlet_conrey_t y) +{ + slong k; + x->n = y->n; + for (k = 0; k < G->num; k++) + x->log[k] = y->log[k]; +} + +DIRICHLET_INLINE int +dirichlet_conrey_eq(const dirichlet_conrey_t x, const dirichlet_conrey_t y) +{ + return (x->n == y->n); +} + +int dirichlet_conrey_eq_deep(const dirichlet_group_t G, const dirichlet_conrey_t x, const dirichlet_conrey_t y); +int dirichlet_conrey_parity(const dirichlet_group_t G, const dirichlet_conrey_t x); +ulong dirichlet_conrey_conductor(const dirichlet_group_t G, const dirichlet_conrey_t x); +ulong dirichlet_conrey_order(const dirichlet_group_t G, const dirichlet_conrey_t x); + +void dirichlet_conrey_log(dirichlet_conrey_t x, const dirichlet_group_t G, ulong m); +ulong dirichlet_conrey_exp(dirichlet_conrey_t x, const dirichlet_group_t G); + +void dirichlet_conrey_index(dirichlet_conrey_t x, const dirichlet_group_t G, ulong j); +ulong dirichlet_index_conrey(const dirichlet_group_t G, const dirichlet_conrey_t x); + +void dirichlet_conrey_one(dirichlet_conrey_t x, const dirichlet_group_t G); +void dirichlet_conrey_first_primitive(dirichlet_conrey_t x, const dirichlet_group_t G); + +int dirichlet_conrey_next(dirichlet_conrey_t x, const dirichlet_group_t G); +int dirichlet_conrey_next_primitive(dirichlet_conrey_t x, const dirichlet_group_t G); + +void dirichlet_conrey_mul(dirichlet_conrey_t c, const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b); +void dirichlet_conrey_pow(dirichlet_conrey_t c, const dirichlet_group_t G, const dirichlet_conrey_t a, ulong n); +void dirichlet_conrey_primitive(dirichlet_conrey_t y, const dirichlet_group_t G, const dirichlet_conrey_t x, ulong cond); + +#define DIRICHLET_CHI_NULL UWORD_MAX + +ulong dirichlet_ui_pairing_conrey(const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b); +ulong dirichlet_ui_pairing(const dirichlet_group_t G, ulong m, ulong n); + +void dirichlet_pairing_conrey(acb_t res, const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b, slong prec); +void dirichlet_pairing(acb_t res, const dirichlet_group_t G, ulong m, ulong n, slong prec); + +/* introducing character type */ + +/* character = reduced exponents, keep order, number and conductor */ +typedef struct +{ + ulong q; /* modulus */ + nmod_t order; /* order */ + dirichlet_conrey_t x; + ulong * expo; /* reduced exponents ( log[k] * PHI[k] / gcd( ) ) */ + int parity; /* 0 for even char, 1 for odd */ + ulong conductor; +} +dirichlet_char_struct; + +typedef dirichlet_char_struct dirichlet_char_t[1]; + +DIRICHLET_INLINE ulong +dirichlet_char_order(const dirichlet_char_t chi) +{ + return chi->order.n; +} + +DIRICHLET_INLINE ulong +dirichlet_char_conductor(const dirichlet_char_t chi) +{ + return chi->conductor; +} + +DIRICHLET_INLINE int +dirichlet_char_parity(const dirichlet_char_t chi) +{ + return chi->parity; +} + +void dirichlet_char_init(dirichlet_char_t chi, const dirichlet_group_t G); +void dirichlet_char_clear(dirichlet_char_t chi); +void dirichlet_char_print(const dirichlet_group_t G, const dirichlet_char_t chi); + +DIRICHLET_INLINE void +dirichlet_char_set(dirichlet_char_t chi1, const dirichlet_group_t G, const dirichlet_char_t chi2) +{ + slong k; + + chi1->q = chi2->q; + chi1->conductor = chi2->conductor; + chi1->order = chi2->order; + chi1->parity = chi2->parity; + dirichlet_conrey_set(chi1->x, G, chi2->x); + for (k = 0; k < G->num; k++) + chi1->expo[k] = chi2->expo[k]; +} + +DIRICHLET_INLINE int +dirichlet_char_eq(const dirichlet_char_t chi1, const dirichlet_char_t chi2) +{ + return (chi1->q == chi2->q && chi1->x->n == chi2->x->n); +} + +int dirichlet_char_eq_deep(const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2); +DIRICHLET_INLINE int +dirichlet_char_is_principal(const dirichlet_char_t chi) +{ + return (chi->x->n == 1); +} +DIRICHLET_INLINE int +dirichlet_char_is_real(const dirichlet_char_t chi) +{ + return (chi->order.n <= 2); +} + +void dirichlet_char(dirichlet_char_t chi, const dirichlet_group_t G, ulong n); +void dirichlet_char_conrey(dirichlet_char_t chi, const dirichlet_group_t G, const dirichlet_conrey_t x); +void dirichlet_char_set_expo(dirichlet_char_t chi, const dirichlet_group_t G); +void dirichlet_char_normalize(dirichlet_char_t chi, const dirichlet_group_t G); +void dirichlet_char_denormalize(dirichlet_char_t chi, const dirichlet_group_t G); + +void dirichlet_char_mul(dirichlet_char_t chi12, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2); +void dirichlet_char_primitive(dirichlet_char_t chi0, const dirichlet_group_t G0, const dirichlet_group_t G, const dirichlet_char_t chi); + +void dirichlet_char_one(dirichlet_char_t chi, const dirichlet_group_t G); +void dirichlet_char_first_primitive(dirichlet_char_t chi, const dirichlet_group_t G); + +int dirichlet_char_next(dirichlet_char_t chi, const dirichlet_group_t G); +int dirichlet_char_next_primitive(dirichlet_char_t chi, const dirichlet_group_t G); + +ulong dirichlet_ui_chi_conrey(const dirichlet_group_t G, const dirichlet_char_t chi, const dirichlet_conrey_t x); +ulong dirichlet_ui_chi(const dirichlet_group_t G, const dirichlet_char_t chi, ulong n); + +void dirichlet_ui_vec_set_null(ulong *v, const dirichlet_group_t G, slong nv); +void dirichlet_ui_chi_vec_loop(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv); +void dirichlet_ui_chi_vec_primeloop(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv); +void dirichlet_ui_chi_vec(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/acb_dirichlet/char.c b/dirichlet/char.c similarity index 65% rename from acb_dirichlet/char.c rename to dirichlet/char.c index cd3bff08..1cc00012 100644 --- a/acb_dirichlet/char.c +++ b/dirichlet/char.c @@ -9,11 +9,11 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G, ulong n) +dirichlet_char(dirichlet_char_t chi, const dirichlet_group_t G, ulong n) { - acb_dirichlet_conrey_log(chi->x, G, n); - acb_dirichlet_char_conrey(chi, G, NULL); + dirichlet_conrey_log(chi->x, G, n); + dirichlet_char_conrey(chi, G, NULL); } diff --git a/acb_dirichlet/char_clear.c b/dirichlet/char_clear.c similarity index 77% rename from acb_dirichlet/char_clear.c rename to dirichlet/char_clear.c index 57e4e948..f5e28e26 100644 --- a/acb_dirichlet/char_clear.c +++ b/dirichlet/char_clear.c @@ -9,11 +9,11 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_clear(acb_dirichlet_char_t chi) +dirichlet_char_clear(dirichlet_char_t chi) { - acb_dirichlet_conrey_clear(chi->x); + dirichlet_conrey_clear(chi->x); flint_free(chi->expo); } diff --git a/acb_dirichlet/char_conrey.c b/dirichlet/char_conrey.c similarity index 62% rename from acb_dirichlet/char_conrey.c rename to dirichlet/char_conrey.c index 673c436a..44dd304d 100644 --- a/acb_dirichlet/char_conrey.c +++ b/dirichlet/char_conrey.c @@ -9,24 +9,24 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" /* char n has exponents = log[k]*PHI[k] / gcd and order expo / gcd * so that log = expo[k] */ void -acb_dirichlet_char_conrey(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x) +dirichlet_char_conrey(dirichlet_char_t chi, const dirichlet_group_t G, const dirichlet_conrey_t x) { /* assume chi->x already set if x == NULL */ if (x == NULL) x = chi->x; else - acb_dirichlet_conrey_set(chi->x, G, x); + dirichlet_conrey_set(chi->x, G, x); chi->q = G->q; - chi->parity = acb_dirichlet_conrey_parity(G, x); - chi->conductor = acb_dirichlet_conrey_conductor(G, x); + chi->parity = dirichlet_conrey_parity(G, x); + chi->conductor = dirichlet_conrey_conductor(G, x); - acb_dirichlet_char_set_expo(chi, G); + dirichlet_char_set_expo(chi, G); /* optional: divide by gcd to obtain true order */ - acb_dirichlet_char_normalize(chi, G); + dirichlet_char_normalize(chi, G); } diff --git a/acb_dirichlet/char_eq_deep.c b/dirichlet/char_eq_deep.c similarity index 69% rename from acb_dirichlet/char_eq_deep.c rename to dirichlet/char_eq_deep.c index ff0ad0fc..2d02a69e 100644 --- a/acb_dirichlet/char_eq_deep.c +++ b/dirichlet/char_eq_deep.c @@ -9,12 +9,12 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_char_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2) +dirichlet_char_eq_deep(const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2) { - acb_dirichlet_conrey_t x, y; + dirichlet_conrey_t x, y; if (chi1->q != chi2->q) return 0; @@ -25,13 +25,13 @@ acb_dirichlet_char_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_ch if (chi1->conductor != chi2->conductor) return 0; - if (!acb_dirichlet_conrey_eq_deep(G, chi1->x, chi2->x)) + if (!dirichlet_conrey_eq_deep(G, chi1->x, chi2->x)) return 0; x->n = y->n = 1; x->log = chi1->expo; y->log = chi2->expo; - if (!acb_dirichlet_conrey_eq_deep(G, x, y)) + if (!dirichlet_conrey_eq_deep(G, x, y)) return 0; return 1; diff --git a/acb_dirichlet/char_first_primitive.c b/dirichlet/char_first_primitive.c similarity index 59% rename from acb_dirichlet/char_first_primitive.c rename to dirichlet/char_first_primitive.c index 6e31d30f..8bddcd24 100644 --- a/acb_dirichlet/char_first_primitive.c +++ b/dirichlet/char_first_primitive.c @@ -9,12 +9,12 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_first_primitive(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_first_primitive(dirichlet_char_t chi, const dirichlet_group_t G) { - acb_dirichlet_conrey_first_primitive(chi->x, G); - acb_dirichlet_char_conrey(chi, G, NULL); - acb_dirichlet_char_normalize(chi, G); + dirichlet_conrey_first_primitive(chi->x, G); + dirichlet_char_conrey(chi, G, NULL); + dirichlet_char_normalize(chi, G); } diff --git a/acb_dirichlet/char_init.c b/dirichlet/char_init.c similarity index 80% rename from acb_dirichlet/char_init.c rename to dirichlet/char_init.c index dc90a2bc..cbef6829 100644 --- a/acb_dirichlet/char_init.c +++ b/dirichlet/char_init.c @@ -9,13 +9,13 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_init(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_init(dirichlet_char_t chi, const dirichlet_group_t G) { slong k; - acb_dirichlet_conrey_init(chi->x, G); + dirichlet_conrey_init(chi->x, G); chi->expo = flint_malloc(G->num * sizeof(ulong)); chi->q = G->q; chi->conductor = 1; diff --git a/dirichlet/char_mul.c b/dirichlet/char_mul.c new file mode 100644 index 00000000..e4b596cd --- /dev/null +++ b/dirichlet/char_mul.c @@ -0,0 +1,19 @@ +/* + Copyright (C) 2016 Pascal Molin + + 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 . +*/ + +#include "dirichlet.h" + +void +dirichlet_char_mul(dirichlet_char_t chi12, const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2) +{ + dirichlet_conrey_mul(chi12->x, G, chi1->x, chi2->x); + dirichlet_char_conrey(chi12, G, NULL); +} diff --git a/acb_dirichlet/char_next.c b/dirichlet/char_next.c similarity index 69% rename from acb_dirichlet/char_next.c rename to dirichlet/char_next.c index 0ae26024..315d8525 100644 --- a/acb_dirichlet/char_next.c +++ b/dirichlet/char_next.c @@ -9,14 +9,14 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_char_next(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_next(dirichlet_char_t chi, const dirichlet_group_t G) { int k; - k = acb_dirichlet_conrey_next(chi->x, G); - acb_dirichlet_char_conrey(chi, G, NULL); + k = dirichlet_conrey_next(chi->x, G); + dirichlet_char_conrey(chi, G, NULL); /* return last index modified */ return k; } diff --git a/acb_dirichlet/char_next_primitive.c b/dirichlet/char_next_primitive.c similarity index 67% rename from acb_dirichlet/char_next_primitive.c rename to dirichlet/char_next_primitive.c index 363cd4d7..abfcc364 100644 --- a/acb_dirichlet/char_next_primitive.c +++ b/dirichlet/char_next_primitive.c @@ -9,14 +9,14 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_char_next_primitive(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_next_primitive(dirichlet_char_t chi, const dirichlet_group_t G) { int k; - k = acb_dirichlet_conrey_next_primitive(chi->x, G); - acb_dirichlet_char_conrey(chi, G, NULL); + k = dirichlet_conrey_next_primitive(chi->x, G); + dirichlet_char_conrey(chi, G, NULL); /* return last index modified */ return k; } diff --git a/acb_dirichlet/char_normalize.c b/dirichlet/char_normalize.c similarity index 75% rename from acb_dirichlet/char_normalize.c rename to dirichlet/char_normalize.c index 7d280d43..9905a105 100644 --- a/acb_dirichlet/char_normalize.c +++ b/dirichlet/char_normalize.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_set_expo(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_set_expo(dirichlet_char_t chi, const dirichlet_group_t G) { slong k; for (k = 0; k < G->num; k++) @@ -21,7 +21,7 @@ acb_dirichlet_char_set_expo(acb_dirichlet_char_t chi, const acb_dirichlet_group_ } void -acb_dirichlet_char_normalize(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_normalize(dirichlet_char_t chi, const dirichlet_group_t G) { ulong k, g; g = G->expo; @@ -36,7 +36,7 @@ acb_dirichlet_char_normalize(acb_dirichlet_char_t chi, const acb_dirichlet_group } void -acb_dirichlet_char_denormalize(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_denormalize(dirichlet_char_t chi, const dirichlet_group_t G) { ulong k, g; g = G->expo / chi->order.n; diff --git a/acb_dirichlet/char_one.c b/dirichlet/char_one.c similarity index 78% rename from acb_dirichlet/char_one.c rename to dirichlet/char_one.c index 57a88e45..a133e7c3 100644 --- a/acb_dirichlet/char_one.c +++ b/dirichlet/char_one.c @@ -9,13 +9,13 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_one(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G) +dirichlet_char_one(dirichlet_char_t chi, const dirichlet_group_t G) { slong k; - acb_dirichlet_conrey_one(chi->x, G); + dirichlet_conrey_one(chi->x, G); chi->q = G->q; chi->conductor = 1; chi->parity = 0; diff --git a/acb_dirichlet/char_primitive.c b/dirichlet/char_primitive.c similarity index 61% rename from acb_dirichlet/char_primitive.c rename to dirichlet/char_primitive.c index 8fd374bd..3172a593 100644 --- a/acb_dirichlet/char_primitive.c +++ b/dirichlet/char_primitive.c @@ -9,16 +9,16 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_primitive(acb_dirichlet_char_t chi0, const acb_dirichlet_group_t G0, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi) +dirichlet_char_primitive(dirichlet_char_t chi0, const dirichlet_group_t G0, const dirichlet_group_t G, const dirichlet_char_t chi) { chi0->q = chi->conductor; chi0->parity = chi->parity; chi0->conductor = chi->conductor; - acb_dirichlet_conrey_primitive(chi0->x, G, chi->x, chi->conductor); - acb_dirichlet_char_set_expo(chi0, G0); + dirichlet_conrey_primitive(chi0->x, G, chi->x, chi->conductor); + dirichlet_char_set_expo(chi0, G0); /* optional: divide by gcd to obtain true order */ - acb_dirichlet_char_normalize(chi0, G0); + dirichlet_char_normalize(chi0, G0); } diff --git a/acb_dirichlet/char_print.c b/dirichlet/char_print.c similarity index 71% rename from acb_dirichlet/char_print.c rename to dirichlet/char_print.c index a33e33d0..62031b0b 100644 --- a/acb_dirichlet/char_print.c +++ b/dirichlet/char_print.c @@ -9,15 +9,15 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_char_print(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi) +dirichlet_char_print(const dirichlet_group_t G, const dirichlet_char_t chi) { - acb_dirichlet_conrey_t x; + dirichlet_conrey_t x; flint_printf("chi_%wu(%wu,.) of order %wu, parity %wd, index ", G->q, chi->x->n, chi->order, chi->parity); - acb_dirichlet_conrey_print(G, chi->x); + dirichlet_conrey_print(G, chi->x); flint_printf(" and exponents "); x->log = chi->expo; - acb_dirichlet_conrey_print(G, x); + dirichlet_conrey_print(G, x); } diff --git a/acb_dirichlet/conrey.c b/dirichlet/conrey.c similarity index 69% rename from acb_dirichlet/conrey.c rename to dirichlet/conrey.c index 3fe26f6c..8c76683f 100644 --- a/acb_dirichlet/conrey.c +++ b/dirichlet/conrey.c @@ -9,15 +9,15 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_init(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G) { +dirichlet_conrey_init(dirichlet_conrey_t x, const dirichlet_group_t G) { x->log = flint_malloc(G->num * sizeof(ulong)); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); } void -acb_dirichlet_conrey_clear(acb_dirichlet_conrey_t x) { +dirichlet_conrey_clear(dirichlet_conrey_t x) { flint_free(x->log); } diff --git a/acb_dirichlet/conrey_conductor.c b/dirichlet/conrey_conductor.c similarity index 88% rename from acb_dirichlet/conrey_conductor.c rename to dirichlet/conrey_conductor.c index 78cb5e0e..f346432e 100644 --- a/acb_dirichlet/conrey_conductor.c +++ b/dirichlet/conrey_conductor.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_conrey_conductor(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x) +dirichlet_conrey_conductor(const dirichlet_group_t G, const dirichlet_conrey_t x) { int k, f; ulong cond = 1; diff --git a/acb_dirichlet/conrey_eq_deep.c b/dirichlet/conrey_eq_deep.c similarity index 78% rename from acb_dirichlet/conrey_eq_deep.c rename to dirichlet/conrey_eq_deep.c index 122f3c62..08950ca3 100644 --- a/acb_dirichlet/conrey_eq_deep.c +++ b/dirichlet/conrey_eq_deep.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_conrey_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y) +dirichlet_conrey_eq_deep(const dirichlet_group_t G, const dirichlet_conrey_t x, const dirichlet_conrey_t y) { slong k; diff --git a/acb_dirichlet/conrey_exp.c b/dirichlet/conrey_exp.c similarity index 83% rename from acb_dirichlet/conrey_exp.c rename to dirichlet/conrey_exp.c index 2ba76deb..12498a36 100644 --- a/acb_dirichlet/conrey_exp.c +++ b/dirichlet/conrey_exp.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_conrey_exp(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G) +dirichlet_conrey_exp(dirichlet_conrey_t x, const dirichlet_group_t G) { ulong k, n = 1; for (k = 0; k < G->num; k++) diff --git a/acb_dirichlet/conrey_first_primitive.c b/dirichlet/conrey_first_primitive.c similarity index 74% rename from acb_dirichlet/conrey_first_primitive.c rename to dirichlet/conrey_first_primitive.c index d1472439..1415e764 100644 --- a/acb_dirichlet/conrey_first_primitive.c +++ b/dirichlet/conrey_first_primitive.c @@ -9,15 +9,15 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_first_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G) +dirichlet_conrey_first_primitive(dirichlet_conrey_t x, const dirichlet_group_t G) { ulong k; if (G->q % 4 == 2) { - flint_printf("Exception (acb_dirichlet_conrey_first_primitive). No primitive element mod %wu.\n",G->q); + flint_printf("Exception (dirichlet_conrey_first_primitive). No primitive element mod %wu.\n",G->q); abort(); } x->n = 1; diff --git a/acb_dirichlet/conrey_index.c b/dirichlet/conrey_index.c similarity index 88% rename from acb_dirichlet/conrey_index.c rename to dirichlet/conrey_index.c index 2c02ce53..e9acc235 100644 --- a/acb_dirichlet/conrey_index.c +++ b/dirichlet/conrey_index.c @@ -23,10 +23,10 @@ ******************************************************************************/ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_index(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong j) +dirichlet_conrey_index(dirichlet_conrey_t x, const dirichlet_group_t G, ulong j) { slong k; @@ -36,5 +36,5 @@ acb_dirichlet_conrey_index(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t j = j / G->P[k].phi; } - acb_dirichlet_conrey_exp(x, G); + dirichlet_conrey_exp(x, G); } diff --git a/acb_dirichlet/conrey_log.c b/dirichlet/conrey_log.c similarity index 87% rename from acb_dirichlet/conrey_log.c rename to dirichlet/conrey_log.c index b3ead4a6..15a640f6 100644 --- a/acb_dirichlet/conrey_log.c +++ b/dirichlet/conrey_log.c @@ -12,11 +12,11 @@ */ #include "dlog.h" -#include "acb_dirichlet.h" +#include "dirichlet.h" /* assume m is invertible */ void -acb_dirichlet_conrey_log(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong m) +dirichlet_conrey_log(dirichlet_conrey_t x, const dirichlet_group_t G, ulong m) { slong k; /* even part */ @@ -36,7 +36,7 @@ acb_dirichlet_conrey_log(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G /* odd part */ for (k = G->neven; k < G->num; k++) { - acb_dirichlet_prime_group_struct P = G->P[k]; + dirichlet_prime_group_struct P = G->P[k]; if (P.dlog == NULL) { x->log[k] = dlog_once(m % P.pe.n, P.g, P.pe, P.phi); diff --git a/acb_dirichlet/conrey_mul.c b/dirichlet/conrey_mul.c similarity index 75% rename from acb_dirichlet/conrey_mul.c rename to dirichlet/conrey_mul.c index 29e3bcbe..df3a5376 100644 --- a/acb_dirichlet/conrey_mul.c +++ b/dirichlet/conrey_mul.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_mul(acb_dirichlet_conrey_t c, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, const acb_dirichlet_conrey_t b) +dirichlet_conrey_mul(dirichlet_conrey_t c, const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b) { ulong k; for (k = 0; k < G->num ; k++) diff --git a/acb_dirichlet/conrey_next.c b/dirichlet/conrey_next.c similarity index 86% rename from acb_dirichlet/conrey_next.c rename to dirichlet/conrey_next.c index 881f54d2..e9c7cc8f 100644 --- a/acb_dirichlet/conrey_next.c +++ b/dirichlet/conrey_next.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_conrey_next(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G) +dirichlet_conrey_next(dirichlet_conrey_t x, const dirichlet_group_t G) { /* update index */ int k; diff --git a/acb_dirichlet/conrey_next_primitive.c b/dirichlet/conrey_next_primitive.c similarity index 92% rename from acb_dirichlet/conrey_next_primitive.c rename to dirichlet/conrey_next_primitive.c index a6e050dc..521e161c 100644 --- a/acb_dirichlet/conrey_next_primitive.c +++ b/dirichlet/conrey_next_primitive.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_conrey_next_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G) +dirichlet_conrey_next_primitive(dirichlet_conrey_t x, const dirichlet_group_t G) { /* update index avoiding multiples of p except for first component if 8|q */ diff --git a/acb_dirichlet/conrey_one.c b/dirichlet/conrey_one.c similarity index 81% rename from acb_dirichlet/conrey_one.c rename to dirichlet/conrey_one.c index 7396e957..252889d0 100644 --- a/acb_dirichlet/conrey_one.c +++ b/dirichlet/conrey_one.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_one(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G) +dirichlet_conrey_one(dirichlet_conrey_t x, const dirichlet_group_t G) { ulong k; for (k = 0; k < G->num ; k++) diff --git a/acb_dirichlet/conrey_order.c b/dirichlet/conrey_order.c similarity index 81% rename from acb_dirichlet/conrey_order.c rename to dirichlet/conrey_order.c index 0b4495e4..23008de9 100644 --- a/acb_dirichlet/conrey_order.c +++ b/dirichlet/conrey_order.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_conrey_order(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x) +dirichlet_conrey_order(const dirichlet_group_t G, const dirichlet_conrey_t x) { ulong k, g; g = G->expo; diff --git a/acb_dirichlet/conrey_parity.c b/dirichlet/conrey_parity.c similarity index 83% rename from acb_dirichlet/conrey_parity.c rename to dirichlet/conrey_parity.c index 11428e9e..91a47b3f 100644 --- a/acb_dirichlet/conrey_parity.c +++ b/dirichlet/conrey_parity.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_conrey_parity(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x) +dirichlet_conrey_parity(const dirichlet_group_t G, const dirichlet_conrey_t x) { int k, odd = 0; for (k = 0; k < G->num; k++) diff --git a/acb_dirichlet/conrey_pow.c b/dirichlet/conrey_pow.c similarity index 77% rename from acb_dirichlet/conrey_pow.c rename to dirichlet/conrey_pow.c index 446c5529..5a70aa8f 100644 --- a/acb_dirichlet/conrey_pow.c +++ b/dirichlet/conrey_pow.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_pow(acb_dirichlet_conrey_t c, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, ulong n) +dirichlet_conrey_pow(dirichlet_conrey_t c, const dirichlet_group_t G, const dirichlet_conrey_t a, ulong n) { ulong k; for (k = 0; k < G->num ; k++) diff --git a/acb_dirichlet/conrey_primitive.c b/dirichlet/conrey_primitive.c similarity index 85% rename from acb_dirichlet/conrey_primitive.c rename to dirichlet/conrey_primitive.c index c3a79411..2c657576 100644 --- a/acb_dirichlet/conrey_primitive.c +++ b/dirichlet/conrey_primitive.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_primitive(acb_dirichlet_conrey_t y, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x, ulong cond) +dirichlet_conrey_primitive(dirichlet_conrey_t y, const dirichlet_group_t G, const dirichlet_conrey_t x, ulong cond) { slong k, l; diff --git a/acb_dirichlet/conrey_print.c b/dirichlet/conrey_print.c similarity index 83% rename from acb_dirichlet/conrey_print.c rename to dirichlet/conrey_print.c index 7790fe77..3c5970f1 100644 --- a/acb_dirichlet/conrey_print.c +++ b/dirichlet/conrey_print.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_conrey_print(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x) +dirichlet_conrey_print(const dirichlet_group_t G, const dirichlet_conrey_t x) { slong k; if (G->num) diff --git a/acb_dirichlet/group_clear.c b/dirichlet/group_clear.c similarity index 86% rename from acb_dirichlet/group_clear.c rename to dirichlet/group_clear.c index 9864ad1c..fcf6c2c2 100644 --- a/acb_dirichlet/group_clear.c +++ b/dirichlet/group_clear.c @@ -10,10 +10,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_group_clear(acb_dirichlet_group_t G) +dirichlet_group_clear(dirichlet_group_t G) { flint_free(G->P); flint_free(G->generators); diff --git a/acb_dirichlet/group_dlog_precompute.c b/dirichlet/group_dlog_precompute.c similarity index 74% rename from acb_dirichlet/group_dlog_precompute.c rename to dirichlet/group_dlog_precompute.c index f55da18e..26cde7d5 100644 --- a/acb_dirichlet/group_dlog_precompute.c +++ b/dirichlet/group_dlog_precompute.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_prime_group_dlog_precompute(acb_dirichlet_prime_group_struct * P, ulong num) +dirichlet_prime_group_dlog_precompute(dirichlet_prime_group_struct * P, ulong num) { P->dlog = flint_malloc(sizeof(dlog_precomp_t)); /* even if e = 1 use modpe struct, more flexible if reused in bigger group */ @@ -20,18 +20,18 @@ acb_dirichlet_prime_group_dlog_precompute(acb_dirichlet_prime_group_struct * P, } void -acb_dirichlet_group_dlog_precompute(acb_dirichlet_group_t G, ulong num) +dirichlet_group_dlog_precompute(dirichlet_group_t G, ulong num) { slong k; for (k = 0; k < G->num; k++) { if (G->P[k].dlog == NULL) - acb_dirichlet_prime_group_dlog_precompute(&G->P[k], num); + dirichlet_prime_group_dlog_precompute(&G->P[k], num); } } void -acb_dirichlet_group_dlog_clear(acb_dirichlet_group_t G) +dirichlet_group_dlog_clear(dirichlet_group_t G) { slong k; for (k = 0; k < G->num; k++) diff --git a/acb_dirichlet/group_init.c b/dirichlet/group_init.c similarity index 84% rename from acb_dirichlet/group_init.c rename to dirichlet/group_init.c index 9120ae48..4a98121f 100644 --- a/acb_dirichlet/group_init.c +++ b/dirichlet/group_init.c @@ -11,7 +11,7 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" static ulong primitive_root_p_and_p2(ulong p) @@ -34,7 +34,7 @@ primitive_root_p_and_p2(ulong p) } void -acb_dirichlet_prime_group_init(acb_dirichlet_prime_group_struct * P, ulong p, int e) +dirichlet_prime_group_init(dirichlet_prime_group_struct * P, ulong p, int e) { P->p = p; P->e = e; @@ -66,10 +66,10 @@ acb_dirichlet_prime_group_init(acb_dirichlet_prime_group_struct * P, ulong p, in } static void -acb_dirichlet_group_lift_generators(acb_dirichlet_group_t G) +dirichlet_group_lift_generators(dirichlet_group_t G) { slong k; - acb_dirichlet_prime_group_struct * P = G->P; + dirichlet_prime_group_struct * P = G->P; G->expo = G->phi_q = 1; if (G->neven) @@ -104,7 +104,7 @@ acb_dirichlet_group_lift_generators(acb_dirichlet_group_t G) } void -acb_dirichlet_group_init(acb_dirichlet_group_t G, ulong q) +dirichlet_group_init(dirichlet_group_t G, ulong q) { slong k; ulong e2; @@ -124,15 +124,15 @@ acb_dirichlet_group_init(acb_dirichlet_group_t G, ulong q) n_factor(&fac, q, 1); G->num = fac.num + G->neven; - G->P = flint_malloc(G->num * sizeof(acb_dirichlet_prime_group_struct)); + G->P = flint_malloc(G->num * sizeof(dirichlet_prime_group_struct)); G->generators = flint_malloc(G->num * sizeof(ulong)); G->PHI = flint_malloc(G->num * sizeof(ulong)); /* even part */ if (G->neven >= 1) - acb_dirichlet_prime_group_init(&G->P[0], 2, e2); + dirichlet_prime_group_init(&G->P[0], 2, e2); if (G->neven == 2) - acb_dirichlet_prime_group_init(&G->P[1], 4, e2); + dirichlet_prime_group_init(&G->P[1], 4, e2); /* odd part */ G->rad_q = 1; @@ -142,13 +142,13 @@ acb_dirichlet_group_init(acb_dirichlet_group_t G, ulong q) p = fac.p[k - G->neven]; e = fac.exp[k - G->neven]; G->rad_q *= p; - acb_dirichlet_prime_group_init(&G->P[k], p, e); + dirichlet_prime_group_init(&G->P[k], p, e); } - acb_dirichlet_group_lift_generators(G); + dirichlet_group_lift_generators(G); } void -acb_dirichlet_subgroup_init(acb_dirichlet_group_t H, const acb_dirichlet_group_t G, ulong h) +dirichlet_subgroup_init(dirichlet_group_t H, const dirichlet_group_t G, ulong h) { int s[15]; /* selected components */ slong k, j, e2; @@ -185,7 +185,7 @@ acb_dirichlet_subgroup_init(acb_dirichlet_group_t H, const acb_dirichlet_group_t } H->num = j; - H->P = flint_malloc(j * sizeof(acb_dirichlet_prime_group_struct)); + H->P = flint_malloc(j * sizeof(dirichlet_prime_group_struct)); H->generators = flint_malloc(j * sizeof(ulong)); H->PHI = flint_malloc(j * sizeof(ulong)); @@ -218,5 +218,5 @@ acb_dirichlet_subgroup_init(acb_dirichlet_group_t H, const acb_dirichlet_group_t } } - acb_dirichlet_group_lift_generators(H); + dirichlet_group_lift_generators(H); } diff --git a/acb_dirichlet/index_conrey.c b/dirichlet/index_conrey.c similarity index 91% rename from acb_dirichlet/index_conrey.c rename to dirichlet/index_conrey.c index a3a2b543..e55783f5 100644 --- a/acb_dirichlet/index_conrey.c +++ b/dirichlet/index_conrey.c @@ -23,10 +23,10 @@ ******************************************************************************/ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_index_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x) +dirichlet_index_conrey(const dirichlet_group_t G, const dirichlet_conrey_t x) { slong k; ulong j = 0; diff --git a/acb_dirichlet/number_primitive.c b/dirichlet/number_primitive.c similarity index 89% rename from acb_dirichlet/number_primitive.c rename to dirichlet/number_primitive.c index 053df1a7..202e5114 100644 --- a/acb_dirichlet/number_primitive.c +++ b/dirichlet/number_primitive.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_number_primitive(const acb_dirichlet_group_t G) +dirichlet_number_primitive(const dirichlet_group_t G) { if (G->q % 4 == 2) return 0; diff --git a/acb_dirichlet/profile/p-conrey.c b/dirichlet/profile/p-conrey.c similarity index 70% rename from acb_dirichlet/profile/p-conrey.c rename to dirichlet/profile/p-conrey.c index 180a1e25..12cc437e 100644 --- a/acb_dirichlet/profile/p-conrey.c +++ b/dirichlet/profile/p-conrey.c @@ -10,7 +10,7 @@ */ #include -#include "acb_dirichlet.h" +#include "dirichlet.h" #include "profiler.h" #define LOG 0 @@ -38,18 +38,18 @@ do_conrey(ulong q1, ulong q2) for (n = 0, q = q1; q <= q2; q++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; + dirichlet_group_t G; + dirichlet_conrey_t x; - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); n++; - for (; acb_dirichlet_conrey_next(x, G) >= 0; n++); - acb_dirichlet_conrey_clear(x); - acb_dirichlet_group_clear(G); + for (; dirichlet_conrey_next(x, G) >= 0; n++); + dirichlet_conrey_clear(x); + dirichlet_group_clear(G); } return n; @@ -62,18 +62,18 @@ do_chars(ulong q1, ulong q2) for (n = 0, q = q1; q <= q2; q++) { - acb_dirichlet_group_t G; - acb_dirichlet_char_t chi; + dirichlet_group_t G; + dirichlet_char_t chi; - acb_dirichlet_group_init(G, q); - acb_dirichlet_char_init(chi, G); + dirichlet_group_init(G, q); + dirichlet_char_init(chi, G); - acb_dirichlet_char_one(chi, G); + dirichlet_char_one(chi, G); n++; - for (; acb_dirichlet_char_next(chi, G) >= 0; n++); + for (; dirichlet_char_next(chi, G) >= 0; n++); - acb_dirichlet_char_clear(chi); - acb_dirichlet_group_clear(G); + dirichlet_char_clear(chi); + dirichlet_group_clear(G); } return n; @@ -86,8 +86,8 @@ do_gcdpluscond(ulong q1, ulong q2) for (n = 0, q = q1; q <= q2; q++) { - acb_dirichlet_group_t G; - acb_dirichlet_group_init(G, q); + dirichlet_group_t G; + dirichlet_group_init(G, q); for (k = 1; k < q; k++) { @@ -100,11 +100,11 @@ do_gcdpluscond(ulong q1, ulong q2) break; if (i == G->num) - acb_dirichlet_ui_conductor(G, k); + dirichlet_ui_conductor(G, k); } n += G->phi_q; - acb_dirichlet_group_clear(G); + dirichlet_group_clear(G); } @@ -118,20 +118,20 @@ do_conreypluscond(ulong q1, ulong q2) for (n = 0, q = q1; q <= q2; q++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; + dirichlet_group_t G; + dirichlet_conrey_t x; - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); n++; - for (; acb_dirichlet_conrey_next(x, G) >= 0; n++) - acb_dirichlet_conrey_conductor(G, x); + for (; dirichlet_conrey_next(x, G) >= 0; n++) + dirichlet_conrey_conductor(G, x); - acb_dirichlet_conrey_clear(x); - acb_dirichlet_group_clear(G); + dirichlet_conrey_clear(x); + dirichlet_group_clear(G); } @@ -145,20 +145,20 @@ do_conreyplusorder(ulong q1, ulong q2) for (n = 0, q = q1; q <= q2; q++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; + dirichlet_group_t G; + dirichlet_conrey_t x; - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); n++; - for (; acb_dirichlet_conrey_next(x, G) >= 0; n++) - acb_dirichlet_conrey_order(G, x); + for (; dirichlet_conrey_next(x, G) >= 0; n++) + dirichlet_conrey_order(G, x); - acb_dirichlet_conrey_clear(x); - acb_dirichlet_group_clear(G); + dirichlet_conrey_clear(x); + dirichlet_group_clear(G); } diff --git a/acb_dirichlet/test/t-chars.c b/dirichlet/test/t-chars.c similarity index 64% rename from acb_dirichlet/test/t-chars.c rename to dirichlet/test/t-chars.c index a650aa95..d2a79a30 100644 --- a/acb_dirichlet/test/t-chars.c +++ b/dirichlet/test/t-chars.c @@ -9,7 +9,7 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int main() { @@ -24,19 +24,19 @@ int main() for (iter = 0; iter < 50; iter++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x; - acb_dirichlet_char_t chi, chi2; + dirichlet_group_t G; + dirichlet_conrey_t x; + dirichlet_char_t chi, chi2; ulong q, iter2; q = 2 + n_randint(state, 1 << bits); - acb_dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_char_init(chi, G); - acb_dirichlet_char_init(chi2, G); + dirichlet_group_init(G, q); + dirichlet_conrey_init(x, G); + dirichlet_char_init(chi, G); + dirichlet_char_init(chi2, G); - acb_dirichlet_group_dlog_precompute(G, 50); + dirichlet_group_dlog_precompute(G, 50); /* check number char properties */ for (iter2 = 0; iter2 < 100; iter2++) @@ -49,23 +49,23 @@ int main() m = n_randint(state, q); while (n_gcd(q, m) > 1); - acb_dirichlet_char(chi, G, m); - acb_dirichlet_conrey_log(x, G, m); - acb_dirichlet_char_conrey(chi2, G, x); + dirichlet_char(chi, G, m); + dirichlet_conrey_log(x, G, m); + dirichlet_char_conrey(chi2, G, x); - if (!acb_dirichlet_char_eq_deep(G, chi, chi2)) + if (!dirichlet_char_eq_deep(G, chi, chi2)) { flint_printf("FAIL: init char\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("m = %wu\n\n", m); - acb_dirichlet_char_print(G, chi); + dirichlet_char_print(G, chi); flint_printf("\n"); - acb_dirichlet_char_print(G, chi2); + dirichlet_char_print(G, chi2); flint_printf("\n"); abort(); } - order = acb_dirichlet_ui_order(G, m); + order = dirichlet_ui_order(G, m); if (order != chi->order.n) { flint_printf("FAIL: order\n\n"); @@ -76,7 +76,7 @@ int main() abort(); } - cond = acb_dirichlet_ui_conductor(G, m); + cond = dirichlet_ui_conductor(G, m); if (cond != chi->conductor) { flint_printf("FAIL: conductor\n\n"); @@ -87,17 +87,17 @@ int main() abort(); } - par = acb_dirichlet_ui_parity(G, m); - chim1 = acb_dirichlet_ui_chi(G, chi, q - 1); - if (acb_dirichlet_char_parity(chi) != par || par != (chim1 != 0)) + par = dirichlet_ui_parity(G, m); + chim1 = dirichlet_ui_chi(G, chi, q - 1); + if (dirichlet_char_parity(chi) != par || par != (chim1 != 0)) { flint_printf("FAIL: parity\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("m = %wu\n\n", m); flint_printf("chi(-1) = %wu\n\n", chim1); - flint_printf("char_parity = %d", acb_dirichlet_char_parity(chi)); + flint_printf("char_parity = %d", dirichlet_char_parity(chi)); flint_printf("parity_ui = %d", par); - acb_dirichlet_char_print(G, chi); + dirichlet_char_print(G, chi); abort(); } @@ -105,10 +105,10 @@ int main() n = n_randint(state, q); while (n_gcd(q, n) > 1); - acb_dirichlet_char(chi2, G, n); - pairing = acb_dirichlet_ui_pairing(G, m, n); - cn = acb_dirichlet_ui_chi(G, chi, n) * (G->expo / chi->order.n); - cm = acb_dirichlet_ui_chi(G, chi2, m) * (G->expo / chi2->order.n); + dirichlet_char(chi2, G, n); + pairing = dirichlet_ui_pairing(G, m, n); + cn = dirichlet_ui_chi(G, chi, n) * (G->expo / chi->order.n); + cm = dirichlet_ui_chi(G, chi2, m) * (G->expo / chi2->order.n); if (pairing != cn || pairing != cm) { @@ -122,30 +122,30 @@ int main() abort(); } - acb_dirichlet_conrey_next(x, G); - acb_dirichlet_char_next(chi, G); - acb_dirichlet_char_conrey(chi2, G, x); + dirichlet_conrey_next(x, G); + dirichlet_char_next(chi, G); + dirichlet_char_conrey(chi2, G, x); - if (!acb_dirichlet_char_eq_deep(G, chi, chi2)) + if (!dirichlet_char_eq_deep(G, chi, chi2)) { flint_printf("FAIL: next char\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("m = %wu\n\n", m); - acb_dirichlet_char_print(G, chi); + dirichlet_char_print(G, chi); flint_printf("\n"); - acb_dirichlet_char_print(G, chi2); + dirichlet_char_print(G, chi2); flint_printf("\n"); abort(); } } - acb_dirichlet_group_dlog_clear(G); + dirichlet_group_dlog_clear(G); - acb_dirichlet_char_clear(chi); - acb_dirichlet_char_clear(chi2); - acb_dirichlet_conrey_clear(x); - acb_dirichlet_group_clear(G); + dirichlet_char_clear(chi); + dirichlet_char_clear(chi2); + dirichlet_conrey_clear(x); + dirichlet_group_clear(G); } } diff --git a/acb_dirichlet/test/t-conrey.c b/dirichlet/test/t-conrey.c similarity index 74% rename from acb_dirichlet/test/t-conrey.c rename to dirichlet/test/t-conrey.c index b64b314a..525d7c00 100644 --- a/acb_dirichlet/test/t-conrey.c +++ b/dirichlet/test/t-conrey.c @@ -9,7 +9,7 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int main() { @@ -22,23 +22,23 @@ int main() for (iter = 0; iter < 3000 * arb_test_multiplier(); iter++) { - acb_dirichlet_group_t G; - acb_dirichlet_conrey_t x, y; + dirichlet_group_t G; + dirichlet_conrey_t x, y; ulong q, n, k, sum; slong ref; q = 1 + n_randint(state, 1000 * (1 + iter / 100)); - acb_dirichlet_group_init(G, q); + dirichlet_group_init(G, q); - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_init(y, G); + dirichlet_conrey_init(x, G); + dirichlet_conrey_init(y, G); /* check group size and elements */ - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_one(x, G); sum = 1; - for (n = 1; acb_dirichlet_conrey_next(x, G) >= 0; n++) + for (n = 1; dirichlet_conrey_next(x, G) >= 0; n++) sum += x->n * x->n; if (FLINT_BITS == 64 || q < 1024) @@ -70,10 +70,10 @@ int main() if (q % 4 != 2) { - acb_dirichlet_conrey_first_primitive(x, G); - for (n = 1; acb_dirichlet_conrey_next_primitive(x, G) >= 0; n++); + dirichlet_conrey_first_primitive(x, G); + for (n = 1; dirichlet_conrey_next_primitive(x, G) >= 0; n++); - ref = acb_dirichlet_number_primitive(G); + ref = dirichlet_number_primitive(G); if (n != ref) { flint_printf("FAIL: number of primitive elements\n\n"); @@ -90,15 +90,15 @@ int main() ulong m; for (m = 1; n_gcd(m, q) > 1; m = n_randint(state, q)); - acb_dirichlet_conrey_log(x, G, m); + dirichlet_conrey_log(x, G, m); - if (m != acb_dirichlet_conrey_exp(x, G)) + if (m != dirichlet_conrey_exp(x, G)) { flint_printf("FAIL: conrey log and exp\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("m = %wu\n\n", m); flint_printf("conrey = "); - acb_dirichlet_conrey_print(G, x); + dirichlet_conrey_print(G, x); flint_printf("\n\nnumber = %wu\n\n", x->n); abort(); } @@ -106,34 +106,34 @@ int main() for (k = 0; k < G->num; k++) x->log[k] = n_randint(state, G->P[k].phi); - m = acb_dirichlet_conrey_exp(x, G); - acb_dirichlet_conrey_log(y, G, m); + m = dirichlet_conrey_exp(x, G); + dirichlet_conrey_log(y, G, m); - if (!acb_dirichlet_conrey_eq_deep(G, x, y)) + if (!dirichlet_conrey_eq_deep(G, x, y)) { flint_printf("FAIL: conrey exp and log\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("conrey = "); - acb_dirichlet_conrey_print(G, x); + dirichlet_conrey_print(G, x); flint_printf("\n\nm = %wu\n\n", m); flint_printf("log = "); - acb_dirichlet_conrey_print(G, y); + dirichlet_conrey_print(G, y); flint_printf("\n\nnumber = %wu\n\n", y->n); abort(); } - acb_dirichlet_conrey_next_primitive(x, G); + dirichlet_conrey_next_primitive(x, G); m = x->n; - if (m != acb_dirichlet_conrey_exp(x, G)) + if (m != dirichlet_conrey_exp(x, G)) { flint_printf("FAIL: conrey number next primitive\n\n"); flint_printf("q = %wu\n\n", q); flint_printf("conrey = "); - acb_dirichlet_conrey_print(G, y); + dirichlet_conrey_print(G, y); flint_printf(", m = %wu\n\n", y->n); flint_printf("next primitive = "); - acb_dirichlet_conrey_print(G, x); + dirichlet_conrey_print(G, x); flint_printf(", m = %wu\n\n", m); flint_printf("exp = %wu\n\n", x->n); abort(); @@ -141,9 +141,9 @@ int main() } } - acb_dirichlet_conrey_clear(x); - acb_dirichlet_conrey_clear(y); - acb_dirichlet_group_clear(G); + dirichlet_conrey_clear(x); + dirichlet_conrey_clear(y); + dirichlet_group_clear(G); } flint_randclear(state); diff --git a/acb_dirichlet/ui_chi.c b/dirichlet/ui_chi.c similarity index 56% rename from acb_dirichlet/ui_chi.c rename to dirichlet/ui_chi.c index cc502e9c..8166a0f1 100644 --- a/acb_dirichlet/ui_chi.c +++ b/dirichlet/ui_chi.c @@ -9,25 +9,25 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_ui_chi(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, ulong n) +dirichlet_ui_chi(const dirichlet_group_t G, const dirichlet_char_t chi, ulong n) { if (n_gcd(G->q, n) > 1) { - return ACB_DIRICHLET_CHI_NULL; + return DIRICHLET_CHI_NULL; } else { ulong v; - acb_dirichlet_conrey_t x; - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_log(x, G, n); + dirichlet_conrey_t x; + dirichlet_conrey_init(x, G); + dirichlet_conrey_log(x, G, n); - v = acb_dirichlet_ui_chi_conrey(G, chi, x); + v = dirichlet_ui_chi_conrey(G, chi, x); - acb_dirichlet_conrey_clear(x); + dirichlet_conrey_clear(x); return v; } } diff --git a/acb_dirichlet/ui_chi_conrey.c b/dirichlet/ui_chi_conrey.c similarity index 79% rename from acb_dirichlet/ui_chi_conrey.c rename to dirichlet/ui_chi_conrey.c index 5f67b9a8..37af059b 100644 --- a/acb_dirichlet/ui_chi_conrey.c +++ b/dirichlet/ui_chi_conrey.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_ui_chi_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, const acb_dirichlet_conrey_t x) +dirichlet_ui_chi_conrey(const dirichlet_group_t G, const dirichlet_char_t chi, const dirichlet_conrey_t x) { ulong v = 0, k; diff --git a/acb_dirichlet/ui_chi_vec.c b/dirichlet/ui_chi_vec.c similarity index 62% rename from acb_dirichlet/ui_chi_vec.c rename to dirichlet/ui_chi_vec.c index 8578c573..bc16cc75 100644 --- a/acb_dirichlet/ui_chi_vec.c +++ b/dirichlet/ui_chi_vec.c @@ -9,13 +9,13 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_ui_chi_vec(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv) +dirichlet_ui_chi_vec(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv) { if (2 * nv > G->q) - acb_dirichlet_ui_chi_vec_loop(v, G, chi, nv); + dirichlet_ui_chi_vec_loop(v, G, chi, nv); else - acb_dirichlet_ui_chi_vec_primeloop(v, G, chi, nv); + dirichlet_ui_chi_vec_primeloop(v, G, chi, nv); } diff --git a/acb_dirichlet/ui_chi_vec_loop.c b/dirichlet/ui_chi_vec_loop.c similarity index 66% rename from acb_dirichlet/ui_chi_vec_loop.c rename to dirichlet/ui_chi_vec_loop.c index 303b069f..2e71d6fd 100644 --- a/acb_dirichlet/ui_chi_vec_loop.c +++ b/dirichlet/ui_chi_vec_loop.c @@ -9,25 +9,25 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" /* loop over whole group */ void -acb_dirichlet_ui_chi_vec_loop(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv) +dirichlet_ui_chi_vec_loop(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv) { int j; ulong t; slong k; - acb_dirichlet_conrey_t x; - acb_dirichlet_conrey_init(x, G); - acb_dirichlet_conrey_one(x, G); + dirichlet_conrey_t x; + dirichlet_conrey_init(x, G); + dirichlet_conrey_one(x, G); for (k = 0; k < nv; k++) - v[k] = ACB_DIRICHLET_CHI_NULL; + v[k] = DIRICHLET_CHI_NULL; t = v[1] = 0; - while ( (j = acb_dirichlet_conrey_next(x, G)) >= 0 ) + while ( (j = dirichlet_conrey_next(x, G)) >= 0 ) { /* exponents were modified up to j */ for (k = G->num - 1; k >= j; k--) @@ -38,11 +38,11 @@ acb_dirichlet_ui_chi_vec_loop(ulong *v, const acb_dirichlet_group_t G, const acb } /* fix result outside primes */ - /* acb_dirichlet_vec_set_null(v, G, nv);*/ + /* dirichlet_vec_set_null(v, G, nv);*/ /* copy outside modulus */ for (k = G->q; k < nv ; k++ ) v[k] = v[k - G->q]; - acb_dirichlet_conrey_clear(x); + dirichlet_conrey_clear(x); } diff --git a/acb_dirichlet/ui_chi_vec_primeloop.c b/dirichlet/ui_chi_vec_primeloop.c similarity index 81% rename from acb_dirichlet/ui_chi_vec_primeloop.c rename to dirichlet/ui_chi_vec_primeloop.c index 7e1311da..2d415537 100644 --- a/acb_dirichlet/ui_chi_vec_primeloop.c +++ b/dirichlet/ui_chi_vec_primeloop.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" static void -chi_vec_evenpart(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv) +chi_vec_evenpart(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv) { ulong c3, c4, x; @@ -47,7 +47,7 @@ chi_vec_evenpart(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_ch /* loop over primary components */ void -acb_dirichlet_ui_chi_vec_primeloop(ulong *v, const acb_dirichlet_group_t G, const acb_dirichlet_char_t chi, slong nv) +dirichlet_ui_chi_vec_primeloop(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv) { slong k, l; @@ -59,7 +59,7 @@ acb_dirichlet_ui_chi_vec_primeloop(ulong *v, const acb_dirichlet_group_t G, cons for (l = G->neven; l < G->num; l++) { - acb_dirichlet_prime_group_struct P = G->P[l]; + dirichlet_prime_group_struct P = G->P[l]; /* FIXME: there may be some precomputed dlog in P if needed */ if (P.dlog == NULL) @@ -68,5 +68,5 @@ acb_dirichlet_ui_chi_vec_primeloop(ulong *v, const acb_dirichlet_group_t G, cons dlog_vec_add_precomp(v, nv, P.dlog, P.g, chi->expo[l], P.pe, P.phi, chi->order); } - acb_dirichlet_ui_vec_set_null(v, G, nv); + dirichlet_ui_vec_set_null(v, G, nv); } diff --git a/acb_dirichlet/ui_conductor.c b/dirichlet/ui_conductor.c similarity index 91% rename from acb_dirichlet/ui_conductor.c rename to dirichlet/ui_conductor.c index e5069798..4c2d1295 100644 --- a/acb_dirichlet/ui_conductor.c +++ b/dirichlet/ui_conductor.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_ui_conductor(const acb_dirichlet_group_t G, ulong a) +dirichlet_ui_conductor(const dirichlet_group_t G, ulong a) { slong k; ulong ap, cond; diff --git a/acb_dirichlet/ui_order.c b/dirichlet/ui_order.c similarity index 91% rename from acb_dirichlet/ui_order.c rename to dirichlet/ui_order.c index b162d232..6c58db89 100644 --- a/acb_dirichlet/ui_order.c +++ b/dirichlet/ui_order.c @@ -9,7 +9,7 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" /* order of an element knowing the factorization of a multiple */ ulong @@ -31,7 +31,7 @@ nmod_order_precomp(ulong a, nmod_t mod, ulong expo, n_factor_t fac) } ulong -acb_dirichlet_ui_order(const acb_dirichlet_group_t G, ulong a) +dirichlet_ui_order(const dirichlet_group_t G, ulong a) { n_factor_t fac; diff --git a/acb_dirichlet/ui_pairing.c b/dirichlet/ui_pairing.c similarity index 51% rename from acb_dirichlet/ui_pairing.c rename to dirichlet/ui_pairing.c index 235325e9..e6d21baf 100644 --- a/acb_dirichlet/ui_pairing.c +++ b/dirichlet/ui_pairing.c @@ -9,26 +9,26 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" ulong -acb_dirichlet_ui_pairing(const acb_dirichlet_group_t G, ulong m, ulong n) +dirichlet_ui_pairing(const dirichlet_group_t G, ulong m, ulong n) { ulong x; - acb_dirichlet_conrey_t a, b; + dirichlet_conrey_t a, b; if (n_gcd(G->q, m) > 1 || n_gcd(G->q, n) > 1) - return ACB_DIRICHLET_CHI_NULL; + return DIRICHLET_CHI_NULL; - acb_dirichlet_conrey_init(a, G); - acb_dirichlet_conrey_init(b, G); - acb_dirichlet_conrey_log(a, G, m); - acb_dirichlet_conrey_log(b, G, n); + dirichlet_conrey_init(a, G); + dirichlet_conrey_init(b, G); + dirichlet_conrey_log(a, G, m); + dirichlet_conrey_log(b, G, n); - x = acb_dirichlet_ui_pairing_conrey(G, a, b); + x = dirichlet_ui_pairing_conrey(G, a, b); - acb_dirichlet_conrey_clear(a); - acb_dirichlet_conrey_clear(b); + dirichlet_conrey_clear(a); + dirichlet_conrey_clear(b); return x; } diff --git a/acb_dirichlet/ui_pairing_conrey.c b/dirichlet/ui_pairing_conrey.c similarity index 81% rename from acb_dirichlet/ui_pairing_conrey.c rename to dirichlet/ui_pairing_conrey.c index 9063bea0..cd6638e7 100644 --- a/acb_dirichlet/ui_pairing_conrey.c +++ b/dirichlet/ui_pairing_conrey.c @@ -11,12 +11,12 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" /* todo: modular arithmetic */ ulong -acb_dirichlet_ui_pairing_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t a, const acb_dirichlet_conrey_t b) +dirichlet_ui_pairing_conrey(const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b) { ulong x, k; x = 0; diff --git a/acb_dirichlet/ui_parity.c b/dirichlet/ui_parity.c similarity index 85% rename from acb_dirichlet/ui_parity.c rename to dirichlet/ui_parity.c index aa5a2a4c..6312dc81 100644 --- a/acb_dirichlet/ui_parity.c +++ b/dirichlet/ui_parity.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" int -acb_dirichlet_ui_parity(const acb_dirichlet_group_t G, ulong a) +dirichlet_ui_parity(const dirichlet_group_t G, ulong a) { int par; diff --git a/acb_dirichlet/ui_vec_set_null.c b/dirichlet/ui_vec_set_null.c similarity index 80% rename from acb_dirichlet/ui_vec_set_null.c rename to dirichlet/ui_vec_set_null.c index baf2333c..834a5c0b 100644 --- a/acb_dirichlet/ui_vec_set_null.c +++ b/dirichlet/ui_vec_set_null.c @@ -9,10 +9,10 @@ (at your option) any later version. See . */ -#include "acb_dirichlet.h" +#include "dirichlet.h" void -acb_dirichlet_ui_vec_set_null(ulong *v, const acb_dirichlet_group_t G, slong nv) +dirichlet_ui_vec_set_null(ulong *v, const dirichlet_group_t G, slong nv) { slong k, l; if (G->q_even > 1) @@ -26,6 +26,6 @@ acb_dirichlet_ui_vec_set_null(ulong *v, const acb_dirichlet_group_t G, slong nv) ulong p = G->P[l].p; for (k = p; k < nv; k += p) - v[k] = ACB_DIRICHLET_CHI_NULL; + v[k] = DIRICHLET_CHI_NULL; } }