Menu Close

Huecos de Aquiles

Un número de Aquiles es un número natural n que es potente (es decir, si p es un divisor primo de n, entonces p² también lo es) y no es una potencia perfecta (es decir, no existen números naturales m y k tales que n es igual a m^k). Por ejemplo,

  • 108 es un número de Aquiles proque es un número potente (ya que su factorización es 2^2 · 3^3, sus divisores primos son 2 and 3 y sus cuadrados (2^2 = 4 y 3^2 = 9) son divisores de 108. Además, 108 no es una potencia perfecta.
  • 360 no es un número de Aquiles ya que 5 es un divisor primo de 360, pero 5^2 = 15 no lo es.
  • 784 no es un número de Aquiles porque, aunque es potente, es una potencia perfecta ya que 784 = 28^2.

Los primeros números de Aquiles son

   72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, 972, ...

Definir las funciones

   esAquiles              :: Integer -> Bool
   huecosDeAquiles        :: [Integer]
   graficaHuecosDeAquiles :: Int -> IO ()

tales que

  • (esAquiles x) se verifica si x es un número de Aquiles. Por ejemplo,
     esAquiles 108         ==  True
     esAquiles 360         ==  False
     esAquiles 784         ==  False
     esAquiles 5425069447  ==  True
     esAquiles 5425069448  ==  True
  • huecosDeAquiles es la sucesión de la diferencias entre los números de Aquiles consecutivos. Por ejemplo,
     λ> take 15 huecosDeAquiles
     [36,92,88,104,40,68,148,27,125,64,104,4,153,27,171]
  • (graficaHuecosDeAquiles n) dibuja la gráfica de los n primeros huecos de Aquiles. Por ejemplo, (graficaHuecosDeAquiles 160) dibuja

Soluciones

import Data.List (group)
import Data.Numbers.Primes (primeFactors)
import Graphics.Gnuplot.Simple
 
-- Definición de esAquiles
-- =======================
 
esAquiles :: Integer -> Bool
esAquiles x = esPotente x && noEsPotenciaPerfecta x
 
-- (esPotente x) se verifica si x es potente. Por ejemplo,
--    esPotente 108  ==  True
--    esPotente 360  ==  False
--    esPotente 784  ==  True
esPotente :: Integer -> Bool
esPotente x = all (>1) (exponentes x)
 
-- (exponentes x) es la lista de los exponentes en la factorización de
-- x. Por ejemplo,
--    exponentes 108  ==  [2,3]
--    exponentes 360  ==  [3,2,1]
--    exponentes 784  ==  [4,2]
exponentes :: Integer -> [Int]
exponentes x = map length (group (primeFactors x))
 
-- (noEsPotenciaPerfecta x) se verifica si x no es una potencia
-- perfecta. Por ejemplo,
--    noEsPotenciaPerfecta 108  ==  True
--    noEsPotenciaPerfecta 360  ==  True
--    noEsPotenciaPerfecta 784  ==  False
noEsPotenciaPerfecta :: Integer -> Bool
noEsPotenciaPerfecta x = foldl1 gcd (exponentes x) == 1 
 
-- Definición de huecosDeAquiles
-- =============================
 
huecosDeAquiles :: [Integer]
huecosDeAquiles = zipWith (-) (tail aquiles) aquiles
 
-- aquiles es la sucesión de los números de Aquiles. Por ejemplo, 
--    λ> take 15 aquiles
--    [72,108,200,288,392,432,500,648,675,800,864,968,972,1125,1152]
aquiles :: [Integer]
aquiles = filter esAquiles [2..]
 
-- Definición de graficaHuecosDeAquiles
-- ====================================
 
graficaHuecosDeAquiles :: Int -> IO ()
graficaHuecosDeAquiles n =
  plotList [ Key Nothing
           , PNG "Huecos_de_Aquiles.png"
           ]
           (take n huecosDeAquiles)

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>

3 soluciones de “Huecos de Aquiles

  1. fercarnav
    import Data.List
    import Data.Numbers.Primes
    import Graphics.Gnuplot.Simple  
     
    esAquiles :: Integer -> Bool
    esAquiles n | esPotenciaPerfecta n = False
    esAquiles n = cumple xs
      where xs = primeFactors n
     
    esPotenciaPerfecta :: Integer -> Bool
    esPotenciaPerfecta n = all ((==0).(f y)) ys
      where xs = primeFactors n
            ys = map genericLength (group xs)
            y = minimum ys
            f x y = mod y x
     
    cumple :: [Integer] -> Bool
    cumple []         = True
    cumple [x]        = False
    cumple (x1:x2:xs) = x1 == x2 && cumple (dropWhile ((==x1)) xs)
     
    huecosDeAquiles :: [Integer]
    huecosDeAquiles = zipWith (-) (tail numerosAquiles) numerosAquiles
     
    numerosAquiles :: [Integer]
    numerosAquiles = [x | x <- [2..], esAquiles x]
     
    graficaHuecosDeAquiles :: Int -> IO ()
    graficaHuecosDeAquiles n = 
      plotList [ Key Nothing
               , Title ("grafica Huecos De Aquiles " ++ show n)
               ]
               (genericTake n huecosDeAquiles)
  2. Enrique Zubiría
    import Data.Numbers.Primes
    import Graphics.Gnuplot.Simple
     
    esAquiles :: Integer -> Bool
    esAquiles n = esPotente n && (not . esPotenciaPerfecta) n
     
    aquiles :: [Integer]
    aquiles = filter esAquiles [1..]
     
    huecosDeAquiles :: [Integer]
    huecosDeAquiles = zipWith (-) (tail aquiles) aquiles
     
    potentes :: [Integer]
    potentes = filter esPotente [1..]
     
    esPotente :: Integer -> Bool
    esPotente n = (all (p -> rem n (p^2) == 0) (primeFactors n))
     
    esPotencia :: Integer -> Integer -> Bool
    esPotencia n f = any (==n) (takeWhile (<=n) [f^k | k <- [2..]])
     
    esPotenciaPerfecta :: Integer -> Bool
    esPotenciaPerfecta n = any (esPotencia n) (takeWhile (<n) [2..])
     
    graficaHuecosDeAquiles :: Int -> IO ()
    graficaHuecosDeAquiles n = do
      plotList [ Key Nothing, PNG "huecosDeAquiles.png"]
               (take n huecosDeAquiles)
  3. fernando sanchez
    import Data.List
    import Data.Numbers.Primes
    import Graphics.Gnuplot.Simple 
     
    esAquiles :: Integer -> Bool
    esAquiles p = esPotente p && (not $ potenciaPerf p )
     
    esPotente :: Integer -> Bool
    esPotente p = all (xs->length xs >= 2) (group (primeFactors p ))
     
    potenciaPerf :: Integer -> Bool
    potenciaPerf p = multiplocomun (map (xs-> length xs) (group (primeFactors p)))
     
    multiplocomun :: [Int] -> Bool
    multiplocomun xs = not $  null  $ foldr1 (intersect) (map (primeFactors) xs)
     
    huecosDeAquiles :: [Integer]
    huecosDeAquiles = zipWith (-) (drop 1 aquiles) aquiles
     
    aquiles :: [Integer]
    aquiles = filter (esAquiles ) [72..]
     
    graficaHuecosDeAquiles :: Int -> IO ()
    graficaHuecosDeAquiles n = plotList [] (take n huecosDeAquiles)

Leave a Reply

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