10以內的素數之和是 2 + 3 + 5 + 7 = 17.
求兩百萬以內的素數之和搞坝。
分析:關鍵是尋找一個高效的篩法捺典,用下面這個是不行的:
sieve (x:xs) = x: sieve [ n | n<-xs,n`mod`x/=0]
注意到娇斩,8/2=4和8/4=2是意義重復的除法運算茅主,因此要驗證8是否是素數只要用8與[2,根號8]之間的自然數做除運算就行了部念。
一般化:一個自然數n是素數弃酌,當它無法被[2,根號n]之間的自然數整除。
改進:一個自然數n是素數儡炼,當它無法被[2,根號n]之間的素數整除妓湘。
利用這個規(guī)律寫出的篩法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