Cadenas de primos complementarios
El complemento de un número positivo x se calcula por el siguiente procedimiento:
- si x es mayor que 9, se toma cada dígito por su valor posicional y se resta del mayor los otro dígitos. Por ejemplo, el complemento de 1448 es 1000 – 400 – 40 – 8 = 552. Para
- si x es menor que 10, su complemento es x.
Definir las funciones
1 2 |
cadena :: Integer -> [Integer] conCadena :: Int -> [Integer] |
tales que
- (cadena x) es la cadena de primos a partir de x tal que cada uno es el complemento del anterior. Por ejemplo,
1 2 3 4 5 6 |
cadena 8 == [] cadena 7 == [7] cadena 13 == [13,7] cadena 643 == [643,557,443] cadena 18127 == [18127,1873,127,73,67,53,47] cadena 18181213 == [18181213,1818787,181213,18787,1213,787,613,587] |
- (conCadena n) es la lista de números cuyas cadenas tienen n elementos. Por ejemplo,
1 2 |
take 6 (conCadena 3) == [23,31,61,67,103,307] [head (conCadena n) | n <- [4..8]] == [37,43,157,18127,181873] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import Data.Numbers.Primes -- (complemento x) es le complemento de x. Por ejemplo, -- complemento 1448 == 552 -- complemento 639 == 561 -- complemento 7 == 7 complemento :: Integer -> Integer complemento x = (div x c)*c - (rem x c) where c = 10^(length (show x) - 1) cadena :: Integer -> [Integer] cadena x | x < 10 && isPrime x = [x] | otherwise = takeWhile isPrime (iterate f x) where f x | x < 10 && isPrime x = 0 | otherwise = complemento x conCadena :: Int -> [Integer] conCadena n = [y | y <- primes, length (cadena y) == n] |
2 Comentarios