Provided by: lcalc_2.0.5-1.1build2_amd64 bug

NAME

       lcalc - Compute zeros and values of L-functions

SYNOPSIS

       lcalc [OPTIONS]

DESCRIPTION

       lcalc  is  a  command-line program for computing the zeros and values of L-functions. Several L-functions
       are built-in, and the default is the Riemann zeta function. You can also specify your own  L-function  in
       the form of a data file that describes it; see the DATA FILE FORMAT section below.

COMPUTING ZEROS

       Given  an L-function (by default, the Riemann zeta), lcalc can compute its zeros using either the --zeros
       or --zeros-interval flags. For example,

       $ lcalc --zeros 1000

       will compute the first thousand zeros of the Riemann zeta  function,  while  checking  the  (generalized)
       Riemann  hypothesis  and  making sure that no zeros are missed. The output consists only of the imaginary
       parts of the zeros, since all of the real parts should be 0.5.

       The (generalized) Riemann hypothesis is confirmed by comparing the number of zeros found to the main term
       in the formula for N(T). The difference, S(T), should be small on average.  If not,  then  missing  zeros
       are  detected and the program backtracks looking for sign changes in more refined steps. This is repeated
       until the missing zeros are found within reasonable time. Otherwise, the program exits.

       The found zeros are also verified before being output, using the explicit formula to  compare  sums  over
       the  zeros to sums over primes. The program uses this comparison to dynamically set the output precision,
       and exits if both sides do not agree to at least two  places  after  the  decimal.  More  precisely,  the
       Riemann-Weil explicit formula is checked repeatedly, as zeros are outputted. Let the non-trivial zeros of
       L(s) be 1/2 + i gamma.  Let f be a function of the form f(x) = exp(-A(x-x_0)^2), where A = log(10)/Digits
       and Digits is the working number of digits of precision (fifteen for built in doubles), and x_0 varies as
       explained shortly.

       Then, the sums over the zeros

                -----
                 \
                  )    f(gamma)
                 /
                -----
                gamma

       are  computed  in  two  ways to working precision: first using the numerically computed zeros, and second
       using the explicit formula to express the sum over zeros as a sum  over  primes  powers.  These  two  are
       compared,  and  the  program  uses  the  amount  of  agreement  between the two to help decide the output
       precision of the zeros. If the two do not agree to at least  two  digits  after  the  decimal,  then  the
       program quits.

       The  value  x_0  is  chosen  to coincide with a zero of L(s), say gamma_j, but translated by 0.5 so as to
       desymmetrize the function f  (not  translating  would  leave  it  an  even  function,  and  it  would  be
       quadratically, rather than linearly, sensitive to inaccuracies in the zeros).

       At first, a separate test function f is used for each of the zeros, with x_0 coinciding with those zeros.
       After a while, however, a new f is taken only once every five zeros, with x_0 coinciding similarly.

       You can also start after the Nth zero. For example,

       $ lcalc --zeros 5 --N 5

       outputs  the  sixth  through  tenth  zeros.  Caution:  the --N option evaluates N(T) by using the formula
       involving the main term (from the Gamma factors) and S(T). S(T) is computed by looking at the  change  of
       arg of L(s) as one goes from 1/2 - iT to infinity - iT and then up to infinity + iT and to 1/2 + iT. This
       can take a long time if T is near the ordinate of a zero. One could improve this by implementing Turing's
       method  for  finding the Nth zero (only looking at sign changes on the critical line), or by tweaking the
       starting point and suppressing a corresponding number of zeros should the program take too long, but  for
       now, only the contour integral is computed.

       A  variant  of  Turing's  method which only looks on the critical line is used for the --zeros option, to
       test that all zeros have been found. However, with regards to the --N option, S(T) is initially  computed
       via contour integration to zoom in on the Nth zero.

       If  you  aren't concerned about verifying the (generalized) Riemann hypothesis, or if you don't expect it
       to hold (for instance, if you plan to study Dirichlet series without Euler products) then you can  search
       for zeros in an "interval" using the --zeros-interval option. For example,

       $ lcalc --zeros-interval --x=10 --y=100 --stepsize=0.1

       searches  for  zeros  of the Riemann zeta function in the interval from 1/2 + 10i to 1/2 + 100i, checking
       for sign changes advancing in steps of size 0.1. The first column of the output  contains  the  imaginary
       part  of  the zero, and the second column contains a quantity related to S(T) --- it increases roughly by
       two whenever a sign change, that is, a pair of zeros, is missed. Higher up the critical strip you  should
       use  a  smaller stepsize so as not to miss zeros. The --zeros-interval options makes sense if you want to
       output zeros as they are found.

       The --zeros option, which does verify the (generalized) Riemann hypothesis, looks for several dozen zeros
       to make sure none have been missed before outputting any zeros at all; as a result, it takes longer  than
       --zeros-interval  to  output the first few zeros. For collecting more than just a handful of zeros, or to
       make certain that no zeros have been missed, one should use the --zeros option.

