Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241818 views
1
from sage.all import prime_range, I
2
3
class J_E:
4
def __init__(self, E, N, K):
5
self.E = E
6
self.ap = [K(ap) for ap in E.aplist(N)]
7
self.N = N
8
self.primes = [K(p) for p in prime_range(N)]
9
self.K = K
10
self.log_primes = [p.log() for p in self.primes]
11
self.I = K(I)
12
13
def F0(self, t, N):
14
assert N <= self.N
15
K = self.K
16
s = 1 + t*self.I # 1 is the center
17
ans = 0
18
i = 0
19
while self.primes[i] < N:
20
ap = self.ap[i]
21
p = self.primes[i]
22
X = p**(-s)
23
ans += (ap - 2*p) / (1 - ap*X + p*X*X) * X * self.log_primes[i]
24
i += 1
25
return ans
26
27
28
29
30
class J_generic:
31
def __init__(self, K, N_max=10**5):
32
"""
33
Compute J working over the field K.
34
"""
35
self.N_max = N_max
36
self.K = K
37
38
from sage.all import prime_powers, factor
39
PP = prime_powers(N_max+1)[1:]
40
41
n = len(PP)
42
self.a = [K(0)]*n
43
self.s = [K(0)]*n
44
self.pv = [0]*n
45
i = 0
46
for pv in PP:
47
F = factor(pv)
48
p, v = F[0]
49
self.pv[i] = K(pv)
50
logp = K(p).log()
51
self.a[i] = logp/K(pv).sqrt()
52
self.s[i] = v*logp
53
i += 1
54
55
def __repr__(self):
56
return "The function J(t,N) over %s of the Mazur-Stein game with N_Max=%s"%(
57
self.K, self.N_max)
58
59
def F(self, t, N):
60
K = self.K
61
t = K(t)
62
ans = K(0)
63
i = 0
64
if N > self.N_max:
65
raise ValueError, "J not defined for N > %s"%self.N_max
66
while 1:
67
if self.pv[i] >= N:
68
return ans
69
ans += self.a[i] * (self.s[i]*t).cos()
70
i += 1
71
72
def e(self, t, N):
73
K = self.K
74
return K(N).sqrt() / (.25 + t*t) * \
75
( (K(t*K(N).log())).cos() + 2*t*(K(t*K(N).log())).sin() )
76
77
def H(self, t, N):
78
K = self.K
79
ans = K(0); F = K(0)
80
i = 0
81
if N > self.N_max:
82
raise ValueError, "J not defined for N > %s"%self.N_max
83
n = 1
84
while 1:
85
if self.pv[i] > N:
86
# time to return. But first we have to add a few more
87
# values to ans up to N (where F is constant).
88
while n <= N:
89
ans += F + self.e(t,n)
90
n += 1
91
# Finally return after dividing by N.
92
return ans / N
93
# At this point, F is equal to self.F(t, self.pv._values[i]),
94
# and now we add to our running total a range of values of
95
96
# F(t, n) + e(t,n)
97
while n <= self.pv[i]:
98
ans += F + self.e(t,n)
99
n += 1
100
101
F += self.a[i] * cos(self.s[i]*t)
102
103
# move to next prime power
104
i += 1
105
106
def J(self, t, N):
107
K = self.K
108
return self.H(t,N) / K(N).log()
109
110
def __call__(self, t, N):
111
return self.J(t,N)
112
113
######################################################
114
# Cesaro of Cesaro...
115
######################################################
116
def Jc(self, t, N):
117
K = self.K
118
ans = K(0); F = K(0); ans2 = K(0)
119
i = 0
120
if N > self.N_max:
121
raise ValueError, "J not defined for N > %s"%self.N_max
122
n = 1
123
while 1:
124
if self.pv[i] > N:
125
# time to return. But first we have to add a few more
126
# values to ans up to N (where F is constant).
127
while n <= N:
128
ans += F + self.e(t,n)
129
if n >= 2:
130
ans2 += ans / (n*K(n).log())
131
#print (n, F, self.e(t,n))
132
n += 1
133
# Finally return after dividing by N.
134
return ans2 / N
135
# At this point, F is equal to self.F(t, self.pv._values[i]),
136
# and now we add to our running total a range of values of
137
138
# F(t, n) + e(t,n)
139
while n <= self.pv[i]:
140
ans += F + self.e(t,n)
141
if n >= 2:
142
ans2 += ans / (n*K(n).log())
143
#print (n, F, self.e(t,n))
144
n += 1
145
146
F += self.a[i] * (self.s[i]*t).cos()
147
148
# move to next prime power
149
i += 1
150
151