用Miller-rabin判素数之前,先要知道一个叫费马小定理的东西。

费马小定理:如果p是质数,那么任意和p互质的数的p-1次方对p取模都等于一。

即:任意gcd(a,p)==1,那么a^(p-1)≡1(mod p)

既然我们用费马小定理又得到了一个新的质数的性质,那么我们就可以用这个性质来判定素数。

为了判定p是不是质数,我们随机检验一些a检验a^(p-1)mod p是否为1

但是这样判定一个素数并不是百分百正确的,有一些数不是素数,但依据费马小定理还是会判定成素数。

例如:p=561=3*11*17,无论如何取a,都满足费马小定理的素数性质。

于是我们就需要利用二次探测的思想:
p是质数,则x^2≡1(mod p)仅有两个解,x1=1,x2=p-1(很显然,(p-1)^2=p^2-2p+1),我们这样计算a^(p-1):

  1.我们令p-1=2^s * t(因为p是质数,p-1一定是偶数,偶数一定可以表示成2^s * t)

  2.然后我们来分解2^s * t,设x0=a^t,xi=x(i-1)^2,最后我们可以得到xs=a^(p-1)(等比数列)

  3.如果|xi|!=1,且x(i+1)=1,那么p显然不是质数(因为该方程只有两个解,如果出现这种情况就是有另解,为合数)。

上面介绍了算法原理,下面是算法流程:

  1.按照上面的方法计算a^(p-1)(如果p不是质数,那么此时有可能直接返回)

  2.检查a^(p-1)≡1(mod p)

  3.当a是2~p-1的随机数时,如果p返回是合数,那他就是一定合数,如果返回是质数,则有一半的机会是质数

转载于:https://www.cnblogs.com/gshdyjz/p/7273745.html

Miller-rabin判素数相关推荐

  1. 梅森素数的判定(Lucas-Lehmer判定法 和 miller - Rabin 判定法)

    Mp = 2^p-1 且 p是素数,称为梅森数,若Mp是素数则称为梅森素数. Lucas-Lehmer判定法 判定一个数是否为梅森素数 效率足够高,如果题目特意为梅森素数设计,会卡复杂度,那么套用此方 ...

  2. miller——rabin判断素数

    我们首先看这样一个很简单的问题:判定正整数\(n\)是否为素数 最简单的做法就是枚举\(2\)到\(n\)的所有数,看是否有数是\(n\)的因数,时间复杂度\(O(n)\) 稍微优化一下发现只要枚举\ ...

  3. Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法

    boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...

  4. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  5. 素数判定算法 MILLER RABIN

    入门级筛素数--试除法,复杂度O(n^2) bool rmprime( long long n ) {for(long long i = 2; i <= sqrt(n) ; i++) if(n% ...

  6. (Miller Rabin算法)判断一个数是否为素数

    (Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...

  7. 与数论的厮守01:素数的测试——Miller Rabin

    看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...

  8. C++Miller Rabin算法的实现(附完整源码)

    C++Miller Rabin算法的实现算法 C++Miller Rabin算法的实现算法完整源码(定义,实现,main函数测试) C++Miller Rabin算法的实现算法完整源码(定义,实现,m ...

  9. 写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息

    写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息(C语言) 题目要求:如标题 思路: 需要判断n是否为素数 可以定义i,使i从2开始循环到n-1,如果n能被i整除,即跳出循环 如果i等于 ...

  10. 习题 7.3 写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。

    C程序设计(第四版) 谭浩强 习题7.3 个人设计 习题 7.3 写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息. 代码块: 方法1: #include <stdio.h> ...

最新文章

  1. 通过Shell开发企业级专业服务启动脚本案例(MySQL)
  2. python需要php吗-做网站用php还是python
  3. Python列表中字符串转数字的方法
  4. 指令集及流水线基本概念
  5. kodi android设置中文,Kodi(原XBMC)
  6. python web scraping
  7. Mysql中代替like模糊查询的一种方法
  8. 微软私有云解决方案_毕马威 AI 工厂携手微软云技术 | 共创人工智能发展,共建创新解决方案...
  9. 为什么mvc里面的ModelState.IsValid一只都是true
  10. 控制系统数字仿真与CAD-第三次实验-附完整代码
  11. python绘制玫瑰花代码视频_python turtle玫瑰花绘制效果和源代码
  12. GIS Experience (六):QGIS安装及使用教程
  13. Pix4D生成正射影像和DSM详细教程(可下载)
  14. 深入浅出WPF之我件2
  15. 计算机常识 和 应用技巧
  16. 单例模式及常用使用场景简析
  17. 75款响应式国外漂亮网站建设中模板(上线倒计时模板)
  18. unity3D地形编辑器—Terrain
  19. 算法设计7-数字迷问题
  20. 如何在TIA 博途 WinCC中组态WinCC Runtime Advanced 和 S7 控制器的PROFINET通信连接?

热门文章

  1. iOS开发之时区的获取,设置,创建
  2. SQLPro for SQLite for Mac(数据库管理软件)
  3. 动画交互原型设计:Principle for Mac
  4. Downie 4 for Mac(视频下载)
  5. After Effects报警最后日志消息是:<760504><SonyRawDecoder><5>
  6. mac连接windows远程桌面不能复制粘贴解决办法
  7. java.lang math 类
  8. 深入Session2
  9. unicode字符和多字节字符的相互转换接口
  10. centos最新版solr5.3.1安装和数据整理以及遇到的问题解答