4つの素数の和

30分プログラム、その140。4つの素数の和

与えられた整数 N (N<=10000000)に対し、Nを4つの素数の和で表せというもの。もしNは4つの素数の和で表現できなければ、"Impossible."で答えろという。 また、4つの素数について、条件は一切なく、好きな組み合わせで良いという。

いったんSchemeugly numberに挑んでやぶれているので、簡単なやつで。

使い方

fourPrimes 24
Just (2,2,3,17)

*Main> fourPrimes 10
Just (2,2,3,3)

*Main> fourPrimes 1
Nothing

ソースコード

import Control.Monad.List

sieve (p:ps) = p : sieve [q | q <- ps, q `mod` p /= 0]
primes = sieve [2..]

maybeHead []    = Nothing
maybeHead (x:_) = Just x

fourPrimes n = 
    maybeHead $  do a <- primes'
                    b <- primes'
                    c <- primes'
                    d <- primes'
                    guard $ a + b + c + d == n
                    return (a,b,c,d)
    where primes' = fst $ break (> n) primes