Miller-Rabin质数测试
费马小定理:对于质数 p 和任意整数
a ,有 ap≡a(mod p) (同余)。反之,若满足 ap≡a(mod p) , p 也有很大概率为质数。
将两边同时约去一个a ,则有 ap−1≡1(mod p)二次探测定理:如果 p 是奇素数,则
x2≡1(mod p) 的解为 x≡1 或 x≡p−1(mod p)
bool MillerRabin(int64_t n)
{
vector<int> test{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 };//n<2^64
if (n <= 2)
return n == 2 ? true : false;
if (n % 2 == 0) return false;//偶数情况
int t = pow(2, 10);
int64_t u,a,x,y;
// 先找到的最小的a^u,再逐步扩大到a^(n-1)
u = n - 1; // u表示指数
while (u % 2 == 0) u = u / 2;
for (size_t i = 0; i < test.size(); i++)
{
a = test[i];
if (a >= n) break;//测试数为[1,n)之间
//if ((pow(a, n - 1) % n) != 1)
// return false;
x = pow_mod(a, u,n);
while (u < n)
{
// 依次次检查每一个相邻的 a^u, a^2u, a^4u, ... a^(2^k*u)是否满足二次探测定理
y = pow_mod(x, 2, n);
// 二次探测定理
if (y == 1 && x != 1 && x != n - 1)
// 若y = x^2 ≡ 1(mod n)
// 但是 x != 1 且 x != n-1
return false;
x = y;
u = u<<1;
}
if (x != 1) // Fermat测试
return false;
}
return true;
}