使用mpz_nextprime迭代质数

时间:2018-01-21 18:58:30

标签: c++ gmp

在C ++中,我想要打印第一个n素数(对于这个例子,我们假设n=1000)。

为了做到这一点,我在GMP图书馆找到了mpz_nextprime

我假设你像这样使用它

int n = 2;
for(int i = 0; i < 1000; i++) {
    n = mpz_nextprime(n);
    cout << n << endl;
}

但这不会编译,因为mpz_nextprime需要两个mpz_t个参数。

如何在此上下文中使用mpz_nextprime

1 个答案:

答案 0 :(得分:2)

mpz_nextprime使用mpz_t代替intlong等普通整数类型的原因是,在某一点之后,素数将太大而无法表示在intlong

这里有一段代码可以打印所有第1000个素数:

#include <gmp.h>

int main() {
    mpz_t n;
    mpz_init(n);
    mpz_set_ui(n, 2);
    for (size_t i = 0; i < 1000; i++) { // first 1000 primes
        mpz_nextprime(n, n);
        cout << "The " << (i + 1) << "th " << " prime is " << mpz_get_ui(n) << endl;
    }
}

请注意,此代码仅适用于某个素数,因为为了打印它,我们使用mpz_get_ui将其转换为unsigned int。

如果您要打印较大的素数,请使用mpz_get_str(但如果您使用free()作为第一个参数,请不要忘记NULL字符串。