Primo anterior
Definir la función
1 |
primoAnterior :: Integer -> Integer |
tal que (primoAnterior n) es el mayor primo menor que n (donde n > 2). Por ejemplo,
1 2 3 4 5 |
primoAnterior 10 == 7 primoAnterior 17 == 13 primoAnterior 30 == 29 primoAnterior 2016 == 2011 primoAnterior 15726 == 15683 |
Calcular el menor número cuya distancia a su primo anterior es mayor que 40.
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 |
import Data.Numbers.Primes ( isPrime , primes ) -- 1ª definición primoAnterior1 :: Integer -> Integer primoAnterior1 n = last (takeWhile (<n) primes) -- 2ª definición primoAnterior2 :: Integer -> Integer primoAnterior2 3 = 2 primoAnterior2 n = head [x | x <- [a,a-2..] , isPrime x] where a | even n = n-1 | otherwise = n-2 -- Comparación de eficiencia -- λ> primoAnterior1 3000000 -- 2999999 -- (1.80 secs, 1,148,572,848 bytes) -- λ> primoAnterior2 3000000 -- 2999999 -- (0.00 secs, 0 bytes) -- -- λ> head [n | n <- [3..], n - primoAnterior1 n > 34] -- 9586 -- (28.08 secs, 14,396,008,560 bytes) -- λ> head [n | n <- [3..], n - primoAnterior2 n > 34] -- 9586 -- (1.10 secs, 625,247,632 bytes) -- El cálculo es -- λ> head [n | n <- [3..], n - primoAnterior2 n > 40] -- 15724 |
El ejercicio pide el menor número tal que la distancia a su primo anterior sea mayor que 40, no exactamente 40. Para ello, he creado la siguiente función: