题目
代码
这题非常简单,没什么好说的,唯一要注意的就是mpz_t存储的数都大的吓人,递归甚至是普通的循环都是行不通的(爆栈或超时),要尽量减少循环次数,最好是指数性的减少。
void expmod(mpz_t e, mpz_t m, mpz_t N, mpz_t b)
{
mpz_t i, r, result;
mpz_init(i); mpz_init(r); mpz_init(result);
mpz_set(i, e);
mpz_set_ui(result, 1);
while (mpz_cmp_ui(i, 1) != 0)
{
mpz_cdiv_r_ui(r, i, 2);
if (mpz_cmp_ui(r, 0) == 0)
{
mpz_mul(m, m, m);
mpz_cdiv_q_ui(i, i, 2);
}
else
{
mpz_mul(result, result, m);
mpz_sub_ui(i, i, 1);
}
mpz_mod(m, m, N);
mpz_mod(result, result, N);
}
mpz_mul(b, m, result);
mpz_mod(b, b, N);
}