GMP-没有模数的功率

时间:2012-11-12 14:04:56

标签: c++ c gmp

我试图将任意大的数字提高到任意大的数量。据我所知,GMP有一个函数来执行此操作,但是对结果应用模数,以及一个允许我将任意数字提升到unsigned int指数的函数。有办法解决这个问题吗?

2 个答案:

答案 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^ba > 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(我不确定所有这些的名字,但谷歌)。