Miller-Rabin素性测试算法

Miller_rabin算法,优势可以单独判断一个大数是否素数。缺点他是一个不保证正确的算法,我们只能通过多次执行算法让这个错误的概率很小,不过幸运的是通常来看它的错误概率可以小到忽略不计。
 
 
Miller_rabin算法描述

首先要知道费马定理只是n是素数的必要条件。即费马定理不成立,n一定是合数;费马定理成立,n可能是素数。接下来请看Miller-Rabin算法的分析过程。

 

 

 1 #include <iostream>
 2 #include <time.h>
 3 #include <algorithm>
 4 #include <stdio.h>
 5 
 6 typedef long long LL;
 7 
 8 using namespace std;
 9 
10 const int times = 20;
11 LL fac[1001];
12 int cnt;
13 
14 LL mul(LL a,LL b,LL mod){
15     LL ans = 0;
16     while (b){
17         if (b & 1){
18             ans = (ans + a) % mod;
19         }
20         a = (a<<1) % mod;
21         b >>= 1;
22     }
23     return ans;
24 }
25 
26 
27 LL pow(LL a,LL b,LL mod){
28     LL ans = 1;
29     while (b){
30         if (b & 1){
31             ans = mul(ans,a,mod);
32         }
33         b >>= 1;
34         a = mul(a,a,mod);
35     }
36     return ans;
37 }
38 
39 
40 bool witness(LL a,LL n){
41     LL temp = n - 1;
42     int j = 0;
43     while (temp % 2 == 0){  // 其实就是得到 m
44         j++;
45         temp /= 2;
46     }
47     LL x = pow(a,temp,n);   
48     if (x == 1 || x == n-1){   // 判断a^m
49         return true;
50     }
51     while (j--){
52         x = mul(x,x,n);  // 进一步判断 a^(2m)  a^(4m) ...
53         if (x == n-1)
54             return true;
55     }
56     return false;
57 }
58 
59 bool miller_rabin(LL n){
60     if (n == 2){ //  如果是2肯定是素数
61         return true;
62     }
63     if (n<2 || n % 2 == 0){ //如果小于2或者是大于2的偶数肯定不是素数
64         return false;
65     }
66     for (int i=0;i<times;i++){ //随机化检验
67         LL a = rand() % (n-1) + 1;
68         if (!witness(a,n))
69             return false;
70     }
71     return true;
72 }
73 
74 int main(){
75     LL tar;
76     while (cin >> tar){
77         if (miller_rabin(tar)){
78             cout << "Yes,Prime!" << endl;
79         } else
80             cout << "No" << endl;
81     }
82     return 0;
83 }

 

全部评论

相关推荐

(黑话警告⚠️:hc=岗位数量,&nbsp;mt=导师,&nbsp;ld=直属领导,&nbsp;cr=代码审查)25年1月,我加入了字节某前端团队,并期望能在这里待到秋招并尝试转正。然而,就在上周,ld&nbsp;找我1v1,告诉我,我的能力和团队预期不太匹配,并和我劝退。晴天霹雳吗?肯定是有的。那一刻,脑子里嗡嗡作响,各种情绪翻涌。但冷静下来想想,这几个月,自己在能掌控的范围内,确实有不少地方做得不尽如人意。所以,我想把这段不算成功的经历复盘一下,希望能给同样在努力转正的你提个醒,避开我踩过的坑。一、ld&nbsp;的要求要注意刚进组时,ld就和我聊过转正的事。我当时发问:“咱们这儿有hc&nbsp;吗?”&nbsp;ld没直接回答,只是说:“看能力,能力到了...
牛客上的彭于晏:过来人告诉你,入职后要做的第一件事儿不是说主动找活儿做,你要先学会融入团队,摸清ld的性格,投其所好。然后才是展示你的能力,能力上可以说技术或者业务,以业务能力为主,技术能力为辅。优先保证自己对业务需求的开发保证质量效率,然后再谈技术的问题,不要你觉得啥啥啥不行就想着整体优化了(发现校招生最喜欢干这事儿),我工作快5年了发现搞这种的最后都没啥好的结果,产出没有还引入新的bug,校招或者实习的水平看到的问题别人看不到嘛?为什么别人不去搞?浪费时间还没收益的事儿不要去做,技术上的能力体现在对于一个新需求,在不符合现在业务发展的架构设计上,你能拿出好的技术方案同时能考虑到后续业务发展逐渐将技术架构引入合理的架构,这是一个漫长的过程而不是一次性的
点赞 评论 收藏
分享
04-28 11:34
西北大学 运营
牛客4396号:不好意思,这个照片猛一看像丁真
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务