2015-11-07 84 views
1

我試圖計算前20個素數有他們之間的2號空缺 - EG 3和5如何計算兩個邊界之間的素數雙胞胎?

divides :: Integer -> Integer -> Bool 
divides x y = y `mod` x == 0 

prime :: Integer -> Bool 
prime n = n > 1 && and [not(divides x n) | x <- [2..(n-1)]] 

allprimes :: [Integer] 
allprimes = [x | x<- [2..], prime x] 

primeTest3 :: Integer -> [Integer] 
primeTest3 n = [ if y - x == 2 then y else x | x <- [3..n], y <- [2..n], prime x] 

這個工程到一定程度時,如果n = 20,則輸出爲3, 5, ,5, 5, 5, 5, 7, 7, 7, 7, 7, 9, 7, 7, 7, 7, 9, 9, 9..等這顯然是由於if語句。我怎樣才能打印出多少孿生素數之間有一定的數字沒有重複?

+2

9不是素數... – sinelaw

+1

另請參閱['zip'](http://hackage.haskell.org/package/base-4.8.1.0/docs/Data-List.html# v:zip) - 你可以這樣做:'areTwoApart(x,y)= x - y == 2'以及類似於'filter areTwoApart(zip allprimes(tail allprimes))'的方法來更接近你想要的東西。 – sinelaw

+0

對不起,在我最後的評論中,它應該是'y - x'而不是相反。 – sinelaw

回答

2

要組織我在評論中寫道:

areTwoApart (x,y) = y - x == 2 
filter areTwoApart (zip allprimes (tail allprimes)) 

...會給你素對的列表,沒有重複:

Prelude> take 10 $ filter areTwoApart (zip allprimes (tail allprimes)) 
[(3,5),(5,7),(11,13),(17,19),(29,31),(41,43),(59,61),(71,73),(101,103),(107,109)] 

至於你的最後一個問題「有多少孿生素數之間有一定的數字沒有重複「,我不確定你是什麼意思的」之間「。但你可以使用上面的函數來實現它。

相關問題