【发布时间】:2018-04-12 11:23:13
【问题描述】:
我遇到了一个非常奇怪的问题,似乎找不到解决方法。
以下代码找到n 的素因数分解,将素因数放入一个列表中,然后找到所有可能的素因数总和变化,并打印出该列表的唯一值。
示例:44 的质因数是 2*2*11,所以 44 会打印出来
2,2+2,11,2+11,2+2+11 = 2,4,11,13,15:
这是我的代码:
import math
import sys
import itertools
from itertools import permutations
def primes(n):
primfac = []
d = 2
while d*d <= n:
while (n % d) == 0:
primfac.append(d)
n //= d
d += 1
if n > 1:
primfac.append(n)
return primfac
def primecombo(n):
b = []
for i in range(1, len(primes(n))+1):
for subset in permutations(primes(n), i):
b.append(sum((subset)))
a = list(set(b))
a.sort()
return a
代码本身在大多数情况下似乎运行良好且高效,但由于某些非常奇怪的原因,当您处理任何唯一素因数为 2 的数字时,它变得异常缓慢。
如果您尝试 print primecombo(444444) 或 print primecombo(23452823),它几乎会立即打印结果,但如果您尝试 2048 或 4096,它会变得非常慢。
谁能明白为什么会出现这种情况以及我可以做些什么来解决它?
【问题讨论】:
-
23452823 只有 7 个因子,而 2048 有 11 个因子。由于得到排列是指数的,所以它的时间长得令人难以忍受。此外,您在每次迭代时都重新计算素数,而是将它们存储在一个变量中。
-
另外,你不需要你的素数的排列,只需要组合。这应该会显着缩短您的时间。
-
感谢 Olivier 大大加快了速度
-
当一个因子存在多次时,可以通过使用因子计数器并迭代其组合来加快速度,如果没有人这样做,我稍后会写一个完整的答案
标签: python performance permutation itertools