【问题标题】:Can the prime-counting function and product of consecutive primes be calculated in polynomial time?可以在多项式时间内计算素数计数函数和连续素数的乘积吗?
【发布时间】:2016-06-29 16:38:02
【问题描述】:

在我一直使用的两个算法中,我使用了两个函数:

  1. pi(n):=素数个数和
  2. R(n):=r,其中 prod(p_i,i=1,r) 但 n 其中 p_i 是第 i 个素数。

基本上 pi(n) 是著名的素数计数函数,R(n) 只是计算连续素数的乘积,直到到达界限 n 并返回使用的素数数量,例如:

R(12)=2 因为 2*312 和例如

R(100)=3 因为 2*3*5100。

我们一直在和我的教授讨论计算这些函数的运行时间。我知道 pi(n) 会随着时间的推移逼近 x/ln(x),但我对一些东西有疑问:

  1. 可以在多项式时间内计算 R(n) 吗?从我的角度来看,通过使用动态规划,我们可以通过知道 2*3*5*...*p_(i-1) 来计算乘积 2*3*5*...*p_i,因此问题简化为得到下一个素数,据我所知,它可以在多项式时间内计算出来(PRIMES 在 P 中)。
  2. 另外,因为我们知道我们可以确定一个数在多项式时间内是否为素数,这不应该意味着 pi(n) 可以在多项式时间内计算吗? (也可以使用动态编程)。

如果有人可以帮助我澄清这些问题或指出正确的方向,我将不胜感激!谢谢!

【问题讨论】:

  • 当你说多项式时,你的意思是数 n 的多项式,还是表示 n 所需的位数?对于像因式分解这样的事情,我们通常指的是位数,这要困难得多。我的期望是 R(n) 是 n 表示大小的多项式,而 phi(n) 将类似于 O(sqrt(n))。

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


【解决方案1】:

有一些方法可以在亚线性时间内计算 pi(n)。谷歌搜索“legendre phi”或“lehmer 素数计数函数”,或最近的作品“lagarias miller odlyzko prime 计数函数”。 Lehmer 的方法不难编程。我在my blog 讨论它。

【讨论】:

    【解决方案2】:

    对于任何 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)) 更快的东西。

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      相关资源
      最近更新 更多