首页 > 编程语言 > 详细

Miller Rabin算法

时间:2014-11-02 23:58:29      阅读:565      评论:0      收藏:0      [点我收藏+]
  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.             
  46.             if(i>=k)return false; 
  47.         } 
  48.     } 
  49.     return true; 
  50. } 
  51. int main() 
  52. { 
  53.     llong n; 
  54.     while(scanf("%I64u",&n)!=EOF) 
  55.         if(is_prime(n,3)) 
  56.             cout<<"YES\n"; 
  57.         else 
  58.             cout<<"NO\n"; 
  59.         return 0; 
  60. }

Miller Rabin算法

原文:http://www.cnblogs.com/towardsSun/p/4070223.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!