Máximo común divisor de x e y veces n
Definir las funciones
1 2 |
repite :: Int -> Integer -> Integer mcdR :: Integer -> Int -> Int -> Integer |
tales que
- (repite x n) es el número obtenido repitiendo x veces el número n. Por ejemplo.
1 |
repite 3 123 == 123123123 |
- (mcdR n x y) es el máximo común divisor de los números obtenidos repitiendo x veces e y veces el número n. Por ejemplo.
1 2 3 |
mcdR 123 2 3 == 123 mcdR 4 4 6 == 44 mcdR 2017 (10^1000) (2+10^1000) == 20172017 |
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 |
import Test.QuickCheck repite :: Int -> Integer -> Integer repite x n = read (concat (replicate x (show n))) -- 1ª definición mcdR :: Integer -> Int -> Int -> Integer mcdR n x y = gcd (repite x n) (repite y n) -- 2ª definición mcdR2 :: Integer -> Int -> Int -> Integer mcdR2 n x y = repite (gcd x y) n -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_equivalencia :: (Positive Integer) -> (Positive Int) -> (Positive Int) -> Bool prop_equivalencia (Positive n) (Positive x) (Positive y) = mcdR n x y == mcdR2 n x y -- La comprobación es -- λ> quickCheck prop_equivalencia -- +++ OK, passed 100 tests. -- Comparación de eficiencia -- ========================= -- λ> mcdR 2017 (10^6) (2+10^6) -- 20172017 -- (18.92 secs, 6,012,285,224 bytes) -- λ> mcdR2 2017 (10^6) (2+10^6) -- 20172017 -- (0.01 secs, 0 bytes) |