我很难看到我们如何在聚合时间J中生成J个最小素数的列表,基于p' j对于j>小于或等于2j * ln(j)
的事实。 2,其中j表示第j个连续素数。例如,对于j = 1,p1 = 2,对于j = 2,p2 = 3.对于j = 3,p3 = 5,对于j = 4,p4 = 7,对于j = 5,p5 = 11,等等......
我只是不知道如何利用上述这一事实。任何时候我想要产生一个素数,比如7号,我会通过插入来检查:2(7)* ln(7)= 27.2427 ......但事实证明这完全是无用的。这个数字比我的数组中最后生成的素数大,这是合乎逻辑的。因此,我仍然需要通过检查mod0的最后一个素数+ 1和我的数组中的每个素数来求助于暴力。另一种选择是采用已经存在的算法来缩短多项式时间。
你能告诉我如何利用这个事实:p' j< = 2j * ln(j)?感谢。
答案 0 :(得分:3)
为了证明我可以在J中生成时间多项式中的第一个J素数列表,我需要计算出我生成列表的成本。
如果我通过逐个检查数字生成列表并丢弃非素数,则生成列表的成本有两个部分 - 检查每个数字需要多长时间,以及我需要多少个数字检查。
如果素数很少,那么我就无法检查2中的每个数字,因为简单地列出所有这些数字会太贵。但是如果我知道第J个素数不大于2j * ln(j)我至少可以在多项式时间内列出它们。
事实上,如果我必须生成J素数,并且我从第一个2J * ln(J)数开始,我决定通过测试将每个数字作为素数进行检查,将其除以目前为止发现的每个素数,我在任何时候都没有超过J素数,所以我最终不能超过2J ^ 2 * ln(J)试验分区。这对于效率或聪明的算法,甚至是计算成本的明显界限都不会赢得任何奖励,但它并不比多项式更差。
答案 1 :(得分:2)
也许绊倒你的是你认为上限为你提供了一个方法来直接生成第j个素数或者第一个j素数。它没有 - 它只是给你一个大小限制你需要用你已经躺在一些方法检查的数字集合,例如审判分庭。
如果我给你一个n-1号码列表2,3,...,n并要求你找到这个列表中的所有素数,你可以在O(n ^ 2)中使用试验除法时间:
请注意,这会在任何 n的正值中找到O(n ^ 2)中的所有素数< = n。所以特别是,如果我们被告知j的某个值,它将适用于n = RoundDown(2j log j)。
当n = RoundDown(2j log j)时,该算法在时间O((2j log j)^ 2)= O(j ^ 2 log ^ 2 j)中运行,这是j中的多项式,并且它必须成功在找到至少第一个j素数时,因为约束告诉我们第j个素数最多可以是RoundDown(2j log j),并且我们在输入列表中包含了每个数字,包括那个数字。 (它可能会发现更多质数,但如果需要,我们可以在线性时间内丢弃它们。)
练习:想一想为什么我们可以在这里围绕向下。