<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comentarios en: El Proyecto Euler: Problema 2</title>
	<atom:link href="http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2/feed" rel="self" type="application/rss+xml" />
	<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2</link>
	<description>Blog de Juan Pablo Ortiz Aréchiga</description>
	<pubDate>Thu, 20 Nov 2008 12:00:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
		<item>
		<title>Por: pablasso</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43622</link>
		<dc:creator>pablasso</dc:creator>
		<pubDate>Sat, 31 May 2008 13:21:57 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43622</guid>
		<description>@Michoacano ¿Que es obvio? ¿Que es facil? Todo es relativo mi querido michoacas. Muchas gracias por el código!

@xiam Relacion recursiva mmm ciertamente el poco matemático que llevo dentro de mi no hubiera llegado a ella.

@izaac Muy interesante tus soluciones de Python, supongo que mientras mas grande el rango mas te beneficias de xrange porque siempre utiliza la misma memoria.

@Yeru Aaaamén.

@mamasan Este emo se va a ver a Radiohead en 10 dias y no llevara a mamasan :D</description>
		<content:encoded><![CDATA[<p>@Michoacano ¿Que es obvio? ¿Que es facil? Todo es relativo mi querido michoacas. Muchas gracias por el código!</p>
<p>@xiam Relacion recursiva mmm ciertamente el poco matemático que llevo dentro de mi no hubiera llegado a ella.</p>
<p>@izaac Muy interesante tus soluciones de Python, supongo que mientras mas grande el rango mas te beneficias de xrange porque siempre utiliza la misma memoria.</p>
<p>@Yeru Aaaamén.</p>
<p>@mamasan Este emo se va a ver a Radiohead en 10 dias y no llevara a mamasan :D</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: tu papa mamasan</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43618</link>
		<dc:creator>tu papa mamasan</dc:creator>
		<pubDate>Fri, 30 May 2008 23:10:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43618</guid>
		<description>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
zzzzzz
zzzzzzzzzzzzzzz
zzzzzzzzzzzzzzzzzz
zzzzz
zzzz

ha si...

pablasso es emo!</description>
		<content:encoded><![CDATA[<p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz<br />
zzzzzz<br />
zzzzzzzzzzzzzzz<br />
zzzzzzzzzzzzzzzzzz<br />
zzzzz<br />
zzzz</p>
<p>ha si&#8230;</p>
<p>pablasso es emo!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Yeru</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43597</link>
		<dc:creator>Yeru</dc:creator>
		<pubDate>Mon, 26 May 2008 15:39:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43597</guid>
		<description>XD ese problema me lo colocaron en el primer año de la carrera! Para ese tiempo la verdad que yo lo vi extremadamente dificil!!!!! Y estoy de acuerdo contigo.. Hay muchas maneras de llegar a Roma realmente jejeje.. Luego optimizas.. Ahora bien... Si puedes hacerlo optimo a la primera entonces bien felicidades... Saludos!</description>
		<content:encoded><![CDATA[<p>XD ese problema me lo colocaron en el primer año de la carrera! Para ese tiempo la verdad que yo lo vi extremadamente dificil!!!!! Y estoy de acuerdo contigo.. Hay muchas maneras de llegar a Roma realmente jejeje.. Luego optimizas.. Ahora bien&#8230; Si puedes hacerlo optimo a la primera entonces bien felicidades&#8230; Saludos!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: Michoacano</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43596</link>
		<dc:creator>Michoacano</dc:creator>
		<pubDate>Sun, 25 May 2008 22:18:13 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43596</guid>
		<description>Ahi va mi solución 

http://pastebin.com/m51e96ae1

&lt;pre lang="c" line="1"&gt;
#include &lt;stdio.h&gt;
 
main()
{
    int  a = 1, b = 2, c = 0;
    int sum=b;
 
   do 
    {
          sum += c;
          c=3*b+2*a;
          a=2*b +a;
          b=c;
    }while ( c &lt; 4000000 );
 
    printf("resultado: %d\n", sum);
    return 0;
}
&lt;/pre&gt;

Explico:

a=1 
b=2
sum=2;

como dije no hace falta calcular los impares, pero no quiere decir que no los ocupemos.
el siguiente numero es el 3 y se calcula c= a+b =3;
pero yo no quiero el 3, quiero el 8, entonces calculo el siguiente del siguiente.

c= (a+b) +((a+b)+b);
...factorizamos;
c=b+b+b+a+a;
c=3b+2a; &#60;-----Siguiente número par;
y al anterior que es a.
a=((a+b)+b);
a=2b+a;&#60;-----Anterior.

Entonces nos ahorramos 2/3 de las iterraciones, y solamente calculamos los pares(aun asi como que tengo una espinita que se puede mejorar mas). 

Lo de resolver el problema mas optimo o no, pues en este y en el anterior problema realmente ami manera de ver, cualquier chavo de prepa que estudie programacion los puede hacer, por eso digo que tiene mas merito proponer una solucion optima que la mas obvia y que cuando ves el problema es la primera que se te viene a la mente, que ni siquiera hace falta programarla para saber que estas bien.

Conozco estos restos y conforme avanzas ,  los problemas son tan dificiles que ahora si encontrar la solución es lo que vale la pena.

Digo, ami no se me hace dificil sumar dos numeros y comprobar si son par.</description>
		<content:encoded><![CDATA[<p>Ahi va mi solución </p>
<p><a href="http://pastebin.com/m51e96ae1" rel="nofollow">http://pastebin.com/m51e96ae1</a></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
</pre></td><td class="code"><pre class="c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #993333;">int</span>  a <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, b <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span>, c <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;
    <span style="color: #993333;">int</span> sum<span style="color: #66cc66;">=</span>b;
&nbsp;
   <span style="color: #b1b100;">do</span> 
    <span style="color: #66cc66;">&#123;</span>
          sum <span style="color: #66cc66;">+=</span> c;
          c<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">*</span>b<span style="color: #cc66cc;">+2</span><span style="color: #66cc66;">*</span>a;
          a<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">*</span>b <span style="color: #66cc66;">+</span>a;
          b<span style="color: #66cc66;">=</span>c;
    <span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span> c &lt; <span style="color: #cc66cc;">4000000</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;resultado: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, sum<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Explico:</p>
<p>a=1<br />
b=2<br />
sum=2;</p>
<p>como dije no hace falta calcular los impares, pero no quiere decir que no los ocupemos.<br />
el siguiente numero es el 3 y se calcula c= a+b =3;<br />
pero yo no quiero el 3, quiero el 8, entonces calculo el siguiente del siguiente.</p>
<p>c= (a+b) +((a+b)+b);<br />
&#8230;factorizamos;<br />
c=b+b+b+a+a;<br />
c=3b+2a; &lt;&#8212;&#8211;Siguiente número par;<br />
y al anterior que es a.<br />
a=((a+b)+b);<br />
a=2b+a;&lt;&#8212;&#8211;Anterior.</p>
<p>Entonces nos ahorramos 2/3 de las iterraciones, y solamente calculamos los pares(aun asi como que tengo una espinita que se puede mejorar mas). </p>
<p>Lo de resolver el problema mas optimo o no, pues en este y en el anterior problema realmente ami manera de ver, cualquier chavo de prepa que estudie programacion los puede hacer, por eso digo que tiene mas merito proponer una solucion optima que la mas obvia y que cuando ves el problema es la primera que se te viene a la mente, que ni siquiera hace falta programarla para saber que estas bien.</p>
<p>Conozco estos restos y conforme avanzas ,  los problemas son tan dificiles que ahora si encontrar la solución es lo que vale la pena.</p>
<p>Digo, ami no se me hace dificil sumar dos numeros y comprobar si son par.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: izaac</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43595</link>
		<dc:creator>izaac</dc:creator>
		<pubDate>Sun, 25 May 2008 19:22:39 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43595</guid>
		<description>Si, las llamadas a función son costosas, sobre todo en Python que no se han optimizado las llamadas recursivas (preferible usar generators); así como también las comparaciones que Michoacano propone para excluír numeros impares.

Además quiero refutar mi propia teoría usando itertools, utilizando profile pude bajar el tiempo bajar a la mitad el tiempo de ejecución:

De 0.018 a 0.009 segundos, usando el primer código del primer post que amablemente Juan Pablo coloreó, pero utilizando xrange(). Principalmente porque se reducen las llamadas a métodos de 28 a 15 (restando las utilizadas para el profiling).

Además utilizando pyrex para generar código para el Python C API se reduce a 0.008 pero el código es idéntico al de Juan Pablo con lo cual sólo hace dos llamadas a métodos.

Aún así la respuesta más simple, casi siempre es la más acertada, por lo tanto el código de Pablo debe ser mucho más rápido por ser ANSI C y no depender de algún intérprete. Pero creo que es el approach adecuado.</description>
		<content:encoded><![CDATA[<p>Si, las llamadas a función son costosas, sobre todo en Python que no se han optimizado las llamadas recursivas (preferible usar generators); así como también las comparaciones que Michoacano propone para excluír numeros impares.</p>
<p>Además quiero refutar mi propia teoría usando itertools, utilizando profile pude bajar el tiempo bajar a la mitad el tiempo de ejecución:</p>
<p>De 0.018 a 0.009 segundos, usando el primer código del primer post que amablemente Juan Pablo coloreó, pero utilizando xrange(). Principalmente porque se reducen las llamadas a métodos de 28 a 15 (restando las utilizadas para el profiling).</p>
<p>Además utilizando pyrex para generar código para el Python C API se reduce a 0.008 pero el código es idéntico al de Juan Pablo con lo cual sólo hace dos llamadas a métodos.</p>
<p>Aún así la respuesta más simple, casi siempre es la más acertada, por lo tanto el código de Pablo debe ser mucho más rápido por ser ANSI C y no depender de algún intérprete. Pero creo que es el approach adecuado.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: xiam</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43589</link>
		<dc:creator>xiam</dc:creator>
		<pubDate>Sun, 25 May 2008 14:50:46 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43589</guid>
		<description>Bueno, claro que como el problema tiene solución constante, la solución mas óptima es:

&lt;pre lang="c" line="1"&gt;
#include &lt;stdio.h&gt;
int main() {
  printf("%ld\n", 4613732);
}
&lt;/pre&gt;

Sin tantos rodeos &#62;:-)</description>
		<content:encoded><![CDATA[<p>Bueno, claro que como el problema tiene solución constante, la solución mas óptima es:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000066;">printf</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%ld<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #cc66cc;">4613732</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Sin tantos rodeos &gt;:-)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: xiam</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43588</link>
		<dc:creator>xiam</dc:creator>
		<pubDate>Sun, 25 May 2008 14:37:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43588</guid>
		<description>Totalmente de acuerdo con pablasso, es mejor pensar y resolver el problema, luego optimizar en caso de que se necesite.

Pero por otro lado:

@Michoacano, 
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887

Esos son los números de la secuencia, creo que optimizar 36 condiciones no haría tu programa más rápido de lo que ya es.

Te sugiero que observes 2, 8, 34, 144, 610, 2584, 10946... el patrón es (comenzando con el 2), un número par seguido de dos impares. O lo que es lo mismo, un par cada posición divisible por 3 (comenzando en 1). La forma "óptima" de resolverlo, la forma matemática, sería primero definiendo la función f como:

f(1) = 1, f(2) =1, f(n) = f(n-1) + f(n-2)

Después iterando naturales de la forma 3k, comenzando con 1 y mientras f(3k) &#60; 4000000 que no se cual k corresponda pero debe ser como ~10.

Esa es la solución matemática mas "limpia" que se me ocurre y la baso en que el patrón que observamos en el que cada f(3k) es par, sin embargo, para computación la recursión es cara y sería más lenta en éste caso. La optimización en el programa de pablasso sería cambiar la c%2 por un i%3 donde i es entero, es un módulo a un número más pequeño y practicamente no tendría diferencia en velocidad.

Lo de f(3k) es verdadero y se puede demostrar por inducción. Como es parte de mi carrera y además me gustan mucho esas ñoñerías, lo acabo de demostrar en papel, si alguien está interesado en los detalles de la demostración podría transcribirla ya que no es muy larga.</description>
		<content:encoded><![CDATA[<p>Totalmente de acuerdo con pablasso, es mejor pensar y resolver el problema, luego optimizar en caso de que se necesite.</p>
<p>Pero por otro lado:</p>
<p>@Michoacano,<br />
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887</p>
<p>Esos son los números de la secuencia, creo que optimizar 36 condiciones no haría tu programa más rápido de lo que ya es.</p>
<p>Te sugiero que observes 2, 8, 34, 144, 610, 2584, 10946&#8230; el patrón es (comenzando con el 2), un número par seguido de dos impares. O lo que es lo mismo, un par cada posición divisible por 3 (comenzando en 1). La forma &#8220;óptima&#8221; de resolverlo, la forma matemática, sería primero definiendo la función f como:</p>
<p>f(1) = 1, f(2) =1, f(n) = f(n-1) + f(n-2)</p>
<p>Después iterando naturales de la forma 3k, comenzando con 1 y mientras f(3k) &lt; 4000000 que no se cual k corresponda pero debe ser como ~10.</p>
<p>Esa es la solución matemática mas &#8220;limpia&#8221; que se me ocurre y la baso en que el patrón que observamos en el que cada f(3k) es par, sin embargo, para computación la recursión es cara y sería más lenta en éste caso. La optimización en el programa de pablasso sería cambiar la c%2 por un i%3 donde i es entero, es un módulo a un número más pequeño y practicamente no tendría diferencia en velocidad.</p>
<p>Lo de f(3k) es verdadero y se puede demostrar por inducción. Como es parte de mi carrera y además me gustan mucho esas ñoñerías, lo acabo de demostrar en papel, si alguien está interesado en los detalles de la demostración podría transcribirla ya que no es muy larga.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: izaac</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43587</link>
		<dc:creator>izaac</dc:creator>
		<pubDate>Sat, 24 May 2008 06:59:29 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43587</guid>
		<description>Usando puros built-ins (más rápido), con ayuda de itertools:

&lt;pre lang="python" line="1"&gt;
def fibpairs():
    a, b = 1, 2
    while True:
        a, b = b, a + b
        if a%2 == 0:
            yield a
        else:
            continue

if __name__ == '__main__':
    import itertools
    l = list(itertools.takewhile(lambda x: x &lt; 4000000, fibpairs()))
    print sum(l)
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>Usando puros built-ins (más rápido), con ayuda de itertools:</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
</pre></td><td class="code"><pre class="python"><span style="color: #ff7700;font-weight:bold;">def</span> fibpairs<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    a, b = <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
        a, b = b, a + b
        <span style="color: #ff7700;font-weight:bold;">if</span> a<span style="color: #66cc66;">%</span><span style="color: #ff4500;">2</span> == <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">yield</span> a
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">itertools</span>
    l = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">itertools</span>.<span style="color: black;">takewhile</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> x: x <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">4000000</span>, fibpairs<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">sum</span><span style="color: black;">&#40;</span>l<span style="color: black;">&#41;</span></pre></td></tr></table></div>

]]></content:encoded>
	</item>
	<item>
		<title>Por: pablasso</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43582</link>
		<dc:creator>pablasso</dc:creator>
		<pubDate>Fri, 23 May 2008 08:27:22 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43582</guid>
		<description>@Michoacano Gracias por la opinión, yo lo veo mas como que hay cientos de formas de llegar a Roma, me da igual el orden de los factores, resolver, luego optimizar. Al final pongo las conclusiones.

La cosa es solucionar el problema en menos del tiempo que establecen en el proyecto (y si una solución en 1 milésima de segundo con las condiciones del problema, vamos, mala no es), y entonces puedo optimizarlo para situaciones extremas.

En fin, cualquier punto de vista es válido :-)

@izaac Gracias por la versión pythonesca, te lo pongo con las tags correctas para código (pre con atributos lang)</description>
		<content:encoded><![CDATA[<p>@Michoacano Gracias por la opinión, yo lo veo mas como que hay cientos de formas de llegar a Roma, me da igual el orden de los factores, resolver, luego optimizar. Al final pongo las conclusiones.</p>
<p>La cosa es solucionar el problema en menos del tiempo que establecen en el proyecto (y si una solución en 1 milésima de segundo con las condiciones del problema, vamos, mala no es), y entonces puedo optimizarlo para situaciones extremas.</p>
<p>En fin, cualquier punto de vista es válido :-)</p>
<p>@izaac Gracias por la versión pythonesca, te lo pongo con las tags correctas para código (pre con atributos lang)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Por: izaac</title>
		<link>http://www.pablasso.com/2008/05/22/el-proyecto-euler-problema-2#comment-43581</link>
		<dc:creator>izaac</dc:creator>
		<pubDate>Fri, 23 May 2008 03:22:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.pablasso.com/?p=448#comment-43581</guid>
		<description>Mejor un paste:

http://dpaste.com/hold/52192/</description>
		<content:encoded><![CDATA[<p>Mejor un paste:</p>
<p><a href="http://dpaste.com/hold/52192/" rel="nofollow">http://dpaste.com/hold/52192/</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>
