Finished 27 in ipython. Very nice one to be honest. Fuck yeah.
This commit is contained in:
@@ -192,21 +192,91 @@ div#notebook {
|
||||
<p>where |n| is the modulus/absolute value of n e.g. |11|=11 and |−4|=4.</p>
|
||||
<p>Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n=0.</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, bruteforcing this complete thing is definitely hard. The interesting thing is that euler provided two examples. If we calculate the primes for both terms we see that there is a certain overlap. This indicates that there is a relation between the two. Sure enough if we put $n-40$ into the first term we get the following.</p>
|
||||
<p>$(n - 40)^2 + (n - 40) + 41 = n^2 - 80n + 1600 + n - 40 + 41 = n^2 - 79n +1601$</p>
|
||||
<p>Let's assume that all incredible formulas can be derived by inserting $(n - p)$ into the formula. Of course, what ever value we choose for p the resulting terms must not exceed the boundaries for a or b. We calculate the boundaries.</p>
|
||||
<p>$(n-p)^2 + (n-p) + 41 = n^2 + n(-2p + 1) + p^2 - p + 41$</p>
|
||||
<p>Where $(-2p + 1) = a$ and $p^2 -p + 41 = b$. We can now calulate the bounds for a:</p>
|
||||
<p>$-2p + 1 > -1000 \rightarrow p < 500.5$</p>
|
||||
<p>$-2 p + 1 < 1000 \rightarrow p > -499.5$</p>
|
||||
<p>And b:</p>
|
||||
<p>$p^2 - p + 41 <= 1000$</p>
|
||||
<p>$-30.472 < p < 31.472$</p>
|
||||
<p>$p^2 - p + 41 >= 1000$ True for $\forall p \in \mathbb{N}$</p>
|
||||
<p>So now we only have to check for the values p in range(-30, 32). Alternatively, for the example $p = 40$ was used, maybe the next smaller value $p = 31$ yields the correct solution:</p>
|
||||
<p>$s = a\times b = (-2 * 31 + 1) * (31^2 - 31 + 41) = -61 \times 971 = -59231$</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cell border-box-sizing code_cell rendered">
|
||||
<div class="input">
|
||||
<div class="prompt input_prompt">In [ ]:</div>
|
||||
<div class="prompt input_prompt">In [1]:</div>
|
||||
<div class="inner_cell">
|
||||
<div class="input_area">
|
||||
<div class=" highlight hl-ipython3"><pre><span></span>
|
||||
<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">lru_cache</span>
|
||||
|
||||
<span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</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="k">if</span> <span class="n">n</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
|
||||
<span class="k">return</span> <span class="kc">False</span>
|
||||
<span class="kn">from</span> <span class="nn">math</span> <span class="k">import</span> <span class="n">sqrt</span>
|
||||
<span class="k">for</span> <span class="n">s</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="nb">int</span><span class="p">(</span><span class="n">sqrt</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</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">assert</span><span class="p">(</span><span class="n">is_prime</span><span class="p">(</span><span class="mi">41</span><span class="p">)</span> <span class="o">==</span> <span class="kc">True</span><span class="p">)</span>
|
||||
|
||||
<span class="k">def</span> <span class="nf">get_quadratic</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">p</span><span class="p">):</span>
|
||||
<span class="k">return</span> <span class="n">n</span><span class="o">*</span><span class="n">n</span> <span class="o">+</span> <span class="n">n</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">p</span><span class="o">*</span><span class="n">p</span> <span class="o">-</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">41</span>
|
||||
|
||||
<span class="n">n_max</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="n">p_max</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
|
||||
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="mi">30</span><span class="p">,</span> <span class="mi">32</span><span class="p">):</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">0</span><span class="p">,</span> <span class="mi">10000</span><span class="p">):</span>
|
||||
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_prime</span><span class="p">(</span><span class="n">get_quadratic</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">p</span><span class="p">))</span> <span class="ow">and</span> <span class="n">n</span> <span class="o">></span> <span class="n">n_max</span><span class="p">:</span>
|
||||
<span class="n">n_max</span> <span class="o">=</span> <span class="n">n</span>
|
||||
<span class="n">p_max</span> <span class="o">=</span> <span class="n">p</span>
|
||||
<span class="k">break</span>
|
||||
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="n">p_max</span>
|
||||
<span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="mi">2</span> <span class="o">*</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="n">p</span> <span class="o">-</span> <span class="n">p</span> <span class="o">+</span> <span class="mi">41</span><span class="p">)</span>
|
||||
<span class="k">assert</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="o">-</span><span class="mi">59231</span><span class="p">)</span>
|
||||
<span class="n">s</span>
|
||||
</pre></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="output_wrapper">
|
||||
<div class="output">
|
||||
|
||||
|
||||
<div class="output_area"><div class="prompt output_prompt">Out[1]:</div>
|
||||
|
||||
|
||||
<div class="output_text output_subarea output_execute_result">
|
||||
<pre>-59231</pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -24,13 +24,91 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"collapsed": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
"source": [
|
||||
"Okay, bruteforcing this complete thing is definitely hard. The interesting thing is that euler provided two examples. If we calculate the primes for both terms we see that there is a certain overlap. This indicates that there is a relation between the two. Sure enough if we put $n-40$ into the first term we get the following.\n",
|
||||
"\n",
|
||||
"$(n - 40)^2 + (n - 40) + 41 = n^2 - 80n + 1600 + n - 40 + 41 = n^2 - 79n +1601$\n",
|
||||
"\n",
|
||||
"Let's assume that all incredible formulas can be derived by inserting $(n - p)$ into the formula. Of course, what ever value we choose for p the resulting terms must not exceed the boundaries for a or b. We calculate the boundaries.\n",
|
||||
"\n",
|
||||
"$(n-p)^2 + (n-p) + 41 = n^2 + n(-2p + 1) + p^2 - p + 41$\n",
|
||||
"\n",
|
||||
"Where $(-2p + 1) = a$ and $p^2 -p + 41 = b$. We can now calulate the bounds for a:\n",
|
||||
"\n",
|
||||
"$-2p + 1 > -1000 \\rightarrow p < 500.5$\n",
|
||||
"\n",
|
||||
"$-2 p + 1 < 1000 \\rightarrow p > -499.5$\n",
|
||||
"\n",
|
||||
"And b:\n",
|
||||
"\n",
|
||||
"$p^2 - p + 41 <= 1000$\n",
|
||||
"\n",
|
||||
"$-30.472 < p < 31.472$\n",
|
||||
"\n",
|
||||
"$p^2 - p + 41 >= 1000$ True for $\\forall p \\in \\mathbb{N}$\n",
|
||||
"\n",
|
||||
"So now we only have to check for the values p in range(-30, 32). Alternatively, for the example $p = 40$ was used, maybe the next smaller value $p = 31$ yields the correct solution:\n",
|
||||
"\n",
|
||||
"$s = a\\times b = (-2 * 31 + 1) * (31^2 - 31 + 41) = -61 \\times 971 = -59231$"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"collapsed": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"-59231"
|
||||
]
|
||||
},
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from functools import lru_cache\n",
|
||||
"\n",
|
||||
"@lru_cache(maxsize=1000)\n",
|
||||
"def is_prime(n):\n",
|
||||
" if n < 2:\n",
|
||||
" return False\n",
|
||||
" from math import sqrt\n",
|
||||
" for s in range(2, int(sqrt(n) + 1)):\n",
|
||||
" if n % s == 0:\n",
|
||||
" return False\n",
|
||||
" if s * s > n:\n",
|
||||
" return True\n",
|
||||
" return True\n",
|
||||
" \n",
|
||||
"assert(is_prime(41) == True)\n",
|
||||
"\n",
|
||||
"def get_quadratic(n, p):\n",
|
||||
" return n*n + n * (-2* p + 1) + p*p - p + 41\n",
|
||||
"\n",
|
||||
"n_max = 0\n",
|
||||
"p_max = 0\n",
|
||||
"\n",
|
||||
"for p in range(-30, 32):\n",
|
||||
" for n in range(0, 10000):\n",
|
||||
" if not is_prime(get_quadratic(n, p)) and n > n_max:\n",
|
||||
" n_max = n\n",
|
||||
" p_max = p\n",
|
||||
" break\n",
|
||||
"\n",
|
||||
"p = p_max\n",
|
||||
"s = (-2 * p + 1) * (p*p - p + 41)\n",
|
||||
"assert(s == -59231)\n",
|
||||
"s"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
@@ -53,7 +131,10 @@
|
||||
"version": "3.5.4"
|
||||
},
|
||||
"tags": [
|
||||
"quadratic primes"
|
||||
"quadratic",
|
||||
"primes",
|
||||
"formula",
|
||||
"brain"
|
||||
]
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -414,7 +414,13 @@
|
||||
<td><a href="EulerProblem027.html">Problem 027</a></td>
|
||||
<td>
|
||||
|
||||
<kbd>quadratic primes</kbd>
|
||||
<kbd>quadratic</kbd>
|
||||
|
||||
<kbd>primes</kbd>
|
||||
|
||||
<kbd>formula</kbd>
|
||||
|
||||
<kbd>brain</kbd>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user