Números libres de cuadrados
Un número es libre de cuadrados si no es divisible el cuadrado de ningún entero mayor que 1. Por ejemplo, 70 es libre de cuadrado porque sólo es divisible por 1, 2, 5, 7 y 70; en cambio, 40 no es libre de cuadrados porque es divisible por 2².
Definir la función
1 |
libreDeCuadrados :: Integer -> Bool |
tal que (libreDeCuadrados x) se verifica si x es libre de cuadrados. Por ejemplo,
1 2 3 4 |
libreDeCuadrados 70 == True libreDeCuadrados 40 == False libreDeCuadrados 510510 == True libreDeCuadrados (((10^10)^10)^10) == False |
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 |
-- 1ª definición: libreDeCuadrados :: Integer -> Bool libreDeCuadrados x = x == product (divisoresPrimos x) -- (divisoresPrimos x) es la lista de los divisores primos de x. Por -- ejemplo, -- divisoresPrimos 40 == [2,5] -- divisoresPrimos 70 == [2,5,7] divisoresPrimos :: Integer -> [Integer] divisoresPrimos x = [n | n <- divisores x, primo n] -- (divisores n) es la lista de los divisores del número n. Por ejemplo, -- divisores 30 == [1,2,3,5,6,10,15,30] divisores :: Integer -> [Integer] divisores n = [x | x <- [1..n], n `mod` x == 0] -- (primo n) se verifica si n es primo. Por ejemplo, -- primo 30 == False -- primo 31 == True primo :: Integer -> Bool primo n = divisores n == [1, n] -- 2ª definición libreDeCuadrados2 :: Integer -> Bool libreDeCuadrados2 n = null [x | x <- [2..n], rem n (x^2) == 0] -- 3ª definición libreDeCuadrados3 :: Integer -> Bool libreDeCuadrados3 n = null [x | x <- [2..floor (sqrt (fromIntegral n))], rem n (x^2) == 0] -- Comparación de eficiencia -- ========================= -- λ> libreDeCuadrados 510510 -- True -- (0.76 secs, 89,522,360 bytes) -- λ> libreDeCuadrados2 510510 -- True -- (1.78 secs, 371,826,320 bytes) -- λ> libreDeCuadrados3 510510 -- True -- (0.01 secs, 0 bytes) |
11 Comentarios