质数筛法 常规筛法 埃式筛法 欧拉筛法 Python实现

目录

    • 常规筛法:
    • 埃式筛法:
    • 欧拉筛法:

前言:博主不是计科专业,可能会有错误,欢迎指正。 这个质数筛法真的十分简单,不要害怕,一口就学了不要拖沓。一开始我认为会很难,不敢学习,后来被逼无奈,学习之后发现你只要鼓起勇气去学习就很简单。 然后看见网上其他博主写的筛法感觉好墨迹啊而且文章半天进入不到重点。然后就想自己写篇文章。

常规筛法:

代码如下:

from math import sqrt
def hanshu(n):
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            return False
    return True
print(hanshu(100))

代码输出:

False

注释:这个就没啥要说的了吧。

埃式筛法:

代码如下:

from math import sqrt
def hanshu(n):
    ls,x,y=[True]*(n+1),2,int(sqrt(n))+1
    while x<y:
        for i in range(x*2,n+1,x):
            ls[i]=False
        x+=1
    ls=[i for i in range(2,n+1) if ls[i]==True]
    return ls
print(hanshu(100))

代码输出:

[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]

注释:先创造一个含有(n+1)个元素的列表,标记它们全为质数。把下标为 2 的倍数列表元素标记为非质数(1倍除外),把下标为 3 的倍数列表元素标记为非质数(1倍除外),……,把下标为 int(sqrt(n)) 的倍数列表元素标记为非质数(1倍除外)。结束。

欧拉筛法:

代码如下:

from math import sqrt
def hanshu(n):
    ls,x,y=[True]*(n+1),2,int(sqrt(n))+1
    while x<y:
        if ls[x]==True:
            for i in range(x*2,n+1,x):
                ls[i]=False
        x+=1
    ls=[i for i in range(2,n+1) if ls[i]==True]
    return ls
print(hanshu(100))

代码输出:

[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]

注释:你自己想想啊。2的时候已经去掉了2的倍数,4的时候还要去掉4的倍数,这一步是不是很多余。所以欧拉筛法就是在埃式筛法的基础上加一句话 if ls[x]==True:

后记:好了,OVER,是不是很简单很粗暴。不太喜欢废话连篇。认为有用的话点个赞吧

你可能感兴趣的:(算法学习,python,算法)