求小于某数的最大素数,求小于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}$