内置素数检查功能
Built in prime checking function
>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] 中的数字进行测试
相关文章:
- C++模板功能检查唯一向量
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- winapi 中的哪个功能检查按钮是否正在关闭控制台?
- 检查两个图是否为补码的功能
- 具有检查功能的简单数字生成器,以避免重复
- 用于检查我们是否有有效数独的辅助功能
- 自定义 {fmt} 格式化函数,具有编译时格式字符串检查功能
- 模板功能以检查智能指针是否为空
- 检查数字在C 中未返回正确结果的功能
- 如何检查正确操作数以通过参考返回功能
- 在C/C 中使用检查功能的Windows NT命令行代码循环
- 重复的名称检查功能数组
- 检查变量是否满足没有呼叫的过载功能
- 在编译时检查课堂中是否可以使用静态功能
- 类型特征的理由检查班级特殊功能的琐事
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 检查Linux功能以设置线程优先级
- 在 c++e 中使用 do-while 循环进行密码检查功能时出现错误"code will never execute"
- 支架检查功能仅测试输入的前 2 个
- 质数检查并再次播放功能