私は、(Bignum、IntegerまたはBigIntと呼ばれることもある)任意精度の算術演算を実装するさまざまな方法について考えています。特定の言語に関係なく有効な任意精度の算術演算のための共通の実装方法はありますか?
共通イディオムは、スペース要件が拡大または縮小場合は実際の値を格納するための配列を使用し、必要に応じて再配分することであるように思えます。
より正確には、配列要素のビットサイズは、多くの場合、二番目に大きいサイズ一般的にサポートされている(おそらく実装がオーバーフローして計算を簡単にするために?)、電子のようです。 g。言語/プラットフォームは、128ビットサイズの数値をサポートしています - オーバーフローを処理するために64ビットの数値の配列+ 128ビットの変数
は基本的に任意精度演算を実現するためのさまざまな方法がありますか「しようとした真の」道上の巨大な性能損失なしにそれを実装するのですか?
私の質問は、基本的なデータ構造であり、操作のアルゴリズムではありません。私はKaratsuba、Toom-Cookらを知っています。
....私は、彼らがまだ残っているかどうかを確認するために最近チェックしていませんが、私は、現存CRTベースBIGNUMライブラリがあることを思い出して考えて、FFTおよびDFTは私が思うに、使用されています。 –
効率(桁上げ伝搬)のために、ビギナムはリトルエンディアン形式でバイナリ配列として最も一般的に格納されます。配列要素のサイズは実際には、桁上げ(加算)または借り(減算)を得るためにコンピュータが数値を処理する能力と関係しています。プログラミング言語に固有のため、バイトを使用可能な最も効率的なデータ型に容易にキャストできるため、bignumを保持する配列はバイト配列にすることができます。 intに4バイト、longに8バイトなど –
実際には、加減算のために、ネイティブビット長を使用できます。キャリーがある場合は、正の整数の場合はa + b aです。しかし、乗算でオーバーフローを処理するのはかなり難しいです。実行可能ですが、CPUを使用することをお勧めします。 :) –
vhallac