La menos conocida de las conjeturas de Goldbach
Goldbach, el de la famosa conjetura, hizo por lo menos otra conjetura que finalmente resultó ser falsa.
Esta última decía que todo número compuesto impar puede expresarse como la suma de un número primo más dos veces la suma de un cuadrado. Así por ejemplo,
1 2 3 4 5 6 |
9 = 7 + 2×1^2 15 = 7 + 2×2^2 21 = 3 + 2×3^2 25 = 7 + 2×3^2 27 = 19 + 2×2^2 33 = 31 + 2×1^2 |
Definir las sucesiones
1 2 3 |
imparesCompuestos :: [Integer] descomposiciones :: Integer -> [(Integer,Integer)] contraejemplosGoldbach :: [Integer] |
tales que
- imparesCompuestos es la lista de los números impares compuestos. Por ejemplo,
1 |
take 9 imparesCompuestos == [9,15,21,25,27,33,35,39,45] |
- (descomposiciones n) es la lista de las descomposiciones de n de n como la suma de un número primo más dos veces la suma de un cuadrado. Por ejemplo,
1 2 3 |
descomposiciones 9 == [(7,1)] descomposiciones 21 == [(3,9),(13,4),(19,1)] descomposiciones 5777 == [] |
Las 3 descomposiciones de 21 son
1 2 3 |
21 = 3 + 2*9 = 21 + 2*3^2 21 = 13 + 2*4 = 13 + 2*3^2 21 = 19 + 2*1 = 19 + 2*1^2 |
- contraejemplosGoldbach es la lista de los contraejemplos de la anterior conjetura de Goldbach; es decir, los números impares compuestos que no pueden expresarse como la suma de un número primo más dos veces la suma de un cuadrado. Por ejemplo,
1 |
take 2 contraejemplosGoldbach == [5777,5993] |
Comprobar con QuickCheck que la conjetura de Golbach se verifica a partir de 5993; es decir, todo número compuesto impar mayor que 5993 puede expresarse como la suma de un número primo más dos veces la suma de un cuadrado.
Nota: Basado en el artículo La menos conocida de las conjeturas de Goldbach de Claudio Meller en el blog Números y algo más.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
import Data.Numbers.Primes import Test.QuickCheck imparesCompuestos :: [Integer] imparesCompuestos = filter esCompuesto [3,5..] -- (esCompuesto x) se verifica si x es un número compuesto. Por ejemplo, -- esCompuesto 6 == True -- esCompuesto 7 == False esCompuesto :: Integer -> Bool esCompuesto = not . isPrime contraejemplosGoldbach :: [Integer] contraejemplosGoldbach = filter esContraejemplo imparesCompuestos -- (esContraejemplo x) es verifica si el número impar compuesto x es un -- contraejemplo de la conjetura de Goldbach. Por ejemplo, -- esContraejemplo 5777 == True -- esContraejemplo 15 == False esContraejemplo :: Integer -> Bool esContraejemplo = null . descomposiciones descomposiciones :: Integer -> [(Integer,Integer)] descomposiciones n = [(p,x) | p <- takeWhile (<=n) primes , (n - p) `mod` 2 == 0 , let x = (n - p) `div` 2 , esCuadrado x] -- (esCuadrado x) es verifica si x es un cuadrado perfecto. Por ejemplo, -- esCuadrado 16 == True -- esCuadrado 27 == False esCuadrado :: Integer -> Bool esCuadrado x = y^2 == x where y = ceiling (sqrt (fromIntegral x)) -- La propiedad es prop_conjetura :: Int -> Property prop_conjetura n = n >= 0 ==> not (esContraejemplo (imparesCompuestosMayore5993 !! n)) where imparesCompuestosMayore5993 = dropWhile (<=5993) imparesCompuestos -- La comprobación es -- λ> quickCheck prop_conjetura -- +++ OK, passed 100 tests. |
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>
Pensamiento
«Obvio es la palabra más peligrosa de las matemáticas.»