File tree Expand file tree Collapse file tree 1 file changed +41
-0
lines changed
Expand file tree Collapse file tree 1 file changed +41
-0
lines changed Original file line number Diff line number Diff line change 1+ namespace Prime {
2+ #define random (a,b ) (rand() % ((b) -(a)) +(a))
3+ LL power_mod (LL x,LL n,LL mod){
4+ LL ret =1 ;
5+ while (n){
6+ if (n & 1 ) ret = x * ret % mod;
7+ x = x * x % mod;
8+ n >>=1 ;
9+ }
10+ return ret;
11+ }
12+ LL mulmod (LL x,LL y,LL n){ // x ,y <= 10^9
13+ return x * y % n;
14+ }
15+ bool witness (LL a,LL n,LL u,LL t){
16+ LL x0 = power_mod (a,u,n),x1;
17+ for (int i=1 ;i<=t ; ++i){
18+ x1 = mulmod (x0,x0,n);
19+ if (x1==1 && x0!=1 && x0!=n-1 )
20+ return false ;
21+ x0 = x1;
22+ }
23+ if (x1 !=1 )return false ;
24+ return true ;
25+ }
26+
27+ bool miller_rabin (LL n, int times = 20 ){
28+ if (n < 3 ) return n==2 ;
29+ if (!(n&1 ))return false ;
30+ LL u = n-1 ,t =0 ;
31+ while (u%2 ==0 ) {
32+ t++;u>>=1 ;
33+ }
34+ while (times--) {
35+ LL a = random (1 ,n-1 );
36+ // if(a == 0)std::cout << a << " "<<n<< " "<<u<<" " << t<<'\n';
37+ if (!witness (a,n,u,t))return false ;
38+ }
39+ return true ;
40+ }
41+ };
You can’t perform that action at this time.
0 commit comments