Vì sao 93719377 = 4139 * 22643 lại ra true nhỉ mọi người, trên wiki ghi 2, 3, 5, 7, 11 là dư rồi. (gcc >= 5)
long long modPow(int base, int expo, long long modulo) {
unsigned __int128 res=1;
unsigned __int128 tmp=base;
while(expo > 0) {
if(expo%2) res = (res*tmp) % (unsigned __int128) modulo;
tmp = (tmp*tmp) % (unsigned __int128) modulo;
expo/=2;
}
return (long long) tmp;
}
int isPrime(long long n)
{
if((n==23) || (n==3137) || (n==8389) || (n==157163)) return true;
/* for(int i=0; i<PREFILTER_LIMIT; ++i) {
if(n % primeList[i] == 0) return false;
} */
int base[] = {2, 3, 5, 7, 11};
int tn = n-1; //chết vì câu này (dành cho bạn nào đến sau)
int exp_2 = 0;
while(tn % 2 == 0) { tn/=2; ++exp_2; }
printf("%lld ", tn);
for(int i=0; i<5; ++i) {
unsigned __int128 tmp = modPow(base[i],tn,n);
if(tmp == n-1 || tmp == 1) continue;
int j;
for(int j=exp_2; j>=0; --j) { //vòng này chạy exp_2 + 1 lần => FAIL!
//viết ngược lại từ j = 0 đến < exp_2 - 1 thôi. int j ở đây là sai.
tmp = (tmp*tmp) % (unsigned __int128) n;
if(tmp == 1) return false;
else if(tmp == n-1) break;
}
if(j > 0 && tmp != 1) return false; //sai ở đây nữa, != n-1 mới đúng!
}
return true;
}