我试着用这个库来做一个大素数的程序。
我安装了GMP并设置了编译器:MicrosoftVisualStudioCommunity2019
我只是想生成质数:
#include <gmp.h>
int main() {
gmp_randstate_t state; // variable state for gmp_randinit, must be initialized
mpz_t p, q, N;
mp_bitcnt_t n; // number of bits for the number in range 0 to (2^n)-1, inclusive.
n = 10;
gmp_randinit_default(state); // Initialize state with a default algorithm.
while (true)
{
mpz_urandomb(p, state, n); // Generate a uniformly distributed random integer
if (mpz_probab_prime_p(p, 50) == 2) // Determine whether p is prime. Return 2 if p is definitely prime
break;
}
while (true)
{
mpz_urandomb(q, state, n); // Generate a uniformly distributed random integer
if (mpz_probab_prime_p(q, 50) == 2) // Determine whether q is prime. Return 2 if q is definitely prime
break;
}
return 0;
}当我试图通过Visual运行时,我得到了一个错误:
C4146: unary minus operator applied to unsigned type, result still unsigned 在文件gmp.h行2230处
当我尝试通过WSL 2运行时,Ubuntu有以下内容:
g++ filename.cpp -lgmpxx -lgmp
./a.out
我得到了这个输出:Segmentation fault
我不明白这是为什么。
谢谢。
发布于 2020-03-21 19:51:12
C4146的警告只是微软的一派胡言。去了解它,然后忽略它。完全正确的程序可以发出此警告。
代码中真正的错误(以及设置错误的原因)是,使用GMP时,mpz_t变量必须在使用前初始化(在使用后销毁)。
mpz_t p, q, N;
mpz_init(p);
mpz_init(q);
mpz_init(N);
...
mpz_clear(p);
mpz_clear(q);
mpz_clear(N);GMP是一个C库,而不是C++库,因此这种手工初始化是必要的。
GMP手册很不错,你应该看看。
https://stackoverflow.com/questions/60792476
复制相似问题