La migliore libreria di matematica di precisione arbitraria multi-piattaforma (portatile)

Sto cercando una buona libreria matematica di precisione arbitraria in C o C ++. Potresti darmi qualche consiglio / suggerimento?

I requisiti principali:

  1. DEVE gestire numeri interi arbitrariamente grandi (il mio interesse primario è sui numeri interi). Nel caso in cui tu non sappia cosa significhi la parola arbitrariamente grande, immagina qualcosa come 100000! (il fattoriale di 100000).
  2. La precisione NON DEVE BISOGNO essere specificata durante l’inizializzazione della libreria / la creazione dell’object. La precisione dovrebbe essere SOLO vincasting dalle risorse disponibili del sistema.
  3. DOVREBBE utilizzare tutta la potenza della piattaforma e gestire i numeri “piccoli” in modo nativo. Ciò significa che su una piattaforma a 64 bit, il calcolo di 2 ^ 33 + 2 ^ 32 dovrebbe utilizzare le istruzioni della CPU a 64 bit disponibili. La libreria NON DEVE calcolare questo nello stesso modo in cui lo fa con 2 ^ 66 + 2 ^ 65 sulla stessa piattaforma.
  4. DEVE gestire addizione (+), sottrazione (-), moltiplicazione (*), divisione intera (/), resto (%), potenza (**), incremento (++), decremento (-), gcd () , fattoriale () e altri calcoli aritmetici interi comuni in modo efficiente. La capacità di gestire funzioni come sqrt () (radice quadrata), log () (logaritmo) che non producono risultati interi è un vantaggio. La capacità di gestire calcoli simbolici è ancora migliore.

Ecco cosa ho trovato finora:

  1. La class BigInteger e BigDecimal di Java : li ho usati finora. Ho letto il codice sorgente, ma non capisco la matematica sottostante. Può essere basato su teorie / algoritmi che non ho mai imparato.
  2. Il tipo intero incorporato o nelle librerie core di bc / Python / Ruby / Haskell / Lisp / Erlang / OCaml / PHP / alcuni altri linguaggi: ne ho mai usato alcuni, ma non ho idea su quale libreria stiano usando o il tipo di implementazione che stanno utilizzando.

Quello che ho già conosciuto:

  1. Utilizzando un carattere come cifra decimale e un carattere * come stringa decimale e eseguire calcoli sulle cifre utilizzando un ciclo for.
  2. Usare un int (o un long int , o long long ) come una “unità” di base e un array come un intero lungo arbitrario, e fare calcoli sugli elementi usando un ciclo for.
  3. Utilizzo di un tipo intero per memorizzare una cifra decimale (o poche cifre) come BCD (decimale con codice binario) .
  4. Algoritmo di moltiplicazione di Booth

Quello che non so:

  1. Stampare l’array binario sopra menzionato in decimale senza utilizzare metodi naive. Esempio di un metodo naive: (1) aggiungi i bit dal più basso al più alto: 1, 2, 4, 8, 16, 32, … (2) usa una stringa char * sopra menzionata per memorizzare i risultati decimali intermedi ).

Cosa apprezzo

  1. Buoni confronti su GMP , MPFR , decNumber (o altre librerie che sono buone secondo te).
  2. Buoni suggerimenti su libri / articoli che dovrei leggere. Ad esempio, un’illustrazione con le cifre su come funziona un algoritmo di conversione da binario non decimale a decimale è buona. L’articolo “Conversione da binario a decimale in precisione limitata” di Douglas W. Jones è un esempio di un buon articolo.
  3. Qualsiasi aiuto.

Per favore NON rispondere a questa domanda se:

  1. pensi che usare un doppio (o un doppio lungo o un lungo lungo ) possa risolvere facilmente questo problema. Se la pensi così, vuol dire che non capisci il problema in discussione.

    GMP è la scelta popolare. Squeak Smalltalk ha una libreria molto bella, ma è scritta in Smalltalk.

    Hai chiesto libri o articoli pertinenti. La parte difficile dei bignum è una lunga divisione. Raccomando il documento di Per Brinch Hansen Divisione a più lunghezze rivisitato: A Tour of the Minefield .

    Nel complesso, la libreria di precisione arbitraria più veloce per uso generale è GMP . Se vuoi lavorare con valori in virgola mobile, guarda la libreria MPFR . MPFR è basato su GMP.

    Per quanto riguarda il supporto di precisione arbitrario nativo in altri linguaggi, Python utilizza la propria implementazione a causa delle ragioni di licenza, dimensione del codice e portabilità del codice. Il modulo GMPY consente a Python di accedere alla libreria GMP.

    casevh

    Non ho confrontato tra loro le biblioteche aritmetiche di precisione arbitraria, ma le persone che sembrano avere più o meno uniformsmente stabilito su GMP. Per quello che vale, gli interi di precisione arbitrari in GHC Haskell e GNU Guile Scheme sono entrambi implementati usando GMP, e l’implementazione più veloce del parametro di riferimento dei pidighi sui tiri di lingua è basata su GMP.

    Se metti in dubbio l’attualità, vedi anche http://ttmath.org

    Che mi dici di Pari? È basato sulle migliori GMP e fornisce tutte le altre chicche sulle operazioni di teoria dei numeri di cui avrai mai bisogno (e su molte cose di calcolo simbolico).

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