关于一种6的倍数判定素数的方法

原理非常简单:

除了2,3,以外对于任意的n,只有6n-1和6n+1有可能是素数。(注意是有可能)

证明:

6n不是素数,因为他一定有因数2和3;

6n+2,6n+3,6n+4同样不是(分别为2,3,2的倍数)于是只剩下了6n+1和6n+5(6n-1)

那么,判断的数范围缩小为原来的三分之一

具体来讲:如果判断的数n%6!=-1或1的话,直接返回false不为质数

如果满足条件,它有可能是质数,做进一步判定:

对于每一个6n-1和6n+1来说,它一定不是2和3的倍数!(也不是4和6的倍数),那么,在枚举因子时,只需枚举6n-1和6n+1就OK了,

再加上sqrt优化。。。。

三管齐下,复杂度为O(√n/9)大概是这样吧。

bool Is_prime(int n)
{
    if(n==1) return false;
    if(n==2||n==3) return true;
    if(n%6!=1&&n%6!=5) return false;
    for(register int i=5;i*i<=n;i+=6)
        if(n%i==0||n%(i+2)==0) return false;
    return true;
}

 

完结

转载于:https://www.cnblogs.com/lbssxz/p/10927626.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值