Un número equidigital es un número natural que tiene el mismo número de dígitos que el número de dígitos en su factorización prima, incluidos los exponentes mayores que 1. Por ejemplo,
- 10 es equidigital ya que tiene 2 dígitos al igual que su factorización prima (2 x 5).
- 25 es equidigital ya que tiene 2 dígitos al igual que su factorización prima (5^2).
- 121 es equidigital ya que tiene 3 dígitos al igual que su factorización prima (11^2).
- 175 es equidigital ya que tiene 3 dígitos al igual que su factorización prima (5^2 x 7).
- 1125 es equidigital ya que tiene 4 dígitos al igual que su factorización prima (3^2 x 5^3).
- 2021 es equidigital ya que tiene 4 dígitos al igual que su factorización prima (43 x 47).
- 3072 es equidigital ya que tiene 4 dígitos al igual que su factorización prima (3 x 2^10).
Definir las funciones
esEquidigital :: Int -> Bool equidigitales :: [Int] |
tal que
- (esEquidigital x) se verifica si x es un número equidigital. Por ejemplo.
esEquidigital 10 == True esEquidigital 11 == True esEquidigital 2021 == True esEquidigital 2022 == False |
- equidigitales es la lista de los números equidigitales. Por ejemplo,
λ> take 20 equidigitales [2,3,5,7,10,11,13,14,15,16,17,19,21,23,25,27,29,31,32,35] λ> equidigitales !! 755 2021 λ> equidigitales !! 100000 405341 |
Comprobar con QuickChek que el conjunto de los números equidigitales es infinito; es decir, para cada entero n existe un equidigital mayor que n.
Soluciones
import Data.Numbers.Primes import Data.List import Test.QuickCheck esEquidigital :: Int -> Bool esEquidigital x = nDigitos x == nDigitosFactorizacion x -- (nDigitos n) es el número de dígitos de n. Por ejemplo, -- nDigitos 2021 == 4 nDigitos :: Int -> Int nDigitos = length . show -- (nDigitosFactorizacion x) es el número de dígitos en la factorización -- prima de x, incluyendo los exponentes mayores que 1. Por ejemplo, -- nDigitosFactorizacion 3000 == 5 -- nDigitosFactorizacion 2021 == 4 -- nDigitosFactorizacion 3072 == 4 nDigitosFactorizacion :: Int -> Int nDigitosFactorizacion x = sum [nDigitos y + aux n | (y,n) <- factorizacion x] where aux 1 = 0 aux n = nDigitos n -- (factorizacion x) es la factorización prima de x expresada como una -- lista de pares que son las bases y los exponentes. Por ejemplo, -- factorizacion 3000 == [(2,3),(3,1),(5,3)] -- factorizacion 2021 == [(43,1),(47,1)] -- factorizacion 3072 == [(2,10),(3,1)] factorizacion :: Int -> [(Int,Int)] factorizacion x = [(y, 1 + length ys) | (y:ys) <- group (primeFactors x)] equidigitales :: [Int] equidigitales = filter esEquidigital [1..] -- La propiedad es prop_equidigitales :: Int -> Property prop_equidigitales n = n > 0 ==> any esEquidigital [n+1..] -- La comprobación es -- λ> quickCheck prop_equidigitales -- +++ OK, passed 100 tests. |
También podríamos emplear Lean para formalizar la demostración de que el conjunto de los números equidigitales es infinito. Una prueba, aunque bastante mejorable, sería: