Menu Close

Cuadrados con los dígitos duplicados en Haskell

La semana pasada se planteó en “Números y algo más …” el problema de los cuadrados con los dígitos duplicados cuyo enunciado es el siguiente:

Si elevamos 72576, que tiene un 2, un 5, un 6 y dos 7, al cuadrado obtenemos 5267275776 el cual tiene exactamente dos 2, dos 5, dos 6 y cuatro 7. Es decir que si en el número original el dígito d aparece v veces, en el cuadrado, d aparece 2v veces. ¿Cual es el siguiente número con esta propiedad? ¿Habrá algún primo que lo haga?

En la siguiente relación de ejercicios (elaborada para la asignatura de Informática de 1º del Grado en Matemáticas) se resuelve el problema con Haskell.

-- ---------------------------------------------------------------------
-- Librerías auxiliares
-- ---------------------------------------------------------------------
 
import Data.List
import Data.Numbers.Primes
 
-- ---------------------------------------------------------------------
-- Ejercicio 1. Un número x es especial si el número de ocurrencia de
-- cada dígito d de x en x^2 es el doble del número de ocurrencia de d
-- en x.
--    especial :: Integer -> Bool
-- Definir la función
-- tal que (especial x) se verifica si x es un número especial. Por
-- ejemplo,
--    especial 72576                     ==  True
--    or [especial x | x <- [1..72575]]  ==  False
-- ---------------------------------------------------------------------
 
especial :: Integer -> Bool
especial x =
   concat [[y,y] | y <- sort (show x)] == sort (show (x^2))
 
-- ---------------------------------------------------------------------
-- Ejercicio 2. Calcular el menor número especial mayor que 72576.
-- ---------------------------------------------------------------------
 
-- EL cálculo es
--    ghci> head [x | x <- [72577..], especial x]
--    406512
 
-- ---------------------------------------------------------------------
-- Ejercicio 3. Calcular el primer primo especial.
-- ---------------------------------------------------------------------
 
-- El cálculo es
--    ghci> head [x | x <- primes, especial x]
--    49591523

En el último ejercicio se ha usado la constante primes, cuyo valor es la lista de los números primos, y que está definida en la librería Primes.

Haskell, Sin categoría