模数乘法的大数

时间:2013-01-06 09:52:22

标签: c math multiplication modular-arithmetic

我需要找到一个有效的算法来进行三个数字的模乘。

换句话说,有没有办法在C中找到它?

(100100101010001001 * 1010000100100010 * 10010001001010100101001) % 1000000007

1 个答案:

答案 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支持将结果直接设置为与操作数之一相同的变量,但我不确定。您必须在文档中进行检查。