Números consecutivos compuestos
Una serie compuesta de longitud n es una lista de n números consecutivos que son todos compuestos. Por ejemplo, [8,9,10] y [24,25,26] son dos series compuestas de longitud 3.
Cada serie compuesta se puede representar por el par formado por su primer y último elemento. Por ejemplo, las dos series anteriores se pueden representar pos (8,10) y (24,26) respectivamente.
Definir la función
1 |
menorSerieCompuesta :: Integer -> (Integer,Integer) |
tal que (menorSerieCompuesta n) es la menor serie compuesta (es decir, la que tiene menores elementos) de longitud 3. Por ejemplo,
1 2 3 4 |
menorSerieCompuesta 3 == (8,10) menorSerieCompuesta 4 == (24,27) menorSerieCompuesta 5 == (24,28) menorSerieCompuesta 150 == (4652354,4652503) |
Comprobar con QuickCheck que para n > 1, el primer elemento de (menorSerieCompuesta n) es igual al primero de (menorSerieCompuesta (n-1)) o al primero de (menorSerieCompuesta (n+1)).
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 37 38 39 40 41 42 43 44 45 |
import Data.Numbers.Primes import Test.QuickCheck -- 1ª definición -- ============= menorSerieCompuesta1 :: Integer -> (Integer,Integer) menorSerieCompuesta1 n = (x,x+n-1) where x = head [y | y <- [1..] , esCompuesta [y..y+n-1]] esCompuesta :: [Integer] -> Bool esCompuesta xs = all (not . isPrime) xs -- 2ª definición -- ============= menorSerieCompuesta2 :: Integer -> (Integer,Integer) menorSerieCompuesta2 n = (x+1,x+n) where (x,y) = head [(p,q) | (p,q) <- zip primes (tail primes) , q - p >= n + 1] -- Comparación de eficiencia -- ========================= -- λ> menorSerieCompuesta1 75 -- (155922,155996) -- (12.16 secs, 30,378,380,552 bytes) -- λ> menorSerieCompuesta2 75 -- (155922,155996) -- (0.07 secs, 89,813,752 bytes) -- Comprobación de la propiedad -- ============================ -- La propiedad es prop_menorSerieCompuesta :: Integer -> Property prop_menorSerieCompuesta n = n > 1 ==> x == y || y == z where [x,y,z] = map (fst . menorSerieCompuesta2) [n-1,n,n+1] -- La comprobación es -- λ> quickCheck prop_menorSerieCompuesta -- +++ OK, passed 100 tests. |
2 Comentarios