素數及一些篩法

2021-09-26 19:55:30 字數 1246 閱讀 8592

素數就是只有1和它本身兩個因數

int

prime

(int x)

從2開始,2是第乙個素數,不標記,然後把2的倍數都標記為合數,再從3開始,依次到n。

時間複雜度好像是o(n log(n) log(n) ),證明過程不大懂…

int flag[maxn]

,prime[maxn]

;int tot,

void

prime()

}}

在埃氏篩法中,有的數字例如6是被重複標記的,這樣就浪費了很多時間,線性篩則保證了每個數字只被處理一次,因此時間複雜度是o(n)的。它保證了每個合數都是被它的最小質因數所篩掉的。

a b c都是合數,p1 p2 為素數。

a = p1 * b

b = p2 * c

a = p1 * p2 * c

a = (p1*c) * p2

每乙個合數都可分解為乙個更小的素數和乙個更大的合數的乘積。所以每乙個合數都可分解為乙個它的最小的質因數和乙個合數的乘積。

線性篩的核心就在於

if

(i%prime[j]==0

)break

;

i是合數,prime[j]是素數,i *prime[j]為要處理的數,如果prime[j]是i的乙個因數,則說明i *prime[j]有乙個比prime[j]更小的質因數,即該數可以用乙個i更大的合數和比prime[j]更小的素數表示,而我們需要的是用最小的素數去篩,也就以為著i也是最大的合數去篩,

i是合數,prime[j]是素數,在此 if 語句中i *prime[j]的最大質因子是prime[j],若此次if判斷成立,說明i的因子中包含prime[j],則如果j++進行下一次迴圈,那麼在這次迴圈中i *prime[j]的最大質因子就不是這一層中的prime[j]而是上一層的i分解的上一層的prime[j],所以內層迴圈應該從此處跳出。

完整**:

int flag[maxn]

,prime[maxn]

;int tot;

void

prime()

for(

int j=

0;j}

線性篩法(一) 素數篩法(一)

目錄所謂篩法是一種思想,就像名字一樣,篩去多餘的,篩去錯誤的。多數情況用陣列標記,複雜度看起來很大,但 跑起來確是越跑越快。把n以內素數全找出來 n 100000 大家一定想得到第一種方法,暴力,遍歷。暴力 include includeint isprime int n return 1 int ...

素數判斷及篩法

單個素數判斷 素數判斷 小資料 int prime int n miller rabin 大素數判定 單個數字n複雜度15 log n int mr 30 此陣列為測試用的a,這12個可測所有的long long int lli miller rabin lli n if x 1 return fa...

素數判斷及篩法

素數 prime number 又稱質數,有無限個。素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。問法1 給定乙個數n,判斷n是不是素數 一 暴力列舉 列舉2 n 1分別當做除數,判斷是否能整除,如果某個數能把n整除,那麼就說明n不是素數,如果所有都不能整除,那麼n就是素數。注 n...