这是我的试验除法分解版本,它结合了仅除以二的优化和 Daniel Fischer 提出的奇数:
def factors(n):
f, fs = 3, []
while n % 2 == 0:
fs.append(2)
n /= 2
while f * f <= n:
while n % f == 0:
fs.append(f)
n /= f
f += 2
if n > 1: fs.append(n)
return fs
对二和奇数的试除法的改进是轮因式分解,它使用潜在素数之间的一组循环间隙来大大减少试除法的数量。这里我们使用 2,3,5 轮:
def factors(n):
gaps = [1,2,2,4,2,4,2,4,6,2,6]
length, cycle = 11, 3
f, fs, nxt = 2, [], 0
while f * f <= n:
while n % f == 0:
fs.append(f)
n /= f
f += gaps[nxt]
nxt += 1
if nxt == length:
nxt = cycle
if n > 1: fs.append(n)
return fs
因此,print factors(13290059)
将输出[3119, 4261]
. 因式分解轮具有与正常试验除法相同的 O(sqrt(n)) 时间复杂度,但在实践中会快两到三倍。
我在我的博客上做了很多关于素数的工作。请随时参观和学习。