用python求素数的方法,以及一种算法优化


前言

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数(该解释来自百度百科)。
如果要找100以内的素数,我们可以寻找100以内的非素数,即证明一个数除了1和它本身以外还可以被其他自然数整除,不能被证明的数就是素数。


方法一

1、代码

代码如下:

list1 = [1, 2]
for i in range(2, 101):
    for j in range(2, i):
        if i % j == 0:
            break
        elif j == i-1:
            list1.append(i)
print(list1)

2、输出结果

[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Process finished with exit code 0

我们只需要让2到n-1中间所有的数除n,只要结果为0循环提前结束,如果n-1也验证过依然没有提前结束循环,此时这个数为素数,计入列表中。


方法二

当我们遇见较大的数值,比如100000时,使用方法一的效率显然会很慢,这时候就需要对素数的特性有一个更深的了解,以此来优化算法

1、代码

list1 = [1, 2]
for i in range(2, 101):
    for j in list1[1:]:
        if i % j == 0:
            break
        elif i < j*j:
            list1.append(i)
            break
print(list1)

2、输出结果

[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Process finished with exit code 0
如果有一个非素数的可以整除 n,那么必然有一个素数可以整除 n,测试 n 是否为素数,只要证明 n 不会被小于 n 的素数整除即可。 又因为当素数 i 的平方大于 n 时,大于 i 的素数必须要与一个小于本身的数相乘才有可能恰好等于n,然而,如果有这种情况存在,那么 n 必然会在测试到数值 i 之前被证实为非素数。所以需要测试的素数到有一个素数平方大于 n 时就可以被证实为素数。

新手上路,制作不易,望点赞支持,十分感谢

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值