在我使用过的两种算法中,我使用了两个函数:
基本上 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),但我对某些东西有疑问:
如果有人可以帮助我澄清这些问题或指出我正确的方向,我真的很感激!谢谢!
答案 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))更快的东西。