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