用mpz_powm计算功率mod

时间:2013-08-21 23:22:44

标签: c++ gmp

我正在尝试使用mpz_powm(link)来计算一个大数字的大数字。这是代码:

#include <gmpxx.h>
#include <iostream>
using namespace std;

int main()
{
    mpz_class mod;
    mpz_pow_ui(mod.get_mpz_t(),mpz_class(2).get_mpz_t(),130);
    cout<<"mod="<<mod<<endl;
    mpz_class exp(255);
    mpz_class base(4);
    mpz_class foo;
    mpz_powm(foo.get_mpz_t(),base.get_mpz_t(),exp.get_mpz_t(),mod.get_mpz_t());
    cout<<"foo="<<foo<<endl;
}

这给了我foo = 0。最初,我认为我可能已经超过了数字mod的大小,并且因为2 ^ 130 = 1.3611295e + 39,我将mod改为:

mpz_pow_ui(mod.get_mpz_t(),mpz_class(10).get_mpz_t(),40);

这会产生foo = 1512713438470702986642486608412251521024。我不确定这是否正确。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

第一种情况肯定是正确的,4^255 = (2^2)^255 = 2^510 = (2^130) * (2^380)。所以0是模运算的预期结果。