miller rabin 随机素数判定法模版
2016-07-04 17:49
351 查看
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int p[8]={3,5,7,11,13,17,19,23};//8个判定素数 int power_mod(int a,int b,int n)//快速幂 { int i=0,ans=1; while ((1<<i)<=b) { if (b&(1<<i)) ans=ans*a%n; a=a*a%n; i++; } return ans; } bool pan(int p,int n,int m,int k) { int pre=power_mod(p,m,n);//根据费马小定理 if (pre==1) return false;//如果a^n-1==1(mod n),那么它是一个素数,当然有伪素数,所以多判几遍 while (k--) { int next=pre*pre%n;//<span style="font-family: Arial; font-size: 16px; line-height: 21px;">而k次测试的基于费马小定理的一个推论:x^2 % n = 1当n为素数时x的解只有两个,即1和n-1。</span> if (next==1&&pre!=1&&pre!=n-1) return true; pre=next; } return (pre!=1);//根据上面所述,如果pre不等于1,那么这个数是合数 } bool MR(int n) { if (n==2) return true; if (n<2||!(n&1)) return false; int k=0,m=n-1; while (!(m&1)) m>>=1,k++; for (int i=0;i<8;i++) { if (p[i]==n) return true; if (pan(p[i],n,m,k)) return false; } return true; } int main() { int n; scanf("%d",&n); if (MR(n)) printf("Yes");else printf("No"); return 0; }
相关文章推荐
- 【分享】WeX5的正确打开方式(5)——绑定机制
- 连线战争RPG
- git
- 大型网站架构改进历程-网站静态化-总述
- Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)
- iOS 摄像头,进行音视频的数据采集
- 知识能力结构
- JAVASCRIPT高性能执行和加载(阻塞特性)
- Java IO : outputStream 、Writer
- 优先使用单表查询,而非联合查询
- 优先使用单表查询,而非联合查询
- 非对称密码的对称密钥分发
- karma 入门
- 优先使用单表查询,而非联合查询
- 安卓手机应用软件开发 手机软件开发基础
- msmms (一) sms与mms区别
- android中两种方式打开网页
- Java注释规范整理
- java spring mvc 文件上传教程
- SQL优化法则小记