第十日 兩百萬(wàn)以內(nèi)的素?cái)?shù)之和

10以內(nèi)的素?cái)?shù)之和是 2 + 3 + 5 + 7 = 17.

求兩百萬(wàn)以內(nèi)的素?cái)?shù)之和。

分析:關(guān)鍵是尋找一個(gè)高效的篩法,用下面這個(gè)是不行的:

sieve (x:xs) = x: sieve [ n | n<-xs,n`mod`x/=0]

注意到,8/2=4和8/4=2是意義重復(fù)的除法運(yùn)算,因此要驗(yàn)證8是否是素?cái)?shù)只要用8與[2,根號(hào)8]之間的自然數(shù)做除運(yùn)算就行了。
一般化:一個(gè)自然數(shù)n是素?cái)?shù),當(dāng)它無(wú)法被[2,根號(hào)n]之間的自然數(shù)整除。
改進(jìn):一個(gè)自然數(shù)n是素?cái)?shù),當(dāng)它無(wú)法被[2,根號(hào)n]之間的素?cái)?shù)整除。
利用這個(gè)規(guī)律寫(xiě)出的篩法quickSieve:

sieve [] numbers = numbers
sieve (p:ps) numbers = sieve ps (filter (\n->n`mod`p/=0) numbers)
quickSieve ps primes limit
  | lp^2 > limit = []
  | otherwise = addPrimes ++ quickSieve pss (tail newPrimes) limit
      where lp = last ps
            hp = head primes
            pss = ps ++ [hp]
            numbers = [lp^2+1 .. minimum [hp^2,limit] ]
            addPrimes = sieve pss numbers
            newPrimes = primes ++ addPrimes

answer = sum ([2,3]++quickSieve [2] [3] 100)

答案是142913828922

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容