BZOJ 3667: Rabin-Miller算法

Time Limit: 60 Sec  Memory Limit: 512 MB
Submit: 1044  Solved: 322
[Submit][Status][Discuss]

Description

 

Input

第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数。你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 
第二,如果不是质数,输出它最大的质因子是哪个。

Output

第一行CAS(CAS<=350,代表测试数据的组数) 
以下CAS行:每行一个数字,保证是在64位长整形范围内的正数。 
对于每组测试数据:输出Prime,代表它是质数,或者输出它最大的质因子,代表它是和数

Sample Input

6
2
13
134
8897
1234567654321
1000000000000

Sample Output

Prime
Prime
67
41
4649
5

HINT

数据范围:

保证cas<=350,保证所有数字均在64位长整形范围内。

分析:虽然题目叫做Miller rabin算法,不过真正上也需要Pollard rho算法

  1. /*貌似这个代码在BZOJ上的评测器就会运行错误,但是在POJ上一道原题却通过了(POJ上语言选C++可以过,选择G++就过不了)*/
  2. #include<iostream>
  3. using namespace std;
  4. #include<cstdio>
  5. #define S 10
  6. #include<cstdlib>
  7. #include<ctime>
  8. #define ll long long
  9. ll cas, maxz=-;
  10. ll read()
  11. {
  12. ll ans=;char c;
  13. c=getchar();
  14. while(c<''||c>'') c=getchar();
  15. while(c>=''&&c<='')
  16. {
  17. ans=ans*+c-'';
  18. c=getchar();
  19. }
  20. return ans;
  21. }
  22. ll quick_mul_mod(ll a,ll b,ll c)//a*b%c
  23. {
  24. ll ret=;
  25. a%=c;b%=c;
  26. while(b)
  27. {
  28. if(b&)
  29. {
  30. ret+=a;
  31. ret%=c;
  32. b--;
  33. }
  34. a<<=;
  35. a%=c;
  36. b>>=;
  37. }
  38. return ret;
  39. }
  40. ll gcd(ll a,ll b)
  41. {
  42. if(a==) return ;
  43. if(a<) return gcd(-a,b);
  44. if(b==)
  45. return a;
  46. return gcd(b,a%b);
  47. }
  48. ll Pollard_rho(ll x,ll c)
  49. {
  50. ll x1=rand()%(x-)+;
  51. ll x2=x1;
  52. int i=,k=;
  53. while()
  54. {
  55. i++;
  56. x1=(quick_mul_mod(x1,x1,x)+c)%x;
  57. ll d=gcd(x2-x1,x);
  58. if(d!=&&d!=x) return d;
  59. if(x2==x1) return x;
  60. if(i==k)
  61. {
  62. x2=x1;
  63. k+=k;
  64. }
  65. }
  66.  
  67. }
  68. ll quick_mod(ll a,ll b,ll c)//ji suan a^b%c
  69. {
  70. ll ans=;
  71. a%=c;
  72. while(b)
  73. {
  74. if(b&)
  75. {
  76. b--;
  77. ans=quick_mul_mod(ans,a,c);
  78. }
  79. b>>=;
  80. a=quick_mul_mod(a,a,c);
  81. }
  82. return ans;
  83. }
  84. bool Miller_rabin(ll n)
  85. {
  86. if(n==) return true;
  87. if(n<=||!(n&)) return false;
  88. ll u=n-,t=;
  89. while(!(u&))
  90. {
  91. u>>=;
  92. t++;
  93. }
  94. for(int i=;i<S;++i)
  95. {
  96. ll x=rand()%(n-)+;
  97. x=quick_mod(x,u,n);
  98. for(int i=;i<=t;++i)
  99. {
  100. ll y=quick_mul_mod(x,x,n);
  101. if(y==&&x!=&&x!=n-)
  102. return false;
  103. x=y;
  104. }
  105. if(x!=) return false;
  106. }
  107. return true;
  108. }
  109. void findpri(ll n)
  110. {
  111. if(n==) return;
  112. if(Miller_rabin(n))
  113. {
  114. maxz=max(maxz,n);
  115. return;
  116. }
  117. ll p=n;
  118. while(p==n)
  119. p=Pollard_rho(p,rand()%(n-)+);
  120. findpri(p);
  121. findpri(n/p);
  122. }
  123. int main()
  124. {
  125. srand(time());
  126. cas=read();
  127. while(cas--)
  128. {
  129. maxz=;
  130. ll n=read();
  131. findpri(n);
  132. if(maxz==n)/*最大的质因数就是本身*/
  133. printf("Prime\n");
  134. else printf("%lld\n",maxz);
  135. }
  136. return ;
  137. }

Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法的更多相关文章

  1. Pollard Rho 算法简介

    \(\text{update 2019.8.18}\) 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点 ...

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

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

  3. Pollard Rho算法浅谈

    Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...

  4. 初学Pollard Rho算法

    前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...

  5. BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho

    BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一 ...

  6. Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

  7. 浅谈 Miller-Robbin 与 Pollard Rho

    前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...

  8. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

  9. Pollard Rho因子分解算法

    有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...

随机推荐

  1. docker使用现有容器生成新的镜像

    /*运行docker run后 --则进入该容器里了 我们做一些变更,比如安装一些东西 ,然后针对这个容器进行创建新的镜像 */ 基本形式: docker commit -m "change ...

  2. 64_p5

    php-nette-bootstrap-2.4.3-1.fc26.noarch.rpm 20-Feb-2017 07:19 16290 php-nette-caching-2.5.3-1.fc26.n ...

  3. HDU 6195 2017沈阳网络赛 公式

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...

  4. Freemaker 自定义指令和函数

    自定义函数和指令都可以在前台或者后台进行指定. 个人理解:指令的作用,主要是进行页面调整之后进行输出:函数的作用,主要是为了进行运算,返回运算结果供前台展示. (一) 自定义指令 使用以下格式调用自定 ...

  5. Loadrunner下WebTours系统自带的用户名和密码

    打开:http://127.0.0.1:1080/WebTours/ 系统默认自带两个用户名和密码,位于~\WebTours\MercuryWebTours\users: 1.用户名:joe,密码:y ...

  6. 域名 DNS命令——dig

    dig命令详解   1.查看域名的A记录          # dig yahoo.com; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.e ...

  7. ios app应用在显示屏幕上改中文名

    1.点击项目名 2.选Build settings 搜索 product name 3.双击,改为需要在手机上显示的应用名

  8. 【转+整理+答案】python315+道面试题

    提示 自己整理的答案,很局限,如有需要改进的地方,或者有更好的答案,欢迎提出! [合理利用 Ctrl+F 提高查找效率] 第一部分 Python基础篇(80题) 1.为什么学习Python? # 因为 ...

  9. javascript练习(二)

    案例 输出100个数字 案例  打印100以内 7的倍数 案例  打印100以内的奇数 案例  打印100以内所有偶数的和 打印图形 ********** ********** ********** ...

  10. 洛谷P1720 月落乌啼算钱 题解

    题目传送门 初看题目,好难.再看一次,探索规律,发现这就是有名的斐波那契数列. F[i]=f[i-1]+f[i-2] SO 代码很简单,貌似要开long long,又貌似不用开. #include&l ...