我试图将任意大的数字提高到任意大的数量。据我所知,GMP有一个函数来执行此操作,但是对结果应用模数,以及一个允许我将任意数字提升到unsigned int
指数的函数。有办法解决这个问题吗?
答案 0 :(得分:4)
和一个允许我将任意数字提升到
的函数unsigned int
指数
这是一个unsigned long int
指数,所以如果你所在的系统unsigned long
是64位(或更多),那将会超过你未来几年的可用内存({{1}需要几个Exabytes存储空间。)
如果您使用的是32位2^(2^64-1)
的系统,则可以将指数分成两部分,
unsigned long
并且很有可能需要比你更多的记忆。
另一个问题是GMP使用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));
来计算肢数,所以通常你不能使用超过int
位的数字((2^31 - 1)*BITS_PER_LIMB
是32或64取决于在平台上,通常)。
如果您认为BITS_PER_LIMB
a^b
和a > 1
不适合b
unsigned long (long)
,则无论如何都会遇到GMP和您的记忆问题。
答案 1 :(得分:3)
通过将非常大的数字提高到非常大的数字,您会得到非常大的数字。
可能比计算机内存中的空间更多数字。
例如,这款笔记本电脑的主内存为6 GB,即6 * 2 ^ 30位。现在如果你将(2 ^ 10)提升到(2 ^ 10)'次幂,你得到2 ^(10 *(2 ^ 10))= 2 ^ 10240。这比6 * 2 ^ 30多次多。
简而言之,如果你想要一般案例的确切答案,就没有办法了。
对于特定情况,您可以将答案表达为例如一个干净的力量,如2 ^ 10240,但这意味着只使用人类大脑或计算机代数系统,例如Macsyma或Matehmatica(我不确定所有这些的名字,但谷歌)。