<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Relaci%C3%B3n_10_Sol</id>
	<title>Relación 10 Sol - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?action=history&amp;feed=atom&amp;title=Relaci%C3%B3n_10_Sol"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;action=history"/>
	<updated>2026-07-18T21:05:52Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=514&amp;oldid=prev</id>
		<title>Mdelamor: Protegió «Relación 10 Sol» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=514&amp;oldid=prev"/>
		<updated>2021-12-08T08:41:33Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/WIKIS/I1M2021G2/index.php/Relaci%C3%B3n_10_Sol&quot; title=&quot;Relación 10 Sol&quot;&gt;Relación 10 Sol&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 08:41 8 dic 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=513&amp;oldid=prev</id>
		<title>Mdelamor: Página creada con «&lt;source lang=&#039;haskell&#039;&gt; -- I1M 2021-22: Relación 10 -- Propiedades del número 2021. -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ===…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/WIKIS/I1M2021G2/index.php?title=Relaci%C3%B3n_10_Sol&amp;diff=513&amp;oldid=prev"/>
		<updated>2021-12-08T08:41:25Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt; -- I1M 2021-22: Relación 10 -- Propiedades del número 2021. -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ===…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;#039;haskell&amp;#039;&amp;gt;&lt;br /&gt;
-- I1M 2021-22: Relación 10&lt;br /&gt;
-- Propiedades del número 2021.&lt;br /&gt;
-- Departamento de Ciencias de la Computación e I.A.&lt;br /&gt;
-- Universidad de Sevilla&lt;br /&gt;
-- =====================================================================&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Introducción                                                       --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- En esta relación se presentan ejercicios sobre propiedades del número&lt;br /&gt;
-- 2021.&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Librerías auxiliares                                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import Data.Numbers.Primes&lt;br /&gt;
import Data.List&lt;br /&gt;
import Test.QuickCheck&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.1. Consideramos todos los primos menores que 100:&lt;br /&gt;
--    2, 3, 5, 7, 11, ..., 89, 97&lt;br /&gt;
-- y formamos los correspondientes pares de dominó:&lt;br /&gt;
--    (2,3), (3,5), (5,7), ..., (83,89), (89,97).&lt;br /&gt;
-- La suma de los números en todos los pares es 2021.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumaDominoPrimos n) es la suma de los números de los pares&lt;br /&gt;
-- de dominó formada a partir de los primos menores que n. Por ejemplo,&lt;br /&gt;
--    sumaDominoPrimos 100 == 2021&lt;br /&gt;
--    sumaDominoPrimos 200 == 8253&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumaDominoPrimos :: Integer -&amp;gt; Integer&lt;br /&gt;
sumaDominoPrimos n = sum (zipWith (+) ps (tail ps))&lt;br /&gt;
  where ps = takeWhile (&amp;lt;=n) primes&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.2. Definir la constante&lt;br /&gt;
