【数论】Miller_Rabin
Miller_Rabin素数测试
Miller_Rabin判断单个素数的方法运用了费马小定理,可以说非常之快了。
Miller_Rabin曾经被称作“黑科技”,但是根据费马小定理其实完全可以自己写出来大半。
其算法的运行过程如下:
(1)对于奇数M,使得N=(2^r)*M+1
(2)选取随机数使得A<N
(3)对于任意i(i<r),若(A^(2^i)) Mod N=N - 1,则N为素数
(4)或者,若(A^M) Mod N=1,则N通过随机数A的测试
若对素数N进行T次测试,那么失误率为1/4^T,我们可以进一步提高其效率,如省去步骤3
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<time.h>
#include<cstdlib>
#include<cmath>
using namespace std;
long long exp(long long a,long long m,long long n){//快速幂
if(m==0) return 1;
if(m==1) return (a%n);
long long w=exp(a,m/2,n);
w=w*w%n;
if(m&1) w=w*a%n;
return w%n;
}
bool Witness(long long a,long long n)
{
long long m=n-1;//满足原先条件
int j=0;
while(!(m&1)){
j++;
m>>=1;
}
long long x=exp(a,m,n);
if(x==1||x==n-1) return false;
while(j--){
x=x*x%n;
if(x==n-1) return false;
}
return true;
}
bool Miller_Rabin(long long n){
if(n==2) return true;
if(n&1==0) return false;
for(int i=1;i<=10;i++){
long long a=rand()%(n-2)+2;//一定为a<N
if(Witness(a,n)) return false;
}
return true;
}
bool prime(long long N){
long long k=sqrt(N);
for(int i=2;i<=k;i++) if(N%i==0) return false;
return true;
}
int main(){
srand(time(NULL));
for(long long i=3;i<=10000000;i++)
if(Miller_Rabin(i)!=prime(i)) cout<<i<<endl;
}
【数论】Miller_Rabin的更多相关文章
- 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29046 Accepted: 7342 Case ...
- 数学--数论--Miller_Rabin判断素数
ACM常用模板合集 #include<iostream> #include<algorithm> #include<cstring> #include<cst ...
- 数学--数论--Miller_Rabin判断一个大数是不是素数(随机算法)
前提知识 1,费马定理:ap−1=1(mod p)a^{p-1}=1(mod\ p)ap−1=1(mod p)
- ACM模板合集
写在前面: 第一年小白拿铜牌,第二年队友出走,加上疫情原因不能回校训练导致心底防线彻底崩盘,于是选择退役. 自从退役之后,一直想我打了那么久的ACM,什么也没留下觉得很难受,突然想到我打ACM的时候, ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 数论ex
数论ex 数学学得太差了补补知识点or复习 Miller-Rabin 和 Pollard Rho Miller-Rabin 前置知识: 费马小定理 \[ a^{p-1}\equiv 1\pmod p, ...
- [总结]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...
- 洛谷P4358密钥破解 [CQOI2016] 数论
正解:数论 解题报告: 先,放个传送门QwQ 这题难点可能在理解题意,,, 所以我先放个题意QAQ 大概就是说,给定一个整数N,可以被拆成两个质数的成绩p*q,然后给出了一个数e,求d满足e*d=1( ...
- 【BZOJ1041】圆上的整点(数论)
[BZOJ1041]圆上的整点(数论) 题面 BZOJ 洛谷 题解 好神仙的题目啊. 安利一个视频,大概是第\(7\)到\(19\)分钟的样子 因为要质因数分解,所以复习了一下\(Pollard\_r ...
随机推荐
- javascript原型方法
function createXMLHttp() { if(window.XMLHttpRequest){ return new XMLHttpRequest(); } else if(window. ...
- The Bus Driver Problem
题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=90648#problem/G 题意: 给每位司机分配一个白天和晚上的行车路线, ...
- sql to_char 日期转换字符串
1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...
- Java获取前天和后天的时间
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import j ...
- TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement.
我今天写程序的时候遇到的问题,开始完成功能后没发觉.当再次部署程序更新时候,出的错误,通过firebug发现提示是TypeError: 'stepUp' called on an object tha ...
- 模拟实现ORM实例
https://git.oschina.net/wenjieyatou/hibernate_OR_Mapping 请参考git代码.基本原理是自己写了一个session,然后用反射机制模拟数据库存储机 ...
- php中使用while遍历二维数组的方法
<?php $contact=array( 'gao'=>array('ID'=>1,'name'=>'高某','company'=>'A公司','addr'=>' ...
- 一个简单驱动的makefile
KVERS = $(shell uname -r) #Kernel modulesobj-m += hello.o build: kernel_modules kernel_modules: make ...
- Android课程---布局管理器中的线性布局
线性布局实例: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro ...
- Careercup | Chapter 8
8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...