我已经阅读了很多计算n的好算法! mod m但是当m是素数时它们通常是有效的。我想知道当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/
答案 0 :(得分:3)
基本算法适用于m
的任何值:
product := 1
for i := 2 to n
product := (product * i) mod m
return product
并且一个简单的优化是你可以提前纾困并在product
变为0时返回0.如果n&gt;你也可以在开始时返回0。 m,因为那保证了n!是m的倍数。
答案 1 :(得分:2)
这就是我想出来的:
#include <stdio.h>
#include <stdlib.h>
unsigned long long nfactmod(unsigned long long n, unsigned long long m)
{
unsigned long long i, f;
for (i = 1, f = 1; i <= n; i++) {
f *= i;
if (f > m) {
f %= m;
}
}
return f;
}
int main(int argc, char *argv[])
{
unsigned long long n = strtoull(argv[1], NULL, 10);
unsigned long long m = strtoull(argv[2], NULL, 10);
printf("%llu\n", nfactmod(n, m));
return 0;
}
和此:
h2co3-macbook:~ h2co3$ ./mod 1000000 1001001779
744950559
h2co3-macbook:~ h2co3$
在几分之一秒内完成。