Raíces digitales de potencias de dos
La raíz digital de un número entero positivo n es el dígito resulta al sumar sus dígitos, volviendo a sumar reiteradamente los resultados de esa suma y de las siguientes hasta que la suma sea un número de un dígito, al que se llama la raíz digital del número n y se representa por D(n). Por ejemplo, la raíz digital del número 23451 es 6, porque 2+3+4+5+1 = 15 y sumando los dígitos del 15 resulta 6.
Definir la función
1 |
raizDigitalPotencia :: Integer -> Integer |
tal que (raizDigitalPotencia n) es la raíz digital de 2^n. Por ejemplo,
1 2 |
raizDigitalPotencia 6 == 1 raizDigitalPotencia (10^(10^8)) == 7 |
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 83 84 85 86 87 88 89 90 91 92 93 94 |
import Test.QuickCheck (Property, (==>), quickCheck) -- 1ª solución -- =========== raizDigitalPotencia :: Integer -> Integer raizDigitalPotencia n = raizDigital (2^n) -- (raizDigital n) es la raíz digital de n. Por ejemplo, -- raizDigital 23451 == 6 raizDigital :: Integer -> Integer raizDigital n = 1 + (n-1) `mod` 9 -- 2ª solución -- =========== -- Calculando las raíces digitales de los primeros números se obtiene -- λ> map raizDigitalPotencia [0..29] -- [1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5] -- Se observa se repite el período 1,2,4,8,7,5. raizDigitalPotencia2 :: Integer -> Integer raizDigitalPotencia2 n | m == 0 = 1 | m == 1 = 2 | m == 2 = 4 | m == 3 = 8 | m == 4 = 7 | m == 5 = 5 where m = n `mod` 6 -- 3ª solución -- =========== raizDigitalPotencia3 :: Integer -> Integer raizDigitalPotencia3 n = case (n `mod` 6) of 0 -> 1 1 -> 2 2 -> 4 3 -> 8 4 -> 7 5 -> 5 -- 4ª solución -- =========== raizDigitalPotencia4 :: Integer -> Integer raizDigitalPotencia4 n = raizDigital (2^(mod n 6)) -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_raizDigitalPotencia :: Integer -> Property prop_raizDigitalPotencia n = n >= 0 ==> all (== (raizDigitalPotencia n)) [raizDigitalPotencia2 n, raizDigitalPotencia3 n, raizDigitalPotencia4 n] -- La comprobación es -- λ> quickCheck prop_raizDigitalPotencia -- +++ OK, passed 100 tests. -- Comparación de eficiencia -- ========================= -- La comparación es -- λ> raizDigitalPotencia 300000000 -- 1 -- (2.82 secs, 149,107,152 bytes) -- λ> raizDigitalPotencia2 300000000 -- 1 -- (0.01 secs, 98,480 bytes) -- λ> raizDigitalPotencia3 300000000 -- 1 -- (0.01 secs, 98,440 bytes) -- λ> raizDigitalPotencia4 300000000 -- 1 -- (0.01 secs, 98,568 bytes) -- -- λ> raizDigitalPotencia2 (10^(10^8)) -- 7 -- (3.09 secs, 123,233,992 bytes) -- λ> raizDigitalPotencia3 (10^(10^8)) -- 7 -- (3.07 secs, 123,232,728 bytes) -- λ> raizDigitalPotencia4 (10^(10^8)) -- 7 -- (3.18 secs, 123,234,344 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>