1

我正在尝试使用 MPIR 的主要测试仪进行快速非顺序测试;但是,我是 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 中使用一个参数,所以它不起作用 - 我只是不知道它在寻找其他参数(状态、div)的内容,如文档(http://www.mpir. org/mpir-3.0.0.pdf第 42 页):

MPIR 文档第 42 页

是否会有人偶然拥有一个使用 MPIR 中的素数测试功能的简单代码?万分感谢。

4

1 回答 1

1

经过一番修改后,我想出了如何正确初始化 mpz_likely_prime_p 的“state”和 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;
        }
    }
}

这可能不是最佳的,但它有效并且可能是一个很好的起点。

于 2021-01-07T09:59:05.070 回答