C++ GMP-无模幂

C++ GMP-无模幂,c++,c,gmp,C++,C,Gmp,我试图把任意大的数字提升到任意大的幂。据我所见,GMP有一个函数可以做到这一点,但对结果应用了模,还有一个函数可以让我将任意数提升为无符号int指数。有办法解决这个问题吗?通过将一个非常大的数字提升到一个非常大的幂,你可以得到一个非常大的数字数 可能比计算机内存中的存储空间还多 例如,这台笔记本电脑有6GB的主内存,这意味着6*2^30位。现在,如果将(2^10)提升到(2^10)的第次方,则得到2^10*(2^10))=2^10240。这是6*2^30的很多倍 简言之,如果你想得到一般情况的确

我试图把任意大的数字提升到任意大的幂。据我所见,GMP有一个函数可以做到这一点,但对结果应用了模,还有一个函数可以让我将任意数提升为
无符号int
指数。有办法解决这个问题吗?

通过将一个非常大的数字提升到一个非常大的幂,你可以得到一个非常大的数字数

可能比计算机内存中的存储空间还多

例如,这台笔记本电脑有6GB的主内存,这意味着6*2^30位。现在,如果将(2^10)提升到(2^10)的第次方,则得到2^10*(2^10))=2^10240。这是6*2^30的很多倍

简言之,如果你想得到一般情况的确切答案,那就没有办法了

但是,对于特定情况,您可以将答案表示为清洁电源,如2^10240,但这意味着只使用人脑或计算机代数系统,如Macsyma或Matehmatica(我不确定所有这些的名称,但用谷歌搜索)

还有一个函数,可以将任意数提升为
无符号int
指数

它是一个
无符号长整数
指数,因此,如果您所处的系统
无符号长整数
为64位(或更多),那么在未来几年内,它将超出可用内存(
2^(2^64-1)
需要几EB的存储空间)

如果您使用的是32位
无符号long
,则可以将指数拆分为两部分

if (exponent >= (1u << 31)) {
    mpz_pow_ui(base, base, exponent >> 31);
    mpz_pow_ui(base, base, 1u << 31);
}
mpz_pow_ui(base, base, exponent & ((1u << 31) - 1));
if(指数>=(1u>31);

mpz_pow_ui(base,base,1u可能是,你可以使用对数函数来计算。确保变量不会溢出。我知道这一点。我正在以任意精度计算一个特定的超越数,在某个时候,至少在理论上,我将使用这个数量级的数。我希望至少能够声称无限内存和无限时间我的程序将能够完整地计算数字。我也知道GMP可能无法实现这一点。因此,基本上,GMP的功能不足以表达如此大的值,即使它有无限内存。谢谢。对吗(目前,GMP可以随时切换到使用64位类型进行肢体计数)。但无论使用哪个库,您都会遇到内存障碍。为什么GMP支持的数字太大,无法放入世界上任何计算机的内存中?@brianbeuning
2^31
肢体(我忽略
-1
)将
2^36
2^37
位,即
2^33
2^34
字节,8或16 GB。周围已经有盒子(不是超级计算机!)有128GB的RAM,可能更多。这些实际上可以用这样的数字进行计算。因此,这些年来,我们从GMP的bignums是内存有限的过渡到了数据类型有限的。因此,切换到64位类型进行肢体计数是有意义的。我正要问一个类似的问题,我很高兴我首先在这里找到了答案。在寻找答案之前,我还没有做过初步的数学计算。