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;
} 
      
    
 nhưng còn hàm chính thì dùng phép bình phương vẫn sai, ra toàn false với n đủ lớn.
 nhưng còn hàm chính thì dùng phép bình phương vẫn sai, ra toàn false với n đủ lớn.
 83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?
    83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?