線性篩素數(尤拉篩)

2021-10-01 13:02:03 字數 759 閱讀 1674

尤拉篩是o(n)複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。

埃篩的基本思想是:素數的倍數一定是合數。

尤拉篩基本思想是:任何數與素數的乘積一定是合數

演算法概述:

遍歷[2, n]的所有數i,內層迴圈遍歷已經找到的素數prime[j],將i * prime[j]標記為合數。

內層迴圈的最後,檢查如果prime[j]i的最小質因子,則退出到外層迴圈,因為prime[j+1] * i肯定已經被篩過了。

**:

#include

using

namespace std;

const

int maxn =

1e7+5;

int isprime[maxn]

;// isprime[i] 表示i是否素數

int prime[maxn]

;// 按順序存素數

int cnt =0;

// 素數個數

// 找出n以內的全部(cnt個)素數

void

euler

(int n)}}

intmain()

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...

素數線性篩 尤拉Euler篩

prime陣列中的素數是遞增的,當i能整除prime j 那麼i prime j 1 這個合數肯定被prime j 乘以某個數篩掉。因為i中含有prime j prime j 比prime j 1 小,即i k prime j 那麼i prime j 1 k prime j prime j 1 k ...

尤拉篩法(線性篩素數)

以下內容 include include using namespace std intmain printf d n cnt return0 其中注釋為 關鍵!的句子的解釋大概如下 首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候...