质数问题

遇到求质数的问题,写下留念,以备后患.

一、穷举法

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...成立.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值