<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Reloj Cuántico</title>
	<atom:link href="http://soffernet.com/jaime/cms/feed/" rel="self" type="application/rss+xml" />
	<link>http://soffernet.com/jaime/cms</link>
	<description>Bosque, granizo y jirafas</description>
	<lastBuildDate>Fri, 08 Jul 2011 23:00:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Tablas de diferencias</title>
		<link>http://soffernet.com/jaime/cms/2011/07/tablas-de-diferencias/</link>
		<comments>http://soffernet.com/jaime/cms/2011/07/tablas-de-diferencias/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 21:47:21 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=263</guid>
		<description><![CDATA[Sea polinomio de grado en . Una tabla de diferencias se emplea para convertir una sucesión en la sucesión de coeficientes tales que . Obteniendo los coeficientes en Haskell. Para este ejemplo utilizaremos el polinomio . Primero fabricamos una lista infinita con para cada índice en la lista: &#62; take 8 $ map &#40;^4&#41; &#91;0..&#93; [...]]]></description>
			<content:encoded><![CDATA[<p>Sea <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6b9dceb95480668de5a8a8e108db4d81.png" title="p" style="vertical-align:-20%;" class="tex" alt="p" /> polinomio de grado <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_92cfe00586e0bcc813b10c2649bb899a.png" title="n" style="vertical-align:-20%;" class="tex" alt="n" /> en <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_b915912209a015e8f23d3da4837e9b1e.png" title="x" style="vertical-align:-20%;" class="tex" alt="x" />. Una tabla de diferencias se emplea para convertir una sucesión <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_2d8cab043ca7c5e3976f9af7cb42d3bc.png" title="p(0),p(1),p(2) \ldots p(n)" style="vertical-align:-20%;" class="tex" alt="p(0),p(1),p(2) \ldots p(n)" /> en la sucesión de coeficientes <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_0b4eed6396a4a07984673b0ff22213ce.png" title="a_0,a_1,a_2 \ldots a_n" style="vertical-align:-20%;" class="tex" alt="a_0,a_1,a_2 \ldots a_n" /> tales que <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_555ac1e2bdcb12203403f44128603dca.png" title="p(x)=a_0 \binom{x}{0} + a_1 \binom{x}{1} + a_2 \binom{x}{2} + \ldots + a_n \binom{x}{n}" style="vertical-align:-20%;" class="tex" alt="p(x)=a_0 \binom{x}{0} + a_1 \binom{x}{1} + a_2 \binom{x}{2} + \ldots + a_n \binom{x}{n}" />.</p>
<p>Obteniendo los coeficientes <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_c4e9b42512bbd86153ff998e92e2473a.png" title="a_i" style="vertical-align:-20%;" class="tex" alt="a_i" /> en Haskell. Para este ejemplo utilizaremos el polinomio <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_b2b00841a9381b1e8a7b8ac9ddfd1299.png" title="x^4" style="vertical-align:-20%;" class="tex" alt="x^4" />.</p>
<p>Primero fabricamos una lista infinita con <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_44d049509ddefd7344acb7aa3bd3b444.png" title="p(i)" style="vertical-align:-20%;" class="tex" alt="p(i)" /> para cada índice <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_15e5b7b24fa294515954fbd867a14db1.png" title="i" style="vertical-align:-20%;" class="tex" alt="i" /> en la lista:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"> <span class="sy0">&gt;</span> <span class="kw3">take</span> <span class="nu0">8</span> <span class="sy0">$</span> <span class="kw3">map</span> <span class="br0">&#40;</span><span class="sy0">^</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">16</span><span class="sy0">,</span><span class="nu0">81</span><span class="sy0">,</span><span class="nu0">256</span><span class="sy0">,</span><span class="nu0">625</span><span class="sy0">,</span><span class="nu0">1296</span><span class="sy0">,</span><span class="nu0">2401</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>El &#8216;take 8&#8242; es solamente para no mostrar la lista completa.</p>
<p>Creamos ahora una función auxiliar &#8216;diferencia&#8217; sobre la que vamos a iterar la lista infinita.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="kw1">let</span> diferencia <span class="br0">&#40;</span>x:xs<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="kw3">zipWith</span> <span class="br0">&#40;</span><span class="sy0">-</span><span class="br0">&#41;</span> xs <span class="br0">&#40;</span>x:xs<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Lo que hace esta función es que, dada por ejemplo la lista <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_318ec114850a61e123689abb5346f593.png" title="x_0,x_1,x_2" style="vertical-align:-20%;" class="tex" alt="x_0,x_1,x_2" />, y su &#8216;tail&#8217; <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_273f7a5edcbd49fc14ea5145e74a4c7b.png" title="x_1,x_2" style="vertical-align:-20%;" class="tex" alt="x_1,x_2" />, resta término a término, <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_0b7993a5e9daf03684722da1c8a1dc9f.png" title="x_1-x_0,x_2-x_1" style="vertical-align:-20%;" class="tex" alt="x_1-x_0,x_2-x_1" />, efectivamente calculando la primera diferencia.</p>
<p>Ahora iteramos indefinidamente sobre la sucesión original (llamémosle xs); esto produce una lista [xs, diferencia xs, diferencia^2 xs, diferencia^3 xs...] de las i-ésimas diferencias de la sucesión.</p>
<p>Ver esa iteración no funcionaría, porque produce una lista infinita de listas infinitas, y nunca vamos a terminar de ver siquiera la primera. Pero para encontrar los coeficientes solamente hacen falta los &#8216;head&#8217;, o primeros términos. Entonces, inmediatamente después de la iteración, los pedimos con &#8216;map&#8217;:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="kw3">take</span> <span class="nu0">6</span> <span class="sy0">$</span> <span class="kw3">map</span> <span class="kw3">head</span> <span class="sy0">$</span> <span class="kw3">iterate</span> diferencia <span class="sy0">$</span> <span class="kw3">map</span> <span class="br0">&#40;</span><span class="sy0">^</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">14</span><span class="sy0">,</span><span class="nu0">36</span><span class="sy0">,</span><span class="nu0">24</span><span class="sy0">,</span><span class="nu0">0</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Podemos pedir más de seis coeficientes con &#8216;take&#8217;, pero no hace falta; dado que <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_b2b00841a9381b1e8a7b8ac9ddfd1299.png" title="x^4" style="vertical-align:-20%;" class="tex" alt="x^4" /> es polinomio de grado 4, solamente hacen falta cinco términos, del sexto en adelante son todos cero.</p>
<p>En lugar de &#8216;head&#8217; se puede usar &#8216;take 2&#8242;, por ejemplo, para ver más términos de cada lista infinita.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"> <span class="kw3">take</span> <span class="nu0">5</span> <span class="sy0">$</span> <span class="kw3">map</span> <span class="br0">&#40;</span><span class="kw3">take</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">$</span> <span class="kw3">iterate</span> diferencia <span class="sy0">$</span> <span class="kw3">map</span> <span class="br0">&#40;</span><span class="sy0">^</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">15</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">14</span><span class="sy0">,</span><span class="nu0">50</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">36</span><span class="sy0">,</span><span class="nu0">60</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">24</span><span class="sy0">,</span><span class="nu0">24</span><span class="br0">&#93;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Finalmente, para verificar (empleando el &#8216;binomial&#8217; en Math.Combinat.Numbers):</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="kw1">let</span> base x <span class="sy0">=</span> <span class="kw3">map</span> <span class="br0">&#40;</span>binomial x<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#93;</span>
<span class="sy0">&gt;</span> <span class="kw1">let</span> coeficientes <span class="sy0">=</span>
    <span class="br0">&#40;</span><span class="kw3">map</span> <span class="kw3">head</span> <span class="sy0">$</span> <span class="kw3">iterate</span> diferencias <span class="sy0">$</span> <span class="kw3">map</span> <span class="br0">&#40;</span><span class="sy0">^</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
<span class="sy0">&gt;</span> <span class="kw3">sum</span> <span class="sy0">$</span> <span class="kw3">take</span> <span class="nu0">6</span> <span class="sy0">$</span> <span class="kw3">zipWith</span> <span class="br0">&#40;</span><span class="sy0">*</span><span class="br0">&#41;</span> coeficientes <span class="br0">&#40;</span>base <span class="nu0">1200</span><span class="br0">&#41;</span>
<span class="nu0">2073600000000</span>
<span class="sy0">&gt;</span> <span class="nu0">1200</span><span class="sy0">^</span><span class="nu0">4</span>
<span class="nu0">2073600000000</span></pre></div></div></div></div></div></div></div>


<p>&#8216;base&#8217; es la lista <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_a8a8f502cf80a08a877998f04f0cd5b2.png" title="\binom{x}{0}, \binom{x}{1}, \binom{x}{2} \ldots" style="vertical-align:-20%;" class="tex" alt="\binom{x}{0}, \binom{x}{1}, \binom{x}{2} \ldots" />, &#8216;coeficientes&#8217; es lo mismo de arriba, el &#8216;sum $ zipWith (*)&#8217; hace el producto interior.</p>
]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/07/tablas-de-diferencias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Falsa inducción (solución)</title>
		<link>http://soffernet.com/jaime/cms/2011/06/falsa-induccion-solucion/</link>
		<comments>http://soffernet.com/jaime/cms/2011/06/falsa-induccion-solucion/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 11:46:35 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=176</guid>
		<description><![CDATA[Tomemos un conjunto de n fichas que pueden ser blancas o rojas. Demostrar por inducción que todas las fichas del conjunto deben ser del mismo color. Base de inducción: . Se satisface trivialmente que todas las fichas son del mismo color. Paso de inducción: Sea un conjunto con fichas. Si escondemos una, queda un conjunto [...]]]></description>
			<content:encoded><![CDATA[<p>Tomemos un conjunto de n fichas que pueden ser blancas o rojas. Demostrar por inducción que todas las fichas del conjunto deben ser del mismo color.</p>
<p><strong>Base de inducción:</strong> <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_db6cd26555b6b903b7f8288b6f481cfa.png" title="n = 1" style="vertical-align:-20%;" class="tex" alt="n = 1" />. Se satisface trivialmente que todas las fichas son del mismo color.</p>
<p><strong>Paso de inducción:</strong> Sea <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" /> un conjunto con <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_8b7ad7ef7ca5522c92c7e3bf5982363f.png" title="n+1" style="vertical-align:-20%;" class="tex" alt="n+1" /> fichas. Si escondemos una, queda un conjunto <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> con <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_92cfe00586e0bcc813b10c2649bb899a.png" title="n" style="vertical-align:-20%;" class="tex" alt="n" /> fichas, que, <em>por hipótesis de inducción</em>, tiene todas sus fichas del mismo color. Repitamos el proceso (aún sobre <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" />) escondiendo una ficha diferente, de donde resulta <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" />, que también tiene todas sus fichas del mismo color por el mismo motivo.</p>
<p>Entonces, <strong>si la intersección de <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> y <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" /> no es vacía,</strong>  tenemos que <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> y <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" /> tienen todas sus fichas del mismo color, porque cada conjunto (por hipótesis) tiene todas sus fichas del mismo color, y comparten al menos una ficha en la intersección.</p>
<p>¿Qué sucede en el otro caso, cuando la intersección es vacía? Que no se puede decir nada respecto a <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> y <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" />. Pueden tener fichas de colores diferentes. Y eso es lo que puede suceder con <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_db6cd26555b6b903b7f8288b6f481cfa.png" title="n = 1" style="vertical-align:-20%;" class="tex" alt="n = 1" />, que tomamos como base de inducción. Si <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_5a193b8a8d1d8c911c6484e1bee6f1bf.png" title="M = \{x_1,x_2\}" style="vertical-align:-20%;" class="tex" alt="M = \{x_1,x_2\}" />, entonces <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_a2f270f54bcb80a80ed3952bef4e18c2.png" title="M' = \{x_1\}" style="vertical-align:-20%;" class="tex" alt="M' = \{x_1\}" />, <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_d56ac2174bad82d7e21c6ed2cbfa1463.png" title="M'' = \{x_2\}" style="vertical-align:-20%;" class="tex" alt="M'' = \{x_2\}" /> (o viceversa), y la intersección debe ser vacía.</p>
<p>Entonces <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_db6cd26555b6b903b7f8288b6f481cfa.png" title="n = 1" style="vertical-align:-20%;" class="tex" alt="n = 1" /> no es buena base. Y a partir de <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_75c1288239a8a0d8e2a140f1d05bb726.png" title="n = 2" style="vertical-align:-20%;" class="tex" alt="n = 2" /> ya no se satisface que todas las fichas deban ser del mismo color; no hay buena base para este paso de inducción.</p>
]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/06/falsa-induccion-solucion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Falsa inducción</title>
		<link>http://soffernet.com/jaime/cms/2011/06/falsa-induccion/</link>
		<comments>http://soffernet.com/jaime/cms/2011/06/falsa-induccion/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 22:27:03 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Sin categoría]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=170</guid>
		<description><![CDATA[Tomemos un conjunto de fichas que pueden ser blancas o rojas. Demostrar por inducción que todas las fichas del conjunto deben ser del mismo color. Base de inducción: . Se satisface trivialmente que todas las fichas son del mismo color. Paso de inducción: Sea un conjunto con fichas. Si escondemos una, queda un conjunto con [...]]]></description>
			<content:encoded><![CDATA[<p>Tomemos un conjunto de <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_92cfe00586e0bcc813b10c2649bb899a.png" title="n" style="vertical-align:-20%;" class="tex" alt="n" /> fichas que pueden ser blancas o rojas. Demostrar por inducción que todas las fichas del conjunto deben ser del mismo color.</p>
<p><strong>Base de inducción:</strong> <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_db6cd26555b6b903b7f8288b6f481cfa.png" title="n = 1" style="vertical-align:-20%;" class="tex" alt="n = 1" />. Se satisface trivialmente que todas las fichas son del mismo color.</p>
<p><strong>Paso de inducción:</strong> Sea <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" /> un conjunto con <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_8b7ad7ef7ca5522c92c7e3bf5982363f.png" title="n+1" style="vertical-align:-20%;" class="tex" alt="n+1" /> fichas. Si escondemos una, queda un conjunto <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> con <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_92cfe00586e0bcc813b10c2649bb899a.png" title="n" style="vertical-align:-20%;" class="tex" alt="n" /> fichas, que, <em>por hipótesis de inducción</em>, tiene todas sus fichas del mismo color. Repitamos el proceso (aún sobre <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" />) escondiendo una ficha diferente, de donde resulta <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" />, que también tiene todas sus fichas del mismo color por el mismo motivo.</p>
<p>Así se &#8220;demuestra&#8221; que todas las fichas de <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" /> son del mismo color; por ejemplo, si <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" /> tiene 100 fichas, escondiendo dos distintas se construyen <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> y <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" /> con 99 fichas cada uno; como <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" /> contiene la ficha oculta a <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" />, y <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_af906f7f69d23ee05fe35b59ed997043.png" title="M''" style="vertical-align:-20%;" class="tex" alt="M''" /> contiene la ficha oculta a <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_f11e5c4477ef327fa0a73914e7740403.png" title="M'" style="vertical-align:-20%;" class="tex" alt="M'" />, entonces toda ficha en <img src="http://soffernet.com/jaime/cms/wp-content/plugins/easy-latex/cache/tex_6fc663281549f88f016190d4a54c19b4.png" title="M" style="vertical-align:-20%;" class="tex" alt="M" /> es del mismo color. Con esto queda &#8220;demostrado&#8221; el paso de inducción, y la afirmación debería ser verdadera.</p>
<p>Por supuesto que la afirmación es falsa; es perfectamente posible formar conjuntos de colores mezclados. ¿Dónde está el problema?</p>
]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/06/falsa-induccion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subconjuntos</title>
		<link>http://soffernet.com/jaime/cms/2011/05/subconjuntos/</link>
		<comments>http://soffernet.com/jaime/cms/2011/05/subconjuntos/#comments</comments>
		<pubDate>Sat, 14 May 2011 00:17:04 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=100</guid>
		<description><![CDATA[Sea una lista xs, con todos sus elementos diferentes (para que sea lo más parecida a un conjunto). Buscamos todos los subconjuntos de esa lista. binarias = iterate &#40;concatMap &#40;\xs -&#62; &#91;False:xs,True:xs&#93;&#41;&#41; &#91;&#91;&#93;&#93; &#160; subsets xs = map &#40;&#40;map fst&#41; . &#40;filter snd&#41; . &#40;zip xs&#41;&#41; $ &#40;binarias !!&#41; $ length xs &#160; &#62; subsets [...]]]></description>
			<content:encoded><![CDATA[<p>Sea una lista xs, con todos sus elementos diferentes (para que sea lo más parecida a un conjunto). Buscamos todos los subconjuntos de esa lista.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">binarias <span class="sy0">=</span> <span class="kw3">iterate</span> <span class="br0">&#40;</span><span class="kw3">concatMap</span> <span class="br0">&#40;</span>\xs <span class="sy0">-&gt;</span> <span class="br0">&#91;</span>False:xs<span class="sy0">,</span>True:xs<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#93;</span>
&nbsp;
subsets xs <span class="sy0">=</span>
    <span class="kw3">map</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">map</span> <span class="kw3">fst</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="kw3">filter</span> <span class="kw3">snd</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="kw3">zip</span> xs<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">$</span>
    <span class="br0">&#40;</span>binarias <span class="sy0">!!</span><span class="br0">&#41;</span> <span class="sy0">$</span>
    <span class="kw3">length</span> xs
&nbsp;
<span class="sy0">&gt;</span> subsets <span class="st0">&quot;abc&quot;</span>
<span class="br0">&#91;</span><span class="st0">&quot;&quot;</span><span class="sy0">,</span><span class="st0">&quot;a&quot;</span><span class="sy0">,</span><span class="st0">&quot;b&quot;</span><span class="sy0">,</span><span class="st0">&quot;ab&quot;</span><span class="sy0">,</span><span class="st0">&quot;c&quot;</span><span class="sy0">,</span><span class="st0">&quot;ac&quot;</span><span class="sy0">,</span><span class="st0">&quot;bc&quot;</span><span class="sy0">,</span><span class="st0">&quot;abc&quot;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Declaro &#8216;binarias&#8217; de forma similar que en <a href="http://soffernet.com/jaime/cms/2011/05/cadenas-binarias/">&#8220;Cadenas Binarias&#8221;</a>, con una diferencia: en lugar de ceros y unos (letras) agrego valores Falso y Verdadero. Las cadenas (ahora listas, que son funcionalmente equivalentes) producidas son idénticas, excepto por ese reemplazo.</p>
<p>Para generar los subconjuntos, primero pide las cadenas binarias de la misma longitud que xs:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="br0">&#40;</span>binarias <span class="sy0">!!</span><span class="br0">&#41;</span> <span class="sy0">$</span> <span class="kw3">length</span> xs</pre></div></div></div></div></div></div></div>


<p>En el ejemplo, como &#8220;abc&#8221; tiene longitud 3, en ese punto ha producido</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="br0">&#40;</span>binarias <span class="sy0">!!</span><span class="br0">&#41;</span> <span class="sy0">$</span> <span class="kw3">length</span> <span class="st0">&quot;abc&quot;</span>
<span class="br0">&#91;</span><span class="br0">&#91;</span>False<span class="sy0">,</span>False<span class="sy0">,</span>False<span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span>True<span class="sy0">,</span>False<span class="sy0">,</span>False<span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span>False<span class="sy0">,</span>True<span class="sy0">,</span>False<span class="br0">&#93;</span><span class="sy0">,</span>
<span class="br0">&#91;</span>True<span class="sy0">,</span>True<span class="sy0">,</span>False<span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span>False<span class="sy0">,</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span>True<span class="sy0">,</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span><span class="sy0">,</span>
<span class="br0">&#91;</span>False<span class="sy0">,</span>True<span class="sy0">,</span>True<span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span>True<span class="sy0">,</span>True<span class="sy0">,</span>True<span class="br0">&#93;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Después, para cada cadena, &#8216;zip xs&#8217; hace pares en los que los primeros términos se toman de xs y los segundos de la cadena. Por ejemplo, para la cadena &#8216;[True,False,True]&#8216;, con xs = &#8220;abc&#8221;, se forma</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="br0">&#40;</span><span class="kw3">zip</span> <span class="st0">&quot;abc&quot;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span>True<span class="sy0">,</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="br0">&#40;</span>'a'<span class="sy0">,</span>True<span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span>'b'<span class="sy0">,</span>False<span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span>'c'<span class="sy0">,</span>True<span class="br0">&#41;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>A continuación se filtra, dejando pasar solamente las que tienen Verdadero en el segundo término (con &#8216;snd&#8217;):</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">filter</span> <span class="kw3">snd</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="kw3">zip</span> <span class="st0">&quot;abc&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span>True<span class="sy0">,</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="br0">&#40;</span>'a'<span class="sy0">,</span>True<span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span>'c'<span class="sy0">,</span>True<span class="br0">&#41;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>y se retira el segundo término, que en este punto es siempre verdadero y ya no es necesario.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">map</span> <span class="kw3">fst</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="kw3">filter</span> <span class="kw3">snd</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="kw3">zip</span> <span class="st0">&quot;abc&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span>True<span class="sy0">,</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span>
<span class="st0">&quot;ac&quot;</span></pre></div></div></div></div></div></div></div>


<p>De esta forma, el subconjunto que corresponte a la cadena binaria &#8220;Verdadero, Falso, Verdadero&#8221; aplicada a &#8220;abc&#8221; es &#8220;ac&#8221;, porque &#8216;a&#8217; y &#8216;c&#8217; tienen un Verdadero en sus posiciones respectivas en la cadena binaria.</p>
<p>Esto se hizo con una sola cadena binaria, como ejemplo; el primer &#8216;map&#8217;  en &#8216;subsets&#8217; aplica esa composición de funciones a todo &#8216;(binarias !!) $ length xs&#8217;, que es una lista de todas las cadenas binarias de la misma longitud que xs. Por lo tanto, genera todos los subconjuntos de xs.</p>
]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/05/subconjuntos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cadenas binarias</title>
		<link>http://soffernet.com/jaime/cms/2011/05/cadenas-binarias/</link>
		<comments>http://soffernet.com/jaime/cms/2011/05/cadenas-binarias/#comments</comments>
		<pubDate>Thu, 12 May 2011 19:13:05 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=83</guid>
		<description><![CDATA[binarias = iterate &#40;concatMap &#40;\xs -&#62; &#91;'0':xs,'1':xs&#93;&#41;&#41; &#91;&#34;&#34;&#93; El n-ésimo término de la lista infinita &#8216;binarias&#8217; es una lista que contiene las cadenas binarias de longitud n; por ejemplo, &#62; binarias !! 4 &#91;&#34;0000&#34;,&#34;1000&#34;,&#34;0100&#34;,&#34;1100&#34;,&#34;0010&#34;,&#34;1010&#34;,&#34;0110&#34;,&#34;1110&#34;, &#34;0001&#34;,&#34;1001&#34;,&#34;0101&#34;,&#34;1101&#34;,&#34;0011&#34;,&#34;1011&#34;,&#34;0111&#34;,&#34;1111&#34;&#93; Se construyen con la regla de que cada lista en &#8216;binarias&#8217; es igual a la anterior después de poner un [...]]]></description>
			<content:encoded><![CDATA[

<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">binarias <span class="sy0">=</span> <span class="kw3">iterate</span> <span class="br0">&#40;</span><span class="kw3">concatMap</span> <span class="br0">&#40;</span>\xs <span class="sy0">-&gt;</span> <span class="br0">&#91;</span>'<span class="nu0">0</span>':xs<span class="sy0">,</span>'<span class="nu0">1</span>':xs<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="st0">&quot;&quot;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>El n-ésimo término de la lista infinita &#8216;binarias&#8217; es una lista que contiene las cadenas binarias de longitud n; por ejemplo,</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> binarias <span class="sy0">!!</span> <span class="nu0">4</span>
<span class="br0">&#91;</span><span class="st0">&quot;0000&quot;</span><span class="sy0">,</span><span class="st0">&quot;1000&quot;</span><span class="sy0">,</span><span class="st0">&quot;0100&quot;</span><span class="sy0">,</span><span class="st0">&quot;1100&quot;</span><span class="sy0">,</span><span class="st0">&quot;0010&quot;</span><span class="sy0">,</span><span class="st0">&quot;1010&quot;</span><span class="sy0">,</span><span class="st0">&quot;0110&quot;</span><span class="sy0">,</span><span class="st0">&quot;1110&quot;</span><span class="sy0">,</span>
 <span class="st0">&quot;0001&quot;</span><span class="sy0">,</span><span class="st0">&quot;1001&quot;</span><span class="sy0">,</span><span class="st0">&quot;0101&quot;</span><span class="sy0">,</span><span class="st0">&quot;1101&quot;</span><span class="sy0">,</span><span class="st0">&quot;0011&quot;</span><span class="sy0">,</span><span class="st0">&quot;1011&quot;</span><span class="sy0">,</span><span class="st0">&quot;0111&quot;</span><span class="sy0">,</span><span class="st0">&quot;1111&quot;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Se construyen con la regla de que cada lista en &#8216;binarias&#8217; es igual a la anterior después de poner un &#8217;0&#8242; y un &#8217;1&#8242; al principio de cada cadena en la lista, iniciando con la lista que contiene a la cadena vacía.</p>
<p>&#8216;concatMap&#8217; es similar a &#8216;map&#8217;, pero permite agregar varios valores al resultado en lugar de sólo uno:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="kw3">map</span> <span class="br0">&#40;</span>\ k <span class="sy0">-&gt;</span> k<span class="sy0">+</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">..</span><span class="nu0">5</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="nu0">11</span><span class="sy0">,</span><span class="nu0">12</span><span class="sy0">,</span><span class="nu0">13</span><span class="sy0">,</span><span class="nu0">14</span><span class="sy0">,</span><span class="nu0">15</span><span class="br0">&#93;</span>
<span class="sy0">&gt;</span> <span class="kw3">concatMap</span> <span class="br0">&#40;</span>\ k <span class="sy0">-&gt;</span> <span class="br0">&#91;</span>k<span class="sy0">,</span> k<span class="sy0">+</span><span class="nu0">10</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">..</span><span class="nu0">5</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">11</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">12</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">13</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">14</span><span class="sy0">,</span><span class="nu0">5</span><span class="sy0">,</span><span class="nu0">15</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Para cada número en [1..5] &#8216;map&#8217; solamente extiende la lista resultado en uno; &#8216;concatMap&#8217; aquí la extiende en dos, porque (\ k -> [k, k+10]) regresa una lista con dos elementos.</p>
<p>Manipular la función de extensión permite generar cadenas binarias con propiedades particulares. Por ejemplo, las cadenas binarias que no tienen dos unos juntos:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">sinRachas <span class="sy0">=</span> <span class="br0">&#91;</span><span class="st0">&quot;&quot;</span><span class="br0">&#93;</span> :
    <span class="kw3">iterate</span> <span class="br0">&#40;</span><span class="kw3">concatMap</span> 
        <span class="br0">&#40;</span>\xs <span class="sy0">-&gt;</span> <span class="kw1">if</span> <span class="kw3">head</span> xs <span class="sy0">==</span> '<span class="nu0">1</span>' 
                  <span class="kw1">then</span> <span class="br0">&#91;</span>'<span class="nu0">0</span>':xs<span class="br0">&#93;</span> 
                  <span class="kw1">else</span> <span class="br0">&#91;</span>'<span class="nu0">0</span>':xs<span class="sy0">,</span>'<span class="nu0">1</span>':xs<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="st0">&quot;0&quot;</span><span class="sy0">,</span><span class="st0">&quot;1&quot;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Aunque se ve más complicada, es casi exactamente la misma función. La única diferencia es que, en lugar de simplemente agregar un &#8217;0&#8242; y un &#8217;1&#8242;, primero pregunta si la cadena a la que está agregando empieza con &#8217;1&#8242; (head xs == &#8217;1&#8242;); si es así, extiende solamente con &#8217;0&#8242;.</p>
<p>Como está preguntando por el principio de la cadena binaria, no es posible comenzar a iterar con una cadena vacía. Por eso &#8216;[""] :&#8217; agrega directamente las cadenas binarias sin dos unos juntos que tienen longitud cero (solamente &#8220;&#8221;) y comienza a iterar con las de longitud uno, ["0","1"].</p>
<p>Como nota interesante, los números de cadenas binarias sin dos unos juntos corresponden a números de Fibonacci:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="kw3">map</span> <span class="kw3">length</span> sinRachas 
<span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">5</span><span class="sy0">,</span><span class="nu0">8</span><span class="sy0">,</span><span class="nu0">13</span><span class="sy0">,</span><span class="nu0">21</span><span class="sy0">,</span><span class="nu0">34</span><span class="sy0">,</span><span class="nu0">55</span><span class="sy0">,</span><span class="nu0">89</span><span class="sy0">,</span><span class="nu0">144</span><span class="sy0">,</span><span class="nu0">233</span><span class="sy0">,</span><span class="nu0">377</span><span class="sy0">...</span></pre></div></div></div></div></div></div></div>


]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/05/cadenas-binarias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generando permutaciones</title>
		<link>http://soffernet.com/jaime/cms/2011/05/generando-permutaciones/</link>
		<comments>http://soffernet.com/jaime/cms/2011/05/generando-permutaciones/#comments</comments>
		<pubDate>Wed, 11 May 2011 20:54:34 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=60</guid>
		<description><![CDATA[permutaciones = map snd $ iterate inserta &#40;1,&#91;&#91;&#93;&#93;&#41; where inserta &#40;n,xs&#41; = &#40;n+1, concatMap &#40;inserta' n&#41; xs&#41; inserta' n xs = map &#40;&#40;\&#40;a,b&#41; -&#62; a ++ &#91;n&#93; ++ b&#41;.&#40;&#40;flip splitAt&#41; xs&#41;&#41; &#91;0..&#40;length xs&#41;&#93; &#8216;permutaciones&#8217; es una lista infinita, donde el enésimo término es la lista de las permutaciones con n elementos; e.g. &#62; permutaciones !! [...]]]></description>
			<content:encoded><![CDATA[

<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">permutaciones <span class="sy0">=</span> <span class="kw3">map</span> <span class="kw3">snd</span> <span class="sy0">$</span> <span class="kw3">iterate</span> inserta <span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="kw1">where</span>
    inserta <span class="br0">&#40;</span>n<span class="sy0">,</span>xs<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="br0">&#40;</span>n<span class="sy0">+</span><span class="nu0">1</span><span class="sy0">,</span> <span class="kw3">concatMap</span> <span class="br0">&#40;</span>inserta' n<span class="br0">&#41;</span> xs<span class="br0">&#41;</span>
    inserta' n xs <span class="sy0">=</span> <span class="kw3">map</span>
        <span class="br0">&#40;</span><span class="br0">&#40;</span>\<span class="br0">&#40;</span>a<span class="sy0">,</span>b<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> a <span class="sy0">++</span> <span class="br0">&#91;</span>n<span class="br0">&#93;</span> <span class="sy0">++</span> b<span class="br0">&#41;</span><span class="sy0">.</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">flip</span> <span class="kw3">splitAt</span><span class="br0">&#41;</span> xs<span class="br0">&#41;</span><span class="br0">&#41;</span>
        <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#40;</span><span class="kw3">length</span> xs<span class="br0">&#41;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>&#8216;permutaciones&#8217; es una lista infinita, donde el enésimo término es la lista de las permutaciones con n elementos; e.g.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> permutaciones <span class="sy0">!!</span> <span class="nu0">4</span>
<span class="br0">&#91;</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span>
 <span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span>
 <span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span>
 <span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span>
 <span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span>
 <span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>La estrategia es partir del valor inicial &#8216;(1,[[]])&#8217;, que es un par que contiene como primer término el que va a ser elemento nuevo en la próxima lista de permutaciones, y, como segundo, la lista conteniendo la única permutación con cero elementos.</p>
<p>&#8216;iterate&#8217; construye una lista infinita, aplicando la función &#8216;inserta&#8217; a cada entrada en la lista para obtener la siguiente.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">inserta <span class="br0">&#40;</span>n<span class="sy0">,</span>xs<span class="br0">&#41;</span> <span class="sy0">=</span> <span class="br0">&#40;</span>n<span class="sy0">+</span><span class="nu0">1</span><span class="sy0">,</span> <span class="kw3">concatMap</span> <span class="br0">&#40;</span>inserta' n<span class="br0">&#41;</span> xs<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>De un lado, con cada paso incrementamos el elemento a agregar, para que toda permutación con n elementos consista de los números entre 1 y n. </p>
<p>Del otro, insertamos el elemento nuevo en todas las posiciones posibles de cada permutación en la lista obtenida el paso anterior, empleando la función auxiliar inserta&#8217;:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">inserta' n xs <span class="sy0">=</span> <span class="kw3">map</span>
    <span class="br0">&#40;</span><span class="br0">&#40;</span>\<span class="br0">&#40;</span>a<span class="sy0">,</span>b<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> a <span class="sy0">++</span> <span class="br0">&#91;</span>n<span class="br0">&#93;</span> <span class="sy0">++</span> b<span class="br0">&#41;</span><span class="sy0">.</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">flip</span> <span class="kw3">splitAt</span><span class="br0">&#41;</span> xs<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="br0">&#40;</span><span class="kw3">length</span> xs<span class="br0">&#41;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Esta función lee una permutación xs, la divide de todas las formas posibles con &#8216;map ((flip splitAt) xs)&#8217; sobre todos los valores válidos, y la vuelve a pegar con &#8216;++&#8217; poniendo n en medio.</p>
<p>En este caso &#8216;flip&#8217; cambia el orden de los argumentos de &#8216;splitAt&#8217;, que normalmente funciona como &#8216;splitAt n xs&#8217;, y con &#8216;flip&#8217; es &#8216;splitAt xs n&#8217; para poder usar el mapa sobre las n.</p>
<p>Ejemplo de dividir una permutación:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="kw3">map</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">flip</span> <span class="kw3">splitAt</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="nu0">4</span><span class="br0">&#93;</span>
<span class="br0">&#91;</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span>
<span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>y de volver a unir una de las divisiones, insertando un 5 en el corte:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="sy0">&gt;</span> <span class="br0">&#40;</span>\<span class="br0">&#40;</span>a<span class="sy0">,</span>b<span class="br0">&#41;</span> <span class="sy0">-&gt;</span> a <span class="sy0">++</span> <span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span> <span class="sy0">++</span> b<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
<span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">4</span><span class="sy0">,</span><span class="nu0">5</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span><span class="nu0">3</span><span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Por último, el usar &#8216;map snd&#8217; en la lista final es porque está formada de pares (n+1, nPermutaciones), donde los primeros términos ya no son necesarios después de calcular. Queremos ver solamente los segundos, que son las listas de permutaciones.</p>
]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/05/generando-permutaciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pi y Fibonacci</title>
		<link>http://soffernet.com/jaime/cms/2011/05/pi-y-fibonacci/</link>
		<comments>http://soffernet.com/jaime/cms/2011/05/pi-y-fibonacci/#comments</comments>
		<pubDate>Tue, 10 May 2011 19:47:36 +0000</pubDate>
		<dc:creator>jsoffer</dc:creator>
				<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://soffernet.com/jaime/cms/?p=37</guid>
		<description><![CDATA[Pi and the Fibonacci Numbers [maths.surrey.ac.uk] La suma de tangentes inversas de recíprocos de números de Fibonacci con índice impar aproxima a pi/4. Desplazando un índice (no mencionado directamente en esa página), aproxima a pi/2. Calculando en Haskell: pi' = let fibs = 0 : 1 : zipWith &#40;+&#41; fibs &#40;tail fibs&#41; in &#40;*2&#41; . [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibpi.html#piandfib">Pi and the Fibonacci Numbers</a> [maths.surrey.ac.uk]</p>
<p>La suma de tangentes inversas de recíprocos de números de Fibonacci con índice impar aproxima a pi/4. Desplazando un índice (no mencionado directamente en esa página), aproxima a pi/2.</p>
<p>Calculando en Haskell:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="kw3">pi</span>' <span class="sy0">=</span> <span class="kw1">let</span> fibs <span class="sy0">=</span> <span class="nu0">0</span> : <span class="nu0">1</span> : <span class="kw3">zipWith</span> <span class="br0">&#40;</span><span class="sy0">+</span><span class="br0">&#41;</span> fibs <span class="br0">&#40;</span><span class="kw3">tail</span> fibs<span class="br0">&#41;</span> <span class="kw1">in</span>
    <span class="br0">&#40;</span><span class="sy0">*</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="sy0">!!</span> <span class="nu0">100</span><span class="br0">&#41;</span> <span class="sy0">$</span>
    <span class="kw3">scanl1</span> <span class="br0">&#40;</span><span class="sy0">+</span><span class="br0">&#41;</span> <span class="sy0">$</span>
    <span class="kw3">map</span> <span class="br0">&#40;</span><span class="kw3">atan</span><span class="sy0">.</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">/</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">fst</span><span class="br0">&#41;</span> <span class="sy0">$</span>
    <span class="kw3">filter</span> <span class="kw3">snd</span> <span class="sy0">$</span> <span class="kw3">zip</span> fibs <span class="sy0">$</span> <span class="kw3">cycle</span> <span class="br0">&#91;</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p>Paso a paso.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1">fibs <span class="sy0">=</span> <span class="nu0">0</span> : <span class="nu0">1</span> : <span class="kw3">zipWith</span> <span class="br0">&#40;</span><span class="sy0">+</span><span class="br0">&#41;</span> fibs <span class="br0">&#40;</span><span class="kw3">tail</span> fibs<span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p> es la definición estándar de los números de Fibonacci (<a href="http://haskell.org/haskellwiki/The_Fibonacci_sequence">The Fibonacci sequence</a>).</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="kw3">map</span> <span class="kw3">fst</span> <span class="sy0">$</span> <span class="kw3">filter</span> <span class="kw3">snd</span> <span class="sy0">$</span> <span class="kw3">zip</span> fibs <span class="sy0">$</span> <span class="kw3">cycle</span> <span class="br0">&#91;</span>False<span class="sy0">,</span>True<span class="br0">&#93;</span></pre></div></div></div></div></div></div></div>


<p> filtra uno de cada dos elementos en la lista &#8216;fibs&#8217;. Forma parejas [(Fib0,False), (Fib1,True), (Fib2,False), (Fib3,True)...], ciclando [False,True] como segundo término. Toma sólo las que tengan &#8216;True&#8217; y extrae el primer término con &#8216;fst&#8217;.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="kw3">map</span> <span class="br0">&#40;</span><span class="kw3">atan</span><span class="sy0">.</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">/</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>Después se le aplica la función interna de la suma (f x = atan(1/x)) a cada término. Como lo último que se hizo antes fue otro &#8216;map&#8217;, se puede incluir el &#8216;fst&#8217; aquí por composición.</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="kw3">scanl1</span> <span class="br0">&#40;</span><span class="sy0">+</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>&#8216;scanl&#8217; hace la suma, mostrando los valores acumulados tras cada sumando para ir viendo la precisión. Los primeros resultados son [0.7853981633974483, 1.2490457723982544, 1.4464413322481353...] que buscan aproximar 1.5707963267948966, pi/2. Tarda 8 pasos en exceder 1.57 (claramente tiene monotonía creciente).</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="haskell"><pre class="de1"><span class="br0">&#40;</span><span class="sy0">*</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="br0">&#40;</span><span class="sy0">!!</span><span class="nu0">100</span><span class="br0">&#41;</span></pre></div></div></div></div></div></div></div>


<p>&#8216;!!&#8217; selecciona el término en la lista después de 100 pasos, y (*2) lo multiplica por 2, porque la suma aproxima pi/2. El resultado final es pi&#8217; = 3.1415926535897922, válido a 15 dígitos significativos.</p>
]]></content:encoded>
			<wfw:commentRss>http://soffernet.com/jaime/cms/2011/05/pi-y-fibonacci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

