BigIntegerによる巨大な数の扱い方
ここでは、J#のJDK互換ライブラリを使用して巨大な数(100!など)を扱う方法について説明します。
Decimal型で足りないとき…
.NET Frameworkに標準で用意されている基本型はいくつか存在しますが、 その中でも大きな数を扱うことのできる型はInt64(C#でいうlong)やDouble、Decimal型などがあります。 しかし、”大きな数”と言ってもInt64型では64bit、Decimalでも96bitで数を表現する為、 およそ19桁〜29桁程度しか扱うことができません。これを大きいとするか小さいとするかは、 目的によって違うところですが、時としてこれ以上の桁数が必要なときがあります。 例えば研究などの学術計算等には必須なのではないでしょうか。
多倍長整数クラスを自前で作るのは骨が折れる
巨大な数を扱う時の基本的なアプローチは、自前で多倍長整数を扱うことのできるクラスを作ることです。 しかし、その為にはそれなりの数学的知識が必要となってきます。 又、この手のクラスというものは先人の方々が作ってくれているものなので、それを使わないてはないでしょう。
C#や.NET Frameworkには巨大な数を扱うクラスなどは存在しないのですが、 JAVAやRubyには標準で多倍長整数を扱うためのクラスが装備されています。 JAVAではBigIntegerというクラスが存在します。
そこで、サンプルとして100!(階乗)を計算してみたいと思います。予めvjslib.dllを参照設定しておいてください。又 using java.math;としておくこともお忘れなく。
{
BigInteger biNum = new BigInteger("1");
for(long i=2; i<=intVal; i++)
biNum = biNum.multiply(BigInteger.valueOf(i));
return biNum;
}
一応、計算結果は、
93326215443944152681699238856266700490715968264381621468592
96389521759999322991560894146397615651828625369792082722375
8251185210916864000000000000000000000000
となりました。