Cadena de primos
La lista de los primeros números primos es
1 |
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71] |
Los primeros elementos de la cadena obtenida concatenado los números primos es
1 |
"23571113171923293137414347535961677173798389971011" |
Definir la función
1 |
primoEnPosicion :: Int -> Integer |
tal que (primoEnPosicion n) es el número primo que tiene algún dígito en la posición n de la cadena obtenida concatenado los números primos. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 |
primoEnPosicion 0 == 2 primoEnPosicion 1 == 3 primoEnPosicion 4 == 11 primoEnPosicion 5 == 11 primoEnPosicion 6 == 13 primoEnPosicion 1022 == 2011 primoEnPosicion 1023 == 2017 primoEnPosicion 1026 == 2017 primoEnPosicion 1027 == 2027 primoEnPosicion (10^7) == 21242357 |
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 |
import Data.Numbers.Primes import Test.QuickCheck -- 1ª definición -- ============= primoEnPosicion :: Int -> Integer primoEnPosicion = aux primes where aux (x:xs) n | m > n = x | otherwise = aux xs (n-m) where m = length (show x) -- 2ª definición -- ============= primoEnPosicion2 :: Int -> Integer primoEnPosicion2 n = p where (p,_) = head $ dropWhile (\(x,k) -> k < n) primosYfinales -- primosYfinales es la sucesión de los pares de los números primos y -- las posiciones de sus dígitos finales en la sucesión de la -- concatenación de primos. Por ejemplo, -- λ> take 10 primosYfinales -- [(2,0),(3,1),(5,2),(7,3),(11,5),(13,7),(17,9),(19,11),(23,13),(29,15)] primosYfinales :: [(Integer, Int)] primosYfinales = scanl f (2,0) (tail primes) where f (p,k) q = (q, k + length (show q)) -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_equivalencia (Positive n) = primoEnPosicion n == primoEnPosicion2 n -- La comprobación es -- λ> quickCheck prop_equivalencia -- +++ OK, passed 100 tests. |
5 Comentarios