Solved 64.

main
Felix Martin 2019-01-22 00:12:10 -05:00
parent 550a1479f0
commit b28b59fc7d
5 changed files with 12300 additions and 6 deletions

View File

@ -13,11 +13,61 @@
"collapsed": true
},
"source": [
"The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=89, is a ninth power.\n",
"The 5-digit number, 16807=$7^5$, is also a fifth power. Similarly, the 9-digit number, 134217728=$8^9$, is a ninth power.\n",
"\n",
"How many n-digit positive integers exist which are also an nth power?"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"def get_digit_count(n):\n",
" if n < 10:\n",
" return 1\n",
" c = 0\n",
" while n:\n",
" n //= 10\n",
" c += 1\n",
" return c\n",
"\n",
"assert(get_digit_count(0) == 1)\n",
"assert(get_digit_count(1) == 1)\n",
"assert(get_digit_count(33) == 2)\n",
"assert(get_digit_count(100) == 3)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"49\n"
]
}
],
"source": [
"def get_n_digit_positive_integers(n):\n",
" r = []\n",
" i = 1\n",
" while True:\n",
" if get_digit_count(i ** n) == n:\n",
" r.append(i ** n)\n",
" if get_digit_count(i ** n) > n:\n",
" return r\n",
" i += 1\n",
"\n",
"s = sum([len(get_n_digit_positive_integers(n)) for n in range(1, 1000)])\n",
"print(s)\n",
"assert(s == 49)"
]
},
{
"cell_type": "code",
"execution_count": null,
@ -29,7 +79,7 @@
}
],
"metadata": {
"completion_date": "",
"completion_date": "Sun, 6 Jan 2019, 06:17",
"kernelspec": {
"display_name": "Python 3",
"language": "python3.6",
@ -47,7 +97,9 @@
"pygments_lexer": "ipython3",
"version": "3.6.5"
},
"tags": []
"tags": [
"powers"
]
},
"nbformat": 4,
"nbformat_minor": 2

View File

