内置主要检查功能

时间:2012-06-05 12:00:22

标签: c++

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

以下是我的实施。但只是看看是否有任何内置功能。在Google上搜索只会提供基于用户的实现。

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;
}

5 个答案:

答案 0 :(得分:7)

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

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

如果您知道要检查的号码范围,可以使用筛子和地图,而不是重复计算 - http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 1 :(得分:6)

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

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

  

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

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

答案 2 :(得分:2)

没有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;
}

希望有所帮助

答案 3 :(得分:1)

广泛使用的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;
}

答案 4 :(得分:0)

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]的数字进行测试