約数列挙のアルゴリズムについての備忘録です。
$O(\sqrt{N})$の方法
ポイントは2点です。
- 確認する整数は$1\leq x \leq \sqrt(N)$ まで
- $x$が$N$の約数ならば、$N/x$も約数
def calc(N):
res = []
for i in range(1,N+1):
#√N 以下だけ確認
if i*i > N:
break
#iがNの約数でない場合
if N%i !=0:
continue
else:
res.append(i)
#N÷i もNの約数
if N//i != i:
res.append(N//i)
res.sort()
return res
print(calc(12)) #[1, 2, 3, 4, 6, 12]
12の場合を考えてみます。
i=1
は12の約数。 さらに、12÷1=12も約数。i=2
は12の約数。さらに、12÷2=6 も約数。i=3
は12の約数。さらに、12÷2=4も約数。i=4
は、i*i=16>12
より、for文を抜ける。
よって、約数は [1, 2, 3, 4, 6, 12]
と求められます。
単純なアルゴリズム $O(N)$
正整数$N$が与えられた際、1以上$N$以下の整数を1つ1つ確認していく方法です。
res = []
for x in range(1, N+1):
if N%x == 0:
res.append(x)
まとめ
参考にしたサイト
約数列挙のアルゴリズム | アルゴ式(beta)
AtCoder 版!マスター・オブ・整数 (素因数分解編) - Qiita
お久しぶりです!アルゴリズムと整数好きのけんちょんです!今回は俗に「数学ゲー」と呼ばれるタイプの問題のうち、整数について語ります。【他シリーズ】AtCoder 版!マスター・オブ・整数 (最…