Variación de la conjetura de Goldbach
La conjetura de Goldbach afirma que
Todo número entero mayor que 5 se puede escribir como suma de tres números primos.
En este ejercicio consideraremos la variación consistente en exigir que los tres sumandos sean distintos.
Definir las funciones
1 2 3 |
sumas3PrimosDistintos :: Int -> [(Int,Int,Int)] conKsumas3PrimosDistintos :: Int -> Int -> [Int] noSonSumas3PrimosDistintos :: Int -> [Int] |
tales que
- (sumas3PrimosDistintos n) es la lista de las descomposiciones decrecientes de n como tres primos distintos. Por ejemplo,
1 2 3 4 |
sumas3PrimosDistintos 26 == [(13,11,2),(17,7,2),(19,5,2)] sumas3PrimosDistintos 18 == [(11,5,2),(13,3,2)] sumas3PrimosDistintos 10 == [(5,3,2)] sumas3PrimosDistintos 11 == [] |
- (conKsumas3PrimosDistintos k n) es la lista de los números menores o iguales que n que se pueden escribir en k forma distintas como suma de tres primos distintos. Por ejemplo,
1 2 3 4 |
conKsumas3PrimosDistintos 3 99 == [26,27,29,32,36,42,46,48,54,58,60] conKsumas3PrimosDistintos 2 99 == [18,20,21,22,23,24,25,28,30,34,64,70] conKsumas3PrimosDistintos 1 99 == [10,12,14,15,16,19,40] conKsumas3PrimosDistintos 0 99 == [11,13,17] |
- (noSonSumas3PrimosDistintos n) es la lista de los números menores o iguales que n que no se pueden escribir como suma de tres primos distintos. Por ejemplo,
1 2 |
noSonSumas3PrimosDistintos 99 == [11,13,17] noSonSumas3PrimosDistintos 500 == [11,13,17] |
Soluciones
Pensamiento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import Data.Numbers.Primes sumas3PrimosDistintos :: Int -> [(Int,Int,Int)] sumas3PrimosDistintos n = [(a,b,c) | a <- takeWhile (<=n-5) primes , b <- takeWhile (<a) primes , let c = n - a - b , c < b , isPrime c] conKsumas3PrimosDistintos :: Int -> Int -> [Int] conKsumas3PrimosDistintos k n = [x | x <- [1..n] , length (sumas3PrimosDistintos x) == k] noSonSumas3PrimosDistintos :: Int -> [Int] noSonSumas3PrimosDistintos = conKsumas3PrimosDistintos 0 |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
«Cualquier tonto puede escribir un código que un ordenador puede entender. Los buenos programadores escriben código que los humanos pueden entender.»
3 Comentarios