【发布时间】:2015-07-27 12:06:02
【问题描述】:
我一直在做一些 Project Euler 问题来学习/练习 Lua,而我最初找到最大素因数 n 的快速而肮脏的方法非常糟糕,所以我查阅了一些代码以了解如何其他人正在这样做(试图了解不同的分解方法)。
我遇到了以下问题(最初是在 Python 中 - 这是我的 Lua):
function Main()
local n = 102
local i = 2
while i^2 < n do
while n%i==0 do n = n / i end
i = i+1
end
print(n)
end
这在 非常 很短的时间内 - 几乎立即产生了巨大的数字。我注意到的关于算法的事情是我不会猜到的:
n = n / i
这似乎存在于所有体面的算法中。我用较小的数字在纸上计算出来,我可以看到它使数字收敛,但我不明白为什么这个操作会收敛到最大的素因子上。
谁能解释一下?
【问题讨论】:
-
尝试使用较大的素数,例如 n = 10^18 + 3。当有更有效的因式分解算法可用时,算法仍然是 O(sqrt(n))
-
一个相当简单的算法是 Pollard 的 rho 算法,预期复杂度为 O(n^(1/4))