Un número n es especial si al unir los dígitos de sus factores primos, se obtienen exactamente los dígitos de n, aunque puede ser en otro orden. Por ejemplo, 1255 es especial, pues los factores primos de 1255 son 5 y 251.
Definir la función
esEspecial :: Integer -> Bool |
tal que (esEspecial n) se verifica si un número n es especial. Por ejemplo,
esEspecial 1255 == True esEspecial 125 == False esEspecial 132 == False |
Comprobar con QuickCheck que todo número primo es especial.
Calcular los 5 primeros números especiales que no son primos.
Soluciones
import Data.List (nub, sort) import Data.Numbers.Primes (isPrime, primeFactors) import Test.QuickCheck esEspecial :: Integer -> Bool esEspecial n = sort (show n) == sort (concatMap show (nub (primeFactors n))) -- La propiedad es prop_primos:: Integer -> Property prop_primos n = isPrime (abs n) ==> esEspecial (abs n) -- La comprobación es -- ghci> quickCheck prop_primos -- +++ OK, passed 100 tests. -- El cálculo es -- ghci> take 5 [n | n <- [2..], esEspecial n, not (isPrime n)] -- [735,1255,3792,7236,11913] |
Solución en Maxima: