La biblioteca aritmética de precisión múltiple ( GMP ) de GNU es una biblioteca gratuita para aritmética de precisión arbitraria que funciona 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 , peroExisten 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 de Java , utilizaba GMP para admitir la aritmética de precisión arbitraria incorporada en Java. [6] Poco después, se agregó el soporte GMP a GNU Classpath . [7]
Desarrollador (es) | Proyecto GNU |
---|---|
Versión inicial | 1991 [1] |
Lanzamiento estable | 6.2.1 (14 de noviembre de 2020 [2] ) [±] |
Repositorio | gmplib |
Escrito en | C , ( C ++ , ensamblado opcional) |
Tipo | Software matemático |
Licencia | Dual LGPLv3 y GPLv2 [3] |
Sitio web | gmplib .org |
Las principales aplicaciones objetivo de GMP son las aplicaciones de criptografía y la investigación, las aplicaciones de seguridad de Internet y los sistemas de álgebra informática .
GMP tiene como objetivo ser más rápido que cualquier otra biblioteca bignum para todos los tamaños de operandos. Algunos factores importantes para hacer esto son:
- Usar palabras completas como tipo aritmético básico.
- Usando diferentes algoritmos para diferentes tamaños de operandos ; los algoritmos que son más rápidos para números muy grandes suelen ser más lentos para números pequeños.
- Código en lenguaje ensamblador altamente optimizado para los bucles internos más importantes , especializado para diferentes procesadores .
La primera versión de GMP se realizó en 1991. Se desarrolla y mantiene constantemente. [8]
GMP es parte del proyecto GNU (aunque su sitio web fuera de gnu.org puede causar confusión) y se distribuye bajo la GNU Lesser General Public License (LGPL).
GMP se usa para aritmética de números enteros en muchos sistemas de álgebra computacional como Mathematica [9] y Maple . [10] También se usa en la Biblioteca de Algoritmos de Geometría Computacional (CGAL) porque los algoritmos de geometría tienden a "explotar" cuando se usan matemáticas de CPU de coma flotante ordinarias. [11]
Se necesita GMP para construir la Colección de compiladores GNU (GCC). [12]
Ejemplos de
Aquí hay un ejemplo de código C que muestra el uso de la biblioteca GMP para multiplicar e imprimir números grandes:
#include #include int main ( void ) { mpz_t x , y , result ; 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 ); return 0 ; }
Este código calcula el valor de 7612058254738945 × 9263591128439081.
Compilar y ejecutar este programa da este resultado. (La -lgmp
bandera se usa si se compila en sistemas de tipo Unix).
7612058254738945* 9263591128439081--------------------70514995317761165008628990709545
A modo de comparación, se puede escribir en su lugar el siguiente programa C ++ equivalente. (Las -lgmpxx -lgmp
banderas se utilizan si se compila en sistemas de tipo Unix).
#include #include int main () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); std :: cout << "" << x << " \ n " << "* \ n " << "" << y << " \ n " << "---------- ---------- \ n " << x * y << " \ n " ; return 0 ; }
Enlaces de idioma
Nombre de la biblioteca | Idioma | Licencia |
---|---|---|
Biblioteca GNU de precisión múltiple | C , C ++ | LGPL |
Matemáticas :: GMP | Perl | LGPL |
Matemáticas :: GMPz , Matemáticas :: GMPf y Matemáticas :: GMPq | Perl | Licencia artística v1.0 + GPL v1.0 o posterior |
Proyecto Python de multiprecisión general | Pitón | LGPL |
R paquete 'gmp' | R | GPL |
El proyecto RubyGems | Rubí | Apache 2.0 |
Fijaciones Rust FFI para GMP, MPFR y MPC | Oxido | LGPL |
Biblioteca GNU de precisión múltiple para PHP | PHP | PHP |
Rutinas de precisión múltiple GNU para SBCL | Lisp común | Dominio publico |
Ch GMP | Ch | Propiedad |
Envoltorio GMP paralelo para BMDFM | BMDFM LISP / C | Dominio publico |
Compilador Glasgow Haskell (la implementación de Integer es básicamente un enlace a GMP) | Haskell | BSD |
luajit-gmp | LuaJIT | MIT |
envoltorio-gmp-para-delphi | Delphi | MIT |
Zarith | OCaml | LGPL |
Biblioteca Math.Gmp.Native | .NETO | MIT |
nim-gmp | Nim | MIT |
Ver también
- GNU MPFR : una biblioteca para cálculos de precisión arbitraria con redondeo correcto, basada en GNU MP
- CLN : una biblioteca de clases para precisión arbitraria
- MPIR : una bifurcación de GMP con una interfaz en su mayoría compatible, que tiene como objetivo proporcionar un sistema de compilación basado en MSVC para plataformas Windows
Referencias
- ^ "Archivo GNU MP" . Consultado el 3 de diciembre de 2018 .
- ^ V6.2.1 - "La biblioteca GNU MP Bignum" . Consultado el 15 de noviembre de 2020 .
- ^ a b "¿Qué es GMP?" . Consultado el 7 de abril de 2014 .
- ^ Granlund, Torbjorn (6 de julio de 2009). "Problemas con mpz_set_str y cadenas enormes" . Consultado el 17 de marzo de 2013 .
- ^ "Noticias 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?" . Consultado el 17 de marzo de 2013 .
- ^ "GNU Classpath 0.98" Mejor tarde que nunca " " . 2009-02-05 . Consultado el 17 de marzo de 2013 .
- ^ "Biblioteca GNU MP Bignum" . Consultado el 3 de diciembre de 2018 .
- ^ "El Kernel de Mathematica: problemas en el diseño y la implementación" . Octubre de 2006 . Consultado el 17 de marzo de 2013 .
- ^ "La biblioteca de GNU Multiple Precision (GMP)" . Maplesoft . Consultado el 17 de marzo de 2013 .
- ^ "Manuales CGAL" .
- ^ GCC usa labiblioteca GNU MPFR , que a su vez se basa en GMP. "Serie de versiones GCC 4.3: cambios, nuevas funciones y correcciones" . 2012-11-02 . Consultado el 17 de marzo de 2013 .
enlaces externos
- Página web oficial