Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Testing latest pari + WASM + node.js... and it works?! Wow.

28493 views
License: GPL3
ubuntu2004
Function: _header_l_functions
Class: header
Section: l_functions
Doc:
 \section{$L$-functions}

 This section describes routines related to $L$-functions. We first introduce
 the basic concept and notations, then explain how to represent them in GP.
 Let $\Gamma_{\R}(s) = \pi^{-s/2}\Gamma(s/2)$, where $\Gamma$ is Euler's gamma
 function. Given $d \geq 1$ and a $d$-tuple $A=[\alpha_1,\dots,\alpha_d]$ of
 complex numbers, we let $\gamma_A(s) = \prod_{\alpha \in A} \Gamma_{\R}(s +
 \alpha)$.

 Given a sequence $a = (a_n)_{n\geq 1}$ of complex numbers (such that $a_1 = 1$),
 a positive \emph{conductor} $N \in \Z$, and a \emph{gamma factor}
 $\gamma_A$ as above, we consider the Dirichlet series
 $$ L(a,s) = \sum_{n\geq 1} a_n n^{-s} $$
 and the attached completed function
 $$ \Lambda(a,s) = N^{s/2}\gamma_A(s) \cdot L(a,s). $$

 Such a datum defines an \emph{$L$-function} if it satisfies the three
 following assumptions:

 \item [Convergence] The $a_n = O_\epsilon(n^{k_1+\epsilon})$ have polynomial
 growth, equivalently $L(s)$ converges absolutely in some right half-plane
 $\Re(s) > k_1 + 1$.

 \item [Analytic continuation] $L(s)$ has a meromorphic continuation to the
 whole complex plane with finitely many poles.

 \item [Functional equation] There exist an integer $k$, a complex number
 $\epsilon$ (usually of modulus~$1$), and an attached sequence $a^*$
 defining both an $L$-function $L(a^*,s)$ satisfying the above two assumptions
 and a completed function $\Lambda(a^*,s) = N^{s/2}\gamma_A(s) \cdot
 L(a^*,s)$, such that
 $$\Lambda(a,k-s) = \epsilon \Lambda(a^*,s)$$
 for all regular points.

 More often than not in number theory we have $a^* = \overline{a}$ (which
 forces $|\epsilon| = 1$), but this needs not be the case. If $a$ is a real
 sequence and $a = a^*$, we say that $L$ is \emph{self-dual}. We do not assume
 that the $a_n$ are multiplicative, nor equivalently that $L(s)$ has an Euler
 product.

 \misctitle{Remark}
 Of course, $a$ determines the $L$-function, but the (redundant) datum $a,a^*,
 A, N, k, \epsilon$ describes the situation in a form more suitable for fast
 computations; knowing the polar part $r$ of $\Lambda(s)$ (a rational function
 such that $\Lambda-r$ is holomorphic) is also useful. A subset of these,
 including only finitely many $a_n$-values will still completely determine $L$
 (in suitable families), and we provide routines to try and compute missing
 invariants from whatever information is available.

 \misctitle{Important Caveat}
 The implementation assumes that the implied constants in the $O_\epsilon$ are
 small. In our generic framework, it is impossible to return proven results
 without more detailed information about the $L$ function. The intended use of
 the $L$-function package is not to prove theorems, but to experiment and
 formulate conjectures, so all numerical results should be taken with a grain
 of salt. One can always increase \kbd{realbitprecision} and recompute: the
 difference estimates the actual absolute error in the original output.

 \misctitle{Note} The requested precision has a major impact on runtimes.
 Because of this, most $L$-function routines, in particular \kbd{lfun} itself,
 specify the requested precision in \emph{bits}, not in decimal digits.
 This is transparent for the user once \tet{realprecision} or
 \tet{realbitprecision} are set. We advise to manipulate precision via
 \tet{realbitprecision} as it allows finer granularity: \kbd{realprecision}
 increases by increments of 64 bits, i.e. 19 decimal digits at a time.

 \subsec{Theta functions}

 Given an $L$-function as above, we define an attached theta function
 via Mellin inversion: for any positive real $t > 0$, we let
 $$ \theta(a,t) := \dfrac{1}{2\pi i}\int_{\Re(s) = c} t^{-s} \Lambda(s)\, ds $$
 where $c$ is any positive real number $c > k_1+1$ such that $c + \Re(a) > 0$
 for all $a\in A$. In fact, we have
 $$\theta(a,t) = \sum_{n\geq 1} a_n K(nt/N^{1/2})
 \quad\text{where}\quad
 K(t) := \dfrac{1}{2\pi i}\int_{\Re(s) = c} t^{-s} \gamma_A(s)\, ds.$$
 Note that this function is analytic and actually makes sense for complex $t$,
 such that $\Re(t^{2/d}) > 0$, i.e. in a cone containing the positive real
 half-line. The functional equation for $\Lambda$ translates into
 $$ \theta(a,1/t) - \epsilon t^k\theta(a^*,t) = P_\Lambda(t), $$
 where $P_\Lambda$ is an explicit polynomial in $t$ and $\log t$ given by the
 Taylor development of the polar part of $\Lambda$: there are no $\log$'s if
 all poles are simple, and $P = 0$ if $\Lambda$ is entire. The values
 $\theta(t)$ are generally easier to compute than the $L(s)$, and this
 functional equation provides a fast way to guess possible values for
 missing invariants in the $L$-function definition.

 \subsec{Data structures describing $L$ and theta functions}

 We have 3 levels of description:

 \item an \tet{Lmath} is an arbitrary description of the underlying
 mathematical situation (to which e.g., we associate the $a_p$ as traces of
 Frobenius elements); this is done via constructors to be described in the
 subsections below.

 \item an \tet{Ldata} is a computational description of situation, containing
 the complete datum ($a,a^*,A,k,N,\epsilon,r$). Where $a$ and $a^*$ describe
 the coefficients (given $n,b$ we must be able to compute $[a_1,\dots,a_n]$
 with bit accuracy $b$), $A$ describes the Euler factor, the (classical) weight
 is $k$, $N$ is the conductor, and $r$ describes the polar part of $L(s)$.
 This is obtained via the function \tet{lfuncreate}. N.B. For motivic
 $L$-functions, the motivic weight $w$ is $w = k-1$; but we also support
 nonmotivic $L$-functions.

 \misctitle{Technical note} When some components of an \kbd{Ldata} cannot be
 given exactly, usually $r$ or $\epsilon$, the \kbd{Ldata} may be given as a
 \emph{closure}. When evaluated at a given precision, the closure must return
 all components as exact data or floating point numbers at the requested
 precision, see \kbd{??lfuncreate}. The reason for this technicality is that
 the accuracy to which we must compute is not bounded a priori and unknown
 at this stage: it depends on the domain where we evaluate the $L$-function.

 \item an \tet{Linit} contains an \kbd{Ldata} and everything needed for fast
 \emph{numerical} computations. It specifies the functions to be considered
 (either $L^{(j)}(s)$ or $\theta^{(j)}(t)$ for derivatives of order $j \leq
 m$, where $m$ is now fixed) and specifies a \emph{domain} which limits
 the range of arguments ($t$ or $s$, respectively to certain cones and
 rectangular regions) and the output accuracy. This is obtained via the
 functions \tet{lfuninit} or \tet{lfunthetainit}.

 All the functions which are specific to $L$ or theta functions share the
 prefix \kbd{lfun}. They take as first argument either an \kbd{Lmath}, an
 \kbd{Ldata}, or an \kbd{Linit}. If a single value is to be computed,
 this makes no difference, but when many values are needed (e.g. for plots or
 when searching for zeros), one should first construct an \kbd{Linit}
 attached to the search range and use it in all subsequent calls.
 If you attempt to use an \kbd{Linit} outside the range for which it was
 initialized, a warning is issued, because the initialization is
 performed again, a major inefficiency:
 \bprog
 ? Z = lfuncreate(1); \\ Riemann zeta
 ? L = lfuninit(Z, [1/2, 0, 100]); \\ zeta(1/2+it), |t| < 100
 ? lfun(L, 1/2)    \\ OK, within domain
 %3 = -1.4603545088095868128894991525152980125
 ? lfun(L, 0)      \\ not on critical line !
   *** lfun: Warning: lfuninit: insufficient initialization.
 %4 = -0.50000000000000000000000000000000000000
 ? lfun(L, 1/2, 1) \\ attempt first derivative !
 *** lfun: Warning: lfuninit: insufficient initialization.
 %5 = -3.9226461392091517274715314467145995137
 @eprog

 For many $L$-functions, passing from \kbd{Lmath} to an \kbd{Ldata} is
 inexpensive: in that case one may use \kbd{lfuninit} directly from the
 \kbd{Lmath} even when evaluations in different domains are needed. The
 above example could equally have skipped the \kbd{lfuncreate}:
 \bprog
 ? L = lfuninit(1, [1/2, 0, 100]); \\ zeta(1/2+it), |t| < 100
 @eprog\noindent In fact, when computing a single value, you can even skip
 \kbd{lfuninit}:
 \bprog
 ? L = lfun(1, 1/2, 1); \\ zeta'(1/2)
 ? L = lfun(1, 1+x+O(x^5)); \\ first 5 terms of Taylor development at 1
 @eprog\noindent Both give the desired results with no warning.

 \misctitle{Complexity}
 The implementation requires $O(N(|t|+1))^{1/2}$ coefficients $a_n$
 to evaluate $L$ of conductor $N$ at $s = \sigma + i t$.

 We now describe the available high-level constructors, for built-in $L$
 functions.

 \subsec{Dirichlet $L$-functions} %GPHELPskip

 Given a Dirichlet character $\chi:(\Z/N\Z)^*\to \C$, we let
 $$L(\chi, s) = \sum_{n\geq 1} \chi(n) n^{-s}.$$
 Only primitive characters are supported. Given a nonzero
 integer $D$, the \typ{INT} $D$ encodes the function $L((D_0/.), s)$, for the
 quadratic Kronecker symbol attached to the fundamental discriminant
 $D_0 = \kbd{coredisc}(D)$. This includes Riemann $\zeta$ function via the
 special case $D = 1$.

 More general characters can be represented in a variety of ways:

 \item via Conrey notation (see \tet{znconreychar}): $\chi_N(m,\cdot)$
 is given as the \typ{INTMOD} \kbd{Mod(m,N)}.

 \item via a \var{znstar} structure describing the abelian  group $(\Z/N\Z)^*$,
 where the character is given in terms of the \var{znstar} generators:
 \bprog
   ? G = znstar(100, 1); \\ (Z/100Z)^*
   ? G.cyc \\ ~ Z/20 . g1  + Z/2 . g2 for some generators g1 and g2
   %2 = [20, 2]
   ? G.gen
   %3 = [77, 51]
   ? chi = [a, b]  \\ maps g1 to e(a/20) and g2 to e(b/2);  e(x) = exp(2ipi x)
 @eprog\noindent
 More generally, let $(\Z/N\Z)^* = \oplus (\Z/d_i\Z) g_i$ be given via a
 \var{znstar} structure $G$ (\kbd{G.cyc} gives the $d_i$ and \kbd{G.gen} the
 $g_i$). A \tev{character} $\chi$ on $G$ is given by a row vector
 $v = [a_1,\ldots,a_n]$ such that $\chi(\prod g_i^{n_i}) = \exp(2\pi i\sum a_i
 n_i / d_i)$. The pair $[G, v]$ encodes the \emph{primitive} character
 attached to $\chi$.

 \item in fact, this construction $[G, m]$ describing a character
 is more general: $m$ is also allowed to be a Conrey label as seen above,
 or a Conrey logarithm (see \tet{znconreylog}), and the latter format is
 actually the fastest one. Instead
 of a single character as above, one may use the construction
 \kbd{lfuncreate([G, vchi])} where \kbd{vchi} is a nonempty vector of
 characters \emph{of the same conductor} (more precisely, whose attached
 primitive characters have the same conductor) and \emph{same parity}.
 The function is then vector-valued, where the values are ordered as the
 characters in \kbd{vchi}. Conrey labels cannot be used in this last format
 because of the need to distinguish a single character given by a row vector
 of integers and a vector of characters given by their labels: use
 \kbd{znconreylog(G,i)} first to convert a label to Conrey logarithm.

 \item it is also possible to view Dirichlet characters as Hecke characters
 over $K = \Q$ (see below), for a modulus $[N, [1]]$ but this is both more
 complicated and less efficient.

 In all cases, a nonprimitive character is replaced by the attached primitive
 character.

 \subsec{Hecke $L$-functions} %GPHELPskip

 The Dedekind zeta function of a number field $K = \Q[X]/(T)$ is encoded
 either by the defining polynomial $T$, or any absolute number fields
 structure (preferably at least a \var{bnf}).

 Given a finite order Hecke character $\chi: Cl_f(K)\to \C$, we let
 $$L(\chi, s) = \sum_{A \subset O_K} \chi(A)\, \left(N_{K/\Q}A\right)^{-s}.$$

 Let $Cl_f(K) = \oplus (\Z/d_i\Z) g_i$ given by a \var{bnr} structure with
 generators: the $d_i$ are given by \kbd{K.cyc} and the $g_i$ by \kbd{K.gen}.
 A \tev{character} $\chi$ on the ray class group is given by a row vector
 $v = [a_1,\ldots,a_n]$ such that $\chi(\prod g_i^{n_i}) = \exp(2\pi i\sum
 a_i n_i / d_i)$. The pair $[\var{bnr}, v]$ encodes the \emph{primitive}
 character attached to $\chi$.

 \bprog
 ? K  = bnfinit(x^2-60);
 ? Cf = bnrinit(K, [7, [1,1]], 1); \\ f = 7 oo_1 oo_2
 ? Cf.cyc
 %3 = [6, 2, 2]
 ? Cf.gen
 %4 = [[2, 1; 0, 1], [22, 9; 0, 1], [-6, 7]~]
 ? lfuncreate([Cf, [1,0,0]]); \\@com $\chi(g_1) = \zeta_6$, $\chi(g_2)=\chi(g_3)=1$
 @eprog

 \noindent Dirichlet characters on $(\Z/N\Z)^*$ are a special case,
 where $K = \Q$:
 \bprog
 ? Q  = bnfinit(x);
 ? Cf = bnrinit(Q, [100, [1]]); \\ for odd characters on (Z/100Z)*
 @eprog\noindent
 For even characters, replace by \kbd{bnrinit(K, N)}. Note that the simpler
 direct construction in the previous section will be more efficient. Instead
 of a single character as above, one may use the construction
 \kbd{lfuncreate([Cf, vchi])} where \kbd{vchi} is a nonempty vector of
 characters \emph{of the same conductor} (more precisely, whose attached
 primitive characters have the same conductor). The function is then
 vector-valued, where the values are ordered as the characters in \kbd{vchi}.

 \subsec{Artin $L$ functions} %GPHELPskip

 Given a Galois number field $N/\Q$ with group $G = \kbd{galoisinit}(N)$,
 a representation $\rho$ of $G$ over the cyclotomic field $\Q(\zeta_n)$
 is specified by the matrices giving the images of $\kbd{G.gen}$ by $\rho$.
 The corresponding Artin $L$ function is created using \tet{lfunartin}.
 \bprog
    P = quadhilbert(-47); \\  degree 5, Galois group D_5
    N = nfinit(nfsplitting(P)); \\ Galois closure
    G = galoisinit(N);
    [s,t] = G.gen; \\ order 5 and 2
    L = lfunartin(N,G, [[a,0;0,a^-1],[0,1;1,0]], 5); \\ irr. degree 2
 @eprog\noindent In the above, the polynomial variable (here \kbd{a}) represents
 $\zeta_5 := \exp(2i\pi/5)$ and the two matrices give the images of
 $s$ and $t$. Here, priority of \kbd{a} must be lower than the priority
 of \kbd{x}.

 \subsec{$L$-functions of algebraic varieties} %GPHELPskip

 $L$-function of elliptic curves over number fields are supported.
 \bprog
 ? E = ellinit([1,1]);
 ? L = lfuncreate(E);  \\ L-function of E/Q
 ? E2 = ellinit([1,a], nfinit(a^2-2));
 ? L2 = lfuncreate(E2);  \\ L-function of E/Q(sqrt(2))
 @eprog

 $L$-function of hyperelliptic genus-$2$ curve can be created with
 \kbd{lfungenus2}. To create the $L$ function of the curve
 $y^2+(x^3+x^2+1)y = x^2+x$:
 \bprog
 ? L = lfungenus2([x^2+x, x^3+x^2+1]);
 @eprog
 Currently, the model needs to be minimal at $2$, and if the conductor is even,
 its valuation at $2$ might be incorrect (a warning is issued).

 \subsec{Eta quotients / Modular forms} %GPHELPskip

 An eta quotient is created by applying \tet{lfunetaquo} to a matrix with
 2 columns $[m, r_m]$ representing
 $$ f(\tau) := \prod_m \eta(m\tau)^{r_m}. $$
 It is currently assumed that $f$ is a self-dual cuspidal form on
 $\Gamma_0(N)$ for some $N$.
 For instance, the $L$-function $\sum \tau(n) n^{-s}$
 attached to Ramanujan's $\Delta$ function is encoded as follows
 \bprog
 ? L = lfunetaquo(Mat([1,24]));
 ? lfunan(L, 100)  \\ first 100 values of tau(n)
 @eprog

 More general modular forms defined by modular symbols will be added later.

 \subsec{Low-level Ldata format} %GPHELPskip

 When no direct constructor is available, you can still input an $L$ function
 directly by supplying $[a, a^*,A, k, N, \epsilon, r]$ to \kbd{lfuncreate}
 (see \kbd{??lfuncreate} for details).

 It is \emph{strongly} suggested to first check consistency of the created
 $L$-function:
 \bprog
 ? L = lfuncreate([a, as, A, k, N, eps, r]);
 ? lfuncheckfeq(L)  \\ check functional equation
 @eprog