Representaciones de un número como potencia
El número 512 se puede escribir de tres maneras como potencias:
1 |
512 = 2⁹ = 8³ = 512¹ |
Definir las funciones
1 2 |
potencias :: Integer -> [(Integer,Integer)] numeroPotencias :: Integer -> Int |
tales que
- (potencias x) es la lista de las representaciones de x como potencias de números enteros positivos. Por ejemplo,
1 2 3 4 5 |
potencias 7 == [(7,1)] potencias 8 == [(2,3),(8,1)] potencias 512 == [(2,9),(8,3),(512,1)] potencias 16384 == [(2,14),(4,7),(128,2),(16384,1)] potencias 65536 == [(2,16),(4,8),(16,4),(256,2),(65536,1)] |
- (numeroPotencias x) de las representaciones de x como potencias de números enteros positivos. Por ejemplo,
1 2 3 4 5 6 |
numeroPotencias 7 == 1 numeroPotencias 8 == 2 numeroPotencias 512 == 3 numeroPotencias 16384 == 4 numeroPotencias 65536 == 5 numeroPotencias (2^(10^5)) == 36 |
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 |
import Data.List (group,genericLength) import Data.Numbers.Primes (primeFactors) potencias :: Integer -> [(Integer,Integer)] potencias x = [(a^d,b `div` d) | d <- divisores b] where ps = factorizacionPrima x b = mcd (map snd ps) a = product [c^(e `div` b) | (c,e) <- ps] -- (divisores x) es la lista de los divisores de x. Por ejemplo, -- divisores 120 == [1,2,3,4,5,6,8,10,12,15,20,24,30,40,60,120] divisores :: Integer -> [Integer] divisores x = [y | y <- [1..x], x `mod` y == 0] -- (factorizacionPrima x) es la factorización prima de x. Por ejemplo, -- factorizacionPrima 1200 == [(2,4),(3,1),(5,2)] factorizacionPrima :: Integer -> [(Integer,Integer)] factorizacionPrima x = [(head xs, genericLength xs) | xs <- group (primeFactors x)] -- (mcd xs) es el máximo común divisor de xs. Por ejemplo, -- mcd [12,30,42] == 6 mcd :: Integral a => [a] -> a mcd xs = foldr1 gcd xs -- 1ª definición de numeroPotencias -- ================================ -- numeroPotencias 7 == 1 -- numeroPotencias 8 == 2 -- numeroPotencias 512 == 3 -- numeroPotencias 16384 == 4 -- numeroPotencias 65536 == 5 -- numeroPotencias (2^(10^5)) == 36 numeroPotencias :: Integer -> Int numeroPotencias = length . potencias -- 2ª definición de numeroPotencias -- ================================ numeroPotencias2 :: Integer -> Int numeroPotencias2 n = numeroDivisores (mcd (map length (group (primeFactors n)))) -- (numeroDivisores n) es el número de divisores de n. Por ejemplo, -- numeroDivisores 12 == 6 -- numeroDivisores 14 == 4 numeroDivisores :: Int -> Int numeroDivisores = product . map ((+1) . length) . group . primeFactors -- Comparación de eficiencia de numeroPotencias -- ============================================ -- La comparación es -- λ> numeroPotencias (2^(10^5)) -- 36 -- (0.40 secs, 707,287,312 bytes) -- λ> numeroPotencias2 (2^(10^5)) -- 36 -- (0.35 secs, 675,954,872 bytes) |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>