mirror of
https://github.com/vale981/arb
synced 2025-03-05 09:21:38 -05:00
switch conrey->char->fullchar
This commit is contained in:
parent
6d9c036783
commit
e29ca5d50e
38 changed files with 145 additions and 148 deletions
113
dirichlet.h
113
dirichlet.h
|
@ -18,7 +18,6 @@
|
|||
#define DIRICHLET_INLINE static __inline__
|
||||
#endif
|
||||
|
||||
#include "acb.h"
|
||||
#include "dlog.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -74,22 +73,22 @@ 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 */
|
||||
/* characters, keep both number and log */
|
||||
typedef struct
|
||||
{
|
||||
ulong n; /* number */
|
||||
ulong * log; /* s.t. prod generators[k]^log[k] = number */
|
||||
}
|
||||
dirichlet_conrey_struct;
|
||||
dirichlet_char_struct;
|
||||
|
||||
typedef dirichlet_conrey_struct dirichlet_conrey_t[1];
|
||||
typedef dirichlet_char_struct dirichlet_char_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);
|
||||
void dirichlet_char_init(dirichlet_char_t x, const dirichlet_group_t G);
|
||||
void dirichlet_char_clear(dirichlet_char_t x);
|
||||
void dirichlet_char_print(const dirichlet_group_t G, const dirichlet_char_t x);
|
||||
|
||||
DIRICHLET_INLINE void
|
||||
dirichlet_conrey_set(dirichlet_conrey_t x, const dirichlet_group_t G, const dirichlet_conrey_t y)
|
||||
dirichlet_char_set(dirichlet_char_t x, const dirichlet_group_t G, const dirichlet_char_t y)
|
||||
{
|
||||
slong k;
|
||||
x->n = y->n;
|
||||
|
@ -98,38 +97,38 @@ dirichlet_conrey_set(dirichlet_conrey_t x, const dirichlet_group_t G, const diri
|
|||
}
|
||||
|
||||
DIRICHLET_INLINE int
|
||||
dirichlet_conrey_eq(const dirichlet_conrey_t x, const dirichlet_conrey_t y)
|
||||
dirichlet_char_eq(const dirichlet_char_t x, const dirichlet_char_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);
|
||||
int dirichlet_char_eq_deep(const dirichlet_group_t G, const dirichlet_char_t x, const dirichlet_char_t y);
|
||||
int dirichlet_char_parity(const dirichlet_group_t G, const dirichlet_char_t x);
|
||||
ulong dirichlet_char_conductor(const dirichlet_group_t G, const dirichlet_char_t x);
|
||||
ulong dirichlet_char_order(const dirichlet_group_t G, const dirichlet_char_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_char_log(dirichlet_char_t x, const dirichlet_group_t G, ulong m);
|
||||
ulong dirichlet_char_exp(dirichlet_char_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_char_index(dirichlet_char_t x, const dirichlet_group_t G, ulong j);
|
||||
ulong dirichlet_index_char(const dirichlet_group_t G, const dirichlet_char_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);
|
||||
void dirichlet_char_one(dirichlet_char_t x, const dirichlet_group_t G);
|
||||
void dirichlet_char_first_primitive(dirichlet_char_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);
|
||||
int dirichlet_char_next(dirichlet_char_t x, const dirichlet_group_t G);
|
||||
int dirichlet_char_next_primitive(dirichlet_char_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);
|
||||
void dirichlet_char_mul(dirichlet_char_t c, const dirichlet_group_t G, const dirichlet_char_t a, const dirichlet_char_t b);
|
||||
void dirichlet_char_pow(dirichlet_char_t c, const dirichlet_group_t G, const dirichlet_char_t a, ulong n);
|
||||
void dirichlet_char_primitive(dirichlet_char_t y, const dirichlet_group_t G, const dirichlet_char_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_char(const dirichlet_group_t G, const dirichlet_char_t a, const dirichlet_char_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_char(acb_t res, const dirichlet_group_t G, const dirichlet_char_t a, const dirichlet_char_t b, slong prec);
|
||||
void dirichlet_pairing(acb_t res, const dirichlet_group_t G, ulong m, ulong n, slong prec);
|
||||
|
||||
/* introducing character type */
|
||||
|
@ -139,39 +138,39 @@ typedef struct
|
|||
{
|
||||
ulong q; /* modulus */
|
||||
nmod_t order; /* order */
|
||||
dirichlet_conrey_t x;
|
||||
dirichlet_char_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;
|
||||
dirichlet_fullchar_struct;
|
||||
|
||||
typedef dirichlet_char_struct dirichlet_char_t[1];
|
||||
typedef dirichlet_fullchar_struct dirichlet_fullchar_t[1];
|
||||
|
||||
DIRICHLET_INLINE ulong
|
||||
dirichlet_char_order(const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_order(const dirichlet_fullchar_t chi)
|
||||
{
|
||||
return chi->order.n;
|
||||
}
|
||||
|
||||
DIRICHLET_INLINE ulong
|
||||
dirichlet_char_conductor(const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_conductor(const dirichlet_fullchar_t chi)
|
||||
{
|
||||
return chi->conductor;
|
||||
}
|
||||
|
||||
DIRICHLET_INLINE int
|
||||
dirichlet_char_parity(const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_parity(const dirichlet_fullchar_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);
|
||||
void dirichlet_fullchar_init(dirichlet_fullchar_t chi, const dirichlet_group_t G);
|
||||
void dirichlet_fullchar_clear(dirichlet_fullchar_t chi);
|
||||
void dirichlet_fullchar_print(const dirichlet_group_t G, const dirichlet_fullchar_t chi);
|
||||
|
||||
DIRICHLET_INLINE void
|
||||
dirichlet_char_set(dirichlet_char_t chi1, const dirichlet_group_t G, const dirichlet_char_t chi2)
|
||||
dirichlet_fullchar_set(dirichlet_fullchar_t chi1, const dirichlet_group_t G, const dirichlet_fullchar_t chi2)
|
||||
{
|
||||
slong k;
|
||||
|
||||
|
@ -179,51 +178,51 @@ dirichlet_char_set(dirichlet_char_t chi1, const dirichlet_group_t G, const diric
|
|||
chi1->conductor = chi2->conductor;
|
||||
chi1->order = chi2->order;
|
||||
chi1->parity = chi2->parity;
|
||||
dirichlet_conrey_set(chi1->x, G, chi2->x);
|
||||
dirichlet_char_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)
|
||||
dirichlet_fullchar_eq(const dirichlet_fullchar_t chi1, const dirichlet_fullchar_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);
|
||||
int dirichlet_fullchar_eq_deep(const dirichlet_group_t G, const dirichlet_fullchar_t chi1, const dirichlet_fullchar_t chi2);
|
||||
DIRICHLET_INLINE int
|
||||
dirichlet_char_is_principal(const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_is_principal(const dirichlet_fullchar_t chi)
|
||||
{
|
||||
return (chi->x->n == 1);
|
||||
}
|
||||
DIRICHLET_INLINE int
|
||||
dirichlet_char_is_real(const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_is_real(const dirichlet_fullchar_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_fullchar(dirichlet_fullchar_t chi, const dirichlet_group_t G, ulong n);
|
||||
void dirichlet_fullchar_char(dirichlet_fullchar_t chi, const dirichlet_group_t G, const dirichlet_char_t x);
|
||||
void dirichlet_fullchar_set_expo(dirichlet_fullchar_t chi, const dirichlet_group_t G);
|
||||
void dirichlet_fullchar_normalize(dirichlet_fullchar_t chi, const dirichlet_group_t G);
|
||||
void dirichlet_fullchar_denormalize(dirichlet_fullchar_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_fullchar_mul(dirichlet_fullchar_t chi12, const dirichlet_group_t G, const dirichlet_fullchar_t chi1, const dirichlet_fullchar_t chi2);
|
||||
void dirichlet_fullchar_primitive(dirichlet_fullchar_t chi0, const dirichlet_group_t G0, const dirichlet_group_t G, const dirichlet_fullchar_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);
|
||||
void dirichlet_fullchar_one(dirichlet_fullchar_t chi, const dirichlet_group_t G);
|
||||
void dirichlet_fullchar_first_primitive(dirichlet_fullchar_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);
|
||||
int dirichlet_fullchar_next(dirichlet_fullchar_t chi, const dirichlet_group_t G);
|
||||
int dirichlet_fullchar_next_primitive(dirichlet_fullchar_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);
|
||||
ulong dirichlet_ui_chi_char(const dirichlet_group_t G, const dirichlet_fullchar_t chi, const dirichlet_char_t x);
|
||||
ulong dirichlet_ui_chi(const dirichlet_group_t G, const dirichlet_fullchar_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);
|
||||
void dirichlet_ui_chi_vec_loop(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv);
|
||||
void dirichlet_ui_chi_vec_primeloop(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv);
|
||||
void dirichlet_ui_chi_vec(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char(dirichlet_char_t chi, const dirichlet_group_t G, ulong n)
|
||||
dirichlet_fullchar(dirichlet_fullchar_t chi, const dirichlet_group_t G, ulong n)
|
||||
{
|
||||
dirichlet_conrey_log(chi->x, G, n);
|
||||
dirichlet_char_conrey(chi, G, NULL);
|
||||
dirichlet_char_log(chi->x, G, n);
|
||||
dirichlet_fullchar_char(chi, G, NULL);
|
||||
}
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_clear(dirichlet_char_t chi)
|
||||
dirichlet_fullchar_clear(dirichlet_fullchar_t chi)
|
||||
{
|
||||
dirichlet_conrey_clear(chi->x);
|
||||
dirichlet_char_clear(chi->x);
|
||||
flint_free(chi->expo);
|
||||
}
|
||||
|
|
|
@ -14,19 +14,19 @@
|
|||
/* char n has exponents = log[k]*PHI[k] / gcd and order expo / gcd
|
||||
* so that log = expo[k] */
|
||||
void
|
||||
dirichlet_char_conrey(dirichlet_char_t chi, const dirichlet_group_t G, const dirichlet_conrey_t x)
|
||||
dirichlet_fullchar_char(dirichlet_fullchar_t chi, const dirichlet_group_t G, const dirichlet_char_t x)
|
||||
{
|
||||
/* assume chi->x already set if x == NULL */
|
||||
if (x == NULL)
|
||||
x = chi->x;
|
||||
else
|
||||
dirichlet_conrey_set(chi->x, G, x);
|
||||
dirichlet_char_set(chi->x, G, x);
|
||||
|
||||
chi->q = G->q;
|
||||
chi->parity = dirichlet_conrey_parity(G, x);
|
||||
chi->conductor = dirichlet_conrey_conductor(G, x);
|
||||
chi->parity = dirichlet_char_parity(G, x);
|
||||
chi->conductor = dirichlet_char_conductor(G, x);
|
||||
|
||||
dirichlet_char_set_expo(chi, G);
|
||||
dirichlet_fullchar_set_expo(chi, G);
|
||||
/* optional: divide by gcd to obtain true order */
|
||||
dirichlet_char_normalize(chi, G);
|
||||
dirichlet_fullchar_normalize(chi, G);
|
||||
}
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_char_eq_deep(const dirichlet_group_t G, const dirichlet_char_t chi1, const dirichlet_char_t chi2)
|
||||
dirichlet_fullchar_eq_deep(const dirichlet_group_t G, const dirichlet_fullchar_t chi1, const dirichlet_fullchar_t chi2)
|
||||
{
|
||||
dirichlet_conrey_t x, y;
|
||||
dirichlet_char_t x, y;
|
||||
|
||||
if (chi1->q != chi2->q)
|
||||
return 0;
|
||||
|
@ -25,13 +25,13 @@ dirichlet_char_eq_deep(const dirichlet_group_t G, const dirichlet_char_t chi1, c
|
|||
if (chi1->conductor != chi2->conductor)
|
||||
return 0;
|
||||
|
||||
if (!dirichlet_conrey_eq_deep(G, chi1->x, chi2->x))
|
||||
if (!dirichlet_char_eq_deep(G, chi1->x, chi2->x))
|
||||
return 0;
|
||||
|
||||
x->n = y->n = 1;
|
||||
x->log = chi1->expo;
|
||||
y->log = chi2->expo;
|
||||
if (!dirichlet_conrey_eq_deep(G, x, y))
|
||||
if (!dirichlet_char_eq_deep(G, x, y))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_first_primitive(dirichlet_char_t chi, const dirichlet_group_t G)
|
||||
dirichlet_fullchar_first_primitive(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
dirichlet_conrey_first_primitive(chi->x, G);
|
||||
dirichlet_char_conrey(chi, G, NULL);
|
||||
dirichlet_char_normalize(chi, G);
|
||||
dirichlet_char_first_primitive(chi->x, G);
|
||||
dirichlet_fullchar_char(chi, G, NULL);
|
||||
dirichlet_fullchar_normalize(chi, G);
|
||||
}
|
||||
|
|
|
@ -12,10 +12,10 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_init(dirichlet_char_t chi, const dirichlet_group_t G)
|
||||
dirichlet_fullchar_init(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
slong k;
|
||||
dirichlet_conrey_init(chi->x, G);
|
||||
dirichlet_char_init(chi->x, G);
|
||||
chi->expo = flint_malloc(G->num * sizeof(ulong));
|
||||
chi->q = G->q;
|
||||
chi->conductor = 1;
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
#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_fullchar_mul(dirichlet_fullchar_t chi12, const dirichlet_group_t G, const dirichlet_fullchar_t chi1, const dirichlet_fullchar_t chi2)
|
||||
{
|
||||
dirichlet_conrey_mul(chi12->x, G, chi1->x, chi2->x);
|
||||
dirichlet_char_conrey(chi12, G, NULL);
|
||||
dirichlet_char_mul(chi12->x, G, chi1->x, chi2->x);
|
||||
dirichlet_fullchar_char(chi12, G, NULL);
|
||||
}
|
||||
|
|
|
@ -12,11 +12,11 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_char_next(dirichlet_char_t chi, const dirichlet_group_t G)
|
||||
dirichlet_fullchar_next(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
int k;
|
||||
k = dirichlet_conrey_next(chi->x, G);
|
||||
dirichlet_char_conrey(chi, G, NULL);
|
||||
k = dirichlet_char_next(chi->x, G);
|
||||
dirichlet_fullchar_char(chi, G, NULL);
|
||||
/* return last index modified */
|
||||
return k;
|
||||
}
|
||||
|
|
|
@ -12,11 +12,11 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_char_next_primitive(dirichlet_char_t chi, const dirichlet_group_t G)
|
||||
dirichlet_fullchar_next_primitive(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
int k;
|
||||
k = dirichlet_conrey_next_primitive(chi->x, G);
|
||||
dirichlet_char_conrey(chi, G, NULL);
|
||||
k = dirichlet_char_next_primitive(chi->x, G);
|
||||
dirichlet_fullchar_char(chi, G, NULL);
|
||||
/* return last index modified */
|
||||
return k;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_set_expo(dirichlet_char_t chi, const dirichlet_group_t G)
|
||||
dirichlet_fullchar_set_expo(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
slong k;
|
||||
for (k = 0; k < G->num; k++)
|
||||
|
@ -21,7 +21,7 @@ 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)
|
||||
dirichlet_fullchar_normalize(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
ulong k, g;
|
||||
g = G->expo;
|
||||
|
@ -36,7 +36,7 @@ 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)
|
||||
dirichlet_fullchar_denormalize(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
ulong k, g;
|
||||
g = G->expo / chi->order.n;
|
||||
|
|
|
@ -12,10 +12,10 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_one(dirichlet_char_t chi, const dirichlet_group_t G)
|
||||
dirichlet_fullchar_one(dirichlet_fullchar_t chi, const dirichlet_group_t G)
|
||||
{
|
||||
slong k;
|
||||
dirichlet_conrey_one(chi->x, G);
|
||||
dirichlet_char_one(chi->x, G);
|
||||
chi->q = G->q;
|
||||
chi->conductor = 1;
|
||||
chi->parity = 0;
|
||||
|
|
|
@ -12,13 +12,13 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_primitive(dirichlet_char_t chi0, const dirichlet_group_t G0, const dirichlet_group_t G, const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_primitive(dirichlet_fullchar_t chi0, const dirichlet_group_t G0, const dirichlet_group_t G, const dirichlet_fullchar_t chi)
|
||||
{
|
||||
chi0->q = chi->conductor;
|
||||
chi0->parity = chi->parity;
|
||||
chi0->conductor = chi->conductor;
|
||||
dirichlet_conrey_primitive(chi0->x, G, chi->x, chi->conductor);
|
||||
dirichlet_char_set_expo(chi0, G0);
|
||||
dirichlet_char_primitive(chi0->x, G, chi->x, chi->conductor);
|
||||
dirichlet_fullchar_set_expo(chi0, G0);
|
||||
/* optional: divide by gcd to obtain true order */
|
||||
dirichlet_char_normalize(chi0, G0);
|
||||
dirichlet_fullchar_normalize(chi0, G0);
|
||||
}
|
||||
|
|
|
@ -12,12 +12,12 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_char_print(const dirichlet_group_t G, const dirichlet_char_t chi)
|
||||
dirichlet_fullchar_print(const dirichlet_group_t G, const dirichlet_fullchar_t chi)
|
||||
{
|
||||
dirichlet_conrey_t x;
|
||||
dirichlet_char_t x;
|
||||
flint_printf("chi_%wu(%wu,.) of order %wu, parity %wd, index ", G->q, chi->x->n, chi->order, chi->parity);
|
||||
dirichlet_conrey_print(G, chi->x);
|
||||
dirichlet_char_print(G, chi->x);
|
||||
flint_printf(" and exponents ");
|
||||
x->log = chi->expo;
|
||||
dirichlet_conrey_print(G, x);
|
||||
dirichlet_char_print(G, x);
|
||||
}
|
||||
|
|
|
@ -12,12 +12,12 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_init(dirichlet_conrey_t x, const dirichlet_group_t G) {
|
||||
dirichlet_char_init(dirichlet_char_t x, const dirichlet_group_t G) {
|
||||
x->log = flint_malloc(G->num * sizeof(ulong));
|
||||
dirichlet_conrey_one(x, G);
|
||||
dirichlet_char_one(x, G);
|
||||
}
|
||||
|
||||
void
|
||||
dirichlet_conrey_clear(dirichlet_conrey_t x) {
|
||||
dirichlet_char_clear(dirichlet_char_t x) {
|
||||
flint_free(x->log);
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
ulong
|
||||
dirichlet_conrey_conductor(const dirichlet_group_t G, const dirichlet_conrey_t x)
|
||||
dirichlet_char_conductor(const dirichlet_group_t G, const dirichlet_char_t x)
|
||||
{
|
||||
int k, f;
|
||||
ulong cond = 1;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_conrey_eq_deep(const dirichlet_group_t G, const dirichlet_conrey_t x, const dirichlet_conrey_t y)
|
||||
dirichlet_char_eq_deep(const dirichlet_group_t G, const dirichlet_char_t x, const dirichlet_char_t y)
|
||||
{
|
||||
slong k;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
ulong
|
||||
dirichlet_conrey_exp(dirichlet_conrey_t x, const dirichlet_group_t G)
|
||||
dirichlet_char_exp(dirichlet_char_t x, const dirichlet_group_t G)
|
||||
{
|
||||
ulong k, n = 1;
|
||||
for (k = 0; k < G->num; k++)
|
||||
|
|
|
@ -12,12 +12,12 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_first_primitive(dirichlet_conrey_t x, const dirichlet_group_t G)
|
||||
dirichlet_char_first_primitive(dirichlet_char_t x, const dirichlet_group_t G)
|
||||
{
|
||||
ulong k;
|
||||
if (G->q % 4 == 2)
|
||||
{
|
||||
flint_printf("Exception (dirichlet_conrey_first_primitive). No primitive element mod %wu.\n",G->q);
|
||||
flint_printf("Exception (dirichlet_char_first_primitive). No primitive element mod %wu.\n",G->q);
|
||||
abort();
|
||||
}
|
||||
x->n = 1;
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_index(dirichlet_conrey_t x, const dirichlet_group_t G, ulong j)
|
||||
dirichlet_char_index(dirichlet_char_t x, const dirichlet_group_t G, ulong j)
|
||||
{
|
||||
slong k;
|
||||
|
||||
|
@ -36,5 +36,5 @@ dirichlet_conrey_index(dirichlet_conrey_t x, const dirichlet_group_t G, ulong j)
|
|||
j = j / G->P[k].phi;
|
||||
}
|
||||
|
||||
dirichlet_conrey_exp(x, G);
|
||||
dirichlet_char_exp(x, G);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
/* assume m is invertible */
|
||||
void
|
||||
dirichlet_conrey_log(dirichlet_conrey_t x, const dirichlet_group_t G, ulong m)
|
||||
dirichlet_char_log(dirichlet_char_t x, const dirichlet_group_t G, ulong m)
|
||||
{
|
||||
slong k;
|
||||
/* even part */
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_mul(dirichlet_conrey_t c, const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b)
|
||||
dirichlet_char_mul(dirichlet_char_t c, const dirichlet_group_t G, const dirichlet_char_t a, const dirichlet_char_t b)
|
||||
{
|
||||
ulong k;
|
||||
for (k = 0; k < G->num ; k++)
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_conrey_next(dirichlet_conrey_t x, const dirichlet_group_t G)
|
||||
dirichlet_char_next(dirichlet_char_t x, const dirichlet_group_t G)
|
||||
{
|
||||
/* update index */
|
||||
int k;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_conrey_next_primitive(dirichlet_conrey_t x, const dirichlet_group_t G)
|
||||
dirichlet_char_next_primitive(dirichlet_char_t x, const dirichlet_group_t G)
|
||||
{
|
||||
/* update index avoiding multiples of p except for first component
|
||||
if 8|q */
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_one(dirichlet_conrey_t x, const dirichlet_group_t G)
|
||||
dirichlet_char_one(dirichlet_char_t x, const dirichlet_group_t G)
|
||||
{
|
||||
ulong k;
|
||||
for (k = 0; k < G->num ; k++)
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
ulong
|
||||
dirichlet_conrey_order(const dirichlet_group_t G, const dirichlet_conrey_t x)
|
||||
dirichlet_char_order(const dirichlet_group_t G, const dirichlet_char_t x)
|
||||
{
|
||||
ulong k, g;
|
||||
g = G->expo;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
int
|
||||
dirichlet_conrey_parity(const dirichlet_group_t G, const dirichlet_conrey_t x)
|
||||
dirichlet_char_parity(const dirichlet_group_t G, const dirichlet_char_t x)
|
||||
{
|
||||
int k, odd = 0;
|
||||
for (k = 0; k < G->num; k++)
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_pow(dirichlet_conrey_t c, const dirichlet_group_t G, const dirichlet_conrey_t a, ulong n)
|
||||
dirichlet_char_pow(dirichlet_char_t c, const dirichlet_group_t G, const dirichlet_char_t a, ulong n)
|
||||
{
|
||||
ulong k;
|
||||
for (k = 0; k < G->num ; k++)
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_primitive(dirichlet_conrey_t y, const dirichlet_group_t G, const dirichlet_conrey_t x, ulong cond)
|
||||
dirichlet_char_primitive(dirichlet_char_t y, const dirichlet_group_t G, const dirichlet_char_t x, ulong cond)
|
||||
{
|
||||
slong k, l;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_conrey_print(const dirichlet_group_t G, const dirichlet_conrey_t x)
|
||||
dirichlet_char_print(const dirichlet_group_t G, const dirichlet_char_t x)
|
||||
{
|
||||
slong k;
|
||||
if (G->num)
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
ulong
|
||||
dirichlet_index_conrey(const dirichlet_group_t G, const dirichlet_conrey_t x)
|
||||
dirichlet_index_char(const dirichlet_group_t G, const dirichlet_char_t x)
|
||||
{
|
||||
slong k;
|
||||
ulong j = 0;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
ulong
|
||||
dirichlet_ui_chi(const dirichlet_group_t G, const dirichlet_char_t chi, ulong n)
|
||||
dirichlet_ui_chi(const dirichlet_group_t G, const dirichlet_fullchar_t chi, ulong n)
|
||||
{
|
||||
if (n_gcd(G->q, n) > 1)
|
||||
{
|
||||
|
@ -21,13 +21,13 @@ dirichlet_ui_chi(const dirichlet_group_t G, const dirichlet_char_t chi, ulong n)
|
|||
else
|
||||
{
|
||||
ulong v;
|
||||
dirichlet_conrey_t x;
|
||||
dirichlet_conrey_init(x, G);
|
||||
dirichlet_conrey_log(x, G, n);
|
||||
dirichlet_char_t x;
|
||||
dirichlet_char_init(x, G);
|
||||
dirichlet_char_log(x, G, n);
|
||||
|
||||
v = dirichlet_ui_chi_conrey(G, chi, x);
|
||||
v = dirichlet_ui_chi_char(G, chi, x);
|
||||
|
||||
dirichlet_conrey_clear(x);
|
||||
dirichlet_char_clear(x);
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
ulong
|
||||
dirichlet_ui_chi_conrey(const dirichlet_group_t G, const dirichlet_char_t chi, const dirichlet_conrey_t x)
|
||||
dirichlet_ui_chi_char(const dirichlet_group_t G, const dirichlet_fullchar_t chi, const dirichlet_char_t x)
|
||||
{
|
||||
ulong v = 0, k;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
void
|
||||
dirichlet_ui_chi_vec(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv)
|
||||
dirichlet_ui_chi_vec(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv)
|
||||
{
|
||||
if (2 * nv > G->q)
|
||||
dirichlet_ui_chi_vec_loop(v, G, chi, nv);
|
||||
|
|
|
@ -13,21 +13,21 @@
|
|||
|
||||
/* loop over whole group */
|
||||
void
|
||||
dirichlet_ui_chi_vec_loop(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv)
|
||||
dirichlet_ui_chi_vec_loop(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv)
|
||||
{
|
||||
int j;
|
||||
ulong t;
|
||||
slong k;
|
||||
dirichlet_conrey_t x;
|
||||
dirichlet_conrey_init(x, G);
|
||||
dirichlet_conrey_one(x, G);
|
||||
dirichlet_char_t x;
|
||||
dirichlet_char_init(x, G);
|
||||
dirichlet_char_one(x, G);
|
||||
|
||||
for (k = 0; k < nv; k++)
|
||||
v[k] = DIRICHLET_CHI_NULL;
|
||||
|
||||
t = v[1] = 0;
|
||||
|
||||
while ( (j = dirichlet_conrey_next(x, G)) >= 0 )
|
||||
while ( (j = dirichlet_char_next(x, G)) >= 0 )
|
||||
{
|
||||
/* exponents were modified up to j */
|
||||
for (k = G->num - 1; k >= j; k--)
|
||||
|
@ -44,5 +44,5 @@ dirichlet_ui_chi_vec_loop(ulong *v, const dirichlet_group_t G, const dirichlet_c
|
|||
for (k = G->q; k < nv ; k++ )
|
||||
v[k] = v[k - G->q];
|
||||
|
||||
dirichlet_conrey_clear(x);
|
||||
dirichlet_char_clear(x);
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#include "dirichlet.h"
|
||||
|
||||
static void
|
||||
chi_vec_evenpart(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv)
|
||||
chi_vec_evenpart(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv)
|
||||
{
|
||||
|
||||
ulong c3, c4, x;
|
||||
|
@ -47,7 +47,7 @@ chi_vec_evenpart(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi
|
|||
|
||||
/* loop over primary components */
|
||||
void
|
||||
dirichlet_ui_chi_vec_primeloop(ulong *v, const dirichlet_group_t G, const dirichlet_char_t chi, slong nv)
|
||||
dirichlet_ui_chi_vec_primeloop(ulong *v, const dirichlet_group_t G, const dirichlet_fullchar_t chi, slong nv)
|
||||
{
|
||||
slong k, l;
|
||||
|
||||
|
|
|
@ -15,20 +15,20 @@ ulong
|
|||
dirichlet_ui_pairing(const dirichlet_group_t G, ulong m, ulong n)
|
||||
{
|
||||
ulong x;
|
||||
dirichlet_conrey_t a, b;
|
||||
dirichlet_char_t a, b;
|
||||
|
||||
if (n_gcd(G->q, m) > 1 || n_gcd(G->q, n) > 1)
|
||||
return DIRICHLET_CHI_NULL;
|
||||
|
||||
dirichlet_conrey_init(a, G);
|
||||
dirichlet_conrey_init(b, G);
|
||||
dirichlet_conrey_log(a, G, m);
|
||||
dirichlet_conrey_log(b, G, n);
|
||||
dirichlet_char_init(a, G);
|
||||
dirichlet_char_init(b, G);
|
||||
dirichlet_char_log(a, G, m);
|
||||
dirichlet_char_log(b, G, n);
|
||||
|
||||
x = dirichlet_ui_pairing_conrey(G, a, b);
|
||||
x = dirichlet_ui_pairing_char(G, a, b);
|
||||
|
||||
dirichlet_conrey_clear(a);
|
||||
dirichlet_conrey_clear(b);
|
||||
dirichlet_char_clear(a);
|
||||
dirichlet_char_clear(b);
|
||||
|
||||
return x;
|
||||
}
|
||||
|
|
|
@ -13,10 +13,8 @@
|
|||
|
||||
#include "dirichlet.h"
|
||||
|
||||
/* todo: modular arithmetic */
|
||||
|
||||
ulong
|
||||
dirichlet_ui_pairing_conrey(const dirichlet_group_t G, const dirichlet_conrey_t a, const dirichlet_conrey_t b)
|
||||
dirichlet_ui_pairing_char(const dirichlet_group_t G, const dirichlet_char_t a, const dirichlet_char_t b)
|
||||
{
|
||||
ulong x, k;
|
||||
x = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue