/* Copyright (C) 2020 Alessandro Languasco */ /**************** A. LANGUASCO ******************** ************* COMPUTATION OF THE min_chi |L'/L| MOD q(PRIME) *******/ /************************* Building the T approach ****************/ \\ Global variables: global(Dilcher_matrix_T); global(psi_matrix); global(tab); \\global variable used to initialise sumnum global(phir); global(pir); global(defaultprecision); /************* COMPUTATION OF THE min_chi |L'/L| MOD q(PRIME) ******* ************* FOR r1<=q<=r2 ************* ************* Using the T-function ********************/ {minT(r1,r2,defaultprecision)=local(minutes, millisec, seconds, rows, columns, elaptimefinalcomp, elaptimeprecomp, M, derlog, evenresult,oddresult, phiq,qminusonehalfminusone, logtwoPi, EulerpluslogtwoPi, minuslogq, qminusonehalf,twoPi, twoPiI, i, qminusone, qminustwo, correctionderlog, u, numer, denom, v, chi ); \\ minutes,millisec,seconds: used just to compute the elapsed computation time; local variables \\ defaultprecision: used to fix the precision used in the computations; global variable print("************ A. LANGUASCO *************"); print("********* COMPUTATION OF THE MIN |L'/L|**********"); print("******* FOR q IN ONE INTERVAL ********"); print("********* with the T-function **********"); \\ precision setting if(defaultprecision >90 , print("Internal constant are defined with 100 decimal digits; you cannot set the default precision larger than 90 decimal digits"); return); default(realprecision,defaultprecision); r1=nextprime(r1); r2=precprime(r2); if (r1>r2, print("error: no odd primes in this interval. END PROGRAM");return); if (r1 < 3, r1=3); print("Interval=[",r1,",",r2,"]"); phir=r2-1; pir=primepi(r2)-primepi(r1)+1; tab = sumnuminit(); \\ needed for the sumnum functions gettime(); print("Performing precomputations of T(a/q), psi(a/q) for this interval"); precompT(r1,r2); elaptimeprecomp=gettime(); twoPi=2*Pi; logtwoPi = log(twoPi); EulerpluslogtwoPi = Euler + logtwoPi; twoPiI=twoPi*I; i=0; gettime(); print("Starting computation of min_q"); forprime(q=r1,r2, i+=1; phiq=q-1; evenresult=0; oddresult=0; qminusone=phiq; qminustwo=q-2; minuslogq=-log(q); qminusonehalf=qminusone/2; qminusonehalfminusone=qminusonehalf-1; correctionderlog= minuslogq ; u=twoPiI/qminusone; M=10^(10000);derlog=0; \\ even characters for (m=1, qminusonehalfminusone, numer=0; denom=0; v=exp(u*2*m); \\ j=2m+1; j-1 even (j odd) means an even character chi=1; for (k=0,qminustwo, \\chi=v^(k) numer += chi*Dilcher_matrix_T[i,k+1]; \\Dilcher_T(g^k%q/q) denom += chi*psi_matrix[i,k+1]; \\psi(g^k%q/q); chi=chi*v; \\print(numer); print(denom); ); derlog=abs(correctionderlog+numer/denom); if (derlog