Miller_Rabin筛法是一种正确率极高,复杂度优秀的概率筛法,将质数分为2和奇质数,对于奇质数n,将n-1其分解为 2^p  +  m ,然后,取若干[1,n-1]的随机数a,本模板取了20次,每次判断是否有

a^m 三 1(mod n) 或者  是否有 [0,p-1]的j,满足 三 n-1 (mod n)

满足二者之一表示本次判断成功,20次中有一次失败就表明不是素数,20次都成功,那么可以说是一个素数。

验证正确性如下,取2-1e6全部数字,进行正确性判断,正确个数1e6-1,全部正确

甚至可以将判断次数缩小至5,也能保证完全正确

# include<iostream>
# include<iomanip>
# include<math.h>using namespace std;
typedef long long int ll;ll random(ll n)  //生成[0,n]范围内随机数
{return rand()%(n-1);}
ll quick_mul(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 quick_pow(ll base,ll pow, ll mod)
{ll ans=1;while(pow){if(pow&1)ans=ans*base%mod;pow>>=1;base=base*base%mod;}return ans;}
bool witness(ll a, ll n)
{ll temp=n-1;int j=0;while(temp%2==0){temp/=2;j++;}ll x=quick_pow(a,temp,n);if(x==1||x==n-1)return 1;while(j--){x=quick_mul(x,x,n);if(x==n-1)return 1;}return 0;
}bool miller_rabin(ll n)
{if(n==2)return 1;if(n<2||n%2==0)return 0;for(int i=1; i<=20; i++){ll a=random(n)+1;//    cout<<a<<endl;if(!witness(a,n))return 0;}return 1;}int prime[1000000+10];
bool not_prime[1000000+10];
int tot;void init()
{for(int i=2; i<=1000000; i++){if(!not_prime[i]){tot++;prime[tot]=i;}for(int j=1; j<=tot&&prime[j]*i<=1000000; j++){not_prime[i*prime[j]]=1;if(i%prime[j]==0){break;}}}
}
int main ()
{init();ll n;int cnt=0;for(n=2;n<=1000000;n++){if(miller_rabin(n)!=(!not_prime[n])){cout<<"***";}elsecnt++;}cout<<cnt<<endl;return 0;}

Miller_Rabin 米勒拉宾概率筛【模板】相关推荐

  1. 【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

    @TOC 素性测试是检验一个给定的整数是否为素数的测试. 最简单的就是用 n\sqrt{n}n​ 以内的数去试除.这是确定性的算法,即能准确知道 nnn 是否为质数. 但今天学习的是一种随机算法. F ...

  2. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验

    普通的素数判断法 当我们要判断一个数字是否是素数的时候,往往会直接看这个数字模1到这个数字的根号,看有没有等于零的,从而判断这个数字是不是素数,这样做的时间复杂度为O(sqrt(n)) bool is ...

  3. C++米勒拉宾算法模板

    //我也忘了从哪找来的板子,不过对于2^63级的数据请考虑使用java内置的米勒拉宾算法. 1 #include <iostream> 2 #include <string> ...

  4. 费马素性测试和米勒—拉宾素性测试

    chapter 1 Fermat's little theorem 费马小定理 费马小定理说的是:如果p是一个素数,那么对于任意一个整数a,a p − a 能被p整除,也可以用模运算表示如下: (p是 ...

  5. C++实现伪大素数生成算法(费马小定理判别法、米勒拉宾素数判定法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.伪大素数生成原理 方法一 方法二 数学基础 二.费马小定理判别法 1.算法 2.代码实现 3.运行结果 二.米勒拉宾素数 ...

  6. 米勒-拉宾素性检测算法

    米勒-拉宾素性检测就是目前应用比较广的一种随机化素性检测算法. 它是基于下面两个定理: (费马小定理)如果 p 为素数,且 a 无法被 p 整除,则对于所有大于0小于 p 的整数 a,有 ap−1≡1 ...

  7. 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)

    2018宁夏网络赛 B Goldbach (米勒拉宾素数测试) 题目链接 题目大意: 给你一个偶数n (2<n<=1e18) 让你把n分解成两个素数的和.(如果有多个输出任意一个) 解题思 ...

  8. 米勒-拉宾(MillerRabbin)素性测试算法

    原创滴博客~https://www.cnblogs.com/precious-ZPF/p/9481599.html 小编赶紧摘过来的,多看几遍向银家多学习学习QAQ 首先,在了解米勒-拉宾素性测试之前 ...

  9. 你知道如何判定一个大整数为素数吗?——米勒拉宾素数判定算法

    米勒拉宾算法的基本概念如下: 首先判断这个数n的奇偶性 若为偶数仅有2是质数 奇数则进入测试 测试方法: 首先确定几个基底a,范围在[2,n-1] 因为n是奇数,所以n-1必定为偶数 则n-1可以表示 ...

  10. 算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))

    这篇博客讲的很好: https://www.cnblogs.com/ZERO-/p/9302169.html 题目描述 木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的 ...

最新文章

  1. ADSL上网常见错误提示
  2. bool转nsnumber ios_iOS 的 NSNumber(对基本数据类型) NSValue(对结构体) 的装箱
  3. python No migrations to apply
  4. 错误:mysql foreign key errno 150
  5. 信息系统项目管理知识--项目成本管理
  6. android videoview属性,Android VideoView
  7. centos7下安装低版本mysql_centos7下使用yum安装制定版本mysql
  8. android商城开源框架,Android商城开源项目--轻松购
  9. C++接收字符串数组_C语言处理字符串的7个函数
  10. POJ NOI0105-30 含k个3的数【数制】
  11. Lync 小技巧-26-由于服务器连接问题,一些演示功能不可用
  12. 怎么调节手机的刷新率_【W21 5G性能篇】120Hz自适应刷新率,用了再也回不去
  13. 计算机视觉专业名词中英文对照
  14. CentOS7详细安装教程--图文介绍超详细
  15. proe5.0插件在windows7 64系统预览模型
  16. oracle 审计设置,oracle数据库审计设置
  17. CSUST选拔赛题解之-Problem H: 逃出监狱
  18. 安装教程——Stegsolve
  19. 错误:-[UIKBBlurredKeyView candidateList]: unrecognized selector sent to instance
  20. idea显示项目端口号被占用,怎么搞?

热门文章

  1. JVM(四).Class 文件结构(附字节码完整解析)
  2. 【STM32】关于DMA控制器的介绍和使用
  3. mac倾倒废纸篓提示文件正在使用中的一种解决办法
  4. 内容市场的2017年:五件大事,每件事都惊心动魄
  5. 于的繁体字有几种写法_在繁体字中,“于”、“於”这两个字如何正确使用?...
  6. android tv 下载地址,Android TV获取所有的应用apk
  7. java每日一练(19_03_23)
  8. C++_primer_plus学习笔记 第14章 C++中的代码重用
  9. MATAL角度弧度互换
  10. 基于华为云服务的人脸识别功能实现