Raíces digitales de sucesiones de raíces digitales
La raíz digital de un número entero positivo n es el dígito que 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 pod D(n). Por ejemplo, la raíz digital del número 2345 es 6, porque 2+3+4+5+1 = 15 y sumando los dígitos del 15 resulta 6.
La sucesión de las raices digitales definida por un número a es la sucesión a(n) tal que a(0) = a y a(n+1) es la suma de a(n) y la raíz dígital de a(n). Por ejemplo, los primeros términos de la sucesión de las raíces digitales definida por 1 son
1 |
1,2,4,8,16,23,28,29,31,35,43,50,55,56,58,62,70,77,82,83,85,89,... |
Definir la función
1 |
raicesDigitalesSucesionRaicesDigitales :: Integer -> [Integer] |
tal que (raicesDigitalesSucesionRaicesDigitales a) es la lista de las raíces digitales de los elementos de la sucesión de raíces digitales definidas por a. Por ejemplo,
1 2 3 4 5 6 |
λ> take 20 (raicesDigitalesSucesionRaicesDigitales 1) [1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5,1,2] λ> take 20 (raicesDigitalesSucesionRaicesDigitales 2021) [5,1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5,1] λ> raicesDigitalesSucesionRaicesDigitales (9^100) !! (10^9) 9 |
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import Data.List (cycle) -- 1ª solución -- =========== raicesDigitalesSucesionRaicesDigitales :: Integer -> [Integer] raicesDigitalesSucesionRaicesDigitales a = map raizDigital (sucesionRaicesDigitales a) -- (sucesionRaicesDigitales a) es la sucesión de las raíces digitales -- definida por un número a. Por ejemplo, -- λ> take 22 (sucesionRaicesDigitales 1) -- [1,2,4,8,16,23,28,29,31,35,43,50,55,56,58,62,70,77,82,83,85,89] -- λ> take 22 (sucesionRaicesDigitales 3) -- [3,6,12,15,21,24,30,33,39,42,48,51,57,60,66,69,75,78,84,87,93,96] -- λ> take 22 (sucesionRaicesDigitales 5) -- [5,10,11,13,17,25,32,37,38,40,44,52,59,64,65,67,71,79,86,91,92,94] -- λ> take 22 (sucesionRaicesDigitales 7) -- [7,14,19,20,22,26,34,41,46,47,49,53,61,68,73,74,76,80,88,95,100,101] -- λ> take 22 (sucesionRaicesDigitales 9) -- [9,18,27,36,45,54,63,72,81,90,99,108,117,126,135,144,153,162,171,180,189,198] sucesionRaicesDigitales :: Integer -> [Integer] sucesionRaicesDigitales a = iterate siguienteRaizDigital a -- (siguienteRaizDigital a) es el siguiente de a en la sucesión de raices -- digitales. Por ejemplo, -- siguienteRaizDigital 23 == 28 siguienteRaizDigital :: Integer -> Integer siguienteRaizDigital a = a + raizDigital a -- (raizDigital n) es la raíz digital de n. Por ejemplo, -- raizDigital 23451 == 6 raizDigital :: Integer -> Integer raizDigital n = 1 + (n-1) `mod` 9 -- (noPertenece x ys) se verifica si x no pertenece a la lista infinita -- ordenada creciente ys. Por ejemplo, -- noPertenece 2 [1,3..] == True -- noPertenece 5 [1,3..] == False noPertenece :: Integer -> [Integer] -> Bool noPertenece x ys = not (x `pertenece` ys) -- (Pertenece x ys) se verifica si x pertenece a la lista infinita -- ordenada creciente ys. Por ejemplo, -- pertenece 5 [1,3..] == True -- pertenece 2 [1,3..] == False pertenece :: Integer -> [Integer] -> Bool pertenece x ys = x == head (dropWhile (<x) ys) -- 2ª solución -- =========== -- En el ejercicio aterior vimos que sólo hay 5 sucesiones de ríace -- digitales: las generadas por 1, 3, 5, 7 y 9. Las raíces digitales de -- dichas sucesiones son -- λ> take 20 (raicesDigitalesSucesionRaicesDigitales 1) -- [1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5,1,2] -- λ> take 20 (raicesDigitalesSucesionRaicesDigitales 3) -- [3,6,3,6,3,6,3,6,3,6,3,6,3,6,3,6,3,6,3,6] -- λ> take 20 (raicesDigitalesSucesionRaicesDigitales 5) -- [5,1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5,1] -- λ> take 20 (raicesDigitalesSucesionRaicesDigitales 7) -- [7,5,1,2,4,8,7,5,1,2,4,8,7,5,1,2,4,8,7,5] -- λ> take 20 (raicesDigitalesSucesionRaicesDigitales 9) -- [9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9] -- Se observa que todas son periódicas. raicesDigitalesSucesionRaicesDigitales2 :: Integer -> [Integer] raicesDigitalesSucesionRaicesDigitales2 a = cycle (d : takeWhile (/= d) (tail (raicesDigitalesSucesionRaicesDigitales a))) where d = raizDigital a -- 3ª solución -- =========== raicesDigitalesSucesionRaicesDigitales3 :: Integer -> [Integer] raicesDigitalesSucesionRaicesDigitales3 a = case (raizDigital a) of 1 -> cycle [1,2,4,8,7,5] 2 -> cycle [2,4,8,7,5,1] 3 -> cycle [3,6] 4 -> cycle [4,8,7,5,1,2] 5 -> cycle [5,1,2,4,8,7] 6 -> cycle [6,3] 7 -> cycle [7,5,1,2,4,8] 8 -> cycle [8,7,5,1,2,4] 9 -> cycle [9] -- Comparación de eficiencia -- ========================= -- La comparación es -- λ> raicesDigitalesSucesionRaicesDigitales (9^100) !! (3*10^6) -- 9 -- (4.23 secs, 2,160,860,128 bytes) -- λ> raicesDigitalesSucesionRaicesDigitales2 (9^100) !! (3*10^6) -- 9 -- (0.02 secs, 103,768 bytes) -- λ> raicesDigitalesSucesionRaicesDigitales3 (9^100) !! (3*10^6) -- 9 -- (0.02 secs, 103,056 bytes) -- -- λ> raicesDigitalesSucesionRaicesDigitales2 (9^100) !! (10^9) -- 9 -- (2.09 secs, 103,608 bytes) -- λ> raicesDigitalesSucesionRaicesDigitales3 (9^100) !! (10^9) -- 9 -- (2.25 secs, 102,952 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>
5 Comentarios