问题描述
我正在尝试将a
计算为b
的幂,其中a
和b
是mpz_class
类型的。 GMP手册上没有足够的样本和解释。这是我的评论:
#include <gmpxx.h>
#include <iostream>
int main(){
mpz_class r;
mpz_class a = 2;
mpz_class b = 3;
mpz_ui_pow_ui (r.get_mpz_t(),2,3);// Works
// mpz_ui_pow_ui (r.get_mpz_t(),a.get_mpz_t(),b.get_mpz_t());
/* Doesn't work. Gives
invalid conversion from 'mpz_ptr' {aka '__mpz_struct*'} to 'long unsigned int' [-fpermissive] error. In the the official documentation,there a bunch of similar pow functions such as
mpz_powm(mpz_t rop,const mpz_t base,const mpz_t exp,const mpz_t mod) without any samples.
*/
std::cout << r << '\n';
}
如何做到?
我尝试过:
mpz_pow_ui (r.get_mpz_t(),b.get_mpz_t());
它给出了相同的错误。
因为b是3,即很小的数字,所以我尝试过:
mpz_pow_ui (r.get_mpz_t(),b.mpz_get_ui());
却给了no member named __gmpz_get_ui
错误。
解决方法
GMP中没有函数可以将一个无界整数提高为另一个幂。大概是因为任何此类计算都会溢出太大而无法容纳固定大小整数的数字。
最接近您想要的是mpz_pow_ui
,它将无界整数提高为固定大小整数的幂。