Menu Close

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

   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,
   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,
   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,
   noSonSumas3PrimosDistintos 99   ==  [11,13,17]
   noSonSumas3PrimosDistintos 500  ==  [11,13,17]

Soluciones

Pensamiento

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.”

Martin Fowler.

3 soluciones de “Variación de la conjetura de Goldbach

  1. Enrique Zubiría
    import Data.Numbers.Primes
     
    sumas3PrimosDistintos :: Int -> [(Int,Int,Int)]
    sumas3PrimosDistintos n =
      reverse [ (a, b, n - a - b)
              | a <- primos
              , b <- dropWhile (>=n-a) primos
              , let c = n-a-b, b < a && c < b && isPrime (n-a-b)]
      where primos = reverse $ takeWhile (<= (n - 5)) primes
     
    conKsumas3PrimosDistintos  :: Int -> Int -> [Int]
    conKsumas3PrimosDistintos k n =
      filter (x -> k == length (sumas3PrimosDistintos x)) [1..n]
     
    noSonSumas3PrimosDistintos :: Int -> [Int]
    noSonSumas3PrimosDistintos = conKsumas3PrimosDistintos 0
  2. rebgongor
    import Data.Numbers.Primes
     
    sumas3PrimosDistintos :: Int -> [(Int,Int,Int)]
    sumas3PrimosDistintos n =
      [(a,b,c) | a <- ps
               , b <- ps
               , let c = n-a-b
               , isPrime c
               ,  a > b && b > c]
      where ps = takeWhile (<n) primes
     
    conKsumas3PrimosDistintos :: Int -> Int -> [Int]
    conKsumas3PrimosDistintos k n =
      [m | m <- [1..n]
         , length (sumas3PrimosDistintos m) == k]
     
    noSonSumas3PrimosDistintos :: Int -> [Int]
    noSonSumas3PrimosDistintos n =
      [m | m <- [1..n]
         , null $ sumas3PrimosDistintos m]
  3. anthormol
    import Data.Numbers.Primes
     
    sumas3PrimosDistintos :: Int -> [(Int,Int,Int)]
    sumas3PrimosDistintos n =
      reverse [((n-x-y),y,x) | x <- xs
                             , y <- dropWhile (<=x) xs
                             , y < (n-x-y)
                             , isPrime (n-x-y)]
      where xs = (takeWhile (<(div n 2)) primes)
     
    conKsumas3PrimosDistintos  :: Int -> Int -> [Int]
    conKsumas3PrimosDistintos k n =
      [x | x <- [1..n]
         , length (sumas3PrimosDistintos x) == k]
     
    noSonSumas3PrimosDistintos :: Int -> [Int]
    noSonSumas3PrimosDistintos = conKsumas3PrimosDistintos 0

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.