Algorithm 求某个数对N的互质模的修正阶乘N

Algorithm 求某个数对N的互质模的修正阶乘N,algorithm,math,factorial,modular-arithmetic,Algorithm,Math,Factorial,Modular Arithmetic,给定两个数N和p,设k为p的最大幂,使得p^k除以N并让d=N/(p^k)。所以d和p是共同的 我如何找到d mod p?直接迭代将是不切实际的,因为N将非常高。需要更高效的算法来查找表达式。以下是O(N)算法: int d=1; for(int i=1;i<=N;++i) { d*=i; while(d%p==0) d/=p; d=d%p; } intd=1; 对于(int i=1;iMayI是PPrime)?我认为不能有一个有效的通用算法。考虑案例

给定两个数
N
p
,设
k
p
的最大幂,使得
p^k
除以
N并让
d=N/(p^k)
。所以
d
p
是共同的

我如何找到d mod p
?直接迭代将是不切实际的,因为
NN
较高时,code>将非常高。需要更高效的算法来查找表达式。

以下是O(N)算法:

int d=1;
for(int i=1;i<=N;++i)
{
    d*=i;
    while(d%p==0)
      d/=p;
    d=d%p;
}
intd=1;

对于(int i=1;iMayI是PPrime)?我认为不能有一个有效的通用算法。考虑案例<代码> p> n>代码> -那么,你不能比那些<代码> n>代码>乘法更好地找到<代码> d(=n!)mod p
。还有
p
有多大?有什么限制吗?@us2012但是,即使你必须做所有的乘法,如果p是素数,你也只能存储余数模
p
,避免因式分解后的超大数。@Boris是的,当然,但这适用于任何
p