繁体   English   中英

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

[英]Given x,y, How to find whether x! is divisible by y or not?

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

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

计算x!素数因子分解 x! y 你不用计算x!就可以做到这一点x! 通过将每个数字从2分解为x并将所有因子收集在一起。 如果y的因子是x!的因子的子集x! 然后它是可分的。

如果x和y非常大,那么迭代遍历所有数字1到x是不可行的,你可以反过来分解y并计算每个素数因子,它的最大幂是否也除以x !.

在另一个答案中写了更详细的算法。

基本上检查是这样的:

// 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;
}

这导致用于复杂度O的情况x <y的算法(对y的因子化y + log x * #number的时间因素)。

显然y可以具有O(log y)素因子。 因此,对于Pollard的rho分解,这将类似于O(y ^(1/4)+ log x * log y)

使用这个定理可以证明正确性:

在此输入图像描述

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM