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.
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]
λ> 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 =maplength(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 =foldl1gcd(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)
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”