码迷,mamicode.com
首页 > 编程语言 > 详细

Miller Rabin算法

时间:2014-11-02 23:58:42      阅读:562      评论:0      收藏:0      [点我收藏+]

标签:io   os   for   sp   on   bs   amp   ef   as   

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

Miller Rabin算法

标签:io   os   for   sp   on   bs   amp   ef   as   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!