--   sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
-- tal que sucSumaDominoPrimos es la sucesión de los números que son&lt;br /&gt;
-- suma de pares de dominó formado con números primos. Por ejemplo,&lt;br /&gt;
--   λ&amp;gt; take 25 sucSumaDominoPrimos&lt;br /&gt;
--   [5,13,25,43,67,97,133,175,227,287,355,433,517,607,707,819,939,1067,&lt;br /&gt;
--    1205,1349,1501,1663,1835,2021,2219]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucSumaDominoPrimos :: [Integer]&lt;br /&gt;
sucSumaDominoPrimos = tail (map sumaDominoPrimos primes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1.3. Definir la sucesión&lt;br /&gt;
--   esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumaDominoPrimos n) se verifica si n es un número de la&lt;br /&gt;
-- sucesión anterior. Por ejemplo,&lt;br /&gt;
--  esSumaDominoPrimos 2021    == True&lt;br /&gt;
--  esSumaDominoPrimos 1234509 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSumaDominoPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumaDominoPrimos n = n == head (dropWhile (&amp;lt;n) sucSumaDominoPrimos)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.1. El número 2021 es la suma de 33 más la suma de los 33&lt;br /&gt;
-- primeros números primos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
-- tal que (sumSumaPrimos n) es la suma de n más los n primeros números&lt;br /&gt;
-- primos. Por ejemplo,&lt;br /&gt;
--   sumSumaPrimos 33 == 2021&lt;br /&gt;
--   sumSumaPrimos 52 == 5641&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sumSumaPrimos :: Int -&amp;gt; Integer&lt;br /&gt;
sumSumaPrimos n = fromIntegral n + sum (take n primes)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2.2. Definir la función&lt;br /&gt;
--    esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSumSumaPrimos n) se verifica si n es de la suma de m más&lt;br /&gt;
-- los m primeros primos, para algún entero m. Por ejemplo,&lt;br /&gt;
--    esSumSumaPrimos 2021       == True&lt;br /&gt;
--    esSumSumaPrimos 120        == False&lt;br /&gt;
--    esSumSumaPrimos 1234567893 == False&lt;br /&gt;
--    esSumSumaPrimos 774511387  == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos)&lt;br /&gt;
&lt;br /&gt;
-- sucSumSumaPrimos es la lista de los números de la forma m más la suma&lt;br /&gt;
-- de los m primeros primos. Por ejemplo,&lt;br /&gt;
--    take 18 sucSumSumaPrimos&lt;br /&gt;
--    [3,7,13,21,33,47,65,85,109,139,171,209,251,295,343,397,457,519]&lt;br /&gt;
sucSumSumaPrimos :: [Integer]&lt;br /&gt;
sucSumSumaPrimos = map sumSumaPrimos [1..]&lt;br /&gt;
&lt;br /&gt;
-- 2ª solución&lt;br /&gt;
-- ===========&lt;br /&gt;
&lt;br /&gt;
esSumSumaPrimos2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSumSumaPrimos2 n = n == head (dropWhile (&amp;lt;n) sucSumSumaPrimos2)&lt;br /&gt;
&lt;br /&gt;
sucSumSumaPrimos2 :: [Integer]&lt;br /&gt;
sucSumSumaPrimos2 = zipWith (+) [1..] (scanl1 (+) primes)&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia:&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos 123456789  == False&lt;br /&gt;
--    (11.60 secs, 34,680,466,648 bytes)&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos2 123456789 == False&lt;br /&gt;
--    (0.01 secs, 11,300,288 bytes)&lt;br /&gt;
--&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos 774511387  == True&lt;br /&gt;
--    (83.50 secs, 234,694,973,880 bytes)&lt;br /&gt;
--    λ&amp;gt; esSumSumaPrimos2 774511387 == True&lt;br /&gt;
--    (0.03 secs, 42,326,032 bytes)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3. Un número semiprimo es un número natural que es producto&lt;br /&gt;
-- de dos números primos no necesariamente distintos. Por ejemplo, 26 es&lt;br /&gt;
-- semiprimo (porque 26 = 2×13) y 49 también lo es (porque 49 = 7×7).&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esSemiprimo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    semiprimos  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esSemiprimo n) se verifica si n es semiprimo. Por ejemplo,&lt;br /&gt;
--      esSemiprimo 26          ==  True&lt;br /&gt;
--      esSemiprimo 49          ==  True&lt;br /&gt;
--      esSemiprimo 8           ==  False&lt;br /&gt;
--      esSemiprimo 2021        ==  True&lt;br /&gt;
--      esSemiprimo (21+10^14)  ==  True&lt;br /&gt;
-- + semiprimos es la sucesión de números semiprimos. Por ejemplo,&lt;br /&gt;
--      take 10 semiprimos   ==  [4,6,9,10,14,15,21,22,25,26]&lt;br /&gt;
--      semiprimos !! 580    ==  2021&lt;br /&gt;
--      semiprimos !! 10000  ==  40886&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
-- =============&lt;br /&gt;
&lt;br /&gt;
esSemiprimo1 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo1 n = any prop ps&lt;br /&gt;
  where ps = takeWhile (&amp;lt;= (n `div` 2)) primes&lt;br /&gt;
        prop q = r == 0 &amp;amp;&amp;amp; isPrime d&lt;br /&gt;
          where (d,r) = quotRem n q&lt;br /&gt;
