不定期更。

 

数论

 1 const int pri[12]={2,3,5,7,11,13,17,19,23,29,31,37};
 2 ll ksc(ll x,ll y,ll mod){
 3     ll tmp=x*y-(ll)((ld)x/mod*y+0.5)*mod;
 4     return tmp<0?tmp+mod:tmp;
 5 }
 6 ll ksm(ll x,ll p,ll mod){
 7     ll ret=1;
 8     for (;p;p>>=1,x=ksc(x,x,mod)) if (p&1) ret=ksc(ret,x,mod);
 9     return ret;
10 }
11 bool MR(ll n){
12     if (n<=1) return 0;
13     rep (i,0,11) if (n==pri[i]) return 1;
14     ll d=n-1; int tmp=0;
15     while (!(d&1)) d>>=1,tmp++;
16     rep (i,0,11){
17         ll x=ksm(pri[i],d,n),p=x;
18         rep (t,1,tmp){
19             x=ksc(x,x,n);
20             if (x==1 && p!=1 && p!=n-1) return 0;
21             p=x;
22         }
23         if (x!=1) return 0;
24     }
25     return 1;
26 }
Miller Rabin

相关文章: