//我也忘了从哪找来的板子,不过对于2^63级的数据请考虑使用java内置的米勒拉宾算法。  1 #include <iostream>
  2 #include <string>
  3 #include <cstdio>
  4 #include <cmath>
  5 #include <cstring>
  6 #include <algorithm>
  7 #define range(i,a,b) for(int i=a;i<=b;++i)
  8 #define rerange(i,a,b) for(int i=a;i>=b;--i)
  9 #define LL long long
 10 #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
 11 using namespace std;
 12 const int S=20;
 13 LL mult_mod(LL a,LL b,LL c){
 14     a%=c;
 15     b%=c;
 16     long long ret=0;
 17     while(b){
 18         if(b&1){ret+=a;ret%=c;}
 19         a<<=1;
 20         if(a>=c)a%=c;
 21         b>>=1;
 22     }
 23     return ret;
 24 }
 25 LL pow_mod(LL x,LL n,LL mod){
 26     if(n==1)return x%mod;
 27     x%=mod;
 28     LL tmp=x;
 29     LL ret=1;
 30     while(n){
 31         if(n&1) ret=mult_mod(ret,tmp,mod);
 32         tmp=mult_mod(tmp,tmp,mod);
 33         n>>=1;
 34     }
 35     return ret;
 36 }
 37 bool check(LL a,LL n,LL x,LL t){
 38     LL ret=pow_mod(a,x,n);
 39     LL last=ret;
 40     range(i,1,t){
 41         ret=mult_mod(ret,ret,n);
 42         if(ret==1&&last!=1&&last!=n-1) return true;
 43         last=ret;
 44     }
 45     if(ret!=1) return true;
 46     return false;
 47 }
 48 bool Miller_Rabin(LL n){
 49     if(n<2)return false;
 50     if(n==2)return true;
 51     if((n&1)==0) return false;
 52     LL x=n-1;
 53     LL t=0;
 54     while((x&1)==0){x>>=1;t++;}
 55     range(i,0,S-1){
 56         LL a=rand()%(n-1)+1;
 57         if(check(a,n,x,t))return false;
 58     }
 59     return true;
 60 }
 61 LL factor[100];
 62 int tol;
 63 LL gcd(LL a,LL b){
 64     if(a==0)return 1;
 65     if(a<0) return gcd(-a,b);
 66     while(b){
 67         long long t=a%b;
 68         a=b;
 69         b=t;
 70     }
 71     return a;
 72 }
 73 LL Pollard_rho(LL x,LL c){
 74     LL i=1,k=2;
 75     LL x0=rand()%x;
 76     LL y=x0;
 77     while(1){
 78         i++;
 79         x0=(mult_mod(x0,x0,x)+c)%x;
 80         LL d=gcd(y-x0,x);
 81         if(d!=1&&d!=x) return d;
 82         if(y==x0) return x;
 83         if(i==k){y=x0;k+=k;}
 84     }
 85 }
 86 void findfac(LL n){
 87     if(Miller_Rabin(n)){
 88         factor[tol++]=n;
 89         return;
 90     }
 91     LL p=n;
 92     while(p>=n)p=Pollard_rho(p,rand()%(n-1)+1);
 93     findfac(p);
 94     findfac(n/p);
 95 }
 96 int main(){
 97     long long n;
 98     while(scanf("%lld",&n)!=EOF){
 99         tol=0;
100         /*
101         findfac(n);
102         for(int i=0;i<tol;++i)cout<<factor[i]<<" ";
103         printf("\n");
104         */
105         if(Miller_Rabin(n))printf("Yes\n");
106         else printf("No\n");
107     }
108     return 0;
109 }

转载于:https://www.cnblogs.com/Rhythm-/p/9253800.html

C++米勒拉宾算法模板相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)
  2. 第三期 预测——Frenet 坐标
  3. 如何成为SEO专家(10步指南)
  4. 达梦数据库中服务器日志的开关
  5. python Intel Realsense D435 多线程资源分配问题(卡住、卡死)
  6. Android 极光推送设置别名
  7. 居然之家完成35亿定增 小米、阿里等认购
  8. WebAPI基本封装
  9. Python爬虫基础之Urllib
  10. 中小学创客教室建设,教育创客空间整体解决方案
  11. java 4.0 下载_poi.jar包下载 Apache POI 4.0.0 正式版 Office文档jar包 官方免费版 支持Java8+ 下载-脚本之家...
  12. Hexo设置背景图片轮播效果
  13. 请问对一个排好序的数组进行查找,时间复杂度为()
  14. oracle中distance用法,distance的用法总结大全
  15. Dejal Simon for Mac(服务器监控程序)
  16. 从此告别PPT制作的烦恼:ChatGPT和MindShow帮你快速完成
  17. Oracle DBA日常工作手册
  18. NOIP2016Day1总结
  19. 智课雅思短语---五、 in contrast / on the contrary
  20. 经典面试题之Vue生命周期

热门文章

  1. 学了这几招,社交时人人都对你刮目相看(转载)
  2. 矩阵水平翻转java,通过翻转1的矩阵的行和列来确定是否可以到达给定二进制矩阵的算法...
  3. mysql master slave 灾备技术_MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】...
  4. 李迟2021年11月知识总结
  5. python for everybody作业和测试答案_【计算题】编写函数,模拟 Python 内置函数 reversed() 。...
  6. 【MyBatis】MyBatis Order By 字段动态动态排序
  7. 【算法】克鲁斯卡尔算法
  8. netty : websocketx.WebSocketHandshakeException: not a WebSocket handshake request: missing upgrade
  9. 【ElasticSearch】es 压缩 你的 数据
  10. 【kafka】kafka 同时建立很多消费者 会怎么样