我正在尝试将此库用于大素数程序。
我已经安装了GMP并设置了编译器:Microsoft Visual Studio Community 2019
我只是试图生成质数:
#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 Studio运行时,出现错误:
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
我不明白为什么会这样。
谢谢。
C4146警告只是Microsoft的胡扯。查找它以了解它,然后忽略它。完全正确的程序可以发出此警告。
代码中的真正错误(以及导致序列错误的原因是,使用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手册非常好,您应该看一下。