@ -0,0 +1,213 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Odd period square roots (Euler Problem 64)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"[https://projecteuler.net/problem=64](https://projecteuler.net/problem=64)\n",
"\n",
"The first ten continued fraction representations of (irrational) square roots are:\n",
"\n",
"√2=[1;(2)], period=1\n",
"\n",
"√3=[1;(1,2)], period=2\n",
"\n",
"√5=[2;(4)], period=1\n",
"\n",
"√6=[2;(2,4)], period=2\n",
"\n",
"√7=[2;(1,1,1,4)], period=4\n",
"\n",
"√8=[2;(1,4)], period=2\n",
"\n",
"√10=[3;(6)], period=1\n",
"\n",
"√11=[3;(3,6)], period=2\n",
"\n",
"√12= [3;(2,6)], period=2\n",
"\n",
"√13=[3;(1,1,1,1,6)], period=5\n",
"\n",
"Exactly four continued fractions, for N ≤ 13, have an odd period.\n",
"\n",
"How many continued fractions for N ≤ 10000 have an odd period?"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import math\n",
"\n",
"def get_floor_sqrt(n):\n",
" return math.floor(math.sqrt(n))\n",
"\n",
"assert(get_floor_sqrt(5) == 2)\n",
"assert(get_floor_sqrt(23) == 4)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(3, 3, 2)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def next_expansion(current_a, current_nominator, current_denominator, original_number):\n",
" # Less typing\n",
" cn = current_nominator\n",
" cd = current_denominator\n",
"\n",
" # Step 1: Multiply the fraction so that we can use the third binomial formula.\n",
" # Make sure we can reduce the nominator.\n",
" assert((original_number - cd * cd) % cn == 0)\n",
" # The new nominator is the denominator since we multiply with (x + cd) and then\n",
" # reduce the previous nominator.\n",
" # The new denominator is calculated by applying the third binomial formula and\n",
" # then by divided by the previous nominator.\n",
" cn, cd = cd, (original_number - cd * cd) // cn\n",
" \n",
" # Step 2: Calculate the next a by finding the next floor square root.\n",
" next_a = math.floor((math.sqrt(original_number) + cn) // cd)\n",
" \n",
" # Step 3: Remove next a from the fraction by substracting it.\n",
" cn = cn - next_a * cd\n",
" cn *= -1\n",
" \n",
" return next_a, cn, cd\n",
"\n",
"next_expansion(1, 7, 3, 23)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def get_continued_fraction_sequence(n):\n",
" \n",
" # If number is a square number we return it.\n",
" floor_sqrt = get_floor_sqrt(n)\n",
" if n == floor_sqrt * floor_sqrt:\n",
" return ((floor_sqrt), [])\n",
" \n",
" # Otherwise, we calculate the next expansion till we\n",
" # encounter a step a second time. \n",
" a = floor_sqrt\n",
" cn = a\n",
" cd = 1\n",
" sequence = []\n",
" previous_steps = []\n",
" \n",
" while not (a, cn, cd) in previous_steps :\n",
" #print(\"a: {} cn: {} cd: {}\".format(a, cn, cd))\n",
" previous_steps.append((a, cn, cd))\n",
" a, cn, cd = next_expansion(a, cd, cn, n)\n",
" sequence.append(a)\n",
" sequence.pop()\n",
" return ((floor_sqrt), sequence)\n",
"\n",
"assert(get_continued_fraction_sequence(1) == ((1), []))\n",
"assert(get_continued_fraction_sequence(4) == ((2), []))\n",
"assert(get_continued_fraction_sequence(25) == ((5), []))\n",
"assert(get_continued_fraction_sequence(2) == ((1), [2]))\n",
"assert(get_continued_fraction_sequence(3) == ((1), [1,2]))\n",
"assert(get_continued_fraction_sequence(5) == ((2), [4]))\n",
"assert(get_continued_fraction_sequence(13) == ((3), [1,1,1,1,6]))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def get_period(n):\n",
" _, sequence = get_continued_fraction_sequence(n)\n",
" return len(sequence)\n",
"\n",
"assert(get_period(23) == 4)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1322\n"
]
}
],
"source": [
"s = len([n for n in range(1, 10001) if get_period(n) % 2 != 0])\n",
"print(s)\n",
"assert(s == 1322)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"completion_date": "Tue, 22 Jan 2019, 05:10",
"kernelspec": {
"display_name": "Python 3",
"language": "python3.6",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
},
"tags": [
"fractions",
"square roots",
"sequence",
"periodic"
]
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -11778,13 +11778,70 @@ div#notebook {
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=89, is a ninth power.</p>
<p>The 5-digit number, 16807=$7^5$, is also a fifth power. Similarly, the 9-digit number, 134217728=$8^9$, is a ninth power.</p>
<p>How many n-digit positive integers exist which are also an nth power?</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="k">def</span> <span class="nf">get_digit_count</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">&lt;</span> <span class="mi">10</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">1</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">n</span><span class="p">:</span>
<span class="n">n</span> <span class="o">//=</span> <span class="mi">10</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">c</span>
<span class="k">assert</span><span class="p">(</span><span class="n">get_digit_count</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">assert</span><span class="p">(</span><span class="n">get_digit_count</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">assert</span><span class="p">(</span><span class="n">get_digit_count</span><span class="p">(</span><span class="mi">33</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span>
<span class="k">assert</span><span class="p">(</span><span class="n">get_digit_count</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span>
</pre></div>
</div>
</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_n_digit_positive_integers</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">r</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">if</span> <span class="n">get_digit_count</span><span class="p">(</span><span class="n">i</span> <span class="o">**</span> <span class="n">n</span><span class="p">)</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span>
<span class="n">r</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span> <span class="o">**</span> <span class="n">n</span><span class="p">)</span>
<span class="k">if</span> <span class="n">get_digit_count</span><span class="p">(</span><span class="n">i</span> <span class="o">**</span> <span class="n">n</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">n</span><span class="p">:</span>
<span class="k">return</span> <span class="n">r</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">s</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="nb">len</span><span class="p">(</span><span class="n">get_n_digit_positive_integers</span><span class="p">(</span><span class="n">n</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">1</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)])</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</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="mi">49</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>49
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">In [ ]:</div>
<div class="inner_cell">
<div class="input_area">

File diff suppressed because it is too large Load Diff

View File

@ -993,12 +993,32 @@
</tr>
<tr class="table-warning">
<tr>
<td><a href="EulerProblem063.html">Problem 063</a></td>
<td></td>
<td>Sun, 6 Jan 2019, 06:17</td>
<td>
<kbd>powers</kbd>
</td>
</tr>
<tr>
<td><a href="EulerProblem064.html">Problem 064</a></td>
<td>Tue, 22 Jan 2019, 05:10</td>
<td>
<kbd>fractions</kbd>
<kbd>square roots</kbd>
<kbd>sequence</kbd>
<kbd>periodic</kbd>
</td>
</tr>