简介: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. 白盒测试--基本路径测试法

    1.为什么要有基本路径测试法? 对于路径测试,最理想的情况是路径全部覆盖,单对于复杂的大程序要做到路径覆盖是不可能的,因此可以采用基本路径测试. 2.基本路径测试法的步骤? (1)画出程序的控制流图 ...

  2. 欧拉(线性)筛 Miller_Rabin 测试素数

    void make_prime()//欧拉筛 {is_prime[1]=is_prime[0]=true;for(int i=2;i<=1e6;i++){if(!is_prime[i]){pri ...

  3. 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 ...

  4. 组合测试法是什么 软件测试,组合测试法中的全对偶测试法

    在测试设计过程中,大家都会遇到很多变量进行组合的情况,对相互组合的两个或更多变量进行的测试活动就是组合测试,一般情况下都是使用组合测试法,但这种情况很多测试人员研究得不够深入.测试人员需要开发或了解组 ...

  5. [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 ...

  6. Pollard_rho算法+Miller_Rabin算法(大素数的判断与素因子分解)(模板)

    const int S=20;//随机算法判定次数,S越大,判错概率越小 //计算 (a*b)%c. a,b都是long long的数,直接相乘可能溢出的 // a,b,c <2^63 LL m ...

  7. 黑盒测试法——等价类划分法(修改版)

     黑盒测试法--等价类划分法   实验目的:1.掌握等价类划分的方法 掌握按等价类方法设计测试用例 实验内容: 1.请用等价类划分法为三角形问题划分等价类,并设计相应的测试用例,测试下面三角形问题程序 ...

  8. miller_rabin 模板

    miller_rabin 模板 ll quick_mult(ll a, ll b, ll mod) {ll ans = 0;while(b) {if(b & 1) ans = (ans + a ...

  9. miller_rabin 证明与实现

    143. 质数判定__模板题链接 前置知识 费马小定理:ppp是质数,则对于任意的aaa,aaa与ppp互质,则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}a ...

最新文章

  1. python – 在循环中创建不同的变量名
  2. python简易爬虫课程设计_python实现简单爬虫功能的示例
  3. 关于开发人员数据库权限配置以及规范数据库升级流程
  4. python2与python3在absolute import的区别
  5. java公寓管理系统设计与实现_宿舍管理系统设计与实现
  6. Linux下C语言串口应用编程,Linux下串口C语言编程
  7. windows设置mysql使用率_Windows下配置Mysql
  8. 在Powerbuilder中播放Flash动画
  9. Sonar集成CAS
  10. ACM图论、网络流题目总结
  11. 跨服务器、跨数据库、多表联合查询
  12. PHP直播聊天室源码/财经直播源码/房间多开/游客互动/聊天审核
  13. linux c post上传文件,Linux C语言Http POST上传图片
  14. Gantt - attachEvent事件监听 - 多个参数事件(大于两个)
  15. 从Timer中学习优先队列的实现
  16. 阿里巴巴大数据实践:大数据建设方法论OneData
  17. 基于MinimaxAlpha-Beta剪枝和强化学习的播棋(Mancala)AI
  18. HTTP代理服务器的工作原理
  19. 央行企业征信异议、声明业务办理流程?
  20. SaltStack简介和安装

热门文章

  1. 并行程序设计导论_C程序设计导论
  2. swift可选类型_Swift可选
  3. Python字符串format_map()
  4. 深入了解微服务的优点与缺点
  5. typedef 的使用
  6. 两岸大学生体验福州油纸伞制作技艺
  7. Spring_Hibernate
  8. samba文件共享及账户映射
  9. 用ES6 Generator替代回调函数
  10. shell中$(( )) 与 $( ) 还有${ }的区别