Algorithm 数的素因子乘积

Algorithm 数的素因子乘积,algorithm,primes,number-theory,Algorithm,Primes,Number Theory,给定一个数字X,计算该数字的素数因子乘积的最有效方法是什么? 有没有一种方法可以在没有实际因素分解的情况下做到这一点? 请注意,需要素数因子的乘积(均为幂单位)。此答案解决了您问题的后半部分,即,是否可以计算素数因子的乘积而无需对数字进行因式分解。这个答案表明这是可能的,并且显示了一种比简单的因式分解方法更有效的方法。然而,正如评论中所指出的,这种建议的方法仍然不如使用更高级的方法分解数字那样有效 设k为该数的立方根 检查所有大小为k或更小的素数,并将找到的任何素数分开 我们现在知道结果数是大于

给定一个数字X,计算该数字的素数因子乘积的最有效方法是什么? 有没有一种方法可以在没有实际因素分解的情况下做到这一点?
请注意,需要素数因子的乘积(均为幂单位)。

此答案解决了您问题的后半部分,即,是否可以计算素数因子的乘积而无需对数字进行因式分解。这个答案表明这是可能的,并且显示了一种比简单的因式分解方法更有效的方法。然而,正如评论中所指出的,这种建议的方法仍然不如使用更高级的方法分解数字那样有效

设k为该数的立方根

检查所有大小为k或更小的素数,并将找到的任何素数分开

我们现在知道结果数是大于k的素数的乘积,所以它必须是1,一个素数,或者是2个素数的乘积。(它不能有超过2个素数,因为k是数字的立方根。)

我们可以通过简单地测试这个数是否是一个完美的平方来判断它是否是两个素数的乘积

这个结果允许我们计算O(n^(1/3)/log(n))中的结果,假设我们已经预先计算了素数列表

例1 假设我们的电话号码是9409

立方根是21.1,所以我们首先检查21下的素数是否可以整除

它们都找不到结果,因此我们计算sqrt并找到9409==97**2

这意味着答案是97

例2 假设我们有9797号

立方根是21.4,所以我们检查21下的素数是否可以整除

它们都找不到结果,所以我们计算sqrt,发现9797不是一个完美的平方


因此,我们得出结论,答案是9797。(请注意,我们还没有确定要得出这个答案的因式分解。事实上,因式分解是97*101。)

Maple和Mathematica都通过因式分解,然后将每个素数的一个副本相乘,来计算一个数的无平方核(请参阅)所以我怀疑还有更好的方法。另一种方法是从数字本身开始。它显然是所有主要因素的产物。您希望删除所有具有多个幂的因子。因此,您不介意该数字是否有因子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
方法移除更高的优先级电源(编号)

这不清楚。天真的答案是
返回X…我的无知并不能说明什么,但我知道如果不知道X的素数因子,就无法计算任意X的值。AFAIK,答案是否定的,没有任何方法可以推导出一个数的素数因子的乘积,它比分解该数更有效(大O值)。然而,仔细考虑一下,你可能会发现更多的知识/专家答案,计算
积(p)
,其中
p
n
的主要因子,在计算上似乎与计算
积(p-1)
有效等效,后者是欧拉的toticent函数。我做过这样的程序,它们都需要某种方式的分解。事实上,RSA加密方案的强度取决于
ToClient(n)
与分解
n
一样困难。您的问题不清楚。你想要所有素因子的乘积还是唯一素因子的乘积?也就是说,给定有素数因子(2,2,7)的数字28,您希望答案是14吗?这并不比分解数字更有效。@rbaryyoung分解的复杂性是什么?我曾设想过一种天真的方法,尝试所有素数,直到数的平方比。@PeterdeRvaz分解是一个非常复杂和复杂的领域,谷歌和维基百科比我更能回答这个问题。然而,你应该问自己的第一个问题是,“我的建议是否比因子分解更快,甚至与因子分解不同?”到目前为止,答案是否定的,你提出的所有建议都是天真因子分解中的常见技巧。很好的技巧,让我们不要完全完成因子分解。。。但真正复杂的因式分解算法无论如何要快得多。因此,只有当与简单的试除法相比,而不是像椭圆曲线分解这样复杂的东西时,这个技巧才是值得的。如果你能做ECF,用它做全因子分解要比用这个技巧(当然是说大数字)试除法做半因子分解快得多。2*11*13*13=3718。立方根是15.49。。。所有的素因子都低于这个值,所以我们将它们除以后得到1。还是我误解了你的方法?当
temp MOD factor!=0
temp
的值每次在
temp中循环时都会改变,它将在任何存储空间小于无限的计算机中终止。
primes
列表的大小可根据输入测试编号X的值范围进行设置,该范围在问题中未指定。因为这个原因,我把它开着。