Solved 3 and fixed bug in publish script.

This commit is contained in:
2018-02-02 10:05:12 +01:00
parent 142b4f74cf
commit 1da214e4e9
3 changed files with 439 additions and 1 deletions

File diff suppressed because one or more lines are too long

View File

@@ -11,6 +11,110 @@
"What is the largest prime factor of the number 600851475143?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We start by writing a function which calculates all primes till a certain value using the Sieve of Eratosthenes."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def get_primes_smaller(number):\n",
" primes = []\n",
" prospects = [n for n in range(2, number)]\n",
" while prospects:\n",
" p = prospects[0]\n",
" prospects = [x for x in prospects if x % p != 0]\n",
" primes.append(p)\n",
" return primes\n",
"\n",
"assert(get_primes_smaller(0) == [])\n",
"assert(get_primes_smaller(10) == [2, 3, 5, 7,])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we create a function which does prime factorization. It is very important that we only test primes smaller than the squre root. Otherwise the complexity becomes too big."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import math\n",
"\n",
"def get_prime_factors(number):\n",
" possible_factors = get_primes_smaller(math.ceil(math.sqrt(number)))\n",
" remainder = number\n",
" factors = []\n",
" for p in possible_factors:\n",
" while remainder % p == 0:\n",
" remainder /= p\n",
" factors.append(p)\n",
" if remainder == 1:\n",
" break\n",
" if remainder != 1:\n",
" factors.append(remainder)\n",
" return factors\n",
"\n",
"assert(get_prime_factors(7) == [7])\n",
"assert(get_prime_factors(12) == [2, 2, 3]) \n",
"assert(get_prime_factors(88) == [2, 2, 2, 11]) \n",
"assert(get_prime_factors(13195) == [5, 7, 13, 29])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can go ahead an brute force the solution."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6857\n"
]
}
],
"source": [
"def get_largest_prime(number):\n",
" return get_prime_factors(number)[-1]\n",
"\n",
"assert(get_largest_prime(13195) == 29)\n",
"print(get_largest_prime(600851475143))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Okay, actually we can brute force, but it is really slow. A better solution is to write a prime number generator which calculates the next number on demand."
]
},
{
"cell_type": "code",
"execution_count": null,

View File

@@ -40,7 +40,7 @@ def render_solutions(solutions):
def convert_solutions_to_html(solutions):
for s in solutions:
if getmtime(s.html) < getmtime(s.ipynb):
if not os.path.isfile(s.html) or getmtime(s.html) < getmtime(s.ipynb):
args = ["ipython", "nbconvert", s.ipynb]
subprocess.call(args)