Miller-Rabin是一种高效的随机算法,用来检测一个数$p$是否是素数,最坏时间复杂度为$\log^3 p$,正确率约为$1-4^{-k}$,$k$是检验次数。

一、来源

    Miller-Rabin是由Miller和Rabin两个人根据费马小定理的逆定理,也就是费马测试优化过来的。费马小定理就是$$a^{p-1}\equiv 1(\mod p)$$

    我们知道当$p$为素数时费马小定理才成立,但是如果一个数满足费马小定理,它一定是素数吗?可以发现,当这个数肥肠小时,它是满足的,但是有一天人们发现341这个数满足以2为底的费马小定理,满足$2^{340}\equiv 1(\mod 341)$,但是它是合数$(341=11\times 31)$。

    这时,Miller和Rabin就改进了这个叫费马测试的东西……

    我不会证谁来证一下

二、二次探测定理

    有一个叫二次探测定理的东西,可以有效地提升费马小定理的正确性。如果对于素数$p$,有正整数$x<p$且$x^2\equiv 1(\mod p)$;可以推得$x^2-1\equiv 0(\mod p)\Rightarrow p|x^2-1\Rightarrow p|(x-1)(x+1)$,而$x<p$,所以如果$p|(x-1)$的话,$x-1=0,x=1$,或$p|x+1$,则$x=p-1$。因此,就有了Miller-Rabin测试。

三、Miller-Rabin素性测试

    有了二次探测定理,我们试着进行341的以2为底的费马测试。$2^{340}\equiv 1(\mod 341)$,如果341是素数,那么也满足二次探测定理,也就是$2^{170}\equiv 1(\mod 341)$。而170还是个偶数,可以继续进行二次探测定理。这时它就凉了,因为$2^{85}\equiv 32(\mod 341)$,而它没有通过二次探测定理,所以341不是个素数。

    同时,因为费马小定理没有要求底为什么,所以只以2为底肯定会放过一些漏网之鱼,我们应该多选一些数为底,这样才能使判断的正确性提高。不过这个底最好选择素数(不知道为什么,可能与答案的模数大都为质数一样吧...),来保证正确性。同时,在学习这个算法时,网上会有一写神奇的结论,比如选3个特定的底$2,7,61$,就可以通过小于$4,759,123,141$的所有素数的测试,而选$latex 2,3$为底,可以通过$1,373,653$以内的测试。因此很多人都喜欢随机几个数作为底,而题目给出的质数也不一样,这就是靠碰运气了。不过上面分析过,它的错误率只有约$4^{-k}$,所以出题人在不知道你的底数的情况下,正确率是特别高的。

四、总结

    Miller-Rabin是肥肠高效的,写起来也比较方便。而题目中远没有变态到让你线筛出$10^7$个数来,有很多包括空间在内的资源都浪费了,尤其是在卡空间的题中。这时候Milller-Rabin就是一个不错的选择。

五、Code(luogu 线性筛模板)

    因为这里的范围是$10^7$,所以用上面的特定底数$2,7,61$是可以通过的

#include<cstdio>
#include<cstring>
long long qpow(long long x,long long y,long long p)//快速幂及模数
{
long long ans=1,m=x;
while(y)
{
if(y&1)
ans*=m;
ans%=p;
m*=m;
m%=p;
y>>=1;
}
return ans;
}
bool check(long long x,long long y,long long p)//二次探测
{
long long tmp=qpow(x,y,p);
if(tmp!=1&&tmp!=p-1)
return false;
if(tmp==p-1)
return true;
if(tmp==1&&(y&1))
return true;
return check(x,y>>1,p);
}
bool millerrabin(long long x)
{
if(x<=1)
return false;
if(x==2||x==7||x==61||(check(2,x-1,x)&&check(7,x-1,x)&&check(61,x-1,x)))//注意判断到自己会挂掉,我们已经知道他们是素数了就不管了qwq
return true;
return false;
}
int main()
{
int n,m;
long long u;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%lld",&u);
if(millerrabin(u))
puts("Yes");
else
puts("No");
}
return 0;
}

  

