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
1 |
72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, 972, ... |
Definir las funciones
1 2 3 |
esAquiles :: Integer -> Bool huecosDeAquiles :: [Integer] graficaHuecosDeAquiles :: Int -> IO () |
tales que
- (esAquiles x) se verifica si x es un número de Aquiles. Por ejemplo,
1 2 3 4 5 |
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,
1 2 |
λ> 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
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 46 47 48 49 50 51 52 53 54 |
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 Comentarios