$n$ の素因数を出力するだけなら,
def junk(n):
"""正の整数を素因数分解して出力する."""
for i in range(2, n):
while n % i == 0:
n //= i
print(i)
if n > 1:
print(n)
最小の素因数 $2$ から繰り返し割っていけば, 割り切れる整数に素数が残っていくことは明らかなので、あとは残った $n$ が $n > 1$ であるならば, それが最後の素因数となります.
$n$ を素因数分解したとき, $\sqrt{n}$ 以上の素因数は多くても一つしか含まれないので, 最大の因数は $\sqrt{n}$ としていいことがわかります。例えば $n=360$ のとき, 最大の因数は $\sqrt{n}\ \fallingdotseq\ 18.97367$ となります. ここで $\lfloor \sqrt{n} \rfloor = 18$ としてしまうと誤差がでるため, $\lfloor \sqrt{n} \rfloor + 1$ もしくは $\lceil \sqrt{n} \rceil$ とします.
Python による実装 (1)
def trial_division(n):
"""正の整数を素因数分解し, リストで返す."""
if n == 1:
return [1]
factors = []
for i in range(2, int(n**0.5) + 1 + 1):
while n % i == 0:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
実行例
trial_division(360)
[2, 2, 2, 3, 3, 5]
計算量
$\pi(2^{n/2})$
0 コメント :
コメントを投稿