【数学】【筛素数】Miller-Rabin素性测试 学习笔记的更多相关文章

  1. Web安全测试学习笔记-DVWA-SQL注入-2

    接上一篇SQL注入的学习笔记,上一篇我通过报错信息得知后台数据库是MySQL(这个信息非常重要~),然后通过SQL注入拿到了用户表的所有行,其实我们还可以通过MySQL的特性来拿更多的信息. 1. 获 ...

  2. Web安全测试学习笔记 - DVWA+PHP环境搭建

    DVWA(Damn Vulnerable Web Application),是一个用PHP编写的,作为Web安全测试练习平台的合法环境(毕竟咱不能为了练习就随便找个网站去攻击...),也就是俗称的靶场 ...

  3. QTP测试学习笔记

    QuickTest Professional(简称QTP)功能自动化测试,原属于Mercury Interactive公司产品,2006年7月被惠普公司收购了,通过安装文件目录可以看到,都是默认放在C ...

  4. Web安全测试学习笔记-DVWA-盲注(使用sqlmap)

    之前的sql注入页面(https://www.cnblogs.com/sallyzhang/p/11843291.html),返回了查询结果和错误信息.而下面的页面,返回信息只有存在和不存在两种情况, ...

  5. Web安全测试学习笔记-SQL注入-利用concat和updatexml函数

    mysql数据库中有两个函数:concat和updatexml,在sql注入时经常组合使用,本文通过学习concat和updatexml函数的使用方法,结合实例来理解这种sql注入方式的原理. con ...

  6. Web安全测试学习笔记-DVWA-登录密码爆破(使用Burp Suite)

    密码爆破简单来说,就是使用密码本(记录了若干密码),用工具(手工也可以,if you like...)一条条读取密码本中的密码后发送登录请求,遍历密码本的过程中可能试出真正的密码. 本文学习在已知登录 ...

  7. [postman][API 测试]用Postman做RestAPI测试学习笔记

    痛点:最近有个API网关的兼容性测试任务,需要验证API是否可用,返回值符合预期,如果手工复制粘贴curl命令,繁琐且低效 调研时发现了Postman 这个chrom插件,试用了2天后发现使用起来很方 ...

  8. Web安全测试学习笔记(Cookie&Session)

    一,Session:含义:有始有终的一系列动作\消息1, 隐含了“面向连接” 和“保持状态”两种含义2, 一种用来在客户端与服务器之间保持状态的解决方案3, 也指这种解决方案的存储结构“把××保存在s ...

  9. kali linux 网络渗透测试学习笔记(二)OWASP ZAP工具扫描SQL injection漏洞失败

    按照惯例,利用OWASP ZAP工具扫描SQL injection漏洞时,应该很快就可以扫描出来,但是在笔者进行扫描的时候,却遇到了以下状况: 这说明了该工具根本就没能够扫描出SQL注入的漏洞,不知道 ...

随机推荐

  1. 9-python 的ProxyHandler处理器(代理设置)

    ProxyHandler处理器(代理设置) 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的. 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正 ...

  2. 当集合里存储的是URL时的一些问题总结

    先看道题吧: package com.lk.C; import java.net.MalformedURLException; import java.net.URL; import java.uti ...

  3. Linux cmus

    一.简介 CMus 是一款类似于MOC, Herrie 或 mp3blaster 的基于终端的音乐播放器,支持 Ogg Vorbis, FLAC, MP3, WAV, Musepack, WavPac ...

  4. jQuery--全选、反选、取消

    主要知识点: prop()--主要检查和设置checked attr()是针对所有属性,prop()是针对checked和selected等单一存在的,判断他们的true或者false. find() ...

  5. sublime text 3安装 vue插件

    1.上一个章节讲到Vue.js的环境安装,这一章节主要是针对ST3 如何安装vue插件,来快速的进行vue组件代码的编写. (内容转载自:https://www.cnblogs.com/bluedoc ...

  6. git之创建版本库

    好吧,你知道了git既然有这么多好处,那么我们接下来就可以使用git命令来创建我们的仓库.这一节我们来学习一下如何在windows下面建立自己的仓库.首先我们先在本地创建一个主目录,比如文件名字叫le ...

  7. css总结1:position定位:absolute/relative/fixed

    1 [Positioning(定位)] Positioning作用:指定了元素的定位类型.position包括四个值:static,relative,fixed,absolute. css定位解析:元 ...

  8. 【留用】C#的一些好的书籍

    浏览博客的时候发现一篇推荐的C#书籍,感觉真的不错,涉略过几本,水平问题,没看的很深入,正在努力,留用了!!! http://www.cnblogs.com/tongming/p/3879752.ht ...

  9. win8 附件数据库失败解决方案《1》

    sql server 2005附加数据库错误:尝试打开或创建物理文件 无法打开物理文件 "E:\works\database\northwnd\northwnd.mdf".操作系统 ...

  10. 13本热门书籍免费送!(Python、SpingBoot、Entity Framework、Ionic、MySQL、深度学习、小程序开发等)

    七月第一周,网易云社区联合清华大学出版社为大家送出13本数据分析以及移动开发的书籍(Python.SpingBoot.Entity Framework.Ionic.MySQL.深度学习.小程序开发等) ...