Ir al contenido principal

Descomposiciones en sumas de primos

Definir la función

sumaDePrimos :: Int -> [[Int]]

tal que (sumaDePrimos x) es la lista de las listas no crecientes de números primos que suman x. Por ejemplo,

sumaDePrimos 10  ==  [[7,3],[5,5],[5,3,2],[3,3,2,2],[2,2,2,2,2]]
sumaDePrimos 0   ==  []
sumaDePrimos 1   ==  []

Soluciones

import Data.Numbers.Primes (primes)

sumaDePrimos :: Integer -> [[Integer]]
sumaDePrimos n = aux n (reverse (takeWhile (<=n) primes))
    where aux _ [] = []
          aux n (x:xs) | x > n     = aux n xs
                       | x == n    = [n] : aux n xs
                       | otherwise = map (x:) (aux (n-x) (x:xs)) ++ aux n xs