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] |
[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" |
"23571113171923293137414347535961677173798389971011"
Definir la función
primoEnPosicion :: Int -> Integer |
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 |
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. |
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.
Se puede imprimir o compartir con
5 Comments