Números equidigitales
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
1 2 |
esEquidigital :: Int -> Bool equidigitales :: [Int] |
tal que
- (esEquidigital x) se verifica si x es un número equidigital. Por ejemplo.
1 2 3 4 |
esEquidigital 10 == True esEquidigital 11 == True esEquidigital 2021 == True esEquidigital 2022 == False |
- equidigitales es la lista de los números equidigitales. Por ejemplo,
1 2 3 4 5 6 |
λ> 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
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 |
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: