License: APACHE
ubuntu2004
from time import time12pari.init()345def pari_eval(s):6return eval(pari.exec(s))789def prime_range(start, stop):10return pari_eval(f'primes([{start},{stop}-1])')111213def next_prime(n):14return pari_eval(f'nextprime({n+1})')151617def primitive_root(m):18return pari_eval(f'lift(znprimroot({m}))')192021#ms = P.fastModularSymbolMap_11a222324def goSlow(numCoeffs, d=3, p=32749):25M = 1126MS = ManinSymbols(M)27P = MS.presentation(p)28v = []29m = 10030while True:31m = next_prime(m)32while m % d != 1:33m = next_prime(m)34print(f'd={d}: {len(v)} < {numCoeffs}')35g = primitive_root(m)36special = pari_eval(f'lift(Mod(-1/{M},{m})^(({d}+1)/2))')37scale = pari_eval(f'1/sqrt(({m}-1)*log({m}))')38#print(m, g, special, scale)39ww = (d - 1) / 240for k in range(1, ww + 1):41s = 042zz = (m - 1) / (2 * d)43for j in range(zz):44numer = pari_eval(45f'lift({special}*Mod({g},{m})^({j}*{d}+{k}))')46#print("ms ", numer, m, ZZ(P.fastModularSymbolMap_11a(numer, m))/10)47s += P.fastModularSymbolMap_11a(numer, m)48v.append(scale * s / 10)49if len(v) >= numCoeffs: return v505152# NOTE: p better be less than 2^15. Biggest option is the default.53def go(numCoeffs, d=3, p=32749):54t0 = time()55M = 1156MS = ManinSymbols(M)57P = MS.presentation(p)58v = []59m = 10060while True:61m = next_prime(m)62while m % d != 1:63m = next_prime(m)64if len(v) > 0:65eta = int((int(time()-t0) / len(v)) * (numCoeffs - len(v)))66print(f'd={d}: numCoeffs={len(v)} < {numCoeffs}, time={int(time()-t0)}s, ETA={eta}s')67g = primitive_root(m)68special = pari_eval(f'lift(Mod(-1/{M},{m})^(({d}+1)/2))')69scale = pari_eval(f'1/sqrt(({m}-1)*log({m}))')70#print(m, g, special, scale)71ww = (d - 1) / 272for k in range(1, ww + 1):73s = 074a = pari_eval(f'lift({special}*Mod({g}, {m})^{k})')75gd = pari_eval(f'lift(Mod({g}, {m})^{d})')76numer = a77zz = (m - 1) / (2 * d)78for j in range(zz):79#print("ms ", numer, m,80# ZZ(P.fastModularSymbolMap_11a(numer, m)) / 10)81s += P.fastModularSymbolMap_11a(numer, m)82numer = (numer * gd) % m83v.append(scale * s / 10)84if len(v) >= numCoeffs:85save(v, f'data/v-d{d}n{numCoeffs}p{p}.json')86return v878889def save(obj, name):90require('fs').writeFileSync(name, JSON.stringify(obj))919293