&lt;br /&gt;
semiprimos1 :: [Integer]&lt;br /&gt;
semiprimos1 = filter esSemiprimo1 [4..]&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
-- =============&lt;br /&gt;
&lt;br /&gt;
esSemiprimo2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esSemiprimo2 n = length (primeFactors n) == 2&lt;br /&gt;
&lt;br /&gt;
semiprimos2 :: [Integer]&lt;br /&gt;
semiprimos2 = filter esSemiprimo2 [4..]&lt;br /&gt;
&lt;br /&gt;
-- Comparación de eficiencia&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
-- La comparación es&lt;br /&gt;
--    λ&amp;gt; semiprimos1 !! 1000  == 3599&lt;br /&gt;
--    (0.52 secs, 1,041,413,376 bytes)&lt;br /&gt;
--    λ&amp;gt; semiprimos2 !! 1000 == 3599&lt;br /&gt;
--    (0.04 secs, 51,977,912 bytes)&lt;br /&gt;
&lt;br /&gt;
-- Por tanto:&lt;br /&gt;
&lt;br /&gt;
esSemiprimo = esSemiprimo2&lt;br /&gt;
semiprimos  = semiprimos2&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4. Un número natural n es un número entero Blum si&lt;br /&gt;
-- n = p × q es un semiprimo para el que p y q son distintos primos&lt;br /&gt;
-- congruentes con 3 módulo 4. Es decir, p y q tienen que ser de la&lt;br /&gt;
-- forma 4 t + 3, para algún número entero t. Los números enteros de&lt;br /&gt;
-- esta forma se denominan números primos de Blum.  Los primeros enteros&lt;br /&gt;
-- de Blum son&lt;br /&gt;
--    21, 33, 57, 69, 77, 93, 129, 133, 141, 161, 177, ...&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBlum  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBlum n) se verifica si n es un número de Blum. Por ejemplo,&lt;br /&gt;
--      esBlum 26          ==  False&lt;br /&gt;
--      esBlum 49          ==  False&lt;br /&gt;
--      esBlum 77          ==  True&lt;br /&gt;
--      esBlum 2021        ==  True&lt;br /&gt;
--      esBlum (21+10^14)  ==  True&lt;br /&gt;
-- + sucBlum es la sucesión de números de Blum. Por ejemplo,&lt;br /&gt;
--      take 10 sucBlum  ==  [21,33,57,69,77,93,129,133,141,161]&lt;br /&gt;
--      sucBlum !! 132    ==  2021&lt;br /&gt;
--      sucBlum !! 10000  ==  186821&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBlum :: Integer -&amp;gt; Bool&lt;br /&gt;
esBlum n = length ps == 2 &amp;amp;&amp;amp; p /= q &amp;amp;&amp;amp; p `rem` 4 == 3 &amp;amp;&amp;amp; q `rem` 4 == 3&lt;br /&gt;
  where ps      = primeFactors n&lt;br /&gt;
        (p:q:_) = ps&lt;br /&gt;
