素数判断(Python 版)

# 判断 candidate 是否是素数
def IsPrime(candidate):
    if ((candidate&1)==0):  # 是偶数,除了2,其他偶数全部不是质数
        return candidate==2
    limit=int(math.sqrt(candidate))

    print('limint',limit)
    for i in range(3,limit+1,2):
        if candidate%i==0:
            return False
    return True


 

判断是否是偶数
十进制     0     1     2       3          4          5         6....
二级制     0     1     10    11        100       101     110....

奇数的二进制数:1结尾
偶数的二进制数:0结尾

所以与1 &运算 ,如果奇数为1,如果为偶数为0

素数:
2^2            3^2               4 ^2                 5^2                 
3,5,7,     9,11,13,15,     17,19,21,23,     25,27,29,31

素数定义:一个数只能被1和本身整除
所以偶数除2外都不是素数
例如:判断21是否是素数:
21?3*7
21?5*x     # 注意x不能是偶数,那么被判断数就是偶数。那就在最顶端截获了。
21?7*3
21?9*x
21?11*x
21?13*x
21?17*x
21?19*x
21?21*1

这是完整的判断
大家看到从7*3后,其他运算要么不能可能,要么21*1必定成立。7*3以后的运算可以省去。
大家在看7*3与3*7是对称,也是冗余运算。我们能不能找到这个对称结构的中点,只需判断一半即可判定是否是素数。
两个数相乘,转折点在相乘两数相当,即:5*5.所以我们只需判断(不包含)
21?3*7
即可完整判断是否为素数。

算法性能大大提高。所以我们用limit=int(math.sqrt(candidate)),对所要判断数开平发,来获取上限。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值