La Biblioteca de Aritmética de Precisión Múltiple ( GMP ) de GNU es una biblioteca gratuita para aritmética de precisión arbitraria , que opera con enteros con signo , números racionales y números de punto flotante . [3] No existen límites prácticos para la precisión excepto los implícitos en la memoria disponible (los operandos pueden ser de hasta 2 32 −1 bits en máquinas de 32 bits y 2 37 bits en máquinas de 64 bits). [4] [5] GMP tiene un rico conjunto de funciones y las funciones tienen una interfaz regular. La interfaz básica es para C , pero existen contenedores para otros lenguajes, incluidos Ada , C++ , C# , Julia , .NET , OCaml , Perl , PHP , Python , R , Ruby y Rust . Antes de 2008, Kaffe , una máquina virtual Java , usaba GMP para admitir la aritmética de precisión arbitraria incorporada en Java. [6] Poco después, se agregó soporte GMP a GNU Classpath . [7]
Las principales aplicaciones de destino de GMP son las aplicaciones e investigación de criptografía , las aplicaciones de seguridad de Internet y los sistemas de álgebra informática .
GMP pretende ser más rápido que cualquier otra biblioteca bignum para todos los tamaños de operandos. Algunos factores importantes para hacer esto son:
La primera versión de GMP se realizó en 1991. Se desarrolla y mantiene constantemente. [8]
GMP es parte del proyecto GNU (aunque el hecho de que su sitio web no esté en gnu.org puede causar confusión) y se distribuye bajo la Licencia pública general reducida de GNU (LGPL).
GMP se utiliza para aritmética de enteros en muchos sistemas de álgebra informática como Mathematica [9] y Maple . [10] También se utiliza en la Biblioteca de algoritmos de geometría computacional (CGAL).
Se necesita GMP para construir la colección de compiladores GNU (GCC). [11]
A continuación se muestra un ejemplo de código C que muestra el uso de la biblioteca GMP para multiplicar e imprimir números grandes:
#incluir <stdio.h> #incluir <gmp.h> int principal ( vacío ) { mpz_t x , y , resultado ; mpz_init_set_str ( x , "7612058254738945" , 10 ); mpz_init_set_str ( y , "9263591128439081" , 10 ); mpz_init ( resultado ); mpz_mul ( resultado , x , y ); gmp_printf ( " %Zd \n " "* \n " " %Zd \n " "-------------------- \n " "%Zd \n " , x , y , resultado ); /* memoria usada libre */ mpz_clear ( x ); mpz_clear ( y ); mpz_clear ( resultado ); devolver 0 ; }
Este código calcula el valor de 7612058254738945 × 9263591128439081.
Al compilar y ejecutar este programa se obtiene este resultado. (La -lgmp
bandera se usa si se compila en sistemas tipo Unix).
7612058254738945* 9263591128439081--------------------70514995317761165008628990709545
A modo de comparación, se puede escribir el siguiente programa C++ equivalente. (Las -lgmpxx -lgmp
banderas se utilizan si se compila en sistemas tipo Unix).
#incluir <iostream> #incluir <gmpxx.h> int principal () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); std :: cout << " " << x << " \n " << "* \n " << " " << y << " \n " << "---------- ---------- \n " << x * y << " \n " ; devolver 0 ; }