web-dev-qa-db-fra.com

La meilleure bibliothèque mathématique de précision arbitraire multiplateforme (portable)

Je cherche une bonne bibliothèque mathématique de précision arbitraire en C ou C++. Pourriez-vous me donner quelques conseils/suggestions?

Les exigences principales:

  1. Il DOIT gérer des entiers arbitrairement grands (mon intérêt principal est sur les entiers). Dans le cas où vous ne savez pas ce que le mot arbitrairement gros signifie, imaginez quelque chose comme 100000! (la factorielle de 100000).
  2. La précision NE DOIT PAS BESOIN à spécifier lors de l'initialisation de la bibliothèque/création d'objet. La précision doit SEULEMENT être limité par les ressources disponibles du système.
  3. Il DEVRAIT utiliser toute la puissance de la plate-forme et doit gérer les "petits" nombres en mode natif. Cela signifie que sur une plate-forme 64 bits, le calcul de 2 ^ 33 + 2 ^ 32 doit utiliser les instructions de processeur 64 bits disponibles. La bibliothèque NE DEVRAIT PAS calculer cela de la même manière qu'avec 2 ^ 66 + 2 ^ 65 sur la même plate-forme.
  4. Il DOIT gérer l'addition (+), la soustraction (-), la multiplication (*), la division entière (/), le reste (%), la puissance (**), l'incrémentation (++), la décrémentation (-), le pgcd (), la factorielle () et d'autres calculs arithmétiques d'entiers communs de manière efficace. La capacité de gérer des fonctions comme sqrt () (racine carrée), log () (logarithme) qui ne produisent pas de résultats entiers est un plus. Capacité à gérer calculs symboliques est encore mieux.

Voici ce que j'ai trouvé jusqu'à présent:

  1. Javac'est BigInteger et BigDecimal classe: je les utilise jusqu'à présent. J'ai lu le code source, mais je ne comprends pas les mathématiques ci-dessous. Cela peut être basé sur des théories/algorithmes que je n'ai jamais appris.
  2. Le type entier intégré ou dans les bibliothèques de base de bc / Python / Ruby / Haskell / ZÉZAYER / Erlang / OCaml / PHP / d'autres langages: j'ai déjà utilisé certains d'entre eux, mais je n'ai aucune idée de la bibliothèque qu'ils utilisent ou du type d'implémentation qu'ils utilisent.

Ce que j'ai déjà su:

  1. Utilisant un carboniser sous forme de chiffre décimal, et carboniser* comme une chaîne décimale et faire des calculs sur les chiffres en utilisant une boucle for.
  2. Utiliser un int (ou un long intou long long) comme une "unité" de base et un tableau de celui-ci comme un entier long arbitraire, et faire des calculs sur les éléments en utilisant une boucle for.
  3. Utilisation d'un type entier pour stocker un chiffre décimal (ou quelques chiffres) comme BCD (décimal codé en binaire).
  4. algorithme de multiplication de Booth

Ce que je ne sais pas:

  1. Impression du tableau binaire mentionné ci-dessus en décimal sans utiliser de méthodes naïves. Exemple de méthode naïve: (1) ajouter les bits du plus bas au plus haut: 1, 2, 4, 8, 16, 32, ... (2) utiliser un carboniser* chaîne mentionnée ci-dessus pour stocker les résultats décimaux intermédiaires).

Ce que j'apprécie:

  1. Bonnes comparaisons sur  GMP MPFR decNumber (ou d'autres bibliothèques qui sont bonnes à votre avis).
  2. Bonnes suggestions sur les livres/articles que je devrais lire. Par exemple, une illustration illustrant comment un non naïf l'algorithme de conversion binaire en décimal fonctionne bien. L'article "Conversion binaire en décimal avec une précision limitée" par Douglas W. Jones est un exemple d'un bon article.
  3. De l'aide.

S'il vous plaît NE PAS répondez à cette question si:

  1. vous pensez utiliser un double (ou un long doubleou long long double) peut résoudre facilement ce problème. Si vous le pensez, cela signifie que vous ne comprenez pas le problème en discussion.

GMP est le choix populaire. Squeak Smalltalk a une très belle bibliothèque, mais elle est écrite en Smalltalk.

Vous avez demandé des livres ou des articles pertinents. La partie délicate des bignums est la longue division. Je recommande l'article de Per Brinch Hansen Division de plusieurs longueurs revisitée: une visite du champ de mines .

24
Norman Ramsey

Dans l'ensemble, la bibliothèque de précision arbitraire à usage général la plus rapide est GMP . Si vous souhaitez travailler avec des valeurs à virgule flottante, consultez la bibliothèque MPFR . MPFR est basé sur GMP.

En ce qui concerne la prise en charge de la précision arbitraire native dans d'autres langues, Python utilise sa propre implémentation pour des raisons de licence, de taille de code et de portabilité du code. Le GMPY le module permet à Python d'accéder à la bibliothèque GMP.

casevh

13
casevh

Voir http://ttmath.org

Petite bibliothèque de modèles uniquement en-tête pour une utilisation personnelle et commerciale gratuite.

8
Andrey Syrokomskiy

Je n'ai pas comparé les bibliothèques arithmétiques de précision arbitraire les unes aux autres moi-même, mais les gens qui semblent s'être plus ou moins uniformément installés sur GMP. Pour ce que ça vaut, les entiers de précision arbitraires dans GHC Haskell et GNU Guile Scheme sont tous deux implémentés en utilisant GMP, et la mise en œuvre la plus rapide du benchmark pidigits sur la fusillade de langue est basé sur GMP.

7
Richard Barrell

Et Pari? Il est construit sur GMP et fournit tous les autres avantages sur les opérations de théorie des nombres dont vous aurez besoin (et de nombreuses choses de calcul symbolique).

http://pari.math.u-bordeaux.fr/

4
fortran