web-dev-qa-db-ja.com

最高のクロスプラットフォーム(ポータブル)任意精度数学ライブラリ

CまたはC++の優れた任意精度の数学ライブラリを探しています。アドバイスや提案をお願いします。

主な要件:

  1. それ しなければならない 任意の大きな整数を処理します(私の主な関心は整数にあります)。 Wordのarbitrarily意的な意味がわからない場合は、100000のようなものを想像してください。 (100000の階乗)。
  2. 精度 必要ありません ライブラリの初期化/オブジェクト作成中に指定されます。精度は のみ システムの利用可能なリソースに制約されます。
  3. それ するべき プラットフォームの全機能を活用し、「小さな」数値をネイティブに処理する必要があります。つまり、64ビットプラットフォームでは、2 ^ 33 + 2 ^ 32を計算するには、利用可能な64ビットCPU命令を使用する必要があります。図書館 いけない 同じプラットフォームで2 ^ 66 + 2 ^ 65を使用する場合と同じ方法でこれを計算します。
  4. それ しなければならない 加算(+)、減算(-)、乗算(*)、整数除算(/)、剰余(%)、べき乗(**)、増分(++)、減分(-)、gcd()、階乗()、およびその他の一般的な整数算術計算。整数の結果を生成しないsqrt()(平方根)、log()(対数)などの関数を処理する能力はプラスです。 記号計算 を処理する能力はさらに優れています。

ここで私が見つけたものは次のとおりです。

  1. Javaの BigInteger そして BigDecimal クラス:私はこれまでこれを使ってきました。私はソースコードを読みましたが、その下の数学を理解していません。それは私が学んだことがない理論/アルゴリズムに基づいているかもしれません。
  2. 組み込み整数型またはコアライブラリの bc / Python / Ruby / ハスケル / 舌足らずの発音 / アーラン / OCaml / PHP /他の言語:これらのいくつかを使用したことがありますが、どのライブラリを使用しているか、またはどの種類の実装を使用しているかはわかりません。

私がすでに知っていること:

  1. を使って チャー 10進数として、および char * 10進文字列として、forループを使用して数字の計算を行います。
  2. を使用して int (または 長整数型、または 長い長い)基本的な「ユニット」および任意の長整数としてのその配列として、およびforループを使用して要素の計算を行います。
  3. 整数型を使用して、10進数(または数桁)を格納する BCD(2進化10進数)
  4. ブースの乗算アルゴリズム

わからないこと:

  1. 上記のバイナリ配列を単純な方法を使用せずに10進数で印刷します。単純な方法の例:(1)最下位から最上位にビットを追加します:1、2、4、8、16、32、...(2)aを使用します char * 中間小数の結果を保存するための上記の文字列)。

私が感謝するもの:

  1. 良い比較 [〜#〜] gmp [〜#〜]、 [〜#〜] mpfr [〜#〜]、 decNumber (またはあなたの意見で良い他のライブラリ)。
  2. 私が読むべき本/記事に関する良い提案。たとえば、 素朴な 2進数から10進数への変換アルゴリズムは正常に機能します。記事 「限定精度での2進数から10進数への変換」 ダグラス・W・ジョーンズによる良い記事の例です。
  3. 助けてください。

お願いします しない 次の場合にこの質問に答えてください:

  1. あなたが使用すると思います ダブル (または ロングダブル、または ロングロングダブル)この問題を簡単に解決できます。そう考えると、議論中の問題を理解していないことを意味します。

GMPは一般的な選択肢です。 Squeak Smalltalkには非常に素晴らしいライブラリがありますが、Smalltalkで書かれています。

関連する書籍または記事を求めました。 bignumsの扱いにくい部分は、長い分割です。 Per Brinch Hansenの論文 Multiple-Length Division Revisited:A Tour of the Minefield をお勧めします。

24
Norman Ramsey

全体として、彼の最速の汎用任意精度ライブラリは [〜#〜] gmp [〜#〜] です。浮動小数点値を使用したい場合は、 [〜#〜] mpfr [〜#〜] ライブラリをご覧ください。 MPFRはGMPに基づいています。

他の言語でのネイティブの任意精度サポートについては、Pythonはライセンス、コードサイズ、コードの移植性の理由から独自の実装を使用します。 [〜#〜] gmpy [〜#〜 ] モジュールはPython GMPライブラリにアクセスします。

casevh

13
casevh

http://ttmath.org を参照してください

無料の個人用および商用用の小さなテンプレートヘッダーのみのライブラリ。

8

私は任意精度の算術ライブラリーを互いに比較していませんが、GMPにほぼ一様に落ち着いているように見える人々です。価値のあるものとして、GHC Haskellの任意精度整数とGNU Guile Schemeは両方ともGMPを使用して実装され、 pidigitsベンチマークの最速の実装言語シュートアウト はGMPに基づいています。

7
Richard Barrell