$1$ 以上 $N$ 以下の整数をランダムに生成し, これらの素因数分解に要する時間を計測しました. 生成する個数は,100,000 個としました. 素因数分解の方法は以下の4通りです. 分解する整数を $x$ とします.
- 整数 $p = 2, 3, 4, 5, \ldots$ で順次割ってみて, 割れたら $x := x / p$ とする.$p^2 > x$ となったら打ち切り.
- $\lceil\sqrt{x}\;\rceil$ までの素数リストを,エラトステネスの篩で作成して, それらの素数で順次割ってみる.あとは1と同じ.
- 事前に $\lceil\sqrt{N}\;\rceil$ までの素数リストを, エラトステネスの篩で作成しておく. あとは2と同じ.
- 事前に $N$ までの整数の最小素因数リストを, 篩の方法 で作成しておく.これを用いて分解する.
結果は以下の通りでした.
1つの整数の素因数分解に要した時間 (単位: マイクロ秒)
N | 1e5 | 2e5 | 5e5 | 1e6 | 2e6 | 5e6 | 1e7 |
---|---|---|---|---|---|---|---|
方法1 | 0.70 | 0.89 | 1.19 | 1.56 | 2.03 | 2.97 | 4.02 |
方法2 | 1.13 | 1.53 | 2.21 | 3.04 | 4.18 | 6.85 | 8.73 |
方法3 | 0.25 | 0.30 | 0.36 | 0.42 | 0.50 | 0.65 | 0.78 |
方法4 | 0.09 | 0.10 | 0.10 | 0.16 | 0.21 | 0.28 | 0.33 |
事前計算に要した時間 (単位: ミリ秒)
N | 1e5 | 2e5 | 5e5 | 1e6 | 2e6 | 5e6 | 1e7 |
---|---|---|---|---|---|---|---|
方法3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
方法4 | 0 | 1 | 2 | 6 | 22 | 69 | 147 |
(方法3では,N = 1e7 でも,0.02ミリ秒くらい)
1e7 以下の整数を 1e6 個素因数分解するのに要するトータルの時間は, 方法1では4秒,方法2では 8秒,方法3では 0.78秒,方法4では 0.47秒 ということになります. 1e6 以下の整数を 1e4 個だと, 方法1では16ミリ秒,方法2では30ミリ秒,方法3では 4ミリ秒,方法4では 7ミリ秒. 1e6 以下の整数を 1e5 個だと, 方法1では156ミリ秒,方法2では304ミリ秒,方法3では 42ミリ秒,方法4では 22ミリ秒.
ランダムの平均だけではなくて,最悪時間も測りたいところですが, まあ,とりあえず.