std.bigint
任意精度整数 ('bignum')
10進で1000桁以下の数値に対して最もパフォーマンスが最適化されています。
X86では、高度に最適化されたアセンブリルーチンが使用されます。
現在実装されているアルゴリズムは以下の通りです:
- Karatsuba 乗算
- 二乗の計算は乗算と別個に最適化
- 分割統治除算
- 二進ベキ乗計算
非常に大きな数値については、
GMP ライブラリ の使用を考慮して下さい。
- 任意精度整数を表す構造体
符号無し右シフト (>>>) 以外のすべての算術演算がサポートされています。
論理演算は現在は非対応です。
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);
-
void
opAssign(T : long)(T
x);
-
void
opAssign(T : BigInt)(T
x);
-
bool
opEquals(Tdummy = void)(ref const BigInt
y);
-
bool
opEquals(T : int)(T
y);
-
int
opCmp(T : long)(T
y);
-
int
opCmp(T : BigInt)(T
y);
-
- BigInt を long 値として返します。long に入りきらない値であれば、
+- long.max を返します。
- BigInt を int 値として返します。int に入りきらない値であれば、
+- int.max を返します。
- 現在の値を格納するのに必要なuintの個数を返します。
この BigInt の絶対値は常に 2^(32*uintLength) 未満となります。
- 現在の値を格納するのに必要なulongの個数を返します。
この BigInt の絶対値は常に 2^(64*ulongLength) 未満となります。
const void
toString(void delegate(const(char)[])
sink, string
formatString);
- BigInt を文字列に変換し、'sink' へと渡します。
出力書式は formatString で制御します:
| "d" | 10進 |
| "x" | 16進、小文字 |
| "X" | 16進、大文字 |
| "s" | デフォルト ("d" と同じ) |
| null | デフォルト ("d" と同じ) |