{"id":1784,"date":"2015-12-02T06:00:01","date_gmt":"2015-12-02T04:00:01","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1784"},"modified":"2016-05-01T19:22:35","modified_gmt":"2016-05-01T17:22:35","slug":"raices-enteras-de-los-numeros-primos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/raices-enteras-de-los-numeros-primos\/","title":{"rendered":"Ra\u00edces enteras de los n\u00fameros primos"},"content":{"rendered":"<p>Definir la sucesi\u00f3n<\/p>\n<pre lang=\"text\">\n   raicesEnterasDePrimos :: [Integer]\n<\/pre>\n<p>cuyos elementos son las partes enteras de las ra\u00edces cuadradas de los n\u00fameros primos. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 30 raicesEnterasDePrimos\n   [1,1,2,2,3,3,4,4,4,5,5,6,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10,10]\n   \u03bb> raicesEnterasDePrimos !!  9963\n   322\n   \u03bb> raicesEnterasDePrimos !!  9964\n   323\n<\/pre>\n<p>Comprobar con QuickCheck que la diferencia entre dos t\u00e9rminos consecutivos de la sucesi\u00f3n es como m\u00e1ximo igual a 1.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes (primes)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nraicesEnterasDePrimos1 :: [Integer]\nraicesEnterasDePrimos1 = map raizEntera primes\n\n-- (raizEntera x) es la parte entera de la ra\u00edz cuadrada de x. Por\n-- ejemplo,\n--    raizEntera  8  ==  2\n--    raizEntera  9  ==  3\n--    raizEntera 10  ==  3\nraizEntera :: Integer -> Integer\nraizEntera = floor . sqrt . fromIntegral \n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nraicesEnterasDePrimos2 :: [Integer]\nraicesEnterasDePrimos2 = map raizEntera2 primes\n\nraizEntera2 :: Integer -> Integer\nraizEntera2 n = aux 1\n    where aux k | k*k > n   = k-1\n                | otherwise = aux (k+1)\n\n-- 3\u00ba soluci\u00f3n\n-- ===========\n\nraicesEnterasDePrimos3 :: [Integer]\nraicesEnterasDePrimos3 = aux primes [1..]\n    where aux (p:ps) (x:xs) | p > x*x   = aux (p:ps) xs\n                            | otherwise = (x-1) : aux ps (x:xs)\n\n\n-- Comparaci\u00f3n de eficiencia\n--    ghci> raicesEnterasDePrimos1 !! 400000\n--    2408\n--    (2.86 secs, 1177922500 bytes)\n--    ghci> raicesEnterasDePrimos2 !! 400000\n--    2408\n--    (3.08 secs, 1177432260 bytes)\n--    ghci> raicesEnterasDePrimos3 !! 400000\n--    2408\n--    (3.88 secs, 1260772112 bytes)\n\n-- En lo sucesivo usaremos la 1\u00aa definici\u00f3n\nraicesEnterasDePrimos :: [Integer]\nraicesEnterasDePrimos = raicesEnterasDePrimos3\n\n-- La propiedad es\nprop_raicesEnterasDePrimos :: Int -> Property\nprop_raicesEnterasDePrimos n =\n    n >= 0 ==> \n    raicesEnterasDePrimos !! (n+1) - raicesEnterasDePrimos !! n <= 1\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_raicesEnterasDePrimos\n--    +++ OK, passed 100 tests.\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir la sucesi\u00f3n raicesEnterasDePrimos :: [Integer] cuyos elementos son las partes enteras de las ra\u00edces cuadradas de los n\u00fameros primos. Por ejemplo, \u03bb> take 30 raicesEnterasDePrimos [1,1,2,2,3,3,4,4,4,5,5,6,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,10,10] \u03bb> raicesEnterasDePrimos !! 9963 322 \u03bb> raicesEnterasDePrimos !! 9964 323 Comprobar con QuickCheck que la diferencia entre dos t\u00e9rminos consecutivos de la sucesi\u00f3n es como m\u00e1ximo igual a&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","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":[4],"tags":[282,183,10,11,173,6,236],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1784"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=1784"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1784\/revisions"}],"predecessor-version":[{"id":1839,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1784\/revisions\/1839"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}