遇到求质数的问题,写下留念,以备后患.
一、穷举法
def isPrime2(n):
if n < 2:
return False
if n < 4:
return True
if n%2 == 0: #排除偶数
return False
i=3 #‘i += 2’,剔除因子中2的倍数
while i*i < n: #合数一定存在小于sqrt(n)的因子
if n%i == 0:
return False
i += 2
return True
二、建质数表
合数可以质因数分解为质数相乘的方式。像求<n的所有质数,或求第i个质数的题目,判断n是否为质数,只需看它是否能被(2,sqrt(n))范围内的质数分解
def isPrime(n,prime):
for j in prime[1:]:
if j**2 > n:
break
if n%j == 0:
return False
return True
prime = [2,3,5,7]
n = 11
while (len(prime) != 10001): #求第10001个质数
if isPrime(n,prime):
prime.append(i)
n=n+2
print(prime[-1])
三、筛选法
思想有点与方法二相似,建个[2,3,4,5.....n]列表,去除2、3、5....(一直的sqrt(n))的倍数,剩余的就是质数
一些定理:
1、所有质数可以表示为6k +/- 1
可以用来将方法一和二思想融合一下,将步长设为6;或剔除n%6的余数不为1和5的
i=5
while i*i < n: #合数一定存在小于sqrt(n)的因子
if n%i == 0:
return False
if n%(i+2) == 0:
return False
i += 6
2、素数定理
π(x)表示不超过x的素数个数:π(x)≈x/lnx
x/(lnx-0.5)<π(x)<x/(lnx-1.5) (左边不等式对于x>=67成立,右边不等式对于x>√e3≈4.48169...成立.)