{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# Jeux de coloriage\n", "\n", "Le notebook explore quelques probl\u00e8mes de g\u00e9om\u00e9trie dans un carr\u00e9."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["%matplotlib inline"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Colorier un carr\u00e9 \u00e0 proportion\n", "\n", "On souhaite colorier 20% d'un carr\u00e9. Facile !"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "import matplotlib.patches as pch\n", "\n", "def carre(ax=None):\n", " if ax is None:\n", " fig, ax = plt.subplots(1, 1, figsize=(2, 2))\n", " ax.plot([0, 0, 1, 1 ,0], [0, 1, 1, 0 ,0], 'k-')\n", " ax.set_title(\"Carr\u00e9\")\n", " return ax\n", "\n", "ax = carre()\n", "ax.add_patch(pch.Rectangle((0, 0), 0.2, 1, color=\"blue\"));"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Colorier en diagonale"]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"data": {"image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ4AAACcCAYAAACOTRJwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAC0JJREFUeJzt3X+MFOUdx/H3Rw601lYR+MO04mkKVWzNKcuP4A9ItBa1ARJtC5dWMBrirzataROtjTa2idUmmjba6pnSqglKpUmDjabR4o+YCnLoVVQqICqiZzg4AQkIHn77xzMXl71ddvZ24Jnd+76SDbfPMzP3DHyY3dmZ7z4yM5w73I6IPQA3NHnwXBQePBeFB89F4cFzUXjwXBQevJyTNEZSl6SJsceSJQ/eIElql9QpaZekbklPSjon498xHHgQuNbMVme57djkHyDXTtINwI3A1cC/gH3ATOA8M/t5DdtpMbO+am1Nycz8UcMDOBbYBXy3Qv9k4EVgO9AN3AOMKOo34DpgPfD2QdpOBZ4CeoE3ge/F3vdM/x5jD6DRHoQjWx/QUqF/IjAVaAFagbXAT4r6LQnU8cAXyrUBXwTeA65ItnMWsBU4Pfb+Z/Xw93i1GwVstQovh2a22sxWmFmfmb0D3A9ML1nsdjPrNbM9Fdq+A7xjZn9JtvMy8Hfgsux3J46W2ANoQNuA0ZXei0kaD9wFFICjCX/HpScG75XZbnHbScAUSduL2lqAh+sZeJ74Ea92LwKfAHMq9P8J+B8wzsy+DPwCUMky5c7oitveA54zs+OKHseY2TV1jj03PHg1MrMdwC3AvZLmSDpa0nBJF0m6E/gSsBPYJelUYDBh+ScwXtIPk20PlzRJ0mnZ7UlcHrxBMLO7gBuAXwI9hCPU9cA/gJ8B7cDHwAPAkkFs/2PgQmAu8AHwIXAHcGQGw88F/xzPReFHPBeFB89F4cFzUXjwXBQePBdF7q5cjB492lpbW2MPww3S6tWrt5rZmGrLVQ2epEWEa4dbzOwbZfoF/B64GNgNLEiuLSJpPuGzLoDfmNmD1X5fa2srnZ2d1RZzOSXp3TTLpXmp/SvhjoxKLgLGJY+FhEtGSDoeuBWYQrhV6FZJI9MMyjW/qsEzs+cJ94RVMht4yIIVwHGSTgC+DTyV3HHxEeG2n4MF2A0hWbzH+woH3lmxOWmr1F6zjo4OFi9ePOgBukOjvb2dhQsXDmrdLM5qS++8gHCnRaX2gRuQFib1C509PT0D+hcvXkxXV1d9o3SZ6urqqutgkMURbzNwYtHzrxIubG8GZpS0P1tuA2bWAXQAFAqFsuFsa2vj2WfLru4imDFjRl3rZ3HEWwZcrmAqsMPMuglFMBdKGpmcVFyYtDmX6uOURwhHrtGSNhPOVIcDmNl9wBOEj1I2ED5OuSLp65X0a2BVsqnbzOxgJyluCKkaPDObV6W/v0KqXN8iYNHghuaamV8yc1F48FwUHjwXhQfPReHBc1F48FwUHjwXhQfPReHBc1F48FwUHjwXhQfPReHBc1F48FwUHjwXhQfPRZEqeJJmSnpT0gZJN5bpvzuZfaZL0rri7+6VtL+ob1mWg3eNK82t78OAe4FvEQp4VklaZmZv9C9jZj8tWv5HwJlFm9hjZm3ZDdk1gzRHvMnABjPbaGb7gEcJRdyVzAMeyWJwrnmlCV7qwmxJJwEnA8uLmo9KamZXSKr0TeluiElTV5u6MJvwZdFLzWx/UdtYM/tA0inAcklrzOytA36BtJDwvSuMHTs2xZBco0tzxKtUsF3OXEpeZs3sg+TPjYSC7jNLVzKzDjMrmFlhzJiq33DlmkCa4K0Cxkk6WdIIQrgGnJ1K+jowkjABSX/bSElHJj+PBs4G3ihd1w09aepq+yRdT/gWgGHAIjN7XdJtQKeZ9YdwHvCoHTh/wWnA/ZI+I4T8t8Vnw27oSvXdKWb2BOEbA4rbbil5/qsy6/0H+GYd43NNyq9cuCg8eC4KD56LwoPnovDguSg8eC4KD56LwoPnovDguSg8eC4KD56LwoPnovDguSg8eC4KD56LwoPnosiqoHuBpJ6iwu2rivrmS1qfPOZnOXjXuDIp6E4sMbPrS9btn6W7QKhMW52s+1Emo3cN61AUdBfzWbpdWVkWdF8q6VVJSyX1l0OmWrfaRMmu+aQJXpqC7seBVjM7A3gaeLCGdb2udgjKpKDbzLaZ2d7k6QPAxLTruqEpk4JuSScUPZ0FrE1+9lm6XVlZFXT/WNIsoA/oBRYk6/os3a6sTAq6zewm4KYK6/os3W4Av3LhovDguSg8eC4KD56LwoPnovDguSg8eC4KD56LwoPnovDguSg8eC4KD56LwoPnovDguSg8eC6KrOpqb5D0RlLs8+9kFsf+Pp8o2Q2QVV3tK0DBzHZLuga4E/h+0ucTJbsBMqmrNbNnzGx38nQFoajHuYoynSg5cSXwZNFznyjZDZDpRMmSfkD4uorpRc0+UbIbILOJkiVdANwMzCqqsfWJkl1ZWdXVngncTwjdlqJ2nyjZlZVVXe3vgGOAxyQBbDKzWfhEya6CrOpqL6iwXiYTJe/dCyNG1LsVlyepghfbypUwahT09UFLQ4zYVdMQl8zMoLcX5syBTz+NPRqXhYYIHsBnn8Hy5XDJJeGl1zW2hgkewJ498MILMHMmfPJJ7NG4ejRU8CCEb+VKOP982L27+vIunxoueBDC9/LLMGMG7NoVezRuMBoyeBBeatesgXPPhZ07Y4/G1aphgwchfGvXwtlnw/btsUfjatHQwYNwhrtuHUydCtu2xR6NS6vhgwewbx9s3AhTpsCWLdWXd/E1RfAgfLC8aRNMngwffhh7NK6apgkehPC9/z5MmhT+dPnVVMGDcD23uzuEb9Om2KNxlTRd8AD27w/v9SZNCu/9XP40ZfAghG/r1vCeb/362KNxpZo2eBBuLOjtDWe7a9dWX94dPlkVdB8paUnSv1JSa1HfTUn7m5K+nd3Q0zELHy5PmxaudLh8qBq8ooLui4AJwDxJE0oWuxL4yMy+BtwN3JGsO4FQo3E6YZ7aPybbO6z6w3fOOfDKK4f7t7tyspooeTafTxW6FDhfofhiNvCome01s7eBDcn2oti5E6ZPh1Wrqi/rDq00N5KXK+ieUmmZpDhoBzAqaV9Rsu7BisEreA6AI46YUfuqJXbtCpfXpk2DYYf92Ns8urq6aGsb/DeTZFXQXWmZVMXgaQu6x4+v2FWTYcM8dPVqa2ujvb190OunCV6agu7+ZTZLagGOJUwfmqoY3Mw6gA6AQqFQbgbvFMN0jSSTgu7k+fzk58uA5RbSsgyYm5z1ngyMA17KZuiukWVV0P1n4GFJGwhHurnJuq9L+hvh2wP6gOvMbP8h2hfXQJS3l7FCoWCdnZ2xh+EGSdJqMytUXS5vwZPUA7xbpms0sPUwD+dQaJb9gPL7cpKZVf3mpdwFrxJJnWn+J+Vds+wH1LcvTX2t1uWXB89F0UjB64g9gIw0y35AHfvSMO/xXHNppCOeayK5Cl499/3lTYp9WSCpp2jymatijLMaSYskbZH0WoV+SfpDsp+vSjor1YbNLBcPwlWRt4BTgBHAf4EJJctcC9yX/DwXWBJ73HXsywLgnthjTbEv5wFnAa9V6L+YML2EgKnAyjTbzdMRr577/vImzb40BDN7nnAZtJLZwEMWrACOk3RCte3mKXhpJnI54L4/oP++v7xJOynNpcnL01JJJ5bpbwS1TsAD5Ct49dz3lzdpxvk40GpmZwBP8/mRvNEM6t8kT8Gr5b4/Su77y5uq+2Jm2+zziWgeACYeprFlLdU9l6XyFLx67vvLmzST0hS/D5oFNGoB5jLg8uTsdiqww8y6q64V+6ypzBnSOsIZ4c1J222EGYMAjgIeIxQNvQScEnvMdezL7cDrhDPeZ4BTY4+5wn48AnQDnxKOblcCVwNXJ/0iVCG+BawhTB9bdbt+5cJFkaeXWjeEePBcFB48F4UHz0XhwXNRePBcFB48F4UHz0Xxf1Y5geoPo6uZAAAAAElFTkSuQmCC\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["import numpy\n", "ax = carre()\n", "ax.add_patch(pch.Polygon(numpy.array([(0, 0), (0.2, 0), (0, 0.2), (0, 0)]), color=\"blue\"));"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Moins facile..."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Fonction de la surface couverte"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["def surface(x):\n", " if x <= 1.:\n", " return x**2 / 2\n", " if x <= 2.:\n", " return surface(1) + 0.5 - surface(2 - x)\n", " \n", "fig, ax = plt.subplots(1, 1, figsize=(8, 4))\n", "X = numpy.arange(0, 200) / 100\n", "Y = [surface(x) for x in X]\n", "ax.plot(X, Y)\n", "ax.set_title(\"Surface diagonale en fonction de x\")\n", "ax.set_xlabel(\"x\")\n", "ax.set_ylabel(\"% couvert\");"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ce qui nous int\u00e9resse en fait, c'est la r\u00e9ciproque de la fonction. Premi\u00e8re version, sans savoir calculer mais en supposant qu'elle est croissante."]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/plain": ["0.6325000000000005"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["def surface_inverse(y, precision=1e-3):\n", " x = 0\n", " while x <= 2:\n", " s = surface(x)\n", " if s >= y:\n", " break\n", " x += precision\n", " return x - precision / 2\n", "\n", "surface_inverse(0.2)"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 1, figsize=(4, 4))\n", "X = numpy.arange(0, 200) / 100\n", "Y = [surface(x) for x in X]\n", "ax.plot(X, Y, label=\"surface\")\n", "X2 = numpy.arange(0, 100) / 100\n", "Y2 = [surface_inverse(x) for x in X2]\n", "ax.plot(X2, Y2, label=\"surface_inverse\")\n", "ax.set_title(\"Surface diagonale en fonction de x\")\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ca marche mais..."]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["357 ns \u00b1 16.7 ns per loop (mean \u00b1 std. dev. of 7 runs, 1000000 loops each)\n"]}], "source": ["%timeit surface(0.6)"]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["271 \u00b5s \u00b1 27.4 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 1000 loops each)\n"]}], "source": ["y = surface(0.6)\n", "%timeit surface_inverse(y)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Et c'est de plus en plus long."]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["399 \u00b5s \u00b1 20.6 \u00b5s per loop (mean \u00b1 std. dev. of 7 runs, 1000 loops each)\n"]}], "source": ["%timeit surface_inverse(y * 2)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il y a plus court."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"data": {"text/plain": ["0.63232421875"]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["def surface_inverse_dicho(y, a=0., b=2., precision=1e-3):\n", " while abs(a - b) >= precision:\n", " m = (a + b) / 2.\n", " s = surface(m)\n", " if s >= y:\n", " b = m\n", " else:\n", " a = m\n", " return (a + b) / 2.\n", "\n", "surface_inverse_dicho(0.2)"]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["fig, ax = plt.subplots(1, 1, figsize=(4, 4))\n", "X = numpy.arange(0, 200) / 100\n", "Y = [surface(x) for x in X]\n", "ax.plot(X, Y, label=\"surface\")\n", "X2 = numpy.arange(0, 100) / 100\n", "Y2 = [surface_inverse(x) for x in X2]\n", "ax.plot(X2, Y2, label=\"surface_inverse\")\n", "X3 = numpy.arange(0, 100) / 100\n", "Y3 = [surface_inverse_dicho(x) for x in X2]\n", "ax.plot(X2, Y2, '.', label=\"surface_inverse_dicho\")\n", "ax.set_title(\"Surface diagonale en fonction de x\")\n", "ax.legend();"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ca marche."]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["6.9 \u00b5s \u00b1 75.7 ns per loop (mean \u00b1 std. dev. of 7 runs, 100000 loops each)\n"]}], "source": ["y = surface(0.6)\n", "%timeit surface_inverse_dicho(y)"]}, {"cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["7.36 \u00b5s \u00b1 216 ns per loop (mean \u00b1 std. dev. of 7 runs, 100000 loops each)\n"]}], "source": ["%timeit surface_inverse_dicho(y * 2)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pr\u00e8s de 50 fois plus rapide et cela ne d\u00e9pend pas de *y* cette fois-ci. Peut-on faire mieux ? On peut tabuler."]}, {"cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [{"data": {"text/plain": ["0.63234375"]}, "execution_count": 16, "metadata": {}, "output_type": "execute_result"}], "source": ["N = 100\n", "table = {int(surface(x * 1. / N) * N): x * 1. / N for x in range(0, N+1)}\n", "\n", "def surface_inv_table(y, N=N, precision=1e-3):\n", " i = int(y * N)\n", " a = table[i-1]\n", " b = table[i+1]\n", " return surface_inverse_dicho(y, a, b, precision=precision)\n", "\n", "surface_inv_table(0.2)"]}, {"cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["4.5 \u00b5s \u00b1 199 ns per loop (mean \u00b1 std. dev. of 7 runs, 100000 loops each)\n"]}], "source": ["y = surface(0.6)\n", "%timeit surface_inv_table(y)"]}, {"cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["3.92 \u00b5s \u00b1 87.1 ns per loop (mean \u00b1 std. dev. of 7 runs, 100000 loops each)\n"]}], "source": ["y = surface(0.6)\n", "%timeit surface_inv_table(y * 2)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["C'est mieux mais cette solution est un peu d\u00e9fectueuse en l'\u00e9tat, trouverez-vous pourquoi ? L'expression ``len(table)`` devrait vous y aider."]}, {"cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [{"data": {"text/plain": ["51"]}, "execution_count": 19, "metadata": {}, "output_type": "execute_result"}], "source": ["len(table)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Version math\u00e9matique\n", "\n", "Pour cette fonction, on sait calculer la r\u00e9ciproque de fa\u00e7on exacte."]}, {"cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [{"data": {"text/plain": ["(0.6324555320336759, 1.3675444679663242)"]}, "execution_count": 20, "metadata": {}, "output_type": "execute_result"}], "source": ["def surface(x):\n", " if x <= 1.:\n", " return x**2 / 2\n", " if x <= 2.:\n", " return surface(1) + 0.5 - surface(2 - x)\n", " \n", "def surface_inv_math(y):\n", " if y <= 0.5:\n", " # y = x**2 / 2\n", " return (y * 2) ** 0.5\n", " else:\n", " # y = 1 - (2-x)**2 / 2\n", " return 2 - ((1 - y ) * 2) ** 0.5\n", "\n", "surface_inv_math(0.2), surface_inv_math(0.8)"]}, {"cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["364 ns \u00b1 10.5 ns per loop (mean \u00b1 std. dev. of 7 runs, 1000000 loops each)\n"]}], "source": ["y = surface(0.6)\n", "%timeit surface_inv_math(y)"]}, {"cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["434 ns \u00b1 12.1 ns per loop (mean \u00b1 std. dev. of 7 runs, 1000000 loops each)\n"]}], "source": ["y = surface(0.6)\n", "%timeit surface_inv_math(y * 2)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il n'y a pas plus rapide mais cette option n'est pas toujours possible. Je passe la version \u00e9crite en C++, hors sujet pour le moment."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Retour au coloriage"]}, {"cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [{"data": {"image/png": "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\n", "text/plain": ["
"]}, "metadata": {"needs_background": "light"}, "output_type": "display_data"}], "source": ["def coloriage_diagonale(y, ax=None):\n", " ax = carre(ax)\n", " if y <= 0.5:\n", " x = surface_inv_math(y)\n", " ax.add_patch(pch.Polygon(numpy.array([(0, 0), (x, 0), (0, x), (0, 0)]), color=\"blue\"))\n", " else:\n", " ax.add_patch(pch.Polygon(numpy.array([(0, 0), (1, 0), (0, 1), (0, 0)]), color=\"blue\"))\n", " x = surface_inv_math(y) - 1\n", " ax.add_patch(pch.Polygon(\n", " numpy.array([(1, 0), (1, x), (x, 1), (0, 1)]),\n", " color=\"blue\"))\n", " return ax\n", "\n", "fig, ax = plt.subplots(1, 2, figsize=(6, 3))\n", "coloriage_diagonale(0.2, ax=ax[0])\n", "coloriage_diagonale(0.8, ax=ax[1])\n", "ax[0].set_title(\"20%\")\n", "ax[1].set_title(\"80%\");"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## A quoi \u00e7a sert ?\n", "\n", "Une programme est la concr\u00e9tisation d'une id\u00e9e et il y a souvent un compromis entre le temps pass\u00e9 \u00e0 la r\u00e9aliser et la performance qu'on souhaite obtenir. Et c'est souvent sans fin car les machines \u00e9voluent rapidement ces temps-ci."]}, {"cell_type": "code", "execution_count": 23, "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.7.2"}}, "nbformat": 4, "nbformat_minor": 2}