2012-01-19 24 views
12

Trong bài báo "Giả thuyết Riemann" của J. Brian Conrey trong hình 6 có một âm mưu của biến đổi Fourier của thuật ngữ lỗi trong định lý số nguyên tố. Xem cốt truyện sang bên trái trong hình dưới đây:Làm thế nào cốt truyện Riemann zeta không phổ với biến đổi Fourier trong Mathematica?

Plots from Conrey's paper on the Riemann hypothesis

Trong một bài viết trên blog được gọi là Primes out of Thin Air được viết bởi Chris vua có một chương trình Matlab rằng lô quang phổ. Xem cốt truyện ở bên phải ở đầu bài đăng. Một bản dịch sang Mathematica có thể:

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] 

Tuy nhiên, đây là như tôi hiểu nó xây dựng ma trận của sin biến đổi Fourier và do đó nó là rất tốn kém để tính toán. Tôi KHÔNG khuyên bạn nên chạy nó vì nó đã bị hỏng máy tính của tôi một lần.

Có cách nào trong Mathematica sử dụng chuyển đổi Fourier nhanh, để vẽ phổ với các gai tại các giá trị x bằng phần ảo của số không Riemann zeta không?

Tôi đã thử các lệnh FourierDSTFourier mà không thành công. Vấn đề có vẻ là biến số yy trong mã được bao gồm trong cả hai Sin[t*myspan/xres*yy](y[[Floor[Exp[yy]]]] - Exp[yy])/Exp[yy/2].

EDIT: 2012/01/20, tôi đã thay đổi dòng:

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

như sau:

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

EDIT: 2012/01/22, Từ bình luận Heike của, thay đổi:

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

thành:

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

+1

Bạn nhận được một vòng lặp vô hạn vì bên trong 'For' vòng lặp của bạn đang bị mắc kẹt tại' yy = 0'. Bạn có thể cần phải tăng 'yy' thay vì' stepval' trong đối số thứ ba của vòng lặp 'For'. – kglr

+0

Cảm ơn bạn đã sửa! Vấn đề vẫn tồn tại. Lần này chương trình chạy mà không đóng băng máy tính để bàn của tôi nhưng nó kết thúc với đầu ra: Không còn bộ nhớ nữa. Nhân viên toán học đã tắt. Thử bỏ các ứng dụng khác rồi thử lại. –

+1

@Mats: Chỉ cần bạn biết, đó là [hình thức xấu] (http://meta.stackexchange.com/q/64068/156389) để có [cùng câu hỏi] (http://math.stackexchange.com/q/100597/954) được đăng trên hai trang web. Bạn nên gắn cờ cho sự chú ý của người kiểm duyệt và được yêu cầu được di chuyển hoặc chỉ xóa câu hỏi trước khi đăng lại ở đây. – Simon

Trả lời

11

gì về điều này? Tôi đã viết lại sin chuyển hơi bằng cách sử dụng danh tính Exp[a Log[x]]==x^a

Clear[f] 
scale = 1000000; 
f = ConstantArray[0, scale]; 
f[[1]] = [email protected][1]; 
Monitor[Do[f[[i]] = [email protected][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] 

trong đó sản xuất

Mathematica graphics

+0

Tuyệt vời! Điều này lấp đầy một khoảng trống trong giáo dục của tôi. Chỉ một chi tiết, giá trị của biến 'span' phải là 20000 hoặc hơn, với dòng' span = 20000; 'được bao gồm trước' xlist'. Cảm ơn nhiều. –

+0

@Mats 'span' và' scale' đều giống nhau. Tôi đã sử dụng 'span' trong sổ ghi chép của mình nhưng quên thay thế tất cả các lần xuất hiện của' span' bằng 'scale' khi sao chép mã ở đây. Tôi sẽ sửa nó để làm cho nó nhất quán. – Heike

+1

Tôi không thể tự làm điều này. –

Các vấn đề liên quan