Performance 改进Lemoine'的代码;s猜想
我正在尝试改进以下代码: 编写代码是为了求解以下方程:Performance 改进Lemoine'的代码;s猜想,performance,matlab,vectorization,Performance,Matlab,Vectorization,我正在尝试改进以下代码: 编写代码是为了求解以下方程: 2*n + 1 = p + 2*q 该方程表示给定一个整数n值2*n+1始终可以用p+2*q表示,其中p和q是素数。 这在很多年前就被证明了,被称为Lemoine猜想 代码的输入是一个数字(n>2),输出是一个包含两列有效素数的矩阵 n = 23; S = 2*n+1; P = primes(S); V = []; kk = 1; for ii=1:length(P) for jj=1:length(P)
2*n + 1 = p + 2*q
该方程表示给定一个整数n
值2*n+1
始终可以用p+2*q
表示,其中p
和q
是素数。
这在很多年前就被证明了,被称为Lemoine猜想
代码的输入是一个数字(n>2
),输出是一个包含两列有效素数的矩阵
n = 23;
S = 2*n+1;
P = primes(S);
V = [];
kk = 1;
for ii=1:length(P)
for jj=1:length(P)
if (S == P(ii)+2*P(jj))
V(kk,:) = [P(ii) P(jj)];
kk = kk + 1;
end
end
end
结果是,
V =
13 17
37 5
41 3
43 2
例如:
2*23+1 = 43 + 2*2
有没有一种方法可以消除MATLAB中的for循环
更新:
由@Daniel建议,同样有效
n = 23;
S = 2*n+1;
P = primes(S);
for ii=1:length(P)
if ismember(S - P(ii),P)
V(kk,:) = [P(ii) S-P(ii)];
end
end
可以使用矢量化解决方案替换这些循环- 使用
n=100000
,我得到的运行时是-
------------ With loopy solution
Elapsed time is 33.789586 seconds.
----------- With bsxfun solution
Elapsed time is 1.338330 seconds.
这是一种替代实现:
p_candidates=primes(2*n+1-4);
q_candidates=p_candidates(p_candidates<n+1);
p_needed=2*n+1-2*q_candidates;
solution=ismember(p_needed,p_candidates);
m=[q_candidates(solution);p_needed(solution)];
p_候选者=素数(2*n+1-4);
q_candidates=p_candidates(p_candidatest这里不需要两个循环。p=2*n+1-2*q
。选择q并计算p。然后检查p是否在数组p中。谢谢,我已经添加了你的建议。@Daniel你只比我快了一点-(无论如何,如果你在素数数组中迭代寻找合适的q
,你可以在q>n
p_candidates=primes(2*n+1-4);
q_candidates=p_candidates(p_candidates<n+1);
p_needed=2*n+1-2*q_candidates;
solution=ismember(p_needed,p_candidates);
m=[q_candidates(solution);p_needed(solution)];