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)];