La biblioteca aritmética de precisión múltiple de GNU ( GMP ) 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 . [ 4 ] No hay límites prácticos para la precisión excepto los implícitos por 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). [ 5 ] [ 6 ] GMP tiene un amplio conjunto de funciones, y las funciones tienen una interfaz regular. La interfaz básica es para C , pero existen envoltorios 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 , utilizaba GMP para admitir la aritmética de precisión arbitraria integrada de Java. [ 7 ] Poco después, se añadió compatibilidad con GMP a GNU Classpath , como backends para java.math.BigIntegery java.math.BigDecimal. [ 8 ]
Las principales aplicaciones a las que se dirige GMP son las aplicaciones e investigaciones en criptografía , las aplicaciones de seguridad en Internet y los sistemas de álgebra computacional .
GMP pretende ser más rápido que cualquier otra biblioteca de aritmética de precisión arbitraria (números grandes) para todos los tamaños de operandos. Algunos factores importantes para lograrlo son:
- Las palabras completas son el tipo básico para todas las operaciones aritméticas.
- Se utilizan diferentes algoritmos para diferentes tamaños de operandos ; los algoritmos que son más eficientes con números grandes no se utilizan cuando se trabaja con números pequeños.
- El lenguaje ensamblador (especializado para diferentes procesadores ) se utiliza en los bucles internos más comunes para optimizarlos al máximo.
La primera versión GMP se realizó en 1991. Se desarrolla y mantiene constantemente. [ 9 ]
GMP forma parte del proyecto GNU (aunque el hecho de que su sitio web no sea 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 computacional como Mathematica [ 10 ] y Maple . [ 11 ] También se utiliza en la Biblioteca de algoritmos de geometría computacional (CGAL).
Se necesita GMP para compilar la Colección de Compiladores GNU (GCC). [ 12 ]
Interfaz de biblioteca C
La interfaz de la biblioteca C define:
mpz_t(entero de precisión múltiple)mpq_t(racional de precisión múltiple)mpf_t(número de punto flotante de precisión múltiple)gmp_randstate_t(estado aleatorio, utilizado para generar números aleatorios)
Las funciones se anteponen al nombre del tipo (por ejemplo, las operaciones con enteros de precisión múltiple se anteponen a mpz, etc.).
La biblioteca también proporciona utilidades adicionales (todas con el prefijo gmp), como gmp_scanf, gmp_printf, etc.
Ejemplo
Aquí hay un ejemplo de código C que muestra el uso de la biblioteca GMP para multiplicar e imprimir números grandes:
#include <stdio.h> #include <gmp.h>int main ( void ) { 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 );// liberar memoria usada mpz_clear ( x ); mpz_clear ( y ); mpz_clear ( resultado );devolver 0 ; }Este código calcula el valor de.
Al compilar y ejecutar este programa se obtiene este resultado. (El -lgmpindicador se utiliza si se compila en sistemas tipo Unix).
7612058254738945 * 9263591128439081 -------------------- 70514995317761165008628990709545 Interfaz de biblioteca C++
La interfaz de la biblioteca C++ define las clases:
mpz_class(corresponde ampz_t)mpq_class(corresponde ampq_t)mpf_class(corresponde ampf_t)gmp_randclass(Ofrece utilidades para generar números aleatorios)
Las funciones independientes de la biblioteca C se integran como métodos en las clases C++. La biblioteca C++ coloca todos los símbolos globalmente y no utiliza un espacio de nombres de biblioteca . Se recomienda evitarlo autoen las declaraciones. [ 13 ] Para regresar al tipo C, cada clase ofrece un get_mp_t()método correspondiente (por ejemplo mpz_class::get_mpz_t(), ).
Ejemplo
A modo de comparación, se puede escribir el siguiente programa equivalente en C++. ( -lgmpxx -lgmpSe utilizan las banderas si se compila en sistemas tipo Unix).
import < gmpxx . h > ; import std ;int main () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); mpz_class result = x * y ;std :: println ( "{} \ n " * \ n " "{} \ n " "-------------------- \n " "{}" , x.get_str ( ), y.get_str ( ), result.get_str ( ) );devolver 0 ; }Enlaces de lenguaje
Véase también
- GNU MPFR : biblioteca para cálculos de precisión arbitraria con redondeo correcto, basada en GNU MP
- CLN – biblioteca de clases para precisión arbitraria
- Lista de bibliotecas matemáticas de código abierto
- MPIR – bifurcación de GMP, sin mantenimiento
Referencias
- ↑ "Archivo GNU MP" . Consultado el 3 de diciembre de 2018 .
- ↑ Torbjörn Granlund (30 de julio de 2023). "Lanzamiento de GMP 6.3.0" . Consultado el 30 de julio de 2023 .
- ↑ "Notas de la versión GMP 6.3" .
- 1 2 "¿Qué es GMP?" . Consultado el 7 de abril de 2014 .
- ↑ Granlund, Torbjorn (2009-07-06). "Problemas con mpz_set_str y cadenas enormes" . Recuperado el 2013-03-17 .
- ↑ "Noticias de GMP 6.0" . Consultado el 4 de octubre de 2019 .
- ↑ Hughes, Andrew John (28 de febrero de 2008). "¿Se eliminaron las matemáticas de GMP?" . Recuperado el 17 de marzo de 2013 .
- ↑ "GNU Classpath 0.98 "Más vale tarde que nunca"" . 2009-02-05 . Consultado el 2013-03-17 .
- ↑ "Biblioteca GNU MP Bignum" . Consultado el 3 de diciembre de 2018 .
- ↑ "El núcleo de Mathematica: problemas en el diseño y la implementación" . Octubre de 2006. Consultado el 17 de marzo de 2013 .
- ↑ "La biblioteca GNU de precisión múltiple (GMP)" . Maplesoft . Consultado el 17 de marzo de 2013 .
- ↑ GCC utiliza la biblioteca GNU MPFR , que a su vez depende de GMP. "GCC 4.3 Release Series: Changes, New Features, and Fixes" . 2012-11-02 . Consultado el 2013-03-17 .
- ↑ Biblioteca de aritmética de precisión múltiple de GNU. "Limitaciones de la interfaz C++ 12.6" . gmplib.org . Proyecto GNU.
- Software programado en lenguaje ensamblador
- Bibliotecas de C (lenguaje de programación)
- aritmética informática
- Software libre programado en C
- Software del Proyecto GNU
- Bibliotecas numéricas
- Software que utiliza la Licencia Pública General Reducida de GNU.