密码学课设 模重复平方 Hust

题目

在这里插入图片描述

代码

这题非常简单,没什么好说的,唯一要注意的就是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);
}

猜你喜欢

转载自blog.csdn.net/qq_43434682/article/details/108663075