std.bigint
任意精度整数 ('bignum') 10進で1000桁以下の数値に対して最もパフォーマンスが最適化されています。 X86では、高度に最適化されたアセンブリルーチンが使用されます。 現在実装されているアルゴリズムは以下の通りです:- Karatsuba 乗算
- 二乗の計算は乗算と別個に最適化
- 分割統治除算
- 二進ベキ乗計算
std/bigint.d License:
Boost License 1.0. Authors:
Don Clugston
- 任意精度整数を表す構造体
符号無し右シフト (>>>) 以外のすべての算術演算がサポートされています。
論理演算は現在は非対応です。
BigInt はcopy-on-writeによる値セマンティクスを実装しています。
つまり、単なる代入は軽い操作ですが、x++ のような演算ではヒープ割り当てが発生し得ます。
(ただし、ほとんどのbigint演算では、ヒープ割り当てのコストは無視できるものです。
)
Example:
BigInt a = "9588669891916142"; BigInt b = "7452469135154800"; auto c = a * b; assert(c == "71459266416693160362545788781600"); auto d = b * a; assert(d == "71459266416693160362545788781600"); assert(d == c); d = c * "794628672112"; assert(d == "56783581982794522489042432639320434378739200"); auto e = c + d; assert(e == "56783581982865981755459125799682980167520800"); auto f = d + c; assert(f == e); auto g = f - c; assert(g == d); g = f - d; assert(g == c); e = 12345678; g = c + e; auto h = g / b; auto i = g % b; assert(h == a); assert(i == e); BigInt j = "-0x9A56_57f4_7B83_AB78"; j ^^= 11;
- this(T s);
- 10進または16進の文字列表現から BigInt を構築します。
書式は、D言語の10進/16進リテラルと同じです。
先頭に + か - の符号を付けることができます。16進リテラルとするには "0x" をつけます。
アンダースコアを途中に挟むことができます。
BUG:
不正な文字があった場合 IllegalArgumentException/ConvError - this(T x);
- BigInt を long 値として返します。long に入りきらない値であれば、 +- long.max を返します。
- BigInt を int 値として返します。int に入りきらない値であれば、 +- int.max を返します。
- 現在の値を格納するのに必要なuintの個数を返します。 この BigInt の絶対値は常に 2^^(32*uintLength) 未満となります。
- 現在の値を格納するのに必要なulongの個数を返します。 この BigInt の絶対値は常に 2^^(64*ulongLength) 未満となります。
- BigInt を文字列に変換し、'sink' へと渡します。
出力書式は formatString で制御します:
"d" 10進 "x" 16進、小文字 "X" 16進、大文字 "s" デフォルト ("d" と同じ) null デフォルト ("d" と同じ)