Cadena de primos
La lista de los primeros números primos es
[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
"23571113171923293137414347535961677173798389971011"
Definir la función
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,
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
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.