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)个素数是