如果我有 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个因素x
,i
m。对于大于 1 且小于2^m
的任何整数j
,则所有n[j[r]]
的乘积,其中j[r]
是j
的r-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 个数字要容易得多,其中 n
和 m
小于或等于 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 的所有除数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章