Ir al contenido principal

Números para los que mcm de 1,2,...n-1 coincide con el de 1,2,...,n

Un número n es especial si mcm(1,2,...,n-1) = mcm(1,2,...,n). Por ejemplo, el 6 es especial ya que

mcm(1,2,3,4,5) = 60 = mcm(1,2,3,4,5,6)

Definir la sucesión

especiales :: [Integer]

cuyos términos son los números especiales. Por ejemplo,

take 10 especiales     ==  [1,6,10,12,14,15,18,20,21,22]
especiales !! 50       ==  84
especiales !! 500      ==  638
especiales !! 5000     ==  5806
especiales !! 50000    ==  55746

Soluciones

-- 1ª definición
-- =============

especiales :: [Integer]
especiales = filter especial [1..]

especial :: Integer -> Bool
especial n = mcm [1..n-1] == mcm [1..n]

mcm :: [Integer] -> Integer
mcm []     = 1
mcm (x:xs) = lcm x (mcm xs)

-- 2ª definición
-- =============

especiales2 :: [Integer]
especiales2 = [n | ((n,x),(m,y)) <- zip mcms (tail mcms)
                 , x == y]

mcms :: [(Integer,Integer)]
mcms = zip [1..] (scanl lcm 1 [1..])

-- Comparación
--    λ> especiales !! 1000
--    1227
--    (3.97 secs, 1153788720 bytes)
--    λ> especiales2 !! 1000
--    1227
--    (0.01 secs, 1033156 bytes)