【问题标题】:Product of Prime factors of a number数素因数的乘积
【发布时间】:2015-07-21 03:44:52
【问题描述】:

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

【问题讨论】:

  • 这不清楚。天真的答案只是return X;...
  • 并不是我的无知说明了很多,但我不知道在不知道 X 的质因数的情况下无法计算任意 X 的 squarefree kernel
  • AFAIK,答案是 NO,没有办法推导出比考虑到这个数字。但是,您可能会在 cs.stackechange.com 上找到更多知识/专家的答案
  • 稍微想一想,计算product(p),其中pn 的质因数,在计算上似乎等效于计算product(p-1),这是欧拉的Totient 函数。我已经完成了这样做的程序,它们都需要以一种或另一种方式分解n。事实上,RSA 加密方案的强度取决于 Totient(n) 与分解 n 一样难。
  • 您的问题不清楚。您想要所有质因数的乘积还是唯一质因数的乘积?也就是说,给定具有质因数 (2,2,7) 的数字 28,您希望答案是 14 吗?

标签: algorithm primes number-theory


【解决方案1】:

此答案解决了您问题的后半部分 - 即是否可以在不分解数字的情况下计算主要因素的乘积。这个答案表明它是可能的,并且显示了一种比简单的分解方法更有效的方法。然而,正如 cmets 中所指出的,这种提出的方​​法仍然不如使用更先进的方法分解数字那样有效。

设 k 为数字的立方根。

检查所有大小为 k 或更小的素数,然后除掉我们找到的所有素数。

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

我们可以通过简单地测试这个数字是否是一个完美的平方来检测它是否是2个素数的乘积。

假设我们已经预先计算了一个素数列表,这个结果允许我们以 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。)

【讨论】:

  • 这并不比分解数字更有效。
  • @RBarryYoung 分解的复杂性是什么?我假设了一种尝试所有素数直到数字的 sqrt 的天真的方法。
  • @PeterdeRvaz 因式分解是一个非常复杂和精密的领域,Google 和 Wikipedia 比我回答得更好。但是,您应该问自己的第一个问题是,“我提出的建议是否比因式分解更快甚至不同?”到目前为止的答案是,一切您所建议的也是朴素分解中的常见技巧。
  • 好把戏,让我们不要完全完成因式分解……但无论如何,真正复杂的因式分解算法要快得多。所以这个技巧只有与简单的试除法相比才值得,而不是椭圆曲线分解等复杂的东西。 IOW,如果你能做 ECF,用它做全因式分解比用这个技巧通过试除法进行半因式分解要快得多(当然是说大数字)。
  • 2*11*13*13=3718。立方根是 15.49...所有质因数都低于这个值,所以我们将它们除以 1。还是我误解了你的方法?
【解决方案2】:

Maple 和 Mathematica 都通过因式分解然后将每个素数的一个副本相乘来计算数字的无平方内核(请参阅https://oeis.org/A007947),所以我怀疑是否有更好的方法。

【讨论】:

    【解决方案3】:

    另一种方法是从数字本身开始。它显然是所有主要因素的产物。您想消除所有功率大于一的因素。因此,您不介意该数字是否具有因子 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 语句都做同样的工作。所节省的只是一定数量的核算,跟踪迄今为止发现的因素,并在最后将它们相乘。

    正如彼得所说,您可以测试直到立方根的所有素数,然后检查剩余的数字是否为平方。

    【讨论】:

    • temp MOD factor != 0时退出while循环。 temp 的值每次在 temp &lt;- temp / p 中循环时都会发生变化。在某个时候,循环将退出。
    • 它将在任何存储空间小于无限的计算机中终止。 primes列表的大小可以根据输入的测试号X的取值范围来设置,问题中没有指定。出于这个原因,我把它打开了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2021-03-30
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多