Pari/GP Reference Documentation | Contents - Global index - GP keyboard shortcuts |
L-functions of algebraic varieties Artin L functions Data structures describing L and theta functions Dirichlet L-functions Eta quotients / Modular forms General Hecke L-functions Hecke L-functions of finite order characters Low-level Ldata format Theta functions lfun lfunan lfunartin lfuncheckfeq lfunconductor lfuncost lfuncreate lfundiv lfundual lfunetaquo lfuneuler lfungenus2 lfunhardy lfuninit lfunlambda lfunmfspec lfunmul lfunorderzero lfunparams lfunqf lfunrootres lfunshift lfunsympow lfuntheta lfunthetacost lfunthetainit lfuntwist lfunzeros | |
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 Γℝ(s) = π-s/2Γ(s/2), where Γ is Euler's gamma function. Given d ≥ 1 and a d-tuple A = [α1,...,αd] of complex numbers, we let γA(s) = ∏α ∈ A Γℝ(s + α). Given a sequence a = (an)n ≥ 1 of complex numbers (such that a1 = 1), a positive conductor N ∈ ℤ, and a gamma factor γA as above, we consider the Dirichlet series L(a,s) = ∑n ≥ 1 an n-s and the attached completed function Λ(a,s) = Ns/2γA(s).L(a,s). Such a datum defines an L-function if it satisfies the three following assumptions: * [Convergence] The an = Oε(nk1+ε) have polynomial growth, equivalently L(s) converges absolutely in some right half-plane Re(s) > k1 + 1. * [Analytic continuation] L(s) has a meromorphic continuation to the whole complex plane with finitely many poles. * [Functional equation] There exist an integer k, a complex number ε (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 Λ(a*,s) = Ns/2γA(s). L(a*,s), such that Λ(a,k-s) = ε Λ(a*,s) for all regular points. More often than not in number theory we have a* = a (which forces |ε |= 1), but this needs not be the case. If a is a real sequence and a = a*, we say that L is self-dual. We do not assume that the an are multiplicative, nor equivalently that L(s) has an Euler product. Remark. Of course, a determines the L-function, but the (redundant) datum a,a*, A, N, k, ε describes the situation in a form more suitable for fast computations; knowing the polar part r of Λ(s) (a rational function such that Λ-r is holomorphic) is also useful. A subset of these, including only finitely many an-values will still completely determine L (in suitable families), and we provide routines to try and compute missing invariants from whatever information is available.
Important Caveat.
The implementation assumes that the implied constants in the Oε 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
Note. The requested precision has a major impact on runtimes.
Because of this, most L-function routines, in particular
| |
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 θ(a,t) := (1)/(2π i)∫Re(s) = c t-s Λ(s) ds where c is any positive real number c > k1+1 such that c + Re(a) > 0 for all a ∈ A. In fact, we have θ(a,t) = ∑n ≥ 1 an K(nt/N1/2) where K(t) := (1)/(2π i)∫Re(s) = c t-s γA(s) ds. Note that this function is analytic and actually makes sense for complex t, such that Re(t2/d) > 0, i.e. in a cone containing the positive real half-line. The functional equation for Λ translates into θ(a,1/t) - ε tkθ(a*,t) = PΛ(t), where PΛ is an explicit polynomial in t and log t given by the Taylor expansion of the polar part of Λ: there are no log's if all poles are simple, and P = 0 if Λ is entire. The values θ(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.
| |
Data structures describing L and theta functions | |
We have 3 levels of description:
* an
* an
Technical note. When some components of an
* an
All the functions which are specific to L or theta functions share the
prefix
? 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
For many L-functions, passing from
? L = lfuninit(1, [1/2, 0, 100]); \\ zeta(1/2+it), |t| < 100
In fact, when computing a single value, you can even skip
? L = lfun(1, 1/2, 1); \\ zeta'(1/2) ? L = lfun(1, 1+x+O(x^5)); \\ first 5 terms of Taylor expansion at 1 Both give the desired results with no warning. Complexity. The implementation requires O(N(|t|+1))1/2 coefficients an to evaluate L of conductor N at s = σ + i t. We now describe the available high-level constructors, for built-in L functions.
| |
Dirichlet L-functions | |
Given a Dirichlet character χ:(ℤ/Nℤ)* → ℂ, we let
L(χ, s) = ∑n ≥ 1 χ(n) n-s.
Only primitive characters are supported. Given a nonzero
integer D, the More general characters can be represented in a variety of ways:
* via Conrey notation (see * via a znstar structure describing the abelian group (ℤ/Nℤ)*, where the character is given in terms of the znstar generators:
? 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)
More generally, let (ℤ/Nℤ)* = ⨁ (ℤ/djℤ) gj be given via a
znstar structure G (
* 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 * it is also possible to view Dirichlet characters as Hecke characters over K = ℚ (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.
| |
Hecke L-functions of finite order characters | |
The Dedekind zeta function of a number field K = ℚ[X]/(T) is encoded either by the defining polynomial T, or any absolute number fields structure (a nf is enough).
An alternative description for the Dedekind zeta function of an Abelian
extension of a number field is to use class-field theory parameters
[bnr, subg], see
? bnf = bnfinit(a^2 - a - 9); ? bnr = bnrinit(bnf, [2, [0,0]]); subg = Mat(3); ? L = lfuncreate([bnr, subg]);
Let K be a number field given as a
Let Clf(K) = ⨁ (ℤ/djℤ) gj given by a bnr structure
with generators: the dj are given by
? K = bnfinit(x^2-60); ? Cf = bnrinit(K, [7, [1,1]], 1); \\ f = 7 oo1 oo2 ? Cf.cyc %3 = [6, 2, 2] ? Cf.gen %4 = [[2, 1; 0, 1], [22, 9; 0, 1], [-6, 7]~] ? lfuncreate([Cf, [1,0,0]]); \\ χ(g1) = ζ6, χ(g2) = χ(g3) = 1 Dirichlet characters on (ℤ/Nℤ)* are a special case, where K = ℚ:
? Q = bnfinit(x); ? Cf = bnrinit(Q, [100, [1]]); \\ for odd characters on (Z/100Z)*
For even characters, replace by
| |
General Hecke L-functions | |
Given a Hecke Grossencharacter χ: \A× → ℂ× of conductor 𝔣, we let L(χ, s) = ∑A ⊂ ℤ_{K, A+𝔣 = ℤK} χ(A) (NK/ℚA)-s.
Let CK(𝔪) = \A×/(K×.U(𝔪)) be an id\`ele class
group of modulus 𝔪 given by a gchar structure gc (see
? gc = gcharinit(x^3+4*x-1,[5,[1]]); \\ mod = 5.oo ? gc.cyc %3 = [4, 2, 0, 0] ? gcharlog(gc,idealprimedec(gc.bnf,5)[1]) \\ logarithm map CK(𝔪) → ℝn ? chi = [1,0,0,1,0]~; ? gcharduallog(gc,chi) \\ row vector of coefficients in ℝn ? L = lfuncreate([gc,chi]); \\ non algebraic L-function ? lfunzeros(L,1) ? lfuneuler(L,2) \\ Euler factor at 2 Finite order Hecke characters are a special case.
| |
Artin L functions | |
Given a Galois number field N/ℚ with group G =
P = quadhilbert(-47); \\ degree 5, Galois group D5 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
In the above, the polynomial variable (here
| |
L-functions of algebraic varieties | |
L-function of elliptic curves over number fields are supported.
? 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))
L-function of hyperelliptic genus-2 curve can be created with
? L = lfungenus2([x^2+x, x^3+x^2+1]); 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).
| |
Eta quotients / Modular forms | |
An eta quotient is created by applying
? L = lfunetaquo(Mat([1,24])); ? lfunan(L, 100) \\ first 100 values of tau(n) More general modular forms defined by modular symbols will be added later.
| |
Low-level Ldata format | |
When no direct constructor is available, you can still input an L function
directly by supplying [a, a*,A, k, N, ε, r] to It is strongly suggested to first check consistency of the created L-function:
? L = lfuncreate([a, as, A, k, N, eps, r]); ? lfuncheckfeq(L) \\ check functional equation
| |
lfun(L, s, {D = 0}) | |
Compute the L-function value L(s), or if The argument s is also allowed to be a power series; for instance, if s = α + x + O(xn), the function returns the Taylor expansion of order n around α. The result is given with absolute error less than 2-B, where B = realbitprecision.
Caveat. The requested precision has a major impact on runtimes.
It is advised to manipulate precision via
? lfun(x^2+1, 2) \\ Lmath: Dedekind zeta for Q(i) at 2 %1 = 1.5067030099229850308865650481820713960 ? L = lfuncreate(ellinit("5077a1")); \\ Ldata: Hasse-Weil zeta function ? lfun(L, 1+x+O(x^4)) \\ zero of order 3 at the central point %3 = 0.E-58 - 5.[...] E-40*x + 9.[...] E-40*x^2 + 1.7318[...]*x^3 + O(x^4) \\ Linit: zeta(1/2+it), |t| < 100, and derivative ? L = lfuninit(1, [100], 1); ? T = lfunzeros(L, [1,25]); %5 = [14.134725[...], 21.022039[...]] ? z = 1/2 + I*T[1]; ? abs( lfun(L, z) ) %7 = 8.7066865533412207420780392991125136196 E-39 ? abs( lfun(L, z, 1) ) %8 = 0.79316043335650611601389756527435211412 \\ simple zero
The library syntax is
| |
lfunan(L, n) | |
Compute the first n terms of the Dirichlet series attached to the
L-function given by
? lfunan(1, 10) \\ Riemann zeta %1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ? lfunan(5, 10) \\ Dirichlet L-function for kronecker(5,.) %2 = [1, -1, -1, 1, 0, 1, -1, -1, 1, 0]
The library syntax is
| |
lfunartin(nf, gal, rho, n) | |
Returns the
* by the values of its character on the conjugacy classes
(see
* or by the matrices that are the images of the generators
Cyclotomic numbers in In the following example we build the Artin L-functions attached to the two irreducible degree 2 representations of the dihedral group D10 defined over ℚ(ζ5), for the extension H/ℚ where H is the Hilbert class field of ℚ(sqrt{-47}). We show numerically some identities involving Dedekind ζ functions and Hecke L series.
? P = quadhilbert(-47) %1 = x^5 + 2*x^4 + 2*x^3 + x^2 - 1 ? N = nfinit(nfsplitting(P)); ? G = galoisinit(N); \\ D_10 ? [T,n] = galoischartable(G); ? T \\ columns give the irreducible characters %5 = [1 1 2 2] [1 -1 0 0] [1 1 -y^3 - y^2 - 1 y^3 + y^2] [1 1 y^3 + y^2 -y^3 - y^2 - 1] ? n %6 = 5 ? L2 = lfunartin(N,G, T[,2], n); ? L3 = lfunartin(N,G, T[,3], n); ? L4 = lfunartin(N,G, T[,4], n); ? s = 1 + x + O(x^4); ? lfun(-47,s) - lfun(L2,s) %11 ~ 0 ? lfun(1,s)*lfun(-47,s)*lfun(L3,s)^2*lfun(L4,s)^2 - lfun(N,s) %12 ~ 0 ? lfun(1,s)*lfun(L3,s)*lfun(L4,s) - lfun(P,s) %13 ~ 0 ? bnr = bnrinit(bnfinit(x^2+47),1,1); ? bnr.cyc %15 = [5] \\ Z/5Z: 4 nontrivial ray class characters ? lfun([bnr,[1]], s) - lfun(L3, s) %16 ~ 0 ? lfun([bnr,[2]], s) - lfun(L4, s) %17 ~ 0 ? lfun([bnr,[3]], s) - lfun(L3, s) %18 ~ 0 ? lfun([bnr,[4]], s) - lfun(L4, s) %19 ~ 0 The first identity identifies the nontrivial abelian character with (-47,.); the second is the factorization of the regular representation of D10; the third is the factorization of the natural representation of D10 ⊂ S5; and the final four are the expressions of the degree 2 representations as induced from degree 1 representations.
The library syntax is
| |
lfuncheckfeq(L, {t}) | |
Given the data attached to an L-function (
If the function has poles, the polar part must be specified. The routine
returns a bit accuracy b such that |w - w| < 2b, where w is
the root number contained in
? \pb 128 \\ 128 bits of accuracy ? default(realbitprecision) %1 = 128 ? L = lfuncreate(1); \\ Riemann zeta ? lfuncheckfeq(L) %3 = -124 i.e. the given data is consistent to within 4 bits for the particular check consisting of estimating the root number from all other given quantities. Checking away from the unit disc will either fail with a precision error, or give disappointing results (if θ(1/t) is large it will be computed with a large absolute error)
? lfuncheckfeq(L, 2+I) %4 = -115 ? lfuncheckfeq(L,10) *** at top-level: lfuncheckfeq(L,10) *** ^ — — — — — — *** lfuncheckfeq: precision too low in lfuncheckfeq. The case of Dedekind zeta functions. Dedekind zeta function for a number field K = ℚ[X]/(T) is in general computed (assuming Artin conjecture) as (ζK/ζk) x ζk, where k is a maximal subfield, applied recursively if possible. When K/ℚ is Galois, the zeta function is directly decomposed as a product of Artin L-functions.
These decompositions are computed when
* the artificial query
* a query At the default accuracy of 128 bits:
? T = polcyclo(43); ? lfuncheckfeq(T); *** at top-level: lfuncheckfeq(T) *** ^ — — — — — *** lfuncheckfeq: overflow in lfunthetacost. ? lfuncheckfeq(lfuninit(T, [2])) time = 107 ms. %2 = -122
The library syntax is
| |
lfunconductor(L, {setN = 10000}, {flag = 0}) | |
Computes the conductor of the given L-function (if the structure
contains a conductor, it is ignored). Two methods are available,
depending on what we know about the conductor, encoded in the
* If flag is 0 (default), gives either the conductor found as an integer, or a vector (possibly empty) of conductors found. If flag is 1, same but gives the computed floating point approximations to the conductors found, without rounding to integers. It flag is 2, gives all the conductors found, even those far from integers. Caveat. This is a heuristic program and the result is not proven in any way:
? L = lfuncreate(857); \\ Dirichlet L function for kronecker(857,.) ? \p19 realprecision = 19 significant digits ? lfunconductor(L) %2 = [17, 857] ? lfunconductor(L,,1) \\ don't round %3 = [16.99999999999999999, 857.0000000000000000] ? \p38 realprecision = 38 significant digits ? lfunconductor(L) %4 = 857
Increasing
*
In that case, flag is ignored and the routine uses
? E = ellinit([0,0,0,4,0]); /* Elliptic curve y^2 = x^3+4x */ ? E.disc \\ |disc E| = 2^12 %2 = -4096 \\ create Ldata by hand. Guess that root number is 1 and conductor N ? L(N) = lfuncreate([n->ellan(E,n), 0, [0,1], 2, N, 1]); \\ lfunconductor ignores conductor = 1 in Ldata ! ? lfunconductor(L(1), divisors(E.disc)) %5 = [32, -127] ? fordiv(E.disc, d, print(d,": ",lfuncheckfeq(L(d)))) \\ direct check 1: 0 2: 0 4: -1 8: -2 16: -3 32: -127 64: -3 128: -2 256: -2 512: -1 1024: -1 2048: 0 4096: 0
The above code assumed that root number was 1;
had we set it to -1, none of the
? L2 = lfuncreate([n->ellan(E,n), 0, [0,1], 2, 0, -1]); ? lfunconductor(L2, divisors(E.disc)) %7 = []
The library syntax is
| |
lfuncost(L, {sdom}, {der = 0}) | |
Estimate the cost of running
* If L contains the root number, indicate that t coefficients an
will be computed, as well as t values of
* If the root number is not known, then more values of an may
be needed in order to compute it, and the returned value of t takes this
into account (it may not be the exact value in this case but is always
an upper bound). Fewer than t
If L is already an
? \pb 128 ? lfuncost(1, [100]) \\ for zeta(1/2+I*t), |t| < 100 %1 = [7, 242] \\ 7 coefficients, 242 bits ? lfuncost(1, [1/2, 100]) \\ for zeta(s) in the critical strip, |Im s| < 100 %2 = [7, 246] \\ now 246 bits ? lfuncost(1, [100], 10) \\ for zeta(1/2+I*t), |t| < 100 %3 = [8, 263] \\ 10th derivative increases the cost by a small amount ? lfuncost(1, [10^5]) %3 = [158, 113438] \\ larger imaginary part: huge accuracy increase ? L = lfuncreate(polcyclo(5)); \\ Dedekind zeta for Q(zeta5) ? lfuncost(L, [100]) \\ at s = 1/2+I*t), |t| < 100 %5 = [11457, 582] ? lfuncost(L, [200]) \\ twice higher %6 = [36294, 1035] ? lfuncost(L, [10^4]) \\ much higher: very costly ! %7 = [70256473, 45452] ? \pb 256 ? lfuncost(L, [100]); \\ doubling bit accuracy is cheaper %8 = [17080, 710] ? \p38 ? K = bnfinit(y^2 - 4493); [P] = idealprimedec(K,1123); f = [P,[1,1]]; ? R = bnrinit(K, f); R.cyc %10 = [1122] ? L = lfuncreate([R, [7]]); \\ Hecke L-function ? L[6] %12 = 0 \\ unknown root number ? \pb 3000 ? lfuncost(L, [0], 1) %13 = [1171561, 3339] ? L = lfuninit(L, [0], 1); time = 1min, 56,426 ms. ? lfuncost(L) %14 = [826966, 3339]
In the final example, the root number was unknown and
extra coefficients an were needed to compute it (1171561). Once the
initialization is performed we obtain the lower value t = 826966, which
corresponds to the number of
Finally, some L functions can be factorized algebraically
by the
? L = lfuncreate(polcyclo(5)); \\ Dedekind zeta for Q(zeta5) ? lfuncost(L, [100]) \\ a priori cost %2 = [11457, 582] ? L = lfuninit(L, [100]); \\ actually perform all initializations ? lfuncost(L) %4 = [[16, 242], [16, 242], [7, 242]] The Dedekind function of this abelian quartic field is the product of four Dirichlet L-functions attached to the trivial character, a nontrivial real character and two complex conjugate characters. The nontrivial characters happen to have the same conductor (hence same evaluation costs), and correspond to two evaluations only since the two conjugate characters are evaluated simultaneously. For a total of three L-functions evaluations, which explains the three components above. Note that the actual cost is much lower than the a priori cost in this case.
The library syntax is
| |
lfuncreate(obj) | |
This low-level routine creates
? L = lfuncreate(1); \\ Riemann zeta ? L = lfuncreate(5); \\ Dirichlet L-function for quadratic character (5/.) ? L = lfuncreate(x^2+1); \\ Dedekind zeta for Q(i) ? L = lfuncreate(ellinit([0,1])); \\ L-function of E/Q: y^2=x^3+1
One can then use, e.g., We now describe the low-level interface, used to input nonbuiltin L-functions. The input is now a 6 or 7 component vector V = [a, astar, Vga, k, N, eps, poles], whose components are as follows:
*
? z = lfuncreate([n->vector(n,i,1), 1, [0], 1, 1, 1, 1]); \\ Riemann zeta ? lfun(z,2) - Pi^2/6 %2 = -5.877471754111437540 E-39
A second format is limited to L-functions affording an
Euler product. It is a closure of arity 2
? z = lfuncreate([(p,d)->1/(1-x), 1, [0], 1, 1, 1, 1]); \\ Riemann zeta ? lfun(z,2) - Pi^2/6 %4 = -5.877471754111437540 E-39
One can describe separately the generic local factors coefficients
and the bad local factors by setting
N = 15; E = ellinit([1, 1, 1, -10, -10]); \\ = "15a1" F(p,d) = 1 / (1 - ellap(E,p)*'x + p*'x^2); Lbad = [[3, 1/(1+'x)], [5, 1/(1-'x)]]; L = lfuncreate([[F,Lbad], 0, [0,1], 2, N, ellrootno(E)]);
Of course, in this case,
*
*
* By default we assume that an = Oε(nk1+ε), where k1 = w and even k1 = w/2 when the L function has no pole (Ramanujan-Petersson). If this is not the case, you can replace the k argument by a vector [k,k1], where k1 is the upper bound you can assume.
*
*
* The last optional component
Finally, if a = a*, we allow a shortcut to describe
the frequent situation where L has at most simple pole, at s = k,
with residue r a complex scalar: you may then input
When one component is not exact.
Alternatively,
? Ld1() = [n->lfunan(Mod(2,7),n),1,[0],1,7,((-13-3*sqrt(-3))/14)^(1/6)]; ? Ld2 = [n->lfunan(Mod(2,7),n),1,[0],1,7,((-13-3*sqrt(-3))/14)^(1/6)]; ? L1 = lfuncreate(Ld1); ? L2 = lfuncreate(Ld2); ? lfun(L1,1/2+I*200) \\ OK %5 = 0.55943925130316677665287870224047183265 - 0.42492662223174071305478563967365980756*I ? lfun(L2,1/2+I*200) \\ all accuracy lost %6 = 0.E-38 + 0.E-38*I
The accuracy lost in
? Ld3() = printf("prec needed: %ld bits",getlocalbitprec());Ld1() ? L3 = lfuncreate(Ld3); prec needed: 64 bits ? z3 = lfun(L3,1/2+I*200) prec needed: 384 bits %16 = 0.55943925130316677665287870224047183265 - 0.42492662223174071305478563967365980756*I
The library syntax is
| |
lfundiv(L1, L2) | |
Creates the
The library syntax is
| |
lfundual(L) | |
Creates the
? L = lfunqf(matdiagonal([1,2,3,4])); ? eps = lfunrootres(L)[3]; k = L[4]; ? M = lfundual(L); lfuncheckfeq(M) %3 = -127 ? s= 1+Pi*I; ? a = lfunlambda(L,s); ? b = eps * lfunlambda(M,k-s); ? exponent(a - b) %7 = -130
The library syntax is
| |
lfunetaquo(M) | |
Returns the
? L = lfunetaquo(Mat([1,24])); ? lfunan(L, 100) \\ first 100 values of tau(n)
For convenience, a
? L = lfunetaquo([1,24]); \\ same as above
The library syntax is
| |
lfuneuler(L, p) | |
Return the Euler factor at p of the
L-function given by
? E=ellinit([1,3]); ? lfuneuler(E,7) %2 = 1/(7*x^2-2*x+1) ? L=lfunsympow(E,2); ? lfuneuler(L,11) %4 = 1/(-1331*x^3+275*x^2-25*x+1)
The library syntax is
| |
lfungenus2(F) | |
Returns the
The library syntax is
| |
lfunhardy(L, t) | |
Variant of the Hardy Z-function given by
? T = 100; \\ maximal height ? L = lfuninit(1, [T]); \\ initialize for zeta(1/2+it), |t|<T ? \p19 \\ no need for large accuracy ? ploth(t = 0, T, lfunhardy(L,t))
Using
The library syntax is
| |
lfuninit(L, sdom, {der = 0}) | |
Initalization function for all functions linked to the
computation of the L-function L(s) encoded by
The argument The height h of the domain is a crucial parameter: if you only need L(s) for real s, set h to 0. The running time is roughly proportional to (B / d+π h/4)d/2+3N1/2, where B is the default bit accuracy, d is the degree of the L-function, and N is the conductor (the exponent d/2+3 is reduced to d/2+2 when d = 1 and d = 2). There is also a dependency on w, which is less crucial, but make sure to use the smallest rectangular domain that you need.
? L0 = lfuncreate(1); \\ Riemann zeta ? L = lfuninit(L0, [1/2, 0, 100]); \\ for zeta(1/2+it), |t| < 100 ? lfun(L, 1/2 + I) ? L = lfuninit(L0, [100]); \\ same as above ! Riemann-Siegel formula. If L is a function of degree d = 1, then a completely different algorithm is implemented which can compute with complexity N sqrt{h} (for fixed accuracy B). So it handles larger imaginary parts than the default implementation. But this variant is less efficient when the imaginary part of s is tiny and the dependency in B is still in O(B2+1/2).
For such functions, you can use sdom =
? L = lfuninit(1, []); \\ Riemann zeta ? #lfunzeros(L, [10^12, 10^12+1]) time = 1min, 31,496 ms. %2 = 4
If you ask instead for
The library syntax is
| |
lfunlambda(L, s, {D = 0}) | |
Compute the completed L-function Λ(s) = Ns/2γ(s)L(s),
or if The result is given with absolute error less than 2-B|γ(s)Ns/2|, where B = realbitprecision.
The library syntax is
| |
lfunmfspec(L) | |
Let L be the L-function attached to a modular eigenform f of
weight k, as given by
? D = mfDelta(); mf = mfinit(D); L = lfunmf(mf, D); ? [ve, vo, om, op] = lfunmfspec(L) %2 = [[1, 25/48, 5/12, 25/48, 1], [1620/691, 1, 9/14, 9/14, 1, 1620/691],\ 0.0074154209298961305890064277459002287248,\ 0.0050835121083932868604942901374387473226] ? DS = mfsymbol(mf, D); bestappr(om*op / mfpetersson(DS), 10^8) %3 = 8192/225 ? mf = mfinit([4, 9, -4], 0); ? F = mfeigenbasis(mf)[1]; L = lfunmf(mf, F); ? [v, om] = lfunmfspec(L) %6 = [[1, 10/21, 5/18, 5/24, 5/24, 5/18, 10/21, 1],\ 1.1302643192034974852387822584241400608] ? FS = mfsymbol(mf, F); bestappr(om^2 / mfpetersson(FS), 10^8) %7 = 113246208/325
The library syntax is
| |
lfunmul(L1, L2) | |
Creates the
The library syntax is
| |
lfunorderzero(L, {m = -1}) | |
Computes the order of the possible zero of the L-function at the center k/2 of the critical strip; return 0 if L(k/2) does not vanish. If m is given and has a nonnegative value, assumes the order is at most m. Otherwise, the algorithm chooses a sensible default:
* if the L argument is an * else assume the order is less than 4.
You may explicitly increase this value using optional argument m; this
overrides the default value above. (Possibly forcing a recomputation
of the
The library syntax is
| |
lfunparams(ldata) | |
Returns the parameters [N, k, Vga] of the L-function
defined by
? L = lfuncreate(1); /* Riemann zeta function */ ? lfunparams(L) %2 = [1, 1, [0]]
The library syntax is
| |
lfunqf(Q) | |
Returns the
? L = lfunqf(matid(2)); ? lfunqf(L,2) %2 = 6.0268120396919401235462601927282855839 ? lfun(x^2+1,2)*4 %3 = 6.0268120396919401235462601927282855839 The following computes the Madelung constant:
? L1=lfunqf(matdiagonal([1,1,1])); ? L2=lfunqf(matdiagonal([4,1,1])); ? L3=lfunqf(matdiagonal([4,4,1])); ? F(s)=6*lfun(L2,s)-12*lfun(L3,s)-lfun(L1,s)*(1-8/4^s); ? F(1/2) %5 = -1.7475645946331821906362120355443974035
The library syntax is
| |
lfunrootres(data) | |
Given the The output is a 3-component vector [[[a1,r1],...,[an, rn], [[b1, R1],...,[bm, Rm]] , w], where ri is the polar part of L(s) at ai, Ri is is the polar part of Λ(s) at bi or [0,0,r] if there is no pole, and w is the root number. In the present implementation, * either the polar part must be completely known (and is then arbitrary): the function determines the root number,
? L = lfunmul(1,1); \\ zeta^2 ? [r,R,w] = lfunrootres(L); ? r \\ single pole at 1, double %3 = [[1, 1.[...]*x^-2 + 1.1544[...]*x^-1 + O(x^0)]] ? w %4 = 1 ? R \\ double pole at 0 and 1 %5 = [[1,[...]], [0,[...]]]~ * or at most a single pole is allowed: the function computes both the root number and the residue (0 if no pole).
The library syntax is
| |
lfunshift(L, d, {flag}) | |
Creates the Ldata structure (without initialization) corresponding to the shift of L by d, that is to the function Ld such that Ld(s) = L(s-d). If flag = 1, return the product L x Ld instead.
? Z = lfuncreate(1); \\ zeta(s) ? L = lfunshift(Z,1); \\ zeta(s-1) ? normlp(Vec(lfunlambda(L,s)-lfunlambda(L,3-s))) %3 = 0.E-38 \\ the expansions coincide to 'seriesprecision' ? lfun(L,1) %4 = -0.50000000000000000000000000000000000000 \\ = zeta(0) ? M = lfunshift(Z,1,1); \\ zeta(s)*zeta(s-1) ? normlp(Vec(lfunlambda(M,s)-lfunlambda(M,2-s))) %6 = 2.350988701644575016 E-38 ? lfun(M,2) \\ simple pole at 2, residue zeta(2) %7 = 1.6449340668482264364724151666460251892*x^-1+O(x^0)
The library syntax is
| |
lfunsympow(E, m) | |
Returns the
The library syntax is
| |
lfuntheta(data, t, {m = 0}) | |
Compute the value of the m-th derivative
at t of the theta function attached to the L-function given by
The theta function is defined by the formula
Θ(t) = ∑n ≥ 1a(n)K(nt/sqrt{N}), where a(n) are the coefficients
of the Dirichlet series, N is the conductor, and K is the inverse Mellin
transform of the gamma product defined by the
The library syntax is
| |
lfunthetacost(L, {tdom}, {m = 0}) | |
This function estimates the cost of running
? \pb 1000 ? L = lfuncreate(1); \\ Riemann zeta ? lfunthetacost(L); \\ cost for theta(t), t real >= 1 %1 = 15 ? lfunthetacost(L, 1 + I); \\ cost for theta(1+I). Domain error ! *** at top-level: lfunthetacost(1,1+I) *** ^ — — — — — — -- *** lfunthetacost: domain error in lfunthetaneed: arg t > 0.785 ? lfunthetacost(L, 1 + I/2) \\ for theta(1+I/2). %2 = 23 ? lfunthetacost(L, 1 + I/2, 10) \\ for theta^((10))(1+I/2). %3 = 24 ? lfunthetacost(L, [2, 1/10]) \\ cost for theta(t), |t| >= 2, |arg(t)| < 1/10 %4 = 8 ? L = lfuncreate( ellinit([1,1]) ); ? lfunthetacost(L) \\ for t >= 1 %6 = 2471
The library syntax is
| |
lfunthetainit(L, {tdom}, {m = 0}) | |
Initalization function for evaluating the m-th derivative of theta functions with argument t in domain tdom. By default (tdom omitted), t is real, t ≥ 1. Otherwise, tdom may be * a positive real scalar ρ: t is real, t ≥ ρ. * a nonreal complex number: compute at this particular t; this allows to compute θ(z) for any complex z satisfying |z| ≥ |t| and |arg z| ≤ |arg t|; we must have |2 arg z / d| < π/2, where d is the degree of the Γ factor. * a pair [ρ,α]: assume that |t| ≥ ρ and |arg t| ≤ α; we must have |2α / d| < π/2, where d is the degree of the Γ factor.
? \p500 ? L = lfuncreate(1); \\ Riemann zeta ? t = 1+I/2; ? lfuntheta(L, t); \\ direct computation time = 30 ms. ? T = lfunthetainit(L, 1+I/2); time = 30 ms. ? lfuntheta(T, t); \\ instantaneous The T structure would allow to quickly compute θ(z) for any z in the cone delimited by t as explained above. On the other hand
? lfuntheta(T,I) *** at top-level: lfuntheta(T,I) *** ^ — — — — -- *** lfuntheta: domain error in lfunthetaneed: arg t > 0.785398163397448 The initialization is equivalent to
? lfunthetainit(L, [abs(t), arg(t)])
The library syntax is
| |
lfuntwist(L, chi) | |
Creates the Ldata structure (without initialization) corresponding to the
twist of L by the primitive character attached to the Dirichlet character
The library syntax is
| |
lfunzeros(L, lim, {divz = 8}) | |
? lfunzeros(1, 30) \\ zeros of Rieman zeta up to height 30 %1 = [14.134[...], 21.022[...], 25.010[...]] ? #lfunzeros(1, [100,110]) \\ count zeros with 100 <= Im(s) <= 110 %2 = 4 The algorithm also assumes that all zeros are simple except possibly on the real axis at s = k/2 and that there are no poles in the search interval. (The possible zero at s = k/2 is repeated according to its multiplicity.)
If you pass an
The library syntax is
| |