题目大意

给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子

题解

看了一整天《初等数论及其应用》相关部分,终于把Miller–Rabin和Pollard's rho这两个算法看懂了O(∩_∩)O~~

Miller–Rabin主要用到了费马小定理,即:设p是一个素数,a是一个正整数且p不整除a,则ap-1≡1(mod p).若x=b(n-1)/2,x2=bn-1≡1(mod n),如果n是一个素数,则x≡1(mod n)或者x≡-1(mod n).因此,一旦我们有bn-1≡1(mod n),则可以检验b(n-1)/2≡±1(mod n)是否成立.若该同余式不成立,则可知n合数.因此我们可以令n-1=2tu,(t>=1且 u是奇数),bn-1≡(bu)^2t(mod n),通过先计算bu,然后对结果连续平方t次来计算bn-1(mod n),如果通过这种这种测试,则称n通过了以b为基数的米勒检验,我们可以多选取几个b,如果都通过了检测,则n有很大的机率是素数~~~

Pollard's rho 主要是基于Floyd's cycle-finding algorithm,算导上图非常形象~~讲得也挺好~~~我就不造轮子了。。。。我选取的函数式f(x)=x^2+1,每次都跑了1000多ms%>_<%。。。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. typedef unsigned long long LL;
  5. LL min(LL a,LL b)
  6. {
  7. return a<b?a:b;
  8. }
  9. LL gcd(LL a,LL b)
  10. {
  11. return b==0?a:gcd(b,a%b);
  12. }
  13. LL mult_mod(LL a,LL b,LL mod)
  14. {
  15. LL ans=0;
  16. while(b)
  17. {
  18. if(b&1)
  19. ans=(ans+a)%mod;
  20. a=(a<<1)%mod;
  21. b>>=1;
  22. }
  23. return ans;
  24. }
  25. LL pow_mod(LL a,LL b,LL mod)
  26. {
  27. LL d=1;
  28. a%=mod;
  29. while(b)
  30. {
  31. if(b&1)
  32. d=mult_mod(d,a,mod);
  33. a=mult_mod(a,a,mod);
  34. b>>=1;
  35. }
  36. return d%mod;
  37. }
  38. bool witness(LL a,LL n)
  39. {
  40. LL u=n-1,t=0;
  41. while((u&1)==0)
  42. {
  43. u>>=1;
  44. t++;
  45. }
  46. LL x,x0=pow_mod(a,u,n);
  47. for(LL i=1; i<=t; i++)
  48. {
  49. x=mult_mod(x0,x0,n);
  50. if(x==1&&x0!=1&&x0!=(n-1))
  51. return true;
  52. x0=x;
  53. }
  54. if(x!=1)
  55. return true;
  56. return false;
  57. }
  58. bool miller_rabin(LL n)
  59. {
  60. if(n==2) return true;
  61. if(n<2||!(n&1)) return false;
  62. for(int j=1; j<=8; j++)
  63. {
  64. LL a=rand()%(n-1)+1;
  65. if(witness(a,n))
  66. return false;
  67. }
  68. return true;
  69. }
  70. LL pollard_rho(LL n)
  71. {
  72. LL i=1,x=2,y=2,k=2,d;
  73. while(true)
  74. {
  75. i++;
  76. x=(mult_mod(x,x,n)+1)%n;
  77. d=gcd(y-x,n);
  78. if(d!=1&&d!=n)
  79. return d;
  80. if(x==y) return n;
  81. if(i==k)
  82. {
  83. y=x;
  84. k<<=1;
  85. }
  86. }
  87. }
  88. LL find_minfac(LL n)
  89. {
  90. if(miller_rabin(n)||n<=1)
  91. return n;
  92. LL p=pollard_rho(n);
  93. LL q=min(find_minfac(p),find_minfac(n/p));
  94. return q;
  95. }
  96. int main()
  97. {
  98. int T;
  99. LL n;
  100. scanf("%d",&T);
  101. srand(time(NULL));
  102. while(T--)
  103. {
  104. scanf("%I64u",&n);
  105. if(n>2&&n%2==0) printf("2\n");
  106. else if(n==2||miller_rabin(n))
  107. printf("Prime\n");
  108. else
  109. printf("%I64u\n",find_minfac(n));
  110. }
  111. return 0;
  112. }

POJ1811- Prime Test(Miller–Rabin+Pollard's rho)的更多相关文章

  1. POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)

    题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...

  2. 数学基础IV 欧拉函数 Miller Rabin Pollard's rho 欧拉定理 行列式

    找了一些曾经没提到的算法.这应该是数学基础系最后一篇. 曾经的文章: 数学基础I 莫比乌斯反演I 莫比乌斯反演II 数学基础II 生成函数 数学基础III 博弈论 容斥原理(hidden) 线性基(h ...

  3. POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

    http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...

  4. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  5. Miller Rabin素数检测与Pollard Rho算法

    一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...

  6. HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...

  7. poj 1811 Pallor Rho +Miller Rabin

    /* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...

  8. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  9. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

随机推荐

  1. MVC-Razor引擎布局

    ViewBag.Title:标题 layout: @ViewBag.Title view: @{ViewBag.Title="标题"} @RenderBody():视图的内容直接渲 ...

  2. 敏捷开发概述与路线(转自MBAlib)

    敏捷开发的概述 简单的说,敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征.换言之,就是把一个大项 ...

  3. javascript pattern

    bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...

  4. php重定向跳转

    一.用HTTP头信息 也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如声明返回信息的类型("Co ...

  5. POJ 2289 Jamie's Contact Groups & POJ3189 Steady Cow Assignment

    这两道题目都是多重二分匹配+枚举的做法,或者可以用网络流,实际上二分匹配也就实质是网络流,通过枚举区间,然后建立相应的图,判断该区间是否符合要求,并进一步缩小范围,直到求出解.不同之处在对是否满足条件 ...

  6. [jobdu]丑数

    由于思维的惯性,用了queue.后来发现一要注意要用集合判重,二是每次往queue里放的多,后来溢出了,要用long long.但这样要用数组,集合,队列,内存多.效率是O(n*logn)的. #in ...

  7. 这些小众软件让你的效率提升N倍!(必备,收藏)

    大部分的我们,电脑买来之后,软件越装越多,电脑越来越卡,导致工作的效率也是越来越低. 同时还可能长期处于软件安装完又卸载的无限恶性循环中.提高工作效率是我们利用电脑办公的一大优势,安装好的软件更是可以 ...

  8. C语言考试解答十题

    学院比较奇葩,大一下期让学的VB,这学期就要学C++了,然后在开学的前三个周没有课,就由老师讲三个周的C语言,每天9:30~11:30听课,除去放假和双休日,实际听课时间一共是12天*2小时,下午是1 ...

  9. 基于dojo模板的widget

    参考:http://niweiwei.iteye.com/blog/1539863 http://dojotoolkit.org/reference-guide/1.8/dijit/_Template ...

  10. Visual Studio 那些隐藏的调试功能(转)

    原文出处:  微软互联网开发支持   Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...