<?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>nemediano &#187; Matematicas</title>
	<atom:link href="http://www.nemediano.com.mx/category/mis-demonios/matematicas-mis-demonios/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nemediano.com.mx</link>
	<description>Reflexiones de un espiritu curioso</description>
	<lastBuildDate>Fri, 28 Oct 2011 19:07:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Un swap sin memoria extra</title>
		<link>http://www.nemediano.com.mx/2011/un-swap-sin-memoria-extra/</link>
		<comments>http://www.nemediano.com.mx/2011/un-swap-sin-memoria-extra/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 04:56:13 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Matematicas]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=384</guid>
		<description><![CDATA[Este es otro de los trucos que me enseño Eduardo Lemus cuando me estaba preparando para mis entrevistas en Microsoft. Se trata de hacer un cambio swap entre dos variables con la restricción de que no podemos usar ninguna variable temporal como buffer. Antes que nada quiero aclarar que este truco es una mala practica, [...]]]></description>
			<content:encoded><![CDATA[<p>Este es otro de los trucos que me enseño Eduardo Lemus cuando me estaba preparando para mis entrevistas en Microsoft. Se trata de hacer un cambio swap entre dos variables con la restricción de que no podemos usar ninguna variable temporal como buffer.</p>
<p>Antes que nada quiero aclarar que este truco es una mala practica, en la mayoría de los lugares donde lo he visto (mientras me documentaba para escribir este post) aconsejan no hacerlo. La razón, aunque el truco funciona (y como veremos adelante tiene un fundamento solido) es confuso. Es decir según los <a href="http://en.wikipedia.org/wiki/Software_engineering">IS</a> la ganancia en performance es muy poca comparada con la complicación en entender el código escrito. Además de que en computadoras modernas este truco puede ser mas lento que la solución estándar (estúpidos optimizadores de memoria).</p>
<p>Así que solo ocuparlo en código que quieran usar con fin de hacer faramalla, show e impresionar chicas. <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  O en caso de que algún entrevistador para alguna chamba se pase de listo y les pregunte como hacerlo.<br />
<span id="more-384"></span></p>
<h2>Entendiendo el problema</h2>
<p>En muchos algoritmos (por ejemplo en ordenación) es necesario intercambiar los valores de dos variables. Para simplificar el resto de la explicación asumiré <em>sin perdida de generalidad</em> (como me gusta usar esa frase <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ) que se tienen valores numéricos y enteros.</p>
<p>Es decir al principio tenemos algo como.</p>
<p>A = 2<br />
B = 4</p>
<p>Queremos llevar a cabo la operación de intercambio y obtener una situación como:</p>
<p>A = 4<br />
B = 2</p>
<h2>Como lo haría una persona normal</h2>
<p>Pues como nos enseñaron en la escuela XD. En todos los lenguajes de programación al asignación es una operación destructiva. Es decir al momento de asignar un valor a una variable se pierde el contenido anterior. (¡Estúpidas limitantes físicas del computo!).</p>
<p>Por lo que la gente que no sabe el truco haría algo así:</p>
<p>TEMP = A<br />
A = B<br />
B = TEMP</p>
<p>De esta manera tenemos un espacio de memoria extra donde guardar el valor de A, por lo tanto podemos destruir el contenido de A sin tentarnos nuestro corazoncillo. Y recuperarlo después del buffer temporal.</p>
<p>Ahora lo interesante: ¿Cómo se hace sin usar ninguna variable TEMP?</p>
<h2>La solución del matemático.</h2>
<p>Ahora si ustedes son de esas personas que saben un montón de matemáticas, pero jamas han programado de a de veras (¡Como los hombres!) podrían sugerir esta solución. (No se hagan se que por ahí hay muchísimos).</p>
<p>A = A + B<br />
B = A &#8211; B<br />
A = A &#8211; B</p>
<p>Ahora sabemos que ésta es un caso particular de una solución mas general.</p>
<ol>
<li>Combina los dos valores en la variable A por medio de una operación binaria bien portada (Es decir que sea invertible). En este momento en A están guardados de alguna manera los dos valores.</li>
<li>Usa la operación inversa de la operación binaria para extraer en la variable B el valor original de A a partir del valor actual de A. Recuerda que no hemos modificado B.</li>
<li>Usa la operación inversa para extraer ahora el viejo valor de B en A. Recordando que tenemos guardado en B el valor original de A.</li>
</ol>
<p>El fallo de la solución anterior es que trabajamos con maquinas de memoria finita, es decir podría pasar que la operación bien portada que es la suma produzca un número tan grande que no quepa en la localidad de memoria que le guardamos. ¿No se acuerdan del molesto carry cuando nos enseñaron la suma en binario y  hacer circuitos sumadores? Pues es aquí donde nos vino a fastidiar la vida.</p>
<h2>La solución del computólogo</h2>
<p>Tan simple, tan elegante, tan parecida a la solución del matemático XD (Por ahí dicen que es la misma por que los computologos y los matemáticos son casi lo mismo ). Pues resulta que hay mas de una operación bien portada y una que tiene todo lo que necesitamos es el XOR.</p>
<table>
<tr>
<th>x</th>
<th>y</th>
<th>x<img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus+&bg=FFFFFF&fg=000000'  alt="\oplus " />y</th>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
</table>
<p>¡Muérete de envidia suma! ¡El XOR es una suma sin carry vean la tabla!. ¿Suficiente? El XOR (conocido también en los bajos mundos de la lógica como <strong>disyunción exclusiva</strong>) es una de las operaciones que pueden construir toda la lógica de primer orden, además es conmutativo, asociativo y es su propio inverso. Pueden ver aquí la lista de <a href="http://en.wikipedia.org/wiki/Xor">todo lo bello que es el XOR</a>. Es mas: ¡XOR soy tu fan!</p>
<p>Es decir podemos usar el XOR que como no tiene carry y nunca se desborda para hacer</p>
<p>A = A <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus&bg=FFFFFF&fg=000000'  alt="\oplus" /> B<br />
B = B <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus&bg=FFFFFF&fg=000000'  alt="\oplus" /> A<br />
A = A <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5Coplus&bg=FFFFFF&fg=000000'  alt="\oplus" /> B</p>
<p>¿Mencione que es conmutativo y que es su propio inverso? Además que en todo lenguaje decente como en C y C++ y en algunos no decentes (Java <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) Tenemos un operador de XOR y tenemos una forma abreviada de hacer la asignación. ¿No me creen? Miren con sus propios ojos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
	<span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">4</span>, b <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Los valores son: a = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; b = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> b <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
	swap<span style="color: #008000;">&#40;</span>a, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Después del swap:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Los valores son: a = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; b = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> b <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> swap <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>a, <span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	a <span style="color: #000040;">^</span><span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
	b <span style="color: #000040;">^</span><span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
	a <span style="color: #000040;">^</span><span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Y para que no digan que no pelo a la banda Javera, tomen no se vallan a enojar.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestSwaping <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> a <span style="color: #339933;">=</span> <span style="color: #cc66cc;">4</span>, b <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Los valores son: a = &quot;</span> <span style="color: #339933;">+</span> a <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; b = &quot;</span> <span style="color: #339933;">+</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		a <span style="color: #339933;">^=</span> b<span style="color: #339933;">;</span>
		b <span style="color: #339933;">^=</span> a<span style="color: #339933;">;</span>
		a <span style="color: #339933;">^=</span> b<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Después del swap&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Los valores son: a = &quot;</span> <span style="color: #339933;">+</span> a <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; b = &quot;</span> <span style="color: #339933;">+</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mas información sobre la correctez y demás cosas de este truco esta en su <a href="http://en.wikipedia.org/wiki/XOR_swap_algorithm">pagina wikipedia</a>.<br />
﻿</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2011%2Fun-swap-sin-memoria-extra%2F&amp;t=Un%20swap%20sin%20memoria%20extra" id="facebook_share_icon_384" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	<!--
	var button = document.getElementById('facebook_share_link_384') || document.getElementById('facebook_share_icon_384') || document.getElementById('facebook_share_both_384') || document.getElementById('facebook_share_button_384');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_384') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	-->
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2011/un-swap-sin-memoria-extra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A brief history of Maths</title>
		<link>http://www.nemediano.com.mx/2009/a-brief-history-of-maths/</link>
		<comments>http://www.nemediano.com.mx/2009/a-brief-history-of-maths/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 19:29:38 +0000</pubDate>
		<dc:creator>nemediano</dc:creator>
				<category><![CDATA[Matematicas]]></category>
		<category><![CDATA[Mis demonios]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[historia]]></category>
		<category><![CDATA[matematicas]]></category>
		<category><![CDATA[presentacion]]></category>

		<guid isPermaLink="false">http://www.nemediano.com.mx/?p=256</guid>
		<description><![CDATA[Ayer presente para mi midterm exam, de mi clase de Producción Oral en ingles, una charla acerca de la historia de las matemáticas. Por un lado fue muy divertido para mi, la misma maestra nos había dicho que escogiéramos un tema de nuestro agrado. Sin embargo teníamos la limitante del tiempo: una presentación de 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer presente para mi <em>midterm exam</em>, de mi clase de Producción Oral en ingles, una charla acerca de la historia de las matemáticas.</p>
<p>Por un lado fue muy divertido para mi, la misma maestra nos había dicho que escogiéramos un tema de nuestro agrado. Sin embargo teníamos la limitante del tiempo: una presentación de 5 minutos. Al principio no me preocupo, finalmente uno dice muchas cosas muy rápido al hablar. Pero ayer que estaba haciendo la presentación me empecé a poner nervioso.</p>
<p><span id="more-256"></span></p>
<p>La cantidad de material que yo tenia era enorme; después de todo, al ser uno de mis temas favorito había consultado mas de 7 libros diferentes del tema. (si lo se, es mas de los que usualmente consulto para un trabajo de a de veras de la maestría) y la presentación que el principio pensé en hacer en <img style="border:0px;vertical-align:middle;" src='http://l.wordpress.com/latex.php?latex=%5CLaTeX&bg=FFFFFF&fg=000000'  alt="\LaTeX" /> beamer. Pero después de ver la enorme cantidad de información no me quedo mas remedio que usar Open Office Presentation.</p>
<p>Al terminar la presentación, decidí exportarla a pdf y ppt. Uno nunca sabe en que maquina va a presentar. Pero cuando me quedaron 25 diapositivas me <em>frikie</em> un poco.</p>
<p>Llego el lunes del examen, yo tenia mucho sueño pues no había dormido bien, y no había tenido tiempo de bañarme (estúpido posgrado que me deja sin tiempo <img src='http://www.nemediano.com.mx/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ). Se me olvidaron mis notas en casa y como de costumbre no tenia tiempo de regresar por ellas. Llegando al auditorio la maestra llego tarde y tardaron muchísimo en conectar el proyector y anexos. Finalmente la maestra pregunto si hacíamos un sorteo para determinar el orden de las presentaciones. Antes (o en vez) de hacer el sorteo nos pusimos de acuerdo: yo pedí el <strong>primer turno</strong>.</p>
<p>A principio <em>panique</em> un poco por que algunas palabras se me olvidaron y la verdad es que al improvisar tome mucho mas tiempo, creo que la presentación duro casi 10 minutos. Al momento de las preguntas ya estaba muy relajado y me tomo otro tanto contestar. Pero al final creo que la presentación salio bien, no se aburrieron mucho y <strong>Majo</strong> y <strong>Marco</strong> me dijeron después que había estado bien.</p>
<p>Durante la presentación deje muchos cabos sueltos con la esperanza de que me preguntaran de eso, pero no sucedió y al final las preguntas que me hicieron fueron sorpresivas. Pero pude contestar mas o menos bien. Por ejemplo deje en el aire la historia de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Galois" target="_blank">Galois</a>, la de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Ramanujan" target="_blank">Ramanujan</a>, la de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Paul_Erd%C5%91s" target="_blank">Erdos</a> y la de <a title="Wikipedia" href="http://en.wikipedia.org/wiki/Bourbaki" target="_blank">Nicolas Burbaki</a> (nadie me preguntó por que no existió).</p>
<p>Aquí esta la <a title="Mi presentacion en pdf" href="http://www.nemediano.com.mx/wp-content/uploads/2009/10/presentacion.pdf">presntacion</a> en pdf, por si a alguien le sirviera de algo. La maestra quedo de dar DVD con las presentaciones grabadas; si lo hace, quizás me anime a subir el vídeo.</p>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.nemediano.com.mx%2F2009%2Fa-brief-history-of-maths%2F&amp;t=A%20brief%20history%20of%20Maths" id="facebook_share_icon_256" style="font-size:11px; line-height:13px; font-family:'lucida grande',tahoma,verdana,arial,sans-serif; text-decoration:none;"><img src="http://b.static.ak.fbcdn.net/images/share/facebook_share_icon.gif" alt="Share on Facebook" /></a>
	<script type="text/javascript">
	<!--
	var button = document.getElementById('facebook_share_link_256') || document.getElementById('facebook_share_icon_256') || document.getElementById('facebook_share_both_256') || document.getElementById('facebook_share_button_256');
	if (button) {
		button.onclick = function(e) {
			var url = this.href.replace(/share\.php/, 'sharer.php');
			window.open(url,'sharer','toolbar=0,status=0,width=626,height=436');
			return false;
		}
	
		if (button.id === 'facebook_share_button_256') {
			button.onmouseover = function(){
				this.style.color='#fff';
				this.style.borderColor = '#295582';
				this.style.backgroundColor = '#3b5998';
			}
			button.onmouseout = function(){
				this.style.color = '#3b5998';
				this.style.borderColor = '#d8dfea';
				this.style.backgroundColor = '#fff';
			}
		}
	}
	-->
	</script>
	]]></content:encoded>
			<wfw:commentRss>http://www.nemediano.com.mx/2009/a-brief-history-of-maths/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

