1. 程式人生 > >數論_埃氏篩法(求區間內多少素數)

數論_埃氏篩法(求區間內多少素數)

埃拉託斯特尼(公元前276—公元前194)


埃拉託斯特尼是古希臘著名的數學家、地理學家、天文學家。他先在亞歷山大港學習,後又轉至雅典。公元前236年,托勒密三世指定他為亞歷山大圖書館的圖書管理員和館長。他跟阿基米德是好朋友。埃拉託斯特尼的主要貢獻包括:

埃拉託斯特尼篩法:尋找素數的方法。

地理常數測量:日地間距的測量(現在稱一個這樣的距離為一個天文單位)、地月間距的測量、測量赤道與黃道之間的偏角、地球半徑測量等。

精確地圖繪製:當時只有托勒密等級的人物能繪出同等級的地圖。

演算法數學原理:
埃拉託斯特尼篩法是快速篩選素數的演算法,在處理大量整數是否是素數時有較高的效率。

例:篩選小於n的整數並記錄結果。

解:計算sqrt(n),∵對於任意的z<n,若z為合數,不妨設z=a*b,則必有min(a,b)<sqrt(n)

∴所有小於n的合數均可被小於sqrt(n)的整數整除

從2開始,依次去除小於n的整數中能被其整除的數,最後剩下的就是素數

int prime[maxn];
bool is_prime[maxn];//is_prime[i]是true表示i是素數
//返回n以內素數的個數
int sieve(int n)
{
    int p=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[p++]=i;
            for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
        }
    }
    return p;
}

  例題:洛谷 P1865  ,codevs3223 素數密度