Skip to content

Instantly share code, notes, and snippets.

@MarcoForte
Created August 31, 2015 18:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarcoForte/84df137382366f344c7a to your computer and use it in GitHub Desktop.
Save MarcoForte/84df137382366f344c7a to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Primarily about computing factorials"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Browsing Wikipedia one day I came across an interesting line from the [Factorial page under computation](http://en.wikipedia.org/wiki/Factorial#Computation)\n",
"> The asymptotically best efficiency is obtained by computing $n!$ from its prime factorization. As documented by Peter Borwein, prime factorization allows $n!$ to be computed in time $\\mathcal{O} \\big(n {(\\log n \\log\\log n)}^2\\big)$, provided that a fast multiplication algorithm is used (for example, the Schönhage–Strassen algorithm). Peter Luschny presents source code and benchmarks for several efficient factorial algorithms, with or without the use of a prime sieve.\n",
"\n",
"In this post I describe two algorithms for computing $n!$, code them up in Python, plot and discuss their runtimes, share links to detailed analysis and try parse the important differences between the two algorithms."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What makes such an algorithm have better efficiency is that we can compute the unique prime factorisation of a factorial first and then use it to compute the factorial. I'll go through the steps to do this now.\n",
"\n",
"Let's consider $9!$ as an example \n",
"The naive way to compute it is by the definition, $$9! = 9\\cdot 8\\cdot7\\cdot6\\cdot5\\cdot4\\cdot3\\cdot2 = \\prod_{k=2}^{9}k$$ Instead let's try compute it by factoring first. \n",
"We need to count the amount of times each prime divides into $9!$, let's consider the explicit version of $9!$ above. \n",
"Starting with $2$, it divides into $2,4,6,8$, but also can divide once more into $4,8$, and can divide into $8$ a third time. So the number of times 2 divides $9!$ is $4+2+1=7$, i.e $2^7$ divides $9!$. \n",
"Next prime is $3$, it divides into $3,6,9$ and divides once more into $9$, so number of times $3$ divides $9!$ is $3+1=4$, i.e $3^4$ divides $9!$. \n",
"Next primes are $5$ and $7$, both of which only divide once into $9!$. \n",
"Putting this together we get $$9! = 2^7 \\cdot 3^4 \\cdot 5^1 \\cdot 7^1 = 128\\cdot81\\cdot5\\cdot7 = 362880$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What we did was count how many times each prime and it's powers divide into $9\\cdot 8\\cdot7\\cdot6\\cdot5\\cdot4\\cdot3\\cdot2$, i.e how many multiples of each prime and it's powers are there between $1$ and $9$. \n",
"This is easily computed with division, revisiting $2$, $\\frac{9}{2^2} = 2.25$, we can ignore the $.25$ since we are looking for the number of times it divides evenly. The mathematical way of writing this is using the floor function $\\lfloor x \\rfloor$, which rounds down to the nearest, so we want $\\Big\\lfloor \\frac{9}{2^2} \\Big\\rfloor = 2$. So to get the same from before, we sum $ \\Big\\lfloor\\frac{9}{2}\\Big\\rfloor + \\Big\\lfloor\\frac{9}{2^2}\\Big\\rfloor + \\Big\\lfloor\\frac{9}{2^3}\\Big\\rfloor = 4+2+1=7$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So for a general $n$, to get the prime factorisation we do this for each prime $p$ and each of it's powers. \n",
"The power of $p$ dividing $n!$, $$\\nu _{p}(n!) = \\sum_{k=1}^{\\lfloor \\log_pn \\rfloor}\\Big\\lfloor\\frac{n}{p^k}\\Big\\rfloor$$ \n",
"The $\\lfloor \\log_pn \\rfloor$ insures we stop summing before $p^k > n$, in which case $\\Big\\lfloor\\frac{n}{p^k}\\Big\\rfloor = 0$ \n",
"So to write out $n!$ explicitely this way, we get\n",
"$$n! = \\prod_{p \\leq n} p^{ \\nu _{p}(n!)}$$ "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import math\n",
"import numpy as np\n",
"import timeit\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will use a sieve of Eratosthenes to get the set of all the primes below $n$. The code I found on [Rosetta Code](http://rosettacode.org/wiki/Sieve_of_Eratosthenes#Using_set_lookup), was a concise and nice way of using Python [generators](https://www.jeffknupp.com/blog/2013/04/07/improve-your-python-yield-and-generators-explained/) and [sets](https://docs.python.org/2/library/sets.html). \n",
"When we iterate through `eratosthenes(n)` it checks to see if the current number, $i$, is not part of the `composite` set, if so then return it as a prime and add it's multiples to the set, starting from it's square. We update the set starting from $p^2$ since multiples beneath will have already been added, Eg. $2p$ was added for multiples of 2."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def eratosthenes(n):\n",
" composite = set()\n",
" for i in range(2, n+1):\n",
" if i not in composite:\n",
" yield i\n",
" composite.update(range(i**2, n+1, i))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`factorFactorial(n)` computes $n!$ using the code and methods dicussed above."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def factorFactorial(n):\n",
" factorial = 1\n",
" for p in eratosthenes(n):\n",
" v_p = 0 \n",
" for k in range(1,math.ceil(math.log(n,p))):\n",
" v_p += n // p**k \n",
" factorial = factorial*(p**v_p)\n",
" return factorial"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`iterFactorial(n)` computes $n!$ using the definition. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def iterFactorial(n):\n",
" fact = 1\n",
" for i in range(1,n+1):\n",
" fact = fact * i\n",
" return fact"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's do a quick test computing the $10^3!$, which has over 2500 digits so it's fairly large already."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1000 loops, best of 3: 1.14 ms per loop\n",
"1000 loops, best of 3: 418 µs per loop\n"
]
}
],
"source": [
"%timeit factorFactorial(10**3)\n",
"%timeit iterFactorial(10**3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `iterFactorial` function is alot faster, but there is alot of overhead in the factorisation, let's try a larger example $10^6!$"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 loops, best of 3: 2.55 s per loop\n",
"1 loops, best of 3: 4.76 s per loop\n"
]
}
],
"source": [
"%timeit -n 1 factorFactorial(10**5)\n",
"%timeit -n 1 iterFactorial(10**5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok phew, so it was a bit a bit faster to go through the factoring process, it's only worth it for sufficiently large $n$ though. Let's plot out how long it takes for the two algorithms, with some averaging to remove random fluctiations. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def loop(factorial,myRange,averageNum):\n",
" timesAvg = []\n",
" for i in myRange:\n",
" times = []\n",
" for j in range(averageNum):\n",
" start_time = timeit.default_timer() \n",
" factorial(i**3)\n",
" elapsed_time = timeit.default_timer() - start_time\n",
" times.append(elapsed_time)\n",
" timesAvg.append(np.mean(times))\n",
" return timesAvg"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes\n",
"from mpl_toolkits.axes_grid1.inset_locator import mark_inset\n"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nycP06dOpWbMmAGvWrElc7uTefUFf7qRjx46cOXMm2eVOhBBpZ+fOnezYsYMePXqQL5+TbHlnkI/X\nfszha4dZ0WWF46xbKVIlOhreekufv7ZkiSzj6WhkuZMU2DvYTZw4kXbt2iVOdhBCOJe///6b7du3\n0717d/kAlYIlh5bw0dqP2NNvD/lz5Te6HPEULl+Gli2hfHl9FyJZ1tPx2CvYyccwGyil0n07saCg\nICpUqEC5cuUYNWrUUz1Gr169cHd3p2rVqonXXb9+nUaNGuHl5UXjxo0xm82Jt40YMYJy5cpRoUIF\n1q1bl3h9WFgYVatWpVy5cryfzK7QkZGRvPHGG1SuXJkqVarwyy+/2O18MTEx1K1blxo1alCpUqWH\nWkDt8dxAX8vQ29ubli1b2vVcpUqVolq1anh7e1OnTh27nstsNtO+fXsqVqxIpUqV2Llzp13OdeTI\nEby9vRMv+fLl45dffrHb8xoxYgSVK1ematWqdO3aldjYWP766y/8/f0ZP348HTt2TNPXRkZz/Ppx\n+q/sz8IOCyXUOakjR+Dll8HXV99WUkJdJmP0eJe0uuhPxT6ioqLUjz/+aLfHf1RCQoIqU6aMioiI\nUHFxcap69erq4MGDqX6cLVu2qD179qgqVaokXvfpp5+qUaNGKaWUGjlypPrss8+UUkodOHBAVa9e\nXcXFxamIiAhVpkwZZbValVJK1a5dW+3cuVMppVTTpk3VmjVrHjvXhQsX1N69e5VSSt28eVN5eXmp\ngwcP2u18t2/fVkopFR8fr+rWratCQkLsdi6llPr5559V165dVcuWLe36cyxVqpS6du3aQ9fZ61xv\nv/22mjp1auLP0Ww22/VnqJRSFotFFSlSRJ05c8Yu54qIiFCenp4qJiZGKaVUx44d1dChQ9Ubb7yh\nvv32W7s9r4wiOi5aVf+tupqwc4LRpYintGWLUu7uSt391RYO7G5uSfs8ZI8HNeJiz2B3+vRpNWXK\nFLs9/qO2b9+ufH19E78fMWKEGjFixFM9VkRExEPBrnz58urixYtKKT2MlS9fXiml1PDhw9XIkSMT\nj/P19VWhoaHq/PnzqkKFConXz507V/Xr1y/F87Zq1UqtX7/e7ue7ffu2qlWrltq/f7/dzhUZGaka\nNGigNm7cqFq0aKGUst/PsVSpUurq1asPXWePc5nNZuXp6fnY+e39/7V27VpVr149u53r2rVrysvL\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x817cc18>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=[10,10])\n",
"\n",
"loops = []\n",
"myRange = range(1,40)\n",
"ax2 = plt.axes([.2, .4, .3, .3], axisbg='w')\n",
"for i,f in enumerate([factorFactorial,iterFactorial,math.factorial]):\n",
" loops.append(loop(f,myRange,10))\n",
" ax.plot(np.power(myRange,3),loops[i],label = f.__name__)\n",
" ax.legend(loc = 'upper left')\n",
" ax.set_xlabel(r\"$n!$\",fontsize = 20)\n",
" ax.set_ylabel(\"time\",fontsize = 20)\n",
" ax2.plot(np.power(myRange,3)[:20],loops[i][:20])\n",
" #ax2.set_yticklabels([])\n",
"mark_inset(ax, ax2, loc1=2, loc2=4, fc=\"none\", ec=\"0.5\")\n",
"ax.set_title(\"Comparision of different factorial algorithms\")\n",
"plt.show()\n",
"plt.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `factorFactorial(n)` function seems to gain the upper hand around `n=5000` and the difference gets much larger from then on out. As a matter of interest I plotted python's built in `math.factorial(n)`, it rely's on a more complicated algorithm and is written in c. It vastly outpreforms `factorFactorial(n)` although it's not as fast as other prime factoring algorithms written in C."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the paper [On the complexity of calculating factorials, Peter B. Borwein](http://www.cecm.sfu.ca/personal/pborwein/PAPERS/P29.pdf) algorithms very similar to the ones above are compared thouroughly, the results being: \n",
"Naive multiplication, `iterFactorial(n)` is $\\mathcal{O}\\big(n \\,\\, M\\big(n\\log n \\big) \\big)$ \n",
"Algorithm similar to `factorFactorial(n)` is $\\mathcal{O}\\big( \\log \\log n \\, M\\big(n \\log n\\big)\\big)$, where $M\\big(n\\big)$ is the complexity of multiplying two $n$ digit numbers."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I think alot of what the paper describes is slightly beyond the scope of this post so I'll try give a brief explanation why `factorFactorial(n)` is faster for $n \\gg 1$. We can notice the difference in the above complexities is $\\log n$ being replaced by the slower growing $\\log\\log n$, the orgin of these terms might shed some light on the differences.\n",
"\n",
"$n$ in `iterFactorial(n)` comes from doing the $n$ multiplications.\n",
"\n",
"$\\log \\log n$ in `factorFactorial(n)` comes from where we have to sum the complexity of the steps for each prime. At each prime,$p_i$ we cross off $n/p_i$ multiples, so summing these we get $\\mathcal{O} \\big(\\sum_{i=1}^n \\frac{1}{p_i} \\big) = \\mathcal{O} \\big(\\log\\log n\\big)$. [(Sum of reciprocals of primes)](https://en.wikipedia.org/wiki/Divergence_of_the_sum_of_the_reciprocals_of_the_primes)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are lot's of possible optimisations, I kept the code as simple to highlight the algorithm. Finding further optimisations could be an interesting excersise, eg slightly modifying the algorithm, using another method to find prime numbers or rewriting the algorithm with Numpy. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here are a couple of resources I used making this post: [Prime numbers and Numpy, Rebrained blog](http://rebrained.com/?p=458), [Python factorial source code](https://hg.python.org/cpython/file/7937aa6b7e92/Modules/mathmodule.c#l1218), [On the complexity of calculating factorials, Peter B. Borwein](http://www.cecm.sfu.ca/personal/pborwein/PAPERS/P29.pdf), [A great webpage detailing and comparing lot's of Factorial Algorithms](http://www.luschny.de/math/factorial/FastFactorialFunctions.htm)"
]
}
],
"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.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment