[英]Given x,y, How to find whether x! is divisible by y or not?
计算x! 可能非常昂贵,可能经常导致溢出。 有没有办法找出是否x! 如果没有计算x,你可以被y整除!
计算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)
使用这个定理可以证明正确性:
对于从1
到x
每个i
,更新y /= gcd(y, i)
。 最后的可分性检查是y == 1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.