埃拉託斯特尼篩法

2021-08-26 02:38:07 字數 1154 閱讀 4716

質數又稱素數。指在乙個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。怎麼判斷n以內的哪些數是質數呢?

厄拉多塞是一位古希臘數學家,他在尋找素數時,採用了一種與眾不同的方法:先將2-n的各數放入表中,然後在2的上面畫乙個圓圈,然後劃去2的其他倍數;第乙個既未畫圈又沒有被劃去的數是3,將它畫圈,再劃去3的其他倍數;現在既未畫圈又沒有被劃去的第乙個數是5,將它畫圈,並劃去5的其他倍數……依次類推,一直到所有小於或等於n的各數都畫了圈或划去為止。這時,表中畫了圈的以及未劃去的那些數正好就是小於 n的素數。

如下圖所示:

而其實迭代係數i不需要遍歷到n-1為止,只需到√(n-1)即可。反證法:

如果n是合數,則一定存在大於1小於n的整數d1和d2,使得n=d1×d2。如果d1和d2均大於√n,則有:n=d1×d2>√n×√n=n。而這是不可能的,所以,d1和d2中必有乙個小於或等於√n。

以100為例,我們先建立乙個100個數字的陣列。 

先使用最小的素數2,將所有2的倍數(除2本身)標記為合數。 

接下來2+1的數是3,此時檢查3是不是素數,檢查標記,發現沒有被標記為合數(因為不是2的倍數),所以再將所有3的倍數標記為合數。 

下乙個數是4,發現他已經被標記為合數,所以他可以表示小於4的素數的乘積2*2,所以4的倍數必定含有因子2,所以所有4的倍數已經全部被標記過,直接跳過4。 

下乙個數是5,沒有被標記為合數,把所有小於100的5的倍數標記為合數 

………這樣一直計算到sqrt(100),即10。 

那麼為什麼不標記大於10的數例如11呢?因為所有的倍數已經被標記過了,例如22,33,44,55…分別有因子2,3,2,5,大於10的倍數,例如11*11已經超過max了,參見最上面的推論 

注意這裡有乙個優化點,很多書籍上或者教程上都沒有說出來,只要標記大於本身的倍數就行了,例如5,只要標記5*5,5*6,5*7…為合數,因為5*2,5*3,5*4…已經被之前出現的數的倍數標記過了

**實現

const int maxn=1e3;

int a[maxn];

void isprime(int n)//埃拉託斯特尼篩法

}}

埃拉託斯特尼篩法

埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。要得到自然數n以內的全部素數,必須把小於等於根號n的所有素數的倍數剔除,剩下的就是素數。這是什麼意思呢?以100為例,我們先建立乙個擁有101 0 100 個數字的陣列。先使用最小的素數2,將所有2...

埃拉託斯特尼 Eratosthene 篩法

下面是 功能 將1 n的素數輸出 使用了埃拉託斯特尼 eratosthene 篩法 include include using namespace std int prime 10000000 存放需要篩選數 int sieve int prime,int n,int k n是1 n這個範圍,k是當...

埃拉託斯特尼篩法 檢定素數

埃拉託斯特尼篩法描述 要得到自然數n以內的全部素數,必須把不大於 給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去.題目 統計找出一千萬以內,一共有...