&lt;br /&gt;
sucBlum  :: [Integer]&lt;br /&gt;
sucBlum = filter esBlum [4..]&lt;br /&gt;
&lt;br /&gt;
sucBlum2  :: [Integer]&lt;br /&gt;
sucBlum2 = filter esBlum semiprimos&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5. Un número semiprimo n = p x q es brillante si p y q&lt;br /&gt;
-- tienen el mismo número de dígitos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucBrillantes  :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esBrillante n) se verifica si n es brillante. Por ejemplo,&lt;br /&gt;
--      esBrillante 26          ==  False&lt;br /&gt;
--      esBrillante 49          ==  True&lt;br /&gt;
--      esBrillante 77          ==  False&lt;br /&gt;
--      esBrillante 2021        ==  True&lt;br /&gt;
--      esBrillante (21+10^14)  ==  False&lt;br /&gt;
-- + sucBrillantes es la sucesión de números brillantes. Por ejemplo,&lt;br /&gt;
--      take 10 sucBrillante   ==  [4,6,9,10,14,15,21,25,35,49]&lt;br /&gt;
--      sucBrillante !! 130    ==  2021&lt;br /&gt;
--      sucBrillante !! 10000  ==  696649&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esBrillante :: Integer -&amp;gt; Bool&lt;br /&gt;
esBrillante n = length ps == 2 &amp;amp;&amp;amp; length (show p) == length (show q)&lt;br /&gt;
  where ps = primeFactors n&lt;br /&gt;
        p = head ps&lt;br /&gt;
        q = head (tail ps)&lt;br /&gt;
