素數的快速篩選(埃氏篩法)


  要枚舉n以內的素數,可以用埃氏篩法。這是一個與輾轉相除法一樣古老的算法。

 

首先,將2到n范圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都划去。表中剩余的最小數字是3,它不能被更小的數整除,所以是素數。再將表中所有3的倍數全都划去。依次類推,如果表中剩余的最小數字是m時,m就是素數。然后將表中所有m的倍數全部划去。像這樣反復操作,就能依次枚舉n以內的素數。

 

int prime[maxn];//第i個素數
bool is_prime[maxn];//is_prime[i]為true表示i是素數
int sieve(int n)//返回n以內的素數
{
    int cnt=0;
    for(int i=0;i<=n;i++)
        is_prime[i]=true;
    is_prime[0]=is_prime[1]=false;
    for(int i=2;i<=n;i++)
        if(is_prime[i])
        {
            prime[cnt++]=i;
            for(int j=2*i;j<=n;j+=i)
                is_prime[j]=false;
        }
    return cnt;
}

埃氏篩的復雜度僅有O(nloglogn),算是比較快的了。當數據量不是太大的時候,可以把它的復雜度看作是線性的。

最近在學Python,附上Python 3.6的代碼:

def eratosthenes(n):
    P = [i for i in range(2, n+1)]
    p = 0
    while True:
        for i in P[p + 1:]:
            if i % P[p] == 0:
                P.remove(i)
        if P[p]**2 >= P[-1]:
            break
        p += 1
    return P

if __name__ == "__main__":
    print (eratosthenes(120))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM