Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在n和2n之间寻找素数的最快方法是什么_Algorithm_Math - Fatal编程技术网

Algorithm 在n和2n之间寻找素数的最快方法是什么

Algorithm 在n和2n之间寻找素数的最快方法是什么,algorithm,math,Algorithm,Math,在n和2n之间寻找素数的最快方法是什么?考虑到n最快的方法可能是预先计算并存储一个大小为2^32的一维数组,其中索引n的值是n和2n之间所需的素数。当然,这将是对内存的过分使用,但它可能是最快的 使用更少内存的稍微慢一点的方法是预计算并存储所有“Bertrand素数”的列表,其中第一个元素是第一个元素 素数和每个元素后的第一个是最大素数 少于前一个元素的两倍。您可以使用该列表的二进制搜索快速找到所需的素数。如果您想要1

n
2n
之间寻找素数的最快方法是什么?考虑到
n最快的方法可能是预先计算并存储一个大小为
2^32
的一维数组,其中索引
n
的值是
n
2n
之间所需的素数。当然,这将是对内存的过分使用,但它可能是最快的

使用更少内存的稍微慢一点的方法是预计算并存储所有“Bertrand素数”的列表,其中第一个元素是第一个元素 素数和每个元素后的第一个是最大素数 少于前一个元素的两倍。您可以使用该列表的二进制搜索快速找到所需的素数。如果您想要
1
您需要该列表中的最后一个素数位于
2^32
之上,以捕获所有此类
n
。这将需要一个只有34个素数的列表,非常可行。顺便说一句,如果你想在
2^64
之前这样做,你只需要66个素数

下面是实现该算法的Python 3.5代码。它在标准库中使用二进制搜索函数。Bertrand素数列表是通过另一个简单的Python例程找到的,尽管它也可以在序列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)]
从对分导入对分\u右
_bertrand_素数=[
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]
_n_和_2n(n)之间的def prime_:
“”“查找一个素数p,使n
与其说是编程问题,不如说是数学问题。也许可以试试math stackexchange网站。@csm\u dev但我需要一个快速算法是什么让你认为数学家不会为这些东西创建算法的?如果您有一个算法,并试图在代码中实现它,但代码中有一个特定的错误或误解,那么这将是stackoverflow的一个好问题。在预填充的素数表(从2到2^33-1)上使用二进制搜索。@BrunoSnickers是的,但找到n到2n之间的素数会非常快,这就是你想要的。也许你想问一个不同的问题,并对问题进行更多的解释?