Productos de cuatro consecutivos (OME2006 P5)
El enunciado del problema 5 de la OME (Olimpiada Matemática Española) del 2006 es
Probar que el producto de cuatro naturales consecutivos no puede ser ni cuadrado ni cubo perfecto.
Definir la lista
1 |
productos :: [Integer] |
cuyos elementos son los productos de cuatro enteros positivos consecutivos. Por ejemplo,
1 2 |
λ> take 12 productos [24,120,360,840,1680,3024,5040,7920,11880,17160,24024,32760] |
Comprobar con QuickCheck que los elementos de la lista productos no son ni cuadrados ni cubos perfectos.
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 |
import Test.QuickCheck productos :: [Integer] productos = [product [n..n+3] | n <- [1..]] -- La propiedad es prop_productos :: Int -> Property prop_productos n = n >= 0 ==> not (esCuadrado x) && not (esCubo x) where x = productos !! n -- (esCuadrado x) se verifica si x es un cuadrado perfecto. Por -- ejemplo, -- esCuadrado 16 == True -- esCuadrado 27 == False esCuadrado :: Integer -> Bool esCuadrado x = (raizEntera 2 x)^2 == x -- (esCubo x) se verifica si x es un cubo perfecto. Por ejemplo, -- esCubo 8 == True -- esCubo 9 == False esCubo :: Integer -> Bool esCubo x = (raizEntera 3 x)^3 == x -- (raizEntera n x) es el mayor entero cuya potencia n-ésima es menor o -- igual que x. Por ejemplo, -- raizEntera 2 15 == 3 -- raizEntera 2 16 == 4 -- raizEntera 2 17 == 4 raizEntera :: Int -> Integer -> Integer raizEntera n x = aux (1,x) where aux (a,b) | d == x = c | c == a = c | d < x = aux (c,b) | otherwise = aux (a,c) where c = (a+b) `div` 2 d = c^n -- La comprobación es -- λ> quickCheck prop_productos -- +++ OK, passed 100 tests. |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>