COMPUTING VALUES

       The lcalc program can also compute the values of an L-function by using the --value flag. For example,

       $ lcalc --value --x=0.5 --y=100

       will compute the value of the (default) Riemann zeta function at the point x + yi = 0.5 + 100i. Both real
       and complex parts are output, separated by a space; in this case, the output is approximately 2.692619886
       -0.0203860296 which represents zeta(x+yi) = 2.692619886 - 0.0203860296i.

       You can also compute values along a line segment at equally spaced points:

       $ lcalc --value-line-segment --x=0.5 --X=0.5 --y=0 --Y=10 --number-samples=100

       computes the values of the Riemann zeta function from 0.5 + 0i through 0.5 + 100i at 1000  equally-spaced
       points.  The  output  contains  four  columns:  the  real  and  imaginary parts of the current point (two
       columns), followed by the real and imaginary parts of the function value (two columns).

ELLIPTIC CURVE L-FUNCTIONS

       If lcalc was built with PARI support, the --elliptic-curve option can be combined with the  --a1  through
       --a6 flags to specify an elliptic curve L-function. For example,

       $ lcalc --zeros=5 --elliptic-curve --a1=0 --a2=0 --a3=0 --a4=0 --a6=1

       computes the first five zeros of the L-function associated with the elliptic curve y^2 = x^3 + 1.

TWISTS

       Twists  by  Dirichlet  characters  are  currently  available  for all zeta and cusp-form L-functions. For
       example,

       $ lcalc --value --x=0.5 --y=0 --twist-quadratic --start -100 --finish 100

       will output L(1/2, chi_d) for d between -100 and 100, inclusive. Other twisting  options  are  available.
       For example

       $ lcalc --zeros=200 --twist-primitive --start 3 --finish 100

       gives  the  first  two-hundred  zeros  of  all  primitive  L(s,chi)  with  a conductor between 3 and 100,
       inclusive.

       Notice that with the --twist-quadratic option one is specifying the discriminant which can  be  negative,
       while with the --twist-primitive option one is specifying the conductor which should be positive.

       When  using  the  various  twisting  options, other than --twist-quadratic, the second output column is a
       label for the character modulo n. It is an integer between  1  and  phi(n).  If  one  is  restricting  to
       primitive charcters, then only a subset of these integers appear in the second column.

       One  can  obtain  a  table  of characters using the --output-character option. This doesn't work with the
       --twist-quadratic option, but does with the other twisting options.

       The --output-character option takes an argument of either 1 or 2. An argument of  1,  for  example,  will
       print a comprehensive table of chi(n) for all gcd(n,conductor) = 1.

       The characters are constructed multiplicatively in terms of generators of the cyclic groups mod the prime
       powers  that  divide n, and there's no simple formula to go from the label to the character. As a result,
       --output-character will also output a table for  each  character  before  outputting  the  zeros  of  the
       corresponding L-function (but not with the --twist-quadratic option).

       These tables contain six columns:

       1     the value of n

       2     a label for the character, an integer between 1 and phi(n)

       3     the conductor of the inducing character (same as the first column, if primitive).

       4     column 4: m, an integer that is coprime with n

       5     Re(chi(m))

       6     Im(chi(m))

       If,  instead, --output-character=2 is given, then only the value of chi(-1) (that is, whether chi is even
       or odd) and whether chi is primitive or not will be printed.

