一般篩法求素數 快速線性篩法求素數

2021-07-05 19:49:04 字數 823 閱讀 6469

素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。

基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 。。n^(0.5) ,看看能否整除n。

如果需要判斷的次數較多,則先用下面介紹的辦法預處理。

首先先介紹一般的線性篩法求素數

[cpp]view plain

copy

void

make_prime()          

return

;  }     

這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數(注意上面的 i*i ,  比 i*2 要快點 ),把這些合數都篩掉,即演算法名字的由來。

但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。比如10,在i=2的時候,k=2*15篩了一次;在i=5,k=5*6 的時候又篩了一次。所以,也就有了快速線性篩法。

快速線性篩法沒有冗餘,不會重複篩除乙個數,所以「幾乎」是線性的,雖然從**上分析,時間複雜度並不是o(n)。先上**

#include using namespace std;

#define n 200000

int primes[n], num_prime = 0;

int isnotprime[n] = ;

int main() ,1<=i<=n, 1<=j<=n,

我們會這麼寫

for (i=1; ifor (j=i+1; j<=n; ++j)

我們取 j=i+1 便能保證組合不會重複。快速篩法大概也是這個道理,不過這裡比較難理解,沒那麼直觀。

一般篩法求素數 快速線性篩法求素數

素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 n 0.數 5 看看能否整除n。如果需要判斷的次數較多,則先用下面介紹的辦法預處理。首先先介紹一般的線性篩法求素數 void make prime num prime 0 ...

一般篩法求素數 快速線性篩法求素數

tag 素數 數論 素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 n 0.5 看看能否整除n。如果需要判斷的次數較多,則先用下面介紹的辦法預處理。首先先介紹一般的線性篩法求素數 void make prime num ...

一般篩法求素數 快速線性篩法求素數

tag 素數 數論 素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 n 0.5 看看能否整除n。如果需要判斷的次數較多,則先用下面介紹的辦法預處理。首先先介紹一般的線性篩法求素數 cpp view plain copy ...