从质因数中找出一个数的所有因数

Find all the factors of a number from the prime factors

使用椭圆曲线分解(在 Python 中)我能够在 ~0.5 秒内找到 50 位数字的质因数。有什么方法可以将质因数转换为因数?

我通过测试小数字(496 和 28)、按特定顺序将质因数相乘而实现的。然后将这些数字相乘几乎可以得到因数,但它不是很灵活,因为我只是从一小部分质因数 (1,2,3,5) 中得到了我需要相乘的公式。

也许您正在寻找幂集中每个(唯一)集合的乘积。因此,对于 18=2*3*3,您想要 {{},{2},{3},{3},{2,3},{2,3},{3,3},{2,3,3}} 中每个集合的产品,从而得到 {1, 2, 3, 3, 6, 9, 18}.

这是我的版本,它计算素因子集的幂集的元素乘积,只保留那些唯一的乘积:

def divisors(n, fs=[]):
    if fs == []: fs = factors(n)
    divs = [1]
    for f in fs:
        temp = divs[:]
        for d in divs:
            if f * d not in temp:
                temp.append(f*d)
        divs = temp
    return sorted(divs)

它正在运行:

>>> factors(496)
[2, 2, 2, 2, 31]
>>> divisors(496)
[1, 2, 4, 8, 16, 31, 62, 124, 248, 496]
>>> factors(28)
[2, 2, 7]
>>> divisors(28)
[1, 2, 4, 7, 14, 28]

如果数被分解为素数的幂,例如 p^a q^b r^c 那么该数的可能因式是所有形式为 p^x q^y r^z 的数,其中 0 ≤ x ≤ a, 0 ≤ y ≤ b,且 0 ≤ r ≤ z。

因为你可以有不同数量的质因数,所以这是一个小编程问题。玩得开心。

您可以像这样使用 sympy 模块:

import sympy
sympy.ntheory.factorint(4960) #Factorization.
sympy.ntheory.divisors(4960) #List all divisors.