&lt;br /&gt;
sucBrillante  :: [Integer]&lt;br /&gt;
sucBrillante = filter esBrillante [4..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.1. Un número natural es amable si se puede expresar como&lt;br /&gt;
-- suma de, al menos, dos números naturales consecutivos. Por ejemplo,&lt;br /&gt;
-- 2021 es amable pues&lt;br /&gt;
--    2021 = 20 + 21 + ... + 65 + 66.&lt;br /&gt;
-- La mayoría de los números naturales son amables, por lo que vamos a&lt;br /&gt;
-- calcular la lista de los números no amables.&lt;br /&gt;
--&lt;br /&gt;
-- Los primeros números no amables son&lt;br /&gt;
--    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192,&lt;br /&gt;
--    16384, 32768, 65536, 131072, 262144&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--   sucesionesConSuma :: Int -&amp;gt; [(Int,Int)]&lt;br /&gt;
-- tal que (sucesionesConSuma n) es la lista de los pares formados por&lt;br /&gt;
-- el primero y por el último elemento de las sucesiones de números&lt;br /&gt;
-- naturales consecutivos con suma n. Por ejemplo,&lt;br /&gt;
--    sucesionesConSuma 15             == [(1,5),(4,6),(7,8)]&lt;br /&gt;
--    sucesionesConSuma 2021           == [(20,66),(26,68),(1010,1011)]&lt;br /&gt;
--    length (sucesionesConSuma 2021)  == 3&lt;br /&gt;
--    length (sucesionesConSuma 3000)  == 7&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucesionesConSuma :: Integer -&amp;gt; [(Integer,Integer)]&lt;br /&gt;
sucesionesConSuma n =&lt;br /&gt;
    [(x,y) | y &amp;lt;- [1..1 + n `div` 2]&lt;br /&gt;
           , x &amp;lt;- [1..y-1]&lt;br /&gt;
           , (x+y)*(y-x+1) == 2*n]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.2. Definir las funciones&lt;br /&gt;
--    noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
--    sucNoAmables :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (noAmable n) se verifica si n es un número no amable. Por ejemplo,&lt;br /&gt;
--    noAmable 2021 == False&lt;br /&gt;
--    noAmable 1024 == True&lt;br /&gt;
-- + sucNoAmables es la lista de números naturales no amables. Por&lt;br /&gt;
--   ejemplo,&lt;br /&gt;
--    take 10 sucNoAmables == [1,2,4,8,16,32,64,128,256,512]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
noAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
noAmable n = null (sucesionesConSuma n)&lt;br /&gt;
&lt;br /&gt;
sucNoAmables :: [Integer]&lt;br /&gt;
sucNoAmables = filter noAmable [1..]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6.3. Comprobar con QuickCheck que un número natural es no&lt;br /&gt;
-- amable si y sólo si es potencia de 2.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propNoAmable :: Integer -&amp;gt; Bool&lt;br /&gt;
propNoAmable n = noAmable m == esPotencia2 m&lt;br /&gt;
  where m = 1 + abs n&lt;br /&gt;
&lt;br /&gt;
-- (esPotencia2 n) se verifica si n es potencia de 2. Por ejemplo,&lt;br /&gt;
--    esPotencia2 16 == True&lt;br /&gt;
--    esPotencia2 18 == False&lt;br /&gt;
esPotencia2 :: Integer -&amp;gt; Bool&lt;br /&gt;
esPotencia2 0 = False&lt;br /&gt;
esPotencia2 1 = True&lt;br /&gt;
esPotencia2 n = even n &amp;amp;&amp;amp; esPotencia2 (n `div` 2)&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propNoAmable&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.1. Un número natural se denomina aritmético si la media&lt;br /&gt;
-- aritmética de sus divisores es un número entero.&lt;br /&gt;
--&lt;br /&gt;
-- Definir la función&lt;br /&gt;
--    esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tal que (esAritmetico n) se verifica si n es un número aritmético.&lt;br /&gt;
-- Por ejemplo,&lt;br /&gt;
--    esAritmetico 2021 == True&lt;br /&gt;
--    esAritmetico 24   == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esAritmetico :: Integer -&amp;gt; Bool&lt;br /&gt;
esAritmetico n = sum ds `mod` genericLength ds == 0&lt;br /&gt;
  where ds = divisores n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- (divisores n) es la lista de los divisores de n. Por ejemplo,&lt;br /&gt;
--    divisores 2021 == [2021,1,43,47]&lt;br /&gt;
divisores :: Integer -&amp;gt; [Integer]&lt;br /&gt;
divisores n = n : [x | x &amp;lt;- [1.. n`div`2], n `rem` x == 0]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.2. Comprobar con QuickCheck que todos los primos excepto&lt;br /&gt;
-- el 2 son aritméticos.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
primosAritmeticos :: Int -&amp;gt; Bool&lt;br /&gt;
primosAritmeticos n = all esAritmetico (take n (tail primes))&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck primosAritmeticos&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7.3. Definir la función&lt;br /&gt;
--    sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
-- tal que (sucAritmeticosConsecutivos n) es una sucesión de n números&lt;br /&gt;
-- aritméticos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 5&lt;br /&gt;
--    [19,20,21,22,23]&lt;br /&gt;
--    λ&amp;gt; sucAritmeticosConsecutivos 20&lt;br /&gt;
--    [4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,&lt;br /&gt;
--     4968,4969,4970,4971,4972,4973,4974]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
sucAritmeticosConsecutivos :: Int -&amp;gt; [Integer]&lt;br /&gt;
sucAritmeticosConsecutivos n =&lt;br /&gt;
  head (filter consecutivos (segmentosLongitud n sucAritmeticos))&lt;br /&gt;
&lt;br /&gt;
-- sucAritmeticos es la sucesión de los números aritméticos. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    take 10 sucAritmeticos == [1,3,5,6,7,11,13,14,15,17]&lt;br /&gt;
sucAritmeticos :: [Integer]&lt;br /&gt;
sucAritmeticos = filter esAritmetico [1..]&lt;br /&gt;
&lt;br /&gt;
-- (segmentosLongitud n xs) es la sucesión de los segmentos de xs de&lt;br /&gt;
-- longitud n. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; segmentosLongitud 2 &amp;quot;Sevilla&amp;quot;&lt;br /&gt;
--    [&amp;quot;Se&amp;quot;,&amp;quot;ev&amp;quot;,&amp;quot;vi&amp;quot;,&amp;quot;il&amp;quot;,&amp;quot;ll&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;&amp;quot;]&lt;br /&gt;
--    λ&amp;gt; segmentosLongitud 3 &amp;quot;Sevilla&amp;quot;&lt;br /&gt;
--    [&amp;quot;Sev&amp;quot;,&amp;quot;evi&amp;quot;,&amp;quot;vil&amp;quot;,&amp;quot;ill&amp;quot;,&amp;quot;lla&amp;quot;,&amp;quot;la&amp;quot;,&amp;quot;a&amp;quot;,&amp;quot;&amp;quot;]&lt;br /&gt;
segmentosLongitud :: Int -&amp;gt; [a] -&amp;gt; [[a]]&lt;br /&gt;
segmentosLongitud n xs = map (take n) (tails xs)&lt;br /&gt;
&lt;br /&gt;
-- (consecutivos ns) se verifica si ns es una lista de números&lt;br /&gt;
-- consecutivos. Por ejemplo,&lt;br /&gt;
--    consecutivos [4,5,6] == True&lt;br /&gt;
--    consecutivos [4,5,7] == False&lt;br /&gt;
consecutivos :: [Integer] -&amp;gt; Bool&lt;br /&gt;
consecutivos ns = all (==1) (zipWith (-) (tail ns) ns)&lt;br /&gt;
&lt;br /&gt;
-- Otra definición de consecutivos es&lt;br /&gt;
consecutivos2 :: [Integer] -&amp;gt; Bool&lt;br /&gt;
consecutivos2 ns = ns == [minimum ns .. maximum ns]&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.1. El número 2021 tiene las propiedades siguientes:&lt;br /&gt;
-- + sumándole su inverso es un número palíndromo: 2021 + 1202 = 3223&lt;br /&gt;
-- + multiplicándolo por su inverso también lo es: 2021 * 1202 = 2429242&lt;br /&gt;
--&lt;br /&gt;
-- Definir las funciones&lt;br /&gt;
--    masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
--    prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (masInvPalindromo n) se verifica si n más su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--     masInvPalindromo 2021  == True&lt;br /&gt;
--      masInvPalindromo 109   == False&lt;br /&gt;
-- + (prodInvPalindromo n) se verifica si n por su inverso es&lt;br /&gt;
--   palíndromo. Por ejemplo,&lt;br /&gt;
--      prodInvPalindromo 2021 == True&lt;br /&gt;
--      prodInvPalindromo 1097 == False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
masInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
masInvPalindromo n = palindromo (n + inversoN n)&lt;br /&gt;
&lt;br /&gt;
-- (inversoN x) es el número obtenido invirtiendo los dígitos de x. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--    inversoN 2021 == 1202&lt;br /&gt;
inversoN :: Integer -&amp;gt; Integer&lt;br /&gt;
inversoN = read . reverse . show&lt;br /&gt;
&lt;br /&gt;
-- (palindromo n) se verifica si n es un palíndromo. Por ejemplo,&lt;br /&gt;
--    palindromo 23532 == True&lt;br /&gt;
--    palindromo 23352 == False&lt;br /&gt;
palindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
palindromo n = show n == reverse (show n)&lt;br /&gt;
&lt;br /&gt;
prodInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
prodInvPalindromo n = palindromo (n * inversoN n)&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8.2.. Comprobar con QuickCheck que todo número&lt;br /&gt;
-- prodInvPalindromo es masInvPalindromo.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
propInvPalindromo :: Integer -&amp;gt; Bool&lt;br /&gt;
propInvPalindromo n = not (prodInvPalindromo m) || masInvPalindromo m&lt;br /&gt;
  where m = 1 + abs n&lt;br /&gt;
&lt;br /&gt;
-- La comprobación es&lt;br /&gt;
--    λ&amp;gt; quickCheck propInvPalindromo&lt;br /&gt;
--    +++ OK, passed 100 tests.&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9. Comprobar que el número 2021 es el menor  número&lt;br /&gt;
-- natural que verifica las siguientes propiedades:&lt;br /&gt;
--  (+) es la concatenación de dos enteros consecutivos (20 y 21)&lt;br /&gt;
--  (+) es el producto de dos primos consecutivos (43 y 47)&lt;br /&gt;
--&lt;br /&gt;
-- Para ello, definir las funciones&lt;br /&gt;
--    esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
--    especiales :: [Integer]&lt;br /&gt;
-- tales que&lt;br /&gt;
-- + (esConcatConsecutivos n) se verifica si n es la concatenación de&lt;br /&gt;
--   dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--      esConcatConsecutivos 2021 == True&lt;br /&gt;
-- + (esProdprimosConsecutivos n) se verifica si n es el producto de dos&lt;br /&gt;
--   primos consecutivos&lt;br /&gt;
--      esProdprimosConsecutivos 2021 == True&lt;br /&gt;
-- + espaciales es la lista de números naturales que verifican las dos&lt;br /&gt;
--   propiedaes anteriores&lt;br /&gt;
--      head especiales == 2021&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- esConcatConsecutivos&lt;br /&gt;
-- ====================&lt;br /&gt;
&lt;br /&gt;
esConcatConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esConcatConsecutivos n =&lt;br /&gt;
  n == head (dropWhile (&amp;lt;n) concatEnterosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
-- concatEnterosConsecutivos es la lista de números obtenidos&lt;br /&gt;
-- concatenando dos enteros consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 10 concatEnterosConsecutivos&lt;br /&gt;
--    [12,23,34,45,56,67,78,89,910,1011]&lt;br /&gt;
concatEnterosConsecutivos :: [Integer]&lt;br /&gt;
concatEnterosConsecutivos = zipWith pegaNumeros xs (tail xs)&lt;br /&gt;
  where xs = [1..]&lt;br /&gt;
&lt;br /&gt;
-- (pegaNumeros n m) es el número otenido añadiendo los dígitos de m a&lt;br /&gt;
-- continuación de los de n. Por ejemplo,&lt;br /&gt;
--    pegaNumeros 23 416 == 23416&lt;br /&gt;
pegaNumeros :: Integer -&amp;gt; Integer -&amp;gt; Integer&lt;br /&gt;
pegaNumeros n m = read (show n ++ show m)&lt;br /&gt;
&lt;br /&gt;
-- esProdprimosConsecutivos&lt;br /&gt;
-- =========================&lt;br /&gt;
&lt;br /&gt;
esProdprimosConsecutivos :: Integer -&amp;gt; Bool&lt;br /&gt;
esProdprimosConsecutivos n =&lt;br /&gt;
  n == head (dropWhile (&amp;lt;n) productoPrimosConsecutivos)&lt;br /&gt;
&lt;br /&gt;
-- productoPrimosConsecutivos es la sucesión de los números que son&lt;br /&gt;
-- productos de dos primos consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 20 productoPrimosConsecutivos&lt;br /&gt;
--    [6,15,35,77,143,221,323,437,667,899,1147,1517,1763,2021,2491,3127,&lt;br /&gt;
--     3599,4087,4757,5183]&lt;br /&gt;
productoPrimosConsecutivos :: [Integer]&lt;br /&gt;
productoPrimosConsecutivos =&lt;br /&gt;
  zipWith (*) primes (tail primes)&lt;br /&gt;
&lt;br /&gt;
-- especiales&lt;br /&gt;
-- ==========&lt;br /&gt;
&lt;br /&gt;
especiales :: [Integer]&lt;br /&gt;
especiales = [n | n &amp;lt;- productoPrimosConsecutivos&lt;br /&gt;
                , esConcatConsecutivos n]&lt;br /&gt;
&lt;br /&gt;
-- concatPrimos es la lista de números obtenidos concatenando dos primos&lt;br /&gt;
-- consecutivos. Por ejemplo,&lt;br /&gt;
--    λ&amp;gt; take 20 concatPrimos&lt;br /&gt;
--    [23,35,57,711,1113,1317,1719,1923,2329,2931,3137,3741,4143,4347,4753,&lt;br /&gt;
--     5359,5961,6167,6771,7173]&lt;br /&gt;
concatPrimos :: [Integer]&lt;br /&gt;
concatPrimos = zipWith pegaNumeros primes (tail primes)&lt;br /&gt;
&lt;br /&gt;
-- Primer número especial:&lt;br /&gt;
--    head especiales == 2021&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mdelamor</name></author>
	</entry>
</feed>