Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 如何找到给定数量的素数?_Algorithm_Primes - Fatal编程技术网

Algorithm 如何找到给定数量的素数?

Algorithm 如何找到给定数量的素数?,algorithm,primes,Algorithm,Primes,我需要找到一定数量的素数,从2开始,按升序排列。我有一个工作算法,它把一个数字限制作为一个参数——它找到所有小于这个限制的素数 例如,对于param20,它将返回2,3,5,7,11,13,17,19,但我需要输入5并获取2,3,5,7,11。最好的方法是什么?我使用的是埃拉托斯特尼筛,没有办法限制删除部分的数量,因为我不知道第195个素数有多大,因此我不知道是否应该删除1568或1268426之前的所有2的倍数。我希望问题是清楚的,谢谢你的帮助你可以在最初的埃拉托什尼筛子后面采用同样的想法,但

我需要找到一定数量的素数,从2开始,按升序排列。我有一个工作算法,它把一个数字限制作为一个参数——它找到所有小于这个限制的素数


例如,对于param
20
,它将返回
2,3,5,7,11,13,17,19
,但我需要输入
5
并获取
2,3,5,7,11
。最好的方法是什么?我使用的是埃拉托斯特尼筛,没有办法限制删除部分的数量,因为我不知道第195个素数有多大,因此我不知道是否应该删除1568或1268426之前的所有2的倍数。我希望问题是清楚的,谢谢你的帮助

你可以在最初的埃拉托什尼筛子后面采用同样的想法,但要反复进行

find_n_primes(num_primes):
  primes = [2]
  i = 3
  while primes.size < num_primes:
    is_prime = true
    for p in primes:
      if p > sqrt(i):
         break
      if i % p == 0: 
        is_prime = false
        break
    if is_prime:
      primes.add(i)

    i++
  return primes
find_n_primes(num_primes):
素数=[2]
i=3
而primes.sizesqrt(i):
打破
如果i%p==0:
素=假吗
打破
如果是_素数:
素数.加上(i)
我++
返回素数

基本上,不是将每个数字的倍数取到一个固定点,而是迭代n,检查所有已经找到的素数

你可以在最初的埃拉托什尼筛子后面采用同样的想法,但要反复进行

find_n_primes(num_primes):
  primes = [2]
  i = 3
  while primes.size < num_primes:
    is_prime = true
    for p in primes:
      if p > sqrt(i):
         break
      if i % p == 0: 
        is_prime = false
        break
    if is_prime:
      primes.add(i)

    i++
  return primes
find_n_primes(num_primes):
素数=[2]
i=3
而primes.sizesqrt(i):
打破
如果i%p==0:
素=假吗
打破
如果是_素数:
素数.加上(i)
我++
返回素数

基本上,不是将每个数字的倍数取到一个固定点,而是迭代n,检查所有已经找到的素数

有几种方法可以做你想做的事

素数定理说,小于n的素数的个数渐近等于n/log(n)。你可以添加一个小的缓冲区,然后对埃拉托斯烯进行筛选,然后抛出超出你极限的素数

有些公式不是近似值,而是计算小于n的素数的确切数目,而不列出素数。你可以用这些公式中的一个来找到第n个素数,然后用筛子来列出素数。如果你想采用这种方法,谷歌搜索“勒让德和”和“莱默公式”

你可以用一个分段筛的埃拉托斯坦。筛选到合适的限度。如果你有答案,停下来。否则,选择下一段,然后选择下一段,依此类推,直到找到所需的素数

有一种生成无限素数列表的非常聪明的方法,它用优先级队列替换了埃拉托斯烯筛的位数组。谷歌为梅丽莎·奥尼尔的论文搜索埃拉托什尼的真正筛子

您可以看到所有这些算法的完整解释和实现


顺便说一下,第195个素数是1187。小于1568的素数有247个,小于1268426的素数有97790个。

有几种方法可以满足您的需要

素数定理说,小于n的素数的个数渐近等于n/log(n)。你可以添加一个小的缓冲区,然后对埃拉托斯烯进行筛选,然后抛出超出你极限的素数

有些公式不是近似值,而是计算小于n的素数的确切数目,而不列出素数。你可以用这些公式中的一个来找到第n个素数,然后用筛子来列出素数。如果你想采用这种方法,谷歌搜索“勒让德和”和“莱默公式”

你可以用一个分段筛的埃拉托斯坦。筛选到合适的限度。如果你有答案,停下来。否则,选择下一段,然后选择下一段,依此类推,直到找到所需的素数

有一种生成无限素数列表的非常聪明的方法,它用优先级队列替换了埃拉托斯烯筛的位数组。谷歌为梅丽莎·奥尼尔的论文搜索埃拉托什尼的真正筛子

您可以看到所有这些算法的完整解释和实现


顺便说一下,第195个素数是1187。小于1568的素数有247个,小于1268426的素数有97790个。

不久前,我写了一个关于素数的小模块(这满足了我在处理Project Euler之类的东西时的需要)。这是相当快的,因为它跟踪它看到的素数列表。这大大减少了计算时间

这是您需要的主要例程(用python编写)。文档一般,但我希望这能有所帮助

def primes(num, l=[]):

    # l is the list of prime numbers you already have
    # This is reused to check for primality of a number

    if len(l) == 0: l = get_list() # Read from disk

    # Check to see if a sublist can be created
    e = l[-1]
    if (num < e):
        res = search.binary_low(l, num)
        return l[:res[0]+1]

    e = 6*(ceil(e/6))

    lim = num + 1
    # Extend the current list
    for n in range(e, lim, 6):
        m = n - 1
        if isprime(m, l): l.append(m)
        m = n + 1
        if isprime(m, l): l.append(m)

    # Save to pickle
    set_list(l) # Write to disk

    return l
定义素数(num,l=[]): #l是你已经拥有的素数列表 #这是重复使用,以检查一个数字的素性 如果len(l)==0:l=get_list()#从磁盘读取 #检查是否可以创建子列表 e=l[-1] 如果(num 你可以在这里找到相关的程序


不久前,我写了一个处理素数的小模块(它满足了我在Euler项目工作时的需要)。这是相当快的,因为它跟踪它看到的素数列表。这大大减少了计算时间

这是您需要的主要例程(用python编写)。文档一般,但我希望这能有所帮助

def primes(num, l=[]):

    # l is the list of prime numbers you already have
    # This is reused to check for primality of a number

    if len(l) == 0: l = get_list() # Read from disk

    # Check to see if a sublist can be created
    e = l[-1]
    if (num < e):
        res = search.binary_low(l, num)
        return l[:res[0]+1]

    e = 6*(ceil(e/6))

    lim = num + 1
    # Extend the current list
    for n in range(e, lim, 6):
        m = n - 1
        if isprime(m, l): l.append(m)
        m = n + 1
        if isprime(m, l): l.append(m)

    # Save to pickle
    set_list(l) # Write to disk

    return l
定义素数(num,l=[]): #l是你已经拥有的素数列表 #这是重复使用,以检查一个数字的素性 如果len(l)==0:l=get