Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
Function: lfunconductor Section: l_functions C-Name: lfunconductor Prototype: GDGD0,L,b Help: lfunconductor(L, {setN = 10000},{flag=0}): give the conductor of the given L-function, expecting to find it in the interval [1,setN]. If flag=0 (default), give either the conductor found as an integer, or a vector of conductors found, possibly empty. If flag=1, same but give the computed floating point approximations to the conductors found, without rounding to integers. If flag=2, give all the conductors found, even those far from integers. Alternatively, setN can contain a list of possible conductors and we select the best one according to lfuncheckfeq; in this case, flag is ignored and we return [N, lfuncheckfeq for that N]. Doc: Compute 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 \kbd{setN} parameter: \item \kbd{setN} is a scalar: we know nothing but expect that the conductor lies in the interval $[1, \kbd{setN}]$. If \kbd{flag} is $0$ (default), give either the conductor found as an integer, or a vector (possibly empty) of conductors found. If \kbd{flag} is $1$, same but give the computed floating point approximations to the conductors found, without rounding to integers. It \kbd{flag} is $2$, give all the conductors found, even those far from integers. \misctitle{Caveat} This is a heuristic program and the result is not proven in any way: \bprog ? 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 @eprog\noindent Increasing \kbd{setN} or increasing \kbd{realbitprecision} slows down the program but gives better accuracy for the result. This algorithm should only be used if the primes dividing the conductor are unknown, which is uncommon. \item \kbd{setN} is a vector of possible conductors; for instance of the form \kbd{D1 * divisors(D2)}, where $D_1$ is the known part of the conductor and $D_2$ is a multiple of the contribution of the bad primes. In that case, \kbd{flag} is ignored and the routine uses \kbd{lfuncheckfeq}. It returns $[N,e]$ where $N$ is the best conductor in the list and $e$ is the value of \kbd{lfuncheckfeq} for that $N$. When no suitable conductor exist or there is a tie among best potential conductors, return the empty vector \kbd{[]}. \bprog ? 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 @eprog\noindent The above code assumed that root number was $1$; had we set it to $-1$, none of the \kbd{lfuncheckfeq} values would have been acceptable: \bprog ? L2 = lfuncreate([n->ellan(E,n), 0, [0,1], 2, 0, -1]); ? lfunconductor(L2, divisors(E.disc)) %7 = [] @eprog