一种肥肠快的判断素数方法

容易证明,大于6的素数一定都在6的两侧,即6i + 1 或 6i - 1,而6i + 2 到 6i + 4 一定不是素数。因为6i + 2 =  2 (3i + 1), 6i + 3 = 3(2i + 1), 6i + 4 = 2(3i + 2)。

那么由这个结论,结合传统的判断素数方法(如下):

bool prime(int index) {
    for(int i=2;i<=sqrt(index);++i)
        if(index % i == 0) return false;
    
    return true;
}

我们可以把i从每次增长1优化成每次增长6,并且大于6而不是6两边的数可以直接判断为合数。

优化后的判断素数代码如下:

bool prime(int index) { //忽略了1,有需要自己加个判断
    if(index <= 3) return true;
    if(index % 6 != 1 && index % 6 != 5) return false; //不是6两边的数不是素数
    
    int size = sqrt(index);
    for(int i=5;i<=size;i += 6) //6两边的数也不一定是素数
        if(index % i == 0 || index % (i+2) == 0) return false;
    
    return true;
}

优化后的效率是优化前的两倍还高!

posted @ 2022-03-16 18:14  killerboom  阅读(97)  评论(0)    收藏  举报