双子の素数

30分プログラム、その124。ふと思いついたので、双子の素数を求めてみる。ついでに4つ子の素数も。3つ子は、一個しかないらしいのでパス。

使い方

*Main> take 10 primes
[2,3,5,7,11,13,17,19,23,29]

*Main> take 5 $ twin primes
[(3,5),(5,7),(11,13),(17,19),(29,31)]

*Main> take 5 $ quad primes
[(5,7,11,13),(11,13,17,19),(101,103,107,109),(191,193,197,199),(821,823,827,829)]

ソースコード

sieve (x:xs) = x:sieve [y | y <- xs, y `mod` x /= 0]
primes = sieve [2..]

twin (p1:pss@(p2:_)) = if p1 + 2 == p2 then
                            (p1,p2):twin pss
                        else
                            twin pss

quad (p1:pss@(p2:p3:p4:_)) = if p2 == p1+2 && p3 == p1+6 && p4 == p1 + 8 then
                                  (p1,p2,p3,p4):quad pss
                              else
   			          quad pss