求小于某数的最大素数,求小于n的所有素数

  求小于某数的最大素数,求小于n的所有素数

  这是我在评论中链接的范围筛选程序的修改版本。它使用质数定理得到你好附近素数密度的近似值,并使用该密度估计瞧,使得范围(低,高)gt;=数量中的素数。有关更多信息,请参阅数学世界关于素数计数函数的文章。在

  一般来说,没有简单的方法来精确估计给定范围内的素数100 .FWIW,在特殊情况下,很容易证明给定范围内没有素数,例如范围(n!2,n!n 1)中的每个数都可以被范围(2,^北部1)中的一个数整除。在

  下面的代码(希望是:)高估了所需的范围。但我们不想让它浪费时间,因为它使用了一个值瞧太低了。在某些情况下,lo将不够小,特别是当{}非常小时,但是如果对数字使用合理的值,则应该可以。在#!/usr/大胆的钢笔/env python

  主要范围筛选。

  由PM 2Ring 2014.10.15撰写

  2015.05.24修改为查找"数字"个最高素数“嗨”

  导入系统

  从数学导入日志

  def potential_primes():

  做一个2,3,5的生成器,这样所有的数互素为30

  s=(2,3,5,7,11,13,17,19,23,29)

  对于s中的我:

  产量我

  s=(1,)s[3:]

  j=30

  虽然正确:

  对于s中的我:

  产量意

  j=30

  定义范围_筛选(低,高):

  创建(你好,你好)范围内所有素数的列表

  #将所有数字标记为质数

  素数=[真] *(高低)

  #如有必要,消除0和一

  对于范围内的I(lo,min(2,hi)):

  素数[i - lo]=假

  ihi=int(hi ** 0.5)

  对于i in potential_primes():

  如果我ihi:

  破裂

  #求我的第一个倍数:i=i*i,i=lo

  ilo=max(i,1 (lo - 1) //i ) * i

  #确定i=劳工组织的倍数在多少范围内

  n=1 (hi - ilo - 1) //i

  #将它们标记为复合

  素数[ilo - lo : i]=n * [False]

  return [i for i,v in enumerate(primes,lo) if v]

  def main():

  hi=int(sys。argv[1])if len(sys .argv)1其他1000000

  num=int(sys。argv[2])if len(sys .argv)2否则1000

  #使用素数定理估计所需范围

  #常数1.25506来自数学世界上的文章

  #素数计数函数

  d=数字*对数(高)* 1.25506

  #另一种评估方法。有时候估计的有点太低了。

  #d=num * (log(hi) log(log(hi)))

  lo=max(2,hi - int(d))

  打印" lo=",lo

  primes=range_sieve(lo,hi)

  打印len(素数),"找到素数"

  对于I,p in enumerate(reversed(primes[-num:]),1): print -: %d % (i,p)

  if __name__==__main__ :

  主()

  使用^{调用时输出

  ^{pr2}$

求小于某数的最大素数,求小于n的所有素数