bigint.js v0.5 beta 19
2004-01-14
Mozilla 「65536桁の壁」の詳細 Mozilla の JavaScript は、String型自体としては原則的に65536以上の長さを持つことができる。
しかし、matches = s.match()
としたとき、
matches[0]
(マッチした全体)は長さ65536以上になれるものの、
matches[1]
以下は、もしマッチした長さが65536以上だと、65536を法とする最小剰余に切り詰められてしまう。
Stringオブジェクト(ラッパーオブジェクト)のすべてのメソッドが65536の長さをサポートしていないため、
MozillaのStringは一般には65536以上の長さを持てない。
bigint.js のコンストラクタは現在、正規表現を使って入力文字列をパースするため、Mozilla のこのバグの影響を受ける。
正規表現を使わないことで回避は可能。多分、対応でなく回避する予定。
-
Mozilla でも、従来のコンストラクタの実装で、結果が65536桁以上になる階乗を計算できるようにした。
初めて65536桁以上になるのは、17237!であり、1725372326 から始まる 65537桁である。
(17236!は65533桁。)
従来、Mozilla では「77338桁の20000!を11802桁」のように、桁数を65536の倍数だけ少なく報告するバグがあった。
このバグの根源は、正規表現のマッチ演算子が十分なバッファを確保せず、
マッチ結果の長さは65536未満だろうと独り決めしている実装のためと思われる。
Beta 19で、階乗の演算でのこの問題を解決した。そもそもMozillaの遅さでは14000!あたりが限界である。
(IEなら20000!は余裕で、現在の記録は50000!)
-
階乗の速度は、手元のテストで、5736桁の2000!がぎりぎり2秒を切って1秒台に乗る程度。
5000!が15~16秒。10000!が75秒程度。少し前から大きな変化はないが、微妙に速くなった?
[index]