Buenos primos
La sucesión de los números primos es
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, ...
Las parejas de primos equidistantes de 5 en dicha sucesión son (3, 7) y (2, 11). Se observa que el cuadrado de 5 es mayor que el producto de los elementos de dichas parejas; es decir,
5^2 = 25 > 21 = 3 x 7 5^2 = 25 > 22 = 2 x 11
En cambio, el 7 tiene una pareja de primos equidistantes (la (5, 11)) cuyo producto es mayor que el cuadrado de 7.
7^2 = 49 < 55 = 5 x 11
Un buen primo es un número primo cuyo cuadrado es mayor que el producto de dos primos cualesquiera equidistantes de él en la sucesión de primos. Por ejemplo, 5 es un buen primo pero 7 no lo es.
Definir las funciones
esBuenPrimo :: Integer -> Bool buenosPrimos :: [Integer]
tales que
- (esBuenPrimo n) se verifica si n es un buen primo. Por ejemplo,
esBuenPrimo 5 == True esBuenPrimo 7 == False esBuenPrimo 8746811 == True
- buenosPrimos es la lista de los buenos primos. Por ejemplo,
λ> take 12 buenosPrimos [2,5,11,17,29,37,41,53,59,67,71,97]
Comprobar con QuickCheck que la lista de los buenos primos es infinita; es decir, para cualquier entero positivo n existe un número mayor que n que es un buen primo.
Soluciones
import Data.Numbers.Primes (primes) import Test.QuickCheck (Property, (==>), quickCheck) esBuenPrimo :: Integer -> Bool esBuenPrimo n = n == y && and [n^2 > x * y | (x, y) <- zip (reverse xs) ys] where (xs,y:ys) = span (< n) primes buenosPrimos :: [Integer] buenosPrimos = filter esBuenPrimo [2..] -- La propiedad es prop_buenosPrimos :: Integer -> Property prop_buenosPrimos n = n > 0 ==> any esBuenPrimo [n+1..] -- La comprobación es -- λ> quickCheck prop_buenosPrimos -- +++ OK, passed 100 tests.