初学MillerRabin素数测试
前言
\(MillerRabin\)素数测试是一种很实用的素数判定方法。
它只针对单个数字进行判定,因而可以对较大的乃至于\(long\ long\)范围内的数进行判定,而且速度也很快,是个十分优秀的算法。
前置定理
- 费马小定理:\(a^{p-1}\equiv1(mod\ p)\)(详见此博客:费马小定理)
- 二次探测定理:若\(p\)为奇素数且\(x^2\equiv1(mod\ p)\),则\(x\equiv1(mod\ p)\)或\(x\equiv p-1(mod\ p)\)。
大致思路
假设我们要验证\(x\)是否为素数,则我们应先找一个质数\(p\)来对其进行测试(\(p\)可以选取多个依次进行测试,只要有一个不满足就可以确定其不是质数)。
首先,我们先判断如果\(x=p\),则\(x\)必为质数(因为\(p\)为质数)。如果\(x\)是\(p\)的倍数,则\(x\)必为合数。
然后,由于费马小定理,我们先测试\(p^{x-1}\%x\)是否等于\(1\),如果不是,则它必然不是质数(这一步也叫作费马测试)。
否则,我们根据二次探测定理,先用一个\(k\)记录下\(x-1\),然后只要\(k\)为偶数就持续操作:
- 先将\(k\)除以\(2\),然后用一个\(t\)记录下\(p^k\%x\)的值。
- 如果\(t\)不等于\(1\)且不等于\(p-1\),则根据二次探测定理,\(x\)非质数。
- 如果\(t=p-1\),则无法继续套用二次探测定理,因此直接返回\(true\)。
如果一直操作到\(k\)为奇数仍然无法确定\(x\)非质数,就返回\(true\)。
这一过程应该还是比较容易理解的。
代码
class MillerRabin\\MR测试
{
private:
#define Pcnt 10
Con int P[Pcnt]={2,3,5,7,11,13,19,61,2333,24251};//用于测试的质数
I int Qpow(RI x,RI y,CI X) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
I bool Check(CI x,CI p)//测试
{
if(!(x%P[i])||Qpow(p%x,x-1,x)^1) return false;//判断x是否为p的倍数,然后费马测试
RI k=x-1,t;W(!(k&1))//持续操作直至k为奇数
{
if((t=Qpow(p%x,k>>=1,x))^1&&t^(x-1)) return false;//如果p^k不是1也不是-1,说明x不是质数
if(!(t^(x-1))) return true;//如果p^k已为-1,无法用二次探测定理,因此返回true
}return true;
}
public:
I bool IsPrime(CI x)//判断一个数是否为质数
{
if(x<2) return false;
for(RI i=0;i^Pcnt;++i) {if(!(x^P[i])) return true;if(!Check(x,P[i])) return false;}//枚举质数进行测试
return true;
}
}MR;
初学MillerRabin素数测试的更多相关文章
- Miller-Rabin素数测试算法(POJ1811Prime Test)
题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...
- Miller-Rabin素数测试
Miller-Rabin素数测试 给出一个小于1e18的数,问它是否为质数?不超过50组询问.hihocoder 我是真的菜,为了不误导他人,本篇仅供个人使用. 首先,一个1e18的数,朴素\(O(\ ...
- POJ Pseudoprime numbers( Miller-Rabin素数测试 )
链接:传送门 题意:题目给出费马小定理:Fermat's theorem states that for any prime number p and for any integer a > 1 ...
- Miller-Rabin素数测试算法
\(Miller-Rabin\)素数测试 用途 判断整数\(n\)是否是质数,在\(n\)较小的情况下,可以使用试除法,时间复杂度为\(O(\sqrt n)\).但当\(n\)的值较大的时候,朴素的 ...
- RSA,Miller-Rabin素数测试的源流及其证明
一.RSA与公钥加密系统的起源与影响. 为了更好地突出公钥加密系统相对私钥加密系统的优势,让我们从这两个问题开始: 这个世界上如果没有公钥加密系统会怎么样呢?全用私钥加密系统会出现什么问题呢? 首先, ...
- Miller-Rabin素数测试算法
用来干嘛的 要判断一个数 \(n\) 是否为素数,最朴素直接的办法是以\(O(\sqrt n)\) 时间复杂度地从2到 \(\sqrt n\) 循环即可得到最准确的结果.但是如果在 \(n\) ...
- Miller-Rabin素数测试学习小计
1.Miller-Rabin是干啥的?它是用来检测一个数字(一般是很大的数字)是不是素数: 2.Miller-Rabin算法基于的两个定理: (1)费尔马小定理:如果p是一个素数,且0<a< ...
- [模板] Miller-Rabin 素数测试
细节挺多的.. #include<iostream> #include<cstdlib> #include<cstdio> #include<ctime> ...
- luogu【模板】线性筛素数 (Miller-Rabin素数测试模板)
这个感觉还是挺好理解的,就是复杂度证明看不懂~ Code: #include <cstdio> #include <algorithm> #include <cstrin ...
随机推荐
- 配置node.js中的express框架
玩node.js,不玩后台那就是杀鸡牛刀,今天没事整理一下以前开发node.js后台的心得 1.首先安装node.js以及cnpm,在这儿我就不说了,看我node.js中的另一篇文章node.js的安 ...
- Oracle DG --检查
检查DG是否同步 01, 查看主备可切换状态 select switchover_status from v$database;select db_unique_name,open_mode,dat ...
- Go初探
官方网站:https://golang.org/ 标准库文档:https://golang.org/pkg/ 在线编码学习:https://play.golang.org/ PS:请自行FQ 简介 ...
- 基于setTimeout制作滚动广告板
很多网站在其门户页面的上方正中央都会放置一个滚动广告板,用于显示一些推荐信息,用户点击即可进入浏览.比较常见的就是各个公司的官网,电商网站的首页等. 下面是天猫的滚动广告板截图. 其实,不需要借助于什 ...
- android检查网络连接状态的变化,无网络时跳转到设置界面
在AndroidManifest.xml中加一个声明<receiver android:name="NetCheckReceiver"> <intent-filt ...
- pat00-自测4. Have Fun with Numbers (20)
00-自测4. Have Fun with Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yu ...
- nyoj 1192——Salvation——————【搜索】
Salvation 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身. Klaus(吸血鬼祖先) 为了利用 ...
- Shader学习笔记
Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...
- [转]MVC+JQuery validate实现用户输入验证
本文转自:http://www.cnblogs.com/ahui/archive/2010/10/08/1845677.html MVC服务器端: 1.在controller中验证用户输入,如果验证失 ...
- javascript动态添加表格以及获取数据
<script type="text/javascript"> var dict = { '百度': 'http://wwww.baidu.com', '新浪': 'h ...