`
daweibalong
  • 浏览: 44662 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

随机算法--Las Vegas--大数因子分解--Pollard Rho启发式算法(c++版)

阅读更多

 

随机算法里的大数因子分解(Pollard Rho启发式算法),vc++6.0中实现,写的时候测的数比较小,只用了int,懒得改了,再用的时候再改成更大的数据类型:
001 #include<iostream>
002 #include<vector>
003 #include<algorithm>
004 #include<cmath>
005 #include<stdlib.h>
006 
007 using namespace std;
008 
009 int randint(int l,int u)
010 {
011     return l+rand()%(u-l+1);
012 }
013 
014 int gcd(int m,int n)
015 {
016     return n?gcd(n,m%n):m;
017 }
018 
019 bool isPrime(int n)
020 {
021     if(n<2)
022         return true;
023     for(int i=2;i<=pow(n,0.5);i++)
024         if(n%i==0)
025             return false;
026     return true;
027 }
028 
029 //判断分解是否结束:0,恰好结束
030 //                    1,超过被分解数
031 //                    2,分解数不够
032 int ifenough(int n,vector<int>f)
033 {
034     int m=1;
035     for(int i=0;i<f.size();i++)
036     {
037         m*=f[i];
038     }
039     if(m==n)
040             return 0;
041     if(m>n)
042             return 1;
043     return 2;
044 }
045 void PollardRho(int num,int n,vector<int>& f )
046 {    
047     
048     if(isPrime(n))
049     {
050         f.push_back(n);        
051         return;
052     }
053     
054     vector<int> x;
055     int i=1;    
056     x.push_back(-1);
057     x.push_back(randint(1,n));
058         
059     int y=x[1];
060     int k=2;
061     while(true)
062     {
063         i++;    
064         x.push_back((abs(x[i-1]*x[i-1]-1))%n);
065                 
066         int d=gcd(abs(y-x[i]),n);
067 
068         if(d>1&&d<n)
069         {    
070             PollardRho(num,d,f);    
071             PollardRho(num,n/d,f);
072         }
073         
074         if(i==k)
075         {
076             y=x[i];
077             k=2*k;
078         }
079         
080         if(find(x.begin(),x.end()-1,x[i])!=x.end()-1||ifenough(num,f)==0||ifenough(num,f)==1)
081         {
082             break;
083         }        
084     }    
085 }
086 
087 void repeatRho(int n)
088 {
089     vector<int> f;
090     for(int i=0;i<10000;i++)
091     {
092         f.clear();        
093         PollardRho(n,n,f);
094     
095         if(ifenough(n,f)==0)
096         {
097             sort(f.begin(),f.end());
098             for(int j=0;j<f.size();j++)
099             {
100                 if(j!=f.size()-1)
101                     cout<<f[j]<<"*";
102                 else
103                     cout<<f[j];
104             }
105             cout<<endl;
106             break;
107         }    
108     }
109 }
110 int main()
111 {    
112     int n;
113     cin>>n;
114     repeatRho(n);
115 }
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics