mirror of
https://github.com/vale981/arb
synced 2025-03-06 01:41:39 -05:00
vocabulary: number/log/index
This commit is contained in:
parent
c80d0b103d
commit
19ea881a64
4 changed files with 121 additions and 31 deletions
|
@ -114,9 +114,13 @@ int acb_dirichlet_conrey_eq_deep(const acb_dirichlet_group_t G, const acb_dirich
|
||||||
int acb_dirichlet_conrey_parity(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x);
|
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_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);
|
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);
|
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);
|
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_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);
|
void acb_dirichlet_conrey_first_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G);
|
||||||
|
|
||||||
|
|
40
acb_dirichlet/conrey_index.c
Normal file
40
acb_dirichlet/conrey_index.c
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*=============================================================================
|
||||||
|
|
||||||
|
This file is part of ARB.
|
||||||
|
|
||||||
|
ARB is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
ARB is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with ARB; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
=============================================================================*/
|
||||||
|
/******************************************************************************
|
||||||
|
|
||||||
|
Copyright (C) 2016 Pascal Molin
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "acb_dirichlet.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
acb_dirichlet_conrey_index(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong j)
|
||||||
|
{
|
||||||
|
slong k;
|
||||||
|
|
||||||
|
for (k = 0; k < G->num; k++)
|
||||||
|
{
|
||||||
|
x->log[k] = j % G->P[k].phi;
|
||||||
|
j = j / G->P[k].phi;
|
||||||
|
}
|
||||||
|
|
||||||
|
acb_dirichlet_conrey_exp(x, G);
|
||||||
|
}
|
38
acb_dirichlet/index_conrey.c
Normal file
38
acb_dirichlet/index_conrey.c
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*=============================================================================
|
||||||
|
|
||||||
|
This file is part of ARB.
|
||||||
|
|
||||||
|
ARB is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
ARB is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with ARB; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
=============================================================================*/
|
||||||
|
/******************************************************************************
|
||||||
|
|
||||||
|
Copyright (C) 2016 Pascal Molin
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "acb_dirichlet.h"
|
||||||
|
|
||||||
|
ulong
|
||||||
|
acb_dirichlet_index_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x)
|
||||||
|
{
|
||||||
|
slong k;
|
||||||
|
ulong j = 0;
|
||||||
|
|
||||||
|
for (k = 0; k < G->num; k++)
|
||||||
|
j = j * G->P[k].phi + x->log[k];
|
||||||
|
|
||||||
|
return j;
|
||||||
|
}
|
|
@ -35,11 +35,11 @@ introduced in the LMFDB, which is an explicit choice of isomorphism
|
||||||
(\mathbb Z/q\mathbb Z)^\times & \to &\bigoplus_i \mathbb Z/\phi_i\mathbb Z \\
|
(\mathbb Z/q\mathbb Z)^\times & \to &\bigoplus_i \mathbb Z/\phi_i\mathbb Z \\
|
||||||
x & \mapsto & (e_i)
|
x & \mapsto & (e_i)
|
||||||
|
|
||||||
We call *number* a residue class `x` modulo *q*, and *index* the
|
We call *number* a residue class `x` modulo *q*, and *log* the
|
||||||
corresponding vector `(e_i)` of exponents of Conrey generators.
|
corresponding vector `(e_i)` of exponents of Conrey generators.
|
||||||
|
|
||||||
Going from an *index* to the corresponding *number* is a cheap
|
Going from a *log* to the corresponding *number* is a cheap
|
||||||
operation while the converse requires computing discrete
|
operation called exp, while the converse requires computing discrete
|
||||||
logarithms.
|
logarithms.
|
||||||
|
|
||||||
.. type:: acb_dirichlet_group_struct
|
.. type:: acb_dirichlet_group_struct
|
||||||
|
@ -104,12 +104,12 @@ Conrey elements
|
||||||
.. type:: acb_dirichlet_conrey_t
|
.. type:: acb_dirichlet_conrey_t
|
||||||
|
|
||||||
Represents elements of the unit group mod *q*, keeping both the
|
Represents elements of the unit group mod *q*, keeping both the
|
||||||
*number* (residue class) and *index* (exponents on the group
|
*number* (residue class) and *log* (exponents on the group
|
||||||
generators).
|
generators).
|
||||||
|
|
||||||
.. function:: void acb_dirichlet_conrey_log(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong m)
|
.. function:: void acb_dirichlet_conrey_log(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong m)
|
||||||
|
|
||||||
Sets *x* to the element of number *m*, computing its index using discrete
|
Sets *x* to the element of number *m*, computing its log using discrete
|
||||||
logarithm in *G*.
|
logarithm in *G*.
|
||||||
|
|
||||||
.. function:: ulong acb_dirichlet_conrey_exp(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
.. function:: ulong acb_dirichlet_conrey_exp(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
||||||
|
@ -118,11 +118,11 @@ Conrey elements
|
||||||
|
|
||||||
.. function:: void acb_dirichlet_conrey_one(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
.. function:: void acb_dirichlet_conrey_one(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
||||||
|
|
||||||
Sets *x* to the *number* `1\in G`, having *index* `[0,\dots 0]`.
|
Sets *x* to the *number* `1\in G`, having *log* `[0,\dots 0]`.
|
||||||
|
|
||||||
.. function:: void acb_dirichlet_conrey_first_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
.. function:: void acb_dirichlet_conrey_first_primitive(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
||||||
|
|
||||||
Sets *x* to the first primitive element of *G*, having *index* `[1,\dots 1]`,
|
Sets *x* to the first primitive element of *G*, having *log* `[1,\dots 1]`,
|
||||||
or `[0, 1, \dots 1]` if `8\mid q`.
|
or `[0, 1, \dots 1]` if `8\mid q`.
|
||||||
|
|
||||||
.. function:: void acb_dirichlet_conrey_set(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t y)
|
.. function:: void acb_dirichlet_conrey_set(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t y)
|
||||||
|
@ -131,13 +131,13 @@ Conrey elements
|
||||||
|
|
||||||
.. function:: int acb_dirichlet_conrey_next(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
.. function:: int acb_dirichlet_conrey_next(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G)
|
||||||
|
|
||||||
Sets *x* to the next conrey index in *G* with lexicographic ordering.
|
Sets *x* to the next conrey element in *G* with lexicographic ordering.
|
||||||
|
|
||||||
The return value
|
The return value
|
||||||
is the index of the last updated exponent of *x*, or *-1* if the last
|
is the index of the last updated exponent of *x*, or *-1* if the last
|
||||||
element has been reached.
|
element has been reached.
|
||||||
|
|
||||||
This function allows to iterate on the elements of *G* looping on their *index*.
|
This function allows to iterate on the elements of *G* looping on their *log*.
|
||||||
Note that it produces elements in seemingly random *number* order.
|
Note that it produces elements in seemingly random *number* order.
|
||||||
|
|
||||||
The following template can be used to loop over all elements *x* in *G*::
|
The following template can be used to loop over all elements *x* in *G*::
|
||||||
|
@ -152,6 +152,14 @@ Conrey elements
|
||||||
Same as :func:`acb_dirichlet_conrey_next`, but jumps to the next element
|
Same as :func:`acb_dirichlet_conrey_next`, but jumps to the next element
|
||||||
corresponding to a primitive character of *G*.
|
corresponding to a primitive character of *G*.
|
||||||
|
|
||||||
|
.. function:: ulong acb_dirichlet_index_conrey(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x);
|
||||||
|
|
||||||
|
Returns the lexicographic index of *x* as an integer in `0\dots \varphi(q)`.
|
||||||
|
|
||||||
|
.. function:: void acb_dirichlet_conrey_index(acb_dirichlet_conrey_t x, const acb_dirichlet_group_t G, ulong j)
|
||||||
|
|
||||||
|
Sets *x* to the Conrey element of lexicographic index *j*.
|
||||||
|
|
||||||
.. function:: int acb_dirichlet_conrey_eq(const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y)
|
.. function:: int acb_dirichlet_conrey_eq(const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y)
|
||||||
|
|
||||||
.. function:: int acb_dirichlet_conrey_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y)
|
.. function:: int acb_dirichlet_conrey_eq_deep(const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x, const acb_dirichlet_conrey_t y)
|
||||||
|
@ -219,7 +227,7 @@ Character type
|
||||||
|
|
||||||
.. function:: void acb_dirichlet_char_conrey(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x)
|
.. function:: void acb_dirichlet_char_conrey(acb_dirichlet_char_t chi, const acb_dirichlet_group_t G, const acb_dirichlet_conrey_t x)
|
||||||
|
|
||||||
Sets *chi* to the Dirichlet character of Conrey index *x*.
|
Sets *chi* to the Dirichlet character corresponding to *x*.
|
||||||
|
|
||||||
.. function:: int acb_dirichlet_char_eq(const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2)
|
.. function:: int acb_dirichlet_char_eq(const acb_dirichlet_char_t chi1, const acb_dirichlet_char_t chi2)
|
||||||
|
|
||||||
|
@ -256,7 +264,7 @@ Character properties
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
As a consequence of the Conrey numbering, all these numbers are available at the
|
As a consequence of the Conrey numbering, all these numbers are available at the
|
||||||
level of *number* and *index*, and for *char*.
|
level of *number* and Conrey *log* elements, and for *char*.
|
||||||
No discrete log computation is performed.
|
No discrete log computation is performed.
|
||||||
|
|
||||||
.. function:: ulong acb_dirichlet_number_primitive(const acb_dirichlet_group_t G)
|
.. function:: ulong acb_dirichlet_number_primitive(const acb_dirichlet_group_t G)
|
||||||
|
@ -523,25 +531,26 @@ the Fourier transform on Conrey labels as
|
||||||
Compute the DFT of *v* using Conrey indices.
|
Compute the DFT of *v* using Conrey indices.
|
||||||
This function assumes *v* and *w* are vectors
|
This function assumes *v* and *w* are vectors
|
||||||
of size *G->phi_q*, whose values correspond to a lexicographic ordering
|
of size *G->phi_q*, whose values correspond to a lexicographic ordering
|
||||||
of Conrey indices (as obtained using :func:`acb_dirichlet_conrey_next`).
|
of Conrey logs (as obtained using :func:`acb_dirichlet_conrey_next` or
|
||||||
|
by :func:`acb_dirichlet_index_conrey`).
|
||||||
|
|
||||||
For example, if `q=15`, the Conrey elements are stored in following
|
For example, if `q=15`, the Conrey elements are stored in following
|
||||||
order
|
order
|
||||||
|
|
||||||
============ =====================
|
======= ============= =====================
|
||||||
index [e,f] number = 7^e 11^f
|
index log = [e,f] number = 7^e 11^f
|
||||||
============ =====================
|
======= ============= =====================
|
||||||
[0, 0] 1
|
0 [0, 0] 1
|
||||||
[0, 1] 7
|
1 [0, 1] 7
|
||||||
[0, 2] 4
|
2 [0, 2] 4
|
||||||
[0, 3] 13
|
3 [0, 3] 13
|
||||||
[0, 4] 1
|
4 [0, 4] 1
|
||||||
[1, 0] 11
|
5 [1, 0] 11
|
||||||
[1, 1] 2
|
6 [1, 1] 2
|
||||||
[1, 2] 14
|
7 [1, 2] 14
|
||||||
[1, 3] 8
|
8 [1, 3] 8
|
||||||
[1, 4] 11
|
9 [1, 4] 11
|
||||||
============ =====================
|
======= ============= =====================
|
||||||
|
|
||||||
.. function:: void acb_dirichlet_dft(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, slong prec)
|
.. function:: void acb_dirichlet_dft(acb_ptr w, acb_srcptr v, const acb_dirichlet_group_t G, slong prec)
|
||||||
|
|
||||||
|
@ -606,21 +615,20 @@ L-functions
|
||||||
|
|
||||||
Compute all values `L(s,\chi)` for `\chi` mod `q`, by Hurwitz formula and
|
Compute all values `L(s,\chi)` for `\chi` mod `q`, by Hurwitz formula and
|
||||||
discrete Fourier transform.
|
discrete Fourier transform.
|
||||||
*res* is assumed to have length *G->phi_q* and values are stored by lexicographically ordered Conrey
|
*res* is assumed to have length *G->phi_q* and values are stored by lexicographically ordered
|
||||||
index. See :func:`acb_dirichlet_dft_conrey`.
|
Conrey logs. See :func:`acb_dirichlet_dft_conrey`.
|
||||||
|
|
||||||
Implementation notes
|
Implementation notes
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
The current implementation introduces a *char* type which contains a *conrey*
|
The current implementation introduces a *char* type which contains a *conrey*
|
||||||
index plus additional information which
|
log plus additional information which
|
||||||
|
|
||||||
- makes evaluation of a single character a bit faster
|
- makes evaluation of a single character a bit faster
|
||||||
|
|
||||||
- has some initialization cost.
|
- has some initialization cost.
|
||||||
|
|
||||||
Even if it is straightforward to convert a *conrey* index to the
|
Even if it is straightforward to convert a *conrey* log to the
|
||||||
corresponding *char*, looping is faster at the
|
corresponding *char*, looping is faster at the
|
||||||
level of Conrey representation. Things can be improved on this aspect
|
level of Conrey representation. Things can be improved on this aspect
|
||||||
but it makes code more intricate.
|
but it makes code more intricate.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue