鉴于x,y,如何找到x!可以被y整除吗?

时间:2014-04-28 18:55:30

标签: algorithm performance

计算x!可能非常昂贵,可能经常导致溢出。有没有办法找出是否x!如果没有计算x,你可以被y整除吗?

  • 对于y< x,它的微不足道;
  • 但是,对于y> x,例如x = 5,y = 60;我正在努力寻找一种不用计算x的方法!

3 个答案:

答案 0 :(得分:7)

计算x!y的{​​{3}}。您可以通过将每个数字从x!分解为2并将所有因素收集在一起来计算x,而无需计算y。如果x!的因子是{{1}}因子的子集,则它可以被整除。

答案 1 :(得分:6)

如果x和y真的很大,那么迭代遍历所有数字1到x是不可行的,你可以改为对因子进行因子分解并计算每个素数因子y的最大幂是否也分开X!

我已经写过更详细的算法in another answer

基本上检查是这样的:

// computes maximum q so that p^q divides n!
bool max_power_of_p_in_fac(int p, int n) { 
    int mu = 0;
    while (n/p > 0) {
        mu += n/p;
        n /= p;
    }
    return mu;
}
// checks whether y divides x!
bool y_divides_x_fac(int y, int x) {
    for each prime factor p^q of y:
        if (max_power_of_p_in_fac(p, x) < q)
            return false;
    return true;
}

这导致情况x <1的算法。 y的复杂度O(分解y + log x * y的素数因子的时间)。

显然,y可能具有O(log y)素数因子。所以使用Pollard's rho factorization这就像O(y ^(1/4)+ log x * log y)

可以使用this theorem证明正确性:

enter image description here

答案 2 :(得分:2)

对于i1的每个x,请更新y /= gcd(y, i)。最后的可分性检查是y == 1