GNU Multiple Precision Arithmetic Library ( GMP ) est une bibliothèque libre pour l'arithmétique de précision arbitraire , opérant sur des entiers signés , des nombres rationnels et des nombres à virgule flottante . Il n'y a pas de limites pratiques à la précision, à l'exception de celles impliquées par la mémoire disponible (les opérandes peuvent atteindre 2 32 −1 bits sur les machines 32 bits et 2 37 bits sur les machines 64 bits). GMP dispose d'un riche ensemble de fonctions, et les fonctions ont une interface régulière. L'interface de base est pour C , mais des wrappers existent pour d'autres langages, notamment Ada , C++ , C# , Julia , .NET , OCaml , Perl , PHP , Python , R , Ruby et Rust . Avant 2008, Kaffe , une machine virtuelle Java , utilisait GMP pour prendre en charge l'arithmétique de précision arbitraire intégrée à Java. Peu de temps après, le support GMP a été ajouté à GNU Classpath .
Les principales applications cibles du GMP sont les applications et la recherche en cryptographie , les applications de sécurité Internet et les systèmes d'algèbre informatique .
GMP vise à être plus rapide que toute autre bibliothèque bignum pour toutes les tailles d'opérandes. Voici quelques facteurs importants à prendre en compte :
- Les mots complets constituent le type de base de toute arithmétique.
- Différents algorithmes sont utilisés pour différentes tailles d'opérandes ; les algorithmes plus efficaces avec de grands nombres ne sont pas utilisés lorsqu'il s'agit de petits nombres.
- Le langage assembleur (spécialisé pour différents processeurs ) est utilisé dans les boucles internes les plus courantes pour les optimiser autant que possible.
La première version GMP a été réalisée en 1991. Elle est constamment développée et maintenue.
GMP fait partie du projet GNU (bien que le fait que son site Web ne soit pas sur gnu.org puisse prêter à confusion) et est distribué sous la licence publique générale limitée GNU (LGPL).
GMP est utilisé pour l'arithmétique des entiers dans de nombreux systèmes d'algèbre informatique tels que Mathematica et Maple . Il est également utilisé dans la bibliothèque d'algorithmes de géométrie computationnelle (CGAL).
GMP est nécessaire pour construire la collection de compilateurs GNU (GCC).
Exemples
Voici un exemple de code C montrant l'utilisation de la bibliothèque GMP pour multiplier et imprimer de grands nombres :
#include <stdio.h> #include <gmp.h> int main ( void ) { mpz_t x , y , résultat ; mpz_init_set_str ( x , "7612058254738945" , 10 ); mpz_init_set_str ( y , "9263591128439081" , 10 ); mpz_init ( résultat ); mpz_mul ( résultat , x , y ); gmp_printf ( " %Zd " "* " " %Zd " "-------------------- " "%Zd " , x , y , résultat ); /* libérer la mémoire utilisée */ mpz_clear ( x ); mpz_clear ( y ); mpz_clear ( result ); retourner 0 ; }
Ce code calcule la valeur de 7612058254738945 × 9263591128439081.
La compilation et l'exécution de ce programme donnent ce résultat. (L' -lgmpindicateur est utilisé en cas de compilation sur des systèmes de type Unix.)
7612058254738945 * 9263591128439081 -------------------- 70514995317761165008628990709545
A titre de comparaison, on peut plutôt écrire le programme C++ équivalent suivant. (Les -lgmpxx -lgmpindicateurs sont utilisés en cas de compilation sur des systèmes de type Unix.)
#include <iostream> #include <gmpxx.h> int main () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); std :: cout << << x << " " << "* " << << y << " " << "---------- ---------- " << x * y << " " ; retourner 0 ; }