Ir al contenido principal

Primos con cubos

Un primo con cubo es un número primo p para el que existe algún entero positivo n tal que la expresión n³ + n²p es un cubo perfecto. Por ejemplo, 19 es un primo con cubo ya que 8³ + 8²×19 = 12³.

Definir la sucesión

primosConCubos :: [Integer]

tal que sus elementos son los primos con cubo. Por ejemplo,

λ> take 6 primosConCubos
[7,19,37,61,127,271]
λ> length (takeWhile (< 1000000) primosConCubos)
173

Soluciones

import Data.Numbers.Primes

-- 1ª solución
primosConCubos :: [Integer]
primosConCubos = [p | x <- [1..],
                      n <- [1..x],
                      (x^3 - n^3) `mod` (n^2) == 0,
                      let p = (x^3 - n^3) `div` (n^2),
                      isPrime p]

-- Análisis del problema
-- =====================

-- El número p es primo con cubo si existen dos enteros positivos n y k
-- tales
--    n^3 + n^2p = k^3
-- Se tienen las siguientes equivalencias
--    n^3 + n^2p = k^3
--    <=> n^3(1 + p/n) = k^3
--    <=> n^3((n+p)/n) = k^3
--    <=> n(((n+p)/n)^(1/3)) = k
--    <=> n ((n+p)^(1/3)/(n^(1/3))) = k
-- Por tanto, n y n+p son cubos perfectos; es decir, existen enteros
-- positivos x e y tales que
--    n = x^3                               (1)
--    n+p = y^3                             (2)
-- De (2),
--    p = y^3 - n                           (3)
-- Sustituyendo (1) en (3),
--    p = y^3 - x^3                         (4)
-- Simplificando
--    p = (y-x)(x^2 + xy + y^2)
-- de donde, por ser p primo, se tiene que
--    y-x = 1                               (5)
--    p = x^2 + xy + y^2                    (6)
-- De (4) y (5), se tiene que p es la diferencia de dos cubos
-- consecutivos. Además, despejando y en (5) y sustituyendo en (6), se
-- tiene que
--    p = x^2 + x(1+x) + (1+x)^2
--      = x^2 + x + x^2 + 1 + 2x + x^2
--      = 3x^2+ 3x + 1

-- 2ª solución
-- ===========

-- Como primos cubanos

-- 3ª solución
-- ===========

primosConCubos3 :: [Integer]
primosConCubos3 = [p | x <- [1..],
                       let p = 3*x^2+ 3*x + 1,
                       isPrime p]