{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Function to compute the factorial of a number\n",
    "\n",
    "def factorial(n):\n",
    "    \n",
    "    if n == 0:\n",
    "        f = 1\n",
    "    else:\n",
    "        f = n\n",
    "        while n > 1:\n",
    "            f = f*(n-1)\n",
    "            n = n - 1\n",
    "    \n",
    "    return f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input n, I will compute n! for you\n",
      "10\n",
      " \n",
      "10! = 3628800\n"
     ]
    }
   ],
   "source": [
    "print(\"Input n, I will compute n! for you\")\n",
    "n = input()\n",
    "n = int(float(n))\n",
    "f = factorial(n)\n",
    "print(' ')\n",
    "print(str(n) + '! = ' + str(f))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Another way to compute factorial, with recursive use of function\n",
    "\n",
    "def fact(n):\n",
    "    \n",
    "    if n==0:\n",
    "        f = 1\n",
    "    else:\n",
    "        f = n*fact(n-1)\n",
    "        \n",
    "    return f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "479001600\n"
     ]
    }
   ],
   "source": [
    "n = int(12)\n",
    "f = fact(n)\n",
    "print(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Code snippet to compute log(n!) in varous ways and compare results by plotting\n",
    "\n",
    "import math\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Stirling's approx for log(n!)\n",
    "def stirling(n): return float(n)*math.log(float(n)) - float(n)\n",
    "\n",
    "def fact(n):\n",
    "    \n",
    "    if n==0:\n",
    "        f = 1\n",
    "    else:\n",
    "        f = n*fact(n-1)\n",
    "        \n",
    "    return f\n",
    "\n",
    "\n",
    "# Comparing Stirling's approx to exact calculation\n",
    "\n",
    "stir = [ ]\n",
    "exact = [ ]\n",
    "\n",
    "nmax = 1500\n",
    "\n",
    "# Calculating log(n!) for 1 <= n <= nmax\n",
    "for n in range(1,nmax):\n",
    "    s = stirling(n)\n",
    "    e = math.log(fact(n))\n",
    "    stir.append(s)\n",
    "    exact.append(e)\n",
    "\n",
    "# \n",
    "x = range(1,nmax)\n",
    "plt.scatter(x,exact,marker='^',s=20)\n",
    "plt.scatter(x,stir,marker='o',s=20)\n",
    "plt.plot(x,exact,linestyle = 'dashed',label='Exact')\n",
    "plt.plot(x,stir,linestyle='dotted',label='Stirling')\n",
    "plt.xscale('log')\n",
    "plt.yscale('log')\n",
    "plt.xlabel('n',size=16)\n",
    "plt.ylabel('$\\log(n!)$',size=16)\n",
    "plt.legend(fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15\n"
     ]
    }
   ],
   "source": [
    "def fact(n):\n",
    "      \n",
    "    if n==0:\n",
    "        f = 1\n",
    "    else:\n",
    "        f = n*fact(n-1)\n",
    "    \n",
    "    return f\n",
    "\n",
    "\n",
    "\n",
    "def binomial(n,k):\n",
    "\n",
    "    # Compute binomial coefficient\n",
    "    \n",
    "    if n < 0:\n",
    "        print(' n must be positive')\n",
    "        stop\n",
    "    if k > n:\n",
    "        print('k must smaller than n')\n",
    "        stop\n",
    "    if int(k) == 0:\n",
    "        b = 1\n",
    "    else:\n",
    "        nf = fact(n)\n",
    "        kf = fact(k)\n",
    "        nkf = fact(n-k)\n",
    "        b = nf/(kf*nkf)\n",
    "    \n",
    "    return int(b)\n",
    "\n",
    "x = binomial(6,2)\n",
    "\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 1\n",
      "1 2 1\n",
      "1 3 3 1\n",
      "1 4 6 4 1\n",
      "1 5 10 10 5 1\n",
      "1 6 15 20 15 6 1\n",
      "1 7 21 35 35 21 7 1\n",
      "1 8 28 56 70 56 28 8 1\n",
      "1 9 36 84 126 126 84 36 9 1\n",
      "1 10 45 120 210 252 210 120 45 10 1\n",
      "1 11 55 165 330 462 462 330 165 55 11 1\n",
      "1 12 66 220 495 792 924 792 495 220 66 12 1\n",
      "1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n",
      "1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1\n",
      "1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1\n",
      "1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1\n",
      "1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1\n",
      "1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1\n",
      "1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1\n"
     ]
    }
   ],
   "source": [
    "# Tartaglia's triangle: nth line is binomial(n, 0), binomial(n,1), ..., binomial(n,n)\n",
    "\n",
    "nlines = 20\n",
    "\n",
    "for n in range(1,nlines):  \n",
    "    b = [binomial(n,k) for k in range(n+1) ] \n",
    "    print(*b)   # '*' is to print list without square brackets "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]] \n",
      "\n",
      "1 1\n",
      "1 2 1\n",
      "1 3 3 1\n",
      "1 4 6 4 1\n"
     ]
    }
   ],
   "source": [
    "def tartaglia(nlines):\n",
    "    \n",
    "    triangle = [ ]\n",
    "\n",
    "    for n in range(1,nlines):  \n",
    "        b = [binomial(n,k) for k in range(n+1) ] \n",
    "        triangle.append(b)\n",
    "    \n",
    "    return(triangle)\n",
    "\n",
    "nlines = 5\n",
    "triangle = tartaglia(nlines)\n",
    "\n",
    "print(triangle, '\\n')\n",
    "\n",
    "for i in range(len(triangle)):\n",
    "    print(*triangle[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.010843866711637987\n",
      "0.028443966820490392\n"
     ]
    }
   ],
   "source": [
    "# Probability to get k times head in n tosses of a coin = binomial(n,k)/2^n\n",
    "\n",
    "def hprob(tosses,heads): return binomial(tosses,heads)/(2.0**tosses)\n",
    "\n",
    "# Probability to get k heads in n tosses\n",
    "n = 100\n",
    "k = 60\n",
    "print(hprob(n,k))\n",
    "\n",
    "# probability to get at least 60 heads in 100 tosses\n",
    "probs = [hprob(n,i) for i in range(k,n+1)]\n",
    "s = sum(probs)\n",
    "\n",
    "print(s)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "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.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
