可以在多项式时间内计算计数函数和连续素数的乘积吗?

时间:2016-06-29 16:38:03

标签: algorithm time-complexity computation-theory space-complexity number-theory

在我使用过的两种算法中,我使用了两个函数:

  1. pi(n):=素数< = n
  2. R(n):= r ,其中 prod(p_i,i = 1,r)< = n n< prod(p_i,i = 1,r + 1)其中 p_i 是第i个素数。
  3. 基本上 pi(n)是着名的计数函数,R(n)只计算连续素数的乘积,直到达到约束 n 并返回使用的素数量,例如:

    R(12)= 2,因为2 * 3 <= 12但是2 * 3 * 5> 12并且例如

    R(100)= 3,因为2 * 3 * 5 <= 100但是2 * 3 * 5 * 7> 100。

    我的教授一直在谈论计算这些功能的运行时间。我知道pi(n)它随着时间的推移接近x / ln(x),但我对某些东西有疑问:

    1. 可以在多项式时间内计算R(n)吗?从我的角度来看,通过使用动态编程,我们可以通过知道2 * 3 * 5 * ... * p_(i-1)来计算产品2 * 3 * 5 * ... * p_i,因此问题减少到得到下一个素数,据我所知它可以用多项式时间计算(PRIMES在P中)。
    2. 另外,因为我们知道我们可以确定一个数是否是多项式时间的素数,不应该意味着pi(n)可以用多项式时间计算吗? (也可以使用动态编程)。
    3. 如果有人可以帮助我澄清这些问题或指出我正确的方向,我真的很感激!谢谢!

2 个答案:

答案 0 :(得分:1)

有一些方法可以在亚线性时间内计算pi(n)。 Google for&#34; legendre phi&#34;或者用于&#34; lehmer prime计数功能&#34;,或者用于更近期的工作&#34; lagarias miller odlyzko计数功能&#34;。莱默的方法并不难编程;我在my blog讨论它。

答案 1 :(得分:0)

对于任何n,你可以很容易地确定它是否在O(n ^(1/2))时间内处于初始状态(通过2,3,4 ...,sqrt(n)检查可分性),所以你可以迭代n并保持一个计数器。如果你将素数存储在一个列表中,你甚至可以加快检查每个数字是否为素数(检查可分性为2,3,5 ......,最接近sqrt(n)的素数)。所以这个寻找pi(n)的算法应该是O(n ^(3/2))。

所以,让我们说你运行该算法并将素数存储在列表中。然后对于R(n),你可以迭代它们来获得它们的累积积,并在你超过n时返回。我不确定这会是什么时间复杂,但它会变小。可能是O(log(n))的某些东西,肯定比O(n)更快。把它们放在一起,你应该得到比O(n ^(5/2))更快的东西。