trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

C# BigInteger計算量

1\times C^{n}の計算時間(ms)を測定

環境

Windows 8.1
Core i5-4670K 3.40GHz
メモリ16G
.Net Core2.1、コードの最適化あり

結果

C\n 10 102 103 104 105 106
10 0 0 0 9 899 117362
102 0 0 0 18 1878 244316
103 0 0 0 30 2828 410290
104 0 0 0 36 3950 612554
105 0 0 0 40 4585 765774
106 0 0 0 51 5774 1069028

コード

static void Main(string[] args)
{
    for (var mg = 10L; mg <= (long)1e6; mg *= 10)
    {
        WriteLine($"倍率:{mg}");
        for (var rep = 10; rep <= (long)1e6; rep *= 10)
        {
            WriteLine($"繰り返し:{rep}");
            var sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            BigInteger c = 1;
            BigInteger bMag = (BigInteger)mg;
            for (var i = 0; i < rep; ++i)
                c *= bMag;
            sw.Stop();
            WriteLine($"time:{sw.ElapsedMilliseconds}");
        }
    }
}

背景

先日E - Flattenを解きました。LCMを計算する必要があるのですが、通常の方法(GCD求めてうんぬんかんぬん)だとオーバーフロー、回避のため素因数分解やらなんやらかんやらでごちゃりました。

他の人の提出見るとBigInteger+通常の方法でACしていたのですね。BigInteger使うと時間かかるというイメージがありましたが案外行ける*1?ということで調べてみました。

なおAtCoder上だと(10^{3})^{10^{5}}で8504ms、使用メモリは50MB以下。上記結果より3倍くらいの時間を見込んどいたほうがよさそうです。

BigIntegerの実装見て計算しろ?誰か強い人に任せる。

*1:上記問題だと最大(10^{6})^{10^{4}}程度