Miller Rabin算法

  1. #include <iostream>
  2. using namespace std;
  3. typedef unsigned __int64 llong;
  4. llong mod_pro(llong x,llong y,llong n)
  5. {
  6. llong ret=0,tmp=x%n;
  7. while(y)
  8. {
  9. if(y&0x1)if((ret+=tmp)>n)ret-=n;
  10. if((tmp<<=1)>n)tmp-=n;
  11. y>>=1;
  12. }
  13. return ret;
  14. }
  15. llong mod(llong a,llong b,llong c)
  16. {
  17. llong ret=1;
  18. while(b)
  19. {
  20. if(b&0x1)ret=mod_pro(ret,a,c);
  21. a=mod_pro(a,a,c);
  22. b>>=1;
  23. }
  24. return ret;
  25. }
  26. llong ran()
  27. {
  28. llong ret=rand();
  29. return ret*rand();
  30. }
  31. bool is_prime(llong n,int t)
  32. {
  33. if(n<2)return false;
  34. if(n==2)return true;
  35. if(!(n&0x1))return false;
  36. llong k=0,m,a,i;
  37. for(m=n-1;!(m&1);m>>=1,k++);
  38. while(t--)
  39. {
  40. a=mod(ran()%(n-2)+2,m,n);
  41. if(a!=1)
  42. {
  43. for(i=0;i<k&&a!=n-1;i++)
  44. a=mod_pro(a,a,n);
  45. if(i>=k)return false;
  46. }
  47. }
  48. return true;
  49. }
  50. int main()
  51. {
  52. llong n;
  53. while(scanf("%I64u",&n)!=EOF)
  54. if(is_prime(n,3))
  55. cout<<"YES\n";
  56. else
  57. cout<<"NO\n";
  58. return 0;
  59. }
时间: 2024-10-12 15:09:37

Miller Rabin算法的相关文章

51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)

1037 最长的循环节 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 10^18) Output 输出<=n的数中倒数循环节长度最长的

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

BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][Status][Discuss] Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个. O

HDU 3864 D_num Miller Rabin 质数判断+Pollard Rho大整数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给出一个数N(1<=N<10^18),如果N只有四个约数,就输出除1外的三个约数. 思路:大数的质因数分解只能用随机算法Miller Rabin和Pollard_rho,在测试多的情况下正确率是由保证的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

51nod 1106 质数检测(miller rabin 素数测试.)

1106 质数检测 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出N个正整数,检测每个数是否为质数.如果是,输出"Yes",否则输出"No". Input 第1行:一个数N,表示正整数的数量.(1 <= N <= 1000) 第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9) Output 输出共N行,每行为 Yes 或 No. Input示例 5 2 3 4 5 6

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

Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the num

POJ2429_GCD &amp;amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a and b.

HDU1164_Eddy&amp;#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) Total Submission(s): 6664    Accepted Submission(s): 3997 Problem Description Eddy's interest is very extensive, recently he is interested in prime

POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数测试】【Pollar Rho整数分解】

GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a and b.

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

Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the num