Programando números grandes

Chucho Montesinos
NinjaCom
Published in
5 min readMay 25, 2020

¡Hola! bienvenidos a la cuarta entrega de la serie de Matemáticas para Data Science. En las entregas pasadas se habló de métodos de conteo y conjuntos y observamos que los factoriales y potencias son de vital importancia para aprender a contar. ¿Qué pasa si las queremos programar? una opción valida es importar una librería y usar las funciones correspondientes, pero… ¿y si nosotros las queremos programar sin necesidad de librerías? sólo porque queremos sentir la emoción de programar.

En esta entrega se hablará del tiempo que le toma a la computadora realizar las operaciones de factorial y de potenciación para ver la diferencia, veremos una forma distinta de aplicar las operaciones y poder así calcular estas más rápidamente

¡Comencemos!

Tiempo de cómputo

De una forma intuitiva se puede decir que

Es el tiempo que le toma a la computadora realizar una operación

Cada instrucción que le damos a la computadora toma un determinado tiempo realizarlo, tiempo lineal, tiempo exponencial, logarítmico, etc.

Gráfica de comparación de la comlejidad algorítmica (tiempo de ejecución)

Lo ideal es conseguir realizar un cierto número de operaciones en el menor tiempo posible. A lo largo de esta entrega veremos cuales son las formas más convenientes de reescribir las operaciones para que se ejecuten en el menor tiempo posible, aunque algunas de estas pierdan precisión, analizaremos cuan certeras son.

Factorial

Teorema 1. (Representación del factorial) El factorial se puede reescribir de la siguiente manera

Observamos que el factorial es una función recursiva, veamos cuánto tiempo le tomaría a la computadora realizar la operación factorial

Factorial en función recursiva en Python
Comparación de la forma del factorial clásico (n!) con un comportamiento lineal

La complejidad del factorial está dado por O(n)

Esto significa que crece de una forma lineal, o sea, como la sencilla fórmula que sabemos para líneas rectas f(x)=mx+b la siguiente pregunta que surge es

¿Se podrá hacer en un tiempo menor?

La respuesta es sin embargo, al momento de hacer esto se pierde un poco de precisión, es decir, sólo se puede aproximar el resultado. ¡Veamos su aproximación y cuán exacto es este!

Aproximación de Stirling

Teorema 2. (Aproximación de Stirling) La aproximación del factorial se puede ver como

Código en Python para la aproximación de Stirling
Comparación del factorial (naranja) con la aproximación de Stirling (azul)

Nota: Los picos generados es por procesos internos del sistema, sin embargo, se observan los comportamientos de los factoriales correctamente, como se quería

La complejidad de la aproximación de Stirling es O(log(n))

Comparemos ahora qué tan exacta es la aproximación de Stirling con el valor del factorial

Comparación de la aproximación vs factorial

Observamos que la diferencia es mínima, más aún veamos cuál es la taza de cambio

Podemos observar que va teniendo una asíntota con el valor y=0 implicando que la aproximación de Stirling crece más rapidamente que el factorial, sin embargo observamos que llegando al valor n=100 este cociente está rozando al valor y=1 lo que nos hace pensar que el desface será significativo para valores más grandes

Suma de potencias

La suma de potencias es una operación típica en matemáticas, veremos cómo se puede obtener el resultado general de estas para solamente evaluarlo sin necesidad de sumar todos los términos individualmente. La primera pregunta que surge es

¿Podemos asegurar que la suma de potencias siempre será finito?

La respuesta a esa pregunta es Sí, la suma de potencias, hablando bajo el contexto de programación será finita, debemos tener en cuenta que las bases serán números naturales, ya que hablando en el contexto de programación, es imposible llegar a tener una infinidad de términos, pues si esto fuera cierto se necesitaría una infinidad de tiempo y una infinidad de procesamiento. Así, aclarando esa parte tenemos el siguiente

Teorema 3. (Suma de potencias) Sea p un número natural, la expresión general para la suma de potencias está dada por

Observamos lo que se aclaraba anteriormente, n en la suma no puede ser infinito, veamos que la suma es acotada

Veamos el tiempo computacional de estas operaciones, comparando la suma como tal y después usando la fórmula general dada en el Teorema 3

Tiempo de computo de realizar la suma contra la sustitución directa

En el gráfico anterior, observamos que hacer la suma sumando cada término tenemos un mayor tiempo de cómputo inicial y por un mayor tiempo, por otro lado, al ser la sustitución una forma donde solamente tenemos que evaluar, toma menos tiempo hacerlo y dura menos,

Esta entrega fue un análisis computacional de los métodos de conteo y de cómo optimizar su tiempo computacional, de nuevo recalcando que aunque se pueden usar librerías, el lector puede optar por hacerlas él mismo.

La combinación, la permutación, el factorial y las tuplas son métodos de conteo que usan los artificios aquí analizados.

Esperamos que el análisis hecho le sirva al lector, que, aunque si se computan números pequeños la diferencia será imperceptible, sin embargo, si se requieren hacer varias de estas operaciones se llevará más tiempo.

¡Gracias y saludos!

Chucho Montesinos

--

--