Did problem 11 in ipython.
This commit is contained in:
@@ -183,7 +183,179 @@ div#notebook {
|
||||
</div>
|
||||
<div class="inner_cell">
|
||||
<div class="text_cell_render border-box-sizing rendered_html">
|
||||
<h1 id="Euler-Problem-10">Euler Problem 10<a class="anchor-link" href="#Euler-Problem-10">¶</a></h1>
|
||||
<h1 id="Euler-Problem-10">Euler Problem 10<a class="anchor-link" href="#Euler-Problem-10">¶</a></h1><p>The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.</p>
|
||||
<p>Find the sum of all the primes below two million.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cell border-box-sizing text_cell rendered">
|
||||
<div class="prompt input_prompt">
|
||||
</div>
|
||||
<div class="inner_cell">
|
||||
<div class="text_cell_render border-box-sizing rendered_html">
|
||||
<p>Okay, reuse prime generator from 7 and go.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cell border-box-sizing code_cell rendered">
|
||||
<div class="input">
|
||||
<div class="prompt input_prompt">In [1]:</div>
|
||||
<div class="inner_cell">
|
||||
<div class="input_area">
|
||||
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">timeit</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">is_prime</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">smaller_primes</span><span class="p">):</span>
|
||||
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">smaller_primes</span><span class="p">:</span>
|
||||
<span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">s</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="kc">False</span>
|
||||
<span class="k">if</span> <span class="n">s</span> <span class="o">*</span> <span class="n">s</span> <span class="o">></span> <span class="n">n</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="kc">True</span>
|
||||
<span class="k">return</span> <span class="kc">True</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">prime_generator_function</span><span class="p">():</span>
|
||||
<span class="n">primes</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span>
|
||||
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">primes</span><span class="p">:</span>
|
||||
<span class="k">yield</span> <span class="n">p</span>
|
||||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||||
<span class="n">p</span> <span class="o">+=</span> <span class="mi">2</span>
|
||||
<span class="k">if</span> <span class="n">is_prime</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">primes</span><span class="p">):</span>
|
||||
<span class="n">primes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
|
||||
<span class="k">yield</span> <span class="n">p</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">brute_force</span><span class="p">():</span>
|
||||
<span class="n">ps</span> <span class="o">=</span> <span class="n">prime_generator_function</span><span class="p">()</span>
|
||||
<span class="n">s</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">ps</span><span class="p">)</span>
|
||||
<span class="k">while</span> <span class="n">p</span> <span class="o"><</span> <span class="mi">2000000</span><span class="p">:</span>
|
||||
<span class="n">s</span> <span class="o">+=</span> <span class="n">p</span>
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">ps</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">s</span>
|
||||
|
||||
<span class="nb">print</span><span class="p">(</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="n">brute_force</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span>
|
||||
<span class="k">assert</span><span class="p">(</span><span class="n">brute_force</span><span class="p">()</span> <span class="o">==</span> <span class="mi">142913828922</span><span class="p">)</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="n">brute_force</span><span class="p">())</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="output_wrapper">
|
||||
<div class="output">
|
||||
|
||||
|
||||
<div class="output_area"><div class="prompt"></div>
|
||||
<div class="output_subarea output_stream output_stdout output_text">
|
||||
<pre>61.8695481220002
|
||||
142913828922
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="cell border-box-sizing text_cell rendered">
|
||||
<div class="prompt input_prompt">
|
||||
</div>
|
||||
<div class="inner_cell">
|
||||
<div class="text_cell_render border-box-sizing rendered_html">
|
||||
<p>Okay, here it may actually be way smarter to use a sieve. We implent it because the old one was shitty. Okay, I am actually interested in the time difference. So we use the old one first and then implement the optimization.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cell border-box-sizing code_cell rendered">
|
||||
<div class="input">
|
||||
<div class="prompt input_prompt">In [2]:</div>
|
||||
<div class="inner_cell">
|
||||
<div class="input_area">
|
||||
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">get_primes_smaller</span><span class="p">(</span><span class="n">number</span><span class="p">):</span>
|
||||
<span class="n">primes</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
<span class="n">prospects</span> <span class="o">=</span> <span class="p">[</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">number</span><span class="p">)]</span>
|
||||
<span class="k">while</span> <span class="n">prospects</span><span class="p">:</span>
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="n">prospects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="n">prospects</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">prospects</span> <span class="k">if</span> <span class="n">x</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">]</span>
|
||||
<span class="n">primes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
|
||||
<span class="k">return</span> <span class="n">primes</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">brute_force</span><span class="p">():</span>
|
||||
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">get_primes_smaller</span><span class="p">(</span><span class="mi">2000000</span><span class="p">))</span>
|
||||
|
||||
<span class="c1">#print(timeit.timeit(brute_force, number=1))</span>
|
||||
<span class="c1">#print(brute_force())</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="cell border-box-sizing text_cell rendered">
|
||||
<div class="prompt input_prompt">
|
||||
</div>
|
||||
<div class="inner_cell">
|
||||
<div class="text_cell_render border-box-sizing rendered_html">
|
||||
<p>This did not even terminate. We optimize the sieve by stopping when $p^2 > number$.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cell border-box-sizing code_cell rendered">
|
||||
<div class="input">
|
||||
<div class="prompt input_prompt">In [3]:</div>
|
||||
<div class="inner_cell">
|
||||
<div class="input_area">
|
||||
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">sieve_of_eratosthenes</span><span class="p">(</span><span class="n">number</span><span class="p">):</span>
|
||||
<span class="n">primes</span> <span class="o">=</span> <span class="p">[]</span>
|
||||
<span class="n">prospects</span> <span class="o">=</span> <span class="p">[</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">number</span><span class="p">)]</span>
|
||||
<span class="k">while</span> <span class="n">prospects</span><span class="p">:</span>
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="n">prospects</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||||
<span class="n">prospects</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">prospects</span> <span class="k">if</span> <span class="n">x</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">]</span>
|
||||
<span class="n">primes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
|
||||
<span class="k">if</span> <span class="n">p</span> <span class="o">*</span> <span class="n">p</span> <span class="o">></span> <span class="n">number</span><span class="p">:</span>
|
||||
<span class="k">break</span>
|
||||
<span class="k">return</span> <span class="n">primes</span> <span class="o">+</span> <span class="n">prospects</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">brute_force</span><span class="p">():</span>
|
||||
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">sieve_of_eratosthenes</span><span class="p">(</span><span class="mi">2000000</span><span class="p">))</span>
|
||||
|
||||
<span class="k">assert</span><span class="p">(</span><span class="n">sieve_of_eratosthenes</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="o">==</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,])</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="n">brute_force</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span>
|
||||
<span class="k">assert</span><span class="p">(</span><span class="n">brute_force</span><span class="p">()</span> <span class="o">==</span> <span class="mi">142913828922</span><span class="p">)</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="n">brute_force</span><span class="p">())</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="output_wrapper">
|
||||
<div class="output">
|
||||
|
||||
|
||||
<div class="output_area"><div class="prompt"></div>
|
||||
<div class="output_subarea output_stream output_stdout output_text">
|
||||
<pre>74.5315607270004
|
||||
142913828922
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="cell border-box-sizing text_cell rendered">
|
||||
<div class="prompt input_prompt">
|
||||
</div>
|
||||
<div class="inner_cell">
|
||||
<div class="text_cell_render border-box-sizing rendered_html">
|
||||
<p>Okay, I honestly did not expect this to be slower than our generator. Gotta keep that in mind for future prime related problems.</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user