{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import math\n", "import numpy as np\n", "import time\n", "np.set_printoptions(precision=3)\n", "np.set_printoptions(suppress=True)\n", "plt.style.use(\"ggplot\")\n", "plt.rcParams[\"font.size\"] = 13" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Horner法で多項式の値を求める\n", "\n", "`coefs`: `[0次の係数, 1次の係数, ..., 最高次の係数]`" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_poly_value(coefs, x):\n", " value = 0.0\n", " size = len(coefs)\n", " for i in range(size):\n", " if i == 0:\n", " value += coefs[size-i-1]\n", " else:\n", " value = value * x + coefs[size-i-1]\n", " \n", " return value" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_poly_value([2, 5, 3], -1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 素直な解法" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_poly_product(f_coefs, g_coefs):\n", " \"\"\"\n", " Parameters:\n", " f_coefs: array_like. fの係数のリスト. [0次の係数, 1次の係数, ..., 最高次の係数]\n", " g_coefs: array_like. gの係数のリスト. [0次の係数, 1次の係数, ..., 最高次の係数]\n", " Returns:\n", " h_coefs: ndarray. h=fgの係数のリスト. [0次の係数, 1次の係数, ..., 最高次の係数]\n", " \"\"\"\n", " f_size, g_size = len(f_coefs), len(g_coefs)\n", " h_coefs = np.zeros([f_size+g_size-1], dtype=float)\n", " \n", " for i in range(f_size):\n", " for j in range(g_size):\n", " h_coefs[i+j] += f_coefs[i] * g_coefs[j]\n", " \n", " return h_coefs" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([12., 17., 10., 3.])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_poly_product([3, 2, 1], [4, 3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## FFTを使った解法" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### FFTにライブラリを使用" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_poly_product_fft(f_coefs, g_coefs):\n", " \"\"\"\n", " Parameters:\n", " f_coefs: array_like. fの係数のリスト. [0次の係数, 1次の係数, ..., 最高次の係数]\n", " g_coefs: array_like. gの係数のリスト. [0次の係数, 1次の係数, ..., 最高次の係数]\n", " Returns:\n", " h_coefs: ndarray. h=fgの係数のリスト. [0次の係数, 1次の係数, ..., 最高次の係数]\n", " \"\"\"\n", " h_size = len(f_coefs) + len(g_coefs) - 1\n", " h_fft_coefs = np.fft.fft(f_coefs, n=h_size) * np.fft.fft(g_coefs, n=h_size)\n", " h_coefs = np.fft.ifft(h_fft_coefs)\n", " \n", " return np.real(h_coefs)\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([12., 17., 10., 3.])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_poly_product_fft([3, 2, 1], [4, 3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 速度比較\n", "\n", "$n = 2, 4, 8, \\ldots, 2^{15}$次多項式同士の積を計算する. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_mean_time(func, *array):\n", " time_list = np.zeros([len(array[0])])\n", " for i, a in enumerate(zip(*array)):\n", " start_time = time.time()\n", " func(*a)\n", " time_list[i] = time.time() - start_time\n", " \n", " # remove slowest/fastest time\n", " time_list.sort()\n", " \n", " return np.mean(time_list[1:-1])\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Current n = 2\n", "Current n = 4\n", "Current n = 8\n", "Current n = 16\n", "Current n = 32\n", "Current n = 64\n", "Current n = 128\n", "Current n = 256\n", "Current n = 512\n", "Current n = 1024\n", "Current n = 2048\n", "Current n = 4096\n", "Current n = 8192\n", "Current n = 16384\n", "Current n = 32768\n" ] } ], "source": [ "n_list = [2 ** i for i in range(1, 15+1)]\n", "sample_size = 20\n", "random_state = np.random.RandomState(2018)\n", "\n", "n_size = len(n_list)\n", "simple_mean_time, fft_mean_time = [], []\n", "\n", "for i, n in enumerate(n_list):\n", " print(\"Current n = {}\".format(n))\n", " sample_f_coefs = random_state.randint(low=-100, high=100, size=(sample_size, n))\n", " sample_g_coefs = random_state.randint(low=-100, high=100, size=(sample_size, n))\n", " \n", " # simple\n", " if n < 3000:\n", " t = get_mean_time(get_poly_product, sample_f_coefs, sample_g_coefs)\n", " simple_mean_time.append(t)\n", " \n", " # FFT\n", " t = get_mean_time(get_poly_product_fft, sample_f_coefs, sample_g_coefs)\n", " fft_mean_time.append(t)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nderk6UeJ7777Tp9//rnzcXp6usaNGyfp789HSYqMjFSPHj20fv16zZs3z+X5zz33nA4ePKjBgwfn\nOMKcmJgoSS7zpf/66y+NGDFCUtbPp9yO/1Ke/PwBgJxw2TMAr2jatKkmTpyoyZMnq169eurbt68C\nAwO1ZMkS/fHHH3r++edzfX6tWrU0duxYPffcc2rQoIH69OkjPz8/LVu2TMnJyXrsscecbd999121\nbdtWXbt2Vd++fVWtWjWtWrVKP/zwgzp16qThw4fn+/E1aNBAx48fV+vWrdW5c2ft3r1b77//vsqU\nKeOSAHTv3l3PPPOMbrzxRnXv3l3bt2/Xjz/+qF69emnx4sU6derUFe2/c+fOevTRR9WoUSP16NFD\nycnJev/993Xs2DFNnTrVOe9xypQp+uGHH/TMM89o/fr1atWqlbZt26YPP/xQFStW1IwZM65o/4mJ\niXI4HJLkvOw1O7Vq1VKpUqX0/PPPa8eOHapbt6527NihpUuXKiwsTKNGjbqi/eeFu311KYvFov/+\n979q3769+vTpo6VLl+qGG27Qpk2b9Omnn6pu3bq5jkrmh7zGYLVaNWjQIM2YMUNt2rRR586dtWXL\nFi1cuPCy8+cvlZf31fjx4/Xpp5/qqaee0vr169WkSRP9/PPP2rVrl+688059+OGHbu0zIiJCt956\nq5YtWybp75Hgi3n7fOratasiIyM1bdo0nTp1SmXKlJHNZtNzzz2nihUraubMmbr//vvVtGlT9evX\nT+Hh4fr888+1efNmPfDAAwoPD3d7Xw888ID69u2ru+66S5UqVdJnn32mTZs26e6773bp8zfffFO/\n//677rvvPn3++eeqW7eu1q9fr5UrV6pu3bqaMmVKjvto06aNSpUqpSlTpuiPP/5QWFiYli5dqptv\nvlm//PJLls+n3I4/O576/AGAnDDyC8BrJk2apEWLFum6667T7Nmz9eabbyo8PFzvv/++xo4de9nn\nT5kyRf/+978VERGh6dOna86cOapQoYK++eYb3Xrrrc52tWvX1saNG9W3b1+tXLlSzz//vE6dOqVn\nn31Wy5cvz9M8WndZrVZ99tlnql27tt544w198sknuv322/Xjjz+6VC596qmn9Pjjj+vEiROaPn26\n7Ha7fv75Z/Xo0UPS/6pa59Xw4cP1wQcfqHjx4nrzzTc1a9YslS5dWm+++abGjBnjbBccHKyvv/5a\n48eP1+7duzVlyhStW7dO999/vzZs2ODxkTKr1apVq1Zp9OjR2rJli1588UWtWrVKXbp00bfffusc\nSfJ0DO70VXYaNGigjRs3qk+fPoqNjdWLL76ouLg4jRo1SmvXrs2xsFF+ymsMr776qv75z3/qyJEj\nevnll7V3794rmkeZl/dV8eLFtW7dOg0cOFDr1q3Tq6++qoCAAH3zzTcKDg7O034zE962bdtmuSTd\n2+dTaGio1q5dq5tuuklLly7VnDlznFMwJOnee+/VV199paZNm2rhwoV64403ZIzRrFmzNHPmzDzt\nKzo6WitXrtT27ds1depUnTp1SpMnT9aCBQtc2pUtW1br16/XI4884iyut337do0cOVLr1q3L9UeP\n8PBwrVixQo0aNdLChQu1fPlyPf3005ozZ44qV66s/fv3O0eH3Tn+S3n78wfAtcdi3KlKAABwm8Vi\nUePGjfXzzz97OxRcBn2Fomb+/PkaPHiw/vWvf2nYsGHeDgcAihRGfgEAAAAAPo/kFwAAAADg80h+\nAQAAAAA+jzm/AAAAAACfx8gvAAAAAMDnkfwCAAAAAHxe/t/cshA6cuSIt0O45kVEROjUqVPeDgP5\nhP70LfSnb6E/fQv96VvoT99CfxYO5cuXd7stI78AAAAAAJ9H8gsAAAAA8HkkvwAAAAAAn0fyCwAA\nAADweddEwSsAAAAAhVNycrLS09NlsVi8HUqeHD9+XBcuXPB2GD7NGCNJCgwMlJ+f31Vvj+QXAAAA\ngFekpqZKkkJCQrwcSd7ZbLZ8SciQO2OMzp8/r6CgoKt+vbnsGQAAAIBXpKSkKCAgwNthoBCzWCwK\nCQlRcnLyVW+L5BcAAACA1xS1y51R8PLrHCH5BQAAAOAVJL5wV36cKyS/AAAAAACfR/ILAAAAAIVQ\n8+bN9cknn3g7jGzld2xPPPGERowYkW/byw7JLwAAAADk4tixYxo2bJiaNGmi6OhotW3bVkuWLJEk\nbdy4UY0bN/ZyhJ41b948bd261dthXDWSXwAAAADIxdChQ5WcnKx169Zp69atGj58uD788ENlZGSo\nadOm+uWXX7wdokfNmzdP27Zt83YYV43kFwAAAAByERcXp4YNGyooKEiS1LNnTy1atEhWq1U//PCD\nqlevLknOf3/66ae68cYbFRUVpYcfflhHjx7VPffcoxtuuEExMTE6deqUJCkmJkZTp07V0KFDFR0d\nrTZt2ujzzz/PNoa0tDS99tpratmyperWrasHH3xQJ0+ezLZtTEyMXnjhBd17772qXbu2WrRooW+/\n/VYffPCBmjdvrvr162vBggXO9qdPn9ajjz6qxo0bq3HjxnrhhReUlpYmSYqOjtb+/fs1YcIERUdH\na9asWc7nHT16VL1791adOnXUvn17bdy40blu48aN6tGjh+rWrauWLVtq+vTpSk9Pd65ftGiRWrZs\nqTp16mj48OHO/XmSzeN7AAAAAAA3hE2cKPv27QWyr9QbbtDZZ55xq+3999+v6dOnyxijvn37qlSp\nUjlvNzVVH330kb766isdPHhQN998s3777Te99dZbql69urp166YPPvhAw4YNkyQtWLBAb775pt58\n8019//33GjBggGrWrKkaNWq4bPeVV17Rl19+qY8++kjFihXT+PHj9cQTT+jtt9/ONo758+dr5syZ\n+s9//qOHHnpIQ4cOVbdu3fTdd99p6dKlmjhxovr06SOr1ar7779fZcuW1Q8//KDTp09rwIABioiI\n0JAhQ7R161a1bdtWjzzyiO6++26XfcyZM0f//e9/VadOHT399NOaPHmyli9frkOHDqlPnz6aPHmy\n+vTpo71796p///6y2+0aOnSoNm7cqHHjxumDDz5Q06ZN9c033+ihhx5S165d3eqPK8XILwAAAADk\nYuTIkfrXv/6lb775Rk2aNNGIESN08ODBbNtmZGRo/PjxCg0N1Q033KCIiAjdeuutqlu3rkJCQtSw\nYUOX53bs2FFt2rSRJLVq1UrNmzfX8uXLXbZpjNHbb7+t0aNHKzIyUiEhIXrggQe0du1aGWOyjaNj\nx47q1KmTrFarWrVqpcTERE2cOFF2u12tW7fW+fPn9eeff2rLli36+eef9eyzzyogIEDlypVTnz59\nFBsbe9nXpXfv3oqOjpbFYlGHDh20e/duSdLHH3+s+vXrq1+/frJarapRo4Yee+wxvffee5KkDz/8\nUD169FDTpk0lSe3bt1fDhg0vu7+rxcgvAAAAgELB3ZFYb+jcubM6d+6sPXv2aOrUqercubPWrFmT\npZ3NZnNeBi1JgYGBioqKcj729/fXhQsXnI8rV67s8vyyZcvq+PHjLstOnz6t8+fP68knn9S4ceMk\n/Z0QW61WnT9/XqGhoVniuHifgYGBKleunLOdv7+/JCklJUWHDh2SJHXq1MnZPi0tLcvIc3YuPk5/\n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\nSTVr1tT333+vpKQkJSQkXHabnTp1UkBAgF588UXnSPCUKVPUv39/WSwWde/eXb/88os+++wzGWO0\nYcMGxcbGeuoQ8x3JLwAAAApOUpL89u9X6vXXezsSoMh77bXXFB4ero4dO6p+/fr67LPPNHDgQOf6\nhx56SMWKFVOjRo3Us2fPy24vKChIixYt0q5du9S0aVPdcccdat++vZ588klJUrVq1fSf//xHr776\nqqKjozVv3jz17dvXY8eX3yzGGFOQO7xw4YLmzZunzZs3Kzk5WWFhYbrjjjvUoUOHbNufOHFC8+fP\n144dO2Sz2dSmTRv16dMnx6H67Bw5ciS/wscVioiI0KlTp7wdBvIJ/elb6E/fQn/6Fl/sT/vvv6t0\nly46PWeOkrt183Y4BcoX+/NqJSYmKjg42NthXJGL7/MLz8vpXLl0DnJuCnzk9+uvv1ZiYqKmT5+u\nd955R3379tWcOXN0+vTpLG3/+usvPf3006patapmz56tV155Rfv379f06dMLOmwAAADkAyo9A/CW\nAk9+b7nlFj3++OPOqmL16tWTMUZnz2ad3L5mzRr5+/urZ8+e8vf3V/HixfXggw9qw4YNzupmAAAA\nKDrscXEyAQFKr1rV26EAuMZ4tdpzcnKyZs6cqTp16qhKlSpZ1u/atUv16tVzKbVdtmxZlS1bVjt3\n7lSlSpWy3e7q1au1evVqSdKLL76oiIgIzxwA3Gaz2egHH0J/+hb607fQn77FF/vTtnevTO3aioiM\n9HYoBc4X+/NqHT9+XDZb0b0BTVGOvagJCAi46veP13pr165dmjVrlurWreusHnapxMREVa5cOcvy\nYsWKKTExMcdtd+rUSZ06dXI+Zm6F9zHHxbfQn76F/vQt9Kdv8cX+LPv777pw442K97Hjcocv9ufV\nunDhgvz8/LwdxhVhzm/BunDhQrbvn7zM+fVK8rty5UqtWLFCQ4cOVZ06dXJsFxISku3l0OfOnVNI\nSIgnQwQAAEA+syQkyO/oUaVR6RmAFxR48rtt2zYtX75czz77bI43Y85Us2ZNrVq1SsYY58jwsWPH\ndPz4cdWsWbMgwgUAAEA+se/cKYliV/ifAr7xDIqw/DhXCrzg1eLFi9WtW7dsE9/du3drxIgR2rBh\ngySpQ4cOSk9P10cffaSMjAz99ddfmjt3rm688UZVrFixoEMHAADAVcis9JxWu7aXI0FhYbVauXQY\n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\nAAAA9cOeni7nb35jdgwAqBeGB17l5eVp5syZKioqkiTt3btXDz30kIYNG6aZM2equLjYbyEBAADg\nW5bjx2U/dIjHHAEIGobL7+uvv67Dhw/Lbq84WTx37lxFR0frnnvu0e7du7Vw4UK/hQQAAIBv2ffu\nlSS5mPQMIEgYLr/p6em69957FRoaqoyMDB08eFDDhg3TbbfdprvuuktffPGFP3MCAADAh+zp6ZLE\nmV8AQcNw+bVYLAoNDZUkbd++XbGxserataskqXXr1pWXQwMAAKDhc+zZI09oqNznnWd2FACoF4YH\nXrVt21b/+7//q+joaK1fv15XXnll5bpvv/1WSUlJfgkIAAAA33Okp1c839dq+FwIADRqhv9rd889\n9+irr77SuHHjVF5err59+0qSPv/8cy1dulR9+vTxW0gAAAD4lv1E+QWAIGH4zG/79u318ssva//+\n/erUqZOio6MlSc2aNdPjjz+uHj16+C0kAAAAfMeakyNbZib3+wIIKrV6zm98fLwuu+yyKstatWql\nVq1a+TQUAAAA/OfEsCsmPQMIJjVe9vzOO+/I4/Gc1U4XL1581oEAAADgX0x6BhCMaiy/P/74o555\n5hkdOnTI8M4yMzM1ffp07f35uXEAAABoeBx79sgTGytPs2ZmRwGAelPjZc/jx4/XwoULNWHCBF10\n0UW65JJL1K1bNyUmJlbZLi8vT19//bV27dqlzz77TD179tQDDzzg9+AAAAA4O/b09IqzvhaL2VEA\noN7UWH4tFouGDBmia6+9VkuXLtW8efNUXl4um82mmJgYWa1W5efny+l0ym636ze/+Y3+/Oc/qyOX\nzwAAADRcXq8c6ekq+fnJHQAQLM448Co5OVljxoxRaWmpdu3apZ9++km5ubnyeDyKi4tTs2bNdPHF\nFys8PLw+8gIAAKAOrD/+KGtBAff7Agg6hqc9h4aG6oorrvBnFgAAAPiZg0nPAIJUjQOvAAAAEHgq\nJz136GByEgCoX5RfAACAIOLYs0fu5s3ljYszOwoA1CvKLwAAQBCpnPQMAEGG8gsAABAs3G459u2T\ni/ILIAhRfgEAAIKE7YcfZCktlbNTJ7OjAEC9MzztWZI2b96sTZs2KTs7W4899piSk5O1atUqRUZG\nKiUlxV8ZAQAA4AOVk5458wsgCBk+87tp0ybNmjVLTqdThw4dktPplCSVlJToH//4h9asWeO3kAAA\n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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(16, 9))\n", "plt.plot(n_list[:len(simple_mean_time)], simple_mean_time, color=\"red\", label=\"Simple method\")\n", "plt.plot(n_list, fft_mean_time, color=\"blue\", label=\"FFT method\")\n", "plt.xscale(\"log\", basex=2)\n", "plt.title(\"Time comparison: simple method vs interpolation + FFT\")\n", "plt.xlabel(r\"Size of $n$\")\n", "plt.ylabel(\"Average elapsed time (sec, sample: {:d})\".format(sample_size))\n", "plt.legend()\n", "plt.show()" ] }, { "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.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }