algorithm - 在 n 和 2n 之间找到质数的最快方法是什么

标签 algorithm math

n 之间找到质数的最快方法是什么?和 2n ,考虑到 n<2^32 .我说的是 Bertrand 的假设

最佳答案

最快的方法可能是预先计算并存储大小为 2^32 的一维数组,其中索引值 nn 之间所需的素数和 2n .当然,这会占用大量内存,但它可能是最快的。

一种使用更少内存的稍微慢一点的方法是预先计算并存储所有“Bertrand primes”的列表,其中第一个元素是第一个 素数和第一个元素之后的每个元素都是最大的素数 小于前一个元素的两倍。您可以使用该列表的二进制搜索来快速找到所需的素数。如果你想要1 < n < 2^32您需要该列表中的最后一个素数高于 2^32捕获所有这些n .那将需要一个仅包含 34 个质数的列表,非常可行。顺便说一下,如果你想这样做到 2^64你只需要 66 个素数。

这是实现该算法的 Python 3.5 代码。它使用标准库中的二进制搜索功能。 Bertrand 素数列表是通过另一个简单的 Python 例程找到的,尽管它也可以在 The Online Encyclopedia of Integer Sequences 中找到。 , 序列 A006992。

from bisect import bisect_right

_bertrand_primes = [
             2,          3,          5,          7,         13,         23,
            43,         83,        163,        317,        631,       1259,
          2503,       5003,       9973,      19937,      39869,      79699,
        159389,     318751,     637499,    1274989,    2549951,    5099893,
      10199767,   20399531,   40799041,   81598067,  163196129,  326392249,
     652784471, 1305568919, 2611137817, 5222275627]

def prime_between_n_and_2n(n):
    """Find a prime number p such that n < p < 2n. The returned value
    will be the first 'Bertrand prime' <https://oeis.org/A006992>
    greater than n. n is limited to 1 < n < 2**32 but need not be an
    integer. Outside those limits, None is returned.
    """
    if 1 < n < 2**32:
        return _bertrand_primes[bisect_right(_bertrand_primes, n)]

关于algorithm - 在 n 和 2n 之间找到质数的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43549711/

相关文章:

c# - 确保奖池不会奖励并列的参与者少于得分较差的参与者

java - Flood Fill 算法导致 StackOverFlowError

python - python中的加权随机样本

algorithm - 平均情况复杂度 - 线性算法的计算

php - 给定一个值表,在 "deal"中找到最好的 "group buy"

php - 如何使用 PHP 从加权 'teams' 列表中随机但公平地创建 'users'?

javascript - 计算文本中的字母并生成带有结果的对象

algorithm - Range 查询反转次数 O(lg N)

python - numpy.rint 没有按预期工作

mysql - sql中是否有像EXCEL中那样的ROUNDDOWN()函数