我需要找到一个有效的算法来进行三个数字的模乘。
换句话说,有没有办法在C中找到它?
(100100101010001001 * 1010000100100010 * 10010001001010100101001) % 1000000007
答案 0 :(得分:1)
如果您希望避免整数溢出,可以转换
(a * b * c) % d
到
((((a % d) * (b % d)) % d) * (c % d)) % d
在C:
unsigned long work(unsigned long a, unsigned long b, unsigned long c, unsigned long d)
{
unsigned long r = a % d;
r *= b % d;
r %= d;
r *= c % d;
r %= d;
return r;
}
它仍然可以溢出,但不如天真的版本。如果你想确定它不会溢出那么你应该使用某种形式的大数字库,如gmplib。用法如下:
unsigned long work(unsigned long a, unsigned long b, unsigned long c, unsigned long d)
{
mpz_t tmp, res;
unsigned long r;
mpz_init_set_ui(tmp, a);
mpz_mul_ui(res, tmp, b);
mpz_mul_ui(tmp, res, c);
mpz_mod_ui(res, tmp, d);
r = mpz_get_ui(res);
mpz_clear(res);
mpz_clear(tmp);
return r;
}
也许Gmplib支持将结果直接设置为与操作数之一相同的变量,但我不确定。您必须在文档中进行检查。