内置素数检查功能

Built in prime checking function

本文关键字:功能 检查 内置      更新时间:2023-10-16

>C++是否有任何内置函数来检查数字是否为素数。如果是,那么在哪个图书馆?

下面是我的实现。但只是在看是否有任何内置功能。在谷歌上搜索只是提供了基于用户的实现。

int isprime(int N){
    if(N<2 || (!(N&1) && N!=2))
        return 0;
    for(int i=3; i*i<=N; i+=2){
        if(!(N%i))
            return 0;
    }
    return 1;
}

不,没有检查素数的内置函数。

您发布的解决方案可以改进:如果您只计算一次N的平方根,则可以避免i*i

如果你知道要检查的数字的范围,你可以使用筛子和地图,以免重复计算 - http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

简短的回答:不,没有这样的功能。

标准中唯一一次使用"prime"一词是 26.5.3.2 中的脚注,这是描述mersenne_twister_engine类模板的地方。脚注说:

274)该引擎的名称部分参考了其周期的属性:对于正确选择的参数值,周期与较大的梅森素数密切相关。

如果存在这样的函数,标准将包含该词的更多出现次数,因为它将用它来描述该函数的行为。

没有C++的"内置"函数,但您可以使用元编程以编译时效率解决此问题。

template <int i>
struct D
{
    D(void *);
    operator int();
};
template <int p, int i>
struct is_prime
{
    enum { prim = (p%i) && is_prime<(i>2?p:0), i>::prim };
};
template <int i>
struct Prime_print
{
    Prime_print<i-1>    a;
    enum { prim = is_prime<i,i-1>::prim };
    void f() { D<i> d = prim; }
};
struct is_prime<0,0> { enum { prim = 1 }; };
struct is_prime<0,1> { enum { prim = 1 }; };
struct Prime_print<2>
{
    enum { prim = 1 };
    void f() { D<2> d = prim; }
};
void foo()
{
    Prime_print<10> a;
}

希望对你有帮助

广泛可用的GMP库具有用于概率素数测试的快速功能,请参阅 https://gmplib.org/manual/Number-Theoretic-Functions.html

只需转换您的整数,示例代码:

bool is_prob_prime(long l)
{
    mpz_t bigint;
    mpz_init_set_si(bigint, l);
    bool ret = mpz_probab_prime_p(bigint, 25) > 0;
    mpz_clear(bigint);
    return ret;
}
template <size_t upper_limit> class prime_table final {
public:
  static_assert(upper_limit >= 2, "upper_limit too tiny");
  prime_table() {
    table_.set();
    table_.reset(0);
    table_.reset(1);
    size_t root = size_t(std::sqrt(upper_limit)) + 1;
    for (size_t pos = 2; pos <= root; ++pos) {
      for (size_t multiplier = 2; pos * multiplier <= upper_limit;
           ++multiplier) {
        table_.reset(pos * multiplier);
      }
    }
  }
  inline bool is_prime(size_t value) { return table_.test(value); }
protected:
  std::bitset<upper_limit + 1> table_;
};

它会生成一个质数表,然后您可以使用 is_prime() 针对范围 [0, upper_limit] 中的数字进行测试