【数论】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 ...
随机推荐
- C#面向对象之属性
1.属性的定义及使用 class MyClass { ; //属性的定义 private string name = ""; //属性的定义 public int Id { get ...
- github仓库的克隆、修改、上传方法(图)
- 可能碰到的iOS笔试面试题(4)--C语言
可能碰到的iOS笔试面试题(4)--C语言 可能碰到的iOS笔试面试题(4)--C语言 C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的 ...
- C++ substr() 和 Java substring() 区别
Java和C++中都有关于子字符串的操作,C++中是substr(),Java中是substring(),两者的用法上稍有些区别,首先针对只有一个参数的情况: s.substr(start) 和 s. ...
- Hibernate---单条记录的增删改查
package com.hanqi.test; import static org.junit.Assert.*; import java.util.Date; import org.hibernat ...
- java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结
2016-09-0111:06:53 使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...
- 状态压缩DP
K - Necklace Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:327680KB ...
- Rails problem
总是wa~ #include <stdio.h> int main() { ]; ], b[]; while(scanf("%d %s %s", &n, a, ...
- Linux LVM过程问题
问题: 使用fdisk 修改完成磁盘后,在/etc/下没有出现新建的分区文件 解决: 重启系统 (好吧,这他妈也算解决方案~~)
- 连连看bug记录
1.bug统计 bug1: bug现象:消除两个相同图案之间的连线跨越了其他图片. 期待现象:应该改成绕过图案呈折线形. 二者差异:折现有没有穿过其他图片. bug原因猜测:小组能力原因. 复现步骤或 ...