Miller_Rabin测试法
简介:Miller_Rabin法是一种简便的素数测试方法,一般用于测试大数是否为素数。
Miller_Rabin测试原理:如果n是素数,且与a互质,则 。(1)
证明:请参考费马小定理证明方法。
思路:依据上述原理,我们可以不断选取与 n 互质的 a ,如果上式(1)都成立的话,那么n可能是一个素数,否则一定不是一个素数。如此一来只要a取得够多,就可以保证结果的准确度。一般在32位内的任一个整数n,如果其通过以2、7、61为底的Miller_Rabin测试,那其一定是素数,反之则一定不是。
优化:通过(1)式,只能说大概率验证素性,但是仅仅如此是不够的,为了减少误判的可能,同时大大减少计算量,可以通过如下结论进行优化:
定理:如果
,则必有
或
。
如果有一个大于2的质数 n ,令 n - 1 = 2^s * d,其中d为奇数,根据费马小定理,如果a不能被素数n整除,那么
。于是可以得出:,
或者
,
,(0<= r < s)。
于是只要找到一个a,满足
或者存在一个自然数r(0 <= r < s),使得
,就可以说明n一定不是素数,反之则有可能是素数。
模板:
#include<cstdio>
typedef long long ll;ll qpow(ll a,ll b,ll m){ //快速幂算法 ll res = 1;while(b){if(b&1) res = res*a%m;a = a*a%m;b >>= 1;}return res%m;
}bool Miller(ll x,ll n){ //Miller_Rabin测试 ll b = n-1;while(!(b&1)) b >>= 1;x = qpow(x,b,n); //此时b为没有因子2的奇数 while(b < n-1 && x != 1 && x != n-1)x = (x*x)%n,b <<= 1; return x == n-1 || b&1 == 1;//当x=n-1,或b为奇数时返回true;
}
bool isPrime(ll n){if(n == 2 || n == 7 || n == 61) return true;if(n == 1 || !(n&1)) return false;return Miller(2,n)&&Miller(7,n)&&Miller(61,n);
}
int main(){ll n;scanf("%lld",&n);if(isPrime(n)) puts("Yes");else puts("No");
}
转载于:https://www.cnblogs.com/long98/p/10352154.html
Miller_Rabin测试法相关推荐
- 白盒测试--基本路径测试法
1.为什么要有基本路径测试法? 对于路径测试,最理想的情况是路径全部覆盖,单对于复杂的大程序要做到路径覆盖是不可能的,因此可以采用基本路径测试. 2.基本路径测试法的步骤? (1)画出程序的控制流图 ...
- 欧拉(线性)筛 Miller_Rabin 测试素数
void make_prime()//欧拉筛 {is_prime[1]=is_prime[0]=true;for(int i=2;i<=1e6;i++){if(!is_prime[i]){pri ...
- BZOJ 4802: 欧拉函数(大数因数分解算法 Pollard_rho 和素数测试算法 Miller_Rabin)
Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sample Input 8 Sample Output 4 Soluti ...
- 组合测试法是什么 软件测试,组合测试法中的全对偶测试法
在测试设计过程中,大家都会遇到很多变量进行组合的情况,对相互组合的两个或更多变量进行的测试活动就是组合测试,一般情况下都是使用组合测试法,但这种情况很多测试人员研究得不够深入.测试人员需要开发或了解组 ...
- [HDU 4344]Mark the Rope(Pollard_rho+Miller_Rabin)
Description Eric has a long rope whose length is N, now he wants to mark on the rope with different ...
- Pollard_rho算法+Miller_Rabin算法(大素数的判断与素因子分解)(模板)
const int S=20;//随机算法判定次数,S越大,判错概率越小 //计算 (a*b)%c. a,b都是long long的数,直接相乘可能溢出的 // a,b,c <2^63 LL m ...
- 黑盒测试法——等价类划分法(修改版)
黑盒测试法--等价类划分法 实验目的:1.掌握等价类划分的方法 掌握按等价类方法设计测试用例 实验内容: 1.请用等价类划分法为三角形问题划分等价类,并设计相应的测试用例,测试下面三角形问题程序 ...
- miller_rabin 模板
miller_rabin 模板 ll quick_mult(ll a, ll b, ll mod) {ll ans = 0;while(b) {if(b & 1) ans = (ans + a ...
- miller_rabin 证明与实现
143. 质数判定__模板题链接 前置知识 费马小定理:ppp是质数,则对于任意的aaa,aaa与ppp互质,则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}a ...
最新文章
- python – 在循环中创建不同的变量名
- python简易爬虫课程设计_python实现简单爬虫功能的示例
- 关于开发人员数据库权限配置以及规范数据库升级流程
- python2与python3在absolute import的区别
- java公寓管理系统设计与实现_宿舍管理系统设计与实现
- Linux下C语言串口应用编程,Linux下串口C语言编程
- windows设置mysql使用率_Windows下配置Mysql
- 在Powerbuilder中播放Flash动画
- Sonar集成CAS
- ACM图论、网络流题目总结
- 跨服务器、跨数据库、多表联合查询
- PHP直播聊天室源码/财经直播源码/房间多开/游客互动/聊天审核
- linux c post上传文件,Linux C语言Http POST上传图片
- Gantt - attachEvent事件监听 - 多个参数事件(大于两个)
- 从Timer中学习优先队列的实现
- 阿里巴巴大数据实践:大数据建设方法论OneData
- 基于MinimaxAlpha-Beta剪枝和强化学习的播棋(Mancala)AI
- HTTP代理服务器的工作原理
- 央行企业征信异议、声明业务办理流程?
- SaltStack简介和安装