米勒拉宾素性测试

对于一个数n,如果想要判断它是否为素数,常规的方法为试除法。即,让n依次除以2到sqrt(n)以内的整数。如果有出现除尽的情况,则为合数。
该方法的时间复杂度为O(sqrt(n))在面对n为长整型的时候有可能超出时间要求。

因此普遍采用米勒拉宾算法进行素性判定。在此之前介绍一种伪素数判定方法——小费马定理。
小费马定理为:若有素数p,则对任意的数a( a为正整数 ,且a < p),ap−1≡1(moda^{p-1 } ≡ 1( modap−1≡1(mod p)mp )mp)m 。反之,若有任意的a( a为正整数 ,且a < p)使得p不满足 ap−1≡1(moda^{p-1} ≡ 1( modap−1≡1(mod p)p )p) ,p一定为合数。
可以发现若是能够举出所有的a,都能满足上式,是不是就说明p是素数呢?其实不是因为有一类合数也可以做到这一点,这一类合数叫做 Carmichael 数。前三个这样的数是561 ,1105,1729。
这样的数真让人不爽。所以采用这种方法测出来的所谓素数是不一定的。叫做伪素数。哪怕你枚举出所有的a,也不可避免。

在小费马定理的基础上有人设计出米勒拉宾随机素数测试法。可以大大的提高检测素数的正确性,但是同样并非一定正确,错误可能性却小到可以接受。

该方法同样利用了枚举多个a的做法,以提高算法的可靠性,对于每一个a,又采用了特殊的方法处理。这基于另外一个定理:如果p是素数,x是小于p的正整数,且x2modx^2 modx2mod p=1p = 1p=1,那么要么x=1x=1x=1,要么x=p−1x=p-1x=p−1。该定理证明如下:如果p为素数,x是小于p的正整数, 且x2modx^2 modx2mod p=1p = 1p=1 ,说明p能够整除(x+1)(x−1)(x+1)(x-1)(x+1)(x−1)。但是p是素数,那么只可能是x−1x-1x−1能被ppp整除(此时x=1x=1x=1)或x+1x+1x+1q能被ppp整除(此时 x=p−1x=p-1x=p−1)。

判断一个数是不是素数光靠上面的方法是不可靠的,因为p如果是合数的话,也有可能有x2≡1mod(p)x^2 ≡ 1 mod(p)x2≡1mod(p) 且 x=1x=1x=1或者 x=p−1x =p-1x=p−1;但是多排除几次p不为合数的话,就增大了p是素数的可能性 ,这是这个算法的核心思想。
因此例如341这个数。可知 (2340)≡1(mod( 2^{340} ) ≡ 1 (mod(2340)≡1(mod 340)340 )340); (2170)≡1(mod(2^{170})≡1(mod(2170)≡1(mod 340)340)340); 但是发现 285mod2^{85} mod285mod 341=32341=32341=32。这足以证明341是一个合数,而不是一个素数。

首先判断要判断的数n是不是2,在判断n是不是奇数。然后尽可能的在令d=n−1d=n-1d=n−1,在ddd中除去2,使得n=d∗(2t)n=d*(2^t)n=d∗(2t),d为奇数,t的值并不关心。如果n是一个素数,那么或者admoda^d modadmod n=1n=1n=1,或者存在某个i使得ad∗2imoda^{d*2^i} modad∗2imod n=n−1(0&lt;=i&lt;r)n=n-1(0&lt;=i&lt;r )n=n−1(0<=i<r)(注意i可以等于0,这就把admoda^d modadmod n=n−1n=n-1n=n−1的情况统一到后面去了)。

求admod(n)a^d mod(n)admod(n)的算法以及求d2d^2d2的算法是采用的快速幂取模算法。但是在d为long long的情况下有可能乘法溢出。有更加优秀的算法存在。

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;LL mulmod( LL a, LL b , LL p )
{LL  d =1;a = a%p;while( b>0 ){if(b&1)d = (d*a)%p;a = (a*a)%p;b>>=1;}return d;
}bool witness( LL a,LL n)
{LL d = n-1 ;if( n ==2 ) return true ;if( !(n&1) ) return false ;while(!(d&1)) d = d/2;LL t = mulmod(a,d,n);while((d!=n-1) && (t!=1)&&(t!=n-1)){t = mulmod( t ,2,n);d=d<<1;}return (t==n-1)||(d&1);
}bool isprime( LL n)
{int a[3] = {2,7,61};for(int i=0;i<3;i++)if(!witness(a[i],n))return false;return true;
}
int main()
{LL s;cin>>s;if(isprime(s))cout<<"YES";elsecout<<"NO";return 0;
}

