【发布时间】:2013-02-10 21:03:43
【问题描述】:
我已经阅读了很多很好的算法来计算 n! mod m 但它们通常在 m 为 prime 时有效。我想知道当 m 不是素数时是否存在一些好的算法。如果有人也可以编写算法的基本功能,我会有所帮助。我一直在使用
long long factMOD(long long n,long long mod)
{
long long res = 1;
while (n > 0)
{
for (long long i=2, m=n%mod; i<=m; i++)
res = (res * i) % mod;
if ((n/=mod)%2 > 0)
res = mod - res;
}
return res;
}
但是当我尝试打印 factMOD(4,3) 时得到错误的答案。这个算法的来源是:
http://comeoncodeon.wordpress.com/category/algorithm/
【问题讨论】:
-
只做所有的乘法 mod m - 这不会很困难。
-
This - 只要乘法的结果大于
m,就取模m。 -
@mvp-n 给了我 10^7 的顺序。我需要一个更好的算法来做到这一点。
-
您是否考虑过利用链式模数的算法?
(a*b) mod p = ((a mod p) * (b mod p)) mod p。这可以很好地帮助您解决问题,尤其是在与任何遇到零时的提前退出捷径相结合时。 -
@WhozCraig 这实际上已经尽可能地完成了;这只是一种隐含的。乘法左边是运行积,已经是mod-m;如果您应用任何一种提前退出优化,乘法的右侧应该已经小于 m,这意味着取它 mod m 是无操作的。