我在Julia中实现了一个函数来创建一个大小为N的Riemann矩阵。它是一个与Riemann假设相关的N-by-N矩阵,当且仅在以下情况下为真:
每个DET(A) = O( N! N^(-1/2+epsilon))
epsilon > 0
,DET()
表示行列式,!
表示阶乘。
其中,A =黎曼矩阵,
A = B(2:N+1, 2:N+1)
,其中
B(i,j) = i-1 if i divides j, and
-1 otherwise.
这是我的代码工作正常,但需要优化:
function riemann(x::Int32)
R = zeros(Int32,x+1,x+1)
for i=1:x+1, j=1:x+1
if j%i == 0
R[i,j] = i-1
else
R[i,j] = -1
end
end
return R[2:x+1,2:x+1]
end
希望我需要以更高效的形式编写它,如:
function riemann!{T}(R::AbstractMatrix{T}, x::T)
.
.
.
任何建议都表示赞赏。
编辑:
嗯,这是我上面建议的另一种形式。我把它与原始代码计时并没有发现速度增益。
function calc_riemann!{T}(R::AbstractMatrix{T}, x::T)
for i=1:x+1, j=1:x+1
if j%i == 0
R[i,j] = i-1
else
R[i,j] = -1
end
end
end
function riemann(x::Int)
R = Array(Int, x+1,x+1)
calc_riemann!(R, x)
y = R[2:x+1,2:x+1]
end
答案 0 :(得分:3)
通过删除所有测试,我们可以更快地完成这项工作(我们可以直接进入倍数)。
function my_riemann(x::Int)
R = Array(Int,x+1,x+1)
fill!(R,-1)
for i=2:x+1
for j=i:i:x+1
R[i,j] = i - 1
end
end
return R[2:x+1,2:x+1]
end
<强> 修改 强>
是的,分配正确的大小Array
而不是复制它会大大加快速度。看看你的这个版本的时间是否大大减少了。
function my_riemann2(x::Int)
R = Array(Int,x,x)
fill!(R,-1)
for i=1:x
for j=i:i+1:x
R[i,j] = i
end
end
return R
end