给定数字X,计算该数字的 prime 因子的乘积的最有效方法是什么? 有没有办法在没有实际分解的情况下做到这一点? 注意 - 需要素数因子的乘积(所有这些都是功率统一)。
答案 0 :(得分:2)
这个答案解决了你问题的后半部分 - 即是否有可能计算出素因子的乘积而不会将数字分解。这个答案表明它可以做到,并且展示了一种比原始的因子分解方法更有效的方法。但是,正如评论中所指出的,这种提出的方法仍然不如使用更先进的方法对数字进行分解那样有效。
设k为数字的立方根。
检查大小为k或更小的所有素数的数字,并将我们发现的任何素数除去。
我们现在知道结果数是大于k的素数的乘积,因此它必须是1,单个素数或2个素数的乘积。 (它不能超过2个素数,因为k是数字的立方根。)
我们可以通过简单地测试这个数字是否是一个完美的正方形来检测它是否是2个素数的乘积。
这样的结果允许我们在O(n ^(1/3)/ log(n))中计算结果,假设我们已经预先计算了素数列表。
假设我们有9409号。
立方根是21.1所以我们首先检查21岁以下的素数的可分性。
他们都没有找到结果,所以我们计算sqrt并找到9409 == 97 ** 2.
这意味着答案是97。
假设我们有9797号。
立方根是21.4,所以我们通过21岁以下的素数检查可分性。
他们都没有找到结果所以我们计算sqrt并找到9797不是一个完美的正方形。
因此我们得出结论答案是9797.(请注意,我们还没有确定因子分解来得出这个答案。事实上,因子分解是97 * 101.)
答案 1 :(得分:2)
Maple和Mathematica都通过因子分解计算一个数的无平方内核,然后将每个素数的一个副本相乘(见https://oeis.org/A007947),所以我怀疑一个更好的方法是已知的。
答案 2 :(得分:0)
另一种方法是从数字本身开始。它显然是所有主要因素的产物。您希望删除所有具有多个幂的因子。因此,你不介意数字是否有一个因子2,但你要注意它是否有因子4(2 ^ 2)。我们可以通过消除额外因素来解决问题。
简单伪代码:
method removeHigherPrimePowers(number)
temp <- number
primes <- [2, 3, 5, 7 ...]
for each p in primes
factor <- p * p // factor = 4, 9, 25, ...
while (temp MOD factor = 0)
temp <- temp / p // Remove extra factor of p
endwhile
endfor
return temp
endmethod
这个数字正在被分解,但是因素分解有些隐藏。所有这些MOD
语句都做同样的工作。所有被保存的都是一定数量的会计,跟踪到目前为止发现的因素,并在最后将它们相乘。
正如彼得所说,你可以测试立方根的所有素数,然后检查剩下的数字是否是正方形。