Buenos primos
La sucesión de los números primos es
1 |
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,
1 2 |
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.
1 |
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
1 2 |
esBuenPrimo :: Integer -> Bool buenosPrimos :: [Integer] |
tales que
- (esBuenPrimo n) se verifica si n es un buen primo. Por ejemplo,
1 2 3 |
esBuenPrimo 5 == True esBuenPrimo 7 == False esBuenPrimo 8746811 == True |
- buenosPrimos es la lista de los buenos primos. Por ejemplo,
1 2 |
λ> 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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. |
5 Comentarios