引语:在数论中,对于素数的研究一直就很多,素数测试的方法也是非常多,如埃式筛法,6N±1法,或者直接暴力判(试除法)。但是如果要判断比较大的数是否为素数,那么传统的试除法和筛法都不再适用。所以我们需要学习Miller_Rabin算法。

知识准备 + 算法推导:

1.威尔逊定理:若p是素数,则 (p-1) !≡ -1(mod p).

2.有趣的是,威尔逊定理的逆命题也是正确的:设n是正整数且 n ≥ 2 ,若 (n-1) !≡ -1(mod n),则是素数.

很多朋友可能在学习的时候会碰到威尔逊定理,它主要是告诉我们,它的逆定理给出了一种素性检验的方法(其实用的少,原因在后),遗憾的是,这不是一个实用的检验法,因为这需要进行(n-2)次模n的乘法运算才能得到 (n-1)! 模n的值,运算量达到了O( n(log2n)2 ) 次位运算。

行吧,那我们只能另谋出路了。

3.费马小定理:设是一个素数,a是一个正整数且p不整除a ,则 ap-≡ 1(mod p).

4.伪素数:令b是一个正整数. 若n是一个正合数且 bn ≡ b(mod n),则称n为以b为基的伪素数(有时也称费马伪素数)。(唉~,这是虚伪的素数,它爱着费马测试,却是合数)。

辣个男人,它来了!

那么基于费马小定理,Miller检验:假如n是素数,且gcd(a,n) = 1,那么 an-1 ≡ 1(mod n).如果 an-1 ≡ 1(mod n)(a为任意小于n的正整数),则可近似认为n是素数。取多个底进行试验,次数越多,n为素数的概率越大。

5.【重头戏】卡迈尔数:一个合数 n 若对所有满足 gcd(b, n) = 1 的正整数b都有 bn-1 ≡ 1(mod n)成立,则称为卡迈尔(Carmichael)数或者称为绝对伪素数(不得不服,6601)。

6.二次探测定理:如果p是一个素数,且 0 < x < p,则方程 x2%p = 1的解为 x = 1 或 x = p - 1.

辣个男人,它又来了!

既然有卡迈尔数的存在,那么需要排除卡迈尔数,可以根据二次定理,在利用费马小定理计算 bn-1%的过程中增加对整数n的二次探测,一旦发现违背二次探测条件,即得出n不是素数的结论。

这里,令 n - 1 = 2rs,其中s是一个奇数,随机选择一个a, 1 ≤ a ≤ n-1 ,如果  a2s ≡ 1(mod n) 并且 a≡ 1 (mod n) 或 a≡ (n-1) (mod n),则通过了测试,但如果后面的测试,在a的指数不断乘2的过程中,如果出现没有通过测试,则不是素数。如果取了几次底a,都通过了测试,那么我们就可以接近100%的认为n是素数。

代码:

#define LL long long
//这里可以采用随机数,我用的是准备好的基数
const int Test[] = {2, 3, 5, 7, 11, 13, 17, 19};
const int Times = 8;  //可以调整 LL Multi(LL a, LL b, LL mod)
{
LL ans = 0;
while(b)
{
if(b&1)
{
ans = (ans + a)%mod;
}
a = (a+a)%mod; //要这么写
b>>=1;
}
return ans;
} LL Pow(LL a, LL b, LL mod)
{
LL ans = 1;
while(b)
{
if(b&1)
{
ans = Multi(ans, a, mod);
}
b>>=1;
a = Multi(a, a, mod);
}
return ans;
} bool Miller_Rabin(LL n)
{
if(n < 2) return false;
LL s = n-1, t = 0;
while( !(s&1) )
{
t++;
s>>=1;
}
for(int i = 0; i < Times; i++)
{
if(n == Test[i])
return true;
LL x = Pow(Test[i], s, n);
LL next = x;
for(int j = 0; j < t; j++)
{
next = Multi(x, x, n);
if(next == 1 && x != 1 && x != n-1)
return false;
x = next;
}
if(x != 1)
return false;
}
return true;
}

  

Miller_Rabin素数测试【学习笔记】的更多相关文章

  1. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

  2. hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥

    Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Pr ...

  3. Miller_Rabin 素数测试

    费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...

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

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

  5. 【数学】【筛素数】Miller-Rabin素性测试 学习笔记

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

  6. Miller_Rabin素数测试

    #include<iostream> #include<cmath> #include<cstdio> #include<cstring> #inclu ...

  7. Miller-Rabin素数测试学习小计

    1.Miller-Rabin是干啥的?它是用来检测一个数字(一般是很大的数字)是不是素数: 2.Miller-Rabin算法基于的两个定理: (1)费尔马小定理:如果p是一个素数,且0<a< ...

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

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

  9. QTP测试学习笔记

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

随机推荐

  1. 基于jquery 的插件,让IE支持placeholder属性

    开发一个项目的时候为了美观和用户体验用到了input标签的placeholder属性,但是这个属性是html5中的,所以低版本的IE浏览器不支持.于是在百度找了一些解决方法,找了好几个都不是那么完美, ...

  2. 360 安全卫士 for Linux 使用结果

    测试了一把,结果显示360基本对Linux社区规范和安全常识不give a fuck. 胡乱打包 首先,这个deb包就是胡乱打包,依赖关系就没弄好: $ dpkg-deb -I 360safeforl ...

  3. 设置MongoDB课程环境

    Setting Up Your Course Environment This course is designed to be very hands on. Virtually all of the ...

  4. sql平时小总结

    sql练习:举例子: 1.CREATE TABLE IF NOT EXISTS zz0 (number INT(11)); CREATE TABLE IF NOT EXISTS zz1 (number ...

  5. 专题1-MMU-lesson2-深入剖析地址转化

    1.地址转化总体分析 level one fetch和level two fetch分为一级转换和二级转换. 由上图右边可以看出,首先通过TTB(Translation Table Base)寄存器找 ...

  6. eclipse——执行Maven命令

    右键pom.xml文件 点击 m2 Maven build... 输入要执行的命令,点击Run 控制台会打印maven运行过程

  7. 推荐一款基于XNA的开源游戏引擎《Engine Nine》

    一.前沿导读 XNA是微软基于.Net部署的下一代3D/2D游戏开发框架,其实XNA严格来说类似下一代的DirectX,当然不是说XNA会取代DirectX,但是基于XNA我们对于面向XBOX360, ...

  8. madvise、fadvise、posix_madvise和posix_fadvise函数的使用

    系统调用madvise的作用:建议内核如何使用指定段的内存.函数原型如下: #include <sys/mman.h> int madvise(void *addr, size_t len ...

  9. 异步 Action 的定义

    ASP.NET MVC 3中的异步 Action 通过两个匹配的方法XxxAsync/XxxCompleted 来定义,这样的异步 Action 只能定义在继承自 AsyncConoller 的类型中 ...

  10. HackTwo

    使用延迟加载以及避免代码重复 ​一.概要:     <include />标签是整理布局的有效工具,提供了合理组织XML布局文件的有效方法.     ViewStub是实现延迟加载视图的优 ...