如果我有 X 的素数分解,如何有效地获得 X 的所有除数? [关闭]

Posted

技术标签:

【中文标题】如果我有 X 的素数分解,如何有效地获得 X 的所有除数? [关闭]【英文标题】:How can I efficiently get all divisors of X within a range if I have X's prime factorization? [closed] 【发布时间】:2013-03-11 00:01:31 【问题描述】:

所以我有用于素数分解和除数获取的算法(在网上很容易搜索),但我不知道如何扩展它以在一个范围内找到这些除数。例如 23 到 49 之间的 100 的所有除数(任意)。但也有一些有效的东西,所以我可以将它扩展到更大范围内的大数字。起初我在考虑使用一个范围大小的数组,然后使用所有素数

有没有直接生成除数的简单方法?

【问题讨论】:

【参考方案1】:

n[i]成为你的号码的第i个因素xi m。对于大于 1 且小于2^m 的任何整数j,则所有n[j[r]] 的乘积,其中j[r]jr-th 位,是x 的除数。

考虑 105。它的因数是 [3, 5, 7]。所以 3 因子,2^3 是 8:

 0  000                = 1
 1  001              7 = 7
 2  010          5     = 5
 3  011          5 * 7 = 35
 4  100      3         = 3
 5  101      3   *   7 = 21
 6  110      3 * 5     = 15
 7  111      3 * 5 * 7 = 105

看到了吗? 105 的所有可能除数(0 和 7 有点可疑)。

【讨论】:

你能用一个例子来解释一下吗? 请注意,您确实需要重复因子。如果你得到 45 的唯一素数除数 (3,5),而不是 (3,3,5),它不会给你 9 作为可能的除数。 我试图只找到一个范围内的除数,不过——我已经有了找到所有除数的方法 在因式分解中多次生成素数的数字的重复项不是很优雅。也是 3*7=21。对于素数的多重性,使用递归和循环可能会做得更好。 将除数从高到低排序。执行 Malvolio 的建议,但使用修改后的二进制搜索来查找生成无效值的最小数字。同上生成无效值的最大数字。任何大于或小于该值的都可以忽略。可以生成并检查剩余范围内的任何内容【参考方案2】:

由于 Malvolio 正在(间接)进行,如果您想在某个范围内查找因子,我个人不会发现素数分解的用途,我将从 int t = (int)(sqrt(n)) 和然后递减直到1。 t 是一个因素2。完整的 util t 或 t/n 范围已达到(一个标志),然后(两者)都离开了范围

或者,如果您的范围相对较小,请检查这些值本身。

【讨论】:

好吧,除非这个数字真的很大(比如,2^32 * 3^32)。那么我怀疑你会想要使用这种方法。 是的,生成 2^m * 3^n 形式的所有 1089 个数字要容易得多,其中 nm 小于或等于 32。在 Python 中:[ 2**n * 3**m for m in range(33) for n in range(33) ]【参考方案3】:

如果知道n的因数,就可以计算出n的因数——那些数,包括1和n,均分 n --- 通过取 n 的因子的幂集的乘积:

function divisors(n)
    divs := [1]
    for fact in factors(n)
        temp := []
        for div in divs
            if fact * div not in divs
                append fact * div to temp
        divs := divs + temp
    return divs

获得完整的除数列表后,您可以只选择所需范围内的除数。

【讨论】:

生成完整的除数列表是 OP 明确试图避免的。

以上是关于如果我有 X 的素数分解,如何有效地获得 X 的所有除数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何分解表以获得最佳查询

POJ1365 Prime Land质因数分解素数水题

寻找素因数分解的程序

素数相关?(有关素数的题持续更新中)x

线性素数筛 ACM-ICPC 2018 南京赛区网络预赛 J Sum

快速素数分解模块