Raíz entera
Definir la función
1 |
raizEnt :: Integer -> Integer -> Integer |
tal que (raizEnt x n) es la raíz entera n-ésima de x; es decir, el mayor número entero y tal que y^n <= x. Por ejemplo,
1 2 3 4 5 |
raizEnt 8 3 == 2 raizEnt 9 3 == 2 raizEnt 26 3 == 2 raizEnt 27 3 == 3 raizEnt (10^50) 2 == 10000000000000000000000000 |
Comprobar con QuickCheck que para todo número natural n,
1 |
raizEnt (10^(2*n)) 2 == 10^n |
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 |
import Test.QuickCheck -- 1ª definición raizEnt1 :: Integer -> Integer -> Integer raizEnt1 x n = last (takeWhile (\y -> y^n <= x) [0..]) -- 2ª definición raizEnt2 :: Integer -> Integer -> Integer raizEnt2 x n = floor ((fromIntegral x)**(1 / fromIntegral n)) -- Nota. La definición anterior falla para números grandes. Por ejemplo, -- λ> raizEnt2 (10^50) 2 == 10^25 -- False -- 3ª definición raizEnt3 :: Integer -> Integer -> Integer raizEnt3 x n = 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 -- Comparación de eficiencia -- λ> raizEnt1 (10^14) 2 -- 10000000 -- (6.15 secs, 6,539,367,976 bytes) -- λ> raizEnt2 (10^14) 2 -- 10000000 -- (0.00 secs, 0 bytes) -- λ> raizEnt3 (10^14) 2 -- 10000000 -- (0.00 secs, 25,871,944 bytes) -- -- λ> raizEnt2 (10^50) 2 -- 9999999999999998758486016 -- (0.00 secs, 0 bytes) -- λ> raizEnt3 (10^50) 2 -- 10000000000000000000000000 -- (0.00 secs, 0 bytes) -- La propiedad es prop_raizEnt :: Integer -> Bool prop_raizEnt n = raizEnt3 (10^(2*m)) 2 == 10^m where m = abs n -- La comprobación es -- λ> quickCheck prop_raizEnt -- +++ OK, passed 100 tests. |
Soluciones en Maxima
1 |
raizEnt (x,n) := inrt (x,n)$ |
Predefinida en Maxima: