{ "metadata": { "name": "Exponenciaci\u00f3n binaria" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Hoy voy a iniciar una serie nueva de entradas que se llamar\u00e1 'python, fuente de sabidur\u00eda'. \u00bfQu\u00e9 pretende esta serie? La idea b\u00e1sica es mostrar la influencia y realimentaci\u00f3n entre las matem\u00e1ticas y la programaci\u00f3n. La idea e inspiraci\u00f3n para estas entradas sali\u00f3 despu\u00e9s de leer esta [entrada](http://ch3m4.org/blog/2013/08/14/estudio-funcion-factorial-numpy/).\n", "\n", "Inauguraremos esta entrada con una forma de calcular la potencia entera de un n\u00famero entero. Si tuviera que crear una funci\u00f3n que calculase esto la primera idea que se me ocurre es usar la fuerza bruta (soy as\u00ed de primario)..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def pow_fuerzabruta(x,n):\n", " y = x\n", " for i in range(1,n):\n", " y = y * x\n", " return y" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Con la anterior funci\u00f3n, la cual no he pensado mucho, lo que estamos haciendo son `n-1` multiplicaciones. A medida que aumente el exponente aumentar\u00e1 el tiempo de c\u00e1lculo. Ve\u00e1moslo en una gr\u00e1fica:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from matplotlib import pyplot as plt\n", "n = [5, 25, 100, 1000, 10000, 100000] # exponente\n", "t = [1.13, 3.93, 17.8, 330, 15000, 1260000] # t en microsegundos\n", "plt.xscale('log')\n", "plt.yscale('log')\n", "plt.plot(n,t)\n", "plt.xlabel('valor del exponente n')\n", "plt.ylabel('t en microsegundos')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 61, "text": [ "" ] }, { "output_type": "display_data", "png": "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\nEBoaSlZWFpdeeilz5syxMTLvO19fXHHFFbz++us2RuZ95+uLadOmufyLEAjO1w89e/akZ8+eNkbm\nfefri5NGjRplR1i2OF9fjB8/niFDhlTqWj67hnEugfbXQHWoL05RX1jUD6eoL05xZ1/4VcJQDapT\n1BenqC8s6odT1BenuLMv/CphqAbVKeqLU9QXFvXDKeqLU9zaF25fpneT2NhYc/XVV5u6deua0NBQ\nM2fOHGOMMStXrjRt27Y1rVq1Mk8//bTNUXqH+uIU9YVF/XCK+uIUT/eFakmJiIhL/GpKSkRE7KOE\nISIiLlHCEBERlyhhiIiIS5QwRETEJUoYIiLiEiUMERFxiRKG+I169eq57VpvvfVWhYUJXXmNr8vM\nzGTLli12hyEBQglD/EZliqiVlpZ6tT1ftWHDBv75z3/aHYYECCUMscWECRN47bXXnI+Tk5N54YUX\nKCoq4uabb+bGG2+kY8eO57zlrjGGhx9+mA4dOtCxY0fee+894NQ9igcPHsy111571vvmzp1LREQE\nv/nNb8p9iB44cIDbbruNqKgooqKiKvyALSoqIiEhgd/85jd07tzZGeO4ceN48sknAVi9ejU9e/bE\nGMOdd97JvffeS9euXYmIiHDeS7q4uJj4+Hg6duxI586dycjIAKyRzdChQ+nfvz9t27Ytd0+TNWvW\n0K1bN2688UaGDx9OUVERAOHh4SQnJzv77euvvyYvL4833niDl156iRtuuIHNmze79LNeqH2p4dxR\nv0SksrZt22Z69uzpfNy+fXvz3XffmdLSUnPkyBFjjDEHDhwwrVu3dr6mXr16xhhjlixZYvr06WPK\nysrMjz/+aJo3b26+//57s2HDBnPZZZeZvLy8s9rbv3+/ad68ufnpp59MSUmJ6d69uxk7dqwxxpi4\nuDizadMmY4wxe/fuNe3atTPGGDN37lyTlJR01rUmTJhg3nnnHWOMMf/5z39M27ZtzbFjx8yxY8fM\ntddeaz7++GMTERFhvv32W2OMMaNGjTL9+/c3xhiza9cuExoaaoqLi83zzz9vEhMTjTHG7NixwzRv\n3twUFxebuXPnmpYtW5ojR46Y4uJic80115jvvvvOHDhwwPTo0cMcO3bMGGPMM888Y6ZMmWKMMSY8\nPNxMnz7dGGPMa6+9ZkaPHm2MMSY5Odm88MILztjP97Oe7nzti/jVDZQkcFx//fUUFhby/fffU1hY\nSKNGjQgJCeHEiRNMmDCBjRs3UqtWLfbv309hYSHBwcHO927atInbb7+doKAggoOD6dmzJ1u3bqVB\ngwZERUVxzTXXnNVeVlYWvXr1onHjxgCMGDGCnTt3ArBu3Tpyc3Odr/3ll1+cf7mfy5o1a/jwww95\n/vnnATh+/Dj79u0jIiKCWbNmER0dzcsvv0yLFi0Aa2pr+PDhALRu3ZqWLVuyY8cONm/ezP333w9A\nREQE11xzDTt37iQoKIjevXtTv359ANq3b09eXh7/+c9/yMnJoVu3bgCUlJQ4/w0wdOhQADp37syy\nZcucz5vTysWd62c9duwYl156qfO587UfEhJy3j6RmkEJQ2wzbNgwlixZwg8//EBsbCwACxYs4Kef\nfuLzzz+ndu3atGjRguLi4nLvCwoKKvchePI5gMsuu+ycbZ35HmOM8z3GGLKysqhbt+45r3kuy5Yt\no02bNmc9/+WXX9KkSRMKCgrO+97Tr33mz3HSxRdf7Px37dq1nWsyffr04d13373ge05//ZnO97NW\n1L7D4bjg66Vm0BqG2GbEiBGkpqayZMkShg0bBsCRI0cIDg6mdu3abNiwgb179571vujoaBYtWkRZ\nWRkHDhzgk08+ISoq6rwfvgBRUVFkZmZy6NAhTpw4weLFi53f69u3L6+88orz8fbt24Hzf5j369ev\n3Ou3bdsGwN69e3nxxRfZtm0bq1atIjs723mdxYsXY4xh9+7dfPvtt0RGRhIdHc2CBQsA2LlzJ/v2\n7SMyMvKc7QYFBXHTTTexefNmdu/eDVhrKbt27TrvzwxQv359fvnllwp/1tOdq/0L9a3UHEoYYpv2\n7dtz9OhRQkNDadq0KQB/+tOf+Oyzz+jYsSPz58+nXbt2ztef/Kt8yJAhdOzYkU6dOtG7d2+ee+45\ngoODCQoKOu+o4OqrryY5OZnf/va3/O53vyu3KP7KK6/w2Wef0alTJ6699lpmzpzpbO9c1/vb3/7G\niRMn6NixI9dddx2TJk0CYPTo0bzwwgtcddVVvPnmm4wePZrjx48TFBRE8+bNiYqK4pZbbuGNN96g\nbt26jBkzhrKyMjp27EhsbCzz5s2jTp065233yiuv5K233iIuLo5OnTrRrVs3vv7667Ned/r7Bw4c\nyPvvv+9c9D7fz3q+95/Z91Kz6X4YIh4WHx/PwIEDnWsMIv5KIwwREXGJRhgiIuISjTBERMQlShgi\nIuISJQwREXGJEoaIiLhECUNERFzy/wFQUdnRp69ZewAAAABJRU5ErkJggg==\n" } ], "prompt_number": 61 }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Nota: la escala de los ejes en la anterior figura es logar\u00edtmica]\n", "\n", "Esto, cuando usamos n\u00fameros muy grandes, no es muy deseable. Por ello, vamos a mostrar el algortimo de hoy, la exponenciaci\u00f3n binaria, tambi\u00e9n llamado algoritmo de izquierda a derecha binario, que nos permitir\u00e1 reducir de forma dr\u00e1stica el n\u00famero de operaciones a realizar. Su uso en Python lo pod\u00e9is ver, por ejemplo, en la siguiente implementaci\u00f3n de [`long_pow`](http://svn.python.org/view/python/tags/r271/Objects/longobject.c?view=markup) (ver a partir de l\u00ednea 3376).\n", "\n", "Podemos pensar que estas cosas son muy modernas y sofisticadas pero, en este caso, no es as\u00ed. Los primeros or\u00edgenes de esta implementaci\u00f3n para calcular potencias parece que ser\u00eda anterior a 2200 a\u00f1os atr\u00e1s. Seg\u00fan el libro de [Donald Knuth titulado *Seminumerical Algorithms, volume 2 of The Art of Computer Programming*, p\u00e1gina 441](http://www.goodreads.com/book/show/112246.Art_of_Computer_Programming_Volume_2), podemos leer:\n", "\n", "> El m\u00e9todo es bastante antiguo; apareci\u00f3 antes del a\u00f1o 200 A.C. en *Pingala's Hindu classic Chandah-sutra* [ver B. Datta y A.N. Singh, *History of Hindu Mathematics 1*, 1935]; sin embargo, parece que existen otras referencias a este m\u00e9todo fuera de la India a lo largo de los 1000 a\u00f1os posteriores. Una discusi\u00f3n muy clara sobre como calcular `2n` de forma eficiente para valores de `n` arbitrarios ser\u00eda debida a al-Uqlidisi de Damscus en 952 D.C.; pod\u00e9is ver *The Arithmetic of al-Uglidisi* por A.S. Saidan (1975), p. 341-342, donde las ideas generales est\u00e1n ilustradas para el caso de n=51. Ver tambi\u00e9n *al-Biruni's Chronology of Ancient Nations (1879)*, p. 132-136; durante el siglo XI, los avances del mundo \u00e1rabe tuvieron una gran influencia.\n", "\n", "M\u00e1s informaci\u00f3n hist\u00f3rica sobre los or\u00edgenes la pod\u00e9is encontrar en este [art\u00edculo](http://arxiv.org/abs/math/0703658).\n", "\n", "Vamos a ver como funciona, m\u00e1s o menos, este algoritmo. La idea b\u00e1sica detr\u00e1s del mismo es la siguiente (ver [wikipedia](http://es.wikipedia.org/wiki/Exponenciaci%C3%B3n_binaria) para una explicaci\u00f3n m\u00e1s completa):\n", "\n", "Las potencias m\u00e1s r\u00e1pidas de calcular son las que tienen la siguiente forma ${x^2}^n$. Estos es debido a que se pueden encontrar las potencias calculando el cuadrado del n\u00famero de forma repetida.\n", "\n", "Vamos a explicar el mismo ejemplo que al-Uqlidisi de Damscus (unos diez siglos m\u00e1s tarde...) considerando un n\u00famero elevado a 51. Por tanto, puesdo calcular $5^2$ con solo una multiplicaci\u00f3n, $5^4 = {5^2}^2$ con solo dos multiplicaciones, $5^8 = {{5^2}^2}^2$ en tres multiplicaciones,...\n", "\n", "Creo que vais viendo por donde van los tiros. El algoritmo explicado de forma muy b\u00e1sica ser\u00eda para el ejemplo $5^{51}$:\n", "\n", "* Obtener el exponente como suma de potencias de 2\n", "\n", "En este caso ser\u00eda $51 = 32 + 16 + 2 + 1$\n", "\n", "* Encontrar la base de potencias de dos que aparecen en el exponente\n", "\n", "$5^1 = 5$\n", "\n", "$5^2 = 5 \u00b7 5 = 25$\n", "\n", "$5^4 = 25 \u00b7 25 = 625$\n", "\n", "$5^8 = 625 \u00b7 625 = 390625$\n", "\n", "$5^{16} = 390625 \u00b7 390625 = 152587890625$\n", "\n", "$5^{32} = 152587890625 \u00b7 152587890625 = 23283064365386962890625$\n", "\n", "* Y, por \u00faltimo, se multiplicar\u00edan de forma conjunta las potencias ya encontradas\n", "\n", "$5^{51} = 5^{32} \u00b7 5^{16} \u00b7 5^2 \u00b7 5 = 444089209850062616169452667236328125$\n", "\n", "De esta forma, en lugar de multiplicar 5 por si mismo 50 veces solo hemos de realizar 8 multiplicaciones.\n", "\n", "El que vamos a implementar es un algoritmo de exponenciaci\u00f3n binaria pero de derecha a izquierda. Pod\u00e9is ver los detalles en la [wikipedia](http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def my_pow(x,n):\n", " r = 1\n", " y = x\n", " while n > 1:\n", " if n%2:\n", " r = r * y\n", " n = int(n/2)\n", " y = y * y\n", " print(n,r,y)\n", " r = r*y\n", " return r" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si calculamos los tiempos que hemos obtenido con la nueva funci\u00f3n (`my_pow`) y los comparamos con la anterior implementaci\u00f3n (`pow_fuerzabruta`) veremos la ganancia que hemos obtenido:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from matplotlib import pyplot as plt\n", "n = [5, 25, 100, 1000, 10000, 100000] # exponente\n", "t_bruta = [1.13, 3.93, 17.8, 330, 15000, 1260000] # t para la primera funci\u00f3n\n", "t_bin = [1.34, 2.52, 3.68, 19.8, 765, 32800] # t para la segunda funci\u00f3n\n", "plt.plot(n,t_bruta, label='bruta')\n", "plt.plot(n,t_bin, label='bin')\n", "plt.legend()\n", "plt.xlabel('valor del exponente n')\n", "plt.ylabel('t en microsegundos')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 86, "text": [ "" ] }, { "output_type": "display_data", "png": "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\ncoIbkwcWZfwAAAAASUVORK5CYII=\n" } ], "prompt_number": 86 }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Nota: Ahora, las escalas de los ejes son lineales]\n", "\n", "Vemos que la ganancia, dependiendo del valor del exponente, es cada vez m\u00e1s importante a medida que aumenta el valor del mismo." ] }, { "cell_type": "code", "collapsed": false, "input": [ "for i, t1, t2 in zip(n, t_bruta, t_bin):\n", " print('Ganancia para n = {0:>6}, {1:>10.2f}'.format(i, t1/t2))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Ganancia para n = 5, 0.84\n", "Ganancia para n = 25, 1.56\n", "Ganancia para n = 100, 4.84\n", "Ganancia para n = 1000, 16.67\n", "Ganancia para n = 10000, 19.00\n", "Ganancia para n = 100000, 38.00\n" ] } ], "prompt_number": 89 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para n\u00fameros peque\u00f1os vemos que incluso puede llegar a ser peor pero para n\u00fameros grandes la ganancia es significativa llegando a valores en torno a 40 para un n\u00famero `n` de orden $10^5$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por \u00faltimo, solo comentar que las funciones `pow` y `math.pow` son m\u00e1s eficientes que lo que he hecho ([programadas en C](http://hg.python.org/cpython/file/41de6f0e62fd/Modules/mathmodule.c)). La idea de la entrada solo es mostrar que, gracias al trabajo y saber colectivo, la inteligencia que se esconde en las tripas de Python (y el resto de lenguajes de programaci\u00f3n) es mucha y en el d\u00eda a d\u00eda ni nos damos cuenta de ello.\n", "\n", "P.D.: Las funciones implementadas no contemplan exponentes negativos ni 0. He intentado simplificar el c\u00f3digo al m\u00e1ximo para que se vea el bosque en lugar de los \u00e1rboles." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esta entrada la puedes descargar en formato notebook desde [nuestro repositorio en github](https://github.com/Pybonacci/notebooks)." ] } ], "metadata": {} } ] }