给出一个64位的大数,如何快速判断其是否为素数

  1. #include<algorithm>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6. typedef long long LL;
  7. LL n,m;
  8. //****************************************************************
  9. // Miller_Rabin 算法进行素数测试
  10. //速度快,而且可以判断 <2^63的数
  11. //****************************************************************
  12. const int S=20;//随机算法判定次数,S越大,判错概率越小
  13.  
  14. LL mult_mod(LL a,LL b,LL mod) //(a*b)%c a,b,c<2^63
  15. {
  16. a%=mod;
  17. b%=mod;
  18. LL ans=0;
  19. while(b)
  20. {
  21. if(b&1)
  22. {
  23. ans=ans+a;
  24. if(ans>=mod)
  25. ans=ans-mod;
  26. }
  27. a=a<<1;
  28. if(a>=mod) a=a-mod;
  29. b=b>>1;
  30. }
  31. return ans;
  32. }
  33.  
  34. LL pow_mod(LL a,LL b,LL mod) // a^b%mod
  35. {
  36. LL ans=1;
  37. a=a%mod;
  38. while(b)
  39. {
  40. if(b&1)
  41. {
  42. ans=mult_mod(ans,a,mod);
  43. }
  44. a=mult_mod(a,a,mod);
  45. b=b>>1;
  46. }
  47. return ans;
  48. }
  49.  
  50. //以a为基,n-1=x*2^t a^(n-1)=1(mod n) 验证n是不是合数
  51. //一定是合数返回true,不一定返回false
  52.  
  53. bool check(LL a,LL n,LL x,LL t)
  54. {
  55. LL ret=pow_mod(a,x,n);
  56. LL last=ret;
  57. for(int i=1;i<=t;i++)
  58. {
  59. ret=mult_mod(ret,ret,n);
  60. if(ret==1 && last!=1 && last!=n-1) return true;//合数
  61. last=ret;
  62. }
  63. if(ret!=1) return true;
  64. else return false;
  65. }
  66.  
  67. // Miller_Rabin()算法素数判定
  68. //是素数返回true.(可能是伪素数,但概率极小)
  69. //合数返回false;
  70.  
  71. bool Miller_Rabin(long long n)
  72. {
  73. if(n<2)return false;
  74. if(n==2) return true;
  75. if( (n&1)==0) return false;//偶数
  76. LL x=n-1;
  77. LL t=0;
  78. while( (x&1)==0 ) { x>>=1;t++;}
  79. for(int i=0;i<S;i++)
  80. {
  81. LL a=rand()%(n-1)+1;//rand()需要stdlib.h头文件
  82. if(check(a,n,x,t))
  83. return false;//合数
  84. }
  85. return true;
  86. }
  87. int main()
  88. {
  89. // n,m;
  90. while(scanf("%lld%lld",&n,&m)>0)
  91. {
  92. LL sum=0;
  93. for(LL i=0; i<m; i++)
  94. {
  95. sum+=(LL)(pow((double)(n),i)+0.5);
  96. }
  97. //printf("%lld\n",sum);
  98. if(Miller_Rabin(sum))
  99. printf("YES\n");
  100. else
  101. printf("NO\n");
  102. }
  103. return 0;
  104. }

  

zoj 月赛B题(快速判断一个大数是否为素数)的更多相关文章

  1. Java源码中的发现:快速判断一个int值是几位数

    判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...

  2. 如何快速判断一个key是否存在在亿级数据中(bloomFilters)

    面试题 现在有一个非常庞大的数据(亿级),假设全是 int 类型.现在我给你一个数,你需要告诉我它是否存在其中(尽量高效) 分析 采用bloomFilters进行实现(时间&空间尽可能的有效) ...

  3. 数学--数论--Miller_Rabin判断一个大数是不是素数(随机算法)

    前提知识 1,费马定理:ap−1=1(mod p)a^{p-1}=1(mod\ p)ap−1=1(mod p)

  4. C和Java判断一个数字是否为素数

    C: /* 素数: 素数又称质数.所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除. */ # include <stdio. ...

  5. JAVA 写一个方法,判断一个整数是否为素数

    1 import java.util.Scanner; 2 3 public class Question3 { 4 public static void main(String[] args) { ...

  6. C++笔记(0)——判定一个数字是否是素数

    博主之前使用的编程语言是Python,但是这门语言的效率比较低(通常,不优化的情况下,但是即便如此我还是偏爱Python),而且博主打算参加PAT考试(真正的原因),及博主打算顺便深入学习下机器学习框 ...

  7. 20 亿的 URL 集合,如何快速判断其中一个?

    假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M ...

  8. ZOJ Problem Set - 1331 Perfect Cubes 判断一个double是否为整数

    zju对时间要求比较高,这就要求我们不能简单地暴力求解(三个循环搞定),就要换个思路:因为在循环时,已知a,确定b,c,d,在外重两层循环中已经给定了b和c,我们就不用遍历d,我们可以利用d^3=a^ ...

  9. 学习练习 java练习小题题目:判断一个整数能被几个9整除

    题目:判断一个整数能被几个9整除 package com.hanqi.lianxi; import java.io.*; public class Test1 { //判断能否被9整除 static ...

随机推荐

  1. Vue.js 添加组件

    <!DOCTYPE HTML> <html> <head> <title>vue.js hello world</title> <sc ...

  2. JAVA Socket编程和C++ Socket编程有什么不同

    原文链接: http://zhidao.baidu.com/link?url=16TEzhom2Nr8x1_2uTRp-e2pgZRgS5nW5ywtRX2XLHbtLOG8btif5DTyP85jf ...

  3. Oracle 客户端连接时报ORA-01019错误总结

    在.net+oracle开发中,发布web程序的时候,有是会遇到该错误 ora-01019 ORA-01019 unable to allocate memory in the user sideCa ...

  4. 第二篇:呈现内容_第二节:WebControl呈现

    一.WebControl的呈现过程 WebControl派生自Control类,所以WebControl的呈现功能基于Control的呈现逻辑之上,但有了比较大的扩展. 首先,WebControl重写 ...

  5. 使用C#和Thrift来访问Hbase实例

    今天试着用C#和Thrift来访问Hbase,主要参考了博客园上的这篇文章.查了Thrift,Hbase的资料,结合博客园的这篇文章,终于搞好了.期间经历了不少弯路,下面我尽量详细的记录下来,免得大家 ...

  6. mongodb 远程访问配置

    1.首先修改mongodb的配置文件 让其监听所有外网ip 编辑文件:/etc/mongodb.conf 修改后的内容如下: bind_ip = 0.0.0.0 port = 27017 auth=t ...

  7. nginx增加ssl支持 - 编译时参数详情列表

    ./configure \ --with-http_ssl_module \ make && make install     nginx编译参数说明如下:   --prefix=&l ...

  8. 在vultr中安装coreos

    1.coreos必须使用key文件. 2.生成ssh key -C "your_email@mail.com" 3.拷贝ssh公钥文件内容.默认为id_rsa.pub 4.编辑vu ...

  9. Unity投影器细节整理

    抽了个空整理下投影器 一般投影器需要两张贴图,一张Cookie,一张FallOff. Unity提供Light和Multiple两种自带shader,和粒子类似. Cookie需要非alpha贴图,F ...

  10. webapi中取文件的物理路径(server.mappath)

    在Webapi中是用不了server.mappath方法的,上网搜索了一下,发现是用如下代码取得文件绝对路径: string logpath = System.Web.Hosting.HostingE ...