转自:https://blog.csdn.net/qq_37957829/article/details/77335072

米勒拉宾算法(素性测试)相关推荐

  1. 米勒-拉宾(MillerRabbin)素性测试算法

    原创滴博客~https://www.cnblogs.com/precious-ZPF/p/9481599.html 小编赶紧摘过来的,多看几遍向银家多学习学习QAQ 首先,在了解米勒-拉宾素性测试之前 ...

  2. C++米勒拉宾算法模板

    //我也忘了从哪找来的板子,不过对于2^63级的数据请考虑使用java内置的米勒拉宾算法. 1 #include <iostream> 2 #include <string> ...

  3. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法

    米勒拉宾算法的基本概念如下: 首先判断这个数n的奇偶性 若为偶数仅有2是质数 奇数则进入测试 测试方法: 首先确定几个基底a,范围在[2,n-1] 因为n是奇数,所以n-1必定为偶数 则n-1可以表示 ...

  4. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  5. 费马素性测试和米勒—拉宾素性测试

    chapter 1 Fermat's little theorem 费马小定理 费马小定理说的是:如果p是一个素数,那么对于任意一个整数a,a p − a 能被p整除,也可以用模运算表示如下: (p是 ...

  6. 【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

    @TOC 素性测试是检验一个给定的整数是否为素数的测试. 最简单的就是用 n\sqrt{n}n​ 以内的数去试除.这是确定性的算法,即能准确知道 nnn 是否为质数. 但今天学习的是一种随机算法. F ...

  7. 米勒-拉宾素性检测算法

    米勒-拉宾素性检测就是目前应用比较广的一种随机化素性检测算法. 它是基于下面两个定理: (费马小定理)如果 p 为素数,且 a 无法被 p 整除,则对于所有大于0小于 p 的整数 a,有 ap−1≡1 ...

  8. C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.伪大素数生成原理 方法一 方法二 数学基础 二.费马小定理判别法 1.算法 2.代码实现 3.运行结果 二.米勒拉宾素数 ...

  9. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)

    2018宁夏网络赛 B Goldbach (米勒拉宾素数测试) 题目链接 题目大意: 给你一个偶数n (2<n<=1e18) 让你把n分解成两个素数的和.(如果有多个输出任意一个) 解题思 ...

  10. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))

    这篇博客讲的很好: https://www.cnblogs.com/ZERO-/p/9302169.html 题目描述 木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的 ...

最新文章

  1. 张钹、高文、杨强同台论道“AI精度与隐私的博弈
  2. Linux 第60,61天 ansible的playbook
  3. 从淘特升级,看电商特别模式的特别价值
  4. data.frame类型数据如何将第一列值替换为行号
  5. Java 实现线性运动界面_java 实现顺序结构线性列表
  6. 算法总结之递推与递归
  7. 客观真实的数据为何揭不开真相?
  8. VSCode安装教程(超详细)
  9. 计算机丢失dll文件怎么弄,电脑开机提示dll文件丢失怎么办?
  10. 坤坤音效键盘(Python实现)
  11. 如何用Smartbi做数据可视化分析图表
  12. python自动添加微信好友_Python实现微信自动好友验证,自动回复,发送群聊链接方法...
  13. php实现智能音箱播放内容,海尔小优智能音箱有这些功能 用好它更方便
  14. Input 输入调出数字输入
  15. 计算(输入计算式得出结果)
  16. 远程桌面拷贝数据到远程计算机,远程桌面如何复制本地文件 远程桌面拷贝电脑上的文件方法...
  17. python实用大全pdf_超级实用干货|九大技巧,带你用Python玩转PDF
  18. java 断网处理_如何处理浏览器的断网情况?
  19. JS 两数相除取百分比%并保留两位小数
  20. 从零开始实现k线图走势图绘制(iOS理论篇)

热门文章

  1. 一个学习C语言的好网站,推荐给大家
  2. Unity Kinect添加自定义姿势识别
  3. 右下角弹窗代码_vueamap使用步骤和代码示例
  4. 命名实体消歧的代码实现
  5. 资本资产定价模型(CAPM)笔记整理
  6. Dwz 国产框架 JUI 分页组件下拉菜单bug解决方案
  7. 【电脑技巧】CPU正常运行时间过长,怎么解决?
  8. PMP笔记(三)之项目整合管理
  9. win10右键一直转圈_win10 系统 桌面点右键经常转圈圈卡住。
  10. 负载均衡器部署方式和工作原理