快速求素數表 埃氏篩法與尤拉篩法

2021-08-11 11:10:54 字數 1178 閱讀 3184

尤拉篩法

素數的定義:素數就是除了1和本身之外沒有其他的約數,所以有約數的都不是素數。

因此,埃氏篩法的思想就是:先去掉2的倍數,再去掉3的倍數,再去掉4的倍數,……依此類推,直到最大數小於最後乙個標出的素數的平方,那麼剩下的序列中所有的數都是素數。

o(nloglogn)

時間複雜度的證明戳此鏈結

#include

#include

using

namespace

std;

#define length 1000000

int is_prime[length];

int prime[length];

int main()

}for(;i<=1000000;i++)

if(is_prime[i]==0)

prime[p++]=i;

while(cin>>n)

尤拉篩法的原理同埃氏篩法,只不過多了乙個判斷刪除的過程。

首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候不用繼續篩下去了。

當i是prime[j]的整數倍時(i % prime[j] == 0),i*prime[j+1]肯定被篩過,跳出迴圈。

因為i可以看做prime[j]某個數, i*prime[j+1]就可以看做 prime[j]某個數*prime[j+1] 。而 prime[j] 必定小於 prime[j+1],

所以 i*prime[j+1] 必定已經被 prime[j]*某個數 篩掉,就不用再做了

o(n)

#include

#include

#include

using

namespace

std;

#define length 700001

int is_prime[length];//是否是素數

int prime[length];//素數表

int pri[length];//尤拉函式表

int main()

for (int j = 0; j1;

if (i%prime[j] == 0)

break;}}

return

0;}

線性篩法求素數(埃氏篩法 尤拉篩法)

篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...

素數之埃氏篩法 尤拉篩法

判斷數n是否為乙個素數,基本方法為從2開始向後列舉,若n不能被2,3,4,n 1整除,則n為素數,該判斷方法的時間複雜度為o n o n o n 更快的方法為,當列舉至n sqrt n n 時即可判斷是否為素數,該判斷方法的時間複雜度為o n o sqrt n o n 如下 寫法1,其中sqrt函式...

埃氏篩法與尤拉篩法

給定整數n,請問n以內有多少個素數?摘自挑戰程式程式設計。要列舉n以內素數,可以用埃氏篩法。這是乙個與輾轉相除法一樣古老的演算法。首先,將2到n範圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都劃去。表中剩餘的最小數字是3,它不能被更小的數整除,所以是素數。在將表中所有3的倍數都劃...