Elementos múltiplos de la longitud de la lista
Definir las funciones
1 2 |
multiplosDeLaLongitud :: [Int] -> [Int] multiplosDeLaLongitudDeConsecutivos :: Int -> Int -> [Int] |
tales que
- (multiplosDeLaLongitud xs) es la lista de los elementos de xs que son múltiplos de la longitud de xs. Por ejemplo,
1 |
multiplosDeLaLongitud [2,4,6,8] == [4,8] |
- (multiplosDeLaLongitudDeConsecutivos n m) es la lista de elementos de [n..n+m-1] que son múltiplos de n. Por ejemplo,
1 2 |
multiplosDeLaLongitudDeConsecutivos 9 2 == [10] multiplosDeLaLongitudDeConsecutivos 9 12 == [12] |
Comprobar con QuickCheck si se verifican las siguientes propiedades
- En cualquier conjunto de m elementos consecutivos, m divide exactamente a uno de dichos elementos. En otras palabras, si n y m son enteros positivos, entonces (multiplosDeLaLongitudDeConsecutivos n m) tiene exactamente un elemento.
- Si n es un entero positivo y m >= n, entonces (multiplosDeLaLongitudDeConsecutivos n m) es igual a [m]
- Si n y n son enteros positivos y m < n, entonces (multiplosDeLaLongitudDeConsecutivos n m) es igual a [m * ceiling (n’ / m’)] donde n’ y m’ son las formas decimales de n y m respectivamente.
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import Test.QuickCheck multiplosDeLaLongitud :: [Int] -> [Int] multiplosDeLaLongitud xs = [x | x <- xs , x `mod` n == 0] where n = length xs multiplosDeLaLongitudDeConsecutivos :: Int -> Int -> [Int] multiplosDeLaLongitudDeConsecutivos n m = multiplosDeLaLongitud [n..n+m-1] -- La 1ª propiedad es prop_multiplosDeLaLongitud :: Int -> Int -> Property prop_multiplosDeLaLongitud n m = n > 0 && m > 0 ==> length (multiplosDeLaLongitudDeConsecutivos n m) == 1 -- La comprobación es -- λ> quickCheck prop_multiplosDeLaLongitud -- +++ OK, passed 100 tests. -- La 2ª propiedad es prop_multiplosDeLaLongitud2 :: Int -> Int -> Property prop_multiplosDeLaLongitud2 n m = n > 0 && m >= n ==> multiplosDeLaLongitudDeConsecutivos n m == [m] -- La comprobación es -- λ> quickCheck prop_multiplosDeLaLongitud2 -- +++ OK, passed 100 tests. -- La 3ª propiedad es prop_multiplosDeLaLongitud3 :: Int -> Int -> Property prop_multiplosDeLaLongitud3 n m = n > 0 && 0 < m && m < n ==> multiplosDeLaLongitudDeConsecutivos n m == [m * ceiling (n' / m')] where n' = fromIntegral n m' = fromIntegral m -- La comprobación es -- λ> quickCheck prop_multiplosDeLaLongitud3 -- +++ OK, passed 100 tests. -- Con las propiedades anteriores se puede redefinir multiplos multiplosDeLaLongitudDeConsecutivos2 :: Int -> Int -> [Int] multiplosDeLaLongitudDeConsecutivos2 n m | m < n = [m * ceiling (n' / m')] | otherwise = [m] where n' = fromIntegral n m' = fromIntegral m -- Comprobación de la equivalencia prop_equiv :: Int -> Int -> Property prop_equiv n m = n > 0 && m > 0 ==> multiplosDeLaLongitudDeConsecutivos n m == multiplosDeLaLongitudDeConsecutivos2 n m -- La comprobación es -- λ> quickCheck prop_multiplosDeLaLongitud -- +++ OK, passed 100 tests. -- Comparación de eficiencia -- ========================= -- λ> xs1 = [multiplosDeLaLongitudDeConsecutivos n (10^3) | n <- [1..10^4]] -- (0.01 secs, 0 bytes) -- λ> xs2 = [multiplosDeLaLongitudDeConsecutivos2 n (10^3) | n <- [1..10^4]] -- (0.01 secs, 0 bytes) -- λ> maximum xs1 -- [10000] -- (2.51 secs, 2,093,241,168 bytes) -- λ> maximum xs2 -- [10000] -- (0.02 secs, 16,742,408 bytes) |
Referencia
- Set of successive numbers contains unique multiple en ProofWiki.
Pensamiento
Pensando que no veía
porque Dios no le miraba,
dijo Abel cuando moría:
Se acabó lo que se daba.Antonio Machado
2 Comentarios