Miller_Rabin素数测试【学习笔记】
引语:在数论中,对于素数的研究一直就很多,素数测试的方法也是非常多,如埃式筛法,6N±1法,或者直接暴力判(试除法)。但是如果要判断比较大的数是否为素数,那么传统的试除法和筛法都不再适用。所以我们需要学习Miller_Rabin算法。
知识准备 + 算法推导:
1.威尔逊定理:若p是素数,则 (p-1) !≡ -1(mod p).
2.有趣的是,威尔逊定理的逆命题也是正确的:设n是正整数且 n ≥ 2 ,若 (n-1) !≡ -1(mod n),则n 是素数.
很多朋友可能在学习的时候会碰到威尔逊定理,它主要是告诉我们,它的逆定理给出了一种素性检验的方法(其实用的少,原因在后),遗憾的是,这不是一个实用的检验法,因为这需要进行(n-2)次模n的乘法运算才能得到 (n-1)! 模n的值,运算量达到了O( n(log2n)2 ) 次位运算。
行吧,那我们只能另谋出路了。
3.费马小定理:设p 是一个素数,a是一个正整数且p不整除a ,则 ap-1 ≡ 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不是素数的结论。
这里,令 n - 1 = 2rs,其中s是一个奇数,随机选择一个a, 1 ≤ a ≤ n-1 ,如果 a2s ≡ 1(mod n) 并且 as ≡ 1 (mod n) 或 as ≡ (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素数测试【学习笔记】的更多相关文章
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥
Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Pr ...
- Miller_Rabin 素数测试
费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...
- Web安全测试学习笔记-DVWA-SQL注入-2
接上一篇SQL注入的学习笔记,上一篇我通过报错信息得知后台数据库是MySQL(这个信息非常重要~),然后通过SQL注入拿到了用户表的所有行,其实我们还可以通过MySQL的特性来拿更多的信息. 1. 获 ...
- 【数学】【筛素数】Miller-Rabin素性测试 学习笔记
Miller-Rabin是一种高效的随机算法,用来检测一个数$p$是否是素数,最坏时间复杂度为$\log^3 p$,正确率约为$1-4^{-k}$,$k$是检验次数. 一.来源 Mil ...
- Miller_Rabin素数测试
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #inclu ...
- Miller-Rabin素数测试学习小计
1.Miller-Rabin是干啥的?它是用来检测一个数字(一般是很大的数字)是不是素数: 2.Miller-Rabin算法基于的两个定理: (1)费尔马小定理:如果p是一个素数,且0<a< ...
- Web安全测试学习笔记 - DVWA+PHP环境搭建
DVWA(Damn Vulnerable Web Application),是一个用PHP编写的,作为Web安全测试练习平台的合法环境(毕竟咱不能为了练习就随便找个网站去攻击...),也就是俗称的靶场 ...
- QTP测试学习笔记
QuickTest Professional(简称QTP)功能自动化测试,原属于Mercury Interactive公司产品,2006年7月被惠普公司收购了,通过安装文件目录可以看到,都是默认放在C ...
随机推荐
- opennebula 镜像池
{ "IMAGE_POOL": { "IMAGE": [ { ", ", ", "TEMPLATE": { & ...
- css总结14:CSS 分页实例
1 作用:如果你的网站有很多个页面,你就需要使用分页来为每个页面做导航. 例1 :以下实例演示了如何使用 HTML 和 CSS 来创建分页: 正常样式 <!DOCTYPE html>< ...
- 【leetcode】Move Zeroes
Move Zeroes 题目: Given an array nums, write a function to move all 0‘s to the end of it while maintai ...
- ArcGIS Desktop和Engine中对点要素图层Graduated Symbols渲染的实现 Rotation Symbol (转)
摘要 ArcGIS中,对于要素图层的渲染,支持按照要素字段的值渲染要素的大小,其中Graduated Symbols可以对大小进行分级渲染.在个人开发系统的过程中,也可以用来美化数据显 ...
- HDU - 1251 统计难题(trie树)
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部 ...
- Recyclerview添加头布局和尾布局,点击效果
简介: 本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件 思路: 主要重写Recyclerview.Adapter中的一些方法 1.public int ...
- delphi 获取windows任务栏的高度
function GetWinTrayWnd: Integer; // 获取windows任务栏高度 var TrayWnd: HWnd; //任务栏句柄 Rec : TRect; begin Tra ...
- maven的pom文件解析及配置
1.IDEA中的Maven的pom.xml文件,其实比较通俗点介绍功能主要项目引入的jar包,管理配置项目以及一些插件的配置等项目 2.对于pom配置详细介绍,整理如下2篇文档介绍的比较系统全面: h ...
- perationalError: (2003, "Can't connect to MySQL server on u'192.168.1.6' (timed out)")
在Ubuntu(192.168.1.20)中部署项目后,mysql还在另外一台windows(192.168.1.6)机子上,ping windows时可以ping通,但是访问项目提示: perati ...
- angular 管道
import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'multi' }) export class MultiPipe ...