我正在尝试使用MPIR的prime测试器进行快速非顺序测试;然而,我是MPIR的新手,并且对它们的用法感到困惑--特别是函数使用的"gmp_randstate_t“参数。这是我到目前为止所得到的:
#include<iostream> // used for cout
#include<mpir.h>
int main() {
mpz_t PrimeCanidate;
mpz_init(PrimeCanidate);
mpz_set_ui(PrimeCanidate, 3); // sets PrimeCanidate to unsigned int "3"
if (mpz_likely_prime_p(PrimeCanidate) == 1) {
std::cout << "Number is prime: " << std::endl;
}
}因为我只在mpz_likely_prime_p中使用了一个参数,所以它不起作用--我只是不知道它在文档(http://www.mpir.org/mpir-3.0.0.pdf pg )中所显示的其他参数(状态,目录)中寻找什么。42):

会有人碰巧有一个简单的代码来使用MPIR中的质数测试函数吗?非常感谢。
发布于 2021-01-07 17:59:05
经过多次修改,我想出了如何正确初始化mpz_likely_prime_p的“状态”和“div”参数。下面是一个计算和打印1到100之间的素数的示例:
#include<iostream> // used for cout
#include<mpir.h>
int main() {
mpz_t PrimeCanidate;
mpz_init(PrimeCanidate);
mpz_set_ui(PrimeCanidate, 2);
mpz_t additor;
mpz_init(additor);
mpz_set_ui(additor, 1);
gmp_randstate_t state;
gmp_randinit_default(state);
mpir_ui div = 0;
int maxbase = 100;
for (int base = 2; base < maxbase; base++) {
mpz_add(PrimeCanidate, PrimeCanidate, additor); // repeatedly adds one to PrimeCanidate
std::cout << "Tested Number: " << PrimeCanidate << std::endl;
if (mpz_likely_prime_p(PrimeCanidate, state, div) == 1) {
std::cout << PrimeCanidate << " is prime." << std::endl;
}
}
}这可能不是最优的,但它是有效的,并且可能是一个很好的起点。
https://stackoverflow.com/questions/65604937
复制相似问题