ico*_*bes 4 performance matlab vectorization
此代码需要很长时间才能运行(超过10分钟).有什么方法可以优化它,以便在不到一分钟内完成?
clear all;
for i = 1:1000000
harmonicsum = 0;
lhs = 0;
for j = 1:i
% compute harmonic sum
harmonicsum = harmonicsum + 1/j;
% find sum of factors
if (mod(i,j)==0)
lhs = lhs + j;
end
end
%define right hand side (rhs) of Riemann Hypothesis
rhs = harmonicsum + log(harmonicsum) * exp(harmonicsum);
if lhs > rhs
disp('Hypothesis violated')
end
end
Run Code Online (Sandbox Code Playgroud)
但是,一个错字,需要使用times而不是mtimes:
harmonicsum = cumsum(1 ./ (1:1e6));
rhs = harmonicsum + log(harmonicsum) .* exp(harmonicsum);
Run Code Online (Sandbox Code Playgroud)
因为lhs,我基于Eratosthenes的Sieve松散地提出以下建议:
lhs = 1 + [1:1e6];
lhs(1) = 1;
for iii = 2:numel(lhs)/2
lhs(2*iii:iii:end) = lhs(2*iii:iii:end) + iii;
end;
Run Code Online (Sandbox Code Playgroud)
执行时间仅为2.45秒(对于这个问题的一半).总计包括计算rhs和find不到3秒.
我目前正在运行其他版本以确保结果相同.
编辑:发现了一个错误lhs(1)和特殊情况(这是一个特例,唯一的自然数,其中1和N不是不同的因素)
| 归档时间: |
|
| 查看次数: |
1822 次 |
| 最近记录: |