Python学习总结——利用基础数学定理优化素数代码算法

  • 摘要:本博客记自学习Python入门知识(基础+语法+分支+循环)后,对优化素数代码算法的一些总结及体会。因尚未涉及后续Python高级知识,故最终代码算法效率仍不够优秀,请各位看官见谅。
1、素数基础算法

根据素数定义:一个大于1的自然数只能被1和它本身整除,即可利用for循环逐次计算,求解素数,代码如下:

# 计算 n 以内的所有素数
n = int(input('>>>')
for i in range(2,n+1):
    for j in range(2,i):
        if i % j == 0:
            break
    else:
        print(i)
2、利用奇偶性质优化

根据偶数均可整除2性质,由此可知偶数均不是质数,故可优先排除偶数,现将代码优化如下:

n = int(input('>>>')
print(2)
for i in range(3,n+12):
    for j in range(3,i2):
        if i % j == 0:
            break
    else:
        print(i)
3、利用所有大于10的质数中,个位数只有1,3,7,9

根据所有大于10的所有奇数,但凡个位数为5的数字均可整除,故可利用此性质再次优化代码:

n = int(input('>>>')
print(2)
for i in range(3,n+12):
    if i > 10 and i % 10 == 5:
        continue
    for j in range(3,i2):
        if i % j == 0:
            break
    else:
        print(i)
4、利用素数平方根性质

假设整数m有一个比它的平方根m^(1/2)还要大的因数的话,即m=k1*k2,其中,k1>=m^(1/2)+1,则其另一个因数k2<=m^(1/2).因此,整数m的因数(如果有的话)只需循环至m的平方根即可,现将代码优化如下:

n = int(input('>>>')
print(2)
for i in range(3,n+12):
    if i > 10 and i % 10 == 5:
        continue
    for j in range(3,int(i**0.5)+12):
        if i % j == 0:
            break
    else:
        print(i)
5、利用大于等于5的素数一定和6的倍数相邻性质

根据所有大于等于5的质数一定和6的倍数相邻性质,对整体代码进行调整:

n = int(input('>>>'))
print(2)
n = n // 6 + 1
for i in range(1,n):
    n1 = 6 * i - 1
    tmp = int(n1 ** 0.5)
    for num in range(2,tmp+1):
    if n1 % num == 0:
        break
    esle:
        print(n1)
    n2 = 6 * i + 1
    tmp = int(n2 ** 0.5)
    for num in range(2,tmp):
        if n2 % num == 0:
            break
        else:
            print(n2)

猜你喜欢

转载自blog.csdn.net/weixin_42712786/article/details/81412769