【问题标题】:Algorithm of divisors除数算法
【发布时间】:2016-10-30 16:32:11
【问题描述】:

我得到了一个整数列表(最多 1000 个),它们乘以给定的整数 n

我需要在整数n的所有除数中找到最大的幂。

例如:4,7,8 乘以 224,则最高幂将是 5,因为 224=2^2*7*2^3=2^5*7。

问题是,这 1000 个整数可以大到 2^64,因此n 非常大。

什么是解决这个问题的好算法?

【问题讨论】:

  • 这是一个技巧问题。每个整数的最大素因数(包括整数本身,如果它们是素数)将始终与其乘积的最大素因数相同。基础数学。
  • 实际上我不是在寻找最大的素数,而是所有素数的最大幂,即最高的 k 使得 d^k 将 n 除以所有 d。它是 max{ k 使得 d^k | n 其中 d 是 n 的除数 }
  • 没关系。在计算出每个数字的素数后,您只需要将它们加起来即可。例如,以 4、7 和 8 为例,您得到 2*2、7、2*2*2。你有五个 2,这就是你的答案。您不需要将它们相乘,只需将每个整数单独分解,然后将它们相加即可。基础数学。
  • 那么这只不过是一个关于找到一个数的质因数的最有效方法的问题。我敢肯定,这里有很多关于这个主题的问题……在 Google 上搜索“Eratothenes 筛子”。
  • @SamVarshavchik:筛子对于寻找 一个 大数的因数,或找出 1,000 个数到 2^64 的因数是毫无用处的。

标签: c++ algorithm primes factorization


【解决方案1】:

很难。我会先开始检查小素数(在你的例子中:4、7、8。乘积的因子为 2^5。你除以 2 的幂,留下 1、7、1。然后你对 3 做同样的事情, 5, 7 等直到 X)。

现在你需要找到一个更大的素数 p > X,它比你找到的最高幂更高。花大量时间寻找只出现一次的主要因素似乎很浪费。您需要作为多个数字因数的素数。计算每对数字的 gcd 并查看这些数字的质因数。有很多细节需要解决,这就是为什么我从“困难”开始。

在最坏的情况下,您无法轻易找到任何出现两次的素数,因此您需要检查每个数字是否包含素数的平方作为因子。

例如:您检查了高达 1000 的因数,发现素数的最高幂是 83^3。所以现在你需要找到一个更大的素数,它是四次方,或者证明没有。计算成对的 gcd(最大公约数)。一个大素数可以是来自四个不同数字的这些 gcd 的倍数的除数,或者 p 可以是三个 gcd 的因数,而 p^2 是一个数的因数等等。

澄清原理:假设您有两个巨大的数字 x 和 y,并且您想知道除 xy 的素数的最高幂。您可以考虑 x 和 y 并从那里开始。如果它们都是素数或两个大素数的乘积,例如 x = p 或 pq,并且 y = r 或 rs,这需要很长时间。

现在计算 x 和 y 的 gcd。如果最大公约数是z > 1,那么z是x和y的因数,所以z^2是xy的因数。如果最大公约数是 1,则 x 和 y 没有公因数。由于我们不需要非平方的因子,我们寻找平方和更高的因子。为此,您只需要除以最多 x^(1/3) 或 y^(1/3) 的因子。

【讨论】:

  • @Guru:你根本不需要分解这个大数,除非它与其他数字有一个公因数,因为如果它是一个素数或两个大素数的因数,但它有没有任何其他数字的公因数,您只能得到 1 的幂。如果找不到任何平方,您可能需要寻找平方因数,但这只需要最多约 300 万的因数。
  • 我正在尝试理解您的方法.. 但是如果输入由数字 985528436837146801 的 500 倍组成怎么办。结果应该是 1000,因为结果整数等于 992737849^1000 ..
  • 您会很快发现所有数字的因数为 985528436837146801,因此您知道您有 500 次方。然后你需要检查 985528436837146801 是平方还是有平方因子。检查它是否是方形的非常快。要检查是否存在平方因子,您只需要删除最多 x^(1/3) 的因子。
  • 如果您需要 6-7 秒来分解 985528436837146801,那么您的分解算法的效率已经存在问题。搜索“factorize big number online”的第二次返回是一个在 0.005 秒内找到解决方案 992737849*992737849 的网站。因此,提高分解时间可能足以解决您的 TLE 问题。
猜你喜欢
  • 2011-07-03
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多