Raíz digital
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 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 |
raizDigital :: Integer -> Integer |
tal que (raizDigital n) es la raíz digital del entero positivo n. Por ejemplo,
1 |
raizDigital 23451 == 6 |
Comprobar con QuickCheck las siguientes propiedades de la raíz digital:
- D(m + n) = D(D(m) + D(n)).
- D(mn) = D(D(m)D(n)).
- D(m^n) = D(D(m)^n).
- D(D(n)) = D(n).
- D(n + 9) = D(n).
- D(9n) = 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 |
import Test.QuickCheck (Property, (==>), quickCheck) -- 1ª solución -- =========== raizDigital :: Integer -> Integer raizDigital n | n < 10 = n | otherwise = raizDigital (sumaDigitos n) -- (sumaDigitos n) es la suma de los dígitos de n. Por ejemplo, -- sumaDigitos 2021 == 5 sumaDigitos :: Integer -> Integer sumaDigitos = sum . digitos -- (digitos n) es la lista de los dígitos de n. Por ejemplo, -- digitos 2021 == [2,0,2,1] digitos :: Integer -> [Integer] digitos x = [read [c] | c <- show x] -- 2ª solución -- =========== raizDigital2 :: Integer -> Integer raizDigital2 n = head (dropWhile (>9) (iterate sumaDigitos n)) -- 3ª solución -- =========== raizDigital3 :: Integer -> Integer raizDigital3 n | m == 0 = 9 | otherwise = m where m = n `mod` 9 -- 4ª solución -- =========== raizDigital4 :: Integer -> Integer raizDigital4 n = 1 + (n-1) `mod` 9 -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_raizDigital_equiv :: Integer -> Property prop_raizDigital_equiv n = n > 0 ==> all (== (raizDigital n)) [raizDigital2 n, raizDigital3 n, raizDigital4 n] -- La comprobación es -- λ> quickCheck prop_raizDigital_equiv -- +++ OK, passed 100 tests. -- Propiedades -- =========== -- Las propiedades son prop_raizDigital :: Integer -> Integer -> Property prop_raizDigital m n = m > 0 && n > 0 ==> d(m + n) == d(d(m) + d(n)) && d(m*n) == d(d(m)*d(n)) && d(m^n) == d(d(m)^n) && d(d(n)) == d(n) && d(n + 9) == d(n) && d(9*n) == 9 where d = raizDigital -- La comprobación es -- λ> quickCheck prop_raizDigital -- +++ OK, passed 100 tests. |
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>
4 Comentarios