Advertisement
RaFiN_

pollard-rho

Apr 25th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. /* pollard rho */
  2.  
  3.  
  4. i128 In( string s){
  5.     i128 x = 0;
  6.     for(int i = 0;i<s.length();i++)x = x*10 + s[i] - 48;
  7.     return x;
  8. }
  9.  
  10. void out(i128 x){
  11.     vi v;
  12.     while(x){
  13.         int y = x%10;
  14.         x/=10;
  15.         v.pb(y);
  16.     }
  17.     reverse(all(v));
  18.     for(auto it : v)printf("%d",it);
  19. }
  20.  
  21. i128 mul(i128 a,i128 b,i128 m){
  22.     i128 ans = 0;
  23.     while(b){
  24.         ///cout<<a<<" "<<b<<" "<<m<<endl;
  25.         if(b&1)ans = (ans + a)%m;
  26.         a = (a+a)%m;
  27.         b>>=1;
  28.     }
  29.     return ans;
  30. }
  31.  
  32. i128 power(i128 base,i128 p,i128 m){
  33.     ///cout<<base<<" "<<p<<" "<<m<<endl;
  34.     if(p==0)return 1;
  35.     if(p&1)return (base % m * power(base,p-1,m) % m)%m;
  36.     else {
  37.         i128 x = power(base,p/2,m)%m;
  38.         return mul(x,x,m)%m;
  39.     }
  40.  
  41. }
  42.  
  43.  
  44. bool miller_rabin(i128 p,i128 d){
  45.  
  46.     i128 a = rand() %(p-4) + 2;
  47.     i128 x = power(a,d,p);
  48.     if(x==1||x==p-1)return true;
  49.     while(d!=p-1){
  50.         x = mul(x,x,p)%p;
  51.         d = d*2;
  52.         if(x==1)return false;
  53.         if(x==p-1)return true;
  54.  
  55.     }
  56.     return false;
  57. }
  58.  
  59. bool isPrime(i128 n){
  60.     if(n<=1||n==4)return false;
  61.     if(n<=3)return true;
  62.     i128 d = n-1;
  63.     while(d%2==0){
  64.         d/=2;
  65.     }
  66.     for(int i = 0;i<4;i++)if(!miller_rabin(n,d))return false;
  67.     return true;
  68. }
  69.  
  70. i128 GCD(i128 a,i128 b){
  71.     if(b==0)return a;
  72.     return GCD(b,a%b);
  73. }
  74.  
  75. i128 pollard_rho(i128 n){
  76. //  if(n%2==0)return 2;
  77. //  if(n%3==0)return 3;
  78. //  if(n%5==0)return 5;
  79.     i128 x = 2,xs = 2,Count ,Size = 2,factor = 1;
  80.     i128 c  = rand()%n+2;
  81.  
  82.     do {
  83.         Count = Size;
  84.         do{
  85.             x = (mul(x,x,n) + c)%n;
  86.             i128 ab;
  87.             if(xs>x)ab = xs - x;
  88.             else ab = x - xs;
  89.             factor = GCD(ab,n);
  90.         }while(Count--&&factor==1);
  91.         Size*=2;
  92.         xs = x;
  93.     }while(factor==1);
  94.     if(factor==n){
  95.         do{
  96.             xs = (mul(xs,xs,n) + c)%n;
  97.             i128 ab;
  98.             if(xs>x)ab = xs - x;
  99.             else ab = x - xs;
  100.             factor = GCD(ab,n);
  101.         }while(factor==1);
  102.     }
  103.     return factor;
  104.  
  105. }
  106.  
  107. vector<i128>fact;
  108.  
  109. void FindFactors(i128 n){
  110.     queue<i128>q;
  111.     q.push(n);
  112.     while(!q.empty()){
  113.         i128 x = q.front();
  114.         q.pop();
  115.         i128 y = pollard_rho(x);
  116. //      out(y);
  117. //      out(x/y);
  118. //      cout<<endl;
  119.         if(isPrime(y))fact.pb(y);
  120.         else{
  121.             q.push(y);
  122.         }
  123.         if(isPrime(x/y))fact.pb(x/y);
  124.         else {
  125.             if(x/y!=1&&x/y!=x)q.push(x/y);
  126.         }
  127.     }
  128. }
  129.  
  130.  
  131.  
  132. int main()
  133. {
  134.     //booster()
  135.     ///read("input.txt");
  136.  
  137.  
  138.     while(1){
  139.         string s;
  140.         char str[50];
  141.         scanf("%s",str);
  142.         s = str;
  143.         fact.clear();
  144.         if(s[0]=='0')return 0;
  145.         i128 x = In(s);
  146.         FindFactors(x);
  147.         map<i128,int>m;
  148.         for(auto it : fact)m[it]++;
  149. //        for(auto it : fact){
  150. //          out(it);
  151. //          cout<<" ";
  152. //        }
  153. //        cout<<endl;
  154.         for(auto it : m){
  155.             out(it.ff);
  156.             printf("^%d ",it.ss);
  157.         }
  158.         printf("\n");
  159.  
  160.     }
  161.  
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement