{ "metadata": { "name": "", "signature": "sha256:a586acdc2e890b91a232a598966747a39b4ce8470871f7375e99c32163ea71b4" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from pylab import *" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "3628800" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "def factorial(n):\n", " if n==0 or n==1:\n", " return 1\n", " else:\n", " return n * fact(n-1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "[factorial(i) for i in range(0, 10)]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "def factorial_algorithm(n):\n", " return sum([factorial(int(digit)) for digit in str(n)])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial_algorithm(145)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "145" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "n = arange(200)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(n, list(map(factorial_algorithm, n)))\n", "plot(n, n, 'r', lw=3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(n, list(map(factorial_algorithm, n)))\n", "plot(n, n, 'r', lw=3)\n", "ylim(0, n.max())" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "(0, 199)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nx05k7IAAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial_algorithm(40585)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "40585" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "double_algorithm = lambda n: factorial_algorithm(factorial_algorithm(n)) " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(n, list(map(factorial_algorithm, n)), label='simple')\n", "plot(n, list(map(double_algorithm, n)), label='double')\n", "legend()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial_algorithm(199)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "725761" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial_algorithm(725761)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "10923" ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "def chain_length(n):\n", " chain = [n]\n", " iteration = factorial_algorithm(n)\n", " while iteration not in chain:\n", " chain.append(iteration)\n", " iteration = factorial_algorithm(iteration)\n", " return chain" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.html.widgets import interact" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "interact(lambda n: print(chain_length(n)),\n", " n=(0, 1000))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[20, 3, 6, 720, 5043, 151, 122, 5, 120, 4, 24, 26, 722, 5044, 169, 363601, 1454]\n" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial_algorithm(1454)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "169" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "n = arange(1000)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "chain_lengths = [len(chain_length(i)) for i in n]\n", "plot(n, chain_lengths)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "%time chain_lengths = [len(chain_length(i)) for i in n]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 390 ms, sys: 2.54 ms, total: 392 ms\n", "Wall time: 396 ms\n" ] } ], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Essayons de m\u00e9moiser cet algorithme. \n", "\n", "Condition + 0 :\n", "\n", "- 145\n", "- 40585\n", "\n", "Condition + 1 : \n", "\n", "- 871, 45361\n", "- 872, 45362 \n", "\n", "Condition + 2 :\n", "\n", "- 169, 363601, 1454 " ] }, { "cell_type": "code", "collapsed": false, "input": [ "def first_sieve():\n", " n = arange(1000000)\n", " print(n[array(list(map(factorial_algorithm, n))) == n])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 92 }, { "cell_type": "code", "collapsed": false, "input": [ "%time first_sieve()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 1 2 145 40585]\n", "CPU times: user 16.3 s, sys: 79 ms, total: 16.4 s\n", "Wall time: 16.4 s\n" ] } ], "prompt_number": 93 }, { "cell_type": "code", "collapsed": false, "input": [ "class chain_length_memoized():\n", " def __init__(self):\n", " self.lookup_table = {1:0,\n", " 2:0,\n", " 145:0,\n", " 40585:0,\n", " 871:1,\n", " 45361:1,\n", " 872:1,\n", " 45362:1,\n", " 169:2,\n", " 363601:2,\n", " 1454:2}\n", " \n", " def compute_chain_length(self, n):\n", " if n in self.lookup_table:\n", " return 1 + self.lookup_table[n]\n", " else:\n", " iteration = factorial_algorithm(n)\n", " self.lookup_table[n] = self.compute_chain_length(iteration)\n", " return 1 + self.lookup_table[n]\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 69 }, { "cell_type": "code", "collapsed": false, "input": [ "clm = chain_length_memoized()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "clm.compute_chain_length(0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 80, "text": [ "2" ] } ], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "z = chain_length(0)\n", "print(z, len(z))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[0, 1] 2\n" ] } ], "prompt_number": 81 }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(1000000):\n", " if clm.compute_chain_length(i) == 60:\n", " print(i)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1479\n", "1497\n", "1749\n", "1794\n", "1947\n", "1974\n", "4079\n", "4097\n", "4179\n", "4197\n", "4709\n", "4719\n", "4790\n", "4791\n", "4907\n", "4917\n", "4970\n", "4971\n", "7049\n", "7094\n", "7149\n", "7194\n", "7409\n", "7419\n", "7490\n", "7491\n", "7904\n", "7914\n", "7940\n", "7941\n", "9047\n", "9074\n", "9147\n", "9174\n", "9407\n", "9417\n", "9470\n", "9471\n", "9704\n", "9714\n", "9740\n", "9741\n", "223479" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "223497\n", "223749\n", "223794\n", "223947\n", "223974\n", "224379\n", "224397\n", "224739\n", "224793\n", "224937\n", "224973\n", "227349\n", "227394\n", "227439\n", "227493\n", "227934\n", "227943\n", "229347\n", "229374\n", "229437\n", "229473\n", "229734\n", "229743\n", "232479\n", "232497\n", "232749\n", "232794\n", "232947\n", "232974\n", "234279\n", "234297\n", "234729\n", "234792\n", "234927\n", "234972\n", "237249\n", "237294\n", "237429\n", "237492\n", "237924\n", "237942\n", "239247\n", "239274\n", "239427\n", "239472\n", "239724\n", "239742\n", "242379\n", "242397\n", "242739\n", "242793\n", "242937\n", "242973\n", "243279\n", "243297\n", "243729\n", "243792\n", "243927\n", "243972\n", "247239\n", "247293\n", "247329\n", "247392\n", "247923\n", "247932\n", "249237\n", "249273\n", "249327\n", "249372\n", "249723\n", "249732\n", "272349\n", "272394\n", "272439\n", "272493\n", "272934\n", "272943\n", "273249\n", "273294\n", "273429\n", "273492\n", "273924\n", "273942\n", "274239\n", "274293\n", "274329\n", "274392\n", "274923\n", "274932\n", "279234\n", "279243\n", "279324\n", "279342\n", "279423\n", "279432\n", "292347\n", "292374\n", "292437\n", "292473\n", "292734\n", "292743\n", "293247\n", "293274\n", "293427\n", "293472\n", "293724\n", "293742\n", "294237\n", "294273\n", "294327\n", "294372\n", "294723\n", "294732\n", "297234\n", "297243\n", "297324\n", "297342\n", "297423\n", "297432\n", "322479\n", "322497\n", "322749\n", "322794\n", "322947\n", "322974\n", "324279\n", "324297\n", "324729\n", "324792\n", "324927\n", "324972\n", "327249\n", "327294\n", "327429\n", "327492\n", "327924\n", "327942\n", "329247\n", "329274\n", "329427\n", "329472\n", "329724\n", "329742\n", "342279" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "342297\n", "342729\n", "342792\n", "342927\n", "342972\n", "347229\n", "347292\n", "347922\n", "349227\n", "349272\n", "349722\n", "372249\n", "372294\n", "372429\n", "372492\n", "372924\n", "372942\n", "374229\n", "374292\n", "374922\n", "379224\n", "379242\n", "379422\n", "392247\n", "392274\n", "392427\n", "392472\n", "392724\n", "392742\n", "394227\n", "394272\n", "394722\n", "397224\n", "397242\n", "397422\n", "422379\n", "422397\n", "422739\n", "422793\n", "422937\n", "422973\n", "423279\n", "423297\n", "423729\n", "423792\n", "423927\n", "423972\n", "427239\n", "427293\n", "427329\n", "427392\n", "427923\n", "427932\n", "429237\n", "429273\n", "429327\n", "429372\n", "429723\n", "429732\n", "432279\n", "432297\n", "432729\n", "432792\n", "432927\n", "432972\n", "437229\n", "437292\n", "437922\n", "439227\n", "439272\n", "439722\n", "472239" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "472293\n", "472329\n", "472392\n", "472923\n", "472932\n", "473229\n", "473292\n", "473922\n", "479223\n", "479232\n", "479322\n", "492237\n", "492273\n", "492327\n", "492372\n", "492723\n", "492732\n", "493227\n", "493272\n", "493722\n", "497223\n", "497232\n", "497322\n", "722349" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "722394\n", "722439\n", "722493\n", "722934\n", "722943\n", "723249\n", "723294\n", "723429\n", "723492\n", "723924\n", "723942\n", "724239\n", "724293\n", "724329\n", "724392\n", "724923\n", "724932\n", "729234\n", "729243\n", "729324\n", "729342\n", "729423\n", "729432\n", "732249\n", "732294\n", "732429\n", "732492\n", "732924\n", "732942\n", "734229\n", "734292\n", "734922\n", "739224\n", "739242\n", "739422\n", "742239\n", "742293\n", "742329\n", "742392\n", "742923\n", "742932\n", "743229\n", "743292\n", "743922\n", "749223\n", "749232\n", "749322\n", "792234\n", "792243\n", "792324\n", "792342\n", "792423\n", "792432\n", "793224\n", "793242\n", "793422\n", "794223\n", "794232\n", "794322\n", "922347" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "922374\n", "922437\n", "922473\n", "922734\n", "922743\n", "923247\n", "923274\n", "923427\n", "923472\n", "923724\n", "923742\n", "924237\n", "924273\n", "924327\n", "924372\n", "924723\n", "924732\n", "927234\n", "927243\n", "927324\n", "927342\n", "927423\n", "927432\n", "932247\n", "932274\n", "932427\n", "932472\n", "932724\n", "932742\n", "934227\n", "934272\n", "934722\n", "937224\n", "937242\n", "937422\n", "942237\n", "942273\n", "942327\n", "942372\n", "942723\n", "942732\n", "943227\n", "943272\n", "943722\n", "947223\n", "947232\n", "947322\n", "972234\n", "972243\n", "972324\n", "972342\n", "972423\n", "972432\n", "973224\n", "973242\n", "973422\n", "974223\n", "974232\n", "974322\n" ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "%time len([i for i in range(1000000) if clm.compute_chain_length(i) == 60])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "CPU times: user 412 ms, sys: 2.44 ms, total: 414 ms\n", "Wall time: 414 ms\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 88, "text": [ "402" ] } ], "prompt_number": 88 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finishing thoughts:\n", "\n", "- the algorithm has invariants : no order in the computation. Permutations could have helped here!\n", "- look at the results: always ! The devil is in the details.\n", "- memoization with recursion is a cool solution\n", "- computers don't evolve that fast over the last years, despite what we're thinking (25 seconds in 2005, now 15 seconds)" ] } ], "metadata": {} } ] }