如何用Mathematica中的傅立叶变换绘制Riemann zeta零谱?

Mat*_*vik 12 primes wolfram-mathematica fft

在J.Brian Conrey在图6中的论文"The Riemann Hypothesis"中,有一个素数定理中误差项的傅立叶变换图.请参见下图中左侧的图:

Conrey关于黎曼假设的论文中的情节

在由Chris King撰写的名为Primes out of Thin Air的博客文章中,有一个Matlab程序可以绘制频谱图.请参阅帖子开头右侧的情节.可以翻译成Mathematica:

数学:

 scale = 10^6;
 start = 1;
 fin = 50;
 its = 490;
 xres = 600;
 y = N[Accumulate[Table[MangoldtLambda[i], {i, 1, scale}]], 10];
 x = scale;
 a = 1;
 myspan = 800;
 xres = 4000;
 xx = N[Range[a, myspan, (myspan - a)/(xres - 1)]];
 stpval = 10^4;
 F = Range[1, xres]*0;

For[t = 1, t <= xres, t++,
 For[yy=0, yy<=Log[x], yy+=1/stpval,
 F[[t]] =
 F[[t]] +
 Sin[t*myspan/xres*yy]*(y[[Floor[Exp[yy]]]] - Exp[yy])/Exp[yy/2];
 ]
 ]
 F = F/Log[x];
 ListLinePlot[F]
Run Code Online (Sandbox Code Playgroud)

然而,据我所知,这是傅立叶正弦变换的矩阵公式,因此计算成本非常高.我不建议运行它,因为它已经崩溃了我的电脑一次.

在Mathematica中有没有一种方法可以利用快速傅立叶变换,在x值等于Riemann zeta零点的虚部的情况下绘制带有尖峰的光谱?

我已经尝试过命令FourierDSTFourier没有成功.问题似乎是yy代码中的变量包含在Sin[t*myspan/xres*yy]和中(y[[Floor[Exp[yy]]]] - Exp[yy])/Exp[yy/2].

编辑:20.1.2012,我改变了行:

For[yy = 0, yy <= Log[x], 1/stpval++,

进入以下内容:

For[yy = 0, yy/stpval <= Log[x], yy++,

编辑:2012年1月22日,来自Heike的评论,改变了:

For[yy = 0, yy/stpval <= Log[x], yy++,

成:

For[yy=0, yy<=Log[x], yy+=1/stpval,

Hei*_*ike 12

那这个呢?我用身份稍微改写了正弦变换Exp[a Log[x]]==x^a

Clear[f]
scale = 1000000;
f = ConstantArray[0, scale];
f[[1]] = N@MangoldtLambda[1];
Monitor[Do[f[[i]] = N@MangoldtLambda[i] + f[[i - 1]], {i, 2, scale}], i]

xres = .002;
xlist = Exp[Range[0, Log[scale], xres]];
tmax = 60;
tres = .015;
Monitor[errList = Table[(xlist^(-1/2 + I t).(f[[Floor[xlist]]] - xlist)), 
  {t, Range[0, 60, tres]}];, t]

ListLinePlot[Im[errList]/Length[xlist], DataRange -> {0, 60}, 
  PlotRange -> {-.09, .02}, Frame -> True, Axes -> False]
Run Code Online (Sandbox Code Playgroud)

哪个产生

Mathematica图形