python - 获得一个数字的所有除数的最佳方法是什么?

标签 python algorithm math

这是非常愚蠢的方式:

def divisorGenerator(n):
    for i in xrange(1,n/2+1):
        if n%i == 0: yield i
    yield n

我想要得到的结果和这个类似,但我想要一个更智能的算法(这个太慢太笨了:-)

我可以足够快地找到主要因素及其多重性。 我有一个以这种方式生成因子的生成器:

(因子1,多重性1)
(因子2,多重性2)
(因子3, 多重性3)
等等……

的输出
for i in factorGenerator(100):
    print i

是:

(2, 2)
(5, 2)

我不知道这对我想做的事情有多大用处(我为其他问题编写了代码),无论如何我想要一种更聪明的方法

for i in divisorGen(100):
    print i

输出这个:

1
2
4
5
10
20
25
50
100

更新:非常感谢 Greg Hewgill 和他的“聪明的方式” :) 计算 100000000 的所有除数需要 0.01 秒,而笨方法在我的机器上采用 39 秒,非常酷:D

更新 2: 不要再说这是 this 的副本邮政。计算给定数的除数不需要计算所有除数。这是一个不同的问题,如果您认为不是,请在维基百科上查找“除数函数”。在发布之前阅读问题和答案,如果您不明白主题是什么,请不要添加无用且已经给出的答案。

最佳答案

鉴于您的 factorGenerator 函数,这里有一个应该可以工作的 divisorGen:

def divisorGen(n):
    factors = list(factorGenerator(n))
    nfactors = len(factors)
    f = [0] * nfactors
    while True:
        yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
        i = 0
        while True:
            f[i] += 1
            if f[i] <= factors[i][1]:
                break
            f[i] = 0
            i += 1
            if i >= nfactors:
                return

这个算法的整体效率将完全取决于factorGenerator的效率。

关于python - 获得一个数字的所有除数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/171765/

相关文章:

algorithm - 是否有快速算法合并排序的 B+树?

javascript - D3 中有 "axis equal"吗?

python - redisai 客户端密码/认证过程

python - 处理 Python (wxpython) 代码时出现属性错误

c++ - 任意多边形中最大的内接矩形

sql - 查询以某物开头和结尾的字符串的性能

python - 有人可以解释这个 : 0. 2 + 0.1 = 0.30000000000000004 吗?

c++ - 程序输出 "nan"

Python 用 "_"替换每一个奇怪的空格

python - 如果 a[j] 是 a[j+1] : IndexError: list index out of range