線性篩法找質數 正確性,無重複性證明

2021-07-10 22:27:28 字數 1112 閱讀 9890

int main()    

}

return

0;

}

輸入:maxp

輸出:[0 maxp]區間中所有的質數。

初始狀態:0,1不是質數,標記isnotprime [0]=1, isnotprime[1]=1。 先假設除了0,1以外的數i均為質數,標記isnotprime[i]=0。

演算法對每乙個數i

1):如果i是素數,則將i加入到prime陣列中,篩除每乙個數prime[j]*i(i*prime[j] < maxp)。

2) : 如果i是合數,則i=

px11

∗px2

2∗px

33∗p

x44∗

…∗px

nn=(

x1,x

2,x3

,x4…

xn) ,(其中pi

為從小到大排列的質數),進一步的可以寫成i=

pxmi

n∗q ,當pr

ime[

j]<=pm

in時,篩除每乙個合數prime[j]*i (i*prime[j] < maxp),break—退出內迴圈。

數學歸納法:

當i=2時,isnotprime[2]=0,!isnotprime[2]為真,所以第12行條件判斷為真,prime[0]=2, 2為質數, 被加入到陣列prime中。p(2) hold

假設當i=k時p(k) hold,則p(k+1)hold:

證明p(k+1)hold: 反證

法:假設p(k+1)不能保持,由於p(k)hold,所以區間[0 k]之間的質數和合數都已確定下來,因此要使p(k+1)不能hold,則要麼數k+1作為質數被篩除;要麼作為合數卻未被篩除。下面將證明這兩點都不滿足,所以假設(p(k+1)不能保持)不成立,假設(p(i) hold)成立,證畢。

證明:命題m:要麼數k+1作為質數被篩除;要麼作為合數卻未被篩除這兩點在上述情況下不能被滿足。

找素數(質數) 線性篩法和埃氏篩法

先看這道題 洛谷p1217回文質數 對於這道題,普通的暴力模擬會tle,所以得尋求改進。這裡我學會了兩種方法 第一種 線性篩法 這種演算法的核心思想就是 任何乙個合數都可以由質數相乘得到 下面就是核心 吃透了核心 就可以在其中新增點細節,然後就可以拿去解決問題了 這裡需要開多大的陣列取決自己 boo...

質數線性篩法 O n

埃氏篩法o nloglogn 仍會重複標記合數 such as i 2時 12 2 6,先會被 2 標記已是合數 i 3時 12 3 4,又被標記了一次 我們在生成乙個需要標記的合數時,每次只向現有的數中乘上乙個質因子,並且讓它是所生成合數的最小質因子 code include include us...

求質數3 線性篩法 C實現

該問題出自 c語言名題精選百則技巧篇 從2開始,先刪除2 2,2 2 2,2 2 2 2,接著刪除2 3,2 2 3 2 2 2 3,3並沒有被刪除 再刪除2 5,2 2 5,2 2 2 5,然後刪除2 7,2 2 7,2 2 2 7,然後是2 9,2 2 9,2 2 2 9,當發現p是乙個質數的時...