C++ 为什么迭代是由i+;6每次以及为什么情况是i*i<=n对于这个素数测试函数?

C++ 为什么迭代是由i+;6每次以及为什么情况是i*i<=n对于这个素数测试函数?,c++,primality-test,C++,Primality Test,基于C++程序的优化校方方法 //如果一个数是素数 #include <bits/stdc++.h> using namespace std; bool isPrime(int n) { // Corner cases if (n <= 1) return false; if (n <= 3) return true; // This is checked so that we can skip // mi

基于C++程序的优化校方方法 //如果一个数是素数

#include <bits/stdc++.h> 
using namespace std; 

bool isPrime(int n) 
{ 
    // Corner cases 
    if (n <= 1)  return false; 
    if (n <= 3)  return true; 

    // This is checked so that we can skip  
    // middle five numbers in below loop 
    if (n%2 == 0 || n%3 == 0) return false; 

    for (int i=5; i*i<=n; i=i+6) 
        if (n%i == 0 || n%(i+2) == 0) 
           return false; 

    return true; 
}
#包括
使用名称空间std;
bool isPrime(int n)
{ 
//角落案例

如果(n任何复合数都至少有一个小于或等于其平方根的因子。为什么?因为如果它只有一个因子(除自身或一个因子外),等于它的平方根。如果它有两个或两个以上,最小的一个必须小于它的平方根。所以不需要检查大于平方根的数字——如果它不是素数,我们就已经找到了因子


代码在早期检查2或3作为因子。之后,我们只需要检查不是2或3的倍数的因子。因此,在检查5和7之后,我们不需要检查6、8、9或10。因此,在每六个数字中,我们只需要检查不是2或3的倍数的两个。

当您搜索素数时,您可以循环通过h所有介于2和你的数字之间的数字,以查看它们是否除以你的数字

for (int i=2; i < n; i=i+1) 
    if (n%i == 0)
       return false; 

虽然就我个人而言,我会做一次
sqrt()
,而不是每次循环都做一次
I*I
。但是对于
n

的小值来说,这可能会更慢。链接解释了为什么它会增加6。我会让你回答:一个数字的因子能大于它的平方根吗?
if (n%2 == 0 ) return false;

for (int i=3; i < n; i=i+2) 
    if (n%i == 0)
       return false; 
if (n%2 == 0 || n%3 == 0) return false; 

for (int i=5; i<n; i=i+6) 
    if (n%i == 0 || n%(i+2) == 0) 
       return false; 
if (n%2 == 0 || n%3 == 0) return false; 

for (int i=5; i*i<=n; i=i+6) 
    if (n%i == 0 || n%(i+2) == 0) 
       return false;