质数相关

来源:互联网 发布:变性手术知乎 编辑:程序博客网 时间:2024/04/30 00:33

Miller-Rabin质数测试

费马小定理:对于质数p 和任意整数a,有apa(mod p)(同余)。反之,若满足apa(mod p)p也有很大概率为质数。
将两边同时约去一个a,则有ap11(mod p)

二次探测定理:如果p是奇素数,则x21(mod p)的解为x1xp1(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;}
0 0