Productos simultáneos de dos y tres números consecutivos
Definir la función
1 |
productos :: Integer -> Integer -> [[Integer]] |
tal que (productos n x) es las listas de n elementos consecutivos cuyo producto es x. Por ejemplo,
1 2 3 4 |
productos 2 6 == [[2,3]] productos 3 6 == [[1,2,3]] productos 4 1680 == [[5,6,7,8]] productos 2 5 == [] |
Comprobar con QuickCheck que si n > 0 y x > 0, entonces
1 |
productos n (product [x..x+n-1]) == [[x..x+n-1]] |
Usando productos, definir la función
1 |
productosDe2y3consecutivos :: [Integer] |
cuyos elementos son los números naturales (no nulos) que pueden expresarse simultáneamente como producto de dos y tres números consecutivos. Por ejemplo,
1 |
head productosDe2y3consecutivos == 6 |
Nota. Según demostró Mordell en 1962, productosDe2y3consecutivos sólo tiene dos elementos.
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 46 47 |
import Test.QuickCheck -- 1ª definición productos1 :: Integer -> Integer -> [[Integer]] productos1 n x = [[y..y+n-1] | y <- [1..x], product [y..y+n-1] == x] -- 2ª definición -- ============= -- Se puede reducir el intervalo de búsqueda teniendo en cuenta las -- siguientes desigualdades -- y*(y+1)* ... (y+n-1) = x -- y^n <= x <= (y+n-1)^n -- y <= x^(1/n), x^(1/n)-n+1 <= y -- x^(1/n)-n+1 <= y <= x^(1/n) productos2 :: Integer -> Integer -> [[Integer]] productos2 n x = [[z..z+n-1] | z <- [y-n+1..y], product [z..z+n-1] == x] where y = floor ((fromIntegral x)**(1/(fromIntegral n))) productos :: Integer -> Integer -> [[Integer]] productos = productos2 prop_productos n x = n > 0 && x > 0 ==> productos n (product [x..x+n-1]) == [[x..x+n-1]] -- La comprobación es -- ghci> quickCheck prop_productos -- +++ OK, passed 100 tests. -- (0.10 secs, 26409644 bytes) productosDe2y3consecutivos :: [Integer] productosDe2y3consecutivos = [x| x <- [1..], let ys = productos 2 x, not (null ys), let zs = productos 3 x, not (null zs)] -- El cálculo es -- ghci> take 2 productosDe2y3consecutivos -- [6,210] -- ghci> productos 2 210 -- [[14,15]] -- ghci> productos 3 210 -- [[5,6,7]] |
Por simple curiosidad, una pequeña comprobación de la demostración de Mordell.