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 pod 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
raizDigital :: Integer -> Integer
tal que (raizDigital n) es la raíz digital del entero positivo n. Por ejemplo,
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
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.