OPTIONS

       For basic program usage, run

       $ lcalc --help

       Most of lcalc's options  are  sufficiently  explained  by  its  output.  Here  we  collect  some  further
       information about specific options.

       --rank-compute, -r
              Compute  the analytic rank. Analytic rank works well even for high rank since the method used does
              not compute derivatives, but rather looks at the behaviour of the  L-function  near  the  critical
              point.

       --derivative=<n>, -d <n>
              Compute  the  nth derivative. Presently the derivative option uses numeric differentiation (taking
              linear combinations of L(s + mh) for integers m, to pull out the relevant  Taylor  coefficient  of
              L(s)).  To get good results with higher derivatives, one should build libLfunction/lcalc with more
              precision.

EXAMPLES

       • Compute the first thousand zeros of the Riemann zeta function using  the  --zeros  option,  and  output
         their imaginary parts (after verifying that their real parts are all one-half):

         $ lcalc --zeros 1000

       • Compute the value of the Riemann zeta function at x + iy using the --value, --x, and --y options:

         $ lcalc --value --x=0.5 --y=14.134725141738

       • Compute the first 10 zeros of the Ramanujan tau L-function using the --tau and --zeros (-z) options:

         $ lcalc --tau --zeros=10

       • Compute  the  first  zero  of  the  real  quadratic Dirichlet L-function of conductor 4 after using the
         --twist-quadratic, --start, and --finish options to specify the L-function:

         $ lcalc --twist-quadratic --start=-4 --finish=-4 --zeros=1

