Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
458 views
License: APACHE
ubuntu2004
1
from time import time
2
3
pari.init()
4
5
6
def pari_eval(s):
7
return eval(pari.exec(s))
8
9
10
def prime_range(start, stop):
11
return pari_eval(f'primes([{start},{stop}-1])')
12
13
14
def next_prime(n):
15
return pari_eval(f'nextprime({n+1})')
16
17
18
def primitive_root(m):
19
return pari_eval(f'lift(znprimroot({m}))')
20
21
22
#ms = P.fastModularSymbolMap_11a
23
24
25
def goSlow(numCoeffs, d=3, p=32749):
26
M = 11
27
MS = ManinSymbols(M)
28
P = MS.presentation(p)
29
v = []
30
m = 100
31
while True:
32
m = next_prime(m)
33
while m % d != 1:
34
m = next_prime(m)
35
print(f'd={d}: {len(v)} < {numCoeffs}')
36
g = primitive_root(m)
37
special = pari_eval(f'lift(Mod(-1/{M},{m})^(({d}+1)/2))')
38
scale = pari_eval(f'1/sqrt(({m}-1)*log({m}))')
39
#print(m, g, special, scale)
40
ww = (d - 1) / 2
41
for k in range(1, ww + 1):
42
s = 0
43
zz = (m - 1) / (2 * d)
44
for j in range(zz):
45
numer = pari_eval(
46
f'lift({special}*Mod({g},{m})^({j}*{d}+{k}))')
47
#print("ms ", numer, m, ZZ(P.fastModularSymbolMap_11a(numer, m))/10)
48
s += P.fastModularSymbolMap_11a(numer, m)
49
v.append(scale * s / 10)
50
if len(v) >= numCoeffs: return v
51
52
53
# NOTE: p better be less than 2^15. Biggest option is the default.
54
def go(numCoeffs, d=3, p=32749):
55
t0 = time()
56
M = 11
57
MS = ManinSymbols(M)
58
P = MS.presentation(p)
59
v = []
60
m = 100
61
while True:
62
m = next_prime(m)
63
while m % d != 1:
64
m = next_prime(m)
65
if len(v) > 0:
66
eta = int((int(time()-t0) / len(v)) * (numCoeffs - len(v)))
67
print(f'd={d}: numCoeffs={len(v)} < {numCoeffs}, time={int(time()-t0)}s, ETA={eta}s')
68
g = primitive_root(m)
69
special = pari_eval(f'lift(Mod(-1/{M},{m})^(({d}+1)/2))')
70
scale = pari_eval(f'1/sqrt(({m}-1)*log({m}))')
71
#print(m, g, special, scale)
72
ww = (d - 1) / 2
73
for k in range(1, ww + 1):
74
s = 0
75
a = pari_eval(f'lift({special}*Mod({g}, {m})^{k})')
76
gd = pari_eval(f'lift(Mod({g}, {m})^{d})')
77
numer = a
78
zz = (m - 1) / (2 * d)
79
for j in range(zz):
80
#print("ms ", numer, m,
81
# ZZ(P.fastModularSymbolMap_11a(numer, m)) / 10)
82
s += P.fastModularSymbolMap_11a(numer, m)
83
numer = (numer * gd) % m
84
v.append(scale * s / 10)
85
if len(v) >= numCoeffs:
86
save(v, f'data/v-d{d}n{numCoeffs}p{p}.json')
87
return v
88
89
90
def save(obj, name):
91
require('fs').writeFileSync(name, JSON.stringify(obj))
92
93