{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from functools import lru_cache, reduce\n", "from itertools import groupby\n", "import operator\n", "\n", "import sys\n", "sys.setrecursionlimit(1000000)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "target = 33100000" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def sieve(n):\n", " primes = (2,3,5)\n", " i = 7\n", " while i <= n:\n", " if not any(i % p == 0 for p in primes):\n", " primes += tuple([i])\n", " i += 2\n", " return primes" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2,\n", " 3,\n", " 5,\n", " 7,\n", " 11,\n", " 13,\n", " 17,\n", " 19,\n", " 23,\n", " 29,\n", " 31,\n", " 37,\n", " 41,\n", " 43,\n", " 47,\n", " 53,\n", " 59,\n", " 61,\n", " 67,\n", " 71,\n", " 73,\n", " 79,\n", " 83,\n", " 89,\n", " 97)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sieve(100)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1819.3405398660252" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max_prime = (target / 10)**0.5\n", "max_prime" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "41538" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max_prime = 500000\n", "primes = sieve(max_prime)\n", "len(primes)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "prime_factors_cache = {}\n", "# @lru_cache(maxsize=None)\n", "def prime_factors(n, unused_primes):\n", " if n in prime_factors_cache:\n", " return prime_factors_cache[n]\n", " if n < 2:\n", " return tuple()\n", " if n in unused_primes:\n", " pf = tuple([n])\n", " elif n % unused_primes[0] == 0:\n", " pf = tuple([unused_primes[0]]) + prime_factors(n // unused_primes[0], unused_primes)\n", " else:\n", " pf = prime_factors(n, unused_primes[1:])\n", " prime_factors_cache[n] = pf\n", " return pf" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 2, 2, 5)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prime_factors(40, primes)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(17,)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prime_factors(17, primes)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{5: (5,), 10: (2, 5), 17: (17,), 20: (2, 2, 5), 40: (2, 2, 2, 5)}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# prime_factors.cache_info()\n", "prime_factors_cache" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(2, 3), (5, 1)]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[(p, len(list(i))) for p, i in groupby(prime_factors(40, primes))]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[1, 2, 4, 8]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[2**p for p in range(3+1)]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def prod(iterable):\n", " return reduce(operator.mul, iterable, 1)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def sum_of_factors(n, primes):\n", " pfs = prime_factors(n, primes)\n", " grouped_pfs = [(p, len(list(i))) for p, i in groupby(pfs)]\n", " prime_sums = [sum(p**i for i in range(e+1)) for p, e in grouped_pfs]\n", " return prod(prime_sums)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_of_factors(4, primes)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 10\n", "1 10\n", "2 30\n", "3 40\n", "4 70\n", "5 60\n", "6 120\n", "7 80\n", "8 150\n", "9 130\n" ] } ], "source": [ "for i in range(10):\n", " print(i, sum_of_factors(i, primes) * 10)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "i = 7687\n", "while True:\n", " try:\n", " if sum_of_factors(i, primes) * 10 >= target :\n", " break\n", " i += 1\n", " except:\n", " print(\"failed with i =\", i)\n", " break\n", " \n", "i" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7680" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max(prime_factors_cache)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "499979" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primes[-1]" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prime_factors_cache[7680]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7680" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prod(prime_factors_cache[7680])" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7687 in primes" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(7687,)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prime_factors(7687, primes)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7682" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_of_factors(7681, primes)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7688" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_of_factors(7687, primes)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(2, 5), (3, 2), (5, 1), (7, 2), (11, 1)]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fs = prime_factors(776160, primes)\n", "[(p, len(list(i))) for p, i in groupby(fs)]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 2, 2, 2, 2, 3, 3, 5, 7, 7, 11)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fs" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "776160" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prod(fs)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3361176" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_of_factors(776160, primes)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }