Performance 检查大于4的偶数是否是两个素数之和的程序
我有以下问题:Performance 检查大于4的偶数是否是两个素数之和的程序,performance,primes,Performance,Primes,我有以下问题: 假设大于4的偶数可以通过2素数的加法得到 数字,我必须写一个算法来检查它。该算法所需的时间应少于O(n^2) 例如,有一组从6到n的数字。如果我们有数字6,答案是6=3+3,对于22=17+5,依此类推 我的第一个想法是: S - set of n numbers for i=1 to n { //removing odd numbers if (S[i]%2!=0) continue; result = false; for j=2 to S
假设大于4的偶数可以通过2素数的加法得到 数字,我必须写一个算法来检查它。该算法所需的时间应少于O(n^2) 例如,有一组从6到n的数字。如果我们有数字6,答案是6=3+3,对于22=17+5,依此类推 我的第一个想法是:
S - set of n numbers
for i=1 to n {
//removing odd numbers
if (S[i]%2!=0)
continue;
result = false;
for j=2 to S[i]-2{
if (j.isPrime) // prime test can be done in O(log^2(n))
if ((S[i]-j).isPrime)
result = true;
break;
else
continue;
}
if (result == false)
break;
}
因为我使用2作为循环,所以这个算法的总运行时间应该是
O(n*n)*O(log^2(n))=O(n^2*log^2(n))
不小于O(n^2)
。
有没有人有办法减少运行时间,使所需时间小于
O(n^2)
?如果集合包含大的数字,我什么都没有
如果最大值小于n^2/对数(n),则:
您应该预处理区间[1,max(S)]中的哪些数字是素数。
对于预处理,您可以使用
然后,您可以检查数字是否为O(1)中的素数,并且解决方案的复杂性变为O(N^2)。您只能运行到N的平方根,这足以确定数字是否为素数。
这将减少你的跑步时间 另外,请看下面的问题-这是一个问题。素性测试已知在P(多项式时间)中进行,但盈亏平衡高得离谱-实际上,在O(n^2)附近的任何地方都无法进行
如果我们假设您只需要处理相对较小的数字,并且可以预计算到某个极限的素数,那么您仍然需要找到候选对。素数计数函数给出大约:
n/ln(n)
素数,小于(n)
。从(n)
中减去候选素数(p)
,得到一个奇数(q)
。如果你能用复杂度为:n.ln(n)
或更好的方法来查找(q)
,也就是说,用O(1)查找表查找所有小于极限的奇数,你就可以得到O(n^2)或更好的结果。你的想法听起来不错,但不幸的是,我必须用不到O(n^2)的时间来完成它。我只是有这个想法。大约有n/lg(n)个素数是