6.1. Introducción.
Lo primero que debemos hacer para programar números grandes es precisamente saber a que nos estamos refiriendo con este término. Dentro de este capítulo, por “número grande” nos estaremos refiriendo a un número natural (aunque también es posible usar enteros o fraccionarios) utilizado dentro de un lenguaje de programación y que su tamaño en memoria es arbitrario pero comúnmente más grande que los predefinidos por el compilador. Dicho en otras palabras, queremos utilizar números que no estén limitados en tamaño y con los que podamos realizar operaciones dentro de nuestros programas.
La mayoría de las computadoras actuales cuentan con un procesador de 32 bits, aunque cada vez más 64 bits se está convirtiendo en la norma, con lo que se pueden manejar enteros tan grandes como 231, lo que representa alrededor de 9 dígitos en base 10. Muchos lenguajes de programación tienen incluidos enteros de 64 bits con lo que se alcanzan cifras de hasta 263 (18 dígitos). Si queremos utilizar número naturales en lugar de enteros, podemos utilizar variables sin signo y obtener un bit más, aunque no es una ganancia significativa.
Para la mayoría de las aplicaciones esto es más que suficiente para manejar con precisión cualquier cálculo que se presente. Sin embargo, la utilización de números grandes se da con frecuencia en áreas como matemáticas, astronomía, física y criptografía.
Para este capítulo nos vamos a limitar al uso de números naturales, ya que son los que se presentan principalmente en los concursos de programación. La aplicación principal de estos números es en la teoría de números y en la criptografía. Para física, astronomía y otras áreas de las matemáticas, es más conveniente crear funciones que manejen números en notación científica de precisión arbitraria.
Algunos usos de este tipo de números dentro de las matemáticas son, por ejemplo: para encontrar más dígitos del número π, encontrar los periodos de números fraccionarios, etc. En la teoría de números, y principalmente desde la invención de las computadoras, se han utilizado frecuentemente para la obtención de número primos cada vez más grandes, la exploración de sucesiones como la de Fibonacci y la de Lucas, o la búsqueda de datos para intentar resolver conjeturas como la de Goldbach, entre otros.
Todas estas aplicaciones pueden parecer de cierta forma inútiles desde un punto de vista práctico, siendo interesantes para los matemáticos pero de irrelevancia para la mayoría de las personas. Sin embargo, en épocas recientes la cantidad de información sensible que se maneja a través de medios electrónicos ha crecido en gran medida. Para poder manejar toda esta información de forma segura se requiere contar con sistemas de encriptamiento confiables. Debido a que todo el manejo de la encriptación se procesa mediante computadoras, es importante tener aplicaciones que nos permitan manejar todas las operaciones requeridas. La mayoría de los métodos modernos de encriptación se basan en el uso de números grandes.
Existen problemas que desde el punto de vista computacional son imposibles de resolver. Esto no es tanto por que no exista solución sino porque solución requiere de tanto tiempo o recursos que en la práctica no son viables, no importando que tan potente sea la computadora con la que se quiera resolver el problema.
Esto es lo que se busca aprovechar en la criptografía. En el 2005 las computadoras personales llegaron a un nivel de procesamiento de hasta 240 operaciones en cuestión de minutos. Para poder llegar a 264 cálculos se necesitaría utilizar una serie de computadoras trabajando en paralelo por varios años. Aún así con la tecnología actual es imposible realizar 2128 cálculos (que es lo que se ocuparía para descifrar un encriptamiento estándar enviado por internet). Para desencriptar otros estándares se necesitarían realizar 21024 operaciones (encriptaciones convencionales para información personal) o hasta 28192 operaciones (encriptaciones militares). Este tipo de encriptamiento es tan fuerte que inclusive se ofrecen premios en miles de dólares a quien pueda romperlo.
El primer lenguaje de programación en incorporar números grandes fue MacLisp. En la actualidad, hay lenguajes de programación que ya incorporan este tipo de números como es el caso de Java. En muchos otros lenguajes, aunque no los manejan internamente, xisten librerías que lo hacen y en ocasiones están incorporadas al compilador (GNU Pascal es un ejemplo de esto).