DATA FILE FORMAT

       The lcalc -F option allows you to load L-function data from a file.  Here we explain the format  of  this
       file.  Basically  it must contain the functional equation, Dirichlet coefficients, and some other helpful
       information.

       The first line should contain an integer, either 1, 2, or 3: 1 specifies that the Dirichlet  coefficients
       are  to be given as integers (up to thirty-two bits long), 2 that they are floating point numbers, 3 that
       they are complex numbers. So, for example, the first line would be a 2 for cusp form  or  Maass  form  L-
       function  (we  normalize the L-functional so that the functional equation is s <-> 1-s, so the normalized
       Dirichlet coefficients for a cusp form L-function are not integers).

       The second line specifies info that the calculator can exploit (or will exploit at some future date).  It
       is an integer that is assigned to different types of L-functions. Currently:

       • -2 for L(s,chi) but where the number of coefficients computed is less than the period

       • -1 for zeta

       • 0 for unknown

       • 1 for periodic, including L(s,chi)2 for cusp form (in S_K(Gamma_0(N))

       • 3 for Maass form for SL_2(Z)

       • other integers reserved for future types.

         The  third  line  is  an  integer that specifies how many Dirichlet coefficients to read from the file;
         there should be at least this many Dirichlet coefficients in the file. This is  a  useful  quantity  to
         specify  sincethe data file might have, say, a million coefficients, but one might want to read in just
         ten thousand of them.

         The fourth line is either 0, if the Dirichlet coefficients are not  periodic,  or  a  positive  integer
         specifying  the  period otherwise (this happens in the case of Dirichlet L-functions). For a Maass form
         it should be 0.

         The fifth line is a positive integer, the quasi-degree. This is the number of gamma factors of the form
         Gamma(gamma s + lambda) in the functional equation, where gamma is either 0.5 or 1,  and  lambda  is  a
         complex number with Re(lambda) >= 0. For example, it is 1 for Dirichlet L-functions, 1 for cusp form L-
         functions,  2  for  Maass form L-functions, etc. Note that the "1" for cusp form L-functions could be a
         "2" if you wish to split the gamma factor up using the Legendre duplication formula.  But  it's  better
         not to.

         Next  come  the  gamma  factors,  with two lines for each gamma factor. The first of each pair of lines
         contains gamma (either 0.5 or 1), and the second  line  contains  a  pair  of  floating  point  numbers
         separated  by  a  space  specifying the real and imaginary parts of lambda (even if purely real, lambda
         should be given as a pair of numbers, the second one then being 0).

         Next you specify the functional equation. Let

                              a
                           --------'
                          '  |  |
                             |  |
           Lambda(s) = Q^s   |  |  Gamma(gamma_j*s + lambda_j)*L(s)
                             |  |
                            j = 1

         satisfy Lambda(s) = omega*conj(Lambda(1-conj(s))), where Q is  a  real  number,  omega  is  complex,and
         "conj"  denotes  the complex conjugate. Notice that the functional equation is s into 1-s; that is, the
         gamma factors and Dirichlet coefficients of L(s) should be normalized correctly so as to have  critical
         line Re(s) = 1/2.

         The  next  line  in  the  datafile is Q giving as a floating point number, and the one after that gives
         omega as a pair x y of floating point numbers, specifying the real and imaginary parts of  omega  (even
         when  omega  is unity, it should be given as a pair of floating points, for example 1 0 to indicate 1 +
         0i).

         We need to allow for the possibility of poles. For example, if L(s) = zeta(s) then Lambda(s) has simple
         poles with residue 1 at s=1 and residue -1 at s=0.  To take into account such  possibilities  I  assume
         that  Lambda(s)  has at most simple poles.  So, the next line specifies the number of poles (usually 0)
         and then, for each pole there are two lines. The first line in each pair gives the pole x+iy as a  pair
         x  y  of  floating point numbers. The second line specifies the residue at that pole, also as a pair of
         floating point numbers.

         Finally the Dirichlet coefficients. The remaining lines  in  the  file  contain  a  list  of  Dirichlet
         coefficients,  at  least  as  many  as indicated in line three of the datafile. The coefficients can be
         integers, real, or complex. If complex they should, as usual, be given as a pair x y of floating  point
         numbers  separated  by a space. Otherwise they should be given as single column of integers or floating
         point numbers respectively.

         The datafile should only contain numbers and no comments. The  comments  below  are  for  the  sake  of
         understanding the structure of the datafile.

         An  example  data  file  for  the  Maass  form  for  SL_2(Z)  associated  to  the  eigenvalue  with R =
         13.779751351891 is given below (beware: the Dirichlet coefficients for this particular  L-function  are
         only accurate to a handful of decimal places, especially near the tail of the file).

         2                    the Dirichlet coefficients are real
         3                    this is a Maass form L-function
         29900                use this many of the Dirichlet coefficients
         0                    zero since the coefficients are not periodic
         2                    two gamma factors
         .5                   the first gamma factor
         0 6.88987567594535   the first lambda
         .5                   the second gamma factor
         0 -6.88987567594535  the second lambda
         .3183098861837906715 the Q in the functional equation
         1 0                  the omega 1 + 0i in the functional equation
         0                    the number of poles of Lambda(s)
         1                    the first Dirichlet coefficient
         1.549304477941       the second Dirichlet coefficient
         0.246899772454       the third Dirichlet coefficient
         1.400344365369       the fourth Dirichlet coefficient
         ...

         Several such example data files are included with lcalc.

BUGS

       Report bugs to https://gitlab.com/sagemath/lcalc/issues

                                                                                                        lcalc(1)