Factorización prima
La descomposición prima de 600 es
1 |
600 = 2³ * 3 * 5² |
Definir la función
1 |
factorizacion :: Integer -> [(Integer,Integer)] |
tal que (factorizacion x) ses la lista de las bases y exponentes de la descomposición prima de x. Por ejemplo,
1 2 |
factorizacion 600 == [(2,3),(3,1),(5,2)] length (factorizacion (product [1..3*10^4])) == 3245 |
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
import Data.List (genericLength, group, inits, nub, sort, subsequences) import Data.Numbers.Primes (primes, primeFactors) -- 1ª solución -- =========== factorizacion :: Integer -> [(Integer,Integer)] factorizacion n = [(x,nOcurrencias x xs) | x <- elementos xs] where xs = factoresPrimos n -- (factores primos n) es la lista de los factores primos de n. Por -- ejemplo, -- factoresPrimos 600 == [2,2,2,3,5,5] factoresPrimos :: Integer -> [Integer] factoresPrimos 1 = [] factoresPrimos n = x : factoresPrimos (n `div` x) where x = menorFactor n -- (menorFactor n) es el menor factor primo de n. Por ejemplo, -- menorFactor 10 == 2 -- menorFactor 11 == 11 menorFactor :: Integer -> Integer menorFactor n = head [x | x <- [2..n], n `mod` x == 0] -- (elementos xs) es la lista de los elementos, sin repeticiones, de -- xs. Por ejemplo, -- elementos [3,2,3,5,2] == [3,2,5] elementos :: Eq a => [a] -> [a] elementos [] = [] elementos (x:xs) = x : elementos (filter (/=x) xs) -- (nOcurrencias x ys) es el número de ocurrencias de x en ys. Por -- ejemplo, -- nOcurrencias 'a' "Salamanca" == 4 nOcurrencias :: Eq a => a -> [a] -> Integer nOcurrencias x ys = genericLength (filter (==x) ys) -- 2ª solución -- =========== factorizacion2 :: Integer -> [(Integer,Integer)] factorizacion2 n = [(head xs,genericLength xs) | xs <- group (primeFactors n)] -- 3ª solución -- =========== factorizacion3 :: Integer -> [(Integer,Integer)] factorizacion3 = map primeroYlongitud . group . primeFactors -- (primeroYlongitud xs) es el par formado por el primer elemento de xs -- y la longitud de xs. Por ejemplo, -- primeroYlongitud [3,2,5,7] == (3,4) primeroYlongitud :: [a] -> (a,Integer) primeroYlongitud (x:xs) = (x, 1 + genericLength xs) -- Comparación de eficiencia de sumaDivisores -- ========================================== -- λ> length (factorizacion (product [1..10^4])) -- 1229 -- (4.84 secs, 2,583,331,768 bytes) -- λ> length (factorizacion2 (product [1..10^4])) -- 1229 -- (0.24 secs, 452,543,360 bytes) -- λ> length (factorizacion3 (product [1..10^4])) -- 1229 -- (0.23 secs, 452,433,504 bytes) -- -- λ> length (factorizacion (product (take (2*10^3) primes))) -- 2000 -- (6.58 secs, 3,415,098,552 bytes) -- λ> length (factorizacion2 (product (take (2*10^3) primes))) -- 2000 -- (0.02 secs, 23,060,512 bytes) -- λ> length (factorizacion3 (product (take (2*10^3) primes))) -- 2000 -- (0.02 secs, 22,882,080 bytes) |
Pensamiento
¿Todo para los demás?
Mancebo, llena tu jarro,
que ya te lo beberán.Antonio Machado
Es una solución sin usar ninguna librería auxiliar
Se puede eliminar la función head.