Even on a 64-bit system it seems that the exp argument of mpz_pow_ui cannot be 2^32 or larger.
To prove this really is a 64-bit build, first n is successfully set to 2^32.
The second code block tries to calculate 2^(2^32) but apparently calculates 2^0 instead.
Is this intended or a bug?
~~~
mpir_ui two32 = 65536ULL * 65536;
mpz_t n;
mpz_init(n);
mpz_init_set_ui(n, two32);
// correctly prints: init_set_ui 4294967296 10
printf("init_set_ui %zd %zd\r\n", two32, mpz_sizeinbase(n, 10));
mpz_set_ui(n, 2);
mpz_pow_ui(n, n, two32);
// because 2^0 equals 1 this prints: mpz_pow_ui 4294967296 1
printf("mpz_pow_ui %zd %zd\r\n", two32, mpz_sizeinbase(n, 10)); ~~~