{"id":7752,"date":"2022-06-25T08:53:36","date_gmt":"2022-06-25T06:53:36","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=7752"},"modified":"2022-06-25T08:53:36","modified_gmt":"2022-06-25T06:53:36","slug":"pfh-la-semana-en-exercitium-25-de-junio-de-2022","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/pfh-la-semana-en-exercitium-25-de-junio-de-2022\/","title":{"rendered":"PFH: La semana en Exercitium (25 de junio de 2022)"},"content":{"rendered":"<p>Esta semana he publicado en <a href=\"http:\/\/bit.ly\/2sqPtGs\">Exercitium<\/a> las soluciones de los siguientes problemas:<\/p>\n<ul>\n<li><a href=\"#ej1\">1. Menor n\u00famero con una cantidad dada de divisores<\/a><\/li>\n<li><a href=\"#ej2\">2. C\u00e1lculo aproximado de integrales definidas<\/a><\/li>\n<li><a href=\"#ej3\">3. C\u00e1lculo de la suma 1<em>1! + 2<\/em>2! + 3<em>3! + &#8230; + n<\/em>n!<\/a><\/li>\n<li><a href=\"#ej4\">4. N\u00fameros para los que mcm(1,2,&#8230;n-1) = mcm(1,2,&#8230;,n)<\/a><\/li>\n<li><a href=\"#ej5\">5. M\u00e9todo de bisecci\u00f3n para aproximar ra\u00edces de funciones<\/a><\/li>\n<\/ul>\n<p>A continuaci\u00f3n se muestran las soluciones.<br \/>\n<!--more--><br \/>\n<a name=\"ej1\"><\/a><\/p>\n<h3>1. Menor n\u00famero con una cantidad dada de divisores<\/h3>\n<p>El menor n\u00famero con 2 divisores es el 2, ya que tiene 2 divisores (el 1 y el 2) y el anterior al 2 (el 1) s\u00f3lo tiene 1 divisor (el 1).<\/p>\n<p>El menor n\u00famero con 4 divisores es el 6, ya que tiene 4 divisores (el 1, 2, 3 y 6) y sus anteriores (el 1, 2, 3, 4 y 5) tienen menos de 4 divisores (tienen 1, 1, 1, 3 y 1, respectivamente).<\/p>\n<p>El menor n\u00famero con 8 divisores es el 24, ya que tiene 8 divisores (el 1, 2, 3, 4, 6, 8, 12 y 24) y sus anteriores (del 1 al 23) tienen menos de 8 divisores.<\/p>\n<p>El menor n\u00famero con 16 divisores es el 120, ya que tiene 16 divisores (el 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60 y 120) y sus anteriores (del 1 al 119) tienen menos de 16 divisores.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   menor :: Integer -> Integer\n<\/pre>\n<p>tal que <code>(menor n)<\/code> es el menor n\u00famero con 2^n divisores. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   menor 1  ==  2\n   menor 2  ==  6\n   menor 3  ==  24\n   menor 4  ==  120\n   length (show (menor (4*10^4)))  ==  207945\n<\/pre>\n<p>Comprobar con QuickCheck que, para todo k >=0, (menor (2^k)) es un divisor de (menor (2^(k+1))).<\/p>\n<p><strong>Nota<\/strong>: Este ejercicio est\u00e1 basado en el <a href=\"https:\/\/bit.ly\/2LhS0w8\">problema N1<\/a> de la Olimp\u00edada Internacional de Matem\u00e1ticas (IMO) del 2011.<\/p>\n<p><!--more--><\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List           (genericLength, genericTake, group)\nimport Data.Numbers.Primes (primeFactors, primes)\nimport Test.QuickCheck     (Positive (Positive), maxSize, stdArgs,\n                            quickCheck, quickCheckWith)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nmenor1 :: Integer -> Integer\nmenor1 n =\n  head [x | x <- [1..], numeroDivisores x == 2^n]\n\n-- (numeroDivisores n) es el n\u00famero de divisores de n. Por ejemplo, \n--    numeroDivisores 12  ==  6\nnumeroDivisores :: Integer -> Integer\nnumeroDivisores =\n  genericLength . divisores\n\n-- (divisores x) es la lista de los divisores de x. Por ejemplo,\n--    divisores 12  ==  [1,3,2,6,4,12]\n--    divisores 25  ==  [1,5,25]\ndivisores :: Integer -> [Integer]\ndivisores n =\n  [x | x <- [1..n], n `rem` x == 0]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nmenor2 :: Integer -> Integer\nmenor2 n =\n  head [x | x <- [1..], numeroDivisores2 x == 2^n]\n\nnumeroDivisores2 :: Integer -> Integer\nnumeroDivisores2 =\n  product . map ((+1) . genericLength) . group . primeFactors\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nmenor3 :: Integer -> Integer\nmenor3 n = product (genericTake n potencias)\n\n-- potencias es la sucesi\u00f3n de las potencias de la forma p^(2^k),\n-- donde p es un n\u00famero primo y k es un n\u00famero natural, ordenadas de\n-- menor a mayor. Por ejemplo,\n--    take 14 potencias    ==  [2,3,4,5,7,9,11,13,16,17,19,23,25,29]\npotencias :: [Integer]\npotencias = 2 : mezcla (tail primes) (map (^2) potencias)\n\n-- (mezcla xs ys) es la lista obtenida mezclando las dos listas xs e ys,\n-- que se suponen ordenadas y disjuntas. Por ejemplo,\n--    \u03bb> take 15 (mezcla [2^n | n <- [1..]] [3^n | n <- [1..]])\n--    [2,3,4,8,9,16,27,32,64,81,128,243,256,512,729]\nmezcla :: Ord a => [a] -> [a] -> [a]\nmezcla (x:xs) (y:ys) | x < y = x : mezcla xs (y:ys)\n                     | x > y = y : mezcla (x:xs) ys\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_menor :: Positive Integer -> Bool\nprop_menor (Positive n) =\n  all (== menor1 n)\n      [menor2 n,\n       menor3 n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheckWith (stdArgs {maxSize=5}) prop_menor\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--   \u03bb> menor 8\n--   1081080\n--   (47.69 secs, 94,764,856,352 bytes)\n--   \u03bb> menor2 8\n--   1081080\n--   (36.17 secs, 94,764,856,368 bytes)\n--   \u03bb> menor3 8\n--   1081080\n--   (0.00 secs, 116,960 bytes)\n\n-- Definici\u00f3n de menor\n-- ===================\n\n-- En lo que sigue, usaremos menor3 como menor.\nmenor :: Integer -> Integer\nmenor = menor3\n\n-- Propiedad\n-- =========\n\n-- La propiedad es\nprop_menor_divide :: Positive Integer -> Bool\nprop_menor_divide (Positive n) =\n  menor (n+1) `mod` menor n == 0\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_menor_divide\n--    +++ OK, passed 100 tests.\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Menor_numero_con_una_cantidad_dada_de_divisores.hs\">GitHub<\/a>.<\/p>\n<p><a name=\"ej2\"><\/a><\/p>\n<h3>2. C\u00e1lculo aproximado de integrales definidas<\/h3>\n<p>La integral definida de una funci\u00f3n f entre los l\u00edmites a y b puede calcularse mediante la <a href=\"http:\/\/bit.ly\/1FDhZ1z\">regla del rect\u00e1ngulo<\/a> usando la f\u00f3rmula<\/p>\n<pre lang=\"text\">\n   h * (f(a+h\/2) + f(a+h+h\/2) + f(a+2h+h\/2) + ... + f(a+n*h+h\/2))\n<\/pre>\n<p>con <code>a+n*h+h\/2 &lt;= b &lt; a+(n+1)*h+h\/2<\/code> y usando valores peque\u00f1os para <code>h<\/code>.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   integral :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\n<\/pre>\n<p>tal que <code>(integral a b f h)<\/code> es el valor de dicha expresi\u00f3n. Por ejemplo, el c\u00e1lculo de la integral de <code>f(x) = x^3<\/code> entre <code>0<\/code> y <code>1<\/code>, con paso <code>0.01<\/code>, es<\/p>\n<pre lang=\"text\">\n   integral 0 1 (^3) 0.01  ==  0.24998750000000042\n<\/pre>\n<p>Otros ejemplos son<\/p>\n<pre lang=\"text\">\n   integral 0 1 (^4) 0.01                   ==  0.19998333362500048\n   integral 0 1 (\\x -> 3*x^2 + 4*x^3) 0.01  ==  1.9999250000000026\n   log 2 - integral 1 2 (\\x -> 1\/x) 0.01         ==  3.124931644782336e-6\n   pi - 4 * integral 0 1 (\\x -> 1\/(x^2+1)) 0.01  ==  -8.333333331389525e-6\n<\/pre>\n<p><!--more--><\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck.HigherOrder (quickCheck')\nimport Test.QuickCheck (Property, (==>), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nintegral1 :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\nintegral1 a b f h\n  | a+h\/2 > b = 0\n  | otherwise = h * f (a+h\/2) + integral1 (a+h) b f h\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nintegral2 :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\nintegral2 a b f h = aux a where\n  aux x | x+h\/2 > b = 0\n        | otherwise = h * f (x+h\/2) + aux (x+h)\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nintegral3 :: (Fractional a, Ord a) => a -> a -> (a -> a) -> a -> a\nintegral3 a b f h = h * suma (a+h\/2) b (+h) f\n\n-- (suma a b s f) es l valor de\n--    f(a) + f(s(a)) + f(s(s(a)) + ... + f(s(...(s(a))...))\n-- hasta que s(s(...(s(a))...)) > b. Por ejemplo,\n--    suma 2 5 (1+) (^3)  ==  224\nsuma :: (Ord t, Num a) => t -> t -> (t -> t) -> (t -> a) -> a\nsuma a b s f = sum [f x | x <- sucesion a b s]\n\n-- (sucesion x y s) es la lista\n--    [a, s(a), s(s(a), ..., s(...(s(a))...)]\n-- hasta que s(s(...(s(a))...)) > b. Por ejemplo,\n--    sucesion 3 20 (+2)  ==  [3,5,7,9,11,13,15,17,19]\nsucesion :: Ord a => a -> a -> (a -> a) -> [a]\nsucesion a b s = takeWhile (<=b) (iterate s a)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_integral :: Int -> Int -> (Int -> Int) -> Int -> Property\nprop_integral a b f h =\n  a < b &#038;&#038; h > 0 ==> \n  all (=~ integral1 a' b' f' h')\n      [integral2 a' b' f' h',\n       integral3 a' b' f' h']\n  where\n    a' = fromIntegral a\n    b' = fromIntegral b\n    h' = fromIntegral h\n    f' = fromIntegral . f. round\n    x =~ y = abs (x - y) < 0.001\n        \n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck' prop_integral\n--    +++ OK, passed 100 tests; 385 discarded.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> integral1 0 10 (^3) 0.00001\n--    2499.999999881125\n--    (2.63 secs, 1,491,006,744 bytes)\n--    \u03bb> integral2 0 10 (^3) 0.00001\n--    2499.999999881125\n--    (1.93 secs, 1,419,006,696 bytes)\n--    \u03bb> integral3 0 10 (^3) 0.00001\n--    2499.9999998811422\n--    (1.28 secs, 817,772,216 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Calculo_aproximado_de_integrales_definidas.hs\">GitHub<\/a>.<\/p>\n<p><a name=\"ej3\"><\/a><\/p>\n<h3>3. C\u00e1lculo de la suma 1<em>1! + 2<\/em>2! + 3<em>3! + &#8230; + n<\/em>n!<\/h3>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   suma :: Integer -> Integer\n<\/pre>\n<p>tal que <code>(suma n)<\/code> es la suma <code>1\u00b71! + 2\u00b72! + 3\u00b73! + ... + n\u00b7n!<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   suma 1  ==  1\n   suma 2  ==  5\n   suma 3  ==  23\n   suma 4  ==  119\n   suma 5  ==  719\n   take 9 (show (suma 70000))  ==  \"823780458\"\n<\/pre>\n<p><!--more--><\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck (Positive (Positive), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nsuma1 :: Integer -> Integer\nsuma1 n = sum [k * factorial k | k <- [1..n]]\n\nfactorial :: Integer -> Integer\nfactorial n = product [1..n]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nsuma2 :: Integer -> Integer\nsuma2 n = sum (zipWith (*) [1..n] factoriales)\n\nfactoriales :: [Integer]\nfactoriales = scanl (*) 1 [2..]\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\n-- Basada en los siguientes c\u00e1lculos\n--    \u03bb> [suma1 n | n <- [0..10]]\n--    [0,1,5,23,119,719,5039,40319,362879,3628799,39916799]\n--    \u03bb> [factorial n | n <- [0..10]]\n--    [1,1,2,6,24,120,720,5040,40320,362880,3628800]\n--    \u03bb> [factorial n | n <- [1..11]]\n--    [1,2,6,24,120,720,5040,40320,362880,3628800,39916800]\n--    \u03bb> [factorial n - 1 | n <- [1..11]]\n--    [0,1,5,23,119,719,5039,40319,362879,3628799,39916799]\n\nsuma3 :: Integer -> Integer\nsuma3 n = factorial (n+1) - 1\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_suma :: Positive Integer -> Bool\nprop_suma (Positive n) =\n  all (== suma1 n)\n      [suma2 n,\n       suma3 n]\n  \n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_suma\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> take 5 (show (suma1 4000))\n--    \"73170\"\n--    (5.04 secs, 16,225,195,448 bytes)\n--    \u03bb> take 5 (show (suma2 4000))\n--    \"73170\"\n--    (0.08 secs, 35,862,152 bytes)\n--    \u03bb> take 5 (show (suma3 4000))\n--    \"73170\"\n--    (0.01 secs, 12,896,968 bytes)\n--    \n--    \n--    \u03bb> take 5 (show (suma2 40000))\n--    \"83669\"\n--    (1.82 secs, 4,549,612,264 bytes)\n--    \u03bb> take 5 (show (suma3 40000))\n--    \"83669\"\n--    (0.24 secs, 1,620,976,984 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Calculo_de_la_suma_de_productos_de_numeros_por_factoriales.hs\">GitHub<\/a>.<\/p>\n<p><a name=\"ej4\"><\/a><\/p>\n<h3>4. N\u00fameros para los que mcm(1,2,&#8230;n-1) = mcm(1,2,&#8230;,n)<\/h3>\n<p>Un n\u00famero n es especial si mcm(1,2,&#8230;,n-1) = mcm(1,2,&#8230;,n). Por ejemplo, el 6 es especial ya que<\/p>\n<pre lang=\"text\">\n   mcm(1,2,3,4,5) = 60 = mcm(1,2,3,4,5,6)\n<\/pre>\n<p>Definir la sucesi\u00f3n<\/p>\n<pre lang=\"text\">\n   especiales :: [Integer]\n<\/pre>\n<p>cuyos t\u00e9rminos son los n\u00fameros especiales. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   take 10 especiales     ==  [1,6,10,12,14,15,18,20,21,22]\n   especiales !! 50       ==  84\n   especiales !! 500      ==  638\n   especiales !! 5000     ==  5806\n   especiales !! 50000    ==  55746\n<\/pre>\n<p><!--more--><\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck (NonNegative(NonNegative), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nespeciales1 :: [Integer]\nespeciales1 = filter especial1 [1..]\n\nespecial1 :: Integer -> Bool\nespecial1 n = mcm1 [1..n-1] == mcm1 [1..n]\n\nmcm1 :: [Integer] -> Integer\nmcm1 []     = 1\nmcm1 (x:xs) = lcm x (mcm1 xs)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nespeciales2 :: [Integer]\nespeciales2 = filter especial2 [1..]\n\nespecial2 :: Integer -> Bool\nespecial2 n = mcm2 [1..n-1] == mcm2 [1..n]\n\nmcm2 :: [Integer] -> Integer\nmcm2 = foldr lcm 1\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nespeciales3 :: [Integer]\nespeciales3 = [n | ((n,x),(_,y)) <- zip mcms (tail mcms)\n                 , x == y]\n\nmcms :: [(Integer,Integer)]\nmcms = zip [1..] (scanl lcm 1 [1..])\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_especiales :: NonNegative Int -> Bool\nprop_especiales (NonNegative n) =\n  all (== especiales1 !! n)\n      [especiales2 !! n,\n       especiales3 !! n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_especiales\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n\n-- Comparaci\u00f3n \n--    \u03bb> especiales1 !! 2000\n--    2390\n--    (3.38 secs, 4,724,497,192 bytes)\n--    \u03bb> especiales2 !! 2000\n--    2390\n--    (1.91 secs, 4,303,415,512 bytes)\n--    \u03bb> especiales3 !! 2000\n--    2390\n--    (0.01 secs, 4,209,664 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Numeros_para_los_que_mcm.hs\">GitHub<\/a>.<\/p>\n<p><a name=\"ej5\"><\/a><\/p>\n<h3>5. M\u00e9todo de bisecci\u00f3n para aproximar ra\u00edces de funciones<\/h3>\n<p>El m\u00e9todo de bisecci\u00f3n para calcular un cero de una funci\u00f3n en el intervalo [a,b] se basa en el teorema de Bolzano:<\/p>\n<blockquote><p>\n&#8220;Si f(x) es una funci\u00f3n continua en el intervalo [a, b], y si, adem\u00e1s, en los extremos del intervalo la funci\u00f3n f(x) toma valores de signo opuesto (f(a) * f(b) < 0), entonces existe al menos un valor c en (a, b) para el que f(c) = 0\".\n<\/p><\/blockquote>\n<p>El m\u00e9todo para calcular un cero de la funci\u00f3n f en el intervalo [a,b] con un error menor que e consiste en tomar el punto medio del intervalo c = (a+b)\/2 y considerar los siguientes casos:<\/p>\n<ul>\n<li>Si |f(c)| &lt; e, hemos encontrado una aproximaci\u00f3n del punto que anula f en el intervalo con un error aceptable.<\/li>\n<li>Si f(c) tiene signo distinto de f(a), repetir el proceso en el intervalo [a,c].<\/li>\n<li>Si no, repetir el proceso en el intervalo [c,b].<\/li>\n<\/ul>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   biseccion :: (Double -> Double) -> Double -> Double -> Double -> Double\n<\/pre>\n<p>tal que <code>(biseccion f a b e)<\/code> es una aproximaci\u00f3n del punto del intervalo <code>[a,b]<\/code> en el que se anula la funci\u00f3n <code>f<\/code>, con un error menor que <code>e<\/code>, calculada mediante el m\u00e9todo de la bisecci\u00f3n. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   biseccion (\\x -> x^2 - 3) 0 5 0.01             ==  1.7333984375\n   biseccion (\\x -> x^3 - x - 2) 0 4 0.01         ==  1.521484375\n   biseccion cos 0 2 0.01                         ==  1.5625\n   biseccion (\\x -> log (50-x) - 4) (-10) 3 0.01  ==  -5.125\n<\/pre>\n<p><!--more--><\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck (Arbitrary, Gen, Property, (==>), arbitrary, choose, sized, quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nbiseccion1 :: (Double -> Double) -> Double -> Double -> Double -> Double\nbiseccion1 f a b e  \n    | abs (f c) < e = c\n    | f a * f c < 0 = biseccion1 f a c e\n    | otherwise     = biseccion1 f c b e\n    where c = (a+b)\/2\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nbiseccion2 :: (Double -> Double) -> Double -> Double -> Double -> Double\nbiseccion2 f a b e = aux a b\n  where aux a' b' | abs (f c) < e = c\n                  | f a' * f c < 0 = aux a' c \n                  | otherwise     = aux c b'\n          where c = (a'+b')\/2\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\nnewtype Polinomio = P [Int]\n  deriving Show\n\nvalorPolinomio :: Polinomio -> Double -> Double\nvalorPolinomio (P cs) x =\n  sum [fromIntegral c * x^n | (c,n) <- zip cs [0..]]\n\npolinomioArbitrario :: Int -> Gen Polinomio\npolinomioArbitrario 0 = return (P [])\npolinomioArbitrario n = do\n  c <- choose (-10,10)\n  (P xs) <- polinomioArbitrario (n `div` 2)\n  return (P (c:xs))\n\ninstance Arbitrary Polinomio where\n  arbitrary = sized polinomioArbitrario\n\n-- La propiedad es\nprop_biseccion :: Polinomio -> Double -> Double -> Double -> Property\nprop_biseccion p a b e =\n  f a * f b < 0 &#038;&#038; e > 0 ==>\n  biseccion1 f a b e =~ biseccion2 f a b e\n  where\n    f = valorPolinomio p \n    x =~ y = abs (x - y) < 0.001\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheckWith (stdArgs {maxDiscardRatio=30}) prop_biseccion\n--    +++ OK, passed 100 tests; 2156 discarded.\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Metodo_de_biseccion_para_aproximar_raices_de_funciones.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta semana he publicado en Exercitium las soluciones de los siguientes problemas: 1. Menor n\u00famero con una cantidad dada de divisores 2. C\u00e1lculo aproximado de integrales definidas 3. C\u00e1lculo de la suma 11! + 22! + 33! + &#8230; + nn! 4. N\u00fameros para los que mcm(1,2,&#8230;n-1) = mcm(1,2,&#8230;,n) 5. M\u00e9todo de bisecci\u00f3n para aproximar&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[337],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7752"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=7752"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7752\/revisions"}],"predecessor-version":[{"id":7753,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/7752\/revisions\/7753"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=7752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=7752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=7752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}