Morass

RM

Feb 24th, 2017
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.64 KB | None | 0 0
  1. ll R[]={2,3,5,7,11,13,17,19,23,29,31,37};
  2. ll mm(ll a,ll b,ll M){
  3.     ll v(0),w(a%M);
  4.     while(b)v=b&1?(v+w)%M:v,w=(w<<1)%M,b>>=1;
  5.     return v%M;
  6. }
  7. ll pw(ll n,ll k,ll M){
  8.     ll r=1;
  9.     while(k){
  10.         if(k&1)r= mm(r,n,M);
  11.         n=mm(n,n,M),k>>=1;
  12.     }
  13.     return r%M;
  14. }
  15. bool isP(ll n){
  16.     if(n<2)return 0;
  17.     if(!(n&1))return n==2;
  18.     ll s=n-1;
  19.     while(!(s&1))s>>=1;
  20.     if(n<40){FT(3,n)if(!(n%k))return 0;return 1;}
  21.     F(12){
  22.         ll z(R[i]),t(s),r(pw(z,t,n));
  23.         if(r==1||!~r==-1)continue;
  24.         while(t!=n-1&&r!=n-1)
  25.             r=mm(r,r,n),t<<=1;
  26.         if(r!=n-1)return 0;
  27.     }
  28.     return 1;
  29. }
Advertisement
Add Comment
Please, Sign In to add comment