Raíz cúbica entera
Un número x es un cubo si existe un y tal que x = y^3. Por ejemplo, 8 es un cubo porque 8 = 2^3.
Definir la función
1 |
raizCubicaEntera :: Integer -> Maybe Integer. |
tal que (raizCubicaEntera x n) es justo la raíz cúbica del número natural x, si x es un cubo y Nothing en caso contrario. Por ejemplo,
1 2 3 4 5 6 7 |
raizCubicaEntera 8 == Just 2 raizCubicaEntera 9 == Nothing raizCubicaEntera 27 == Just 3 raizCubicaEntera 64 == Just 4 raizCubicaEntera (2^30) == Just 1024 raizCubicaEntera (10^9000) == Just (10^3000) raizCubicaEntera (5 + 10^9000) == Nothing |
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 81 82 83 84 85 86 87 88 |
import Test.QuickCheck -- 1ª definición -- ============= raizCubicaEntera :: Integer -> Maybe Integer raizCubicaEntera x = aux 0 where aux y | y^3 > x = Nothing | y^3 == x = Just y | otherwise = aux (y+1) -- 2ª definición -- ============= raizCubicaEntera2 :: Integer -> Maybe Integer raizCubicaEntera2 x | y^3 == x = Just y | otherwise = Nothing where (y:_) = dropWhile (\y -> y^3 < x) [0..] -- 3ª definición -- ============= raizCubicaEntera3 :: Integer -> Maybe Integer raizCubicaEntera3 1 = Just 1 raizCubicaEntera3 x = aux (0,x) where aux (a,b) | d == x = Just c | c == a = Nothing | d < x = aux (c,b) | otherwise = aux (a,c) where c = (a+b) `div` 2 d = c^3 -- 4ª definición -- ============= raizCubicaEntera4 :: Integer -> Maybe Integer raizCubicaEntera4 x | y^3 == x = Just y | otherwise = Nothing where y = floor ((fromIntegral x)**(1 / 3)) -- Nota. La definición anterior falla para números grandes. Por ejemplo, -- λ> raizCubicaEntera4 (2^30) -- Nothing -- λ> raizCubicaEntera (2^30) -- Just 1024 -- Equivalencia -- ============ -- La propiedad es prop_raizCubicaEntera :: Integer -> Property prop_raizCubicaEntera x = x >= 0 ==> and [raizCubicaEntera x == f x | f <- [ raizCubicaEntera2 , raizCubicaEntera3]] -- La comprobación es -- λ> quickCheck prop_raizCubicaEntera -- +++ OK, passed 100 tests. -- Comparación de eficiencia -- ========================= -- λ> raizCubicaEntera (10^18) -- Just 1000000 -- (1.80 secs, 1,496,137,192 bytes) -- λ> raizCubicaEntera2 (10^18) -- Just 1000000 -- (0.71 secs, 712,134,128 bytes) -- λ> raizCubicaEntera3 (10^18) -- Just 1000000 -- (0.01 secs, 196,424 bytes) -- -- λ> raizCubicaEntera2 (5^27) -- Just 1953125 -- (1.42 secs, 1,390,760,920 bytes) -- λ> raizCubicaEntera3 (5^27) -- Just 1953125 -- (0.00 secs, 195,888 bytes) -- -- λ> raizCubicaEntera3 (10^9000) == Just (10^3000) -- True -- (2.05 secs, 420,941,368 bytes) -- λ> raizCubicaEntera3 (5 + 10^9000) == Nothing -- True -- (2.08 secs, 420,957,576 bytes) |
Pensamiento
Tras el vivir y el soñar,
está lo que más importa:
despertar.Antonio Machado
3 Comentarios