Menu Close

Día: 26 abril, 2021

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

   productos :: [Integer]

cuyos elementos son los productos de cuatro enteros positivos consecutivos. Por ejemplo,

   λ> 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

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>