POJ1811

给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数

随机素数测试(Miller_Rabin算法)

求整数素因子(Pollard_rho算法)

科技题

  1. #include<cstdlib>
  2. #include<cstdio>
  3. const int maxn=;
  4. const int S=;
  5. int tot;
  6. long long n;
  7. long long factor[maxn];
  8. long long muti_mod(long long a,long long b,long long c)
  9. {
  10. //(a*b) mod c a,b,c<2^63
  11. a%=c;
  12. b%=c;
  13. long long ret=;
  14. while(b)
  15. {
  16. if(b&)
  17. {
  18. ret+=a;
  19. if(ret>=c) ret-=c;
  20. }
  21. a<<=;
  22. if(a>=c) a-=c;
  23. b>>=;
  24. }
  25. return ret;
  26. }
  27. long long pow_mod(long long x,long long n,long long mod)
  28. {
  29. //x^n mod c
  30. if(n==) return x%mod;
  31. int bit[],k=;
  32. while(n)
  33. {
  34. bit[k++]=n&;
  35. n>>=;
  36. }
  37. long long ret=;
  38. for(k=k-;k>=;k--)
  39. {
  40. ret=muti_mod(ret,ret,mod);
  41. if(bit[k]==) ret=muti_mod(ret,x,mod);
  42. }
  43. return ret;
  44. }
  45. bool check(long long a,long long n,long long x,long long t)
  46. {
  47. long long ret=pow_mod(a,x,n),last=ret;
  48. for(int i=;i<=t;i++)
  49. {
  50. ret=muti_mod(ret,ret,n);
  51. if(ret==&&last!=&&last!=n-) return ;
  52. last=ret;
  53. }
  54. if(ret!=) return ;
  55. return ;
  56. }
  57. bool Miller_Rabin(long long n)
  58. {
  59. long long x=n-,t=;
  60. while((x&)==) x>>=,t++;
  61. bool flag=;
  62. if(t>=&&(x&)==)
  63. {
  64. for(int k=;k<S;k++)
  65. {
  66. long long a=rand()%(n-)+;
  67. if(check(a,n,x,t)) {flag=;break;}
  68. flag=;
  69. }
  70. }
  71. if(flag==||n==) return ;
  72. return ;
  73. }
  74. long long gcd(long long a,long long b)
  75. {
  76. if(a==) return ;
  77. if(a<) return gcd(-a,b);
  78. while(b)
  79. {
  80. long long t=a%b;a=b;b=t;
  81. }
  82. return a;
  83. }
  84. long long Pollard_rho(long long x,long long c)
  85. {
  86. long long i=,x0=rand()%x,y=x0,k=;
  87. while()
  88. {
  89. i++;
  90. x0=(muti_mod(x0,x0,x)+c)%x;
  91. long long d=gcd(y-x0,x);
  92. if(d!=&&d!=x) return d;
  93. if(y==x0) return x;
  94. if(i==k)
  95. {
  96. y=x0;
  97. k+=k;
  98. }
  99. }
  100. }
  101. void findfac(long long n) //递归分解质因数
  102. {
  103. if(!Miller_Rabin(n))
  104. {
  105. factor[tot++]=n;
  106. return;
  107. }
  108. long long p=n;
  109. while(p>=n) p=Pollard_rho(p,rand()%(n-)+);
  110. findfac(p);
  111. findfac(n/p);
  112. }
  113. int main()
  114. {
  115. int T;
  116. scanf("%d",&T);
  117. while(T--)
  118. {
  119. scanf("%I64d",&n);
  120. if(!Miller_Rabin(n))
  121. {
  122. printf("Prime\n");
  123. continue;
  124. }
  125. tot=;
  126. findfac(n);
  127. long long ans=factor[];
  128. for(int i=;i<tot;i++)
  129. if(factor[i]<ans) ans=factor[i];
  130. printf("%I64d\n",ans);
  131. }
  132. return ;
  133. }

数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)的更多相关文章

  1. HDU2138 随机素数测试 Miller-Rabin算法

    题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In eac ...

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

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

  3. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

  5. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

  6. Miller_Rabin 素数测试

    费马定理的逆定理几乎可以用来判断一个数是否为素数,但是有一些数是判断不出来的,因此,Miller_Rabin测试方法对费马的测试过程做了改进,克服其存在的问题. 推理过程如下(摘自维基百科): 摘自另 ...

  7. Miller-Rabin素数测试算法(POJ1811Prime Test)

    题目链接:http://poj.org/problem?id=1811 题目解析:2<=n<2^54,如果n是素数直接输出,否则求N的最小质因数. 求大整数最小质因数的算法没看懂,不打算看 ...

  8. Miller-Rabin素数测试算法

    用来干嘛的 ​   要判断一个数 \(n\) 是否为素数,最朴素直接的办法是以\(O(\sqrt n)\) 时间复杂度地从2到 \(\sqrt n\) 循环即可得到最准确的结果.但是如果在 \(n\) ...

  9. Miller-Rabbin随机性素数测试算法

    //**************************************************************** // Miller_Rabin 算法进行素数测试 //速度快,而且 ...

随机推荐

  1. YQCB冲刺周第三天

    团队讨论照片 今天的任务为实现由用户记录一条数据,向数据库中添加一条数据. 遇到的问题为获取单选框.下拉菜单的参数.

  2. Java中的静态变量static

    package com.wangcf; public class Test { String name="你好"; static String sex="男"; ...

  3. struts2--文件上传大小

    Struts2文件上传的大小限制问题 问题:上传大文件报错-- 解决:修改struts.xml文件中的参数如下 <constant name="struts.multipart.max ...

  4. IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)

    切入主题,看看今天的错误是如何发生的: 首先这是我的项目路径,java 是 Sources Root , resources 是 Resources Root ,放了所需要的配置文件,其中 Hiber ...

  5. oracle执行完shutdown immediate后登陆不上了怎么办

    在sqlplus 里登录后使用shutdown immediate 关闭数据库后若没有使用startup重启数据库就退出窗口则会出现下一次重启sqlplus窗口时无法登录的现象,解决方法如下 一.启动 ...

  6. 【第二周】Java实现英语文章词频统计(改进1)

    本周根据杨老师的spec对英语文章词频统计进行了改进 1.需求分析: 对英文文章中的英文单词进行词频统计并按照有大到小的顺序输出, 2.算法思想: (1)构建一个类用于存放英文单词及其出现的次数 cl ...

  7. script 执行的三种方式

    <script>: 脚本的获取和执行是同步的.此过程中页面被阻塞,停止解析. <script defer = "defer">:脚本的获取是异步的,执行是同 ...

  8. 【Linux笔记】CentOS&RHEL YUM基础知识

    以下内容收集自网络,以作参考. 一.YUM是什么 YUM = Yellow dog Updater, Modified. 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它 ...

  9. Fiddler绕过前端直接和后台进行交互

    测试需求:有一个功能,允许用钻石兑换金币,假设1钻石=1金币,前端控制一次至少兑换10个,最多100个,后台不做验证. 测试方案:输入10,也就是告诉前端我要兑换10个金币,等前端验证通过之后,截取要 ...

  10. 【.Net】从字符串数组中寻找数字的元素

    那是写一个类别来处理数字元素并收集起来. 开发程序,解决方法不是唯一的.相同的功能实现,方法不止一个. 参考下面代码: class Ak { private string[] _stringArray ...