{"id":3362,"date":"2017-11-03T08:34:46","date_gmt":"2017-11-03T06:34:46","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3362"},"modified":"2021-04-25T17:02:55","modified_gmt":"2021-04-25T15:02:55","slug":"numeros-libres-de-cuadrados-2017","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-libres-de-cuadrados-2017\/","title":{"rendered":"N\u00fameros libres de cuadrados"},"content":{"rendered":"<p>Un n\u00famero entero positivo es libre de cuadrados si no es divisible el cuadrado de ning\u00fan entero mayor que 1. Por ejemplo, 70 es libre de cuadrado porque s\u00f3lo es divisible por 1, 2, 5, 7 y 70; en cambio, 40 no es libre de cuadrados porque es divisible por 2^2.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   libreDeCuadrados :: Integer -> Bool\n<\/pre>\n<p>tal que (libreDeCuadrados x) se verifica si x es libre de cuadrados.  Por ejemplo,<\/p>\n<pre lang=\"text\">\n   libreDeCuadrados 70                    ==  True\n   libreDeCuadrados 40                    ==  False\n   libreDeCuadrados 510510                ==  True\n   libreDeCuadrados (((10^10)^10)^10)     ==  False\n<\/pre>\n<p>Otro ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> filter (not . libreDeCuadrados) [1..50]\n   [4,8,9,12,16,18,20,24,25,27,28,32,36,40,44,45,48,49,50]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes (primeFactors, primes)\nimport Data.List (nub)\nimport Test.QuickCheck\n\nimport Data.List (genericLength) -- Para OS\n\n-- 1\u00aa definici\u00f3n:\nlibreDeCuadrados :: Integer -> Bool\nlibreDeCuadrados x = x == product (divisoresPrimos x)\n\n-- (divisoresPrimos x) es la lista de los divisores primos de x. Por\n-- ejemplo,  \n--    divisoresPrimos 40  ==  [2,5]\n--    divisoresPrimos 70  ==  [2,5,7]\ndivisoresPrimos :: Integer -> [Integer]\ndivisoresPrimos x = [n | n <- divisores x, primo n]\n\n-- (divisores n) es la lista de los divisores del n\u00famero n. Por ejemplo,\n--    divisores 30  ==  [1,2,3,5,6,10,15,30]  \ndivisores :: Integer -> [Integer]\ndivisores n = [x | x <- [1..n], n `mod` x == 0]\n\n-- (primo n) se verifica si n es primo. Por ejemplo,\n--    primo 30  == False\n--    primo 31  == True  \nprimo :: Integer -> Bool\nprimo n = divisores n == [1, n]\n\n-- 2\u00aa definici\u00f3n\nlibreDeCuadrados2 :: Integer -> Bool\nlibreDeCuadrados2 n = \n    null [x | x <- [2..n], rem n (x^2) == 0]\n\n-- 3\u00aa definici\u00f3n\nlibreDeCuadrados3 :: Integer -> Bool\nlibreDeCuadrados3 n = \n    null [x | x <- [2..floor (sqrt (fromIntegral n))], \n              rem n (x^2) == 0]\n\n-- 4\u00aa definici\u00f3n\nlibreDeCuadrados4 :: Integer -> Bool\nlibreDeCuadrados4 n = \n  xs == nub xs\n  where xs = primeFactors n\n\n-- 5\u00aa definici\u00f3n\nlibreDeCuadrados5 :: Integer -> Bool\nlibreDeCuadrados5 n = \n  all (\\(x,y) -> x \/= y) (zip xs (tail xs))\n  where xs = primeFactors n\n\n-- Equivalencia de las definiciones\n-- ================================\n\nprop_equivalencia :: Integer -> Property\nprop_equivalencia n =\n  n > 0 ==>\n  all (== libreDeCuadrados n)\n      [f n | f <- [ libreDeCuadrados2\n                  , libreDeCuadrados3\n                  , libreDeCuadrados4\n                  , libreDeCuadrados5\n                  ]]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_equivalencia\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> libreDeCuadrados 510510\n--    True\n--    (0.76 secs, 89,522,360 bytes)\n--    \u03bb> libreDeCuadrados2 510510\n--    True\n--    (1.78 secs, 371,826,320 bytes)\n--    \u03bb> libreDeCuadrados3 510510\n--    True\n--    (0.01 secs, 0 bytes)\n--    \u03bb> libreDeCuadrados4 510510\n--    True\n--    (0.00 secs, 152,712 bytes)\n--\n--    \u03bb> filter libreDeCuadrados3 [1..] !! (2*10^4)\n--    32906\n--    (2.24 secs, 1,812,139,456 bytes)\n--    \u03bb> filter libreDeCuadrados4 [1..] !! (2*10^4)\n--    32906\n--    (0.51 secs, 936,216,664 bytes)\n--    \u03bb> filter libreDeCuadrados5 [1..] !! (2*10^4)\n--    32906\n--    (0.38 secs, 806,833,952 bytes)\n--\n--    \u03bb> filter libreDeCuadrados4 [1..] !! (10^5)\n--    164499\n--    (3.28 secs, 7,470,629,888 bytes)\n--    \u03bb> filter libreDeCuadrados5 [1..] !! (10^5)\n--    164499\n--    (2.88 secs, 6,390,072,384 bytes)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero entero positivo es libre de cuadrados si no es divisible el cuadrado de ning\u00fan entero mayor que 1. Por ejemplo, 70 es libre de cuadrado porque s\u00f3lo es divisible por 1, 2, 5, 7 y 70; en cambio, 40 no es libre de cuadrados porque es divisible por 2^2. Definir la funci\u00f3n libreDeCuadrados&#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":[5],"tags":[41,8,282,183,89,141,11,157,31,236,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3362"}],"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=3362"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3362\/revisions"}],"predecessor-version":[{"id":3401,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3362\/revisions\/3401"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}